# ───────────────────────────────────────────────────────────────────────────── # GoldenChart — Docker Compose # 실행: docker compose up --build # 중지: docker compose down # 데이터 완전 삭제: docker compose down -v # ───────────────────────────────────────────────────────────────────────────── networks: goldenchart-net: driver: bridge volumes: mysql-data: driver: local verification-images: driver: local services: # ── MySQL 8.0 ──────────────────────────────────────────────────────────── mysql: image: mysql:8.0 container_name: gc-mysql restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-rootpassword} MYSQL_DATABASE: ${MYSQL_DATABASE:-stockAnalyzer} MYSQL_USER: ${MYSQL_USER:-stock} MYSQL_PASSWORD: ${MYSQL_PASSWORD:-analyzer} ports: - "${MYSQL_PORT:-3306}:3306" volumes: - mysql-data:/var/lib/mysql - ./docker/mysql/init:/docker-entrypoint-initdb.d:ro command: > --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-time-zone=+09:00 --innodb-buffer-pool-size=256M --max-connections=200 --binlog-expire-logs-seconds=86400 healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "${MYSQL_USER:-stock}", "-p${MYSQL_PASSWORD:-analyzer}"] interval: 10s timeout: 5s retries: 10 start_period: 40s networks: - goldenchart-net # ── Spring Boot Backend ────────────────────────────────────────────────── backend: build: context: . dockerfile: backend/Dockerfile container_name: gc-backend restart: unless-stopped depends_on: mysql: condition: service_healthy environment: SPRING_PROFILES_ACTIVE: docker DB_URL: "jdbc:mysql://mysql:3306/${MYSQL_DATABASE:-stockAnalyzer}?useSSL=false&serverTimezone=Asia/Seoul&characterEncoding=UTF-8&allowPublicKeyRetrieval=true&createDatabaseIfNotExist=true" DB_USERNAME: ${MYSQL_USER:-stock} DB_PASSWORD: ${MYSQL_PASSWORD:-analyzer} GC_SECRETS_ENCRYPTION_KEY: ${GC_SECRETS_ENCRYPTION_KEY:-goldenchart-local-dev-key-change-me} GC_VERIFICATION_UPLOAD_DIR: /app/data/verification-images GC_MOBILE_APP_RELEASE_DIR: /app/data/mobile-releases GC_MOBILE_APP_VERSION: ${GC_MOBILE_APP_VERSION:-} GC_MOBILE_APP_PUBLIC_BASE_URL: ${GC_MOBILE_APP_PUBLIC_BASE_URL:-http://exdev.co.kr} FIREBASE_ENABLED: ${FIREBASE_ENABLED:-false} FIREBASE_SERVICE_ACCOUNT: ${FIREBASE_SERVICE_ACCOUNT:-firebase-service-account.json} ports: - "${BACKEND_PORT:-8080}:8080" volumes: - verification-images:/app/data/verification-images - ./data/mobile-releases:/app/data/mobile-releases:ro # FCM: .env 에 FIREBASE_SERVICE_ACCOUNT_PATH=/path/to/firebase-service-account.json 설정 시 주석 해제 # - ${FIREBASE_SERVICE_ACCOUNT_PATH}:/app/firebase-service-account.json:ro healthcheck: test: ["CMD-SHELL", "wget -qO- http://localhost:8080/api/indicators/list || exit 1"] interval: 15s timeout: 5s retries: 5 start_period: 60s networks: - goldenchart-net # ── React Frontend (Nginx) ─────────────────────────────────────────────── frontend: build: context: ./frontend dockerfile: Dockerfile args: VITE_API_BASE_URL: /api container_name: gc-frontend restart: unless-stopped depends_on: backend: condition: service_healthy ports: - "${FRONTEND_PORT:-80}:80" networks: - goldenchart-net