[INFRA-06] prod override + .env.prod

작업 내용 (설계 의도)

변경 사항

근거 TDD: ../TDD.md “스택 격리”, “env 라벨 주입”, “FR-9”. ADR-004/005. base에 prod 환경 값을 얹는 override와 env 파일을 신설한다. ⑧ 소유 파일. dev override(INFRA-05)와 다른 파일 — 같은 wave 병렬 안전.

  • docker-compose.prod.yml: prod 호스트 포트(backend 18080, minio 19000/19001, mock 19101-19103, mailhog 11025/18025). DB 포트(mysql/mongo/redis/kafka)는 미노출(FR-9: prod 직접 변경 경로 최소화).
  • backend environmentAPP_ENV: prod 리터럴 주입.
  • backend image 태그 핀: sports-backend:${DOCKER_TAG}.env.prodDOCKER_TAG가 배포된 커밋 SHA를 가리킴(롤백 = 이전 SHA로 치환).
  • .env.prod: DOCKER_TAG=<sha>, DB 크리덴셜, 포트 변수.
  • 실행 규약: docker compose -p sports-prod -f docker-compose.yml -f docker-compose.prod.yml up -d.

롤백: rollback.sh prod <prev_sha>.env.prod DOCKER_TAG를 이전 값으로 치환 후 재배포(5분 내, NFR).

의존

  • INFRA-02 (base 서비스명·내부 포트 계약)

다이어그램

클래스 의존

flowchart LR
    Base["docker-compose.yml"] --> Merge["-f 병합"]
    ProdOv["docker-compose.prod.yml"] --> Merge
    EnvProd[".env.prod DOCKER_TAG=sha"] --> Merge
    Merge --> Stack["sports-prod 스택 APP_ENV=prod, DB 미노출"]

테스트 케이스

  • docker compose -p sports-prod -f docker-compose.yml -f docker-compose.prod.yml config가 exit 0이다
  • 기동 후 backend env APP_ENVprod를 반환한다
  • prod는 backend를 18080에 노출하고 DB 포트는 노출하지 않는다(docker port sports-prod-mysql-1 비어있음)
  • backend 이미지가 ${DOCKER_TAG} SHA 태그로 핀된다
  • dev·prod 동시 기동 시 포트·볼륨 충돌이 0건이다