# Site11 - Multi-Language News Platform with Microservices Architecture ## πŸ“‹ λͺ©μ°¨ (Table of Contents) - [κ°œμš” (Overview)](#κ°œμš”-overview) - [μ‹œμŠ€ν…œ μš”κ΅¬μ‚¬ν•­ (System Requirements)](#μ‹œμŠ€ν…œ-μš”κ΅¬μ‚¬ν•­-system-requirements) - [λΉ λ₯Έ μ‹œμž‘ (Quick Start)](#λΉ λ₯Έ-μ‹œμž‘-quick-start) - [상세 μ„€μΉ˜ κ°€μ΄λ“œ (Detailed Installation)](#상세-μ„€μΉ˜-κ°€μ΄λ“œ-detailed-installation) - [μ„œλΉ„μŠ€ ꡬ쑰 (Service Architecture)](#μ„œλΉ„μŠ€-ꡬ쑰-service-architecture) - [μ„œλΉ„μŠ€ 관리 (Service Management)](#μ„œλΉ„μŠ€-관리-service-management) - [ν™˜κ²½ μ„€μ • (Configuration)](#ν™˜κ²½-μ„€μ •-configuration) - [개발 κ°€μ΄λ“œ (Development Guide)](#개발-κ°€μ΄λ“œ-development-guide) - [문제 ν•΄κ²° (Troubleshooting)](#문제-ν•΄κ²°-troubleshooting) - [Git μ €μž₯μ†Œ 관리 (Repository Management)](#git-μ €μž₯μ†Œ-관리-repository-management) ## κ°œμš” (Overview) Site11은 λ‹€κ΅­μ–΄ λ‰΄μŠ€ μ½˜ν…μΈ λ₯Ό μžλ™μœΌλ‘œ μˆ˜μ§‘, λ²ˆμ—­, μƒμ„±ν•˜λŠ” λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ 기반 ν”Œλž«νΌμž…λ‹ˆλ‹€. ### μ£Όμš” κΈ°λŠ₯ - 🌐 8개 μ–Έμ–΄ μžλ™ λ²ˆμ—­ (ν•œκ΅­μ–΄, μ˜μ–΄, 쀑ꡭ어, 일본어, ν”„λž‘μŠ€μ–΄, 독일어, μŠ€νŽ˜μΈμ–΄, μ΄νƒˆλ¦¬μ•„μ–΄) - πŸ“° μ‹€μ‹œκ°„ λ‰΄μŠ€ μˆ˜μ§‘ 및 AI 기반 μ½˜ν…μΈ  생성 - 🎨 μžλ™ 이미지 생성 및 μ΅œμ ν™” - πŸ”„ 비동기 μž‘μ—… 처리 νŒŒμ΄ν”„λΌμΈ - πŸ“Š μ‹€μ‹œκ°„ λͺ¨λ‹ˆν„°λ§ 및 톡계 ## μ‹œμŠ€ν…œ μš”κ΅¬μ‚¬ν•­ (System Requirements) ### ν•„μˆ˜ μš”κ΅¬μ‚¬ν•­ - **Docker**: 20.10.0 이상 - **Docker Compose**: 2.0.0 이상 - **λ©”λͺ¨λ¦¬**: μ΅œμ†Œ 8GB RAM (16GB ꢌμž₯) - **λ””μŠ€ν¬**: μ΅œμ†Œ 50GB μ—¬μœ  곡간 - **OS**: Linux, macOS, Windows with WSL2 ### 포트 μ‚¬μš© ``` - 3000: Console Frontend - 8011: Console Backend (API Gateway) - 8012: Users Backend - 8013: Notifications Backend - 8014: OAuth Backend - 8015: Images Backend - 8016: Google Search Backend - 8017: RSS Feed Backend - 8018: News Aggregator Backend - 8019: AI Writer Backend - 8100: Pipeline Monitor - 8983: Solr Search Engine - 9000: MinIO Object Storage - 9001: MinIO Console - 27017: MongoDB (λ‚΄λΆ€) - 6379: Redis (λ‚΄λΆ€) - 9092: Kafka (λ‚΄λΆ€) - 2181: Zookeeper (λ‚΄λΆ€) ``` ## λΉ λ₯Έ μ‹œμž‘ (Quick Start) ### 1. μ €μž₯μ†Œ 클둠 ```bash # HTTPS git clone http://gitea.yakenator.io/aimond/site11.git # 디렉토리 이동 cd site11 ``` ### 2. ν™˜κ²½ λ³€μˆ˜ μ„€μ • ```bash # .env 파일 생성 cp .env.example .env # ν•„μˆ˜ ν™˜κ²½ λ³€μˆ˜ νŽΈμ§‘ (μ‹€μ œ API ν‚€λ‘œ ꡐ체 ν•„μš”) vim .env # λ‹€μŒ ν•­λͺ©λ“€μ„ μΆ”κ°€: # DEEPL_API_KEY=your-deepl-api-key # OPENAI_API_KEY=your-openai-api-key # CLAUDE_API_KEY=your-claude-api-key # SERP_API_KEY=your-serp-api-key ``` ### 3. 전체 μ‹œμŠ€ν…œ μ‹œμž‘ ```bash # λͺ¨λ“  μ„œλΉ„μŠ€ λΉŒλ“œ 및 μ‹œμž‘ (λ°±κ·ΈλΌμš΄λ“œ) docker-compose up -d --build # μƒνƒœ 확인 docker-compose ps # 둜그 확인 docker-compose logs -f ``` ### 4. μ„œλΉ„μŠ€ 확인 ```bash # Console API ν—¬μŠ€ 체크 curl http://localhost:8011/health # MongoDB μ—°κ²° 확인 docker exec -it site11_mongodb mongosh --eval "db.serverStatus()" # Pipeline λͺ¨λ‹ˆν„° 확인 curl http://localhost:8100/health # Console UI 접속 open http://localhost:3000 ``` ## 상세 μ„€μΉ˜ κ°€μ΄λ“œ (Detailed Installation) ### 단계별 μ„œλΉ„μŠ€ μ‹œμž‘ #### 1단계: 핡심 인프라 ```bash # MongoDB, Redis, Kafka μ‹œμž‘ docker-compose up -d mongodb redis zookeeper kafka # 인프라 μ€€λΉ„ λŒ€κΈ° (μ•½ 30초) sleep 30 # μƒνƒœ 확인 docker-compose ps mongodb redis kafka ``` #### 2단계: 핡심 λ°±μ—”λ“œ μ„œλΉ„μŠ€ ```bash # 핡심 μ„œλΉ„μŠ€ μ‹œμž‘ docker-compose up -d console-backend users-backend \ oauth-backend images-backend files-backend \ statistics-backend search-backend # μ„œλΉ„μŠ€ μƒνƒœ 확인 docker-compose ps | grep backend ``` #### 3단계: Pipeline μ„œλΉ„μŠ€ ```bash # Pipeline μ„œλΉ„μŠ€ μ‹œμž‘ docker-compose up -d pipeline-scheduler pipeline-monitor \ pipeline-rss-collector pipeline-google-search \ pipeline-ai-article-generator pipeline-translator \ pipeline-image-generator pipeline-language-sync # Pipeline λͺ¨λ‹ˆν„° 확인 curl http://localhost:8100/health ``` #### 4단계: λ‰΄μŠ€ 생성 μ„œλΉ„μŠ€ ```bash # λ‰΄μŠ€ κ΄€λ ¨ μ„œλΉ„μŠ€ docker-compose up -d news-aggregator-backend \ ai-writer-backend ai-writer-worker \ google-search-backend rss-feed-backend # AI Writer μƒνƒœ 확인 curl http://localhost:8019/health ``` #### 5단계: ν”„λ‘ νŠΈμ—”λ“œ μ„œλΉ„μŠ€ ```bash # Console ν”„λ‘ νŠΈμ—”λ“œ docker-compose up -d console-frontend # μ›Ή UI 접속 # http://localhost:3000 ``` ## μ„œλΉ„μŠ€ ꡬ쑰 (Service Architecture) ### 핡심 인프라 - **MongoDB**: 데이터 μ €μž₯μ†Œ - **Redis**: μΊμ‹œ 및 μž‘μ—… 큐 - **Kafka**: 이벀트 슀트리밍 - **MinIO**: 이미지/파일 μ €μž₯μ†Œ - **Solr**: 검색 μ—”μ§„ ### Pipeline μ„œλΉ„μŠ€ ``` pipeline-scheduler (8099) β”œβ”€β”€ pipeline-rss-collector # RSS ν”Όλ“œ μˆ˜μ§‘ β”œβ”€β”€ pipeline-google-search # Google 검색 μˆ˜μ§‘ β”œβ”€β”€ pipeline-ai-generator # AI μ½˜ν…μΈ  생성 β”œβ”€β”€ pipeline-translator # λ‹€κ΅­μ–΄ λ²ˆμ—­ └── pipeline-image-generator # 이미지 생성 pipeline-monitor (8100) # μ‹€μ‹œκ°„ λͺ¨λ‹ˆν„°λ§ ``` ### μ½˜ν…μΈ  μ„œλΉ„μŠ€ - **Console** (8011/3000): 관리 μ½˜μ†” - **AI Writer** (8019): AI μ½˜ν…μΈ  생성 - **News Aggregator** (8018): λ‰΄μŠ€ μˆ˜μ§‘ - **Google Search** (8016): 검색 μ„œλΉ„μŠ€ - **RSS Feed** (8017): RSS ν”Όλ“œ μˆ˜μ§‘ ## μ„œλΉ„μŠ€ 관리 (Service Management) ### κ°œλ³„ μ„œλΉ„μŠ€ 관리 ```bash # νŠΉμ • μ„œλΉ„μŠ€λ§Œ μ‹œμž‘ docker-compose up -d [service-name] # νŠΉμ • μ„œλΉ„μŠ€ μž¬μ‹œμž‘ docker-compose restart [service-name] # νŠΉμ • μ„œλΉ„μŠ€ 쀑지 docker-compose stop [service-name] # μ„œλΉ„μŠ€ 둜그 확인 docker-compose logs -f [service-name] # μ„œλΉ„μŠ€ μž¬λΉŒλ“œ docker-compose build [service-name] docker-compose up -d [service-name] ``` ### λ°μ΄ν„°λ² μ΄μŠ€ 관리 ```bash # MongoDB 접속 docker exec -it site11_mongodb mongosh # λ°μ΄ν„°λ² μ΄μŠ€ λͺ©λ‘ show dbs # AI Writer DB μ‚¬μš© use ai_writer_db # μ»¬λ ‰μ…˜ 확인 show collections # 기사 수 확인 db.articles_ko.countDocuments() ``` ### Redis 관리 ```bash # Redis CLI 접속 docker exec -it site11_redis redis-cli # λͺ¨λ“  ν‚€ 확인 KEYS * # 큐 μƒνƒœ 확인 LLEN queue:google_search LLEN queue:ai_generation LLEN queue:translation ``` ## ν™˜κ²½ μ„€μ • (Configuration) ### ν•„μˆ˜ API ν‚€ μ„€μ • ```bash # .env 파일 νŽΈμ§‘ vim .env # ν•„μˆ˜ μ„€μ • DEEPL_API_KEY=your-deepl-api-key # λ²ˆμ—­ API OPENAI_API_KEY=your-openai-api-key # 이미지 생성 CLAUDE_API_KEY=your-claude-api-key # AI μ½˜ν…μΈ  생성 SERP_API_KEY=your-serp-api-key # Google 검색 ``` ### Pipeline μ„€μ • ```bash # services/pipeline/.env 파일 생성 cat > services/pipeline/.env << EOF DEEPL_API_KEY=your-deepl-api-key OPENAI_API_KEY=your-openai-api-key CLAUDE_API_KEY=your-claude-api-key SERP_API_KEY=your-serp-api-key WORKER_COUNT=3 BATCH_SIZE=10 TRANSLATION_DELAY=1.0 EOF ``` ## 개발 κ°€μ΄λ“œ (Development Guide) ### μƒˆ μ„œλΉ„μŠ€ μΆ”κ°€ ```bash # μ„œλΉ„μŠ€ 디렉토리 ꡬ쑰 services/ └── new-service/ β”œβ”€β”€ backend/ β”‚ β”œβ”€β”€ Dockerfile β”‚ β”œβ”€β”€ requirements.txt β”‚ └── main.py └── frontend/ β”œβ”€β”€ Dockerfile β”œβ”€β”€ package.json └── src/ ``` ### 둜컬 개발 ν™˜κ²½ ```bash # λ°±μ—”λ“œ 개발 (Python) cd services/[service-name]/backend python -m venv venv source venv/bin/activate pip install -r requirements.txt python main.py # ν”„λ‘ νŠΈμ—”λ“œ 개발 (React) cd services/[service-name]/frontend npm install npm run dev ``` ### ν…ŒμŠ€νŠΈ μ‹€ν–‰ ```bash # 톡합 ν…ŒμŠ€νŠΈ python test_integration.py # Pipeline ν…ŒμŠ€νŠΈ python services/pipeline/test_pipeline.py # νŠΉμ • μ„œλΉ„μŠ€ ν…ŒμŠ€νŠΈ docker exec -it site11_[service-name] pytest ``` ## 문제 ν•΄κ²° (Troubleshooting) ### μ„œλΉ„μŠ€κ°€ μ‹œμž‘λ˜μ§€ μ•Šμ„ λ•Œ ```bash # 포트 좩돌 확인 lsof -i :8000 # μ»¨ν…Œμ΄λ„ˆ μƒνƒœ 확인 docker ps -a | grep site11 # 였λ₯˜ 둜그 확인 docker-compose logs [service-name] | tail -100 ``` ### MongoDB μ—°κ²° 문제 ```bash # MongoDB μƒνƒœ 확인 docker exec -it site11_mongodb mongosh --eval "db.serverStatus()" # μ—°κ²° ν…ŒμŠ€νŠΈ docker run --rm -it --network site11_network mongo:7.0 mongosh mongodb://mongodb:27017 ``` ### λ©”λͺ¨λ¦¬ λΆ€μ‘± 문제 ```bash # Docker λ¦¬μ†ŒμŠ€ 정리 docker system prune -a # λΆˆν•„μš”ν•œ 이미지 μ‚­μ œ docker image prune -a # μ»¨ν…Œμ΄λ„ˆ 둜그 정리 docker-compose logs --tail=0 --follow ``` ### Pipeline μž‘μ—… λ§‰νž˜ ```bash # Redis 큐 확인 docker exec -it site11_redis redis-cli > LLEN queue:translation > LPOP queue:translation # λ§‰νžŒ μž‘μ—… 제거 # Pipeline μž¬μ‹œμž‘ docker-compose restart pipeline-scheduler pipeline-translator ``` ## Git μ €μž₯μ†Œ 관리 (Repository Management) ### .gitignore μ„€μ • ``` # λŒ€μš©λŸ‰ 파일 μ œμ™Έ backups/ *.archive *.log data/ # 이미지 파일 μ œμ™Έ *.png *.jpg *.jpeg # Node modules μ œμ™Έ node_modules/ **/node_modules/ # ν™˜κ²½ 파일 .env *.env.local ``` ### μ €μž₯μ†Œ 정리 ```bash # Git νžˆμŠ€ν† λ¦¬ 정리 git gc --aggressive --prune=now # λŒ€μš©λŸ‰ 파일 μ°ΎκΈ° find . -size +100M -type f # μΊμ‹œ 정리 git rm -r --cached [file/folder] ``` ## λͺ¨λ‹ˆν„°λ§ (Monitoring) ### Pipeline λͺ¨λ‹ˆν„°λ§ - URL: http://localhost:8100 - μ‹€μ‹œκ°„ 큐 μƒνƒœ 확인 - 처리 톡계 확인 ### 둜그 λͺ¨λ‹ˆν„°λ§ ```bash # 전체 둜그 슀트림 docker-compose logs -f # νŠΉμ • μ„œλΉ„μŠ€ 둜그 docker-compose logs -f pipeline-scheduler # μ—λŸ¬λ§Œ 필터링 docker-compose logs -f 2>&1 | grep ERROR ``` ### μ„±λŠ₯ λͺ¨λ‹ˆν„°λ§ ```bash # μ»¨ν…Œμ΄λ„ˆ λ¦¬μ†ŒμŠ€ μ‚¬μš©λŸ‰ docker stats # MongoDB μ„±λŠ₯ docker exec -it site11_mongodb mongosh --eval "db.serverStatus().opcounters" ``` ## λ°±μ—… 및 볡ꡬ (Backup & Recovery) ### MongoDB λ°±μ—… ```bash # λ°±μ—… 슀크립트 μ‹€ν–‰ ./scripts/backup-mongodb.sh # μˆ˜λ™ λ°±μ—… docker exec -it site11_mongodb mongodump --archive=/data/backup.archive docker cp site11_mongodb:/data/backup.archive ./backups/ ``` ### 전체 μ‹œμŠ€ν…œ λ°±μ—… ```bash # 데이터 디렉토리 λ°±μ—… tar -czf backup-$(date +%Y%m%d).tar.gz data/ # μ„€μ • λ°±μ—… tar -czf config-backup.tar.gz .env docker-compose.yml services/ ``` ## 문의 및 지원 (Support) - **이슈 트래컀**: http://gitea.yakenator.io/aimond/site11/issues - **λ¬Έμ„œ**: `/docs` 디렉토리 μ°Έμ‘° - `PLAN.md`: κ΅¬ν˜„ κ³„νš - `PROGRESS.md`: μ§„ν–‰ 상황 - `ARCHITECTURE.md`: μ‹œμŠ€ν…œ ꡬ쑰 - `PIPELINE_SCHEDULER_GUIDE.md`: Pipeline κ°€μ΄λ“œ ## ν•˜μ΄λΈŒλ¦¬λ“œ 배포 (Hybrid Deployment with K8s) Site11은 Docker Compose와 Kubernetesλ₯Ό ν•¨κ»˜ μ‚¬μš©ν•˜λŠ” ν•˜μ΄λΈŒλ¦¬λ“œ 배포λ₯Ό μ§€μ›ν•©λ‹ˆλ‹€. ### 배포 μ•„ν‚€ν…μ²˜ #### Docker Compose (인프라 및 쀑앙 μ œμ–΄) - **인프라**: MongoDB, Redis, Kafka, Zookeeper - **쀑앙 μ œμ–΄**: Pipeline Scheduler, Pipeline Monitor, Language Sync - **관리 μ½˜μ†”**: Console Backend/Frontend #### Kubernetes (λ¬΄μƒνƒœ μ›Œμ»€) - **데이터 μˆ˜μ§‘**: RSS Collector, Google Search - **처리 μ›Œμ»€**: Translator, AI Article Generator, Image Generator - **μžλ™ μŠ€μΌ€μΌλ§**: HPA(Horizontal Pod Autoscaler) 적용 ### ν•˜μ΄λΈŒλ¦¬λ“œ 배포 μ‹œμž‘ #### 1. Docker 인프라 μ‹œμž‘ ```bash # ν•˜μ΄λΈŒλ¦¬λ“œ 용 docker-compose μ‚¬μš© docker-compose -f docker-compose-hybrid.yml up -d # μƒνƒœ 확인 docker-compose -f docker-compose-hybrid.yml ps # 둜그 확인 docker-compose -f docker-compose-hybrid.yml logs -f pipeline-scheduler ``` #### 2. K8s μ›Œμ»€ 배포 ```bash # K8s λ§€λ‹ˆνŽ˜μŠ€νŠΈ λ””λ ‰ν† λ¦¬λ‘œ 이동 cd k8s/pipeline # API ν‚€ μ„€μ • (configmap.yaml νŽΈμ§‘) vim configmap.yaml # 배포 μ‹€ν–‰ ./deploy.sh # 배포 μƒνƒœ 확인 kubectl -n site11-pipeline get pods kubectl -n site11-pipeline get hpa ``` ### K8s μžλ™ μŠ€μΌ€μΌλ§ μ„€μ • #### HPA (Horizontal Pod Autoscaler) ꡬ성 | μ„œλΉ„μŠ€ | μ΅œμ†Œ Pod | μ΅œλŒ€ Pod | CPU μž„κ³„κ°’ | λ©”λͺ¨λ¦¬ μž„κ³„κ°’ | |--------|---------|---------|------------|-------------| | RSS Collector | 1 | 5 | 70% | 80% | | Google Search | 1 | 5 | 70% | 80% | | Translator | 2 | 10 | 70% | 80% | | AI Generator | 1 | 8 | 70% | 80% | | Image Generator | 1 | 6 | 70% | 80% | #### μŠ€μΌ€μΌλ§ λͺ¨λ‹ˆν„°λ§ ```bash # HPA μƒνƒœ μ‹€μ‹œκ°„ λͺ¨λ‹ˆν„°λ§ kubectl -n site11-pipeline get hpa -w # Pod 수 확인 kubectl -n site11-pipeline get pods -o wide # λ©”νŠΈλ¦­ 상세 정보 kubectl -n site11-pipeline describe hpa pipeline-translator-hpa # μˆ˜λ™ μŠ€μΌ€μΌλ§ (ν•„μš”μ‹œ) kubectl -n site11-pipeline scale deployment pipeline-translator --replicas=5 ``` ### K8s μ›Œμ»€ 관리 #### 둜그 확인 ```bash # νŠΉμ • λ””ν”Œλ‘œμ΄λ¨ΌνŠΈ 둜그 kubectl -n site11-pipeline logs -f deployment/pipeline-translator # λͺ¨λ“  Pod 둜그 kubectl -n site11-pipeline logs -f -l component=processor # μ—λŸ¬λ§Œ 필터링 kubectl -n site11-pipeline logs -f deployment/pipeline-translator | grep ERROR ``` #### μ—…λ°μ΄νŠΈ 및 λ‘€λ°± ```bash # 이미지 μ—…λ°μ΄νŠΈ kubectl -n site11-pipeline set image deployment/pipeline-translator \ translator=site11/pipeline-translator:v2 # 둀아웃 μƒνƒœ 확인 kubectl -n site11-pipeline rollout status deployment/pipeline-translator # λ‘€λ°± (ν•„μš”μ‹œ) kubectl -n site11-pipeline rollout undo deployment/pipeline-translator ``` #### λ¦¬μ†ŒμŠ€ λͺ¨λ‹ˆν„°λ§ ```bash # Pod λ¦¬μ†ŒμŠ€ μ‚¬μš©λŸ‰ kubectl -n site11-pipeline top pods # Node λ¦¬μ†ŒμŠ€ μ‚¬μš©λŸ‰ kubectl top nodes # 상세 λ¦¬μ†ŒμŠ€ 정보 kubectl -n site11-pipeline describe pod ``` ### 문제 ν•΄κ²° (K8s) #### Podκ°€ μ‹œμž‘λ˜μ§€ μ•Šμ„ λ•Œ ```bash # Pod μƒνƒœ 확인 kubectl -n site11-pipeline describe pod # 이벀트 확인 kubectl -n site11-pipeline get events --sort-by='.lastTimestamp' # 이미지 ν’€ 문제 확인 kubectl -n site11-pipeline get pods -o jsonpath='{.items[*].spec.containers[*].image}' ``` #### Redis/MongoDB μ—°κ²° μ‹€νŒ¨ ```bash # Docker 호슀트 λ„€νŠΈμ›Œν¬ 확인 # K8s PodλŠ” host.docker.internal μ‚¬μš© kubectl -n site11-pipeline exec -it -- ping host.docker.internal # μ—°κ²° ν…ŒμŠ€νŠΈ kubectl -n site11-pipeline exec -it -- redis-cli -h host.docker.internal ping ``` #### 전체 정리 ```bash # K8s λ¦¬μ†ŒμŠ€ μ‚­μ œ kubectl delete namespace site11-pipeline # Docker 정리 docker-compose -f docker-compose-hybrid.yml down # λ³Όλ₯¨ 정리 (주의!) docker-compose -f docker-compose-hybrid.yml down -v ``` ## λΌμ΄μ„ μŠ€ (License) Copyright (c) 2024 Site11 Project. All rights reserved.