インフラ構成
Bazbiiシステムのインフラ構成、ノード構成、ネットワーク分離、データフローについて詳細に説明します。
アーキテクチャ概要
全体構成図
主要コンポーネント
- Cloudflare Edge: CDN、WAF、DDoS防御、SSL/TLS終端
- Cloudflare Tunnel: ゼロトラストネットワーク、パブリックIP不要
- KonohaVPSサーバー: アプリケーション実行環境
- Server 1: API Server
- Server 2: Gateway
- Server 3: PostgreSQL
- Grafana Cloud: 監視・可観測性(マネージドサービス)
- Prometheus互換メトリクス
- Loki互換ログ
- Tempo互換トレース
- Cloudflare R2: オブジェクトストレージ
- 画像・動画等の大容量データ保存
- S3互換API
ノード構成
MVP段階
Server 1: API Server + Gateway
| 項目 | 値 |
|---|---|
| 用途 | API Server、Gatewayの実行 |
| CPU | 2 vCPU |
| メモリ | 4GB RAM |
| ストレージ | 100GB SSD |
| OS | Ubuntu 22.04 LTS |
| ネットワーク | Cloudflare Tunnel経由のみ |
動作するコンテナ:
bazbii-api: gRPC API Serverbazbii-gateway: Connect RPC Gateway(HTTP/JSON)otel-collector: OpenTelemetry Collector(テレメトリ収集)
Server 2: PostgreSQL
| 項目 | 値 |
|---|---|
| 用途 | PostgreSQLの実行 |
| CPU | 2 vCPU |
| メモリ | 4GB RAM |
| ストレージ | 100GB SSD |
| OS | Ubuntu 22.04 LTS |
| ネットワーク | Cloudflare Tunnel経由のみ |
動作するコンテナ:
postgres: PostgreSQL 16
本番環境
Server 1: API Server
| 項目 | 値 |
|---|---|
| 用途 | API Serverの実行 |
| CPU | 4 vCPU |
| メモリ | 8GB RAM |
| ストレージ | 200GB SSD |
| OS | Ubuntu 22.04 LTS |
| ネットワーク | Cloudflare Tunnel経由のみ |
| スケーリング | 必要に応じて追加ノードを配置 |
動作するコンテナ:
bazbii-api: gRPC API Server(複数インスタンス可)otel-collector: OpenTelemetry Collector
Server 2: Gateway
| 項目 | 値 |
|---|---|
| 用途 | Gatewayの実行 |
| CPU | 2 vCPU |
| メモリ | 4GB RAM |
| ストレージ | 100GB SSD |
| OS | Ubuntu 22.04 LTS |
| ネットワーク | Cloudflare Tunnel経由のみ |
| ロードバランシング | 複数インスタンスで負荷分散 |
動作するコンテナ:
bazbii-gateway: Connect RPC Gateway(HTTP/JSON、複数インスタンス可)otel-collector: OpenTelemetry Collector
Server 3: PostgreSQL
| 項目 | 値 |
|---|---|
| 用途 | PostgreSQLの実行 |
| CPU | 4 vCPU |
| メモリ | 8GB RAM |
| ストレージ | 500GB SSD |
| OS | Ubuntu 22.04 LTS |
| ネットワーク | Cloudflare Tunnel経由のみ |
| 高可用性 | 読み取り専用レプリカ構成 |
動作するコンテナ:
postgres-primary: PostgreSQL 16(プライマリ)postgres-replica: PostgreSQL 16(読み取り専用レプリカ)
ネットワーク分離
ネットワーク構成
1. Cloudflare Tunnel(Zero Trust Network)
特徴:
- パブリックIPを公開しない
- すべての通信をCloudflareネットワーク経由でルーティング
- Cloudflare Accessによる認証・認可
- 自動SSL/TLS暗号化
設定:
- 各サーバーで
cloudflaredデーモンを実行 - トンネル設定により、API、Gateway、DBへのアクセスを制御
- Cloudflare Dashboardでルーティング設定
2. 内部ネットワーク(VPS内)
Docker Composeネットワーク:
bazbii-net: アプリケーションネットワーク
- api
- gateway
- postgres
obs-net: 監視・可観測性ネットワーク(オプション)
- otel-collector(ローカル収集のみ、Grafana Cloudに直接送信)
ネットワーク分離の目的:
- アプリケーションとテレメトリ収集の分離
- セキュリティの向上
- トラフィック制御の簡素化
注意: Prometheus、Loki、Tempo、GrafanaはGrafana Cloudで管理されるため、VPS上には配置しません。
3. サーバー間通信
通信パターン:
- Server 1(API)↔ Server 3(PostgreSQL): データベース接続
- Server 2(Gateway)↔ Server 1(API): gRPC通信
- Server 1-2(アプリ)→ Grafana Cloud: テレメトリ送信(OTLP)
- Server 1(API)↔ Cloudflare R2: オブジェクトストレージ(画像・動画のアップロード・取得)
通信方式:
- Cloudflare Tunnel経由(セキュア)
- 内部ネットワーク(VPS間は直接通信可能、Cloudflare Tunnel経由を推奨)
データフロー
リクエストフロー
外部クライアント → API レスポンス
テレメトリフロー
アプリケーション → 監視スタック
送信されるテレメトリ:
- メトリクス: カスタムメトリクス、システムメトリクス、ドメインイベントメトリクス → Grafana Cloud Prometheus互換エンドポイント
- ログ: 構造化ログ(JSON形式)、アプリケーションログ、エラーログ → Grafana Cloud Loki互換エンドポイント
- トレース: 分散トレーシング(W3C Trace Context)、リクエストトレース → Grafana Cloud Tempo互換エンドポイント
接続方式:
- OTLP(OpenTelemetry Protocol)で直接Grafana Cloudに送信
- HTTPS経由でセキュアに送信
- APIキーによる認証
通信経路
外部アクセス経路
API エンドポイント
Gateway → API 通信
API → PostgreSQL 通信
API → Cloudflare R2 通信
内部通信経路
監視データ収集
Grafana Cloudでの可視化
ポート一覧
Server 1 (API Server)
| ポート | プロトコル | 用途 | アクセス元 |
|---|---|---|---|
| 8080 | gRPC | API Server | Server 2 (Gateway) |
| 4318 | HTTP | OTLPエンドポイント(ローカル) | ローカル otel-collector |
外部サービス接続:
- Cloudflare R2: HTTPS (S3互換API)
- Grafana Cloud: HTTPS (OTLP)
Server 2 (Gateway)
| ポート | プロトコル | 用途 | アクセス元 |
|---|---|---|---|
| 8081 | HTTP | Gateway (Connect RPC) | Cloudflare Tunnel |
| 4318 | HTTP | OTLPエンドポイント(ローカル) | ローカル otel-collector |
Server 3 (PostgreSQL)
| ポート | プロトコル | 用途 | アクセス元 |
|---|---|---|---|
| 5432 | PostgreSQL | データベース | Server 1 (API) |
コンテナ構成詳細
Server 1: API Server
bazbii-api
コンテナ名: bazbii-api
イメージ: カスタムビルド(Goアプリケーション)
ポート: 8080/tcp (gRPC)
環境変数:
- BIND_ADDR: 0.0.0.0
- DB_HOST: Server 3 (PostgreSQL)
- DB_PORT: 5432
- OTEL_EXPORTER_OTLP_ENDPOINT: http://localhost:4318
- R2_ACCOUNT_ID: (Cloudflare R2アカウントID)
- R2_ACCESS_KEY_ID: (R2アクセスキー)
- R2_SECRET_ACCESS_KEY: (R2シークレットキー)
- R2_BUCKET_NAME: (R2バケット名)
ネットワーク: bazbii-net, obs-net
otel-collector
コンテナ名: otel-collector-api
イメージ: otel/opentelemetry-collector-contrib:0.138.0
ポート: 4318/tcp (HTTP) - ローカル受信のみ
役割: ローカルテレメトリ収集 → Grafana Cloudへ直接送信
環境変数:
- OTEL_EXPORTER_OTLP_ENDPOINT: https://otlp-gateway-prod-us-central-0.grafana.net:443
- OTEL_EXPORTER_OTLP_HEADERS: "Authorization=Basic <APIキー>"
ネットワーク: obs-net(オプション、ローカルのみ)
Server 2: Gateway
bazbii-gateway
コンテナ名: bazbii-gateway
イメージ: カスタムビルド(Goアプリケーション)
ポート: 8081/tcp (HTTP)
環境変数:
- SERVER_PORT: 8081
- API_ADDR: Server 1:8080
- OTEL_EXPORTER_OTLP_ENDPOINT: http://localhost:4318
ネットワーク: bazbii-net, obs-net
otel-collector
コンテナ名: otel-collector-gateway
イメージ: otel/opentelemetry-collector-contrib:0.138.0
ポート: 4318/tcp (HTTP) - ローカル受信のみ
役割: ローカルテレメトリ収集 → Grafana Cloudへ直接送信
環境変数:
- OTEL_EXPORTER_OTLP_ENDPOINT: https://otlp-gateway-prod-us-central-0.grafana.net:443
- OTEL_EXPORTER_OTLP_HEADERS: "Authorization=Basic <APIキー>"
ネットワーク: obs-net(オプション、ローカルのみ)
Server 3: PostgreSQL
postgres
コンテナ名: postgres-primary
イメージ: postgres:16-alpine
ポート: 5432/tcp
ボリューム: pgdata(永続化ストレージ)
環境変数:
- POSTGRES_USER: admin
- POSTGRES_PASSWORD: (シークレット)
- POSTGRES_DB: bazbii
ネットワーク: bazbii-net
postgres-replica(本番環境のみ)
コンテナ名: postgres-replica
イメージ: postgres:16-alpine
ポート: 5432/tcp
役割: 読み取り専用レプリカ
ネットワーク: bazbii-net
Grafana Cloud(マネージドサービス)
構成:
- Prometheus互換メトリクスストア
- Loki互換ログストア
- Tempo互換トレースストア
- Grafanaダッシュボード
アクセス:
- Web UI: https://grafana.com
- APIエンドポイント: OTLP経由でテレメトリ受信
Cloudflare R2(オブジェクトストレージ)
構成:
- S3互換オブジェクトストレージ
- 無制限スケーリング
- エグレス(転送)無料(Cloudflare経由)
用途:
- 画像ファイルの保存・配信
- 動画ファイルの保存・配信
- その他の大容量データ
アクセス:
- S3互換API経由
- Cloudflare CDN経由での配信
セキュリティ考慮事項
ネットワークセキュリティ
-
パブリックIP非公開
- VPSサーバーはパブリックIPを公開しない
- Cloudflare Tunnel経由のみでアクセス可能
-
ネットワーク分離
- アプリケーションネットワーク(bazbii-net)とテレメトリ収集(obs-net)を分離
- Grafana Cloudは外部SaaSサービスとして管理
-
Grafana Cloud認証
- Grafana Cloudは独自の認証・認可機能を提供
- ユーザー管理、ロールベースアクセス制御
データセキュリティ
-
データベース接続
- パスワード認証(シークレット管理)
- 内部ネットワーク経由のみ接続
- SSL/TLS接続の推奨(設定可能)
-
テレメトリデータ
- HTTPS経由でGrafana Cloudに送信(APIキー認証)
- 機密情報のマスキング(otel-collectorで処理)
- TLS暗号化によるセキュアな転送
スケーラビリティ
水平スケーリング
-
API Server
- Server 1を複数インスタンス化可能
- ロードバランシング対応
-
Gateway
- Server 2を複数インスタンス化可能
- Cloudflare経由で自動分散
-
PostgreSQL
- 読み取り専用レプリカによる負荷分散
- 必要に応じて読み取り専用レプリカを追加
垂直スケーリング
-
サーバースペックのアップグレード
- KonohaVPS管理画面から容易にアップグレード可能
- ダウンタイム最小限で対応
-
ストレージ拡張
- 必要に応じてストレージを追加
関連ドキュメント
- インフラストラクチャ概要 - インフラ構成の概要
- インフラコスト試算 - コスト試算の詳細
- ドメイン運用 - ドメイン設定
- 運用ガイド - 運用の詳細