PoC 結果レポート(Phase 1)
PoC結果レポート:ホストPC〜複数クライアント通信検証(Phase 1)
作成日: 2026年5月4日
対象フェーズ: Phase 1-1〜1-4
作成者: 検証担当
1. エグゼクティブサマリー
本レポートは、Raspberry Pi 5をサーバー基盤とし、Cloudflare Tunnelを用いてiPhoneクライアントとの通信を確立するPoC(概念実証)の Phase 1 全体の結果をまとめたものである。
結論として、Phase 1の全4フェーズを完了し、以下の3点を実証した。
- グローバルIPアドレスおよびルーターのポート開放なしに、Raspberry Pi上のFastAPI(Dockerコンテナ)をインターネットへ安全に公開できること。
- 外部ネットワーク(モバイル回線・Wi-Fi)から10MBのファイルをアップロードし、データ整合性(MD5ハッシュ一致)を確認できること。
- 独自ドメイン(
api.your-domain.com)を用いた固定URLでのHTTPSアクセスが確立できること。
2. 検証環境
2.1. ハードウェア構成
| 機器 | 仕様 | 役割 |
|---|---|---|
| Raspberry Pi 5 | ARM64 / Ubuntu Server | APIサーバー(ホスト) |
| Windows PC | Windows 11 | 検証クライアント(curl / PowerShell) |
| iPhone | iOS(実機) | 最終クライアント(接続確認) |
2.2. ソフトウェア構成
| コンポーネント | バージョン / 設定値 | 備考 |
|---|---|---|
| Docker Engine | 最新安定版 | Raspberry Pi上で稼働 |
| Docker Compose | V2(version: フィールド廃止済み) |
コンテナ統合管理 |
| FastAPI | Python 3.x / uvicorn | APIフレームワーク |
| cloudflared | cloudflare/cloudflared:latest |
Tunnel クライアント |
| Cloudflare Tunnel | Named Tunnel(your-tunnel-name) |
外部公開手段 |
| ドメイン | your-domain.com(Squarespace管理) |
DNS管理はCloudflareへ移行 |
2.3. 最終的な通信フロー
【外部クライアント(iPhone / Windows PC)】
│
│ ① HTTPS リクエスト(https://api.your-domain.com/...)
▼
【Cloudflare DNS(Layer 3)】
│ api.your-domain.com を解決
▼
【Cloudflare エッジサーバー(東京リージョン: nrt05/nrt12/nrt15)】
│ Public Hostname設定に基づき、your-tunnel-name にルーティング
▼
【cloudflared コンテナ(Raspberry Pi)】
│ トンネル接続経由でリクエストを受信
│ http://api:8000 へ転送(Docker内部ネットワーク)
▼
【FastAPI コンテナ(api:8000)】
│ エンドポイント処理を実行
▼
【レスポンスを逆経路で返却】
3. フェーズ別実施結果
3.1. Phase 1-1:Raspberry Pi 基礎環境構築
実施期間: 2026年3月下旬
結果: ✅ 完了
| 検証項目 | 結果 | 備考 |
|---|---|---|
| Raspberry Pi 5 セットアップ | ✅ 成功 | Ubuntu Server インストール |
| Docker / Docker Compose インストール | ✅ 成功 | |
| FastAPI コンテナ起動 | ✅ 成功 | http://localhost:8000/ping → {"message":"pong"} |
| ローカルネットワーク内疎通確認 | ✅ 成功 | Windows PC から Raspberry Pi へのアクセス確認 |
主な発見事項・トラブル:
- Dockerコマンドの実行に
sudoが必要(実行ユーザーがdockerグループ未所属のため)。恒久対策としてsudo usermod -aG docker damio01を確認。 - SSH接続時のユーザー名誤り(
damio→ 正しくはdamio01)および~/.sshディレクトリのパーミッション不備(755→700に修正)。
3.2. Phase 1-2:Cloudflare Tunnel 外部公開検証
実施期間: 2026年4月1日
結果: ✅ 完了
| 検証項目 | 結果 | 備考 |
|---|---|---|
| Quick Tunnel(trycloudflare.com)での URL 発行 | ✅ 成功 | https://occur-thompson-theorem-bracket.trycloudflare.com |
| Wi-Fi環境からの外部疎通確認 | ✅ 成功 | /ping → {"message":"pong"} |
| モバイル回線(4G/5G)からの外部疎通確認 | ✅ 成功 | iPhone テザリング経由で確認 |
| Cloudflare エッジ接続プロトコル | QUIC | ログに Initial protocol quic と表示 |
| エッジ接続先 | 東京(xxx.xxx.xxx.xxx) | ログより確認 |
主な発見事項・トラブル:
- Named Tunnel の Route 設定(Public Hostname)は、ドメインが Cloudflare の DNS ゾーンで管理されている場合のみ利用可能。当時はドメイン未登録のため Quick Tunnel で代替。
- Quick Tunnel はコンテナ再起動のたびに URL が変わる仕様。継続的なテストには Named Tunnel が必須。
- Docker Compose V2 では
version:フィールドが廃止されており、記述すると警告が出るが動作に影響なし。
3.3. Phase 1-3:データアップロード安定性検証
実施期間: 2026年4月12日
結果: ✅ 完了
| 検証項目 | 結果 | 備考 |
|---|---|---|
| 10MB ダミーファイル作成 | ✅ 成功 | fsutil file createnew dummy_10mb.dat 10485760 |
| curl によるアップロード | ✅ 成功 | PowerShell では curl.exe と明示する必要あり |
| Raspberry Pi 側でのファイル保存確認 | ✅ 成功 | ls -lh ~/poc-api/data/ で確認 |
| MD5 ハッシュ値による整合性確認 | ✅ 一致 | 送信前後でハッシュ値が一致 |
Cloudflare 制限事項(確認済み):
| 制限項目 | 制限値 | 今回の検証結果 |
|---|---|---|
| 最大アップロードサイズ | 100MB(Free プラン) | 10MB で問題なし |
| タイムアウト | 100秒 | 10MB では問題なし |
主な発見事項・トラブル:
- FastAPI の保存先パス(
/data/uploads)と Docker ボリュームマウント先(/app/data)が不一致。main.pyの保存先を/app/dataに修正し、docker compose up -d --buildで再ビルドして解決。 - 50MB ファイルのテストは未実施(スコープ外として Phase 2 以降に持ち越し)。
3.4. Phase 1-4:本番用ドメイン適用検証(Named Tunnel 設定問題解決)
実施期間: 2026年4月29日〜5月4日
結果: ✅ 完了
| 検証項目 | 結果 | 備考 |
|---|---|---|
| Cloudflare DNS 移行(Connect a domain) | ✅ 成功 | Squarespace → Cloudflare DNS(NS変更のみ、所有権はSquarespaceのまま) |
| Named Tunnel(your-tunnel-name)の Healthy 確認 | ✅ 成功 | Uptime 6日以上、Active replicas 1 |
| Public Hostname 設定 | ✅ 成功 | api.your-domain.com → http://api:8000 |
| HTTPS での疎通確認 | ✅ 成功 | https://api.your-domain.com/ping → {"message":"pong"} |
主な発見事項・トラブル:
--token(Named Tunnel 用)と--url(Quick Tunnel 用)を同時指定していたため、リクエストの転送先が未定義となりタイムアウト。--urlを削除し、Cloudflare ダッシュボードの Public Hostname 設定で転送先を定義することで解決。- Named Tunnel の Public Hostname 機能はドメインが Cloudflare DNS ゾーンで管理されていることが前提。ドメインの DNS 管理を Squarespace(Google Cloud DNS)から Cloudflare へ移行することで解決。
- Cloudflare ダッシュボードの「Add route」→「Published application」の Service URL 入力には
http://プロトコル指定が必須(api:8000のみでは Invalid format エラー)。 - DNS 移行前の事前確認により、MX レコードが存在せず SPF が
-all(全拒否)であったため、Google Workspace メールへの影響なしと判断。
4. 発見した課題と推奨事項
4.1. 本番環境移行に向けた推奨事項
| 項目 | 現状 | 推奨対応 | 優先度 |
|---|---|---|---|
| ファイルアップロードサイズ上限 | 100MB(Cloudflare Free) | 動画など100MB超のデータが必要な場合、チャンクアップロード実装またはCloudflare Pro検討 | 中 |
| タイムアウト対策 | 100秒(Cloudflare制限) | 大容量ファイルの非同期処理(バックグラウンドジョブ化)の検討 | 中 |
| データ永続化 | ローカルファイルシステム(SDカード/SSD) | 本番ではクラウドストレージ(S3等)への移行を検討 | 高 |
| 認証・認可 | 未実装 | API キー認証または JWT 認証の実装 | 最高 |
| エラーハンドリング | 基本実装のみ | モバイル回線切断時のリトライ処理の実装 | 高 |
| 50MB以上のファイルテスト | 未実施 | Phase 2 以降で実施 | 低 |
4.2. アーキテクチャ上の重要な知見
Cloudflare Tunnel の設定方式の使い分け:
【Quick Tunnel(PoC・動作確認用)】
command: tunnel --no-autoupdate --url http://api:8000
→ アカウント不要、URL は毎回変わる
【Named Tunnel(本番・継続テスト用)】
command: tunnel --no-autoupdate run --token <TOKEN>
→ URL 固定、Cloudflare ダッシュボードで Public Hostname を設定
→ ⚠️ --url と --token の同時指定は不可
DNS 管理の階層構造(5層モデル):
Layer 5: アプリケーション(ブラウザ・iPhone)
Layer 4: DNS 解決(名前 → IP アドレス変換)
Layer 3: DNS 管理(ネームサーバー) ← 今回 Cloudflare に移行したのはここのみ
Layer 2: ドメイン登録(所有権) ← Squarespace のまま変更なし
Layer 1: ルート DNS(.com 等の管理)
5. Phase 2 以降に向けた引き継ぎ事項
5.1. 現在の稼働状況
| 項目 | 状態 |
|---|---|
| Raspberry Pi 5 | 稼働中(自宅ネットワーク) |
| FastAPI コンテナ(poc-api) | 稼働中(restart: always) |
| cloudflared コンテナ | 稼働中(Uptime 6日以上) |
| 公開 URL | https://api.your-domain.com |
/ping エンドポイント |
{"message":"pong"} 確認済み |
/upload エンドポイント |
10MB ファイルのアップロード確認済み |
5.2. 実装済みエンドポイント一覧
| エンドポイント | メソッド | レスポンス | 状態 |
|---|---|---|---|
/ping |
GET | {"message":"pong"} |
✅ 実装・確認済み |
/upload |
POST | {"filename":"...","status":"saved"} |
✅ 実装・確認済み |
/docs |
GET | Swagger UI | ✅ 自動生成 |
5.3. Phase 2 で検討すべき事項
- API 仕様の正式定義: エンドポイント設計、リクエスト/レスポンスフォーマット、認証方式
- エラーハンドリング仕様: モバイル回線切断時のリトライ、タイムアウト処理
- FCM(プッシュ通知)導入要否: サーバーからクライアントへの通知が必要かどうか
- 50MB 以上のファイルアップロードテスト: 動画データを想定した場合の制限確認
- iPhone アプリとの実際の接続テスト: 実機での E2E 検証
6. 参照資料
| 資料名 | 内容 |
|---|---|
| 基本設計書・詳細設計書(Phase1-2) | Cloudflare Tunnel 外部公開検証の設計パラメータ |
| 基本設計書・詳細設計書(Phase1-3) | データアップロード安定性検証の設計パラメータ |
| 基本設計書・詳細設計書(Phase1-4) | Named Tunnel 設定問題解決の設計パラメータ |
| phase1_2_knowledge_base.md | Cloudflare Tunnel の仕組みと設定方法の解説 |
| phase1_3_knowledge_base.md | 大容量データアップロードの安定性検証と制限事項 |
| phase1_4_knowledge_base.md | Named Tunnel と DNS 管理の勘所 |
| Squarespace_to_Cloudflare_DNS移管手順書.md | DNS 移管の詳細手順(スクリーンショット付き) |
| poc_gantt_chart_20260504.xlsx | Phase 1 全体のガントチャート(更新済み) |