Files
go-sip/deploys/preprod

固定预生产部署

目标是登记测试机 server.sip。服务使用 nonprod-real、真实 SaaS/RabbitMQ/AI/OSS 和原生 Asterisk;不安装 SaaS Mock 或本机 RabbitMQ,不以一次性运行目录代替正式运行。

固定位置

内容 位置
配置及 TLS ~/.config/go-sip/
Dispatcher SQLite ~/.local/share/go-sip/dispatcher.sqlite
Agent 会话 ~/.local/share/go-sip/agent-session.json
Agent 结果、录音及上传恢复 ~/.local/share/go-sip/agent-recovery/
版本制品 ~/.local/opt/go-sip/releases/<main提交>/
当前制品指针 ~/.local/opt/go-sip/current
操作备份及私密证据 ~/.local/share/go-sip-backups/
原生 Asterisk 配置 ~/.config/go-sip-asterisk/(沿用已安装实例)

版本目录只保存制品,不包含业务数据库。正常重部署切换制品,不创建另一套运行数据,也不清除现有状态。

服务名固定为 go-sip-asterisk.service、go-sip-agent.service、go-sip-dispatcher.service,由 rogee 的 systemd --user 管理。旧日期命名的测试单元退役,不并行启动多个 Agent/Dispatcher。

当前项目配置来源

  • saas.env 为 KEY=VALUE:DispatcherUUID → DISPATCHER_ID,DispatcherKEY → DISPATCHER_SECRET_KEY,SaaSBaseURL → SAAS_BASE_URL。
  • rabbitmq.env 为 KEY=VALUE:RABBITMQ_HOST/PORT/USER/PASS/VHOST 构造正式 RABBITMQ_URL。用户名、密码及 vhost 按 URI 规则编码;不改用旧本机地址,不创建外部队列或交换机。
  • aliyun-oss.env 不是 shell env:读取准确大小写的 bucket、Endpoint、Region 和 RAM.username/accessKeyId/accessKeySecret,转换为 Dispatcher 私有 OSS JSON,并以环境变量名称引用访问凭据。部署的录音前缀明确为 call-recordings,最大录音 64 MiB,与现有 Agent 上限一致;不写旧快照的桶或访问凭据。
  • SIP、任务、额度、AI 连接和 AI 参数只从真实 SaaS 取得。.local/provider-ai.env 不覆盖 SaaS 返回的型号、音色、参数或连接。

三份源文件先核对所有者及 0600,只在受限进程中解析,不执行 source、不打印字段值。服务配置和密钥为 0600,目录为 0700;私有文件、完整连接串及原始证据不进入 Git。

部署及重置边界

一键脚本须核验登记 SSH 指纹、目标主机、正式 main 制品来源/hash、Debian 13/架构、原生 Asterisk及诊断工具、权限和必要配置。缺项立即失败,不跳过诊断、不安装 Mock 作为回退。

普通部署不得改写数据库、幂等记录、录音、结果、恢复文件或会话。首次安装明确使用上述固定路径;发现不兼容数据时停止,不偷偷切换另一套空目录。

只有显式 --reset-state 才能重置本项目非生产数据:停止相关服务、核实 Asterisk 没有活动通话、完成私密备份和清单记录后再处理。当前确认的首次部署可使用;之后每次必须重新确认,不根据报错自动重置。外部 SaaS、RabbitMQ、OSS 数据不属于重置范围,不以重置伪造旧通话已结束或已提交结果。

退役资源只限本项目旧测试部署及自有 Mock 设施。不得删除整个 ~/.local、原生 Asterisk、其他项目服务或未确认归属的容器;必要凭据和原始证据保留,旧运行数据按已授权范围备份后处理。

启动及验证

用户已授权本次目标中的真实 SaaS 全部获批任务,不再逐通询问。程序仍核对任务归属、时段、线路、额度、并发、签发期限和消息身份;不自行生成外呼指令,不盲重拨或换线重拨。

验收包括三项服务安装、启用并启动,Asterisk/Agent enabled+active,外部 RabbitMQ 登录/通道、Agent监听、Asterisk基础运行及版本/hash。SaaS 未启动不阻断部署:Dispatcher可明确等待或自动重试,新执行准入保持关闭;SaaS读取、其业务队列供给、业务会话及新SIP加载延期,不把此状态写成业务已就绪。证书、配置、MQ登录及Asterisk故障不得归为SaaS不可用。没有HTTP响应须按真实错误类型判定,证书或未知传输错误阻断部署;等待状态必须是有最新对应错误的 activating/auto-restart,failed 不算成功。无获批任务、未接通或AI未调用时如实记录未验证。

一键入口

python3 deploys/preprod/preprod.py deploy
python3 deploys/preprod/preprod.py status
python3 deploys/preprod/preprod.py stop
python3 deploys/preprod/preprod.py start
# 仅本次首次部署已获授权;之后先取得新的重置确认:
python3 deploys/preprod/preprod.py deploy --reset-state --confirm-reset

部署要求本地main干净且已推送,源码固定为远程main,文件上传后再次校验SHA-256。bootstrap 仅导入原生Asterisk/TLS等主机基础元数据,并按根目录env覆盖业务来源;retire-mocks 在停服务、零活动通话和备份后退役已确认的本项目旧设施。普通重部署不重置数据。

自动化测试可以使用短时夹具和资源,结束后清理;它们不是预生产的服务依赖。生产发布门禁仍独立,不能把此次预生产部署写成生产签收。