運用とリリース

デプロイとセキュリティのチェックリスト

明示的なマイグレーション、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 マイグレーションを適用します。