# 로컬 배포 (GitHub CI 우회)

GitHub Actions 결제/한도 문제로 자동 배포가 막혔을 때, 로컬에서 직접 운영/스테이징에 배포하는 스크립트.
**평소엔 GitHub push → CI 가 정상.** 이건 CI 가 막힌 동안의 백업 경로다.

## 무엇을 하나
`deploy-api.sh <env>` = GitHub CI 의 `deployApi` 와 동일:
1. `origin/<env>` 브랜치 최신 받아 worktree 로 빌드 (로컬 미커밋 변경은 안 올라감)
2. Docker 이미지 빌드 → ECR (`insuniverse/<env>/api`) 푸시 (태그 = 커밋 SHA)
3. 현재 task-def 기반으로 이미지만 교체해 새 리비전 등록
4. ECS `insuniverse-<env>` 의 `api` 서비스 롤링 배포 (무중단)

## 준비물
- **AWS 자격증명** — 배포 권한(ECR push / ECS update) 있는 프로파일.
  기본값 `insuniverse-readonly` (이름과 달리 쓰기 권한 있음). 다른 프로파일이면 `AWS_PROFILE=xxx` 로 지정.
- **docker** — 네이티브 `docker` 또는 WSL 의 Docker Desktop `docker.exe` (자동 탐지). 데몬이 떠 있어야 함.
- **aws cli**, **git**, **python3**, **bash**
- 리전 기본 `ap-northeast-2` (`AWS_REGION` 으로 변경 가능)

## 사용
```bash
cd deploy
./deploy-api.sh stg     # 스테이징
./deploy-api.sh prod    # 운영
```
배포할 코드는 **먼저 해당 브랜치(stg/prod)에 push** 되어 있어야 한다.

```
코드 수정 → 커밋 → git push origin <env> → ./deploy-api.sh <env>
```

## 확인
```bash
# 운영
curl -i https://api.insuniverse.com/health     # 200=정상, 503=DB/Redis 이상 (본문에 축별 상태)
# 스테이징
curl -i https://s-api.insuniverse.com/health
```

헬스 경로는 셋이며 용도가 다르다.

| 경로 | 상태코드 | 용도 |
|---|---|---|
| `/live` | 항상 200 | liveness. 프로세스 생존만 본다. **인프라 프로브(ALB·CloudWatch)는 이쪽을 쓴다** — DB 다운은 재시작으로 해결되지 않으므로 태스크를 순환시키면 안 된다 |
| `/health` | 200 / 503 | readiness. DB·Redis 실측. 배포 확인과 상태코드 기반 감시용 |
| `/health/detail` | 항상 200 | 진단용. 판정이 본문에 있어 축별 실패를 구분할 수 있다. 운영 알림 A6 규칙(`ALERT_HEALTH_URL`)이 읽는다 |
ECS 롤아웃 상태:
```bash
AWS_PROFILE=insuniverse-readonly aws ecs describe-services \
  --cluster insuniverse-prod --services api \
  --query "services[0].{run:runningCount,desired:desiredCount,rollout:deployments[0].rolloutState}"
```

## 한계 / TODO
- **api 만 배포한다.** 스케줄러(EventBridge → ECS task-def)는 별도. 스케줄러 코드 변경 시 추가 배포 필요.
  → 다이어트(스케줄러 task-def 를 api 이미지 단일로 통일 + 런타임 `SCHEDULER_TYPE` env)와 함께 스케줄러 루프 추가 예정.
- 빌드 로그: `/tmp/iu-api-build-<env>.log`
