# ============================================================================= # RWA Mining Ecosystem 2.0 - Docker Compose # ============================================================================= # # 支持两种部署模式 (通过 DEPLOY_MODE 环境变量切换): # # 1. shared 模式 (默认): 共享 1.0 的 PostgreSQL/Redis/Kafka # - 网络: services_rwa-network (由 1.0 创建) # - 基础设施: 复用 1.0 的 postgres, redis, kafka 容器 # # 2. standalone 模式: 独立部署在单独服务器上 # - 网络: rwa-2-network (本地) # - 基础设施: 本地 postgres-2, redis-2 + 远程 Kafka (192.168.1.111:9093) # - 启动命令需加 --profile standalone # # Usage: # # Shared 模式 (默认): # docker compose -f docker-compose.2.0.yml --env-file .env up -d # # # Standalone 模式: # docker compose -f docker-compose.2.0.yml --profile standalone --env-file .env up -d # # ============================================================================= services: # =========================================================================== # Infrastructure (standalone 模式专属, 通过 --profile standalone 启用) # =========================================================================== postgres-2: image: postgres:16-alpine container_name: rwa-postgres-2 profiles: ["standalone"] environment: TZ: Asia/Shanghai POSTGRES_USER: ${POSTGRES_USER:-rwa_user} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-rwa_secure_password} POSTGRES_MULTIPLE_DATABASES: rwa_contribution,rwa_mining,rwa_trading,rwa_mining_admin,rwa_auth,rwa_mining_wallet,rwa_mining_blockchain ports: - "5432:5432" volumes: - postgres_2_data:/var/lib/postgresql/data - ./init-multiple-dbs.sh:/docker-entrypoint-initdb.d/init-multiple-dbs.sh:ro command: > postgres -c wal_level=logical -c max_replication_slots=20 -c max_wal_senders=20 -c max_connections=200 healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-rwa_user}"] interval: 5s timeout: 5s retries: 10 restart: unless-stopped networks: - rwa-2-network redis-2: image: redis:7-alpine container_name: rwa-redis-2 profiles: ["standalone"] environment: TZ: Asia/Shanghai command: redis-server --appendonly yes --databases 20 ports: - "6379:6379" volumes: - redis_2_data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 5s retries: 10 restart: unless-stopped networks: - rwa-2-network debezium-2: image: debezium/connect:2.4 container_name: rwa-debezium-2 profiles: ["standalone"] depends_on: postgres-2: condition: service_healthy ports: - "8084:8083" environment: TZ: Asia/Shanghai GROUP_ID: debezium-connect-2 BOOTSTRAP_SERVERS: ${KAFKA_BROKERS:-kafka:29092} CONFIG_STORAGE_TOPIC: debezium_2_configs OFFSET_STORAGE_TOPIC: debezium_2_offsets STATUS_STORAGE_TOPIC: debezium_2_statuses CONFIG_STORAGE_REPLICATION_FACTOR: 1 OFFSET_STORAGE_REPLICATION_FACTOR: 1 STATUS_STORAGE_REPLICATION_FACTOR: 1 KEY_CONVERTER: org.apache.kafka.connect.json.JsonConverter VALUE_CONVERTER: org.apache.kafka.connect.json.JsonConverter KEY_CONVERTER_SCHEMAS_ENABLE: "false" VALUE_CONVERTER_SCHEMAS_ENABLE: "false" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8083/"] interval: 30s timeout: 10s retries: 5 start_period: 60s restart: unless-stopped networks: - rwa-2-network # =========================================================================== # Backend Services (2.0) # =========================================================================== contribution-service: build: context: ./contribution-service dockerfile: Dockerfile container_name: rwa-contribution-service depends_on: postgres-2: condition: service_healthy required: false redis-2: condition: service_healthy required: false environment: NODE_ENV: production TZ: Asia/Shanghai PORT: 3020 # PostgreSQL - 使用独立的数据库 DATABASE_URL: postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@${POSTGRES_HOST:-postgres}:${POSTGRES_PORT:-5432}/rwa_contribution?schema=public # Redis - 使用 DB 10 隔离 REDIS_HOST: ${REDIS_HOST:-redis} REDIS_PORT: ${REDIS_PORT:-6379} REDIS_PASSWORD: ${REDIS_PASSWORD:-} REDIS_DB: 10 # Kafka - 消费 CDC 事件 (从1.0服务同步数据) KAFKA_BROKERS: ${KAFKA_BROKERS:-kafka:29092} # 认种订单 (planting-service) CDC_TOPIC_ADOPTIONS: ${CDC_TOPIC_ADOPTIONS:-cdc.planting.public.planting_orders} # 推荐关系 (referral-service) CDC_TOPIC_REFERRALS: ${CDC_TOPIC_REFERRALS:-cdc.referral.public.referral_relationships} CDC_CONSUMER_GROUP: contribution-service-cdc-group # JWT 配置 (与 auth-service 共享密钥以验证 token) JWT_SECRET: ${JWT_SECRET:-your-jwt-secret-change-in-production} ports: - "3020:3020" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3020/api/v2/health"] interval: 30s timeout: 10s retries: 3 start_period: 60s restart: unless-stopped networks: - rwa-2-network mining-service: build: context: ./mining-service dockerfile: Dockerfile container_name: rwa-mining-service depends_on: postgres-2: condition: service_healthy required: false redis-2: condition: service_healthy required: false environment: NODE_ENV: production TZ: Asia/Shanghai PORT: 3021 # PostgreSQL - 使用独立的数据库 DATABASE_URL: postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@${POSTGRES_HOST:-postgres}:${POSTGRES_PORT:-5432}/rwa_mining?schema=public # Redis - 使用 DB 16 隔离 (避免与 1.0 blockchain-service 的 DB 11 冲突) REDIS_HOST: ${REDIS_HOST:-redis} REDIS_PORT: ${REDIS_PORT:-6379} REDIS_PASSWORD: ${REDIS_PASSWORD:-} REDIS_DB: 16 # Kafka KAFKA_BROKERS: ${KAFKA_BROKERS:-kafka:29092} # JWT 配置 (与 auth-service 共享密钥以验证 token) JWT_SECRET: ${JWT_SECRET:-your-jwt-secret-change-in-production} # 2.0 内部服务调用 CONTRIBUTION_SERVICE_URL: http://contribution-service:3020 ports: - "3021:3021" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3021/api/v2/health"] interval: 30s timeout: 10s retries: 3 start_period: 60s restart: unless-stopped networks: - rwa-2-network trading-service: build: context: ./trading-service dockerfile: Dockerfile container_name: rwa-trading-service depends_on: postgres-2: condition: service_healthy required: false redis-2: condition: service_healthy required: false environment: NODE_ENV: production TZ: Asia/Shanghai PORT: 3022 # PostgreSQL - 使用独立的数据库 DATABASE_URL: postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@${POSTGRES_HOST:-postgres}:${POSTGRES_PORT:-5432}/rwa_trading?schema=public # Redis - 使用 DB 12 隔离 REDIS_HOST: ${REDIS_HOST:-redis} REDIS_PORT: ${REDIS_PORT:-6379} REDIS_PASSWORD: ${REDIS_PASSWORD:-} REDIS_DB: 12 # Kafka KAFKA_BROKERS: ${KAFKA_BROKERS:-kafka:29092} # 2.0 内部服务调用 MINING_SERVICE_URL: http://mining-service:3021 AUTH_SERVICE_URL: http://auth-service:3024 MINING_ADMIN_SERVICE_URL: http://mining-admin-service:3023 MINING_BLOCKCHAIN_SERVICE_URL: http://mining-blockchain-service:3026 # JWT 配置 (与 auth-service 共享密钥以验证 token) JWT_SECRET: ${JWT_SECRET:-your-jwt-secret-change-in-production} # 做市商钱包 (MPC) - 初始化时写入数据库 FUSDT_MARKET_MAKER_USERNAME: ${FUSDT_MARKET_MAKER_USERNAME:-} FUSDT_MARKET_MAKER_ADDRESS: ${FUSDT_MARKET_MAKER_ADDRESS:-} EUSDT_MARKET_MAKER_USERNAME: ${EUSDT_MARKET_MAKER_USERNAME:-} EUSDT_MARKET_MAKER_ADDRESS: ${EUSDT_MARKET_MAKER_ADDRESS:-} volumes: - trading-uploads:/app/uploads ports: - "3022:3022" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3022/api/v2/health"] interval: 30s timeout: 10s retries: 3 start_period: 60s restart: unless-stopped networks: - rwa-2-network mining-admin-service: build: context: ./mining-admin-service dockerfile: Dockerfile container_name: rwa-mining-admin-service depends_on: postgres-2: condition: service_healthy required: false redis-2: condition: service_healthy required: false environment: NODE_ENV: production TZ: Asia/Shanghai PORT: 3023 # PostgreSQL - 使用独立的数据库 DATABASE_URL: postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@${POSTGRES_HOST:-postgres}:${POSTGRES_PORT:-5432}/rwa_mining_admin?schema=public # Redis - 使用 DB 13 隔离 REDIS_HOST: ${REDIS_HOST:-redis} REDIS_PORT: ${REDIS_PORT:-6379} REDIS_PASSWORD: ${REDIS_PASSWORD:-} REDIS_DB: 13 # Kafka - 消费 2.0 服务间事件 KAFKA_BROKERS: ${KAFKA_BROKERS:-kafka:29092} CDC_CONSUMER_GROUP: mining-admin-service-cdc-group # CDC Topics - 从各 2.0 服务同步数据 CDC_TOPIC_USERS: ${CDC_TOPIC_ADMIN_USERS:-mining-admin.auth.users} CDC_TOPIC_CONTRIBUTION: ${CDC_TOPIC_ADMIN_CONTRIBUTION:-mining-admin.contribution.accounts} CDC_TOPIC_MINING: ${CDC_TOPIC_ADMIN_MINING:-mining-admin.mining.accounts} CDC_TOPIC_TRADING: ${CDC_TOPIC_ADMIN_TRADING:-mining-admin.trading.accounts} # 2.0 内部服务调用(备用) CONTRIBUTION_SERVICE_URL: http://contribution-service:3020 MINING_SERVICE_URL: http://mining-service:3021 TRADING_SERVICE_URL: http://trading-service:3022 AUTH_SERVICE_URL: http://auth-service:3024 JWT_SECRET: ${ADMIN_JWT_SECRET:-your-admin-jwt-secret-change-in-production} # APK 下载地址前缀(通过 Kong 网关 /mining-admin 路由访问) UPLOAD_BASE_URL: https://rwaapi.szaiai.com/mining-admin/downloads UPLOAD_DIR: ./uploads volumes: - mining-admin-uploads:/app/uploads ports: - "3023:3023" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3023/api/v2/health"] interval: 30s timeout: 10s retries: 3 start_period: 60s restart: unless-stopped networks: - rwa-2-network auth-service: build: context: ./auth-service dockerfile: Dockerfile container_name: rwa-auth-service depends_on: postgres-2: condition: service_healthy required: false redis-2: condition: service_healthy required: false environment: NODE_ENV: production TZ: Asia/Shanghai PORT: 3024 # PostgreSQL - 使用独立的数据库 DATABASE_URL: postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@${POSTGRES_HOST:-postgres}:${POSTGRES_PORT:-5432}/rwa_auth?schema=public # Redis - 使用 DB 14 隔离 REDIS_HOST: ${REDIS_HOST:-redis} REDIS_PORT: ${REDIS_PORT:-6379} REDIS_PASSWORD: ${REDIS_PASSWORD:-} REDIS_DB: 14 # Kafka - 消费 CDC 事件 (从1.0 identity-service同步用户) KAFKA_BROKERS: ${KAFKA_BROKERS:-kafka:29092} CDC_ENABLED: "true" CDC_TOPIC_USERS: ${CDC_TOPIC_USERS:-cdc.identity.public.user_accounts} CDC_TOPIC_WALLET_ADDRESSES: ${CDC_TOPIC_WALLET_ADDRESSES:-cdc.identity.public.wallet_addresses} CDC_CONSUMER_GROUP: auth-service-cdc-group # JWT 配置 JWT_SECRET: ${JWT_SECRET:-your-jwt-secret-change-in-production} JWT_EXPIRES_IN: ${JWT_EXPIRES_IN:-7d} JWT_REFRESH_EXPIRES_IN: ${JWT_REFRESH_EXPIRES_IN:-30d} # SMS 配置 SMS_ACCESS_KEY_ID: ${SMS_ACCESS_KEY_ID:-} SMS_ACCESS_KEY_SECRET: ${SMS_ACCESS_KEY_SECRET:-} SMS_SIGN_NAME: ${SMS_SIGN_NAME:-榴莲生态} SMS_TEMPLATE_CODE: ${SMS_TEMPLATE_CODE:-} ports: - "3024:3024" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3024/api/v2/health"] interval: 30s timeout: 10s retries: 3 start_period: 60s restart: unless-stopped networks: - rwa-2-network mining-wallet-service: build: context: ./mining-wallet-service dockerfile: Dockerfile container_name: rwa-mining-wallet-service depends_on: postgres-2: condition: service_healthy required: false redis-2: condition: service_healthy required: false environment: NODE_ENV: production TZ: Asia/Shanghai PORT: 3025 # PostgreSQL - 使用独立的数据库 DATABASE_URL: postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@${POSTGRES_HOST:-postgres}:${POSTGRES_PORT:-5432}/rwa_mining_wallet?schema=public # Redis - 使用 DB 15 隔离 REDIS_HOST: ${REDIS_HOST:-redis} REDIS_PORT: ${REDIS_PORT:-6379} REDIS_PASSWORD: ${REDIS_PASSWORD:-} REDIS_DB: 15 # Kafka KAFKA_BROKERS: ${KAFKA_BROKERS:-kafka:29092} # JWT 配置 JWT_SECRET: ${JWT_SECRET:-your-jwt-secret-change-in-production} # KAVA 区块链配置 KAVA_RPC_URL: ${KAVA_RPC_URL:-https://evm.kava.io} KAVA_CHAIN_ID: ${KAVA_CHAIN_ID:-2222} ports: - "3025:3025" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3025/api/v2/health"] interval: 30s timeout: 10s retries: 3 start_period: 60s restart: unless-stopped networks: - rwa-2-network mining-blockchain-service: build: context: ./mining-blockchain-service dockerfile: Dockerfile container_name: rwa-mining-blockchain-service depends_on: postgres-2: condition: service_healthy required: false redis-2: condition: service_healthy required: false environment: NODE_ENV: production TZ: Asia/Shanghai PORT: 3026 # PostgreSQL - 使用独立的数据库 DATABASE_URL: postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@${POSTGRES_HOST:-postgres}:${POSTGRES_PORT:-5432}/rwa_mining_blockchain?schema=public # Redis - 使用 DB 8 隔离 (0-15 有效范围) REDIS_HOST: ${REDIS_HOST:-redis} REDIS_PORT: ${REDIS_PORT:-6379} REDIS_PASSWORD: ${REDIS_PASSWORD:-} REDIS_DB: 8 # Kafka - 用于事件发布 KAFKA_BROKERS: ${KAFKA_BROKERS:-kafka:29092} # MPC Service - 直接 HTTP 调用签名 MPC_SERVICE_URL: ${MPC_SERVICE_URL:-http://mpc-service:3006} # JWT 配置 JWT_SECRET: ${JWT_SECRET:-your-jwt-secret-change-in-production} # 区块链配置 NETWORK_MODE: ${NETWORK_MODE:-mainnet} # KAVA 配置 KAVA_RPC_URL: ${KAVA_RPC_URL:-https://evm.kava.io} # RPC 故障转移:逗号分隔的多个端点,主端点失败 3 分钟后自动切换 KAVA_RPC_URLS: ${KAVA_RPC_URLS:-https://evm.kava.io,https://evm.kava-rpc.com,https://kava-evm-rpc.publicnode.com,https://rpc.ankr.com/kava_evm} KAVA_CHAIN_ID: ${KAVA_CHAIN_ID:-2222} KAVA_USDT_CONTRACT: ${KAVA_USDT_CONTRACT:-0xA9F3A35dBa8699c8C681D8db03F0c1A8CEB9D7c3} # 积分股合约 (eUSDT - Energy USDT) KAVA_EUSDT_CONTRACT: ${KAVA_EUSDT_CONTRACT:-0x7C3275D808eFbAE90C06C7E3A9AfDdcAa8563931} # 积分值合约 (fUSDT - Future USDT) KAVA_FUSDT_CONTRACT: ${KAVA_FUSDT_CONTRACT:-0x14dc4f7d3E4197438d058C3D156dd9826A161134} # BSC 配置 BSC_RPC_URL: ${BSC_RPC_URL:-https://bsc-dataseed.binance.org} BSC_CHAIN_ID: ${BSC_CHAIN_ID:-56} BSC_USDT_CONTRACT: ${BSC_USDT_CONTRACT:-0x55d398326f99059fF775485246999027B3197955} # C2C Bot 热钱包 (MPC) C2C_BOT_WALLET_USERNAME: ${C2C_BOT_WALLET_USERNAME:-wallet-29b09647} C2C_BOT_WALLET_ADDRESS: ${C2C_BOT_WALLET_ADDRESS:-0x30da9Eb4C49914fDb9d711cE26AB446d68fE4Bc4} # eUSDT (积分股) 做市商钱包 (MPC) EUSDT_MARKET_MAKER_USERNAME: ${EUSDT_MARKET_MAKER_USERNAME:-} EUSDT_MARKET_MAKER_ADDRESS: ${EUSDT_MARKET_MAKER_ADDRESS:-} # fUSDT (积分值) 做市商钱包 (MPC) FUSDT_MARKET_MAKER_USERNAME: ${FUSDT_MARKET_MAKER_USERNAME:-} FUSDT_MARKET_MAKER_ADDRESS: ${FUSDT_MARKET_MAKER_ADDRESS:-} # 区块扫描配置 BLOCK_SCAN_INTERVAL_MS: ${BLOCK_SCAN_INTERVAL_MS:-5000} BLOCK_CONFIRMATIONS_REQUIRED: ${BLOCK_CONFIRMATIONS_REQUIRED:-12} ports: - "3026:3026" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3026/api/v1/health"] interval: 30s timeout: 10s retries: 3 start_period: 60s restart: unless-stopped networks: - rwa-2-network # =========================================================================== # Frontend Services (2.0) # =========================================================================== mining-admin-web: build: context: ../../frontend/mining-admin-web dockerfile: Dockerfile container_name: rwa-mining-admin-web environment: NODE_ENV: production TZ: Asia/Shanghai PORT: 3100 NEXT_PUBLIC_API_URL: http://mining-admin-service:3023 NEXT_PUBLIC_APP_NAME: 挖矿管理后台 ports: - "3100:3100" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3100/"] interval: 30s timeout: 10s retries: 3 start_period: 15s restart: unless-stopped networks: - rwa-2-network # ============================================================================= # Volumes # ============================================================================= volumes: mining-admin-uploads: driver: local trading-uploads: driver: local # standalone 模式专属 volumes postgres_2_data: driver: local redis_2_data: driver: local # ============================================================================= # Network # ============================================================================= # shared 模式 (默认): RWA_NETWORK_NAME 未设置,使用 services_rwa-network (1.0 已创建) # standalone 模式: deploy-mining.sh 设置 RWA_NETWORK_NAME=rwa-2-network 并预先创建 networks: rwa-2-network: external: true name: ${RWA_NETWORK_NAME:-services_rwa-network}