# 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 ### 포트 μ‚¬μš© ``` - 80: Nginx (Reverse Proxy) - 8000-8100: λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ λ°±μ—”λ“œ - 3000-3100: ν”„λ‘ νŠΈμ—”λ“œ μ„œλΉ„μŠ€ - 27017: MongoDB - 6379: Redis - 9092: Kafka - 2181: Zookeeper - 9000: MinIO - 8983: Solr ``` ## λΉ λ₯Έ μ‹œμž‘ (Quick Start) ### 1. μ €μž₯μ†Œ 클둠 ```bash # HTTPS git clone http://gitea.yakenator.io/aimond/site11.git # 디렉토리 이동 cd site11 ``` ### 2. ν™˜κ²½ λ³€μˆ˜ μ„€μ • ```bash # .env 파일 생성 cp .env.example .env # ν•„μˆ˜ ν™˜κ²½ λ³€μˆ˜ μ„€μ • echo "COMPOSE_PROJECT_NAME=site11" >> .env echo "DEEPL_API_KEY=your-deepl-api-key" >> .env echo "OPENAI_API_KEY=your-openai-api-key" >> .env ``` ### 3. 전체 μ‹œμŠ€ν…œ μ‹œμž‘ ```bash # λͺ¨λ“  μ„œλΉ„μŠ€ λΉŒλ“œ 및 μ‹œμž‘ (λ°±κ·ΈλΌμš΄λ“œ) docker-compose up -d --build # μƒνƒœ 확인 docker-compose ps # 둜그 확인 docker-compose logs -f ``` ### 4. μ„œλΉ„μŠ€ 확인 ```bash # ν—¬μŠ€ 체크 curl http://localhost:8000/health # MongoDB μ—°κ²° 확인 docker exec -it site11_mongodb mongosh --eval "db.serverStatus()" ``` ## 상세 μ„€μΉ˜ κ°€μ΄λ“œ (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단계: Pipeline μ„œλΉ„μŠ€ ```bash # Pipeline μ„œλΉ„μŠ€ μ‹œμž‘ docker-compose up -d pipeline-scheduler pipeline-monitor \ pipeline-rss-collector pipeline-google-search \ pipeline-ai-generator pipeline-translator \ pipeline-image-generator # Pipeline λͺ¨λ‹ˆν„° 확인 curl http://localhost:8100/status ``` #### 3단계: λ‰΄μŠ€ μ„œλΉ„μŠ€ ```bash # ꡭ가별 λ‰΄μŠ€ μ„œλΉ„μŠ€ docker-compose up -d korea-backend korea-frontend \ usa-backend usa-frontend \ japan-backend japan-frontend \ china-backend china-frontend # κΈ°μ—… λ‰΄μŠ€ μ„œλΉ„μŠ€ docker-compose up -d samsung-backend samsung-frontend \ apple-backend apple-frontend \ google-backend google-frontend ``` #### 4단계: μ•„ν‹°μŠ€νŠΈ μ„œλΉ„μŠ€ ```bash # K-POP μ•„ν‹°μŠ€νŠΈ μ„œλΉ„μŠ€ docker-compose up -d k-culture-backend \ blackpink-backend blackpink-frontend \ ive-backend ive-frontend \ twice-backend twice-frontend ``` ## μ„œλΉ„μŠ€ ꡬ쑰 (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) # μ‹€μ‹œκ°„ λͺ¨λ‹ˆν„°λ§ ``` ### μ½˜ν…μΈ  μ„œλΉ„μŠ€ - **Media Empire** (8200/3200): 톡합 λ‹€κ΅­μ–΄ λ‰΄μŠ€ 포털 - **ꡭ가별 μ„œλΉ„μŠ€**: Korea, USA, Japan, China - **κΈ°μ—… μ„œλΉ„μŠ€**: Samsung, Apple, Google, LG, Musk, WSJ - **μ•„ν‹°μŠ€νŠΈ μ„œλΉ„μŠ€**: K-Culture, Blackpink, IVE, Twice λ“± ## μ„œλΉ„μŠ€ 관리 (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 WORKER_COUNT=3 # μ›Œμ»€ ν”„λ‘œμ„ΈμŠ€ 수 BATCH_SIZE=10 # 배치 처리 크기 TRANSLATION_DELAY=1.0 # λ²ˆμ—­ μ§€μ—° μ‹œκ°„ ``` ## 개발 κ°€μ΄λ“œ (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 κ°€μ΄λ“œ ## λΌμ΄μ„ μŠ€ (License) Copyright (c) 2024 Site11 Project. All rights reserved.