メインコンテンツまでスキップ

インフラ構成

Bazbiiシステムのインフラ構成、ノード構成、ネットワーク分離、データフローについて詳細に説明します。

アーキテクチャ概要

全体構成図

主要コンポーネント

  1. Cloudflare Edge: CDN、WAF、DDoS防御、SSL/TLS終端
  2. Cloudflare Tunnel: ゼロトラストネットワーク、パブリックIP不要
  3. KonohaVPSサーバー: アプリケーション実行環境
    • Server 1: API Server
    • Server 2: Gateway
    • Server 3: PostgreSQL
  4. Grafana Cloud: 監視・可観測性(マネージドサービス)
    • Prometheus互換メトリクス
    • Loki互換ログ
    • Tempo互換トレース
  5. Cloudflare R2: オブジェクトストレージ
    • 画像・動画等の大容量データ保存
    • S3互換API

ノード構成

MVP段階

Server 1: API Server + Gateway

項目
用途API Server、Gatewayの実行
CPU2 vCPU
メモリ4GB RAM
ストレージ100GB SSD
OSUbuntu 22.04 LTS
ネットワークCloudflare Tunnel経由のみ

動作するコンテナ:

  • bazbii-api: gRPC API Server
  • bazbii-gateway: Connect RPC Gateway(HTTP/JSON)
  • otel-collector: OpenTelemetry Collector(テレメトリ収集)

Server 2: PostgreSQL

項目
用途PostgreSQLの実行
CPU2 vCPU
メモリ4GB RAM
ストレージ100GB SSD
OSUbuntu 22.04 LTS
ネットワークCloudflare Tunnel経由のみ

動作するコンテナ:

  • postgres: PostgreSQL 16

本番環境

Server 1: API Server

項目
用途API Serverの実行
CPU4 vCPU
メモリ8GB RAM
ストレージ200GB SSD
OSUbuntu 22.04 LTS
ネットワークCloudflare Tunnel経由のみ
スケーリング必要に応じて追加ノードを配置

動作するコンテナ:

  • bazbii-api: gRPC API Server(複数インスタンス可)
  • otel-collector: OpenTelemetry Collector

Server 2: Gateway

項目
用途Gatewayの実行
CPU2 vCPU
メモリ4GB RAM
ストレージ100GB SSD
OSUbuntu 22.04 LTS
ネットワークCloudflare Tunnel経由のみ
ロードバランシング複数インスタンスで負荷分散

動作するコンテナ:

  • bazbii-gateway: Connect RPC Gateway(HTTP/JSON、複数インスタンス可)
  • otel-collector: OpenTelemetry Collector

Server 3: PostgreSQL

項目
用途PostgreSQLの実行
CPU4 vCPU
メモリ8GB RAM
ストレージ500GB SSD
OSUbuntu 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)

ポートプロトコル用途アクセス元
8080gRPCAPI ServerServer 2 (Gateway)
4318HTTPOTLPエンドポイント(ローカル)ローカル otel-collector

外部サービス接続:

  • Cloudflare R2: HTTPS (S3互換API)
  • Grafana Cloud: HTTPS (OTLP)

Server 2 (Gateway)

ポートプロトコル用途アクセス元
8081HTTPGateway (Connect RPC)Cloudflare Tunnel
4318HTTPOTLPエンドポイント(ローカル)ローカル otel-collector

Server 3 (PostgreSQL)

ポートプロトコル用途アクセス元
5432PostgreSQLデータベース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ダッシュボード

アクセス:

Cloudflare R2(オブジェクトストレージ)

構成:

  • S3互換オブジェクトストレージ
  • 無制限スケーリング
  • エグレス(転送)無料(Cloudflare経由)

用途:

  • 画像ファイルの保存・配信
  • 動画ファイルの保存・配信
  • その他の大容量データ

アクセス:

  • S3互換API経由
  • Cloudflare CDN経由での配信

セキュリティ考慮事項

ネットワークセキュリティ

  1. パブリックIP非公開

    • VPSサーバーはパブリックIPを公開しない
    • Cloudflare Tunnel経由のみでアクセス可能
  2. ネットワーク分離

    • アプリケーションネットワーク(bazbii-net)とテレメトリ収集(obs-net)を分離
    • Grafana Cloudは外部SaaSサービスとして管理
  3. Grafana Cloud認証

    • Grafana Cloudは独自の認証・認可機能を提供
    • ユーザー管理、ロールベースアクセス制御

データセキュリティ

  1. データベース接続

    • パスワード認証(シークレット管理)
    • 内部ネットワーク経由のみ接続
    • SSL/TLS接続の推奨(設定可能)
  2. テレメトリデータ

    • HTTPS経由でGrafana Cloudに送信(APIキー認証)
    • 機密情報のマスキング(otel-collectorで処理)
    • TLS暗号化によるセキュアな転送

スケーラビリティ

水平スケーリング

  1. API Server

    • Server 1を複数インスタンス化可能
    • ロードバランシング対応
  2. Gateway

    • Server 2を複数インスタンス化可能
    • Cloudflare経由で自動分散
  3. PostgreSQL

    • 読み取り専用レプリカによる負荷分散
    • 必要に応じて読み取り専用レプリカを追加

垂直スケーリング

  1. サーバースペックのアップグレード

    • KonohaVPS管理画面から容易にアップグレード可能
    • ダウンタイム最小限で対応
  2. ストレージ拡張

    • 必要に応じてストレージを追加

関連ドキュメント