From 07579ea9f5881cee22697a3cb78e65528055d5da Mon Sep 17 00:00:00 2001 From: jungwoo choi Date: Wed, 22 Oct 2025 09:20:55 +0900 Subject: [PATCH] docs: Add News API deployment guide and SAPIENS services MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add comprehensive deployment guide in CLAUDE.md - Quick deploy commands for News API - Version management strategy (Major/Minor/Patch) - Rollback procedures - Add detailed DEPLOYMENT.md for News API service - Update docker-compose.yml with SAPIENS platform services - Add sapiens-web with PostgreSQL (port 3005, 5433) - Add sapiens-web2 with PostgreSQL (port 3006, 5434) - Configure health checks and dependencies ๐Ÿค– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- CLAUDE.md | 38 ++++++++++ docker-compose.yml | 88 +++++++++++++++++++++ services/news-api/DEPLOYMENT.md | 130 ++++++++++++++++++++++++++++++++ 3 files changed, 256 insertions(+) create mode 100644 services/news-api/DEPLOYMENT.md diff --git a/CLAUDE.md b/CLAUDE.md index 87903be..5cb7c12 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -273,3 +273,41 @@ Services register themselves with Console on startup and send periodic heartbeat - Console validates tokens and forwards to services - Internal service communication uses service tokens - Rate limiting at API Gateway level + +## Deployment Guide + +### News API Deployment +**IMPORTANT**: News API๋Š” Kubernetes์— ๋ฐฐํฌ๋˜๋ฉฐ Docker ์ด๋ฏธ์ง€ ๋ฒ„์ „ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. + +์ƒ์„ธ ๊ฐ€์ด๋“œ: `services/news-api/DEPLOYMENT.md` ์ฐธ์กฐ + +#### Quick Deploy +```bash +# 1. ๋ฒ„์ „ ์„ค์ • +export VERSION=v1.1.0 + +# 2. ๋นŒ๋“œ ๋ฐ ํ‘ธ์‹œ (๋ฒ„์ „ ํƒœ๊ทธ + latest) +cd services/news-api +docker build -t yakenator/news-api:${VERSION} -t yakenator/news-api:latest -f backend/Dockerfile backend +docker push yakenator/news-api:${VERSION} +docker push yakenator/news-api:latest + +# 3. Kubernetes ์žฌ์‹œ์ž‘ +kubectl -n site11-news rollout restart deployment news-api-deployment +kubectl -n site11-news rollout status deployment news-api-deployment +``` + +#### Version Management +- **Major (v2.0.0)**: Breaking changes, API ์ŠคํŽ™ ๋ณ€๊ฒฝ +- **Minor (v1.1.0)**: ์ƒˆ ๊ธฐ๋Šฅ ์ถ”๊ฐ€, ํ•˜์œ„ ํ˜ธํ™˜์„ฑ ์œ ์ง€ +- **Patch (v1.0.1)**: ๋ฒ„๊ทธ ์ˆ˜์ •, ์ž‘์€ ๊ฐœ์„  + +#### Rollback +```bash +# ์ด์ „ ๋ฒ„์ „์œผ๋กœ ๋กค๋ฐฑ +kubectl -n site11-news rollout undo deployment news-api-deployment + +# ํŠน์ • ๋ฒ„์ „์œผ๋กœ ๋กค๋ฐฑ +kubectl -n site11-news set image deployment/news-api-deployment \ + news-api=yakenator/news-api:v1.0.0 +``` diff --git a/docker-compose.yml b/docker-compose.yml index 10ad421..658a872 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -665,6 +665,94 @@ services: networks: - site11_network + # PostgreSQL for SAPIENS + sapiens-postgres: + image: postgres:16-alpine + container_name: ${COMPOSE_PROJECT_NAME}_sapiens_postgres + environment: + - POSTGRES_DB=sapiens_db + - POSTGRES_USER=sapiens_user + - POSTGRES_PASSWORD=sapiens_password + ports: + - "5433:5432" + volumes: + - ./data/sapiens-postgres:/var/lib/postgresql/data + networks: + - site11_network + restart: unless-stopped + healthcheck: + test: ["CMD-SHELL", "pg_isready -U sapiens_user -d sapiens_db"] + interval: 10s + timeout: 5s + retries: 5 + + # SAPIENS Web Platform + sapiens-web: + build: + context: ./services/sapiens-web + dockerfile: Dockerfile + container_name: ${COMPOSE_PROJECT_NAME}_sapiens_web + ports: + - "3005:5000" + environment: + - NODE_ENV=development + - PORT=5000 + - DATABASE_URL=postgresql://sapiens_user:sapiens_password@sapiens-postgres:5432/sapiens_db + - SESSION_SECRET=sapiens_dev_secret_key_change_in_production + volumes: + - ./services/sapiens-web:/app + - /app/node_modules + networks: + - site11_network + restart: unless-stopped + depends_on: + sapiens-postgres: + condition: service_healthy + + # PostgreSQL for SAPIENS Web2 + sapiens-postgres2: + image: postgres:16-alpine + container_name: ${COMPOSE_PROJECT_NAME}_sapiens_postgres2 + environment: + - POSTGRES_DB=sapiens_db2 + - POSTGRES_USER=sapiens_user2 + - POSTGRES_PASSWORD=sapiens_password2 + ports: + - "5434:5432" + volumes: + - ./data/sapiens-postgres2:/var/lib/postgresql/data + networks: + - site11_network + restart: unless-stopped + healthcheck: + test: ["CMD-SHELL", "pg_isready -U sapiens_user2 -d sapiens_db2"] + interval: 10s + timeout: 5s + retries: 5 + + # SAPIENS Web2 Platform + sapiens-web2: + build: + context: ./services/sapiens-web2 + dockerfile: Dockerfile + container_name: ${COMPOSE_PROJECT_NAME}_sapiens_web2 + ports: + - "3006:5000" + environment: + - NODE_ENV=development + - PORT=5000 + - DATABASE_URL=postgresql://sapiens_user2:sapiens_password2@sapiens-postgres2:5432/sapiens_db2 + - SESSION_SECRET=sapiens2_dev_secret_key_change_in_production + volumes: + - ./services/sapiens-web2:/app + - /app/node_modules + networks: + - site11_network + restart: unless-stopped + depends_on: + sapiens-postgres2: + condition: service_healthy + networks: site11_network: diff --git a/services/news-api/DEPLOYMENT.md b/services/news-api/DEPLOYMENT.md new file mode 100644 index 0000000..0edc0c6 --- /dev/null +++ b/services/news-api/DEPLOYMENT.md @@ -0,0 +1,130 @@ +# News API Deployment Guide + +## ๋ฒ„์ „ ๊ด€๋ฆฌ ๊ทœ์น™ + +- **Major ๋ฒ„์ „** (v2.0.0): Breaking changes, API ์ŠคํŽ™ ๋ณ€๊ฒฝ +- **Minor ๋ฒ„์ „** (v1.1.0): ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€, ํ•˜์œ„ ํ˜ธํ™˜์„ฑ ์œ ์ง€ +- **Patch ๋ฒ„์ „** (v1.0.1): ๋ฒ„๊ทธ ์ˆ˜์ •, ์ž‘์€ ๊ฐœ์„  + +## ๋ฐฐํฌ ํ”„๋กœ์„ธ์Šค + +### 1. ๋ฒ„์ „ ๊ฒฐ์ • +```bash +# ํ˜„์žฌ ๋ฒ„์ „ ํ™•์ธ +cd /Users/jungwoochoi/Desktop/prototype/site11 +git tag | grep news-api | tail -5 + +# ๋‹ค์Œ ๋ฒ„์ „ ๊ฒฐ์ • +export VERSION=v1.1.0 # ์ ์ ˆํ•œ ๋ฒ„์ „์œผ๋กœ ๋ณ€๊ฒฝ +``` + +### 2. Docker ์ด๋ฏธ์ง€ ๋นŒ๋“œ ๋ฐ ํ‘ธ์‹œ +```bash +cd /Users/jungwoochoi/Desktop/prototype/site11/services/news-api + +# ๋ฒ„์ „ ํƒœ๊ทธ์™€ latest ํƒœ๊ทธ ๋™์‹œ ์ƒ์„ฑ +docker build -t yakenator/news-api:${VERSION} -t yakenator/news-api:latest -f backend/Dockerfile backend + +# ๋‘ ํƒœ๊ทธ ๋ชจ๋‘ ํ‘ธ์‹œ +docker push yakenator/news-api:${VERSION} +docker push yakenator/news-api:latest +``` + +### 3. Kubernetes ๋ฐฐํฌ +```bash +# ๋ฐฐํฌ ์žฌ์‹œ์ž‘ (latest ํƒœ๊ทธ ์‚ฌ์šฉ ์‹œ) +kubectl -n site11-news rollout restart deployment news-api-deployment + +# ํŠน์ • ๋ฒ„์ „์œผ๋กœ ๋ฐฐํฌ (optional) +kubectl -n site11-news set image deployment/news-api-deployment news-api=yakenator/news-api:${VERSION} + +# ๋กค์•„์›ƒ ์ƒํƒœ ํ™•์ธ +kubectl -n site11-news rollout status deployment news-api-deployment + +# Pod ์ƒํƒœ ํ™•์ธ +kubectl -n site11-news get pods -l app=news-api +``` + +### 4. ๋ฐฐํฌ ๊ฒ€์ฆ +```bash +# Port forward ์„ค์ • +kubectl -n site11-news port-forward svc/news-api-service 8050:8000 & + +# Health check +curl http://localhost:8050/health + +# API ํ…Œ์ŠคํŠธ +curl 'http://localhost:8050/api/v1/ko/articles?page_size=5' +curl 'http://localhost:8050/api/v1/outlets?category=people' +curl 'http://localhost:8050/api/v1/ko/outlets/์˜จ์œ /articles?page_size=5' +``` + +### 5. Git ํƒœ๊ทธ ์ƒ์„ฑ (optional) +```bash +cd /Users/jungwoochoi/Desktop/prototype/site11 + +# ํƒœ๊ทธ ์ƒ์„ฑ +git tag -a news-api-${VERSION} -m "News API ${VERSION}: outlet ๋‹ค๊ตญ์–ด ์ง€์› ๋ฐ ๋™์  ๊ธฐ์‚ฌ ์ฟผ๋ฆฌ" + +# ํƒœ๊ทธ ํ‘ธ์‹œ +git push origin news-api-${VERSION} +``` + +## ๋กค๋ฐฑ ํ”„๋กœ์„ธ์Šค + +### ์ด์ „ ๋ฒ„์ „์œผ๋กœ ๋กค๋ฐฑ +```bash +# ์ด์ „ ๋ฒ„์ „ ํ™•์ธ +kubectl -n site11-news rollout history deployment news-api-deployment + +# ์ด์ „ ๋ฒ„์ „์œผ๋กœ ๋กค๋ฐฑ +kubectl -n site11-news rollout undo deployment news-api-deployment + +# ํŠน์ • ๋ฒ„์ „์œผ๋กœ ๋กค๋ฐฑ +kubectl -n site11-news set image deployment/news-api-deployment news-api=yakenator/news-api:v1.0.0 +``` + +## ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… + +### Docker ๋นŒ๋“œ ์‹คํŒจ +```bash +# Docker daemon ์ƒํƒœ ํ™•์ธ +docker info + +# Docker ์žฌ์‹œ์ž‘ (macOS) +killall Docker && open /Applications/Docker.app +``` + +### Port forward ๋ฌธ์ œ +```bash +# ๊ธฐ์กด port forward ์ข…๋ฃŒ +lsof -ti:8050 | xargs kill -9 2>/dev/null + +# ์ƒˆ๋กœ์šด port forward ์‹œ์ž‘ +kubectl -n site11-news port-forward svc/news-api-service 8050:8000 & +``` + +### Pod ์ƒํƒœ ํ™•์ธ +```bash +# Pod ๋กœ๊ทธ ํ™•์ธ +kubectl -n site11-news logs -f deployment/news-api-deployment + +# Pod ์ƒ์„ธ ์ •๋ณด +kubectl -n site11-news describe pod + +# Pod ์ด๋ฒคํŠธ ํ™•์ธ +kubectl -n site11-news get events --sort-by='.lastTimestamp' +``` + +## ๋ฒ„์ „ ํžˆ์Šคํ† ๋ฆฌ + +### v1.1.0 (2025-10-12) +- Outlet ๋‹ค๊ตญ์–ด ์ง€์› ์ถ”๊ฐ€ (name_translations, description_translations) +- ๋™์  ๊ธฐ์‚ฌ ์ฟผ๋ฆฌ ๊ตฌํ˜„ (entities ํ•„๋“œ ํ™œ์šฉ) +- ์ •์  articles ๋ฐฐ์—ด ์ œ๊ฑฐ, source_keyword ๊ธฐ๋ฐ˜ ๋™์  ์กฐํšŒ๋กœ ๋ณ€๊ฒฝ + +### v1.0.0 (Initial Release) +- ๋‹ค๊ตญ์–ด ๊ธฐ์‚ฌ API (ko, en, zh_cn, zh_tw, ja, fr, de, es, it) +- Outlets ๊ด€๋ฆฌ (people, topics, companies) +- ๋Œ“๊ธ€ ์‹œ์Šคํ…œ +- MongoDB ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ ์ €์žฅ