版数: 1.0  |  更新日: 2026-05-04

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点を実証した。

  1. グローバルIPアドレスおよびルーターのポート開放なしに、Raspberry Pi上のFastAPI(Dockerコンテナ)をインターネットへ安全に公開できること。
  2. 外部ネットワーク(モバイル回線・Wi-Fi)から10MBのファイルをアップロードし、データ整合性(MD5ハッシュ一致)を確認できること。
  3. 独自ドメイン(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 へのアクセス確認

主な発見事項・トラブル:


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) ログより確認

主な発見事項・トラブル:


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 では問題なし

主な発見事項・トラブル:


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.comhttp://api:8000
HTTPS での疎通確認 ✅ 成功 https://api.your-domain.com/ping{"message":"pong"}

主な発見事項・トラブル:


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 で検討すべき事項

  1. API 仕様の正式定義: エンドポイント設計、リクエスト/レスポンスフォーマット、認証方式
  2. エラーハンドリング仕様: モバイル回線切断時のリトライ、タイムアウト処理
  3. FCM(プッシュ通知)導入要否: サーバーからクライアントへの通知が必要かどうか
  4. 50MB 以上のファイルアップロードテスト: 動画データを想定した場合の制限確認
  5. 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 全体のガントチャート(更新済み)