版数: 1.3  |  更新日: 2026-06-07  |  WBS: 1.1.1〜1.1.3(完了)

Phase1 サーバー構築手順

WBS 1.1(サーバー環境構築)の runbook です。 Cloudflare Tunnel 経由で FastAPI へ FB を受信できる状態を目指します。

2026-06-07 完了: 本手順に基づき WBS 1.1・MS-1 を達成済み。 実施記録は 開発ログ、 トラブルシュート・設計理解は Phase1 ナレッジ を参照。
方針変更の経緯は 開発ログ を参照。 手順変更(v1.1): PoC(C:\Dev\PoC_スマート農業環境構築)で確立済みの Named Tunnel・DNS・固定ドメインを再利用します。 新規 Tunnel 作成や DNS 移管は不要です。 作業の中心は「Windows PC 上で API を起動し、cloudflared の接続先を Raspberry Pi から本 PC へ移す」ことです。

1. 前提

1.1 再利用する PoC 資産(確立済み)

項目状態
Tunnel 名 poc-api-tunnel 稼働中(2026-06-07 時点で /ping 応答確認済み)
公開 URL https://api.dammy-otoko.com HTTPS 有効
Public Hostname api.dammy-otoko.comhttp://api:8000 変更不要(docker-compose のサービス名 api と一致)
DNS 管理 Cloudflare(dammy-otoko.com 移管済み(Squarespace 所有権は維持)
現行 cloudflared Windows PC 上の Docker(server-cloudflared-1 2026-06-07 移行完了(Pi 側は停止)

1.2 実施順序(変更後)

順序WBS作業備考
Docker Desktop 起動未インストールの場合は先にインストール
1.1.2環境変数・API + DB 起動ローカル疎通を先に確認
1.1.3FB 受信 API 疎通(localhost)test-feedback.ps1
1.1.1cloudflared を本 PC へ移行Pi 側を停止してから起動
1.1.1 / 1.2.3Tunnel 経由の外部疎通確認MS-1 達成

2. Docker Desktop の準備

スリープ復帰後や初回セットアップ時は、タスクバーで Docker Desktop が起動していることを確認します。

docker version
docker compose version

コマンドが通れば次のステップへ進みます。

3. 環境変数の準備(WBS 1.1.2)

cd server
copy .env.example .env

.env を編集します。

変数設定内容
POSTGRES_PASSWORD任意の強めのパスワード(DATABASE_URL も合わせて更新)
TUNNEL_TOKENPoC の poc-api-tunnelConnector トークン(Zero Trust → Tunnels → Configure)。eyJ... で始まる長い文字列。Tunnel ID(UUID)ではない

4. API + DB の起動(WBS 1.1.2)

cd server
docker compose up -d --build db api

起動確認(PowerShell では curl.exe 推奨):

curl.exe http://localhost:8000/api/v1/health

期待レスポンス: {"status":"ok"}

5. FB 受信 API 疎通(WBS 1.1.3・ローカル)

PowerShell スクリプトで確認:

.\scripts\test-feedback.ps1

または curl 直接:

curl -X POST http://localhost:8000/api/v1/feedback ^
  -F "image=@scripts\sample.jpg" ^
  -F "inference_result={\"label\":\"A\",\"score\":0.92}"

成功時: HTTP 201id が返る。画像は data/storage/ に保存される。

6. Cloudflare Tunnel 移行(WBS 1.1.1)

新規作成は不要。 以下は PoC で実施済みのためスキップします。
  • Zero Trust での Tunnel 新規作成(horse-feedback 等)
  • DNS 移管(Squarespace → Cloudflare)
  • Public Hostname の初回設定
参照: PoC ナレッジ Phase 1-4 ナレッジ資料:Cloudflare Named TunnelとDNS管理の勘所.md

6.1 移行前の確認(任意)

Pi 側がまだ応答していることを確認できます(移行前は PoC の /ping が返る)。

curl https://api.dammy-otoko.com/ping

期待(移行前): {"message":"pong"}(PoC FastAPI)

6.2 Raspberry Pi 側 cloudflared の停止

同一 Tunnel に複数コネクタがあると、リクエストが Pi と本 PC に振り分けられ、意図しない応答になる可能性があります。移行前に Pi 側を停止します。

# Raspberry Pi 上で実行(SSH)。docker 権限がない場合は sudo を付ける
cd ~/poc-api   # PoC の compose ディレクトリ
sudo docker compose stop cloudflared

停止対象は compose のサービス名 cloudflared(コンテナ名 poc-api 等とは異なる場合あり)。

6.3 本 PC で cloudflared 起動

server/.envTUNNEL_TOKENeyJ... 形式)を設定済みであることを確認し:

cd server
docker compose --profile tunnel up -d cloudflared

cloudflared の起動コマンドは --token のみです。--url との併用は禁止(PoC でタイムアウトの原因になった設定)。 Cloudflare ダッシュボードの「Windows 向け cloudflared.exe インストール」手順は不要(本プロジェクトは Docker コンテナで運用。ダッシュボードの Docker タブまたはトークンコピーで可)。

6.4 Tunnel 経由の疎通確認

curl.exe https://api.dammy-otoko.com/api/v1/health
.\scripts\test-feedback.ps1 -BaseUrl "https://api.dammy-otoko.com"

期待(移行後):

7. 完了チェック(MS-1)

2026-06-07 達成済み。

8. トラブルシュート

症状確認事項
docker が見つからない / daemon 未起動 Docker Desktop を起動(docker version で Server 行が表示されること)。PATH 反映のためターミナルを開き直す
Provided Tunnel token is not valid TUNNEL_TOKENeyJ... 形式か確認。Tunnel ID(UUID)を入れていないか
Cloudflare error 1033 cloudflared が Up か確認(docker compose ps)。トークン・Pi 側二重コネクタを確認
localhost の curl 失敗(PowerShell) PowerShell の curlInvoke-WebRequest の別名。curl.exe を使用
api が起動しない docker compose logs api。DB 接続待ちの場合は db の healthcheck を確認
Tunnel 502 Public Hostname の URL が http://api:8000 か確認。api コンテナが起動しているか確認
Tunnel タイムアウト cloudflared に --url が付いていないか確認。Pi 側 cloudflared が残っていないか確認
移行後も /ping が返る まだ Pi 側にルーティングされている。Pi の cloudflared を停止し、本 PC の cloudflared を再起動
画像が保存されない data/storage のマウント、ボリューム権限を確認

9. 参照資料(PoC)

資料パス
PoC 結果レポート C:\Dev\PoC_スマート農業環境構築\PoC結果レポート:ホストPC〜複数クライアント通信検証(Phase 1).md
Named Tunnel ナレッジ C:\Dev\PoC_スマート農業環境構築\Phase 1-4 ナレッジ資料:Cloudflare Named TunnelとDNS管理の勘所.md
Manus 作業記録 RaspberryPiを用いたサーバ/クライアント構築と実現性検証