services: # PostgreSQL Database postgres: image: postgres:15-alpine container_name: autostock-postgres environment: POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB} volumes: - postgres_data:/var/lib/postgresql/data - ./docker/init-db.sql:/docker-entrypoint-initdb.d/init.sql ports: - "5432:5432" networks: - autostock-network healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER}"] interval: 10s timeout: 5s retries: 5 # Redis Cache redis: image: redis:7-alpine container_name: autostock-redis ports: - "6379:6379" volumes: - redis_data:/data networks: - autostock-network healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 3s retries: 5 # RabbitMQ Message Queue rabbitmq: image: rabbitmq:3-management-alpine container_name: autostock-rabbitmq environment: RABBITMQ_DEFAULT_USER: ${RABBITMQ_DEFAULT_USER} RABBITMQ_DEFAULT_PASS: ${RABBITMQ_DEFAULT_PASS} ports: - "5672:5672" - "15672:15672" volumes: - rabbitmq_data:/var/lib/rabbitmq networks: - autostock-network healthcheck: test: rabbitmq-diagnostics -q ping interval: 30s timeout: 10s retries: 5 # MCP Server mcp-server: build: context: ./mcp-server dockerfile: Dockerfile container_name: autostock-mcp-server environment: - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY} - MCP_SERVER_HOST=${MCP_SERVER_HOST} - MCP_SERVER_PORT=${MCP_SERVER_PORT} - DATABASE_URL=${DATABASE_URL} - REDIS_URL=${REDIS_URL} - LOG_LEVEL=${LOG_LEVEL} ports: - "8001:8001" networks: - autostock-network depends_on: postgres: condition: service_healthy redis: condition: service_healthy restart: unless-stopped # Backend API Server backend: build: context: ./backend dockerfile: Dockerfile container_name: autostock-backend environment: - DATABASE_URL=${DATABASE_URL} - REDIS_URL=${REDIS_URL} - RABBITMQ_URL=${RABBITMQ_URL} - KIS_MODE=${KIS_MODE:-virtual} - KIS_VIRTUAL_APP_KEY=${KIS_VIRTUAL_APP_KEY} - KIS_VIRTUAL_APP_SECRET=${KIS_VIRTUAL_APP_SECRET} - KIS_VIRTUAL_ACCOUNT_NO=${KIS_VIRTUAL_ACCOUNT_NO} - KIS_VIRTUAL_URL=${KIS_VIRTUAL_URL:-https://openapivts.koreainvestment.com:29443} - KIS_REAL_APP_KEY=${KIS_REAL_APP_KEY} - KIS_REAL_APP_SECRET=${KIS_REAL_APP_SECRET} - KIS_REAL_ACCOUNT_NO=${KIS_REAL_ACCOUNT_NO} - KIS_REAL_URL=${KIS_REAL_URL:-https://openapi.koreainvestment.com:9443} - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY} - SECRET_KEY=${SECRET_KEY} - BACKEND_HOST=${BACKEND_HOST} - BACKEND_PORT=${BACKEND_PORT} - MCP_SERVER_URL=http://mcp-server:8001 - NEWS_API_KEY=${NEWS_API_KEY:-} - LOG_LEVEL=${LOG_LEVEL} ports: - "8000:8000" volumes: - ./backend:/app - /app/__pycache__ - ./logs:/logs networks: - autostock-network depends_on: postgres: condition: service_healthy redis: condition: service_healthy rabbitmq: condition: service_healthy mcp-server: condition: service_started restart: unless-stopped # PostgreSQL 자동 백업 (매일 02:00 KST, 7일치 보관) postgres-backup: image: prodrigestivill/postgres-backup-local:15 container_name: autostock-postgres-backup environment: - POSTGRES_HOST=postgres - POSTGRES_DB=${POSTGRES_DB} - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - SCHEDULE=0 8,17 * * * - BACKUP_KEEP_DAYS=7 - BACKUP_KEEP_WEEKS=4 - BACKUP_KEEP_MONTHS=3 - HEALTHCHECK_PORT=8080 volumes: - ./backups:/backups networks: - autostock-network depends_on: postgres: condition: service_healthy restart: unless-stopped # Frontend frontend: build: context: ./frontend dockerfile: Dockerfile args: - VITE_API_URL=${VITE_API_URL} - VITE_WS_URL=${VITE_WS_URL} container_name: autostock-frontend ports: - "3000:80" networks: - autostock-network depends_on: - backend restart: unless-stopped volumes: postgres_data: redis_data: rabbitmq_data: backup_data: networks: autostock-network: driver: bridge