feat: Add hybrid deployment with Docker and Kubernetes

- Docker Compose for infrastructure (MongoDB, Redis, Kafka, Zookeeper)
- Docker for central control (Scheduler, Monitor, Language Sync)
- K8s for scalable workers (RSS, Google Search, Translator, AI Generator, Image Generator)
- Automatic scaling with HPA (Horizontal Pod Autoscaler)
- Comprehensive deployment scripts and documentation
- Updated README with hybrid deployment guide
This commit is contained in:
jungwoo choi
2025-09-28 21:03:14 +09:00
parent 1ff9afe6f4
commit 46b5135f45
10 changed files with 872 additions and 0 deletions

194
docker-compose-hybrid.yml Normal file
View File

@ -0,0 +1,194 @@
# Docker Compose for Hybrid Deployment (with K8s)
# ================================================
# 이 파일은 K8s와 함께 사용하는 하이브리드 배포용입니다.
# Pipeline 워커들은 K8s로 이동하고, 인프라와 중앙 제어만 Docker에 유지합니다.
version: '3.8'
services:
# ============ Infrastructure Services ============
mongodb:
image: mongo:7.0
container_name: ${COMPOSE_PROJECT_NAME}_mongodb
ports:
- "27017:27017"
volumes:
- ./data/mongodb:/data/db
- ./data/mongodb-config:/data/configdb
environment:
- MONGO_INITDB_DATABASE=site11_db
networks:
- site11_network
restart: unless-stopped
redis:
image: redis:7-alpine
container_name: ${COMPOSE_PROJECT_NAME}_redis
ports:
- "6379:6379"
volumes:
- ./data/redis:/data
command: redis-server --appendonly yes
networks:
- site11_network
restart: unless-stopped
zookeeper:
image: confluentinc/cp-zookeeper:7.5.0
container_name: ${COMPOSE_PROJECT_NAME}_zookeeper
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
volumes:
- ./data/zookeeper/data:/var/lib/zookeeper/data
- ./data/zookeeper/logs:/var/lib/zookeeper/logs
networks:
- site11_network
restart: unless-stopped
kafka:
image: confluentinc/cp-kafka:7.5.0
container_name: ${COMPOSE_PROJECT_NAME}_kafka
depends_on:
- zookeeper
ports:
- "9092:9092"
- "9101:9101"
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
KAFKA_JMX_PORT: 9101
KAFKA_JMX_HOSTNAME: localhost
KAFKA_AUTO_CREATE_TOPICS_ENABLE: 'true'
volumes:
- ./data/kafka:/var/lib/kafka/data
networks:
- site11_network
restart: unless-stopped
# ============ Central Control & Monitoring ============
# Pipeline Scheduler - 중앙 제어 (Docker에 유지)
pipeline-scheduler:
build:
context: ./services/pipeline
dockerfile: scheduler/Dockerfile
container_name: ${COMPOSE_PROJECT_NAME}_pipeline_scheduler
restart: unless-stopped
depends_on:
- redis
- mongodb
environment:
- REDIS_URL=redis://redis:6379
- MONGODB_URL=mongodb://mongodb:27017
- DB_NAME=ai_writer_db
- LOG_LEVEL=INFO
- SCHEDULER_INTERVAL=60
volumes:
- ./services/pipeline/shared:/app/shared:ro
- ./services/pipeline/config:/app/config:ro
networks:
- site11_network
# Pipeline Monitor - 모니터링 대시보드 (Docker에 유지)
pipeline-monitor:
build:
context: ./services/pipeline
dockerfile: monitor/Dockerfile
container_name: ${COMPOSE_PROJECT_NAME}_pipeline_monitor
restart: unless-stopped
depends_on:
- redis
- mongodb
ports:
- "8100:8000"
environment:
- REDIS_URL=redis://redis:6379
- MONGODB_URL=mongodb://mongodb:27017
- DB_NAME=ai_writer_db
- LOG_LEVEL=INFO
volumes:
- ./services/pipeline/shared:/app/shared:ro
networks:
- site11_network
# Pipeline Language Sync - 언어 동기화 (Docker에 유지)
pipeline-language-sync:
build:
context: ./services/pipeline
dockerfile: translator/Dockerfile
container_name: ${COMPOSE_PROJECT_NAME}_pipeline_language_sync
restart: unless-stopped
depends_on:
- redis
- mongodb
env_file:
- ./services/pipeline/.env
environment:
- REDIS_URL=redis://redis:6379
- MONGODB_URL=mongodb://mongodb:27017
- DB_NAME=ai_writer_db
- LOG_LEVEL=INFO
- MODE=sync # sync 모드로 실행
volumes:
- ./services/pipeline/shared:/app/shared:ro
networks:
- site11_network
command: ["python", "language_sync.py"]
# ============ Other Essential Services ============
console-backend:
build:
context: ./console/backend
dockerfile: Dockerfile
container_name: ${COMPOSE_PROJECT_NAME}_console_backend
ports:
- "8011:8000"
environment:
- ENV=${ENV}
- MONGODB_URL=mongodb://mongodb:27017
- REDIS_URL=redis://redis:6379
- USERS_SERVICE_URL=http://users-backend:8000
depends_on:
- mongodb
- redis
networks:
- site11_network
restart: unless-stopped
console-frontend:
build:
context: ./console/frontend
dockerfile: Dockerfile
container_name: ${COMPOSE_PROJECT_NAME}_console_frontend
ports:
- "3000:80"
environment:
- VITE_API_URL=http://localhost:8011
networks:
- site11_network
restart: unless-stopped
networks:
site11_network:
driver: bridge
name: site11_network
# ============ K8s로 이동한 서비스들 ============
# 다음 서비스들은 K8s에서 실행됩니다:
# - pipeline-rss-collector
# - pipeline-google-search
# - pipeline-translator
# - pipeline-ai-article-generator
# - pipeline-image-generator
#
# K8s 배포 방법:
# cd k8s/pipeline
# ./deploy.sh