服务端运行时配置¶
本文说明配置来源、发布接口、生效规则与多实例限制。
配置来源与边界¶
启动链路、密钥和本机资源仍由 config.toml 提供,包括监听地址与请求体上限、数据库连接、TLS、日志、模板/前端/MaxMind 路径、Elasticsearch 和 pgBackRest 配置。SMTP 等既有设置仍沿用原有存储和接口。
运行策略保存到 PostgreSQL 的 runtime_configuration,进程读取经过校验的内存快照:
| namespace | 首次初始化来源 | 管理入口 |
|---|---|---|
general |
内置默认值 | 常规设置中的系统时间配置 |
requests |
TOML [requests] |
运行时配置 → 请求日志 |
monitor |
TOML [monitor] |
运行时配置 → 健康监控 |
automatic_target |
TOML [automatic_target] |
运行时配置 → 自动目标 |
dns_follow_up |
TOML [dns_follow_up] |
运行时配置 → DNS 后续任务 |
dns_resolvers |
内置默认值 | 运行时配置 → DNS 服务器 |
analytics_snapshot |
TOML [analytics_snapshot] |
运行时配置 → 分析快照 |
report_mail |
TOML [report_mail],默认关闭图片 |
运行时配置 → 报告邮件 |
数据库中已有的配置不会被启动时的 TOML 覆盖。文件中的这些策略段只在对应数据库记录缺失时作为种子;修改文件并重启不能替代发布运行时配置。启动时仍会校验 TOML,文件必须保持合法。
当前首次初始化会沿用 TOML 的启用状态。 automatic_target 和 dns_follow_up 没有额外的“首次强制禁用”步骤;部署前应检查文件中的开关和授权范围。希望管理员确认后才开启时,应先在 TOML 中禁用,再通过管理页面发布。
初始化、持久化与失败行为¶
- 启动时连接数据库、初始化 schema,再加载运行时配置。
- 当前表缺失记录时使用种子插入,
ON CONFLICT DO NOTHING保留已有配置,并补存初始修订历史。 - 当前配置保存在
runtime_configuration,修订文档保存在runtime_configuration_revision。发布时在同一事务内更新当前文档、递增 revision 并插入历史。 - 保存前按配置域解析并校验完整 document。
expectedRevision不匹配返回 HTTP 409;客户端重新读取后再保存,响应不附带当前 revision。 - 成功发布后替换当前进程的内存快照,再单独写入操作审计。配置事务与审计写入不是同一事务;审计记录包含配置域、revision 和变更原因。
数据库配置反序列化或校验失败时:automatic_target、dns_follow_up 和 dns_resolvers 回退到各自内置默认值;requests、monitor 和 analytics_snapshot 回退到启动时的 TOML 值,并记录警告。general 无效时启动加载报错,避免使用不确定的业务时区。数据库连接或 SQL 加载失败会使启动失败,不会绕过数据库继续运行。
API 与权限¶
当前提供:
GET /api/config/runtime/{namespace}:读取当前 document 和 revision。POST /api/config/runtime/{namespace}:发布完整配置文档。
接口要求管理员身份,并沿用现有登录与 CSRF 保护。发布请求采用 camelCase:
{
"expectedRevision": 12,
"document": { "enabled": true, "retention_days": 30 },
"changeReason": "调整请求日志保留期"
}
上例用于 requests 域;其他域应先读取当前完整 document,再修改所需字段。成功响应的 data 包含 namespace、新 revision 和 document。未知配置域返回 404,非法参数或配置返回 400,版本冲突返回 409。
当前没有修订历史查询或回滚 HTTP API。修订表已保存历史,但不能将尚未实现的 /revisions、/rollback/{revision} 地址作为可用接口。
生效与多实例限制¶
发布成功后,处理请求的进程立即替换配置快照。请求日志、自动目标、DNS 后续任务和分析快照由相应处理路径或后台循环读取;新策略按这些路径的读取时机生效。监控发布还会更新 MonitorHandle,慢 SQL 循环在下一轮读取新配置,已开始的等待不会被立即中断。
general 另有每 5 秒刷新数据库的后台循环。其他运行策略目前没有通用的 15 秒 revision 轮询,也没有 PostgreSQL NOTIFY 同步机制。多实例部署时不能假定一次发布会自动同步所有实例;其他实例需重新启动加载数据库中的配置。直接修改数据库也不会立即更新这些域的进程内快照。
扫描器运行配置¶
扫描器运行参数是另一套独立配置,按扫描器保存到 scanner_runtime_configuration 及其修订表,不属于上面的全局 namespace:
GET /api/scanner/{scanner_id}/configuration:管理员读取配置及应用状态。PUT /api/scanner/{scanner_id}/configuration:管理员发布扫描器配置。GET /api/scanner/runtime-config?scannerid={scanner_id}:扫描器使用运行凭据获取下发文档。
前端入口是 /scanner/{id}/configuration。本地部署开关、速率限制和任务边界应用规则见扫描器仓库的 docs/MAINTENANCE.md“本地部署配置与远程运行配置”。
report_mail 在每次报告生成时读取数据库权威文档,读取该配置接口也刷新本实例快照;多实例无需重启即可在新报告中使用已发布配置。归档邮件与图片不会随配置变化而改写。详见 报告邮件。
报表渲染模块选择¶
report_renderer 是模块管理服务使用的独立 namespace,复用 runtime_configuration 和修订表。它通过 GET/POST /api/modules/report-render 管理,不属于通用运行配置保存接口。默认使用 builtin,已发布选择在启动时恢复,并每五秒刷新;制品缺失或校验失败不会替换活跃实现。完整制品部署与版本切换见模块实现。