Files

129 lines
5.8 KiB
Markdown
Raw Permalink 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.
# NixMsg 运维手册
对应 DEVELOPMENT 第 11 节。本文不含任何密码或令牌样例。
## 1. 配置项
环境变量 `NIXMSG_CONFIG` 指向 YAML 配置,默认 `./config.yaml`。完整字段见 [deploy/config.example.yaml](../deploy/config.example.yaml)。
| 项 | 说明 |
|---|---|
| `listen` | 端接入端口,如 `":7443"` |
| `admin_listen` | 后台单独监听,如 `"127.0.0.1:7444"`;空表示后台与端共用 `listen` |
| `tls.cert_file` / `tls.key_file` | 证书与私钥路径;空表示明文 |
| `tls.allow_plaintext` | 配了证书时是否仍接受明文;生产建议 `false` |
| `trusted_proxies` | 可信反向代理网段,用于解析真实客户端 IP |
| `data_dir` | 数据目录(库文件、`listen.addr`、迁移备份) |
| `limits.*` | 正文/帧大小、TTL、群人数、宽限、确认超时、配额等;`max_body_bytes` 只能调小,上限 262144 |
| `session_idle_days` | 会话令牌闲置失效天数;`0` 不失效 |
| `record_retention_days` | 完成后消息记录保留天数;`0` 表示完成后不留记录 |
| `idempotency_hours` | 防重窗口 |
| `receipt_retention_days` | 回执保留天数 |
| `sqlite_synchronous` | `FULL` 或 `NORMAL` |
| `metrics.token` | 共用端口时访问 `/metrics` 所需 Bearer 令牌;空则共用端口不提供 `/metrics` |
| `log.level` | 日志级别,如 `info` |
注册开关、注册安全码、API 令牌存在数据库,在管理后台修改,不在配置文件里。
校验配置:`nixmsg check-config`。
## 2. 目录布局
```text
config.yaml
data/nixmsg.db
data/backup/ # 迁移前自动备份、手工 backup 也可写到这里
data/listen.addr # serve 写入实际监听地址(测试用端口 0 时需要)
```
Docker 约定:配置 `/etc/nixmsg/config.yaml`,数据 `/data`,证书 `/certs`(只读挂载)。
## 3. 备份
程序不做定时备份,用 cron 或 1Panel 计划任务调用:
```bash
# 宿主机(服务可在运行中)
NIXMSG_CONFIG=/path/to/config.yaml nixmsg backup --out /path/to/data/backup/manual-$(date +%Y%m%d).db
# Docker Compose
docker compose -f deploy/docker-compose.yml exec nixmsg /nixmsg backup --out /data/backup/manual.db
```
备份文件含当时未送完的正文,按敏感数据保管。旧备份自行清理。
恢复:停服务,用备份文件替换 `data/nixmsg.db`(或拷到新 `data_dir`),再启动;勿在半迁移状态硬切。
## 4. 升级与自动迁移
1. 换上新二进制或拉新镜像。
2. 启动时若有未应用的嵌入迁移版本,会先 `VACUUM INTO` 到
`<data_dir>/backup/pre-migrate-<UTC时间>.db`,再执行迁移。
3. 迁移失败则进程退出,不带半新半旧库继续服务;运维可从备份恢复后排查。
4. 空库首次建表不会产生迁移前备份。
无需手工跑迁移命令。
## 5. 证书与 1Panel
程序只读证书文件,不做 ACME。装有 1Panel 时:
1. 在 1Panel 证书管理申请证书(DNS 或 HTTP 验证),打开自动续签。
2. 勾选「推送证书到本地目录」,例如 `/opt/nixmsg/certs`。申请与续签后写入 `fullchain.pem`、`privkey.pem`。
3. 配置:
```yaml
tls:
cert_file: /opt/nixmsg/certs/fullchain.pem
key_file: /opt/nixmsg/certs/privkey.pem
allow_plaintext: false
```
4. 私钥须让 NixMsg 进程可读。Docker 容器用户为 nonroot(uid `65532`);可在 1Panel「申请证书后执行脚本」里调整属主/权限。
5. 程序每小时检查文件修改时间,续签后新连接自动用新证书,已有连接不断开。
不要用 1Panel OpenResty 终止 TLS 再转发裸 TCP:TCP/UDP 代理不做 TLS,设备会被拆端口。仅当全部端走 WebSocket 时,才可改成「OpenResty 终止 HTTPS/WSS,NixMsg 本机明文」;此时配置 `trusted_proxies`,并设置 `proxy_http_version 1.1`、`Upgrade`、`Connection`,`Host` 用 `$http_host`。
## 6. 服务器时钟
- 开启 NTP 对时。
- 服务器时钟被人为大改时,定时消息按新时钟触发。
- 宽限、确认超时、会话闲置等也依赖系统时间。
## 7. 抓取 `/metrics`
Prometheus 文本格式,只含计数和耗时,不含正文与编号明细。
- **后台单独监听**(`admin_listen` 非空):在后台端口直接
`GET http://<admin_host>:<port>/metrics`,无需令牌。
- **共用端口**:请求头必须带 `Authorization: Bearer <metrics.token>`。
- 未配置 `metrics.token` → `404`
- 令牌错误 → `401`
示例(共用端口且已配置 token;勿把真实令牌写进仓库或脚本提交):
```bash
curl -sS -H "Authorization: Bearer $NIXMSG_METRICS_TOKEN" http://127.0.0.1:7443/metrics
```
健康检查:`GET /healthz`、`GET /readyz`(Docker HEALTHCHECK 用镜像内 `/nixmsg healthcheck`)。
## 8. Docker 要点
- 镜像:`git.asio.asia/nixevol/nixmsg`(版本标签与 `latest`)。
- Compose 示例:[deploy/docker-compose.yml](../deploy/docker-compose.yml)。
- 容器以 uid `65532` 运行:挂载数据目录须可写;命名卷首次可
`docker run --rm -v <卷名>:/data busybox chown -R 65532:65532 /data`。
- 首次:`docker compose run --rm nixmsg admin init`,再 `up -d`。
- 构建/推送 Task 目标见根目录 README(`q:docker-build` / `q:docker-push` / `q:docker-buildx`)。正式仓库推送在阶段 3。
## 9. 验收与仍跳过的长时项
F01–F23 短时间验收对照表见 [test/accept/ACCEPTANCE.md](../test/accept/ACCEPTANCE.md)(汇总通过 23,失败 0,未测 0)。下列因环境或时长限制**未测**,不得宣称已通过:
- F03:1000 端全表 1 秒内返回、真拔网线后心跳超时离线
- F08 / Q3:Linux netem 20% 丢包(本机 Windows)
- 压测:1000 连接保持 10 分钟、每秒 200 条
F22 通过的子集仅覆盖 init + 健康检查等;备份恢复、升级迁移、证书重载、Docker 全量、`/metrics` 抓取等仍见对照表备注。