# インフラ構成の意思決定記録(ADR: Architecture Decision Record) **作成日**: 2026-01-18 **対象プロジェクト**: Ponshu Room Lite(日本酒アプリ)+ 将来のPosimai Platform **検討メンバー**: 開発者 + Claude (Anthropic) + Gemini (Google) --- ## 📋 目次 1. [現状の環境と課題](#現状の環境と課題) 2. [検討した構成案](#検討した構成案) 3. [最終推奨アーキテクチャ](#最終推奨アーキテクチャ) 4. [Antigravity向けサマリー](#antigravity向けサマリー) --- ## 現状の環境と課題 ### ✅ **既存環境** - **Synology NAS**: メモリ16GB(高スペック) - **Container Manager**: 導入済み - **Gitea**: 導入済み(Git管理) - **Tailscale**: 導入済み・稼働中(VPNアクセス可能) - **現状のアクセス**: TailscaleのIP(100.x.x.x)で外部からアクセス可能 ### ❌ **過去の失敗(Synology経由AI解析)** **時期**: 2025年頃 **問題点**: 1. **自宅の壁**: ローカルIP(192.168.x.x)で外出先から接続不可 2. **セキュリティの壁**: HTTP通信がモバイルOSでブロック 3. **レイテンシ**: 自宅回線の上り速度ボトルネック **結果**: Direct Cloud(Gemini API直接アクセス)に戻した ### 🎯 **現在の目標** 1. **Geminiトークン消費削減**: 無料枠(1日1,500回)を超えないように 2. **データ所有権**: クラウドに依存せず、Synology内で完結 3. **外出先アクセス**: 安全かつ高速なHTTPSアクセス 4. **ずぼら対応**: 自動化・メンテナンスフリー 5. **お香アプリ展開**: 同じインフラで複数アプリ展開 --- ## 検討した構成案 ### 案1: **Cloudflare Tunnel方式**(Claude提案) #### アーキテクチャ ``` スマホ → Cloudflare Tunnel (HTTPS) → Synology NAS ↓ posimai.yourname.com ``` #### メリット - ✅ ポート開放不要 - ✅ 自動HTTPS化(証明書管理不要) - ✅ カスタムドメイン使用可能 - ✅ DDoS防御機能あり - ✅ 無料 #### デメリット - ⚠️ Cloudflareへの依存 - ⚠️ トンネル設定の初期学習コスト - ⚠️ すでにTailscaleがあるのに二重導入 --- ### 案2: **Tailscale Funnel方式**(Gemini提案) #### アーキテクチャ ``` スマホ → Tailscale Funnel (HTTPS) → Synology NAS ↓ nas-name.tailnet-name.ts.net ``` #### メリット - ✅ **既存のTailscaleを活用**(追加インストール不要) - ✅ ポート開放不要 - ✅ 自動HTTPS化 - ✅ Tailscaleの既存知見を活かせる - ✅ 無料(個人利用) #### デメリット - ⚠️ カスタムドメインは別途設定必要 - ⚠️ Cloudflareほど多機能ではない(WAF等) --- ### 案3: **Synology QuickConnect方式** #### アーキテクチャ ``` スマホ → Synology Relay Server → Synology NAS ↓ QuickConnect.to/yourID ``` #### メリット - ✅ Synology公式・設定最簡単 - ✅ ポート開放不要 - ✅ 追加ソフト不要 #### デメリット - ❌ **速度が遅い**(中継経由のため) - ❌ カスタムドメイン不可 - ❌ API開発には不向き --- ### 案4: **Tailscale MagicDNS + HTTPS方式**(推奨) #### アーキテクチャ ``` スマホ (Tailscale VPN) → MagicDNS → Synology NAS ↓ https://nas-name.ts.net ``` #### メリット - ✅ **既存環境を最大活用** - ✅ 正式なHTTPS証明書(Let's Encrypt) - ✅ IPアドレス不要・名前でアクセス - ✅ モバイルアプリのセキュリティ要件クリア - ✅ 追加コストゼロ #### デメリット - ⚠️ 一般公開には不向き(Tailscaleインストール必須) - → 開発・テスト段階では問題なし --- ## 最終推奨アーキテクチャ ### **段階的アプローチ(3ステージ)** #### **Stage 1: 開発・テスト段階(今すぐ)** **採用案**: Tailscale MagicDNS + HTTPS ``` ┌─────────────────────────────────────┐ │ 開発環境(現在〜数ヶ月) │ ├─────────────────────────────────────┤ │ │ │ スマホ (Tailscale VPN) │ │ ↓ │ │ https://posimai-nas.ts.net │ │ ↓ │ │ ┌──────────────────────────────┐ │ │ │ Synology NAS (16GB) │ │ │ │ │ │ │ │ - Immich (写真 + AI検索) │ │ │ │ - PostgreSQL (データ) │ │ │ │ - Ollama (夜間AI解析) │ │ │ │ - Gitea (コード管理) │ │ │ └──────────────────────────────┘ │ │ ↓ │ │ Gemini API (リアルタイム解析) │ └─────────────────────────────────────┘ ``` **理由**: - ✅ 既存Tailscale活用で最速立ち上げ - ✅ HTTPS対応でFlutterアプリ開発可能 - ✅ 外出先テスト可能(自分のデバイスのみ) - ✅ 追加コストゼロ **設定手順**: 1. Tailscale管理画面でMagicDNS有効化 2. HTTPS証明書の自動発行設定 3. FlutterアプリのAPI接続先を `https://posimai-nas.ts.net` に設定 --- #### **Stage 2: 限定公開段階(β版リリース)** **追加導入**: Tailscale Funnel ``` ┌─────────────────────────────────────┐ │ β版・限定公開(数ヶ月後) │ ├─────────────────────────────────────┤ │ │ │ 一般ユーザー(Tailscaleなし) │ │ ↓ │ │ https://posimai.tailnet.ts.net │ │ ↓ │ │ Tailscale Funnel (公開エンドポイント)│ │ ↓ │ │ Synology NAS (同構成) │ └─────────────────────────────────────┘ ``` **理由**: - ✅ Tailscaleの延長線上で公開可能 - ✅ 学習コスト最小 - ✅ β版フィードバック収集に最適 --- #### **Stage 3: 本番運用(正式リリース)** **選択肢A**: Cloudflare Tunnel導入(カスタムドメイン重視) **選択肢B**: Tailscale継続(コスト・シンプルさ重視) ``` ┌─────────────────────────────────────┐ │ 本番環境(1年後〜) │ ├─────────────────────────────────────┤ │ │ │ 【選択肢A: Cloudflare Tunnel】 │ │ 一般ユーザー │ │ ↓ │ │ https://api.posimai.com │ │ ↓ │ │ Cloudflare Tunnel │ │ ↓ │ │ Synology NAS │ │ │ │ 【選択肢B: Tailscale Funnel継続】 │ │ 一般ユーザー │ │ ↓ │ │ https://api.posimai.ts.net │ │ ↓ │ │ Tailscale Funnel │ │ ↓ │ │ Synology NAS │ └─────────────────────────────────────┘ ``` **判断基準**: - ユーザー数が1万人超 → Cloudflare推奨(DDoS対策) - ユーザー数が数百人規模 → Tailscale継続で十分 --- ### **詳細構成(docker-compose.yml)** ```yaml version: '3.8' services: # 1. 写真管理 + AI検索(CLIP内蔵) immich-server: image: ghcr.io/immich-app/immich-server:latest container_name: immich_server environment: DB_HOSTNAME: postgres DB_USERNAME: postgres DB_PASSWORD: ${DB_PASSWORD} DB_DATABASE_NAME: immich REDIS_HOSTNAME: redis volumes: - ${UPLOAD_LOCATION}:/usr/src/app/upload depends_on: - redis - postgres restart: always networks: - posimai-net # 2. データベース postgres: image: tensorchord/pgvecto-rs:pg16-v0.2.0 container_name: immich_postgres environment: POSTGRES_PASSWORD: ${DB_PASSWORD} POSTGRES_USER: postgres POSTGRES_DB: immich volumes: - /volume1/docker/posimai/pgdata:/var/lib/postgresql/data restart: always networks: - posimai-net # 3. キャッシュ redis: image: redis:7.2-alpine container_name: immich_redis restart: always networks: - posimai-net # 4. ローカルAI(夜間バッチ用) ollama: image: ollama/ollama:latest container_name: ollama volumes: - /volume1/docker/posimai/ollama:/root/.ollama restart: always networks: - posimai-net deploy: resources: limits: memory: 8G # 5. 自動化ハブ(ノーコード自動化) activepieces: image: activepieces/activepieces:latest container_name: activepieces environment: AP_ENGINE_EXECUTABLE_PATH: dist/packages/engine/main.js AP_POSTGRES_DATABASE: activepieces AP_POSTGRES_HOST: postgres AP_POSTGRES_PASSWORD: ${DB_PASSWORD} AP_POSTGRES_PORT: 5432 AP_POSTGRES_USERNAME: postgres restart: always networks: - posimai-net # 6. コンテナ管理UI dockhand: image: felixboet/dockhand:latest container_name: dockhand volumes: - /var/run/docker.sock:/var/run/docker.sock:ro restart: always networks: - posimai-net networks: posimai-net: driver: bridge ``` --- ### **AI解析フロー詳細** #### リアルタイム解析(昼間) ``` ┌──────────────┐ │ スマホで撮影 │ └──────┬───────┘ │ ▼ ┌──────────────────────┐ │ Flutter App │ │ 1. 画像圧縮 (1024px) │ │ 2. OCR前処理 │ └──────┬───────────────┘ │ HTTPS ▼ ┌──────────────────────┐ │ Synology (Immich) │ │ 1. 画像保存 │ │ 2. ハッシュ計算 │ │ 3. キャッシュ確認 │ └──────┬───────────────┘ │ ├─ キャッシュHIT → DB取得(即座) │ └─ キャッシュMISS ↓ │ ▼ ┌──────────────┐ │ Gemini API │ │ Vision解析 │ │ (1-3秒) │ └──────┬───────┘ │ ▼ ┌──────────────┐ │ 結果をDB保存 │ │ + キャッシュ │ └──────────────┘ ``` #### 夜間バッチ解析 ``` ┌──────────────────────┐ │ cron: 毎晩0時実行 │ └──────┬───────────────┘ │ ▼ ┌──────────────────────┐ │ 今日の登録写真を取得 │ └──────┬───────────────┘ │ ▼ ┌──────────────────────┐ │ Ollama (NAS内AI) │ │ - Llama 3.2 Vision │ │ - 時間: 10-30秒/枚 │ │ │ │ 処理内容: │ │ 1. ペアリング提案 │ │ 2. 詳細解説生成 │ │ 3. 類似銘柄検索 │ └──────┬───────────────┘ │ ▼ ┌──────────────────────┐ │ PostgreSQLに保存 │ │ - pairing_suggestion │ │ - detailed_notes │ │ - similar_items[] │ └──────────────────────┘ ``` --- ## Antigravity向けサマリー ### 🎯 **検討の核心ポイント** #### 1. **なぜURLが重要なのか?** - **モバイルアプリの要件**: HTTPS必須(HTTPはブロックされる) - **IPアドレスの限界**: SSL証明書が発行できない - **AI連携**: Webhook(外部からの通知受信)に固定URLが必要 - **開発効率**: AIエージェント(Claude/Cursor)への指示がしやすい #### 2. **Cloudflare vs Tailscale 比較** | 観点 | Cloudflare Tunnel | Tailscale Funnel/MagicDNS | |------|-------------------|---------------------------| | **既存環境活用** | ❌ 新規導入 | ✅ **既存Tailscale活用** | | **設定の簡単さ** | ⚠️ 学習コストあり | ✅ **既存知見を活かせる** | | **HTTPS対応** | ✅ 自動 | ✅ 自動(Let's Encrypt) | | **カスタムドメイン** | ✅ 簡単 | ⚠️ DNS設定必要 | | **一般公開** | ✅ 最適 | ✅ Funnelで可能 | | **DDoS対策** | ✅ 強力 | ⚠️ 基本的な保護のみ | | **コスト** | 無料 | 無料(個人利用) | | **推奨段階** | Stage 3(本番) | **Stage 1-2(開発〜β版)** | #### 3. **最終推奨方針** **即座に着手**: Tailscale MagicDNS + HTTPS設定 - 理由: 既存環境を最大活用、最速で開発開始可能 - 所要時間: 30分-1時間 - リスク: ほぼゼロ **中期検討**: Tailscale Funnel導入(β版公開時) - 理由: 一般ユーザーへの公開が可能になる - 所要時間: 1-2時間 - リスク: 低 **長期検討**: Cloudflare Tunnel移行判断(正式版リリース時) - 判断基準: ユーザー数・トラフィック・セキュリティ要件 - 移行コスト: 中(新規学習必要) --- ### 📊 **技術スタック詳細** #### ライセンス・商用利用まとめ | ツール | ライセンス | 商用利用 | 注意点 | |--------|-----------|---------|--------| | **Immich** | AGPL-3.0 | ⚠️ API経由のみOK | 本体改造時は公開義務 | | **Ollama** | MIT | ✅ 完全OK | 制限なし | | **Activepieces** | MIT | ✅ 完全OK | Community版 | | **Dockhand** | MIT | ✅ 完全OK | 制限なし | | **Gitea** | MIT | ✅ 完全OK | 制限なし | #### メモリ配分(16GB環境) | サービス | 推奨メモリ | 役割 | |---------|-----------|------| | Ollama | 4-8GB | ローカルAI(夜間バッチ) | | Immich | 2-4GB | 写真管理 + CLIP検索 | | PostgreSQL | 2GB | データベース | | Activepieces | 1-2GB | 自動化ハブ | | その他 | 2-4GB | Redis, Dockhand等 | --- ### 🚀 **次のアクション(優先順)** #### Step 1: Tailscale HTTPS化(今週) ```bash # Tailscale管理画面で実行 1. MagicDNS有効化 2. HTTPS証明書設定 3. DNS名確認: posimai-nas.ts.net ``` #### Step 2: Immich導入(来週) ```bash # Synology Container Managerで実行 1. docker-compose.yml配置 2. docker-compose up -d 3. https://posimai-nas.ts.net:2283 でアクセス確認 ``` #### Step 3: Flutter接続テスト(再来週) ```dart // lib/config/api_config.dart class ApiConfig { static const String baseUrl = 'https://posimai-nas.ts.net'; static const String immichEndpoint = '$baseUrl:2283/api'; } ``` --- ### 💡 **開発者(非エンジニア)へのアドバイス** #### 「ずぼら」を活かす運用設計 1. **Dockhand自動更新**: コンテナの更新を深夜自動実行 2. **Activepieces自動化**: 写真→解析→DB保存→通知を完全自動化 3. **AIログ生成**: Giteaへのコミットを自動でLINE/Discord通知 #### クレジット表記例 ```dart // アプリの「このアプリについて」画面 const String credits = ''' 使用技術: - Photo Management: Immich (AGPL-3.0) - Local AI: Ollama (MIT) - Automation: Activepieces (MIT) - Infrastructure: Synology NAS + Tailscale '''; ``` --- ## 参考資料 ### 関連ドキュメント - [expansion_and_infrastructure_plan.md](../expansion_and_infrastructure_plan.md) - [technical_spec_incense_v1.md](../technical_spec_incense_v1.md) - [DARK_MODE_GUIDELINES.md](./DARK_MODE_GUIDELINES.md) ### 外部リンク - [Tailscale MagicDNS](https://tailscale.com/kb/1081/magicdns/) - [Tailscale Funnel](https://tailscale.com/kb/1223/tailscale-funnel/) - [Immich Documentation](https://immich.app/docs/overview/introduction) - [Ollama Model Library](https://ollama.com/library) --- **更新履歴**: - 2026-01-18: 初版作成(Claude + Gemini検討内容統合)