コンテンツにスキップ

Fly.io PostgreSQL Dockerコンテナデプロイ

更新日: 2025年1月27日

概要

Fly.ioのLegacy Postgresが非推奨となったため、PostgreSQLをDockerコンテナとして自前でデプロイします。

なぜDockerコンテナにするのか

  • 長期的な安定性: Legacy Postgresのサポート終了リスクを回避
  • コスト管理: Managed Postgresよりコストを抑えられる
  • 柔軟性: Postgresのバージョンや設定を自由に選択可能
  • 制御性: データベースの運用を完全にコントロールできる

アーキテクチャ

Fly.io Platform
├── ritsubi-ecommerce (Vendure Server)
│   └── DATABASE_URLで接続
│
└── ritsubi-postgres-db (PostgreSQL Docker Container)
    ├── Image: groonga/pgroonga:latest-alpine-17 (PostgreSQL 17 + PGroonga)
    ├── Volume: postgres_data (永続ストレージ)
    └── Internal Network: ritsubi-postgres-db.internal

PGroonga拡張の有効化方針

  • PGroongaはデータベースごとに CREATE EXTENSION pgroonga; を実行して有効化する必要がある。
  • 漏れ防止のため、Vendureのマイグレーションに拡張作成を組み込み済み。
  • ファイル: apps/vendure-server/src/migrations/20251201100000_enable_pgroonga_extension.ts
  • 内容: CREATE EXTENSION IF NOT EXISTS "pgroonga";
  • Flyデプロイ時のリリースコマンド(node dist/src/index.js migration)で自動適用されるため、手動操作は不要。
  • 既存ボリューム/既存DBでも安全に実行され、重複作成エラーは発生しない。

デプロイ手順

詳細は /apps/postgres/README.md を参照してください。

クイックスタート

# 1. Postgresアプリ作成
cd /home/genm/Projects/ritsubi/apps/postgres
flyctl apps create ritsubi-postgres-db --org ritsubi

# 2. ボリューム作成
flyctl volumes create postgres_data \
  --region nrt \
  --size 10 \
  -a ritsubi-postgres-db

# 3. パスワード設定
flyctl secrets set POSTGRES_PASSWORD="$(openssl rand -base64 32)" -a ritsubi-postgres-db

# 4. デプロイ
flyctl deploy -a ritsubi-postgres-db

# 5. Vendureアプリに接続設定
flyctl secrets set DATABASE_URL="postgres://postgres:PASSWORD@ritsubi-postgres-db.internal:5432/ritsubi_vendure" -a ritsubi-ecommerce

接続文字列の構築

パスワードを取得して接続文字列を構築:

# パスワード確認(値は表示されませんが、設定されているか確認)
flyctl secrets list -a ritsubi-postgres-db

# 接続文字列を設定(PASSWORDを実際の値に置き換え)
flyctl secrets set DATABASE_URL="postgres://postgres:PASSWORD@ritsubi-postgres-db.internal:5432/ritsubi_vendure" -a ritsubi-ecommerce

セキュリティ考慮事項

内部ネットワーク

  • Fly.io内部ネットワーク(.internal)経由で接続
  • パブリックインターネットからは直接アクセス不可
  • 追加のセキュリティレイヤーは不要

パスワード管理

  • POSTGRES_PASSWORDはFly.ioシークレットとして管理
  • DATABASE_URLにも含まれるため、同様にシークレットで管理
  • 定期的なパスワードローテーションを推奨

監視とメンテナンス

ログ監視

# リアルタイムログ
flyctl logs -a ritsubi-postgres-db

# 過去のログ
flyctl logs -a ritsubi-postgres-db --since 1h

パフォーマンス監視

# メトリクス確認
flyctl metrics -a ritsubi-postgres-db

# アプリ状態確認
flyctl status -a ritsubi-postgres-db

バックアップ

# 定期バックアップスクリプトを作成
flyctl ssh console -a ritsubi-postgres-db
pg_dump -U postgres ritsubi_vendure > /tmp/backup_$(date +%Y%m%d_%H%M%S).sql

コスト概算

  • VM: shared-cpu-1x, 1GB RAM ≈ $5-7/月
  • ストレージ: 10GB ≈ $2-3/月
  • 合計: ≈ $7-10/月

Managed Postgresと比較して、約50-70%のコスト削減が可能。

移行ガイド

既存のLegacy Postgresからの移行手順は /apps/postgres/README.md の「移行手順」セクションを参照してください。