Files
go-sip/deploys/production/README.md
T

65 lines
6.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 正式部署
这套流程按正式部署实施,当前使用的是非正式配置文件,不是另一套“预生产”部署方式。目录为 `deploys/production/`,入口为 `production.py`。
当前获批目标仍是登记测试机 `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 全部获批任务,不再逐通询问。程序仍核对任务归属、时段、线路、额度、并发、签发期限和消息身份;不自行生成外呼指令,不盲重拨或换线重拨。
正式业务 Dispatcher 启动及收到 SIP 更新时,先关闭新执行准入、取得并持久保存 SaaS 完整 SIP 配置,等待旧通话及占用排空,再通过已有 Agent 会话加载并核对 Asterisk 实际版本,成功后才继续业务。未知占用不会因重启消失;加载或核对失败不跳过、不伪造确认。只更新项目管理的线路文件并执行 PJSIP reload,不重启 Asterisk、不改静态 transport。隔离 Mock 仍只核对固定预加载夹具,不发起原生加载。
验收包括三项服务安装、启用并启动,Asterisk/Agent `enabled+active`,外部 RabbitMQ 登录/通道、Agent监听、Asterisk基础运行及版本/hash。SaaS 未启动不阻断部署:Dispatcher可明确等待或自动重试,新执行准入保持关闭;SaaS读取、其业务队列供给、业务会话及新SIP加载延期,不把此状态写成业务已就绪。证书、配置、MQ登录及Asterisk故障不得归为SaaS不可用。没有HTTP响应须按真实错误类型判定,证书或未知传输错误阻断部署;等待状态必须是有最新对应错误的 `activating/auto-restart`,`failed` 不算成功。无获批任务、未接通或AI未调用时如实记录未验证。
## 一键入口
```bash
python3 deploys/production/production.py deploy
python3 deploys/production/production.py status
python3 deploys/production/production.py stop
python3 deploys/production/production.py start
# 仅本次首次部署已获授权;之后先取得新的重置确认:
python3 deploys/production/production.py deploy --reset-state --confirm-reset
```
部署要求本地main干净且已推送,源码固定为远程main,文件上传后再次校验SHA-256。`bootstrap` 仅导入原生Asterisk/TLS等主机基础元数据,并按根目录env覆盖业务来源;`retire-mocks` 在停服务、零活动通话和备份后退役已确认的本项目旧设施。普通重部署不重置数据。
自动化测试可以使用短时夹具和资源,结束后清理;它们不是正式部署的服务依赖。当前配置文件仍为非正式配置;正式部署方式与生产验收是两件事,生产发布门禁仍独立,不能把本次部署写成生产签收。