Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
132 commits
Select commit Hold shift + click to select a range
d85e398
[feat/OPS-262] GlobalExceptionHandler 설정 (#8)
Kimgooner Sep 19, 2025
7525119
[feat/OPS-126] Member 도메인 기초 설계 (#9)
Kimgooner Sep 19, 2025
4b39538
[Chore/OPS-264] ci 워크플로우 개선 (#10)
EpicFn Sep 19, 2025
140580f
Update .gitignore to exclude IntelliJ files (#11)
EpicFn Sep 19, 2025
4cd3be6
feat/OPS-134 : ApiV1Controller 작성 완료. (#12)
Kimgooner Sep 19, 2025
b5158ea
[chore/OPS-268] CI 워크플로우 개선 #2 (#15)
Kimgooner Sep 21, 2025
7019bc7
[feat/OPS-155] 소셜 로그인 회원가입 기능 구현(카카오) (#18)
Kimgooner Sep 22, 2025
29d7320
[chore/ops-130] Terraform을 활용해 EC2 인스턴스 생성 및 설정 (#17)
taekkong Sep 22, 2025
f9aba31
fix/OPS-271 : SecurityConfig 및 Jwt 인증 필터 수정 (#19)
Kimgooner Sep 22, 2025
d7e462a
Feat/ops 209 be feat 폴더 생성 (#21)
yonggi1234 Sep 22, 2025
d068067
fix : 컨벤션 통일 (#22)
EpicFn Sep 22, 2025
ce47350
Feat/ops 210 be feat 폴더 삭제 (#23)
yonggi1234 Sep 22, 2025
9aad142
[feat/OPS-151] llm 활용 데이터 정제화 기능 구현 (#27)
ohsoohyuk Sep 22, 2025
a7467ff
[feat/OPS-158] 소셜 로그인 회원가입 기능 구현(구글) (#28)
Kimgooner Sep 22, 2025
4a735c2
feat/OPS-211 : 폴더 이름 변경 구현 (#25)
yonggi1234 Sep 22, 2025
26755d8
[chore/OPS-187] Terraform을 활용해 RDS 인스턴스 생성 및 설정 (#29)
taekkong Sep 23, 2025
1e79e17
[feat] 스페이스 데이터 관리 (#32)
EpicFn Sep 23, 2025
761c7a9
Ops 272 be feat 자료 이름 조회 (#31)
yonggi1234 Sep 23, 2025
e440ab2
feat/OPS-195 : 뉴스 목록 조회 기능 구현(최신 뉴스, 키워드 기반). 서비스 테스트 추가. (#33)
Kimgooner Sep 23, 2025
b169fe8
refactor/OPS-277 : default 폴더 자동 생성 (#34)
yonggi1234 Sep 23, 2025
1821d0a
[chore/OPS-278] Auth, Member, News 도메인 문서화 및 고도화. (#35)
Kimgooner Sep 23, 2025
e7829c1
[Feat/OPS-186] 스페이스 초대 관리 (#38)
EpicFn Sep 23, 2025
44fe25c
refactor/OPS-283 : datasource 엔티티 수정 (#39)
yonggi1234 Sep 23, 2025
c02f053
refactor/OPS-285 : datasource 엔티티 thumbnailUrl 이름 변경 (#40)
yonggi1234 Sep 23, 2025
e02a09e
[feat/OPS-175] 웹 크롤링 데이터 정제화 기능 구현 (#41)
ohsoohyuk Sep 24, 2025
2614be2
[refactor/OPS-287] News 도메인 고도화 (#42)
Kimgooner Sep 24, 2025
ac4597b
Ops 226 be feat 자료 등록 (#44)
yonggi1234 Sep 24, 2025
bec419a
Ops 215 be feat 자료 삭제 (#46)
yonggi1234 Sep 24, 2025
3b25c41
[feat/OPS-293] LiveBlocks를 위한 React-flow 데이터 관리 도메인 설계 완료. 테스트 추가. (#47)
Kimgooner Sep 24, 2025
b4de269
[chore/ops-132] CI/CD 파이프라인 구축 (#43)
taekkong Sep 25, 2025
ced6662
[Feat/OPS-214] 스페이스 멤버 관리 (#50)
EpicFn Sep 25, 2025
94abcdf
refactor/OPS-308 : 도메인 분리 & CI 워크플로우에 application-secrets-server.yml …
Kimgooner Sep 25, 2025
02f6310
Ops 255 be feat 자료 수정 (#54)
yonggi1234 Sep 25, 2025
2edf688
feat/OPS-289 : dataprocessor 서비스 생성 (#59)
ohsoohyuk Sep 25, 2025
d6098e5
fix/OPS-318 : proxy host 스위칭ì‹ ssl 인증서 유지 (#60)
taekkong Sep 25, 2025
0ccb446
[refactor/OPS-310] redirect url 변경 (#53)
Kimgooner Sep 25, 2025
cc849d2
refactor/OPS-255 : datasource 테이블 sources 칼럼 추가 (#64)
yonggi1234 Sep 25, 2025
e053a26
[refactor/OPS-323] News API 조회 로직 수정. (#65)
Kimgooner Sep 25, 2025
caeaa53
refactor/OPS-322 : source 칼럼명 수정 (#68)
yonggi1234 Sep 25, 2025
8654507
feat/OPS-321 : dataProcessorService에서 요약 로직 완성 (#69)
ohsoohyuk Sep 25, 2025
b9d7681
[fix/OPS-317] CI/CD 파이프라인 이벤트 분리 (#66)
taekkong Sep 26, 2025
9fb37c7
chore : 빌드시 aws관련 정보 application-secret.yml에 들어가도록 설정 (#73)
taekkong Sep 26, 2025
9264042
[Feat/OPS-275] 스페이스 썸네일 이미지 저장 (#71)
EpicFn Sep 26, 2025
679e3b8
[feat/OPS-324] 크롬 확장 프로그램 소셜 로그인 분기 & 소셜 로그인 테스트 API 추가. (#70)
Kimgooner Sep 26, 2025
34efe1f
fix : ci 시 secrets 에서 S3 관련 시크릿 값 삭제하도록 변경(버킷명 제외) (#74)
EpicFn Sep 26, 2025
657365b
[feat/OPS-198] 아카이브 정보로 뉴스 목록 조회 (#75)
Kimgooner Sep 26, 2025
79c2b3c
feat/OPS-265 : LLM-활용-데이터-정제화-시-기존-아카이브의-태그-연동 (#77)
ohsoohyuk Sep 26, 2025
cd43e9a
refactor/OPS-319: 아카이브 로그인 연동 (#76)
yonggi1234 Sep 26, 2025
b8e8c6d
fix : SpringDoc과 Spring AI 간 의존성 충돌 해결 (#79)
taekkong Sep 27, 2025
10588d9
[Feat/OPS-327] 자료 등록 llm 연동 (#78)
yonggi1234 Sep 29, 2025
7e27e6d
[feat/OPS-328] 인증/인가 로직 변경 (#80)
Kimgooner Sep 29, 2025
2512ccd
[refactor/OPS-337] 요구사항 반영 및 일부 로직 수정. (#81)
Kimgooner Sep 29, 2025
d6878aa
refactor/OPS-338 : 아카이브 mock 데이터 입력 (#82)
yonggi1234 Sep 29, 2025
2b90a90
[feat/OPS-338] 아카이브 mock 데이터 입력 (#83)
yonggi1234 Sep 29, 2025
8ec5147
[Feat/OPS-326] 대시보드 데이터 저장 체계 구축 (#85)
EpicFn Sep 29, 2025
21834c4
[feat/OPS-329] Sentry를 통한 모니터링 환경 구축. (#86)
Kimgooner Sep 29, 2025
8f8e032
refactor/OPS-353 : 분리 완료. (#87)
Kimgooner Sep 29, 2025
9f8834b
[refactor/OPS-354] 테스트 케이스 사용 프로필 변경. (#88)
Kimgooner Sep 30, 2025
83ccc6d
refactor/OPS-355 : 요구 사항 반영. (#91)
Kimgooner Sep 30, 2025
c7af82d
feat/OPS-358: Redis 의존성 추가 및 RedisConfig 설정 완료. AuthResultData 직렬화 및 …
Kimgooner Sep 30, 2025
23b8a7f
feat/OPS-356 : 네이버 블로그 크롤러 생성 (#93)
ohsoohyuk Sep 30, 2025
389cbf2
[feat/OPS-252] 조건별 자료 검색 (#89)
yonggi1234 Sep 30, 2025
db480d6
fix : 스페이스, 사용자 목록 반환 시 항상 id 오름차순 정렬 (#94)
EpicFn Sep 30, 2025
5bd4ea3
IllegalStateException(동시성 문제)관련 처리 메소드 추가. (#95)
Kimgooner Sep 30, 2025
8a95b61
[fix/OPS-362] 요구 사항 반영 (#96)
Kimgooner Sep 30, 2025
f8ced99
[feat/OPS-341] 벨로그 크롤러 생성 (#90)
taekkong Sep 30, 2025
eead8a4
fix/OPS-362 : 요구사항 반영#3 (#97)
Kimgooner Sep 30, 2025
15b25a9
fix/OPS-362 : 요구사항 반영#4 (#98)
Kimgooner Sep 30, 2025
ed2c450
fix/OPS-362 : 요구사항 반영#5 (#99)
Kimgooner Sep 30, 2025
51648bd
fix/OPS-362 : 요구사항 반영#6 (#100)
Kimgooner Sep 30, 2025
256ad29
[refactor/OPS-360] folder&datasource 리펙토링 (#101)
yonggi1234 Sep 30, 2025
66680ee
fix/OPS-362 : 요구사항 반영#7 (#102)
Kimgooner Sep 30, 2025
cf67de3
fix/OPS-362 : 요구사항 반영#8 (#103)
Kimgooner Sep 30, 2025
709a2af
hotfix/OPS-346 : 파일 조회 수정 (#104)
yonggi1234 Sep 30, 2025
e6b7df9
[feat/OPS-365 ] soft delete + 휴지통 조회 구현 (#105)
yonggi1234 Oct 1, 2025
6939648
chore : rabbitmq 환경설정 (#106)
taekkong Oct 1, 2025
9daa947
[Feat/OPS-344] message queue 구현 (#107)
EpicFn Oct 1, 2025
7fb05c1
[Refactor/OPS-373] 자료 조회 검색 요구사항 수정 (#108)
yonggi1234 Oct 1, 2025
bb0312d
[Feat/OPS-376] 스페이스 목록 참여 인원 반환 api 구성 (#109)
EpicFn Oct 2, 2025
73df3f0
[Refactor/OPS-290] 데이터소스 정제화 기능 고도화 (#112)
ohsoohyuk Oct 2, 2025
0ca66e9
[Feat/OPS-346] 공유 폴더 관리 (#113)
yonggi1234 Oct 2, 2025
4b746a1
feat : 스페이스 목록 조회 시 생성 일자도 반환 (#114)
EpicFn Oct 2, 2025
5159ba4
[feat/OPS-377] 운영/테스트 서버 분리 작업 (#115)
Kimgooner Oct 2, 2025
8c550e4
[Fix/OPS-378] 대시보드 하위 entity 수정 (#117)
EpicFn Oct 2, 2025
7e4f1e8
[Feat/OPS-379] liveblocks 연동 (#118)
EpicFn Oct 2, 2025
68576db
[Feat/OPS-246] 공유 파일 관리 (#119)
yonggi1234 Oct 4, 2025
e909138
[Feat/OPS-388] 다건삭제 DELETE 본문 수정 (#122)
yonggi1234 Oct 4, 2025
0779bb8
Hotfix/스페이스초대목록 반환 시 invite id 포함 (#123)
EpicFn Oct 8, 2025
e30fee8
[Feat/OPS-379] liveblocks 연동 (#124)
EpicFn Oct 10, 2025
c9b30c0
refactor : secrets값 컨테이너 실행시 환경변수로 주입되도록 수정 (#120)
taekkong Oct 10, 2025
2da22d1
[Feat/ops-379] feat liveblocks 연동 (#127)
EpicFn Oct 10, 2025
9601096
fix : 오타 수정 (#128)
EpicFn Oct 10, 2025
4725a91
[Hotfix] 파이프라인 오타 수정 (#129)
EpicFn Oct 10, 2025
02d0bc5
refactor: s3 prefix separation (#131)
taekkong Oct 10, 2025
bfe8f12
refactor: s3 prefix separation (#132)
taekkong Oct 10, 2025
6b99879
[fix/OPS-390] Secret 값 관련 일부 수정 (#126)
Kimgooner Oct 10, 2025
860d3c3
refactor: s3 prefix 분리 및 ci/cd 안정화 (#134)
taekkong Oct 10, 2025
d539dde
[Hotfix] 로그인 에러 수정 (#135)
EpicFn Oct 10, 2025
76d795e
[Feat/OPS-389] 스페이스 초대 알림 구현 (#136)
EpicFn Oct 10, 2025
6686652
[feat/OPS-392] 사용자 검색 기능 추가 (#137)
Kimgooner Oct 10, 2025
10495be
fix: 도메인 요청 사항에 맞게 수정. (#138)
Kimgooner Oct 10, 2025
8d3e9b2
배포용 커밋. (#139)
Kimgooner Oct 10, 2025
c61e827
배포용 커밋 (#140)
Kimgooner Oct 10, 2025
84d5a59
배포용 커밋. (#142)
Kimgooner Oct 10, 2025
19d8874
[Feat/OPS-391] 아카이브 자료 img 자료 형식 수정 (#141)
yonggi1234 Oct 10, 2025
d9b1bab
배포용 커밋. (#143)
Kimgooner Oct 10, 2025
e874b2c
fix: 운영서버 rabbitmq 환경변수 설정 (#144)
taekkong Oct 10, 2025
16e6bf7
feat/OPS-393 : 티스토리 크롤러 생성 (#145)
ohsoohyuk Oct 10, 2025
8c70681
fix/OPS-394: API 문서화 및 s3 오류 수정 #1 (#146)
Kimgooner Oct 11, 2025
132cc93
[fix/OPS-394] 문서화 및 오류 수정 3 (#148)
Kimgooner Oct 11, 2025
e6e05f1
refactor/OPS-395: 검색 로직 수정. (#149)
Kimgooner Oct 11, 2025
f4a3380
fix: 벨로그 크롤러 작성일자 파싱 이슈 해결 (#111)
taekkong Oct 11, 2025
5e68c59
fix : docker 실행시 AWS 환경변수값 제거 (#150)
taekkong Oct 11, 2025
0bf912b
fix: 줄바꿈 문자 뒤 공백 제거 및 OPENAI API Key 운영환경값 분리 (#152)
taekkong Oct 13, 2025
90bf3fe
refactor/OPS-396: n-gram analyzer 적용을 통한 검색 결과 향상 & OAuth2SuccessHand…
Kimgooner Oct 13, 2025
263ce6c
refactor/OPS-398: 인증/인가 오류 수정 (#155)
Kimgooner Oct 13, 2025
769617a
[Refactor/OPS-380] 스페이스 목록 조회 개선 (#156)
EpicFn Oct 13, 2025
5b14c64
Update README.md (#157)
Kimgooner Oct 13, 2025
373484f
Create DEV_GUIDE.md (#158)
Kimgooner Oct 13, 2025
944e92b
Update README.md (#159)
Kimgooner Oct 13, 2025
13bde08
fix/OPS-399: 리프레시 토큰 이슈 수정. (#160)
Kimgooner Oct 13, 2025
0fa75cc
refactor/OPS-397 : 검색 요구사항 반영 (#161)
yonggi1234 Oct 13, 2025
73ef340
hotfix : 스페이스 이미지 저장 로직 수정 (#163)
EpicFn Oct 13, 2025
0051c31
fix/OPS-399: 리프레시 토큰 이슈 수정 #2 (#165)
Kimgooner Oct 13, 2025
ecad3b1
fix : 이미지 경로 및 반환 형식 수정 (#166)
EpicFn Oct 13, 2025
93263ef
fix : Url 수정 (#167)
EpicFn Oct 13, 2025
78e63d4
fix/OPS-400 : 수정&삭제 요구사항 반영 (#169)
yonggi1234 Oct 13, 2025
cdece57
fix: 운영서버/테스트서버 vpc 분리되어 있어, rabbitmq host 도 분리 (#171)
taekkong Oct 13, 2025
2e6dffc
fix : 멤버 삭제 시 유령 스페이스 삭제 로직 구현 (#172)
EpicFn Oct 13, 2025
da8000f
Develop -> main 병합 (#168) (#173)
taekkong Oct 13, 2025
611f6c4
Revert "Develop -> main 병합 (#168) (#173)" (#174)
taekkong Oct 13, 2025
dae7963
[fix/OPS-402] be 쿠키 인증 오류 수정 (#176)
Kimgooner Oct 14, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 0 additions & 52 deletions .github/workflows/ci.yml

This file was deleted.

182 changes: 182 additions & 0 deletions .github/workflows/prod-server.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,182 @@
# 워크플로우 이름
name: Spring CD (Production)

# main 브랜치 PR에서만 실행 (이미 빌드된 Docker 이미지 사용)
on:
push:
branches:
- main
paths:
- 'src/**'
- 'build.gradle*'
- 'settings.gradle*'
- 'gradle/**'
- 'Dockerfile'
- '.github/workflows/**'

jobs:
# ==================================
# CD: Deploy to Production Environment
# ==================================
cd-prod:
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Deploy to Test Environment
uses: appleboy/[email protected]
with:
host: ${{ secrets.PROD_SERVER_HOST }}
username: ec2-user
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |

# GHCR 로그인 (EC2)
echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u "${{github.repository_owner}}" --password-stdin

# 최신 이미지 pull
docker pull ghcr.io/${{ github.repository }}/zoopzoop:latest

# NPM API 설정
NPM_HOST="localhost:81"
NPM_EMAIL="${{secrets.NPM_ADMIN_EMAIL}}"
NPM_PASSWORD="${{secrets.NPM_ADMIN_PASSWORD}}"
PROXY_HOST_ID="${{secrets.NPM_PROXY_HOST_ID}}"

# NPM API 토큰 가져오기
echo "Getting NPM API token..."
TOKEN=$(curl -s -X POST "http://${NPM_HOST}/api/tokens" \
-H "Content-Type: application/json" \
-d "{\"identity\":\"${NPM_EMAIL}\",\"secret\":\"${NPM_PASSWORD}\"}" | \
jq -r '.token')
if [ "$TOKEN" == "null" ] || [ -z "$TOKEN" ]; then
echo "❌ Failed to get NPM API token"
exit 1
fi

# 현재 NPM Proxy Host 설정 확인
echo "📋 Checking current NPM configuration... 📋"
CURRENT_CONFIG=$(curl -s -H "Authorization: Bearer $TOKEN" \
"http://${NPM_HOST}/api/nginx/proxy-hosts/${PROXY_HOST_ID}")

CURRENT_TARGET=$(echo $CURRENT_CONFIG | jq -r '.[0].forward_host // .forward_host')
CURRENT_PORT=$(echo $CURRENT_CONFIG | jq -r '.[0].forward_port // .forward_port')

echo "Current NPM target: $CURRENT_TARGET:$CURRENT_PORT"

# Blue-Green 배포
if [ "$(docker ps -q -f name=zoopzoop-blue)" ]; then
NEW_CONTAINER=zoopzoop-green
OLD_CONTAINER=zoopzoop-blue
NEW_PORT=8082
else
NEW_CONTAINER=zoopzoop-blue
OLD_CONTAINER=zoopzoop-green
NEW_PORT=8081
fi

echo "Starting new container: $NEW_CONTAINER on port $NEW_PORT"
docker run -d --restart unless-stopped \
-p $NEW_PORT:8080 \
--name $NEW_CONTAINER \
--network common \
-e SPRING_PROFILES_ACTIVE=server \
-e SPRING_DATASOURCE_URL="${{secrets.PROD_DB_URL}}" \
-e SPRING_DATASOURCE_USERNAME="${{secrets.PROD_DB_USERNAME}}" \
-e SPRING_DATASOURCE_PASSWORD="${{secrets.PROD_DB_PASSWORD}}" \
-e AWS_S3_BUCKET_NAME="${{secrets.AWS_S3_BUCKET_NAME}}" \
-e AWS_S3_PREFIX="${{secrets.PROD_AWS_S3_PREFIX}}" \
-e SPRING_RABBITMQ_HOST="${{secrets.PROD_RABBITMQ_HOST}}" \
-e SPRING_RABBITMQ_PORT="${{secrets.PROD_RABBITMQ_PORT}}" \
-e SPRING_RABBITMQ_USERNAME="${{secrets.PROD_RABBITMQ_USERNAME}}" \
-e SPRING_RABBITMQ_PASSWORD="${{secrets.PROD_RABBITMQ_PASSWORD}}" \
-e REDIS_HOST="${{secrets.PROD_REDIS_HOST}}" \
-e REDIS_PASSWORD="${{secrets.PROD_REDIS_PASSWORD}}" \
-e KAKAO_CLIENT_ID="${{secrets.OAUTH_KAKAO_CLIENT_ID}}" \
-e GOOGLE_CLIENT_ID="${{secrets.OAUTH_GOOGLE_CLIENT_ID}}" \
-e GOOGLE_CLIENT_SECRET="${{secrets.OAUTH_GOOGLE_CLIENT_SECRET}}" \
-e KAKAO_REDIRECT_URI="${{secrets.PROD_OAUTH_KAKAO_REDIRECT_URI}}" \
-e GOOGLE_REDIRECT_URI="${{secrets.PROD_OAUTH_GOOGLE_REDIRECT_URI}}" \
-e SENTRY_DSN="${{secrets.SENTRY_DSN}}" \
-e OPENAI_API_KEY="${{secrets.PROD_OPENAI_API_KEY}}" \
-e LIVEBLOCKS_SECRET_KEY="${{secrets.LIVEBLOCKS_SECRET_KEY}}" \
-e NAVER_CLIENT_ID="${{secrets.NAVER_CLIENT_ID}}" \
-e NAVER_CLIENT_SECRET="${{secrets.NAVER_CLIENT_SECRET}}" \
-e JWT_SECRET_KEY="${{secrets.JWT_SECRET_KEY}}" \
-e JWT_ACCESS_TOKEN_VALIDITY="${{secrets.JWT_ACCESS_TOKEN_VALIDITY}}" \
-e JWT_REFRESH_TOKEN_VALIDITY="${{secrets.JWT_REFRESH_TOKEN_VALIDITY}}" \
-e FRONT_REDIRECT_DOMAIN="${{secrets.FRONT_REDIRECT_DOMAIN}}" \
-e FRONT_MAIN_DOMAIN="${{secrets.MAIN_DOMAIN}}" \
-e ELASTIC_HOST="${{secrets.PROD_ELASTIC_HOST}}" \
ghcr.io/${{ github.repository }}/zoopzoop:latest


# 헬스체크 (Spring Boot Actuator)
for i in {1..30}; do
if curl -s http://localhost:$NEW_PORT/actuator/health | grep -q '"status":"UP"'; then
echo "✅New container is healthy!"
break
else
echo "Waiting for new container to be healthy..."
sleep 5
fi

if [ $i -eq 30 ]; then
echo "❌ Health check failed. Rolling back..."
docker stop $NEW_CONTAINER || true
docker rm $NEW_CONTAINER || true
exit 1
fi
done

# NPM에서 트래픽 스위칭
echo "🔄 Switching traffic in Nginx Proxy Manager..."
DOMAIN_NAME=$(echo $CURRENT_CONFIG | jq -r '.domain_names[0]')
CERT_ID=$(echo "$CURRENT_CONFIG" | jq -r '.certificate_id')

SWITCH_RESPONSE=$(curl -s -w "%{http_code}" -X PUT "http://${NPM_HOST}/api/nginx/proxy-hosts/${PROXY_HOST_ID}" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d "{
\"domain_names\": [\"$DOMAIN_NAME\"],
\"forward_scheme\": \"http\",
\"forward_host\": \"$NEW_CONTAINER\",
\"forward_port\": 8080,
\"caching_enabled\": false,
\"block_exploits\": true,
\"advanced_config\": \"\",
\"locations\": [],
\"certificate_id\": $CERT_ID,
\"ssl_forced\": 1,
\"hsts_enabled\": 1,
\"hsts_subdomains\": 1
}")

HTTP_CODE=${SWITCH_RESPONSE: -3}
if [ "$HTTP_CODE" -eq 200 ] || [ "$HTTP_CODE" -eq 201 ]; then
echo "✅ Traffic switching completed successfully!"
echo "🎯 NPM now points to: $NEW_CONTAINER:8080"

# 최종 확인
sleep 5
echo "🔍 Final verification..."
VERIFY_CONFIG=$(curl -s -H "Authorization: Bearer $TOKEN" \
"http://${NPM_HOST}/api/nginx/proxy-hosts/${PROXY_HOST_ID}")
VERIFY_TARGET=$(echo $VERIFY_CONFIG | jq -r '.forward_host')
echo "✅ Verified NPM target: $VERIFY_TARGET"

else
echo "❌ Traffic switching failed! HTTP Code: $HTTP_CODE"
echo "Response: ${SWITCH_RESPONSE%???}"
echo "🔄 Rolling back new container..."
docker stop $NEW_CONTAINER || true
docker rm $NEW_CONTAINER || true
exit 1
fi

# 이전 컨테이너 종료 및 제거
echo "Stopping old container: $OLD_CONTAINER"
docker stop $OLD_CONTAINER || true
docker rm $OLD_CONTAINER || true
56 changes: 56 additions & 0 deletions .github/workflows/terraform.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
name: Terraform Apply

on:
workflow_dispatch:

jobs:
terraform-apply:
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v3

- name: Setup Terraform
uses: hashicorp/setup-terraform@v2
with:
terraform_version: 1.7.6

- name: Terraform Init
working-directory: ./infra/terraform #워크플로우 파일 위치 폴더 기준 x, 체크아웃된 저장소 루트 기준
run: terraform init

- name: Set Environment based on Branch
run: |
BRANCH=${{ github.ref_name }}
if [ "$BRANCH" = "develop" ] ; then
ENV="test"
elif [ "$BRANCH" = "main" ] ; then
ENV="prod"
else
echo "Unsupported branch: $BRANCH"
exit 1
fi
echo "Environment: $ENV"

if [ "$ENV" = "prod" ] ; then
echo "${{secrets.TFVARS_PROD}}" > ./infra/terraform/env/terraform.tfvars
else
echo "${{secrets.TFVARS_TEST}}" > ./infra/terraform/env/terraform.tfvars
fi

- name: Select or Create Workspace
working-directory: ./infra/terraform
run: |
if terraform workspace list | grep -q "$ENV"; then
terraform workspace select "$ENV"
else
terraform workspace new "$ENV"
fi

- name: Terraform Apply
working-directory: ./infra/terraform/env
run: terraform apply -auto-approve -var-file="terraform.tfvars"
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
Loading