Skip to content

Commit fc55fdc

Browse files
도플러 주입 방식 변경 (#535)
1 parent d67a09e commit fc55fdc

3 files changed

Lines changed: 66 additions & 130 deletions

File tree

.github/workflows/deploy.yml

Lines changed: 48 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,18 @@ on:
77
paths:
88
- ".github/workflows/**"
99
- "src/**"
10+
- "build.gradle"
11+
- "settings.gradle"
1012
- "build.gradle.kts"
13+
- "settings.gradle.kts"
14+
- "gradle/**"
15+
- "gradlew"
16+
- "gradlew.bat"
1117
- "Dockerfile"
1218
- "docker/**"
1319
branches:
1420
- develop
1521

16-
# 권한 최소화/명시화
1722
permissions:
1823
contents: write
1924
packages: write
@@ -65,8 +70,7 @@ jobs:
6570
- name: set lower case owner name
6671
id: export_owner
6772
run: |
68-
# OWNER_LC="${GITHUB_REPOSITORY_OWNER,,}"
69-
OWNER_LC="chehyeon-kim23" # 본인 아이디를 소문자로 직접 입력
73+
OWNER_LC="chehyeon-kim23"
7074
echo "owner_lc=$OWNER_LC" >> $GITHUB_OUTPUT
7175
7276
- name: export image name
@@ -82,8 +86,7 @@ jobs:
8286
cache-to: type=registry,ref=ghcr.io/${{ steps.export_owner.outputs.owner_lc }}/${{ steps.export_image.outputs.image_name }}:cache,mode=max
8387
tags: |
8488
ghcr.io/${{ steps.export_owner.outputs.owner_lc }}/${{ steps.export_image.outputs.image_name }}:${{ needs.makeTagAndRelease.outputs.tag_name }},
85-
ghcr.io/${{ steps.export_owner.outputs.owner_lc }}/${{ steps.export_image.outputs.image_name }}:latest
86-
89+
ghcr.io/${{ steps.export_owner.outputs.owner_lc }}/${{ steps.export_image.outputs.image_name }}:latest
8790
8891
deploy:
8992
runs-on: ubuntu-latest
@@ -103,37 +106,43 @@ jobs:
103106
104107
- name: AWS SSM Send-Command (Official CLI)
105108
run: |
106-
aws ssm send-command \
107-
--instance-ids "${{ env.INSTANCE_ID }}" \
108-
--document-name "AWS-RunShellScript" \
109-
--comment "Deploy Spring Boot with Prod Profile" \
110-
--parameters '{
111-
"commands": [
112-
"#!/bin/bash",
113-
114-
"export HOME=/root",
115-
"export PATH=$PATH:/usr/local/bin",
116-
117-
118-
"git config --global --add safe.directory /dockerProjects/tt-src/WEB7_9_B2ST_BE",
119-
120-
"cd /dockerProjects/tt-src/WEB7_9_B2ST_BE/ || exit 1",
121-
"git fetch --all",
122-
"git reset --hard origin/develop",
123-
124-
125-
"cd docker/",
126-
"export DOPPLER_TOKEN=\"${{ secrets.DOPPLER_TOKEN }}\"",
127-
"export DOPPLER_PROJECT=tt",
128-
"export DOPPLER_CONFIG=prd",
129-
"echo \"${{ secrets.PERSONAL_ACCESS_TOKEN }}\" | docker login ghcr.io -u ${{ github.actor }} --password-stdin 2>/dev/null",
130-
131-
"doppler run --project \"$DOPPLER_PROJECT\" --config \"$DOPPLER_CONFIG\" -- docker compose pull",
132-
"doppler run --project \"$DOPPLER_PROJECT\" --config \"$DOPPLER_CONFIG\" -- docker compose up -d --force-recreate",
133-
134-
"docker image prune -f",
135-
136-
"docker logout ghcr.io 2>/dev/null"
137-
]
138-
}' \
139-
--region ${{ secrets.AWS_REGION }}
109+
aws ssm send-command \
110+
--instance-ids "${{ env.INSTANCE_ID }}" \
111+
--document-name "AWS-RunShellScript" \
112+
--comment "Deploy Spring Boot (Doppler env_file injection)" \
113+
--parameters '{
114+
"commands": [
115+
"#!/bin/bash",
116+
"set -euo pipefail",
117+
118+
"export HOME=/root",
119+
"export PATH=$PATH:/usr/local/bin",
120+
121+
"git config --global --add safe.directory /dockerProjects/tt-src/WEB7_9_B2ST_BE",
122+
123+
"cd /dockerProjects/tt-src/WEB7_9_B2ST_BE/ || exit 1",
124+
"git fetch --all",
125+
"git reset --hard origin/develop",
126+
127+
"cd docker/",
128+
129+
"export DOPPLER_TOKEN=\"${{ secrets.DOPPLER_TOKEN }}\"",
130+
"export DOPPLER_PROJECT=tt",
131+
"export DOPPLER_CONFIG=prd",
132+
133+
"echo \"${{ secrets.PERSONAL_ACCESS_TOKEN }}\" | docker login ghcr.io -u ${{ github.actor }} --password-stdin 2>/dev/null",
134+
135+
"umask 077",
136+
"doppler secrets download --project \"$DOPPLER_PROJECT\" --config \"$DOPPLER_CONFIG\" --format env --no-file > doppler.env",
137+
"chmod 600 doppler.env",
138+
139+
"docker compose --env-file doppler.env pull",
140+
"docker compose --env-file doppler.env up -d --force-recreate",
141+
142+
"rm -f doppler.env",
143+
144+
"docker image prune -f",
145+
"docker logout ghcr.io 2>/dev/null"
146+
]
147+
}' \
148+
--region ${{ secrets.AWS_REGION }}

Dockerfile

Lines changed: 1 addition & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1 @@
1-
# 1단계: Gradle로 Spring Boot JAR 빌드
2-
FROM gradle:8.10.0-jdk21 AS builder
3-
4-
WORKDIR /app
5-
6-
# Gradle 설정 파일 먼저 복사
7-
COPY build.gradle settings.gradle ./
8-
COPY gradle gradle
9-
COPY gradlew .
10-
RUN chmod +x gradlew
11-
12-
# 종속성 설치 (캐시 활용)
13-
RUN ./gradlew dependencies --no-daemon
14-
15-
# 소스 코드 복사
16-
COPY src src
17-
18-
# 애플리케이션 빌드(테스트 제외)
19-
RUN ./gradlew bootJar --no-daemon -x test
20-
21-
22-
# 2단계: 실행용 이미지
23-
FROM eclipse-temurin:21-jre
24-
25-
WORKDIR /app
26-
27-
# 빌드 결과물 복사
28-
COPY --from=builder /app/build/libs/*.jar app.jar
29-
30-
EXPOSE 8080
31-
32-
# 컨테이너는 env로 주입된 값을 그대로 사용해서 실행
33-
# (SPRING_PROFILES_ACTIVE=prod 는 docker-compose.yml에서 이미 설정 중)
34-
CMD ["java", "-jar", "app.jar"]
1+
Doppler env 전체가 app 컨테이너에 들어가서

docker/docker-compose.yml

Lines changed: 17 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ services:
22
# ==================== PostgreSQL ====================
33
postgres:
44
image: postgres:16-alpine
5-
# container_name: tt_postgres # 운영에서는 제거 권장 (blue/green, preview 배포 시 충돌 방지)
65
restart: always
76
environment:
87
POSTGRES_USER: ${POSTGRES_USER}
@@ -22,11 +21,7 @@ services:
2221
retries: 5
2322

2423
# ==================== Redis Cluster ====================
25-
# Redis Cluster Node 1 (Master)
26-
# container_name 제거 권장: 운영 환경에서는 동일 서버의 여러 인스턴스나 blue/green 배포 시 충돌 방지
27-
# 단, 로컬 개발에서는 편의를 위해 유지 가능
2824
redis-node-1:
29-
# container_name: redis-node-1 # 운영에서는 제거 권장
3025
image: redis:7-alpine
3126
command:
3227
- redis-server
@@ -69,9 +64,7 @@ services:
6964
timeout: 5s
7065
retries: 5
7166

72-
# Redis Cluster Node 2 (Master)
7367
redis-node-2:
74-
# container_name: redis-node-2 # 운영에서는 제거 권장
7568
image: redis:7-alpine
7669
command:
7770
- redis-server
@@ -114,9 +107,7 @@ services:
114107
timeout: 5s
115108
retries: 5
116109

117-
# Redis Cluster Node 3 (Master)
118110
redis-node-3:
119-
# container_name: redis-node-3 # 운영에서는 제거 권장
120111
image: redis:7-alpine
121112
command:
122113
- redis-server
@@ -159,9 +150,7 @@ services:
159150
timeout: 5s
160151
retries: 5
161152

162-
# Redis Cluster Node 4 (Slave)
163153
redis-node-4:
164-
# container_name: redis-node-4 # 운영에서는 제거 권장
165154
image: redis:7-alpine
166155
command:
167156
- redis-server
@@ -204,9 +193,7 @@ services:
204193
timeout: 5s
205194
retries: 5
206195

207-
# Redis Cluster Node 5 (Slave)
208196
redis-node-5:
209-
# container_name: redis-node-5 # 운영에서는 제거 권장
210197
image: redis:7-alpine
211198
command:
212199
- redis-server
@@ -249,9 +236,7 @@ services:
249236
timeout: 5s
250237
retries: 5
251238

252-
# Redis Cluster Node 6 (Slave)
253239
redis-node-6:
254-
# container_name: redis-node-6 # 운영에서는 제거 권장
255240
image: redis:7-alpine
256241
command:
257242
- redis-server
@@ -295,8 +280,6 @@ services:
295280
retries: 5
296281

297282
# ==================== Redis Cluster 초기화 ====================
298-
# Redis Cluster를 자동으로 초기화합니다 (이미 초기화되어 있으면 스킵)
299-
# container_name 제거: 임시 컨테이너이므로 blue/green 배포 등에서 충돌 방지
300283
redis-cluster-init:
301284
image: redis:7-alpine
302285
depends_on:
@@ -319,66 +302,42 @@ services:
319302
command: sh /init-cluster.sh
320303
networks:
321304
- common
322-
restart: "no" # 한 번만 실행 (종료 후 재시작 안 함)
305+
restart: "no"
323306

324307
# ==================== Spring Boot Application ====================
325308
app:
326309
image: ghcr.io/chehyeon-kim23/tt_backend:latest
327-
# container_name: tt_app # 운영에서는 제거 권장 (blue/green, preview 배포 시 충돌 방지)
328310
restart: always
329311
depends_on:
330312
postgres:
331313
condition: service_healthy
332314
redis-cluster-init:
333-
condition: service_completed_successfully # 초기화 완료 대기
315+
condition: service_completed_successfully
334316
ports:
335317
- "8080:8080"
318+
networks:
319+
- common
320+
321+
# (A) Doppler env를 컨테이너에 "통째로" 주입
322+
env_file:
323+
- ./doppler.env
324+
325+
# (B) Doppler에 안 넣었거나, compose에서 강제하고 싶은 값만 여기서 오버라이드
336326
environment:
337327
- SPRING_PROFILES_ACTIVE=prod
338-
- JAVA_TOOL_OPTIONS=-Duser.timezone=Asia/Seoul
339-
- APP_FRONTEND_MY_PAGE_URL=${APP_FRONTEND_MY_PAGE_URL:-https://doncrytt.vercel.app/my-page}
340-
- AWS_S3_BUCKET=${AWS_S3_BUCKET}
341-
- AWS_REGION=${AWS_REGION:-ap-northeast-2}
342-
- POSTGRES_USER=${POSTGRES_USER}
343-
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
344-
- POSTGRES_DB=${POSTGRES_DB}
345328
- POSTGRES_HOST=postgres
346329
- POSTGRES_PORT=${POSTGRES_PORT:-5432}
347-
# Redis Cluster 설정 (로컬호스트 대신 컨테이너 이름 사용 가능)
348-
- REDIS_PASSWORD=${REDIS_PASSWORD}
349330
- REDIS_MODE=cluster
350331
- REDIS_CLUSTER_NODES=redis-node-1:7000,redis-node-2:7001,redis-node-3:7002,redis-node-4:7003,redis-node-5:7004,redis-node-6:7005
351-
# 또는 호스트 머신에서 접근하는 경우:
352-
# - REDIS_CLUSTER_NODES=${REDIS_CLUSTER_NODES:-localhost:7000,localhost:7001,localhost:7002,localhost:7003,localhost:7004,localhost:7005}
353-
- MAIL_HOST=${MAIL_HOST}
354-
- MAIL_PORT=${MAIL_PORT}
355-
- MAIL_USERNAME=${MAIL_USERNAME}
356-
- MAIL_PASSWORD=${MAIL_PASSWORD}
357-
- MAIL_FROM_ADDRESS=${MAIL_FROM_ADDRESS}
358-
- MAIL_FROM_NAME=${MAIL_FROM_NAME}
359-
- JWT_SECRET=${JWT_SECRET}
360-
- JWT_ACCESS_EXPIRATION=${JWT_ACCESS_EXPIRATION}
361-
- JWT_REFRESH_EXPIRATION=${JWT_REFRESH_EXPIRATION}
362-
- KAKAO_CLIENT_ID=${KAKAO_CLIENT_ID}
363-
- KAKAO_CLIENT_SECRET=${KAKAO_CLIENT_SECRET}
364-
- KAKAO_REDIRECT_URI=${KAKAO_REDIRECT_URI}
365-
- KAKAO_TOKEN_URI=${KAKAO_TOKEN_URI}
366-
- KAKAO_USER_INFO_URI=${KAKAO_USER_INFO_URI}
367-
- KAKAO_ISSUER=${KAKAO_ISSUER}
368-
- DDL_AUTO=${DDL_AUTO}
369-
- SLACK_WEBHOOK_URL=${SLACK_WEBHOOK_URL}
370-
command: java -jar app.jar
371-
networks:
372-
- common
332+
373333
healthcheck:
374334
test: [ "CMD-SHELL", "wget --quiet --tries=1 --spider http://localhost:8080/actuator/health || exit 1" ]
375335
interval: 30s
376336
timeout: 10s
377337
retries: 3
378338
start_period: 60s
379-
# ==================== Monitoring Stack ====================
380339

381-
# Prometheus - 메트릭 수집
340+
# ==================== Monitoring Stack ====================
382341
prometheus:
383342
image: prom/prometheus:v3.8.1
384343
restart: unless-stopped
@@ -403,7 +362,7 @@ services:
403362
interval: 30s
404363
timeout: 10s
405364
retries: 3
406-
# Grafana - 대시보드 시각화
365+
407366
grafana:
408367
image: grafana/grafana:12.3.0
409368
restart: unless-stopped
@@ -427,7 +386,7 @@ services:
427386
interval: 30s
428387
timeout: 10s
429388
retries: 3
430-
# Alertmanager - 알림 관리
389+
431390
alertmanager:
432391
image: prom/alertmanager:v0.30.0
433392
restart: unless-stopped
@@ -450,7 +409,7 @@ services:
450409
interval: 30s
451410
timeout: 10s
452411
retries: 3
453-
# Redis Exporter - Redis 메트릭 수집
412+
454413
redis-exporter:
455414
image: oliver006/redis_exporter:v1.80.1
456415
restart: unless-stopped
@@ -469,7 +428,7 @@ services:
469428
interval: 30s
470429
timeout: 10s
471430
retries: 3
472-
# Postgres Exporter - PostgreSQL 메트릭 수집
431+
473432
postgres-exporter:
474433
image: prometheuscommunity/postgres-exporter:v0.15.0
475434
restart: unless-stopped
@@ -487,6 +446,7 @@ services:
487446
interval: 30s
488447
timeout: 10s
489448
retries: 3
449+
490450
networks:
491451
common:
492452
driver: bridge

0 commit comments

Comments
 (0)