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 ↓
34344. AWS SSM으로 EC2 배포 명령
3535 ↓
36- 5. EC2에서 Doppler로 환경변수 주입
36+ 5. doppler run으로 환경변수 메모리 주입
3737 ↓
38386. 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
1531553. 컨테이너 기본값
156+ → 최종 fallback
154157```
155158
156159### Doppler 환경변수 추가/수정 방법
@@ -214,35 +217,34 @@ git reset --hard origin/develop
214217# 2. Docker 디렉토리로 이동
215218cd docker/
216219
217- # 3. Doppler에서 환경변수 다운로드
220+ # 3. Doppler 환경 설정
218221export DOPPLER_TOKEN=" xxx"
219222export DOPPLER_PROJECT=tt
220223export 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. 정리
239235docker image prune -f
240236docker 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# 배포 디렉토리로 이동
253255cd /dockerProjects/tt-src/WEB7_9_B2ST_BE/docker/
254256
255- # Doppler 환경변수 다운로드
257+ # Doppler 토큰 설정
256258export 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# 상태 확인
271265docker compose ps
272266docker compose logs -f app
273267```
274268
269+ ** 주의** : doppler.env 파일을 직접 생성할 필요가 없습니다!
270+
275271---
276272
277273## 🔄 롤백 절차
@@ -285,7 +281,6 @@ ssh ec2-user@your-ec2-ip
285281cd /dockerProjects/tt-src/WEB7_9_B2ST_BE/docker/
286282
287283# 2. 이전 이미지 태그로 변경
288- # docker-compose.yml에서 직접 수정하거나:
289284export ROLLBACK_VERSION=v1.2.2
290285
291286# 3. 이전 버전 Pull
@@ -295,10 +290,9 @@ docker pull ghcr.io/chehyeon-kim23/tt_backend:$ROLLBACK_VERSION
295290docker 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. 확인
304298docker compose logs -f app
@@ -330,6 +324,9 @@ sudo systemctl status amazon-ssm-agent
330324# Docker 서비스 상태
331325sudo systemctl status docker
332326
327+ # Doppler CLI 설치 확인
328+ doppler --version
329+
333330# 디스크 공간
334331df -h
335332
@@ -345,6 +342,9 @@ docker compose logs app
345342# Doppler CLI 설치 확인
346343doppler --version
347344
345+ # 재설치
346+ (curl -Ls https://cli.doppler.com/install.sh || wget -qO- https://cli.doppler.com/install.sh) | sh
347+
348348# 토큰 테스트
349349export DOPPLER_TOKEN=" your-token"
350350doppler secrets --project tt --config prd
@@ -364,25 +364,32 @@ docker compose ps
364364docker 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/
386393rm -f doppler.env
387394```
388395
@@ -417,7 +424,19 @@ curl http://localhost:8080/actuator/health
417424docker 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# 실시간 로그
423442docker compose logs -f app
@@ -429,7 +448,7 @@ docker compose logs --tail=100 app
429448docker compose logs app | grep ERROR
430449```
431450
432- #### 3 . Grafana 대시보드
451+ #### 4 . Grafana 대시보드
433452```
434453URL: http://your-ec2-ip:3001
435454ID: admin
@@ -443,7 +462,7 @@ PW: (Doppler의 GRAFANA_PASSWORD)
443462- Database Connection Pool
444463- Redis 응답 시간
445464
446- #### 4 . Prometheus 메트릭
465+ #### 5 . Prometheus 메트릭
447466```
448467URL: 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
0 commit comments