方向:本系统为消费方,netmgr 面板(panel.kimirock.top)为身份源。 面板管理员已登录后,点导航「数据分析系统」入口 → 面板签 60 秒 HMAC 一次性票据 → 302 到 /api/v1/auth/sso → 本系统验票 → 复用自身登录链路 签 JWT → 引导页写 localStorage 跳转,实现无感免密登录。 - 新增 services/netmgr_sso.py:HMAC-SHA256 验票(常量时间比较,60s+540s 时钟偏差容忍),与面板 sso.js 票据格式逐字符对齐 - auth.py 加 GET /sso 端点:无票 302 回面板签票,坏票 403,好票查账号 签 JWT;复用 login-json 的 create_access_token + token_version 机制 - 前端 axios 401 拦截:JWT 过期自动跳 /api/v1/auth/sso 续期(面板有会话 则无感续期);在 /login 页不跳 SSO 避免死循环 - settings 加 NETMGR_SSO_SECRET/PANEL_URL/DEFAULT_USER;.env.example 同步 - 与既有 csctalon→netmgr 方向(SSO_SHARED_SECRET)是两个独立密钥,不混用 - 不依赖 OpenResty 边缘网关:用户从面板入口主动跳入,www 站点保持纯反代
118 lines
6.1 KiB
Plaintext
118 lines
6.1 KiB
Plaintext
# 客服中心管理系统 - 部署环境配置模板
|
||
# 复制为 .env 后按实际环境填写,切勿将真实 .env 提交到 git。
|
||
# docker-compose.yml 自动加载同目录 .env:db 用 ${} 插值,backend 经 env_file 注入。
|
||
|
||
# ---------- 运行模式 ----------
|
||
ENV=prod
|
||
DEBUG=false
|
||
SQL_ECHO=false
|
||
|
||
# ---------- 数据库 ----------
|
||
POSTGRES_USER=csctalon
|
||
POSTGRES_PASSWORD=<请修改为强密码>
|
||
POSTGRES_DB=csctalon
|
||
# Docker Compose 部署时填 db;本机直连时填 127.0.0.1
|
||
POSTGRES_HOST=db
|
||
POSTGRES_PORT=5432
|
||
|
||
# ---------- Redis ----------
|
||
REDIS_HOST=redis
|
||
REDIS_PORT=6379
|
||
REDIS_DB=0
|
||
# 生产必填(fail-fast: ENV=prod 时为空即拒绝启动); redis 容器据此设 requirepass
|
||
REDIS_PASSWORD=<请修改为强密码>
|
||
|
||
# ---------- JWT ----------
|
||
# 生产环境务必改为随机长字符串(建议 32+ 位)。注意:更换后已签发 token 失效、
|
||
# 且 CONFIG_ENCRYPTION_KEY 留空时同步源加密凭证由本 key 派生,更换会致旧凭证无法解密。
|
||
# ⚠️ 2026-08-20 审计 H-4:ENV=prod 时 fail-fast 会拒绝占位短语(含 please/change/random/请修改 等词)
|
||
# 与长度 <32 的 JWT_SECRET_KEY。轮换顺序(先凭证后 JWT,防同步凭证失联):
|
||
# 1) 生成新 CONFIG_ENCRYPTION_KEY(openssl rand -base64 32)
|
||
# 2) 用新 key 重加密 sync_source_configs 存量凭证(重跑 fix 脚本或管理界面重填)
|
||
# 3) 再更换 JWT_SECRET_KEY 并重启
|
||
JWT_SECRET_KEY=<请修改为随机长字符串>
|
||
JWT_ALGORITHM=HS256
|
||
JWT_ACCESS_TOKEN_EXPIRE_MINUTES=1440
|
||
|
||
# 敏感配置加密 key(同步源凭证加密用);留空则从 JWT_SECRET_KEY 派生
|
||
# 生产建议显式设置独立随机 key(先于 JWT 轮换生效),避免 JWT 轮换连带凭证失联
|
||
CONFIG_ENCRYPTION_KEY=
|
||
|
||
# ---------- 跨站免密入口:管理员 → netmgr 网络管理面板(工单 #187)----------
|
||
# 本系统是签发方:管理员点入口 → 签 60 秒一次性 HMAC 票据 → 浏览器跳 netmgr 面板。
|
||
# ⚠️ SSO_SHARED_SECRET 必须与 netmgr 侧 /opt/netmgr/.env 的 SSO_SHARED_SECRET 逐字符一致
|
||
# (openssl rand -hex 32 生成,两侧各存一份)。留空 = 免密入口关闭(不影响本系统登录)。
|
||
SSO_SHARED_SECRET=
|
||
# netmgr 面板对外地址;本地/ZT 调试可临时改 http://10.147.17.34:6080
|
||
SSO_NETMGR_URL=https://panel.kimirock.top
|
||
# 票据有效期(秒),须与 netmgr 侧 TTL 一致,勿随意调大
|
||
SSO_TICKET_TTL_SECONDS=60
|
||
# talon 算力通道管理台直链(仅前端放链接,走 talon 可信网段免密,不签票)
|
||
# ⚠️ talon 没有公网入口,故给两个候选地址,前端按当前访问来源择一:
|
||
# 从办公网打开本页 → 用 _LAN;否则(公网域名 / ZT)→ 用 _ZT
|
||
# 两个都留空 = 不显示该入口。刻意不把它暴露到公网(见工单 #188)
|
||
SSO_TALON_URL_LAN=http://192.168.10.21:4080
|
||
SSO_TALON_URL_ZT=http://10.147.17.22:4080
|
||
|
||
# ---------- 跨子域 SSO(反向:netmgr 面板 → 本系统)----------
|
||
# 方向:本系统是消费方,netmgr 面板(panel.kimirock.top)是身份源。
|
||
# 面板管理员登录后 → 面板签 60 秒 HMAC 票据 → 302 到本系统 /api/v1/auth/sso
|
||
# → 本系统验票 → 复用自身登录链路签 JWT → 引导页写 localStorage。
|
||
# 与上方 SSO_SHARED_SECRET(本系统→面板方向)是两个独立密钥,不可混用。
|
||
# ⚠️ NETMGR_SSO_SECRET 必须与 netmgr 侧 /opt/netmgr/.env 的 SSO_CSCTALON_SECRET 逐字符一致
|
||
# (openssl rand -hex 32 生成,两侧各存一份)。留空 = 反向 SSO 关闭(不影响本系统登录)。
|
||
NETMGR_SSO_SECRET=
|
||
# 面板 SSO 签票入口(无票/票据过期时回跳此地址重新签票)
|
||
NETMGR_SSO_PANEL_URL=https://panel.kimirock.top/sso/csctalon
|
||
# 票据 sub 映射的本系统账号(面板固定签此用户名,须与本系统已存在且 active 的账号一致)
|
||
NETMGR_SSO_DEFAULT_USER=admin
|
||
|
||
# ---------- 上传 ----------
|
||
# 本地开发默认值 = 容器内相对路径(配合 compose 默认挂载 ./uploads:/app/uploads)。
|
||
# ⚠️ docker-compose.yml backend environment 已显式注入容器内路径
|
||
# UPLOAD_DIR=/app/uploads / BROWSER_STATE_DIR=/app/data/browser_states(覆盖 env_file 值),
|
||
# 故 .env 里的 UPLOAD_DIR 仅作 **compose 宿主机挂载源**(生产在 env.production.example 设
|
||
# /opt/csctalon/uploads 等宿主绝对路径), 不再是容器内读写路径(2026-09-06 修复路径错位)。
|
||
# ⚠️ 统一用单数 UPLOAD_DIR/BROWSER_STATE_DIR(与后端代码 settings 同名),
|
||
# 勿再用复数 UPLOADS_DIR/BROWSER_STATES_DIR(2026-08-30 已废弃, 配错会导致路径错配)。
|
||
UPLOAD_DIR=./uploads
|
||
MAX_UPLOAD_SIZE_MB=200
|
||
# Playwright 登录态保存目录(独立于 UPLOAD_DIR,不被静态文件挂载暴露)
|
||
BROWSER_STATE_DIR=./data/browser_states
|
||
|
||
# ---------- 跨域(局域网部署) ----------
|
||
CORS_ORIGINS=http://localhost,http://127.0.0.1
|
||
|
||
# ---------- 初始管理员(仅首次启动建账用;已建账后改此值不生效) ----------
|
||
INIT_ADMIN_USERNAME=admin
|
||
INIT_ADMIN_PASSWORD=<请修改默认密码>
|
||
|
||
# ---------- BMS 平台同步凭证 ----------
|
||
BMS_USERNAME=
|
||
BMS_PASSWORD=
|
||
|
||
# ---------- 定时同步 ----------
|
||
# 默认开启:否则跨日/重启后整小时同步窗口全部漏执行
|
||
BMS_SCHEDULE_AUTOSTART=true
|
||
|
||
# ---------- SCRM 白音平台凭证(仅 fix 脚本灌入用,运行时从 DB 读) ----------
|
||
# ⚠️ 严禁硬编码进脚本/入库;此处留空,通过环境变量或 .env 注入真实值
|
||
# OpenAPI 网关凭证
|
||
SCRM_CLIENT_ID=
|
||
SCRM_CLIENT_SECRET=
|
||
# Playwright 网页登录凭证(手机号/密码)
|
||
SCRM_WEB_USERNAME=
|
||
SCRM_WEB_PASSWORD=
|
||
|
||
# ---------- 微信扫码登录(2026-08-20 审计 H-1) ----------
|
||
# 生产必须配置真实 WECHAT_APPID/WECHAT_SECRET(微信开放平台/小程序),否则扫码登录/注册返回 503
|
||
# WECHAT_APPID=
|
||
# WECHAT_SECRET=
|
||
# 开发调试才允许 mock openid(且需 ENV=dev/test): 显式设为 true
|
||
WECHAT_MOCK_ALLOWED=false
|
||
|
||
# ---------- workbuddy 投诉数据推送鉴权(315投诉/卡商投诉同步) ----------
|
||
# 生产必填强随机串(openssl rand -hex 32),为空时同步接口返回 503。
|
||
# workbuddy 推送时携带请求头: Authorization: Bearer <该值>
|
||
WORKBUDDY_SYNC_TOKEN=<请修改为随机长字符串>
|