목표
개발자가 배포를 신경 쓰는 순간, 그 시간만큼 기능이 안 만들어진다.
PM 이 인프라를 맡는 이유가 이것입니다. 나머지 4인은 git push 만 하면 됩니다.
환경 3종
| 환경 | 용도 | 배포 시점 | 데이터 |
|---|---|---|---|
| local | 개인 개발 | 즉시 | 각자 로컬 DB |
| staging | 통합 검증 · 시연 | main 머지 시 자동 |
시드 데이터, 언제든 초기화 가능 |
| production | 실서비스 | 태그 푸시 시 수동 승인 | 실데이터. 초기화 절대 불가 |
D-9(9/07)부터 목데이터 금지
1차 통합 이후 웹·앱은 반드시 스테이징 실 API를 바라봅니다. 목데이터로 만든 화면은 시연 직전에 반드시 깨집니다.
포트 규약
| 대상 | local | 비고 |
|---|---|---|
| 백엔드 API | 8300 |
frontend/CLAUDE.md 명시 |
| 웹 프론트 dev | 3300 |
동일 |
| PostgreSQL | 5432 |
컨테이너 |
| Flutter | — | 실기기/에뮬레이터에서 스테이징 API 사용 |
웹 dev 서버는 /api 를 :8300 으로 프록시합니다. 로컬에서 CORS 를 만나면 설정이 잘못된 것입니다.
구성
인터넷
│
[ Reverse Proxy ] Nginx 또는 Caddy
HTTPS · 자동 인증서 갱신
│
┌───────────┴───────────┐
│ │
web (정적) api (FastAPI)
beyondbob.… api.…
│
PostgreSQL
(일 1회 백업)
GitHub Pages ──── beyondbob.remakeday.com (이 개발 허브)
└ Actions 로 빌드/배포
배포 파이프라인
| 파이프라인 | 트리거 | 하는 일 | 담당 |
|---|---|---|---|
| 백엔드 CI | PR 생성 | lint + pytest. 실패 시 머지 차단 | PM-09 |
| 백엔드 CD (stg) | main 머지 |
이미지 빌드 → 스테이징 반영 (5분 내) | PM-10 |
| 프론트 CD (stg) | main 머지 |
빌드 → 정적 배포. 실패 시 이전 버전 유지 | PM-12 |
| 앱 배포 | 수동 | 내부 테스트 트랙 업로드 | PM-18 · APP-19 |
| 개발 허브 | 이 레포 push | Jekyll 빌드 → GitHub Pages | 이미 동작 |
| 프로덕션 | 태그 + 수동 승인 | 마이그레이션 → 배포 → 헬스체크 | PM-24 |
시크릿 관리
레포에 키를 커밋하면 되돌릴 수 없다
git 히스토리에서 지워도 이미 유출된 것으로 간주하고 키를 폐기·재발급해야 합니다. 14일 일정에서 그 반나절은 매우 아픕니다.
| 키 | 저장 위치 | 접근 |
|---|---|---|
| DB 접속 정보 | GitHub Secrets + 서버 .env |
PM |
| JWT 서명 키 | 동일 (stg/prod 다르게) | PM |
| LLM API 키 | 동일 | PM · 신채연 |
| 스토어 서명 키 | 별도 안전 보관 | PM · 이은상 |
- 레포에는
.env.example만 올린다. 키 이름만 있고 값은 비어 있다. .gitignore에.env가 있는지 매 리뷰마다 확인 (PM-07).- D-3(9/13)에 시크릿 스캔을 돌린다 (PM-33).
백업 · 복구
- PostgreSQL 일 1회 자동 백업, 7일 보관 (PM-06).
- D-3(9/13)에 실제 복구 리허설을 한다 (BE-33). 백업 파일로 별도 DB 를 세우고 서비스가 뜨는지 확인.
- 복구해 본 적 없는 백업은 백업이 아닙니다.
관측
최소한만 갖춥니다. 없으면 오픈 당일 장님이 됩니다.
| 항목 | 수단 | 알림 |
|---|---|---|
| 서비스 생존 | GET /health 주기 확인 |
실패 시 팀 채널 |
| 에러율 | 앱 로그 5xx 집계 | 급증 시 |
| AI 비용 | llm_usage 일일 집계 |
상한 80% 도달 시 |
| 앱 크래시 | 크래시 리포팅 (S6) | 신규 크래시 |
롤백 절차
D-1(9/15)에 실제로 해봅니다 (PM-40). 리허설 없는 롤백 절차는 문서일 뿐입니다.
1. 판단 PM 단독 결정. 논의로 시간 쓰지 않는다
2. 앱 이전 빌드 유지 (스토어 롤백은 느리니 서버로 대응)
3. 웹 직전 배포로 되돌림 목표 2분
4. API 직전 이미지로 되돌림 목표 3분
5. DB 마이그레이션 downgrade ← 가장 위험. 사전 검증 필수
6. 공지 상태 공지 → 원인 파악은 그 다음
DB 롤백을 피하는 설계
오픈 직전 마이그레이션은 파괴적 변경(컬럼 삭제·이름 변경)을 피합니다. 추가만 하는 마이그레이션은 롤백해도 데이터가 사라지지 않습니다.
오픈 당일 (9/16) 타임라인
| 시각 | 할 일 | 담당 |
|---|---|---|
| 오전 | 최종 점검, 릴리스 체크리스트 재확인 | 전원 |
| 배포 −30분 | 백업 1회 수동 실행 | 류준 |
| 배포 | 마이그레이션 → API → 웹 → 앱 공개 | 류준 |
| 배포 +5분 | 헬스체크 · 핵심 시나리오 완주 | 전원 |
| 배포 +30분 | 에러율·응답시간·AI 비용 확인 | 류준 · 각 담당 |
| +2시간 | 온콜 해제 판단 | 류준 |
기획서 v6 대조
- 예상 트래픽 규모 확인 → 서버 사양 결정
- 개인정보 저장 항목 확인 → 암호화·보관기간 정책
- 외부 연동 서비스 유무 → 추가 시크릿·네트워크 정책
결정 로그
| 날짜 | 결정 | 이유 |
|---|---|---|
| 2026-09-03 | 개발 허브는 GitHub Actions + Jekyll 4 | GitHub Pages 기본 Jekyll 3.10 보다 최신을 쓰고, 로컬과 버전을 맞추기 위해 |
| 2026-09-03 | 프로덕션 배포는 수동 승인 | 자동 배포는 안전하지만, 오픈 주간엔 사람이 한 번 보는 게 낫다 |
| 2026-09-03 | 오픈 직전 파괴적 마이그레이션 금지 | 롤백 시 데이터 손실을 원천 차단 |