fundplatform/docker-compose.yml
zhangjf 8233ff8040 feat: 支持多租户专属实例(逗号分隔的租户ID列表)
功能增强:
- TENANT_ID 支持逗号分隔的多个租户 ID
- 一个实例可以服务多个指定租户

实例类型:
  共享实例:     TENANT_ID = "" (空)
  单租户专属:   TENANT_ID = "VIP_001"
  多租户专属:   TENANT_ID = "VIP_001,VIP_002,VIP_003"

路由逻辑:
  1. 解析实例 metadata.tenant-id 为租户列表
  2. 检查请求 tenantId 是否在列表中
  3. 匹配成功 → 专属实例
  4. 匹配失败 → 回退共享实例

使用场景:
  - 大客户独占实例(单租户)
  - 多个小客户共享一个实例(多租户)
  - 普通客户使用公共实例(共享)
2026-02-19 21:39:30 +08:00

531 lines
13 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 资金服务平台 - Docker Compose 编排配置
# 版本: 1.1
# 支持多租户混合模式VIP专属实例 + 普通租户共享实例
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-shared
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
# 租户 ID - 共享实例(空值,所有租户可用)
# TENANT_ID: ""
# 租户 ID - 多租户专属实例(逗号分隔,服务多个租户)
TENANT_ID: "VIP_001,VIP_002,VIP_003"
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
# 系统服务 - VIP_001 专属实例
fund-sys-vip001:
build:
context: .
dockerfile: Dockerfile
args:
MODULE: fund-sys
container_name: fund-sys-vip001
restart: unless-stopped
environment:
SERVER_PORT: 8101
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
# 租户 ID - 单租户专属实例
TENANT_ID: "VIP_004"
ports:
- "8101:8101"
depends_on:
nacos:
condition: service_healthy
mysql:
condition: service_healthy
redis:
condition: service_healthy
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8101/actuator/health"]
interval: 30s
timeout: 10s
retries: 5
start_period: 120s
networks:
- fund-network
# 系统服务 - VIP_002 专属实例(可选,按需启用)
# fund-sys-vip002:
# build:
# context: .
# dockerfile: Dockerfile
# args:
# MODULE: fund-sys
# container_name: fund-sys-vip002
# restart: unless-stopped
# environment:
# SERVER_PORT: 8102
# 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
# # 租户 ID - VIP_002 专属实例
# TENANT_ID: "VIP_002"
# ports:
# - "8102:8102"
# depends_on:
# nacos:
# condition: service_healthy
# mysql:
# condition: service_healthy
# redis:
# condition: service_healthy
# healthcheck:
# test: ["CMD", "curl", "-f", "http://localhost:8102/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