All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 16m2s
- 轮询步骤异步模式下只调网关并发布 card.ingest 入库消息,入库消费者固定并发 30、按采集 ID 去重、可重试错误不限次数退避重投 - 采集记录经 card.collection 攒批写入,失败整批重投,新增 (observation_id, observed_at) 唯一索引 - 网络、实名观测增加乱序保护;轮询读查询走缓存,套餐状态查询各自计时且失败不缓存 - 入库积压告警与反压;系统配置 polling.ingest.mode 默认 sync 可回退;测试环境 nsqd 消息全部落盘 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
220 lines
9.0 KiB
YAML
220 lines
9.0 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
|
||
# 应用日志轮换:单文件 100MB(默认),保留 40 个压缩备份,api 与 worker 合计约 1GB
|
||
- JUNHONG_LOGGING_APP_LOG_MAX_BACKUPS=40
|
||
- JUNHONG_LOGGING_APP_LOG_MAX_AGE=14
|
||
# 跨域配置
|
||
- 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
|
||
- JUNHONG_GATEWAY_READONLY_ENABLED=${JUNHONG_GATEWAY_READONLY_ENABLED:-false}
|
||
# 七月迭代:企业微信 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_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:
|
||
- ./api/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
|
||
# worker 并发轮询与按账户并行分发共用连接池,默认 10 不够
|
||
- JUNHONG_REDIS_POOL_SIZE=100
|
||
# 任务并发:默认 10 时流量扣减事件投递跟不上(白天积压 1 万+、延迟 2.5 小时),调到 50
|
||
- JUNHONG_QUEUE_CONCURRENCY=50
|
||
# 数据库连接池随任务并发放大(默认 25/10);测试库 max_connections=200,API 另占 25
|
||
- JUNHONG_DATABASE_MAX_OPEN_CONNS=60
|
||
- JUNHONG_DATABASE_MAX_IDLE_CONNS=20
|
||
# 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
|
||
# 应用日志轮换:单文件 100MB(默认),保留 40 个压缩备份,api 与 worker 合计约 1GB
|
||
- JUNHONG_LOGGING_APP_LOG_MAX_BACKUPS=40
|
||
- JUNHONG_LOGGING_APP_LOG_MAX_AGE=14
|
||
# 对象存储配置
|
||
- 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_GATEWAY_READONLY_ENABLED=${JUNHONG_GATEWAY_READONLY_ENABLED:-false}
|
||
- 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 必须一致;默认与未配置时行为不变)
|
||
# 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:
|
||
- ./worker/logs:/app/logs
|
||
# 采集记录到期归档压缩包(archive/traffic-collection),由同步服务器拉走
|
||
- ./worker/archive:/app/archive
|
||
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=0 --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
|