Skip to content

Commit 0f15276

Browse files
authored
v1.2.0 (#405)
v1.2.0을 release 합니다.
2 parents d5375fa + e7313da commit 0f15276

File tree

215 files changed

+13337
-8195
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

215 files changed

+13337
-8195
lines changed

.github/deployments/monitoring/docker-compose.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ services:
1010
volumes:
1111
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro
1212
- prometheus-data:/prometheus
13+
- /opt/prometheus/targets:/etc/prometheus/targets:ro
1314
command:
1415
- '--config.file=/etc/prometheus/prometheus.yml'
1516
- '--storage.tsdb.path=/prometheus'
@@ -86,7 +87,7 @@ services:
8687
- monitoring-network
8788

8889
promtail:
89-
image: grafana/promtail:2.9.0
90+
image: grafana/promtail:3.0.0
9091
container_name: ${CONTAINER_PREFIX:-plum}-promtail
9192
restart: always
9293
volumes:

.github/deployments/monitoring/grafana/provisioning/alerting/rules.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -781,4 +781,4 @@ groups:
781781
labels:
782782
severity: warning
783783
component: logs
784-
isPaused: false
784+
isPaused: false

.github/deployments/monitoring/prometheus/prometheus-dev.yml

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,17 +25,19 @@ scrape_configs:
2525

2626
# 백엔드 서버 시스템 메트릭 (Node Exporter)
2727
- job_name: 'backend-node'
28-
static_configs:
29-
- targets: ['BACKEND_HOST_PLACEHOLDER:9100']
30-
labels:
31-
server: 'plum-dev'
28+
# 오토스케일링 서버 자동 발견
29+
file_sd_configs:
30+
- files:
31+
- '/etc/prometheus/targets/*.json'
32+
refresh_interval: 30s
3233

3334
# 백엔드 애플리케이션 메트릭 (prom-client)
3435
- job_name: 'backend-app'
3536
static_configs:
36-
- targets: ['BACKEND_HOST_PLACEHOLDER:3000']
37+
- targets:
38+
BACKEND_TARGETS_PLACEHOLDER
3739
labels:
38-
server: 'plum-dev'
40+
server: 'plum-backend'
3941
metrics_path: '/metrics'
4042

4143
# Redis 서버 시스템 메트릭 (Node Exporter)

.github/workflows/cd.yml

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,8 @@ jobs:
9494
}
9595
9696
update_env "FE_URL" "${FE_URL}"
97+
update_env "STT_WORKER_URL" "http://localhost:8000"
98+
update_env "LLM_WORKER_KEY" "${{ secrets.LLM_WORKER_KEY }}"
9799
update_env "AWS_S3_REGION" "${AWS_REGION}"
98100
update_env "AWS_S3_ACCESS_KEY" "${AWS_KEY}"
99101
update_env "AWS_S3_SECRET_KEY" "${AWS_SECRET}"
@@ -106,12 +108,17 @@ jobs:
106108
update_env "REDIS_PORT" "${{ secrets.NCP_DEV_REDIS_PORT }}"
107109
update_env "ANNOUNCED_IP" "${{ secrets.NCP_DEV_HOST }}"
108110
update_env "REDIS_PASSWORD" "${REDIS_PASSWORD}"
111+
update_env "SERVER_WS_URL" "wss://${{ secrets.NCP_DEV_DOMAIN }}"
109112
110113
# 기존 컨테이너 중지 및 제거 (포트 충돌 방지)
111114
docker compose -f docker-compose.yml -f docker-compose.develop.yml down || true
112115
113116
docker compose -f docker-compose.yml -f docker-compose.develop.yml pull
114117
docker compose -f docker-compose.yml -f docker-compose.develop.yml up -d
118+
119+
# record 폴더 생성
120+
mkdir -p apps/backend/record
121+
chmod -R 777 apps/backend/record
115122
116123
# 헬스체크 (30초 타임아웃)
117124
echo "헬스체크 중..."
@@ -120,6 +127,14 @@ jobs:
120127
else
121128
echo "⚠️ 헬스체크 타임아웃"
122129
fi
130+
131+
# 헬스체크 (ai-worker 헬스체크 추가 권장)
132+
echo "AI Worker 체크 중..."
133+
if timeout 20 bash -c 'until curl -f http://localhost:8000/docs 2>/dev/null; do sleep 2; done'; then
134+
echo "✅ AI Worker 준비 완료"
135+
else
136+
echo "⚠️ AI Worker 응답 없음 (하지만 진행)"
137+
fi
123138
124139
# 사용하지 않는 이미지 정리
125140
docker image prune -f
@@ -185,6 +200,8 @@ jobs:
185200
}
186201
187202
update_env "FE_URL" "${FE_URL}"
203+
update_env "STT_WORKER_URL" "http://localhost:8000"
204+
update_env "LLM_WORKER_KEY" "${{ secrets.LLM_WORKER_KEY }}"
188205
update_env "AWS_S3_REGION" "${AWS_REGION}"
189206
update_env "AWS_S3_ACCESS_KEY" "${AWS_KEY}"
190207
update_env "AWS_S3_SECRET_KEY" "${AWS_SECRET}"
@@ -197,12 +214,17 @@ jobs:
197214
update_env "REDIS_PORT" "${{ secrets.NCP_PROD_REDIS_PORT }}"
198215
update_env "ANNOUNCED_IP" "${{ secrets.NCP_PROD_HOST }}"
199216
update_env "REDIS_PASSWORD" "${REDIS_PASSWORD}"
217+
update_env "SERVER_WS_URL" "wss://${{ secrets.NCP_PROD_DOMAIN }}"
200218
201219
# 기존 컨테이너 중지 및 제거 (포트 충돌 방지)
202220
docker compose -f docker-compose.yml -f docker-compose.prod.yml down || true
203221
204222
docker compose -f docker-compose.yml -f docker-compose.prod.yml pull
205223
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
224+
225+
# record 폴더 생성
226+
mkdir -p apps/backend/record
227+
chmod -R 777 apps/backend/record
206228
207229
# 헬스체크 (60초 타임아웃, 운영 환경은 더 긴 시간)
208230
echo "헬스체크 중..."
@@ -214,6 +236,14 @@ jobs:
214236
docker logs --tail 50 plum-backend-prod
215237
exit 1
216238
fi
239+
240+
# 헬스체크 (ai-worker 헬스체크 추가 권장)
241+
echo "AI Worker 체크 중..."
242+
if timeout 20 bash -c 'until curl -f http://localhost:8000/docs 2>/dev/null; do sleep 2; done'; then
243+
echo "✅ AI Worker 준비 완료"
244+
else
245+
echo "⚠️ AI Worker 응답 없음 (하지만 진행)"
246+
fi
217247
218248
# 사용하지 않는 이미지 정리
219249
docker image prune -f
@@ -348,7 +378,25 @@ jobs:
348378
cp .github/deployments/monitoring/grafana/provisioning/alerting/policies.yml ./grafana/provisioning/alerting/policies.yml
349379
350380
# Prometheus 설정 파일의 IP 플레이스홀더 치환
351-
sed -i "s/BACKEND_HOST_PLACEHOLDER/${{ secrets.NCP_DEV_HOST }}/g" ./prometheus/prometheus.yml
381+
# 백엔드 애플리케이션 타겟 생성
382+
BACKEND_TARGETS=""
383+
IFS=',' read -ra BACKEND_IPS <<< "${{ secrets.NCP_BACKEND_TARGETS }}"
384+
for ip in "${BACKEND_IPS[@]}"; do
385+
BACKEND_TARGETS="${BACKEND_TARGETS} - '${ip}:3000'\n"
386+
done
387+
# 마지막 개행 제거, 앞에 공백 추가없게
388+
BACKEND_TARGETS=$(echo -e "$BACKEND_TARGETS" | sed '$ s/\\n$//')
389+
390+
# 플레이스홀더를 targets 배열로 치환
391+
awk -v targets="$BACKEND_TARGETS" '
392+
/BACKEND_TARGETS_PLACEHOLDER/ {
393+
print targets
394+
next
395+
}
396+
{ print }
397+
' ./prometheus/prometheus.yml > ./prometheus/prometheus.yml.tmp
398+
mv ./prometheus/prometheus.yml.tmp ./prometheus/prometheus.yml
399+
352400
sed -i "s/REDIS_HOST_PLACEHOLDER/${{ secrets.NCP_DEV_REDIS_HOST }}/g" ./prometheus/prometheus.yml
353401
354402
# 환경 변수 설정
@@ -373,6 +421,30 @@ jobs:
373421
chown -R 472:472 grafana/data
374422
chmod -R 755 prometheus/data loki/data
375423
424+
# Prometheus 타겟 디렉토리 생성 /백엔드 서버 등록 (오토스케일링 - 환경변수로 관리)
425+
mkdir -p /opt/prometheus/targets
426+
427+
# 환경변수에서 IP 목록을 읽어 JSON 생성
428+
IFS=',' read -ra BACKEND_IPS <<< "${{ secrets.NCP_BACKEND_TARGETS }}"
429+
echo "[" > /opt/prometheus/targets/backend.json
430+
for i in "${!BACKEND_IPS[@]}"; do
431+
ip="${BACKEND_IPS[$i]}"
432+
echo " {" >> /opt/prometheus/targets/backend.json
433+
echo " \"targets\": [\"${ip}:9100\"]," >> /opt/prometheus/targets/backend.json
434+
echo " \"labels\": {" >> /opt/prometheus/targets/backend.json
435+
echo " \"server\": \"plum-backend-$((i+1))\"," >> /opt/prometheus/targets/backend.json
436+
echo " \"ip\": \"${ip}\"" >> /opt/prometheus/targets/backend.json
437+
echo " }" >> /opt/prometheus/targets/backend.json
438+
if [ $i -lt $((${#BACKEND_IPS[@]} - 1)) ]; then
439+
echo " }," >> /opt/prometheus/targets/backend.json
440+
else
441+
echo " }" >> /opt/prometheus/targets/backend.json
442+
fi
443+
done
444+
echo "]" >> /opt/prometheus/targets/backend.json
445+
446+
cat /opt/prometheus/targets/backend.json
447+
376448
# 컨테이너 재시작
377449
docker compose pull
378450
docker compose up -d
@@ -529,6 +601,9 @@ jobs:
529601
chown -R 472:472 grafana/data
530602
chmod -R 755 prometheus/data loki/data
531603
604+
# Prometheus 타겟 디렉토리 생성 (오토스케일링 서버 자동 등록용)
605+
mkdir -p /opt/prometheus/targets
606+
532607
docker compose pull
533608
docker compose up -d
534609

.github/workflows/ci.yml

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ jobs:
2727
backend: ${{ steps.filter.outputs.backend }}
2828
frontend: ${{ steps.filter.outputs.frontend }}
2929
shared: ${{ steps.filter.outputs.shared }}
30+
ai-worker: ${{ steps.filter.outputs.ai-worker }}
3031
steps:
3132
- name: 코드 체크아웃
3233
uses: actions/checkout@v4
@@ -40,6 +41,8 @@ jobs:
4041
- 'apps/backend/**'
4142
frontend:
4243
- 'apps/frontend/**'
44+
ai-worker:
45+
- 'apps/ai-worker/**'
4346
shared:
4447
- 'packages/**'
4548
@@ -182,3 +185,45 @@ jobs:
182185
run: pnpm --filter @plum/frontend run test:e2e
183186
env:
184187
CI: true
188+
# STEP 4: AI Worker CI (ai-worker 변경 시에만 실행)
189+
ai-worker-ci:
190+
needs: detect-changes
191+
if: needs.detect-changes.outputs.ai-worker == 'true'
192+
runs-on: ubuntu-latest
193+
194+
steps:
195+
- name: 코드 체크아웃
196+
uses: actions/checkout@v4
197+
198+
# Docker Hub 로그인 및 Buildx 설정
199+
- name: Docker Buildx 설정
200+
if: github.event_name == 'push'
201+
uses: docker/setup-buildx-action@v3
202+
203+
- name: Docker Hub 로그인
204+
if: github.event_name == 'push'
205+
uses: docker/login-action@v3
206+
with:
207+
username: ${{ secrets.DOCKER_USERNAME }}
208+
password: ${{ secrets.DOCKER_PASSWORD }}
209+
210+
- name: 이미지 태그 설정
211+
if: github.event_name == 'push'
212+
id: tags
213+
run: |
214+
if [ "${{ github.ref_name }}" == "main" ]; then
215+
echo "TAG=latest" >> $GITHUB_OUTPUT
216+
else
217+
echo "TAG=staging" >> $GITHUB_OUTPUT
218+
fi
219+
220+
- name: AI Worker Docker 이미지 빌드 및 푸시
221+
if: github.event_name == 'push'
222+
uses: docker/build-push-action@v5
223+
with:
224+
context: .
225+
file: ./apps/ai-worker/Dockerfile
226+
push: true
227+
tags: ${{ secrets.DOCKER_USERNAME }}/plum-ai-worker:${{ steps.tags.outputs.TAG }}
228+
cache-from: type=registry,ref=${{ secrets.DOCKER_USERNAME }}/plum-ai-worker:buildcache
229+
cache-to: type=registry,ref=${{ secrets.DOCKER_USERNAME }}/plum-ai-worker:buildcache,mode=max

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,7 @@ apps/load-test/bundle-*.js
3737
.codex
3838
.gemini
3939
CLAUDE.md
40+
41+
# audio records
42+
record
43+
__pycache__

0 commit comments

Comments
 (0)