version: "3.8" services: db: image: mariadb:10.9 container_name: db_hyungi_net restart: unless-stopped env_file: - ./.env environment: - MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD} - MYSQL_DATABASE=${DB_NAME} - MYSQL_USER=${DB_USER} - MYSQL_PASSWORD=${DB_PASSWORD} volumes: - db_data:/var/lib/mysql - ./migrations:/docker-entrypoint-initdb.d # SQL 마이그레이션 자동 실행 ports: - "20306:3306" # RULES.md 준수: DB 포트 20306 healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] timeout: 20s retries: 10 api: build: context: . dockerfile: Dockerfile container_name: api_hyungi_net depends_on: db: condition: service_healthy # DB가 준비된 후 시작 redis: condition: service_healthy # Redis가 준비된 후 시작 restart: unless-stopped ports: - "20005:3005" # RULES.md 준수: API 포트 20005 env_file: - ./.env environment: - NODE_ENV=production - REDIS_HOST=redis - REDIS_PORT=6379 volumes: - ./public/img:/usr/src/app/public/img:ro - ./uploads:/usr/src/app/uploads - ./logs:/usr/src/app/logs # 로그 파일 저장 - ./routes:/usr/src/app/routes - ./controllers:/usr/src/app/controllers - ./models:/usr/src/app/models - ./index.js:/usr/src/app/index.js logging: driver: "json-file" options: max-size: "10m" max-file: "3" phpmyadmin: image: phpmyadmin/phpmyadmin:latest container_name: pma_hyungi_net depends_on: - db restart: unless-stopped ports: - "20080:80" # RULES.md 준수: phpMyAdmin 포트 20080 env_file: - ./.env environment: - PMA_HOST=${DB_HOST:-db} - PMA_USER=${DB_ROOT_USER:-root} - PMA_PASSWORD=${DB_ROOT_PASSWORD} - UPLOAD_LIMIT=50M # Redis 캐시 서버 (세션 관리 및 속도 제한용) redis: image: redis:7-alpine container_name: redis_hyungi_net restart: unless-stopped ports: - "20379:6379" # RULES.md 준수: Redis 포트 20379 volumes: - redis_data:/data command: redis-server --appendonly yes healthcheck: test: ["CMD", "redis-cli", "ping"] timeout: 3s retries: 5 networks: - default # Nginx 리버스 프록시 (선택사항 - HTTPS 및 로드밸런싱용) # nginx: # image: nginx:alpine # container_name: nginx_hyungi_net # restart: unless-stopped # ports: # - "80:80" # - "443:443" # volumes: # - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro # - ./nginx/ssl:/etc/nginx/ssl:ro # depends_on: # - api volumes: db_data: driver: local redis_data: driver: local networks: default: name: hyungi_network