Skip to content

Commit 9a8797b

Browse files
Hotfix (#541)
* 배포 md 작성 및 최적화 * 배포 md 작성 및 최적화 * md 수정
1 parent e2488cf commit 9a8797b

2 files changed

Lines changed: 142 additions & 65 deletions

File tree

Deployment guide.md

Lines changed: 139 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
# TT Backend 배포 가이드
22

33
> **최종 수정일**: 2026-01-10
4-
> **작성자**: Chehyeon-Kim
5-
> **버전**: 2.0
4+
> **작성자**: Chehyeon-Kim
5+
> **버전**: 2.1 (doppler run 방식)
66
77
## 📋 목차
88

@@ -33,7 +33,7 @@ GitHub Actions 트리거
3333
3434
4. AWS SSM으로 EC2 배포 명령
3535
36-
5. EC2에서 Doppler로 환경변수 주입
36+
5. doppler run으로 환경변수 메모리 주입
3737
3838
6. Docker Compose로 서비스 재시작
3939
@@ -72,6 +72,7 @@ GitHub Actions 트리거
7272
│ Doppler │
7373
│ - 환경변수 중앙 관리 │
7474
│ - 민감정보 암호화 저장 │
75+
│ - doppler run으로 직접 주입 │
7576
└─────────────────────────────────────────┘
7677
```
7778

@@ -131,26 +132,28 @@ SLACK_WEBHOOK_URL=https://hooks.slack.com/services/xxx
131132

132133
## 🔐 환경 변수 관리
133134

134-
### Doppler 기반 환경변수 전략
135+
### Doppler 기반 환경변수 전략 (doppler run 방식)
135136

136137
#### 장점
137138
**중앙 집중식 관리**: 모든 환경변수를 Doppler에서 관리
138-
**보안**: 암호화된 저장소, 접근 제어
139+
**최고 보안**: 환경변수가 메모리에만 존재, 파일 생성 안함
139140
**버전 관리**: 변경 이력 추적
140141
**환경별 분리**: dev, staging, prod 독립 관리
141-
**서버에 파일 미보관**: doppler.env는 배포 시에만 임시 생성 후 삭제
142+
**파일 불필요**: doppler.env 파일을 생성하지 않음
142143

143-
#### 환경변수 우선순위
144+
#### 환경변수 주입 방식
144145

145146
```
146-
1. Docker Compose의 environment (최우선)
147-
→ 현재: 비어있음 (모두 Doppler로 이관)
147+
1. Doppler 환경변수 (대부분)
148+
→ doppler run 명령어로 메모리에서 직접 주입
149+
→ 파일을 생성하지 않음
148150
149-
2. env_file (doppler.env)
150-
Doppler에서 런타임에 생성
151-
배포 완료 후 shred로 완전 삭제
151+
2. Docker Compose 환경변수 (일부)
152+
POSTGRES_HOST, REDIS_MODE 등 Docker 네트워크 설정
153+
docker-compose.yml의 environment 섹션에 명시
152154
153155
3. 컨테이너 기본값
156+
→ 최종 fallback
154157
```
155158

156159
### Doppler 환경변수 추가/수정 방법
@@ -214,35 +217,34 @@ git reset --hard origin/develop
214217
# 2. Docker 디렉토리로 이동
215218
cd docker/
216219

217-
# 3. Doppler에서 환경변수 다운로드
220+
# 3. Doppler 환경 설정
218221
export DOPPLER_TOKEN="xxx"
219222
export DOPPLER_PROJECT=tt
220223
export DOPPLER_CONFIG=prd
221224

222-
umask 077 # 파일 권한 600으로 생성
223-
doppler secrets download \
224-
--project "$DOPPLER_PROJECT" \
225-
--config "$DOPPLER_CONFIG" \
226-
--format env \
227-
--no-file > doppler.env
225+
# 4. Docker 이미지 Pull (doppler run 사용)
226+
doppler run --project "$DOPPLER_PROJECT" --config "$DOPPLER_CONFIG" -- \
227+
docker compose pull
228228

229-
chmod 600 doppler.env
230-
231-
# 4. Docker 이미지 Pull & 재시작
232-
docker compose --env-file doppler.env pull app
233-
docker compose --env-file doppler.env up -d --force-recreate app
234-
235-
# 5. 민감 파일 완전 삭제 (복구 불가)
236-
shred -vfz -n 3 doppler.env 2>/dev/null || rm -f doppler.env
229+
# 5. 컨테이너 재시작 (doppler run 사용)
230+
# 환경변수가 메모리에서 직접 docker compose로 전달됨
231+
doppler run --project "$DOPPLER_PROJECT" --config "$DOPPLER_CONFIG" -- \
232+
docker compose up -d --force-recreate
237233

238234
# 6. 정리
239235
docker image prune -f
240236
docker logout ghcr.io 2>/dev/null
241237

242238
# 7. 배포 확인
243-
docker compose ps app
239+
docker compose ps
244240
```
245241

242+
**주요 특징**:
243+
- ✅ doppler.env 파일을 생성하지 않음
244+
- ✅ 환경변수가 메모리에만 존재
245+
- ✅ 파일 삭제 로직 불필요
246+
- ✅ 보안 위험 최소화
247+
246248
### 수동 배포 (필요시)
247249

248250
```bash
@@ -252,26 +254,20 @@ ssh ec2-user@your-ec2-ip
252254
# 배포 디렉토리로 이동
253255
cd /dockerProjects/tt-src/WEB7_9_B2ST_BE/docker/
254256

255-
# Doppler 환경변수 다운로드
257+
# Doppler 토큰 설정
256258
export DOPPLER_TOKEN="your-token"
257-
doppler secrets download \
258-
--project tt \
259-
--config prd \
260-
--format env \
261-
--no-file > doppler.env
262-
263-
# 배포 실행
264-
docker compose --env-file doppler.env pull
265-
docker compose --env-file doppler.env up -d --force-recreate
266259

267-
# 민감 파일 삭제
268-
shred -vfz -n 3 doppler.env
260+
# 배포 실행 (파일 생성 없이!)
261+
doppler run --project tt --config prd -- docker compose pull
262+
doppler run --project tt --config prd -- docker compose up -d --force-recreate
269263

270264
# 상태 확인
271265
docker compose ps
272266
docker compose logs -f app
273267
```
274268

269+
**주의**: doppler.env 파일을 직접 생성할 필요가 없습니다!
270+
275271
---
276272

277273
## 🔄 롤백 절차
@@ -285,7 +281,6 @@ ssh ec2-user@your-ec2-ip
285281
cd /dockerProjects/tt-src/WEB7_9_B2ST_BE/docker/
286282

287283
# 2. 이전 이미지 태그로 변경
288-
# docker-compose.yml에서 직접 수정하거나:
289284
export ROLLBACK_VERSION=v1.2.2
290285

291286
# 3. 이전 버전 Pull
@@ -295,10 +290,9 @@ docker pull ghcr.io/chehyeon-kim23/tt_backend:$ROLLBACK_VERSION
295290
docker tag ghcr.io/chehyeon-kim23/tt_backend:$ROLLBACK_VERSION \
296291
ghcr.io/chehyeon-kim23/tt_backend:latest
297292

298-
# 5. 재시작
299-
doppler secrets download --project tt --config prd --format env --no-file > doppler.env
300-
docker compose --env-file doppler.env up -d --force-recreate app
301-
shred -vfz -n 3 doppler.env
293+
# 5. 재시작 (doppler run 사용)
294+
export DOPPLER_TOKEN="your-token"
295+
doppler run --project tt --config prd -- docker compose up -d --force-recreate app
302296

303297
# 6. 확인
304298
docker compose logs -f app
@@ -330,6 +324,9 @@ sudo systemctl status amazon-ssm-agent
330324
# Docker 서비스 상태
331325
sudo systemctl status docker
332326

327+
# Doppler CLI 설치 확인
328+
doppler --version
329+
333330
# 디스크 공간
334331
df -h
335332

@@ -345,6 +342,9 @@ docker compose logs app
345342
# Doppler CLI 설치 확인
346343
doppler --version
347344

345+
# 재설치
346+
(curl -Ls https://cli.doppler.com/install.sh || wget -qO- https://cli.doppler.com/install.sh) | sh
347+
348348
# 토큰 테스트
349349
export DOPPLER_TOKEN="your-token"
350350
doppler secrets --project tt --config prd
@@ -364,25 +364,32 @@ docker compose ps
364364
docker compose logs --tail=100 app
365365

366366
# 헬스체크 확인
367-
docker inspect tt_backend_app | grep -A 10 Health
367+
docker inspect <container_id> | grep -A 10 Health
368+
369+
# 환경변수 확인
370+
docker compose exec app printenv | grep -E "SPRING_PROFILES_ACTIVE|POSTGRES|REDIS"
368371
```
369372

370373
**일반적인 원인**:
371-
- 환경변수 누락
374+
- 환경변수 누락 (Doppler에 등록되지 않음)
372375
- DB 연결 실패
373376
- 포트 충돌
374377
- 메모리 부족
375378

376379
### 문제 4: doppler.env 파일이 남아있어요
377380

378-
**정상 상황**: 배포 완료 후 자동 삭제됨
381+
**이 문제는 발생하지 않습니다!**
379382

380-
**수동 삭제**:
381-
```bash
382-
# 파일 완전 삭제
383-
shred -vfz -n 3 doppler.env
383+
doppler run 방식에서는 doppler.env 파일을 생성하지 않습니다.
384384

385-
# 또는
385+
만약 파일이 있다면:
386+
- 이전 배포 방식의 잔재
387+
- 수동으로 생성한 파일
388+
389+
**해결 방법**:
390+
```bash
391+
# 즉시 삭제
392+
cd /dockerProjects/tt-src/WEB7_9_B2ST_BE/docker/
386393
rm -f doppler.env
387394
```
388395

@@ -417,7 +424,19 @@ curl http://localhost:8080/actuator/health
417424
docker compose ps app
418425
```
419426

420-
#### 2. 로그 확인
427+
#### 2. 환경변수 확인
428+
```bash
429+
# 주요 환경변수 확인
430+
docker compose exec app printenv | grep -E "SPRING_PROFILES_ACTIVE|POSTGRES|REDIS"
431+
432+
# 예상 출력:
433+
# SPRING_PROFILES_ACTIVE=prod
434+
# POSTGRES_HOST=postgres
435+
# POSTGRES_USER=tt_user
436+
# REDIS_MODE=cluster
437+
```
438+
439+
#### 3. 로그 확인
421440
```bash
422441
# 실시간 로그
423442
docker compose logs -f app
@@ -429,7 +448,7 @@ docker compose logs --tail=100 app
429448
docker compose logs app | grep ERROR
430449
```
431450

432-
#### 3. Grafana 대시보드
451+
#### 4. Grafana 대시보드
433452
```
434453
URL: http://your-ec2-ip:3001
435454
ID: admin
@@ -443,7 +462,7 @@ PW: (Doppler의 GRAFANA_PASSWORD)
443462
- Database Connection Pool
444463
- Redis 응답 시간
445464

446-
#### 4. Prometheus 메트릭
465+
#### 5. Prometheus 메트릭
447466
```
448467
URL: http://your-ec2-ip:9090
449468
```
@@ -491,20 +510,22 @@ hikaricp_connections_active
491510
### 배포 후
492511

493512
- [ ] 애플리케이션 헬스체크 통과
513+
- [ ] 환경변수 정상 주입 확인 (`SPRING_PROFILES_ACTIVE=prod`)
494514
- [ ] 주요 API 엔드포인트 테스트
495515
- [ ] 에러 로그 확인
496516
- [ ] Grafana 메트릭 정상 확인
497517
- [ ] Redis Cluster 연결 확인
498518
- [ ] PostgreSQL 연결 확인
499519
- [ ] 모니터링 알림 정상 작동 확인
520+
- [ ] **doppler.env 파일이 없는지 확인** (있으면 안됨!)
500521

501522
---
502523

503524
## 🎯 Best Practices
504525

505526
### 1. 환경변수 관리
506527
- ✅ 모든 민감정보는 Doppler에 보관
507-
-서버에 .env 파일 영구 저장 금지
528+
-**doppler run 방식 사용** (파일 생성 안함)
508529
- ✅ 환경변수 변경 시 Doppler에서만 수정
509530
- ✅ 로컬 개발도 Doppler 사용 권장
510531

@@ -515,13 +536,71 @@ hikaricp_connections_active
515536
- ✅ .dockerignore로 불필요한 파일 제외
516537

517538
### 3. 배포
518-
-Blue-Green 배포 고려 (무중단)
539+
-doppler run으로 환경변수 주입 (가장 안전)
519540
- ✅ 배포 전 백업 확인
520541
- ✅ 모니터링 알림 활성화
521542
- ✅ 롤백 계획 수립
522543

523544
### 4. 보안
524545
- ✅ 최소 권한 원칙 (IAM, Docker)
525-
-민감 파일 shred로 완전 삭제
546+
-**파일을 생성하지 않음** (doppler run)
526547
- ✅ 정기적인 보안 패치
527-
- ✅ 이미지 취약점 스캔 (Trivy)
548+
- ✅ 이미지 취약점 스캔 (Trivy)
549+
550+
---
551+
552+
## 🔄 방식 비교
553+
554+
### doppler run 방식 (현재) ⭐ 추천
555+
```bash
556+
doppler run --project tt --config prd -- docker compose up -d
557+
```
558+
559+
**장점**:
560+
- ✅ 파일을 아예 생성하지 않음 (가장 안전)
561+
- ✅ 환경변수가 메모리에만 존재
562+
- ✅ 파일 삭제 걱정 불필요
563+
- ✅ 코드가 간결
564+
565+
### doppler.env 파일 방식 (이전)
566+
```bash
567+
doppler secrets download > doppler.env
568+
docker compose --env-file doppler.env up -d
569+
shred -vfz -n 3 doppler.env # 삭제 필수!
570+
```
571+
572+
**단점**:
573+
- ⚠️ 임시 파일 생성 (보안 위험)
574+
- ⚠️ 파일 삭제를 잊으면 위험
575+
- ⚠️ 코드가 복잡
576+
577+
---
578+
579+
## 📞 긴급 연락처
580+
581+
### 장애 발생 시
582+
1. **즉시 롤백** (위 롤백 절차 참조)
583+
2. **로그 수집** (`docker compose logs app > incident.log`)
584+
3. **팀 채널 공유** (Slack #tech-alerts)
585+
4. **포스트모템 작성**
586+
587+
### 담당자
588+
- **DevOps Lead**: @devops-lead
589+
- **Backend Lead**: @backend-lead
590+
- **On-call**: Slack #on-call
591+
592+
---
593+
594+
## 📅 변경 이력
595+
596+
| 날짜 | 버전 | 변경 내용 | 작성자 |
597+
|------|------|-----------|--------|
598+
| 2026-01-10 | 2.1 | doppler run 방식으로 변경 (파일 생성 불필요) | Chehyeon-Kim |
599+
| 2026-01-10 | 2.0 | Doppler 통합, 보안 강화, Alpine 이미지 전환 | DevOps |
600+
| 2025-12-15 | 1.5 | 모니터링 스택 추가 (Prometheus, Grafana) | DevOps |
601+
| 2025-11-20 | 1.0 | 최초 배포 프로세스 구축 | DevOps |
602+
603+
---
604+
605+
**마지막 업데이트**: 2026-01-10
606+
**문서 관리자**: Chehyeon-Kim

docker/docker-compose.yml

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -318,12 +318,10 @@ services:
318318
networks:
319319
- common
320320

321-
# Doppler에서 다운로드한 env 파일 주입
322-
env_file:
323-
- ./doppler.env
321+
# 환경변수 주입 방식:
322+
# - Doppler 환경변수: doppler run 명령어로 메모리에서 직접 주입
323+
# - Docker Compose 환경변수: 아래 environment에 명시
324324

325-
# Docker Compose 레벨에서 설정이 필요한 값만 오버라이드
326-
# (나머지는 모두 Doppler의 doppler.env에서 주입됨)
327325
environment:
328326
# Database 호스트 (Docker 네트워크 내부)
329327
- POSTGRES_HOST=postgres

0 commit comments

Comments
 (0)