- 迁移 000251~000254:运营商账户调度参数、请求检查场景(预置 8 个)、卡轮询失败告警表,以及调度模式、步骤、退避、告警等受控系统配置(默认 legacy,行为不变);并发配置表注释标记废弃 - 受控系统配置注册与 JSON 结构校验:步骤只能是 4 种检查类型且不重复、退避序列递增 - yaml 增加 NSQ 地址、msg_timeout、租约、续期间隔、分发间隔、默认执行上限与 max_in_flight;引入 go-nsq - 测试环境 docker-compose 增加 nsqlookupd 与 nsqd,Worker 注入 NSQ 地址 - 账户队列 Redis 结构与 Lua:领取(执行上限、优先占比、按限流组剩余 QPS 估算)、抢执行权、续期、收尾、请求检查(合并、冷却、执行中打优先标记)、移出、发布失败释放
209 lines
8.2 KiB
YAML
209 lines
8.2 KiB
YAML
# 君鸿卡管系统生产环境部署配置
|
||
#
|
||
# 配置方式:纯环境变量配置(配置已嵌入二进制文件)
|
||
# 环境变量前缀:JUNHONG_
|
||
# 格式:JUNHONG_{配置路径},路径分隔符用下划线替代点号
|
||
#
|
||
# 示例:
|
||
# database.host → JUNHONG_DATABASE_HOST
|
||
# redis.address → JUNHONG_REDIS_ADDRESS
|
||
# jwt.secret_key → JUNHONG_JWT_SECRET_KEY
|
||
#
|
||
# 必填配置(缺失时服务无法启动):
|
||
# - JUNHONG_DATABASE_HOST
|
||
# - JUNHONG_DATABASE_PORT
|
||
# - JUNHONG_DATABASE_USER
|
||
# - JUNHONG_DATABASE_PASSWORD
|
||
# - JUNHONG_DATABASE_DBNAME
|
||
# - JUNHONG_REDIS_ADDRESS
|
||
# - JUNHONG_JWT_SECRET_KEY
|
||
#
|
||
# 可选配置(根据需要启用):
|
||
# - Gateway 服务配置(JUNHONG_GATEWAY_*)
|
||
# - 对象存储配置(JUNHONG_STORAGE_*)
|
||
# - 短信服务配置(JUNHONG_SMS_*)
|
||
# - 客户端手机号绑定开关(JUNHONG_CLIENT_REQUIRE_PHONE_BINDING,默认 true)
|
||
#
|
||
# 微信公众号/小程序/支付配置已迁移至数据库(tb_wechat_config 表),
|
||
# 不再需要环境变量和证书文件挂载。
|
||
|
||
services:
|
||
api:
|
||
image: registry.boss160.cn/junhong/cmp-fiber-api:${IMAGE_TAG:-latest}
|
||
container_name: junhong-cmp-api
|
||
restart: unless-stopped
|
||
ports:
|
||
- "3000:3000"
|
||
environment:
|
||
# 数据库配置(必填)
|
||
- JUNHONG_DATABASE_HOST=cxd.whcxd.cn
|
||
- JUNHONG_DATABASE_PORT=16159
|
||
- JUNHONG_DATABASE_USER=erp_pgsql
|
||
- JUNHONG_DATABASE_PASSWORD=erp_2025
|
||
- JUNHONG_DATABASE_DBNAME=junhong_cmp_test
|
||
- JUNHONG_DATABASE_SSLMODE=disable
|
||
# Redis 配置(必填)
|
||
- JUNHONG_REDIS_ADDRESS=cxd.whcxd.cn
|
||
- JUNHONG_REDIS_PORT=16299
|
||
- JUNHONG_REDIS_PASSWORD=cpNbWtAaqgo1YJmbMp3h
|
||
- JUNHONG_REDIS_DB=6
|
||
# JWT 配置(必填)
|
||
- JUNHONG_JWT_SECRET_KEY=dev-secret-key-for-testing-only-32chars!
|
||
# 客户端配置(可选,默认 true;false=不强制绑定手机号)
|
||
- JUNHONG_CLIENT_REQUIRE_PHONE_BINDING=true
|
||
# 日志配置
|
||
- JUNHONG_LOGGING_LEVEL=info
|
||
- JUNHONG_LOGGING_DEVELOPMENT=false
|
||
# 跨域配置
|
||
- JUNHONG_MIDDLEWARE_CORS_ENABLED=true
|
||
- JUNHONG_MIDDLEWARE_CORS_ALLOW_ORIGINS=*
|
||
- JUNHONG_MIDDLEWARE_CORS_ALLOW_CREDENTIALS=false
|
||
# 对象存储配置
|
||
- JUNHONG_STORAGE_PROVIDER=s3
|
||
- JUNHONG_STORAGE_S3_ENDPOINT=https://obs-helf.cucloud.cn
|
||
- JUNHONG_STORAGE_S3_REGION=cn-langfang-2
|
||
- JUNHONG_STORAGE_S3_BUCKET=cmp
|
||
- JUNHONG_STORAGE_S3_ACCESS_KEY_ID=598F558CF6FF46E79D1CFC607852378C9523
|
||
- JUNHONG_STORAGE_S3_SECRET_ACCESS_KEY=8393425DCB2F48F1914FF39DCBC6C7B17325
|
||
- JUNHONG_STORAGE_S3_USE_SSL=false
|
||
- JUNHONG_STORAGE_S3_PATH_STYLE=true
|
||
# Gateway 配置(可选)
|
||
- JUNHONG_GATEWAY_BASE_URL=https://open.whjhft.com/openapi
|
||
- JUNHONG_GATEWAY_APP_ID=LfjL0WjUqpwkItQ0
|
||
- JUNHONG_GATEWAY_APP_SECRET=K0DYuWzbRE6zg5bX
|
||
- JUNHONG_GATEWAY_TIMEOUT=30
|
||
# 七月迭代:企业微信 Adapter 与旧审批入口切换
|
||
- JUNHONG_WECOM_BASE_URL=https://qyapi.weixin.qq.com
|
||
- JUNHONG_WECOM_TIMEOUT=10s
|
||
- JUNHONG_APPROVAL_LEGACY_REFUND_MANUAL_ENABLED=${JUNHONG_APPROVAL_LEGACY_REFUND_MANUAL_ENABLED:-true}
|
||
- JUNHONG_APPROVAL_LEGACY_OFFLINE_RECHARGE_PAY_ENABLED=${JUNHONG_APPROVAL_LEGACY_OFFLINE_RECHARGE_PAY_ENABLED:-true}
|
||
# 卡流量日快照计量(API 与 Worker 必须一致;默认与未配置时行为不变)
|
||
- JUNHONG_TRAFFIC_CALC_MODE=${JUNHONG_TRAFFIC_CALC_MODE:-off}
|
||
- JUNHONG_TRAFFIC_CALC_CARDS=${JUNHONG_TRAFFIC_CALC_CARDS:-}
|
||
- JUNHONG_TRAFFIC_FLOW_SNAPSHOT_ENABLED=${JUNHONG_TRAFFIC_FLOW_SNAPSHOT_ENABLED:-true}
|
||
# 短信服务配置
|
||
- JUNHONG_SMS_GATEWAY_URL=https://gateway.sms.whjhft.com:8443
|
||
- JUNHONG_SMS_USERNAME=JH0001
|
||
- JUNHONG_SMS_PASSWORD=wwR8E4qnL6F0
|
||
- JUNHONG_SMS_SIGNATURE=【JHFTIOT】
|
||
- JUNHONG_MIDDLEWARE_CORS_ENABLED=true
|
||
- JUNHONG_MIDDLEWARE_CORS_ALLOW_ORIGINS=https://cmp-admin.boss160.cn,https://cmp-agent.boss160.cn,https://cmp-c.boss160.cn
|
||
- JUNHONG_MIDDLEWARE_CORS_ALLOW_CREDENTIALS=true
|
||
volumes:
|
||
- ./logs:/app/logs
|
||
networks:
|
||
- junhong-network
|
||
healthcheck:
|
||
test: [ "CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://127.0.0.1:3000/health" ]
|
||
interval: 30s
|
||
timeout: 3s
|
||
retries: 3
|
||
start_period: 10s
|
||
logging:
|
||
driver: "json-file"
|
||
options:
|
||
max-size: "10m"
|
||
max-file: "3"
|
||
|
||
worker:
|
||
image: registry.boss160.cn/junhong/cmp-fiber-worker:${IMAGE_TAG:-latest}
|
||
container_name: junhong-cmp-worker
|
||
restart: unless-stopped
|
||
environment:
|
||
# 数据库配置(必填)
|
||
- JUNHONG_DATABASE_HOST=cxd.whcxd.cn
|
||
- JUNHONG_DATABASE_PORT=16159
|
||
- JUNHONG_DATABASE_USER=erp_pgsql
|
||
- JUNHONG_DATABASE_PASSWORD=erp_2025
|
||
- JUNHONG_DATABASE_DBNAME=junhong_cmp_test
|
||
- JUNHONG_DATABASE_SSLMODE=disable
|
||
# Redis 配置(必填)
|
||
- JUNHONG_REDIS_ADDRESS=cxd.whcxd.cn
|
||
- JUNHONG_REDIS_PORT=16299
|
||
- JUNHONG_REDIS_PASSWORD=cpNbWtAaqgo1YJmbMp3h
|
||
- JUNHONG_REDIS_DB=6
|
||
# JWT 配置(必填)
|
||
- JUNHONG_JWT_SECRET_KEY=dev-secret-key-for-testing-only-32chars!
|
||
# 客户端配置(可选,默认 true;false=不强制绑定手机号)
|
||
- JUNHONG_CLIENT_REQUIRE_PHONE_BINDING=true
|
||
# 日志配置
|
||
- JUNHONG_LOGGING_LEVEL=info
|
||
- JUNHONG_LOGGING_DEVELOPMENT=false
|
||
# 对象存储配置
|
||
- JUNHONG_STORAGE_PROVIDER=s3
|
||
- JUNHONG_STORAGE_S3_ENDPOINT=https://obs-helf.cucloud.cn
|
||
- JUNHONG_STORAGE_S3_REGION=cn-langfang-2
|
||
- JUNHONG_STORAGE_S3_BUCKET=cmp
|
||
- JUNHONG_STORAGE_S3_ACCESS_KEY_ID=598F558CF6FF46E79D1CFC607852378C9523
|
||
- JUNHONG_STORAGE_S3_SECRET_ACCESS_KEY=8393425DCB2F48F1914FF39DCBC6C7B17325
|
||
- JUNHONG_STORAGE_S3_USE_SSL=false
|
||
- JUNHONG_STORAGE_S3_PATH_STYLE=true
|
||
# Gateway 配置(可选)
|
||
- JUNHONG_GATEWAY_BASE_URL=https://open.whjhft.com/openapi
|
||
- JUNHONG_GATEWAY_APP_ID=LfjL0WjUqpwkItQ0
|
||
- JUNHONG_GATEWAY_APP_SECRET=K0DYuWzbRE6zg5bX
|
||
- JUNHONG_GATEWAY_TIMEOUT=30
|
||
- JUNHONG_POLLING_VERBOSE_LOG=true
|
||
# 七月迭代:单 Worker 测试环境同时承担调度和消费
|
||
- JUNHONG_WORKER_ROLE=${JUNHONG_WORKER_ROLE:-all}
|
||
- JUNHONG_WORKER_INSTANCE_NAME=${JUNHONG_WORKER_INSTANCE_NAME:-test-worker-all-1}
|
||
# 卡流量日快照计量(API 与 Worker 必须一致;默认与未配置时行为不变)
|
||
- JUNHONG_TRAFFIC_CALC_MODE=${JUNHONG_TRAFFIC_CALC_MODE:-off}
|
||
- JUNHONG_TRAFFIC_CALC_CARDS=${JUNHONG_TRAFFIC_CALC_CARDS:-}
|
||
- JUNHONG_TRAFFIC_FLOW_SNAPSHOT_ENABLED=${JUNHONG_TRAFFIC_FLOW_SNAPSHOT_ENABLED:-true}
|
||
# Worker 执行企微审批提交、同步和恢复任务
|
||
- JUNHONG_WECOM_BASE_URL=https://qyapi.weixin.qq.com
|
||
- JUNHONG_WECOM_TIMEOUT=10s
|
||
# 按运营商账户调度的 NSQ(卡轮询分发;调度模式在受控系统配置 polling.scheduler.mode 切换)
|
||
- JUNHONG_POLLING_CARRIER_NSQD_ADDRESS=${JUNHONG_POLLING_CARRIER_NSQD_ADDRESS:-nsqd:4150}
|
||
- JUNHONG_POLLING_CARRIER_NSQLOOKUPD_ADDRESSES=${JUNHONG_POLLING_CARRIER_NSQLOOKUPD_ADDRESSES:-nsqlookupd:4161}
|
||
volumes:
|
||
- ./logs:/app/logs
|
||
networks:
|
||
- junhong-network
|
||
depends_on:
|
||
api:
|
||
condition: service_healthy
|
||
nsqd:
|
||
condition: service_started
|
||
logging:
|
||
driver: "json-file"
|
||
options:
|
||
max-size: "10m"
|
||
max-file: "3"
|
||
|
||
# NSQ:只承担卡轮询的执行分发,Redis 是唯一权威状态(add-carrier-polling-scheduler)
|
||
nsqlookupd:
|
||
image: nsqio/nsq:v1.3.0
|
||
container_name: junhong-cmp-nsqlookupd
|
||
restart: unless-stopped
|
||
command: /nsqlookupd
|
||
networks:
|
||
- junhong-network
|
||
logging:
|
||
driver: "json-file"
|
||
options:
|
||
max-size: "10m"
|
||
max-file: "3"
|
||
|
||
nsqd:
|
||
image: nsqio/nsq:v1.3.0
|
||
container_name: junhong-cmp-nsqd
|
||
restart: unless-stopped
|
||
command: /nsqd --lookupd-tcp-address=nsqlookupd:4160 --broadcast-address=nsqd --data-path=/data --mem-queue-size=10000 --max-msg-timeout=15m
|
||
volumes:
|
||
- ./nsq-data:/data
|
||
networks:
|
||
- junhong-network
|
||
depends_on:
|
||
- nsqlookupd
|
||
logging:
|
||
driver: "json-file"
|
||
options:
|
||
max-size: "10m"
|
||
max-file: "3"
|
||
|
||
networks:
|
||
junhong-network:
|
||
driver: bridge
|