version: "3.8" services: # MariaDB 데이터베이스 db: image: mariadb:10.9 container_name: tkfb_db restart: unless-stopped environment: - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} - MYSQL_DATABASE=${MYSQL_DATABASE:-hyungi} - MYSQL_USER=${MYSQL_USER:-hyungi_user} - MYSQL_PASSWORD=${MYSQL_PASSWORD} volumes: - db_data:/var/lib/mysql - ./init-db:/docker-entrypoint-initdb.d ports: - "3306:3306" healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] timeout: 20s retries: 10 networks: - tkfb_network # Node.js API 서버 api: build: context: ./api.hyungi.net dockerfile: Dockerfile container_name: tkfb_api env_file: - ./.env depends_on: db: condition: service_healthy redis: condition: service_started restart: unless-stopped ports: - "3005:3005" environment: - NODE_ENV=production - PORT=3005 - DB_HOST=db - DB_PORT=3306 - DB_USER=${MYSQL_USER:-hyungi_user} - DB_PASSWORD=${MYSQL_PASSWORD} - DB_NAME=${MYSQL_DATABASE:-hyungi} - DB_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} - JWT_SECRET=${JWT_SECRET} - JWT_EXPIRES_IN=${JWT_EXPIRES_IN:-7d} - JWT_REFRESH_SECRET=${JWT_REFRESH_SECRET} - JWT_REFRESH_EXPIRES_IN=${JWT_REFRESH_EXPIRES_IN:-30d} - REDIS_HOST=redis - REDIS_PORT=6379 - WEATHER_API_URL=${WEATHER_API_URL:-} - WEATHER_API_KEY=${WEATHER_API_KEY:-} volumes: - ./api.hyungi.net/uploads:/usr/src/app/uploads - ./api.hyungi.net/logs:/usr/src/app/logs logging: driver: "json-file" options: max-size: "10m" max-file: "3" networks: - tkfb_network # Web UI (Nginx) web: build: context: ./web-ui dockerfile: Dockerfile container_name: tkfb_web restart: unless-stopped ports: - "80:80" volumes: - ./web-ui:/usr/share/nginx/html:ro depends_on: - api networks: - tkfb_network # FastAPI Bridge fastapi: build: context: ./fastapi-bridge dockerfile: Dockerfile container_name: tkfb_fastapi restart: unless-stopped ports: - "8000:8000" environment: - API_BASE_URL=http://api:3005 depends_on: - api networks: - tkfb_network # Redis Cache redis: image: redis:6-alpine container_name: tkfb_redis restart: unless-stopped expose: - "6379" networks: - tkfb_network # Cloudflare Tunnel cloudflared: image: cloudflare/cloudflared:latest container_name: tkfb_cloudflared restart: unless-stopped command: tunnel --no-autoupdate run environment: - TUNNEL_TOKEN=${CLOUDFLARE_TUNNEL_TOKEN} depends_on: - web - api networks: - tkfb_network # phpMyAdmin (선택사항 - 보안상 제거 권장) phpmyadmin: image: phpmyadmin/phpmyadmin:latest container_name: tkfb_phpmyadmin depends_on: - db restart: unless-stopped ports: - "8080:80" environment: - PMA_HOST=db - PMA_USER=root - PMA_PASSWORD=${MYSQL_ROOT_PASSWORD} - UPLOAD_LIMIT=50M networks: - tkfb_network volumes: db_data: driver: local networks: tkfb_network: driver: bridge name: tkfb_network