# 资金服务平台 - Docker Compose 编排配置 # 版本: 1.0 version: '3.8' services: # ==================== 基础设施服务 ==================== # MySQL 数据库 mysql: image: mysql:8.0 container_name: fund-mysql restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root123} MYSQL_DATABASE: fund_platform TZ: Asia/Shanghai ports: - "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-authentication-plugin=mysql_native_password healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] interval: 10s timeout: 5s retries: 5 networks: - fund-network # Redis 缓存 redis: image: redis:7-alpine container_name: fund-redis restart: unless-stopped ports: - "6379:6379" volumes: - redis_data:/data command: redis-server --appendonly yes healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 networks: - fund-network # Nacos 注册中心 & 配置中心 nacos: image: nacos/nacos-server:v3.0.0 container_name: fund-nacos restart: unless-stopped environment: MODE: standalone SPRING_DATASOURCE_PLATFORM: mysql MYSQL_SERVICE_HOST: mysql MYSQL_SERVICE_PORT: 3306 MYSQL_SERVICE_DB_NAME: nacos_config MYSQL_SERVICE_USER: root MYSQL_SERVICE_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root123} NACOS_AUTH_TOKEN: SecretKey012345678901234567890123456789012345678901234567890123456789 NACOS_AUTH_IDENTITY_KEY: serverIdentity NACOS_AUTH_IDENTITY_VALUE: security ports: - "8848:8848" - "9848:9848" - "9849:9849" volumes: - nacos_data:/home/nacos/logs depends_on: mysql: condition: service_healthy healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8848/nacos/v1/console/health/readiness"] interval: 30s timeout: 10s retries: 10 start_period: 60s networks: - fund-network # ==================== 监控服务 ==================== # Prometheus 监控 prometheus: image: prom/prometheus:v2.48.0 container_name: fund-prometheus restart: unless-stopped ports: - "9090:9090" volumes: - ./docker/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro - ./docker/prometheus/rules:/etc/prometheus/rules:ro - prometheus_data:/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--storage.tsdb.retention.time=15d' - '--web.enable-lifecycle' networks: - fund-network # Grafana 可视化 grafana: image: grafana/grafana:10.2.0 container_name: fund-grafana restart: unless-stopped environment: GF_SECURITY_ADMIN_USER: admin GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_PASSWORD:-admin123} GF_USERS_ALLOW_SIGN_UP: "false" GF_SERVER_ROOT_URL: http://localhost:3000 ports: - "3000:3000" volumes: - grafana_data:/var/lib/grafana - ./docker/grafana/provisioning:/etc/grafana/provisioning:ro - ./docker/grafana/dashboards:/var/lib/grafana/dashboards:ro depends_on: - prometheus networks: - fund-network # ==================== 业务微服务 ==================== # API 网关 gateway: build: context: . dockerfile: Dockerfile args: MODULE: fund-gateway container_name: fund-gateway restart: unless-stopped environment: SERVER_PORT: 8000 SPRING_PROFILES_ACTIVE: docker NACOS_SERVER_ADDR: nacos:8848 NACOS_USERNAME: nacos NACOS_PASSWORD: nacos JAVA_OPTS: -Xms256m -Xmx512m ports: - "8000:8000" depends_on: nacos: condition: service_healthy healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/actuator/health"] interval: 30s timeout: 10s retries: 5 start_period: 120s networks: - fund-network # 系统服务 fund-sys: build: context: . dockerfile: Dockerfile args: MODULE: fund-sys container_name: fund-sys restart: unless-stopped environment: SERVER_PORT: 8100 SPRING_PROFILES_ACTIVE: docker NACOS_SERVER_ADDR: nacos:8848 NACOS_USERNAME: nacos NACOS_PASSWORD: nacos MYSQL_HOST: mysql MYSQL_PORT: 3306 MYSQL_DB: fund_platform MYSQL_USER: root MYSQL_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root123} REDIS_HOST: redis REDIS_PORT: 6379 JAVA_OPTS: -Xms256m -Xmx512m ports: - "8100:8100" depends_on: nacos: condition: service_healthy mysql: condition: service_healthy redis: condition: service_healthy healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8100/actuator/health"] interval: 30s timeout: 10s retries: 5 start_period: 120s networks: - fund-network # 客户服务 fund-cust: build: context: . dockerfile: Dockerfile args: MODULE: fund-cust container_name: fund-cust restart: unless-stopped environment: SERVER_PORT: 8200 SPRING_PROFILES_ACTIVE: docker NACOS_SERVER_ADDR: nacos:8848 NACOS_USERNAME: nacos NACOS_PASSWORD: nacos MYSQL_HOST: mysql MYSQL_PORT: 3306 MYSQL_DB: fund_platform MYSQL_USER: root MYSQL_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root123} JAVA_OPTS: -Xms256m -Xmx512m ports: - "8200:8200" depends_on: nacos: condition: service_healthy mysql: condition: service_healthy networks: - fund-network # 项目服务 fund-proj: build: context: . dockerfile: Dockerfile args: MODULE: fund-proj container_name: fund-proj restart: unless-stopped environment: SERVER_PORT: 8300 SPRING_PROFILES_ACTIVE: docker NACOS_SERVER_ADDR: nacos:8848 NACOS_USERNAME: nacos NACOS_PASSWORD: nacos MYSQL_HOST: mysql MYSQL_PORT: 3306 MYSQL_DB: fund_platform MYSQL_USER: root MYSQL_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root123} JAVA_OPTS: -Xms256m -Xmx512m ports: - "8300:8300" depends_on: nacos: condition: service_healthy mysql: condition: service_healthy networks: - fund-network # 需求工单服务 fund-req: build: context: . dockerfile: Dockerfile args: MODULE: fund-req container_name: fund-req restart: unless-stopped environment: SERVER_PORT: 8400 SPRING_PROFILES_ACTIVE: docker NACOS_SERVER_ADDR: nacos:8848 NACOS_USERNAME: nacos NACOS_PASSWORD: nacos MYSQL_HOST: mysql MYSQL_PORT: 3306 MYSQL_DB: fund_platform MYSQL_USER: root MYSQL_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root123} JAVA_OPTS: -Xms256m -Xmx512m ports: - "8400:8400" depends_on: nacos: condition: service_healthy mysql: condition: service_healthy networks: - fund-network # 支出服务 fund-exp: build: context: . dockerfile: Dockerfile args: MODULE: fund-exp container_name: fund-exp restart: unless-stopped environment: SERVER_PORT: 8500 SPRING_PROFILES_ACTIVE: docker NACOS_SERVER_ADDR: nacos:8848 NACOS_USERNAME: nacos NACOS_PASSWORD: nacos MYSQL_HOST: mysql MYSQL_PORT: 3306 MYSQL_DB: fund_platform MYSQL_USER: root MYSQL_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root123} JAVA_OPTS: -Xms256m -Xmx512m ports: - "8500:8500" depends_on: nacos: condition: service_healthy mysql: condition: service_healthy networks: - fund-network # 收款服务 fund-receipt: build: context: . dockerfile: Dockerfile args: MODULE: fund-receipt container_name: fund-receipt restart: unless-stopped environment: SERVER_PORT: 8600 SPRING_PROFILES_ACTIVE: docker NACOS_SERVER_ADDR: nacos:8848 NACOS_USERNAME: nacos NACOS_PASSWORD: nacos MYSQL_HOST: mysql MYSQL_PORT: 3306 MYSQL_DB: fund_platform MYSQL_USER: root MYSQL_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root123} JAVA_OPTS: -Xms256m -Xmx512m ports: - "8600:8600" depends_on: nacos: condition: service_healthy mysql: condition: service_healthy networks: - fund-network # 报表服务 fund-report: build: context: . dockerfile: Dockerfile args: MODULE: fund-report container_name: fund-report restart: unless-stopped environment: SERVER_PORT: 8700 SPRING_PROFILES_ACTIVE: docker NACOS_SERVER_ADDR: nacos:8848 NACOS_USERNAME: nacos NACOS_PASSWORD: nacos MYSQL_HOST: mysql MYSQL_PORT: 3306 MYSQL_DB: fund_platform MYSQL_USER: root MYSQL_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root123} JAVA_OPTS: -Xms256m -Xmx512m ports: - "8700:8700" depends_on: nacos: condition: service_healthy mysql: condition: service_healthy networks: - fund-network # 文件服务 fund-file: build: context: . dockerfile: Dockerfile args: MODULE: fund-file container_name: fund-file restart: unless-stopped environment: SERVER_PORT: 8800 SPRING_PROFILES_ACTIVE: docker NACOS_SERVER_ADDR: nacos:8848 NACOS_USERNAME: nacos NACOS_PASSWORD: nacos MYSQL_HOST: mysql MYSQL_PORT: 3306 MYSQL_DB: fund_platform MYSQL_USER: root MYSQL_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root123} JAVA_OPTS: -Xms256m -Xmx512m ports: - "8800:8800" depends_on: nacos: condition: service_healthy mysql: condition: service_healthy networks: - fund-network # ==================== 网络配置 ==================== networks: fund-network: driver: bridge name: fund-network # ==================== 数据卷 ==================== volumes: mysql_data: name: fund-mysql-data redis_data: name: fund-redis-data nacos_data: name: fund-nacos-data prometheus_data: name: fund-prometheus-data grafana_data: name: fund-grafana-data