高校の文化祭で実際に運用した注文管理システムです。 「注文のために並ぶ時間」と「調理を待つ時間」を分離することで回転率を向上させ、 出店した飲食店の中で売上No.1を達成しました。
お客様がタブレットから注文すると注文番号が発行され、キッチン側にリアルタイムで 通知が届く仕組みになっています。
| ブランチ | 内容 |
|---|---|
legacy |
文化祭当日に実際に運用していたコード |
master |
技術力向上後にリファクタリングしたバージョン |
| 領域 | 技術 |
|---|---|
| フロントエンド | TypeScript |
| バックエンド | Node.js (Express) |
| データベース | MySQL |
| インフラ | Raspberry Pi 5 (オンプレミス) |
| 通信 | REST API / WebSocket |
- 注文画面(顧客向け): タブレットから注文を確定 → REST API経由でDBに保存 → 注文番号を発行
- 注文確認画面(キッチン向け): WebSocketでリアルタイム受信
- 売上確認画面(運営向け): 時間帯別の売上金額を表示
- インフラ: 学校所有のRaspberry Pi 5上にDocker環境を構築し、校内Wi-Fi経由で各端末からアクセス
REST API と WebSocket の使い分け 注文画面は一回限りの操作でありサーバーからの常時通知が不要なため REST API を採用。 キッチン確認画面は新着注文を即座に把握する必要があるため、ポーリング遅延を避けて WebSocket によるサーバープッシュを採用しました。
本番運用中、DB接続上限エラー(too many connections)により注文フローが約5分間停止しました。 原因はDB接続をクローズする処理の欠落による接続リークでした。 ログから原因を特定・復旧させると同時に、口頭での注文受付に切り替えて現場運営を止めない 対応を取りました。この経験からリソース管理と負荷テストの重要性を学び、 masterブランチではこの問題を修正しています。
- Docker Engine
プロジェクトのルートディレクトリに .env ファイルを作成し、以下を記載してください。
ROOT_PASSWORD=<強力なパスワード># 起動
docker compose up -d
# 終了
docker compose down