ステージ7: 出荷
目標: ステージング環境が本番環境を完全にミラーリングし、すべてのデプロイが退屈なほど安定し、ローンチ日にはロールバックが可能で、最初の1週間は監視下にあること。
デプロイを実行するのはオーナーです。 エージェントは準備、確認、説明を行います。エージェントは、オーナーが明示的にその操作を依頼しない限り、サーバーへのSSH接続、deploy-safe.shの実行、DNSの変更、Cloudflareの操作を行いません。deploy-safe.sh はターミナルと手入力のコミットIDを必要とするため、エージェント単独では完了できません。
手順
- ステージング環境 (
references/deploy-and-launch.mdの「Staging」セクション): 本番ホスト上に独立したフォルダとデータベースを持ち、WP_ENVIRONMENT_TYPE=stagingを設定し、Cloudflare Accessの背後に配置し、問い合わせ用のテスト受信トレイを用意します。 - 堅牢化: すべてのサーバーに対して、プロジェクトの
docs/reference/DEPLOY_HARDENING.mdに従った堅牢化を適用します。結果をdocs/reference/SECURITY_PRELAUNCH.mdに記録します。 - エッジ:
references/cloudflare-edge.mdに従ってCloudflare設定を行います。古いホストの前でプロキシを有効にする前にテストしてください。一部のホストはIPベースのレート制限を行っており、Cloudflareをブロックする可能性があります。 - コードのデプロイ(オーナーのみ):
deploy/targets.confをサンプルから作成して記入します。scripts/deploy-safe.sh <commit> --target staging --dry-runを実行し、変更リストを確認した後、--dry-runなしで再度実行します。- 既にコードが存在するサーバーでの初回実行時は、
--assume-live <commit>を指定します。
- コンテンツは別途デプロイします。
- コードに価格、ページ、法的テキストを含めてはいけません。
- 各変更を
docs/data/content-changes/<日付>-<トピック>.jsonとして記録します(フィールドごとに変更前と変更後の値を含む)。 scripts/apply-content-change.sh <ファイル> --target staging(dry run)を実行し、その後--applyを指定して適用します。- データベースのインポートまたは移動後は、常に
scripts/check-emoji.sh --target <環境>を実行します。
- ローンチ監査: launch-auditor エージェントをステージング環境に対して実行し、失敗した項目を修正して、合格するまで再度実行します。
- カットオーバー計画:
references/deploy-and-launch.mdの「Cutover」セクションに基づいて作成します。オーナーが日時を承認し、サイトが既に予約を受け付けている場合はビジネスパートナーも承認します。 - 公開: 本番環境にデプロイし、launch-auditor を本番環境に対して実行し、サイトマップをSearch Consoleに送信し、実際の受信トレイにテストの問い合わせを送信します。
- 7日間の監視: エラー、404(リダイレクトを追加)、フォームの受信トレイ、アナリティクス、Search Consoleのカバレッジを監視します。
ゲート(SITE_STATUS.md にチェックマークを付ける)
- ステージング環境がAccessの背後にあり、noindex設定、メールが保護されている
- 堅牢化が適用され、記録されている
- ステージングへの安全なデプロイが完了し、スモークテストが合格
- launch-auditor がステージング環境でPASS、その後本番環境でもPASS
- カットオーバー計画が承認されている(日付、ロールバック、メール/MXの確認済み)
- 7日間の監視が完了
これらのルールを形作ったインシデント
- あるエージェントが本番環境の価格を変更し、AIが作成した利用規約を公開し、レビューなしで機能をデプロイしました。さらにその報告書からデプロイが漏れていました。それ以来、デプロイはマージされたコミットからのみ、スクリプトを通じて、人間が手入力で行い、本番環境のSSHキーは使用のたびに確認を求めるようになりました。
- ステージング環境の問い合わせフォームがテストキーを使用してサードパーティのフォームサービスに投稿していたため、問い合わせがテスト受信トレイに送られていました。ローンチ前に本番環境で実際の問い合わせを1件送信し、届くことを確認してください。
- Webアナリティクスが「ライト」モードでEUの訪問者を数週間にわたってカウントしておらず、主要市場を見逃していました。初日に設定を確認してください。
- 長いデプロイ(39コミット)が、
pipefail下でのgit log | headからのSIGPIPEで停止しました。スクリプトは現在、最初に出力をキャプチャするようになりました。 - サーバーのデータベースインポートで絵文字が
????に変換されました。インポートのたびにcheck-emoji.shを実行してください。