# ═══════════════════════════════════════════════════════════
# 前后端 Docker Compose 编排示例
# ═══════════════════════════════════════════════════════════
#
# 适用场景：一台服务器上同时部署前端 + 后端 + 数据库/Redis
#
# 用法：
#   1. 将本文件复制到服务器上的部署目录
#   2. 配置 .env 文件（数据库密码等敏感信息）
#   3. 执行: docker-compose up -d
#
# 与 speccore deploy 结合：
#   - speccore 负责 build && push 镜像
#   - 服务器端手动或通过 CI 执行 docker-compose pull && up -d
#   - 也可将 docker-compose 作为 speccore 的 script 部署方式执行
# ═══════════════════════════════════════════════════════════

version: "3.8"

services:
  # ── 前端 ──
  frontend:
    image: ${REGISTRY:-registry.example.com}/my-project/admin-web:${TAG:-staging}
    container_name: admin-web
    restart: unless-stopped
    ports:
      - "80:80"
    networks:
      - app-network
    depends_on:
      - backend
    healthcheck:
      test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost/"]
      interval: 30s
      timeout: 3s
      retries: 3
      start_period: 10s

  # ── 后端 ──
  backend:
    image: ${REGISTRY:-registry.example.com}/my-project/order-service:${TAG:-staging}
    container_name: order-service
    restart: unless-stopped
    ports:
      - "8080:8080"
    environment:
      - SPRING_PROFILES_ACTIVE=${PROFILE:-staging}
      - JAVA_OPTS=-Xms512m -Xmx1024m
      # 数据库连接（建议通过 .env 或 Docker Secrets 注入密码）
      - DB_HOST=mysql
      - DB_PORT=3306
      - DB_NAME=order_db
      - DB_USER=root
      - DB_PASS=${DB_PASSWORD:-secret}
      # Redis 连接
      - REDIS_HOST=redis
      - REDIS_PORT=6379
      - REDIS_PASS=${REDIS_PASSWORD:-}
    networks:
      - app-network
    depends_on:
      mysql:
        condition: service_healthy
      redis:
        condition: service_started
    healthcheck:
      test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8080/actuator/health"]
      interval: 30s
      timeout: 5s
      retries: 5
      start_period: 60s

  # ── MySQL（如需内置数据库，否则删除此段） ──
  mysql:
    image: mysql:8.0
    container_name: mysql
    restart: unless-stopped
    environment:
      - MYSQL_ROOT_PASSWORD=${DB_PASSWORD:-secret}
      - MYSQL_DATABASE=order_db
    ports:
      - "3306:3306"
    volumes:
      - mysql-data:/var/lib/mysql
      # - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    networks:
      - app-network
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 5

  # ── Redis（如需内置缓存，否则删除此段） ──
  redis:
    image: redis:7-alpine
    container_name: redis
    restart: unless-stopped
    command: redis-server --requirepass ${REDIS_PASSWORD:-}
    ports:
      - "6379:6379"
    volumes:
      - redis-data:/data
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

volumes:
  mysql-data:
  redis-data:
