7단계: 출시 (Ship)
목표: 스테이징이 운영과 동일해지고, 모든 배포가 지루할 정도로 안전해지며, 출시 당일 롤백이 가능하고, 첫 주를 면밀히 관찰합니다.
소유자가 배포를 실행합니다. 에이전트는 준비, 확인 및 설명만 합니다. 에이전트는 서버에 SSH로 접속하거나, deploy-safe.sh를 실행하거나, DNS를 변경하거나, 소유자가 명시적으로 요청하지 않는 한 Cloudflare를 건드리지 않습니다. deploy-safe.sh는 터미널과 입력된 커밋 ID가 필요하므로 에이전트 혼자서 완료할 수 없습니다.
단계
- 스테이징 (
references/deploy-and-launch.md, "스테이징"): 운영 호스트의 별도 폴더와 데이터베이스,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 <file> --target staging(dry run)으로 적용한 후--apply를 실행합니다.- 데이터베이스 가져오기나 이동 후에는
scripts/check-emoji.sh --target <env>를 실행합니다.
- 출시 감사: 스테이징에 대해 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 키는 사용할 때마다 확인을 요청합니다.
- 스테이징의 문의 양식이 테스트 키를 사용하여 타사 양식 서비스로 게시되어 문의가 테스트 받은편지함으로 전달되었습니다. 출시 전에 라이브에서 실제 문의를 하나 보내고 도착하는지 확인하십시오.
- 웹 분석이 "라이트" 모드에서 몇 주 동안 EU 방문자를 집계하지 않아 핵심 시장이 숨겨졌습니다. 첫날 설정을 확인하십시오.
- 긴 배포(39개 커밋)가
pipefail아래git log | head의 SIGPIPE로 중단되었습니다. 이제 스크립트가 먼저 출력을 캡처합니다. - 서버 데이터베이스 가져오기에서 이모지가
????로 변환되었습니다. 모든 가져오기 후에check-emoji.sh를 실행하십시오.