デプロイとセキュリティのチェックリスト
明示的なマイグレーション、cron、稼働準備確認、信頼できるネットワーク、本番制御を使って Web と管理アプリをデプロイします。
スターターのコミット
2a1a04aと同期済みです。
ローカルで動作した後の最終チェックリストとして使います。目標は単にデプロイを成功させることではなく、開発用の近道に頼らず、認証、課金、運用、復元、管理ができるリリースです。
デプロイ構成を選ぶ
- Web と管理コンソールは、別のビルド・別のオリジンにします。リポジトリ、データベース、認証シークレット、リリースタグは共有できます。
vercel.jsonに cron 設定があるため Vercel を例にしていますが、PostgreSQL、Redis、HTTPS、シークレット、認証付きスケジューラーを提供できる Node.js ホスティングなら利用できます。- サーバーレスからの接続にはプール対応の PostgreSQL URL を使い、必要であればマイグレーションには直接接続用 URL を使います。コードを本番へ昇格する前にマイグレーションを行い、ビルド中には自動実行しません。
- CSP は報告のみのモードから始め、アクセス解析、Turnstile、Stripe、ストレージが実際に接続するホストを観測してから、強制する時期を決めます。
本番準備完了の条件: 両アプリが同じリリースからビルドされ、マイグレーション済みで /api/ready が正常と応答し、バックアップを復元でき、cron と Stripe Webhook を実際にテスト済みで、デモ用設定がなく、管理者の読み取り・書き込み権限が想定どおりに働くことです。
Web と apps/admin を別オリジンの独立したサービスとしてデプロイします。Node.js >=20.19.0 <23、pnpm 10.22.0 で pnpm lint、pnpm test:cov、pnpm build を実行した後、pnpm db:check:prod と pnpm db:migrate:prod を明示的に実行します。マイグレーションはビルド中に自動実行しません。
本番で必須の制御
- 十分に強い
BETTER_AUTH_SECRET、正しい URL、本番用 PostgreSQL、復元訓練済みのバックアップ。 - Redis を使う分散アクセス頻度制限と、明示的に信頼したクライアント IP のヘッダー・取得元。
- Turnstile の本番設定、デモ用設定とローカル認証リンクのログ出力の無効化。
CRON_SECRETと 5 分ごとの/api/cron/jobs(vercel.jsonに設定済み)。- 課金を使う場合は Stripe の本番用キー、検証済み Webhook、安全な Portal、Price ID。
- ストレージを使う場合は非公開オブジェクト、最小権限、正しい CORS、短時間だけ有効な署名付き URL。
- 検証済みのメール送信ドメインと、対象地域に合うデータ保持・法務方針。
/api/health はプロセスの生存、/api/ready は環境設定、DB、マイグレーション、Redis、キューを確認します。キューが degraded の場合は、トラフィックを処理できていても警告の対象です。
本番用 HSTS と、報告のみの CSP 経路があります。報告を観測してから、依存先のホストに合うポリシーを強制します。デプロイ後は、認証、組織分離、Checkout と Webhook、cron、データ出力と消去、管理者 MFA を簡易テストし、DEPLOYMENT.md、docs/security-headers.md、.env.example を読んでください。
現行 release は web、admin、worker、Content Studio の hardened image と、config、container、migration、integrity、retention、tests、builds をまとめる pnpm launch:check も提供します。コンテナとローンチ準備とバックアップ・復元訓練へ進んでください。