デプロイとセキュリティのチェックリスト
明示的なマイグレーション、cron、稼働準備確認、信頼できるネットワーク、本番制御を使って Web と管理アプリをデプロイします。
スターターのコミット
e632762と同期済みです。
ローカルで動作した後の最終チェックリストとして使います。目標は単にデプロイを成功させることではなく、開発用の近道に頼らず、認証、課金、運用、復元、管理ができるリリースです。
デプロイ構成を選ぶ
- Web と管理コンソールは、別のビルド・別のオリジンにします。リポジトリ、データベース、認証シークレット、リリースタグは共有できます。
vercel.jsonに cron 設定があるため Vercel を例にしていますが、PostgreSQL、Redis、HTTPS、シークレット、認証付きスケジューラーを提供できる Node.js ホスティングなら利用できます。- サーバーレスからの接続にはプール対応の PostgreSQL URL を使い、必要であればマイグレーションには直接接続用 URL を使います。コードを本番へ昇格する前にマイグレーションを行い、ビルド中には自動実行しません。
- CSP は報告のみのモードで始め、アクセス解析、Turnstile、Stripe、ストレージが使うホストを確認し、検証後に強制します。
本番準備完了の条件: 両アプリが同じリリースからビルドされ、マイグレーション済みで /api/ready が正常と応答し、バックアップを復元でき、選択したジョブ実行方式と Stripe Webhook を実際にテスト済みで、デモ用設定がなく、管理者の読み取り・書き込み権限が想定どおりに働くことです。
Web と apps/admin を別オリジンの独立したサービスとしてデプロイします。Node.js >=24.22.1 <25、pnpm 10.22.0 で pnpm lint、pnpm test:cov、pnpm build を実行した後、pnpm db:migrate:prod と pnpm db:check:prod を明示的に実行します。マイグレーションはビルド中に自動実行しません。
本番で必須の制御
- 十分に強い
BETTER_AUTH_SECRET、正しい公開・認証 URL、本番用 PostgreSQL、復元訓練済みのバックアップ。 - Redis による分散アクセス制限と、明示的に信頼したクライアント IP の取得元。
- CAPTCHA を有効にする場合の本番 Turnstile キー。デモ機能と認証リンクのログ出力は無効にします。
CRON_SECRETと既定のジョブ実行方式を一つ選びます。認証付き/api/cron/jobsの5分間隔呼び出し、定期的なpnpm jobs:run --production、または常駐するpnpm jobs:work --productionです。vercel.jsonは HTTP 呼び出しの予定を定義します。- 現在の検証で必須となる Stripe の本番キー、検証済み Webhook、安全な Billing Portal 設定、四つの主要 Price ID。
- 非公開の S3 互換ストレージ認証情報、最小権限、正しい CORS、短時間の署名付き URL。
- 検証済みの送信ドメインと、提供地域に合わせて確認したデータ保持・法務方針。
/api/health はプロセスの生存、/api/ready は環境設定、DB、マイグレーション、Redis、キューを確認します。キューが degraded の場合は、トラフィックを処理できていても警告の対象です。
本番用 HSTS と、報告のみの CSP 経路があります。報告を観測してから、依存先のホストに合うポリシーを強制します。デプロイ後は、認証、組織分離、Checkout と Webhook、ジョブ実行、データ出力と消去、管理者 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 も提供します。コンテナとローンチ準備とバックアップ・復元訓練へ進んでください。
実際の本番設定を検証する
pnpm env:setup:prod で .env.production.local を準備し、pnpm env:check:prod を実行します。Web と Admin の両方に PostgreSQL、Redis、auth/cron secret、公開・認証 URL、Resend と送信元、Stripe の秘密鍵と Webhook secret、Portal と 4 つの Price、非公開ストレージ認証情報が必要です。画面が直接使用しなくても共有の本番検証で要求されます。空の鍵では課金やストレージを無効化できず、機能を削除するなら検証と実行処理も明示的に変更します。
Admin の BETTER_AUTH_URL と NEXT_PUBLIC_AUTH_BASE_URL は Admin を指し、NEXT_PUBLIC_WEB_URL は顧客アプリを指します。Worker とリリースコマンドにはホストの secret manager から本番変数を渡してください。環境設定ガイドで共有・読み込み規則を確認できます。認証更新前に 0037_neat_excalibur.sql、Studio 更新前に独立した Payload マイグレーションを適用します。