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
の「移行手順」セクションを参照してください。