LOG #00811 min read9 sections

【体験記】ゴールデンウィーク4日間でワインバーのPOSレジをフルスクラッチで自作した話。Claude Codeと僕の濃密すぎる連休

どうも!自称エセエンジニアの、非エンジニア系のKayです! ここ数ヶ月、Claude Codeにどっぷりとハマってしまい……気づけば毎日6時間以上、AIと二人三脚でアプリケーションを作っています。人類の孤独問題はAIが解 …

目次18 items

先日2025年5月18日、ワインエキスパートを持っている妻が義姉と一緒にワインバー「efü」(エフュー)をオープンしました!!

インテリア好きの姉妹が内装にとことんこだわった小さなワインバーです。

そしてオープンの直前、ふとこんな思考が脳裏をよぎったんです。

「ワインバーのPOSレジぐらい……作れるんじゃね?」

Claude Code使いこなせるようになってきたし、NASもあるし、Tailscaleもあるし……。いやいや待て、オープンまで時間ないぞ……。

でも止まれなかった。

ゴールデンウィークの4日間、コーヒーとワインを交互に飲みながら、Claude Codeと二人三脚で爆走した結果——

完全オリジナルのワインバーPOSレジシステム「efuPOS」が爆誕しました。

今回はそのてんやわんやの開発記を、こだわりポイントと一緒にたっぷりお届けします!

そもそも、なぜ自作?#

一般的なクラウドPOSレジは月額数千〜数万円。売上データも全部クラウドに預けることになります。

「全データを自分のNASに置きたい!」

これが最大の動機です。売上・顧客・仕入れのデータを外部サービスに預けたくなかった。そしてすでにSynology NASを持っていて、Tailscaleも使いこなしていたので、追加月額ゼロでサーバー・DB・ファイルストレージが一台で完結できる見込みがあった。

あとは……正直、作りたかっただけというのもあります(笑)。

インフラ構成:自宅のSynology NASが主役#

efuPOSのバックエンドはこのレシピだけです。

役割 使ったもの
Webサーバー + DB Synology NAS(WebStation + Apache 2.4 + MariaDB)
VPN接続 Tailscale
外部公開(ワインリストのみ) Cloudflare Tunnel
決済端末 Squareターミナル
インターネット回線 WiMax
レジ端末・オーダー受付 iPad、iPhone

構成図がちょうどアイキャッチ画像そのまんまです(笑)。

NASはサーバーになる——これをまず知ってほしい。DSM 7.3にはMariaDBが組み込み済みで、WebStationでApache + PHPを動かせます。追加のクラウド費用ゼロ。デプロイはgit pull一発。最高すぎます。

こだわりその①:ワインの知識がなくても「サーブできる」システムへ#

ワインバーで働くスタッフ全員がソムリエである必要はありません。でも、お客様にワインを出すとき、「これ何ですか?」という質問には答えたいですよね。

そのために、徹底的にこだわったワインリストを作りました。

150本のワイン、全部自分で撮影しました#

はい、僕が一本一本撮影しました。ニコンのカメラを持ってお店に立て籠もること数時間……。

「ストレージ専門家的本能が疼く瞬間」

趣味の写真がここで活きるとは思いませんでしたが、ライティングを工夫しながら全150本を撮り切りました。ラベルの文字が読めるように、ボトルの色が正確に出るように——こだわりが止まりません。

日英対応のお客様向けワインリスト#

お客様がQRコードをスキャンすると、日本語と英語でこんな情報が見られます。もちろん在庫連動です!

  • ワイン名
  • 産地・品種・生産者
  • テイスティングコメント
  • グラス・ボトル価格

日英切り替えボタンも実装済み。「今はまだ外国人のお客様は少ないけど、将来はきっとたくさん来る!!」という前向きな想いで作りました(大阪ですしね)。

英語表示

特徴のわかりやすいアイコン、産地によって国旗マークも自動でつけてくれます。

ボトルから「グラスワイン7杯」への自動変換#

ボトルを仕入れたとき、抜栓(最初のコルク抜き)を記録すると、自動的に「グラス在庫7杯」に変換される仕組みを作りました。

グラスの残量が目で見えて、抜栓から3日以上経つとオレンジ色でハイライト表示。廃棄のタイミングを見逃さない設計です。

こだわりその②:マトリクス型シートマップで実際の店内をそのまま再現#

一般的なPOSレジって「1番テーブル、2番テーブル……」みたいなリスト形式が多いですよね。

「それじゃつまらない!!」

efuPOSのシートマップは、実際の店内レイアウトをそのまま画面に再現するマトリクス型を採用しました。

キッチン側カウンター・壁側カウンター・テーブル席が、画面上でも同じ位置関係で表示されます。スタッフが「あ、あのお客様の席」と直感的にわかる。

そして、同じTailnet内の僕のiPhoneはこれが見えるので、お客様のご来店状況が外から確認できて、何気にめちゃ便利笑

実装したこだわり機能#

  • 席の移動:途中から「移ろうかな」というお客様対応もワンタップ
  • 人数追加:合流した友人分をその場で追加
  • 席の追加:混雑時は立ち飲みスペースをオンオフで簡単に切り替え
  • 180度回転ボタン:iPadを逆向きに置いてるスタッフが画面を合わせられるように
  • **未サーブ品の可視化:**未提供商品があったら、マップ上で赤く表示、受付時間順に表示されるサーブリストから提供処理
  • **レジで簡単会計:**会計はレジ画面で席または席グループをタップするだけ

こだわりその③:Squareターミナルで現金レシートを印刷したい!AIリレーで解決した話#

現代のお店はカード・電子マネーが主流ですが、現金払いのお客様も当然います。

独自のPOSシステムでも、Squareターミナル(あのかっこいいカードリーダー端末)は、カードや電子決済のレシートは自動で印刷してくれます。でも現金払いのレシートは?

最初にClaude Codeに相談しました。

Claude Code:「それは……Square API的に難しいですね」

……え。

「Claude Codeが出来ないというなら、本当にできないんだ」そう信じ切った僕は、Squareターミナルと別の熱転写プリンターをもう1台買ってしまうのでした。

ところが、届いたプリンターのネットワーク接続が安定しない。繋がったり途切れたり、これではレジで使い物にならない……

やはりSquareターミナルで印刷したいと思った僕は、諦めきれず、試しにGeminiに同じ質問をしてみました。

Gemini:「できますよ!」

おお!でもGeminiが出してくれたコードを試してみると、なんか動かない……半分合ってるけど、完全じゃない。

そのGeminiのコードを持って、今度はClaudeに「セカンドオピニオン」を求めました(Claudeの通常会話の方です)。

Claude:「Geminiの提案は部分的に正しいです。正しいアプローチはこうです——」

Squareのsource_id: 'CASH'でPayments APIに現金決済を記録→square_payment_idを取得→/v2/terminals/printsで印刷指示、という3ステップのフローを提示してくれました。

そのClaudeの回答を、今度はClaude Codeに渡す。

Claude Code:「了解しました。実装します」

動いた!!!

Claude Code → Gemini → Claude → Claude Codeという、謎のAI4者リレーで解決した珍事件でした(笑)。

こだわりその④:ワインラベルをAIが読む——仕入れ登録が秒で終わる時代へ#

150本のワインを一本一本手入力で登録するのは……地獄です。

ワイン名、生産者、産地、ブドウ品種、ヴィンテージ、ボディ感、テイスティングコメント……。

「これ、AIに読ませたらよくない?」

というわけで、ワインラベル写真からAIが自動入力する機能を作ってしまいました。

表ラベルの写真を撮って「AIで解析」ボタンを押すと——

  • 商品名・英語名
  • 生産者
  • 産地・ブドウ品種
  • ヴィンテージ
  • ワインの種類・色・スタイル・ボディ感
  • テイスティングコメント

ワインのラベルをアップロード!裏ラベルを追加するとさらに精度が上がります。

数秒後に、生産者や葡萄品種、ワインの特徴が日英両方で入力されます。

PHP + cURLだけでClaude APIを実装#

この機能では、NASのPHP環境にComposerを入れる手間を省くため、lib/claude_api.phpという薄いラッパーをcURLのみで自前実装しています。

php2 lines
// シンプルなRESTなので、SDKなしで10〜20行程度で書けます
$response = curl_exec($ch);

依存ゼロ、メンテナンスも楽。これがNAS自作の醍醐味ですね。

ラベルプリントでボトルにタグ付け、「あのワインどこ?」問題も解決#

AIで登録したデータはそのままラベルプリントにも活用しています。ワイン名・品種・産地・テイスティングコメントを印刷したタグをボトルに付けておくことで、スタッフが手に取ったあとも基本的な説明がその場でできる——ソムリエじゃなくてもサーブできる、というこだわりの①とも繋がっています。

そしてもうひとつ、地味に重要な機能がロケーション管理です。ワインの在庫には「ロケーション」カラムを設けていて、ワインセラーの何段目にあるかをシステムに登録してあります。

「あのワイン、どこだっけ……?」

ワインの本数が増えてくると、これが意外と起きるんですよね(笑)。注文を受けてからセラーをうろうろする時間が、スマートにゼロになります。

こだわりその⑤:QRコードとメールで渡せるデジタル領収書#

「領収書ください」——飲食店でよく聞くひと言ですよね。

一般的なPOSレジだと紙のレシートを渡して終わりですが、efuPOSではその場でスマホに領収書を送れる仕組みを作りました。

2つの受け取り方#

① QRコードをスキャン

会計完了後、レジ画面に領収書用のQRコードが表示されます。お客様がスマホで読み取ると、ブラウザで正式な領収書ページが開く——それだけです。印刷も保存も、お客様のお好みで。

② メールアドレスに送信

「メールで欲しい」というお客様には、アドレスを入力してもらうだけで領収書がメール送信されます。

技術的な仕組み#

内部的にはこんな流れで動いています。

  1. 会計が確定すると、サーバー側でワンタイムトークン(ランダムな文字列)を発行してDBに保存
  2. そのトークンを含むURLをQRコード化して画面に表示(QRコード生成はCDNのライブラリを使用、サーバー処理ゼロ)
  3. お客様がURLにアクセスすると、トークンをDBで照合して領収書HTMLを表示
  4. メール送信はPHPMailerを使って、NASから直接SMTPで送信

PDFダウンロードにも対応しているので、経理ソフトへの取り込みが必要なお客様にも安心です。

その他:インターネット回線がない!WiMaxで乗り切った話#

実はお店、最初からインターネット回線がありませんでした。物理的に回線がないんです泣……。

「え……Tailscaleって、インターネット必要じゃない?」

というわけでWiMaxを導入しました。最初はプラスエリアモード(auの4G帯)で接続したら、あっという間に速度制限がかかって冷や汗……。

通常モードに切り替えたら——全く問題なく使えています。

Tailscale経由のNASアクセス、Cloudflare Tunnel経由のワインリスト公開、Squareターミナルとの通信、全部これ一本で動いています。WiMaxさん、ありがとう。

まとめ:NASがあれば、レジも作れる時代#

4日間で作ったefuPOSの構成をもう一度まとめます。

  • ✅ NAS(WebStation + MariaDB + PHP):Webサーバー+データベース全込み、月額ゼロ
  • ✅ Tailscale:VPN設定がアプリ入れてログインするだけ、無料プランで100台まで対応
  • ✅ Cloudflare Tunnel:ポート開放不要、固定IP不要で独自ドメイン+自動SSL
  • ✅ Squareターミナル:カード・電子マネー・現金すべてのレシート印刷に対応
  • ✅ Claude API:ワインラベル解析・仕入れOCR・領収書PDFをNASから直接処理

これだけです。

月額費用はゼロ(Square決済手数料を除く)。全データが自分のNASに。Claude Codeがあれば、エンジニアじゃなくても作れる時代になりました。

ぜひ皆さんも、Synology NASをサーバーにしたPOSレジ作り、やってみてください!(軽めに言いましたが、4日間の睡眠は削れましたのでご注意を笑)


そして、気になる売り上げは……?#

オープン最初の1週間は、多くの知り合いの方々に来ていただき、連日満席となりました!!本当にありがとうございます。

本番はこれからです。

アットホームな雰囲気のワインバーです。大阪にお越しの際はぜひフラっとお立ち寄りください! 

きっとefuPOSが静かに、でも確実に動いているはずです(笑)。