From 8123f758a858387fc039d30ac266939cc6f3158a Mon Sep 17 00:00:00 2001 From: gahusb Date: Mon, 25 May 2026 20:29:34 +0900 Subject: [PATCH] =?UTF-8?q?feat(deploy):=20saju-lab=20=EC=BB=A8=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=84=88=20+=20nginx=20+=205=EC=9C=84=EC=B9=98=20?= =?UTF-8?q?=EB=8F=99=EA=B8=B0=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.yml | 24 ++++++++++++++++++++++++ nginx/default.conf | 15 +++++++++++++++ scripts/deploy-nas.sh | 2 +- scripts/deploy.sh | 8 ++++---- 4 files changed, 44 insertions(+), 5 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 3bb326e..d525e50 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -251,6 +251,30 @@ services: timeout: 5s retries: 3 + saju-lab: + build: + context: ./saju-lab + container_name: saju-lab + restart: unless-stopped + ports: + - "18300:8000" + environment: + - TZ=${TZ:-Asia/Seoul} + - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY:-} + - SAJU_MODEL=${SAJU_MODEL:-claude-sonnet-4-6} + - SAJU_COST_INPUT_PER_M=${SAJU_COST_INPUT_PER_M:-3.0} + - SAJU_COST_OUTPUT_PER_M=${SAJU_COST_OUTPUT_PER_M:-15.0} + - SAJU_TIMEOUT_SEC=${SAJU_TIMEOUT_SEC:-240} + - SAJU_DATA_PATH=/app/data + - CORS_ALLOW_ORIGINS=${CORS_ALLOW_ORIGINS:-http://localhost:3007,http://localhost:8080} + volumes: + - ${RUNTIME_PATH:-.}/data/saju:/app/data + healthcheck: + test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/health')"] + interval: 60s + timeout: 5s + retries: 3 + personal: build: context: ./personal diff --git a/nginx/default.conf b/nginx/default.conf index 2625b04..9715f2d 100644 --- a/nginx/default.conf +++ b/nginx/default.conf @@ -359,6 +359,21 @@ server { proxy_pass http://$tarot_backend$request_uri; } + # saju-lab API + location /api/saju/ { + resolver 127.0.0.11 valid=10s; + set $saju_backend saju-lab:8000; + + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_read_timeout 300s; + proxy_send_timeout 300s; + proxy_connect_timeout 60s; + proxy_pass http://$saju_backend$request_uri; + } + # agent-office API + WebSocket location /api/agent-office/ { resolver 127.0.0.11 valid=10s; diff --git a/scripts/deploy-nas.sh b/scripts/deploy-nas.sh index 3eed2a7..7e91e13 100644 --- a/scripts/deploy-nas.sh +++ b/scripts/deploy-nas.sh @@ -2,7 +2,7 @@ set -euo pipefail # ── 서비스 목록 (한 곳에서만 관리) ── -SERVICES="lotto travel-proxy deployer stock music-lab insta-lab realestate-lab agent-office personal packs-lab video-lab image-lab tarot-lab nginx scripts" +SERVICES="lotto travel-proxy deployer stock music-lab insta-lab realestate-lab agent-office personal packs-lab video-lab image-lab tarot-lab saju-lab nginx scripts" # 1. 자동 감지: Docker 컨테이너 내부인가? if [ -d "/repo" ] && [ -d "/runtime" ]; then diff --git a/scripts/deploy.sh b/scripts/deploy.sh index 1c61254..f07a1ae 100644 --- a/scripts/deploy.sh +++ b/scripts/deploy.sh @@ -15,15 +15,15 @@ flock -n 200 || { echo "Deploy already running, skipping"; exit 0; } # ── 서비스 목록 (한 곳에서만 관리) ── # docker compose 서비스명 (deployer 제외 — 자기 자신을 재빌드하면 스크립트 중단) -BUILD_TARGETS="lotto travel-proxy stock music-lab insta-lab realestate-lab agent-office personal packs-lab video-lab image-lab tarot-lab frontend" +BUILD_TARGETS="lotto travel-proxy stock music-lab insta-lab realestate-lab agent-office personal packs-lab video-lab image-lab tarot-lab saju-lab frontend" # 컨테이너 이름 (고아 정리용 — blog-lab은 폐기 대상으로 정리 리스트에 유지) -CONTAINER_NAMES="lotto stock music-lab insta-lab blog-lab realestate-lab agent-office personal packs-lab travel-proxy video-lab image-lab tarot-lab frontend" +CONTAINER_NAMES="lotto stock music-lab insta-lab blog-lab realestate-lab agent-office personal packs-lab travel-proxy video-lab image-lab tarot-lab saju-lab frontend" # Infra 서비스 (image-based, 영속 데이터 보존을 위해 stop/rm 없이 up만) INFRA_SERVICES="redis" # 헬스체크 대상 -HEALTH_ENDPOINTS="lotto stock travel-proxy music-lab insta-lab realestate-lab agent-office personal packs-lab video-lab image-lab tarot-lab redis" +HEALTH_ENDPOINTS="lotto stock travel-proxy music-lab insta-lab realestate-lab agent-office personal packs-lab video-lab image-lab tarot-lab saju-lab redis" # data 디렉토리 (packs-lab은 별도 media/packs 사용) -DATA_DIRS="music stock insta realestate agent-office personal video image tarot" +DATA_DIRS="music stock insta realestate agent-office personal video image tarot saju" # 1. 자동 감지: Docker 컨테이너 내부인가? if [ -d "/repo" ] && [ -d "/runtime" ]; then