跳转至

脚本库(NFOS Script Library)

本页由 deploy/nfos/scripts-index.json 自动生成,请勿手工编辑;重新生成:python .scratch/build-script-index.py && python .scratch/build-docs-index.py。

0. 这个"脚本库"是什么

平台功能文档 docs/specs/spec-hub.txt 第 6 章把「脚本库」定义为资源仓库(hub.nfarms.cn)下的脚本托管能力:多语言脚本托管、在线编辑、沙箱预览、版本控制、安全评估。

本仓库落地时采用的是最小可用形态 A:文件清单 + 页面,而不是在 nfarmsd 里新加表与路由。理由:

  1. 线上 nfarmsd 没有 scripts / assets / registry 一类表或路由(实测 GET /api/hub/scripts = 404,GET /api/scripts = 404);
  2. 选 B(加表 + 只读路由)需要重建并替换正在运行的二进制,属于额外风险;
  3. hub 站点的静态根就是 /opt/Cy/nfarms/hub,把脚本与 scripts-index.json 放进去天然与前端同源,下载无需新增接口。

因此:

层 位置
清单(生成物) 仓库 deploy/nfos/scripts-index.json;线上 /opt/Cy/nfarms/hub/scripts/scripts-index.json
脚本正文 仓库 deploy/nfos/**、deploy/nfos/tools/**、deploy/nfarms-scripts/**;线上 /opt/Cy/nfarms/hub/scripts/<basename>
页面 hub 站「脚本库」→ 仓库脚本(真实) 标签页(读同源清单,支持检索/分组/CSV/下载)
备份 覆盖前把上一版 hub/scripts 归档到 /opt/Cy/nfarms/.backup/hub-scripts-prev-<ts>/

hub 站点整体有统一登录门禁(auth_request /__auth),未登录访问 /scripts/** 返回 401 属预期。因此校验静态件一致性要看 sha256,不要看状态码 —— 该站 location / 含 try_files $uri $uri/ /index.html 的 SPA 回落。

1. 清单快照

项 值
生成时间 2026-09-28 08:06:58 +0800
脚本总数 138
元数据来源 人工核对源码 59 / 自动提取 79
生成器 .scratch/build-script-index.py

meta_source=auto 的条目其「用途 / 入口参数 / 依赖」由脚本头部注释与 import 自动提取,未逐字人工核对,不作为参数依据。 需要参数时以脚本源码与本页的独立页面为准。

2. 脚本总览

列含义:触发方式 timer 表示由 systemd 定时器调度(括号内为定时器名),「手动」表示需人工执行;可 dry-run 表示提供 --dry-run/-n/只读模式;文档 指向独立用法页。

2.1 监控与通知(9)

脚本 用途 语言 入口参数 触发方式 需 root 可 dry-run 文档
告警桥接器
deploy/nfos/monitoring/alert-adapter.py
把 Alertmanager v4 webhook 载荷映射为 nfarmsd 统一告警 python3 alert-adapter.py(无 CLI 参数;监听地址与后端经 ADAPTER_LISTEN_HOST/PORT、NFARMSD_API 等环境变量) 手动 否 否 有
告警地址计数增强
deploy/nfos/monitoring/alert-enrich.py
为告警 plan 补充来源/目的地址、公网标记与同类计数 python3 alert-enrich.py [--alerts-file ] [--hit ] [--host <主机名>] [--window N] [--selftest] 手动 否 否 有
安全告警自动处置
deploy/nfos/monitoring/auto-respond.py
逐条评估安全告警并当场处置(封 IP / 杀进程 / 隔离载荷) python3 | auto-respond.py [--dry-run] [--announce] [--max-actions N] [--allow-private] [--unblock ] [--nft-teardown] [--list] 手动 是 是 有
双档告警汇总通报
deploy/nfos/monitoring/digest.py
按 1h/12h 双档窗口汇总告警并渲染通报,另支持四类专项日报 python3 digest.py [--window {1h,12h}] [--report {daily-alerts,attack,tickets,libs}] [--rolling] [--dry-run] [--selftest] timer:nfos-digest-hourly.timer、nfos-digest-12h.timer、nfos-report-attack.timer、nfos-report-daily-alerts.timer、nfos-report-libs.timer、nfos-report-tickets.timer 是 是 有
统一通知渠道
deploy/nfos/monitoring/notify.py
把统一告警分发到飞书机器人与 SMTP 邮件(零第三方依赖) python3 notify.py [--test] # 无参时只打印渠道配置;主要用途是被同目录脚本 import timer:nfos-ticket-notify.timer 否 否 有
出站文本脱敏
deploy/nfos/monitoring/sanitize.py
统一脱敏所有出站告警文本,且保留可研判判据 python3 sanitize.py [--selftest] [--text <文本>] [--stdin] [--file <文件>] [--json] 手动 否 否 有
安全告警分发
deploy/nfos/monitoring/sec-notify.py
把安全告警按规则路由推送到飞书安全群与安全邮箱 python3 sec-notify.py --level {critical,high,warning,info} --name <名> [--resource <资源>] [--alarm-id ] [--content <正文>] [--dry-run] [--selftest] 手动 否 是 有
工单状态通知
deploy/nfos/monitoring/ticket-notify.py
轮询工单接口,对新开单与状态转变发送邮件/飞书通知 python3 ticket-notify.py [--api ] [--state <文件>] [--limit N] [--dry-run] [--seed-only] [--self-test] timer:nfos-ticket-notify.timer 是 是 有
TimescaleDB 指标导出
deploy/nfos/monitoring/timescale-metrics.sh
导出 TimescaleDB 分区/压缩/连续聚合/保留策略指标供 textfile 采集 bash timescale-metrics.sh(无参数) 手动 是 否 —

2.2 运维与安全(97)

脚本 用途 语言 入口参数 触发方式 需 root 可 dry-run 文档
超管口令轮换
deploy/nfos/admin-password-rotate.sh
按日期规则派生超管口令并经接口自动轮换 bash admin-password-rotate.sh [--status] [--dry-run] [--force] [--for ] timer:nfos-admin-password.timer 是 是 —
云安全告警处置
deploy/nfos/aegis-whitelist.sh
处置云安全中心告警:列表/详情/加白(误报)/忽略/已处理 bash aegis-whitelist.sh {check|list|get |misreport|ignore|handled |guide} [--level <级>] [--pagesize N] 手动 是 否 —
告警链路自检
deploy/nfos/alert-selftest.sh
每日自检告警全链路(7 项)并维护死信开关心跳 bash bash alert-selftest.sh [--quiet] [--json] [--no-inject] [--timeout=N] [-h|--help] timer:nfos-alert-selftest.timer 是 否 —
陈旧告警回收
deploy/nfos/alert-sweep.py
回收守卫已不再跟踪的孤儿安全告警,解除告警数阈值卡死 python3 alert-sweep.py [--apply] [--dry-run] [--grace N] [--max N] [--db <库>] [--state <文件>] [--log <文件>] [--api ] [--selftest] timer:nfos-alert-sweep.timer 是 是 有
每日备份
deploy/nfos/backup-daily.sh
每日备份日志/配置/数据库到本地并按校验清单自检 bash sudo bash backup-daily.sh [--dry-run|-n] [--keep N] [--no-secondary] [--help|-h] timer:nfos-backup.timer 是 是 有
证书自动续期
deploy/nfos/cert-renew.sh
用 acme.sh + HTTP-01 为 9 个域名签发/续期并部署证书 bash bash cert-renew.sh {check|staging|issue|renew|install-timer|rollback <备份目录>} 手动 是 否 —
证书同步与告警
deploy/nfos/cert-sync.sh
扫描权威证书目录,登记证书并按规则生成/恢复安全告警 bash sudo bash cert-sync.sh [--quiet] [--dry-run|-n] [--force-report] [--no-fix-cert-dir] 手动 是 是 —
告警链路体检
deploy/nfos/check-pipeline.sh
按六道关逐项判断告警/MQ 链路当前是否可信任 bash sudo bash check-pipeline.sh [--json] 手动 是 否 有
冗余残留清理
deploy/nfos/cleanup-obsolete.sh
清理 NFOS 合并后的冗余残留并修复 nginx 日志轮转配置 bash bash cleanup-obsolete.sh [--dry-run|-n] [-h|--help] 手动 是 是 —
var/tmp 残留清理
deploy/nfos/cleanup-vartmp.sh
清理 /var/tmp 构建/冒烟残留并清理 dnf 缓存 bash bash cleanup-vartmp.sh(无参数) 手动 是 否 —
deploy-auth-backend.sh
deploy/nfos/deploy-auth-backend.sh
部署带统一登录端点的 nfarmsd,并逐个验证新端点 bash deploy-auth-backend.sh 手动 — — —
deploy-frontend-empty-page-fix.template.sh
deploy/nfos/deploy-frontend-empty-page-fix.template.sh
修复"整站没有可见页面"(前端各平台无内容)—— 部署已重排脚本顺序的 index.html、 bash deploy-frontend-empty-page-fix.template.sh 手动 — — —
deploy-frontend-login-fix.template.sh
deploy/nfos/deploy-frontend-login-fix.template.sh
前端登录页布局塌陷修复:部署 nf.css(含 .nf-app-login 覆盖)与带版本参数的 HTML bash deploy-frontend-login-fix.template.sh 手动 — — —
nfarmsd 二进制部署
deploy/nfos/deploy-nfarmsd-binary.sh
部署 nfarmsd 二进制,带备份/回滚与逐项接口验收 bash sudo bash deploy-nfarmsd-binary.sh(无参数) 手动 是 否 —
乱码根因排查
deploy/nfos/diag-mojibake.sh
排查乱码根因:非法 UTF-8 与双重编码(UTF-8 字节被当 GBK 解码) bash bash diag-mojibake.sh(无参数) 手动 否 否 —
fix-alerts-primary.sh
deploy/nfos/fix-alerts-primary.sh
消除四条活动告警的根因修复(主节点侧) bash fix-alerts-primary.sh 手动 — — —
fix-alerts-secondary.sh
deploy/nfos/fix-alerts-secondary.sh
消除 SiteResponseSlow / 自检两条告警的根因修复(次节点侧) bash fix-alerts-secondary.sh 手动 — — —
放行站点图标
deploy/nfos/fix-favicon-auth.py
给 /favicon.ico 加精确匹配 location,使其不参与统一登录门禁 python3 sudo python3 fix-favicon-auth.py [--check] 手动 是 否 —
官网图标修复
deploy/nfos/fix-favicon.sh
修复官网 favicon 404:把可用的 png 放到引用路径并改引用 bash sudo bash fix-favicon.sh(无参数) 手动 是 否 —
nginx charset 修复
deploy/nfos/fix-nginx-charset.sh
让 .js/.css/.json 响应显式带 charset=utf-8,消除前端乱码 bash sudo bash fix-nginx-charset.sh(无参数) 手动 是 否 —
fix-secondary-nginx-logs.sh
deploy/nfos/fix-secondary-nginx-logs.sh
次节点 nginx 日志路径修复(真实缺陷) bash fix-secondary-nginx-logs.sh 手动 — — —
fix-secondary-nginx-root.sh
deploy/nfos/fix-secondary-nginx-root.sh
次节点 nginx catch-all 收尾 bash fix-secondary-nginx-root.sh 手动 — — —
前端全量部署
deploy/nfos/full-frontend-deploy.sh
前端全量部署:MCP SPA 补齐 + 统一登录页 + 门禁感知校验 bash sudo bash full-frontend-deploy.sh 手动 是 否 —
gen-embed.ps1
deploy/nfos/gen-embed.ps1
gen-embed.ps1 -- expand "#EMBEDS" in a template bash script into base64 payload writes. powershell & .scratch\gen-embed.ps1 -Template .scratch\x.template.sh -Out .scratch\x.sh ` 手动 — — —
WAF 配置生成
deploy/nfos/gen-waf-from-libs.py
从 signature-library.yml 生成 nginx 原生 WAF 拦截配置 python3 gen-waf-from-libs.py [--apply] [--mode {log,block}] [--wire] [--dry-wire] 手动 是 是 —
账户页面路由安装
deploy/nfos/install-account-pages.sh
安装统一登录页与个人主页 nginx 路由(v3) bash sudo bash install-account-pages.sh(无参数) 手动 是 否 —
证书运维授权
deploy/nfos/install-cert-ops-sudoers.sh
给 nfarms 服务账户授予证书运维脚本的免密 sudo 规则 bash sudo bash install-cert-ops-sudoers.sh(无参数) 手动 是 否 —
证书审计定时器安装
deploy/nfos/install-cert-sync-timer.sh
安装证书每日审计与安全告警的 systemd 单元 bash sudo bash install-cert-sync-timer.sh(无参数) 手动 是 否 —
汇总定时器安装
deploy/nfos/install-digest-timers.sh
安装 sanitize/digest 脚本与每小时、12 小时汇总定时器 bash sudo bash install-digest-timers.sh [--from-dir <目录>] [--dry-run] [--rollback] 手动 是 是 —
登录页路由安装
deploy/nfos/install-login-page.sh
安装统一登录页 nginx 路由(v2,带“确实写进去了”自校) bash sudo bash install-login-page.sh(无参数) 手动 是 否 —
logrotate 调度安装
deploy/nfos/install-logrotate-timer.sh
补齐主节点 logrotate 的 systemd 调度(此前完全没有调度) bash sudo bash install-logrotate-timer.sh(无参数) 手动 是 否 —
互监测告警规则安装
deploy/nfos/install-mutual-alerts.sh
向次节点 Prometheus 追加 nfos_probe_* 互监测告警规则 bash sudo bash install-mutual-alerts.sh(无参数;在次节点执行) 手动 是 否 —
互监测探针安装
deploy/nfos/install-probe.sh
安装并首跑互监测探针(主/次节点同款) bash sudo bash install-probe.sh(无参数) 手动 是 否 —
探针采集作业安装
deploy/nfos/install-prometheus-probe-job.sh
安装含 nfos_probe 采集作业的 prometheus.yml 并 reload bash sudo bash install-prometheus-probe-job.sh(无参数) 手动 是 否 —
安全控制台落盘
deploy/nfos/install-security-console.template.sh
落盘安全防线控制台组件(三库写入口/云告警处置/令牌) bash sudo bash install-security-console.template.sh(无参数) 手动 是 否 —
安全防线安装
deploy/nfos/install-security-guard.sh
安装三库、检测引擎、每分钟 timer 与审计加固 bash sudo bash install-security-guard.sh(无参数) 手动 是 否 —
时间源安装
deploy/nfos/install-time-service.py
让主节点对外提供 HTTPS 对时端点与 chrony NTP 服务 python3 sudo python3 install-time-service.py [--check] [--no-ntp] 手动 是 否 —
统一登录门禁安装
deploy/nfos/install-unified-login.sh
给受保护站点 443 server 加 nginx 服务端统一登录门禁 bash sudo bash install-unified-login.sh(无参数) 手动 是 否 —
三库运维助手
deploy/nfos/lib-ops.sh
特征/规则/模板三库的唯一写入口,经 stdin JSON 读写校验与同步 bash lib-ops.sh [--check-sqlite|--sync-sqlite] # 库操作经 stdin JSON:summary/read/get/validate/create/update/delete/policy_update/apply/rollback 手动 是 否 有
系统日志异常审计
deploy/nfos/log-audit.py
每日审计系统日志异常(OOM/IO/崩溃/爆破等)并上报安全告警 python3 log-audit.py [--since ''] [--dry-run] [--json] [--recency-minutes N] timer:nfos-log-audit.timer 是 是 有
三库迁移 SQLite
deploy/nfos/migrate-libs-to-sqlite.py
把三库与全局策略从 YAML 迁移到 SQLite 并独立校验幂等 python3 migrate-libs-to-sqlite.py [--libs-dir <目录>] [--db <库>] [--lib-ops <脚本>] [--expect <基线>] [--strict] [--check] [--once] 手动 是 否 有
phase-r1-reorg.sh
deploy/nfos/phase-r1-reorg.sh
NFarms 主节点目录规范重构(Phase R1) bash phase-r1-reorg.sh 手动 — — —
phase-r2-nginx.sh
deploy/nfos/phase-r2-nginx.sh
NFarms 主节点 Nginx 配置生成(Phase R2) bash phase-r2-nginx.sh 手动 — — —
phase10-acme-patch.py
deploy/nfos/phase10-acme-patch.py
为缺少 ACME 挑战 location 的 80 端口 server 块补齐 HTTP-01 支持。 python3 phase10-acme-patch.py 手动 — — —
phase10-acme-patch2.py
deploy/nfos/phase10-acme-patch2.py
为缺少 ACME HTTP-01 支持的 80 端口 server 块补齐校验路径(修正版)。 python3 phase10-acme-patch2.py 手动 — — —
phase10-nginx-auth-hardening.sh
deploy/nfos/phase10-nginx-auth-hardening.sh
NFOS Phase 10:公开入口零信任身份头清洗(高危漏洞修复) bash phase10-nginx-auth-hardening.sh 手动 — — —
phase11-ai-engine.sh
deploy/nfos/phase11-ai-engine.sh
NFOS 落地 Phase 11 — AI 分析引擎部署与验收(次节点) bash phase11-ai-engine.sh 手动 — — —
phase11-dir-hygiene.sh
deploy/nfos/phase11-dir-hygiene.sh
NFOS Phase 11:目录与日志归位(主节点) bash phase11-dir-hygiene.sh <子命令>(见脚本内 usage) 手动 — — —
phase11b-secondary-hygiene.sh
deploy/nfos/phase11b-secondary-hygiene.sh
NFOS Phase 11b:次节点目录与日志归位 bash phase11b-secondary-hygiene.sh 手动 — — —
证书统一归位
deploy/nfos/phase12-cert-consolidate.sh
把全部证书/私钥/acme 库/备份收敛到单一权威目录 /opt/Cy/certs bash sudo bash phase12-cert-consolidate.sh [--dry-run|-n] 手动 是 是 —
phase12-notification.sh
deploy/nfos/phase12-notification.sh
NFarms 统一通知渠道落地(次节点) bash phase12-notification.sh 手动 — — —
文档发布知识库
deploy/nfos/phase12b-publish-docs.sh
把脱敏版《核心通知渠道文档》发布到公开知识库 bash sudo bash phase12b-publish-docs.sh(无参数) 手动 是 否 —
phase14-alert-selftest-install.sh
deploy/nfos/phase14-alert-selftest-install.sh
NFOS Phase 14 — 告警链路自检看门狗安装(幂等) bash phase14-alert-selftest-install.sh <子命令>(见脚本内 usage) 手动 — — —
phase2-data-layer.sh
deploy/nfos/phase2-data-layer.sh
NFOS 落地 Phase 2 — 数据层部署(腾讯云次节点) bash phase2-data-layer.sh 手动 — — —
phase2b-verify.sh
deploy/nfos/phase2b-verify.sh
NFOS 落地 Phase 2b — 修正 HealthCmd 引号 + 数据层完整验收 bash phase2b-verify.sh 手动 — — —
phase2c-nats-verify.sh
deploy/nfos/phase2c-nats-verify.sh
NFOS 落地 Phase 2c — NATS 参数修正 + 数据层端到端验收 bash phase2c-nats-verify.sh 手动 — — —
phase5a-desktop-teardown.sh
deploy/nfos/phase5a-desktop-teardown.sh
NFOS 落地 Phase 5a — 次节点桌面负载下线(释放约 1.6G 内存) bash phase5a-desktop-teardown.sh 手动 — — —
phase5b-health-and-tuning.sh
deploy/nfos/phase5b-health-and-tuning.sh
NFOS 落地 Phase 5b — 修复容器 healthcheck + 按 docs 恢复 TimescaleDB 内存调优 bash phase5b-health-and-tuning.sh 手动 — — —
nfarmsd 服务层部署
deploy/nfos/phase6-nfarmsd-deploy.sh
Phase 6 nfarmsd 服务层部署(端口/单元/账号/布局对齐) bash sudo bash phase6-nfarmsd-deploy.sh(无参数) 手动 是 否 —
phase7-nginx-align.py
deploy/nfos/phase7-nginx-align.py
NFOS 接口层对齐:把主节点 nginx 反代从遗留的 8080 切到规范端口 9990/9991。 python3 phase7-nginx-align.py 手动 — — —
phase7-nginx-align.sh
deploy/nfos/phase7-nginx-align.sh
NFOS 落地 Phase 7 — 接口层对齐(主节点) bash phase7-nginx-align.sh 手动 — — —
phase7b-nfarmsd-verify.sh
deploy/nfos/phase7b-nfarmsd-verify.sh
NFOS 落地 — nfarmsd 完整验收(含零信任 RBAC 越权反例) bash phase7b-nfarmsd-verify.sh 手动 — — —
phase7c-vpn-gateway-test.py
deploy/nfos/phase7c-vpn-gateway-test.py
NFOS 零信任 VPN 网关实测(vpn-Modules 认证骨架) python3 phase7c-vpn-gateway-test.py 手动 — — —
phase8a-monitor-tunnel.sh
deploy/nfos/phase8a-monitor-tunnel.sh
NFOS 落地 Phase 8a — 监控反向隧道(次节点 → 主节点) bash phase8a-monitor-tunnel.sh 手动 — — —
phase8b-monitoring.sh
deploy/nfos/phase8b-monitoring.sh
NFOS 落地 Phase 8b — 监控层部署(次节点 43.156.170.157) bash phase8b-monitoring.sh 手动 — — —
phase8c-aliyun-node-exporter.sh
deploy/nfos/phase8c-aliyun-node-exporter.sh
NFOS 落地 Phase 8c — 主节点 node_exporter(Quadlet)+ 监控隧道扩展到 9100 bash phase8c-aliyun-node-exporter.sh 手动 — — —
phase8d-monitoring-verify.sh
deploy/nfos/phase8d-monitoring-verify.sh
NFOS 落地 Phase 8d — 消除 9100 端口冲突 + 监控层端到端验收 bash phase8d-monitoring-verify.sh 手动 — — —
phase8e-monitoring-fix.sh
deploy/nfos/phase8e-monitoring-fix.sh
NFOS 落地 Phase 8e — 修正容器内可达性 + 桥接器 bug + 端到端复验 bash phase8e-monitoring-fix.sh 手动 — — —
phase8f-monitoring-finalize.sh
deploy/nfos/phase8f-monitoring-finalize.sh
NFOS 落地 Phase 8f — 收口修正并完成监控层端到端验收 bash phase8f-monitoring-finalize.sh 手动 — — —
phase9-standby-channel.sh
deploy/nfos/phase9-standby-channel.sh
NFOS 落地 Phase 9 — 高可用:次节点同构 standby 通道(容器化) bash phase9-standby-channel.sh 手动 — — —
phase9-tunnel-hardening.sh
deploy/nfos/phase9-tunnel-hardening.sh
NFOS Phase 9:跨云链路与告警误报加固 bash phase9-tunnel-hardening.sh <子命令>(见脚本内 usage) 手动 — — —
phase9b-standby-verify.sh
deploy/nfos/phase9b-standby-verify.sh
NFOS 落地 Phase 9b — standby 通道收口 + 跨通道 HA 验证 bash phase9b-standby-verify.sh 手动 — — —
phase9c-cross-channel.sh
deploy/nfos/phase9c-cross-channel.sh
NFOS 落地 Phase 9c — 跨通道 HA 正确验证 + standby 口令对齐 bash phase9c-cross-channel.sh 手动 — — —
phase9d-finalize.sh
deploy/nfos/phase9d-finalize.sh
NFOS 落地 Phase 9d — standby 口令对齐 + 验收数据清理 + 最终状态固化 bash phase9d-finalize.sh 手动 — — —
互监测探针
deploy/nfos/probe-node.sh
主次节点互相探测各服务存活并输出 Prometheus 指标 bash probe-node.sh [--quiet] 手动 是 否 —
版本发布物收集
deploy/nfos/release-collect.sh
收集可交付、可校验且不含凭据的版本快照到主节点本地 bash sudo bash release-collect.sh [] [--version=<版本>] [--force] [--with-images] [--dry-run|-n] 手动 是 是 —
安全检测引擎
deploy/nfos/security-guard.sh
读三库执行安全检测,上报统一告警并串联自动处置 bash security-guard.sh [--dry-run] [--verbose|-v] [--baseline] [--forensics ] [--list] [--help|-h] 手动 是 是 —
证书告警链实测
deploy/nfos/test-cert-alert-chain.sh
投放自签探针证书,实测证书告警到自动恢复的链路 bash bash test-cert-alert-chain.sh(无参数) 手动 是 否 —
安全检出正向实测
deploy/nfos/test-security-detection.sh
受控投放真实威胁形态,验证特征库到工单恢复全链路 bash bash test-security-detection.sh(无参数) 手动 是 否 —
传感器系统实测
deploy/nfos/test-sensor-system.sh
传感器探测系统实测 v2(每步硬超时,避免整体卡死) bash bash test-sensor-system.sh(无参数) 手动 是 否 —
工单积压核销
deploy/nfos/ticket-cleanup.py
按证据批量核销历史积压工单,并保留可回滚清单 python3 ticket-cleanup.py [--db <库>] [--apply] [--dry-run] [--rollback ] [--selftest] 手动 是 是 有
备份链路实测
deploy/nfos/verify-backup-e2e.sh
直接触发备份单元并验证三类归档真的产出 bash bash verify-backup-e2e.sh(无参数) 手动 是 否 —
证书运维验收
deploy/nfos/verify-cert-ops.sh
验收控制台证书按钮:按名调用、权限反例与幂等复核 bash bash verify-cert-ops.sh(无参数) 手动 否 否 —
通知渠道验证
deploy/nfos/verify-notification-channels.py
验证 SMTP/飞书渠道连通性与发信凭据并实发测试邮件 python3 python3 verify-notification-channels.py(无 CLI 参数;凭据与收件人经 SMTP_HOST/MAIL_PW/FEISHU_HOOK/TRAP_TO/TRAP_CC/SEND_TEST_MAIL 环境变量) 手动 否 否 —
verify-objective-final-secondary.sh
deploy/nfos/verify-objective-final-secondary.sh
目标总验收 —— 次节点侧(互补主节点脚本无法覆盖的部分) bash verify-objective-final-secondary.sh 手动 — — —
verify-objective-final.sh
deploy/nfos/verify-objective-final.sh
目标总验收:互监测 / 传感器系统 / 八站点 / 统一登录 bash verify-objective-final.sh 手动 — — —
verify-platform-final.sh
deploy/nfos/verify-platform-final.sh
平台终检:online / console 管理能力 + 计时器编排 + 唯一目录 + 备份 bash verify-platform-final.sh 手动 — — —
verify-print-agent-e2e.sh
deploy/nfos/verify-print-agent-e2e.sh
打印代理端到端验收(真平台 + 真渲染 + 真落盘) bash verify-print-agent-e2e.sh 手动 — — —
verify-print-jobs.sh
deploy/nfos/verify-print-jobs.sh
打印任务队列(标签纸 / 小票)功能验收 bash verify-print-jobs.sh 手动 — — —
公网API验收
deploy/nfos/verify-public-api.sh
经 nginx 公网路径(https://nfarms.cn/api/*)验收本轮新接口 bash bash verify-public-api.sh(无参数) 手动 是 否 —
verify-r7-functional.sh
deploy/nfos/verify-r7-functional.sh
功能验收:账户自助(注册/个人主页/2FA)+ 三库管理 + 云安全事件接入 bash verify-r7-functional.sh 手动 — — —
verify-resource-charset.sh
deploy/nfos/verify-resource-charset.sh
终验:带会话按"浏览器视角"取各平台首页与其首个 JS,检查 charset 声明与中文解码 bash verify-resource-charset.sh 手动 — — —
verify-round5-final.sh
deploy/nfos/verify-round5-final.sh
本轮总验收:互监测 / 统一登录 / 安全防线 / 平台站点 bash verify-round5-final.sh 手动 — — —
verify-secondary.sh
deploy/nfos/verify-secondary.sh
次节点对照核查:证书唯一目录 / 日志唯一目录 / 新增计时器连通性 bash verify-secondary.sh 手动 — — —
站点入口验收
deploy/nfos/verify-sites.sh
对 9 个站点走真实 HTTPS 验收入口/证书/资源/反代 bash bash verify-sites.sh(无参数) 手动 是 否 —
工单模板渲染验证
deploy/nfos/verify-waf-templates.sh
临时注入扫描日志验证工单模板渲染,验证后立即删除注入行 bash bash verify-waf-templates.sh(无参数) 手动 是 否 —
WAF 上线终检
deploy/nfos/verify-waf.sh
WAF 上线终检:模式/配置/拦截/日志/库/工单 bash bash verify-waf.sh(无参数) 手动 是 否 —

2.3 可复用工具(本仓库 tools/)(17)

脚本 用途 语言 入口参数 触发方式 需 root 可 dry-run 文档
alert-enrich-test.py
deploy/nfos/tools/alert-enrich-test.py
alert-enrich.py 离线自测(不联网、不写盘、不需要 root)。 python3 alert-enrich-test.py 手动 — — 有
ar-local-matrix.py
deploy/nfos/tools/ar-local-matrix.py
auto-respond.py 离线干跑矩阵(本地 Windows/Linux 均可跑,纯评估不动系统)。 python3 ar-local-matrix.py 手动 — — 有
check-guard-core.py
deploy/nfos/tools/check-guard-core.py
抽出 security-guard.sh 里 heredoc 的 Python 核心,做语法自检(py_compile)。 python3 check-guard-core.py 手动 — — 有
fix-lib-yaml.py
deploy/nfos/tools/fix-lib-yaml.py
修复三库 YAML 里的"双引号标量非法转义"(正则里的 [ ] ( 等)。 python3 fix-lib-yaml.py 手动 — — 有
ispublicip-test.js
deploy/nfos/tools/ispublicip-test.js
— text ispublicip-test.js 手动 — — 有
log-audit-report-test.py
deploy/nfos/tools/log-audit-report-test.py
log-audit.py 的离线自测(不联网、不调 journalctl、不需要 root): python3 log-audit-report-test.py 手动 — — 有
mock-oidc.py
deploy/nfos/tools/mock-oidc.py
Local mock OAuth 2.0 / OIDC provider for verifying the nfarmsd OAuth client chain. python3 mock-oidc.py 手动 — — 有
scan-py-snippets.py
deploy/nfos/tools/scan-py-snippets.py
扫描 shell 脚本里内嵌的 Python 片段,找出"用了却没 import/定义"的名字。 python3 scan-py-snippets.py 手动 — — 有
scan-secrets.py
deploy/nfos/tools/scan-secrets.py
扫描仓库里是否残留"真实机密明文"(口令/webhook/secret/token)。 python3 scan-secrets.py 手动 — — 有
test-waf-wire.py
deploy/nfos/tools/test-waf-wire.py
离线自测 gen-waf-from-libs.py 的接线逻辑(花括号配对 + 历史命名修复 + 幂等)。 python3 test-waf-wire.py 手动 — — 有
ui-audit.py
deploy/nfos/tools/ui-audit.py
ui-audit.py —— NFarms 前端「显示完整性」审计器(本地静态,无需浏览器)。 python3 ui-audit.py [--css] [--no-lint] [--out] 手动 — — 有
ui-coverage.py
deploy/nfos/tools/ui-coverage.py
ui-coverage.py —— 「长内容页用到的类 → 命中哪条显示完整性规则」逐条核对。 python3 ui-coverage.py [--css] [--out] [--pages] 手动 — — 有
ui-delta.py
deploy/nfos/tools/ui-delta.py
ui-delta.py —— 「显示完整性」改动前后对比(工具版本无关)。 python3 ui-delta.py [--base] [--cur] [--out] 手动 — — 有
ui-js-refs.py
deploy/nfos/tools/ui-js-refs.py
ui-js-refs.py —— 扫描全部前端 JS 引用到的「类名 / CSS 变量」,核对候选 CSS 是否已定义。 python3 ui-js-refs.py [--css] [--out] 手动 — — 有
ui-keyrules.py
deploy/nfos/tools/ui-keyrules.py
ui-keyrules.py —— 输出"关键类最终生效的显示完整性声明"(含 @media 上下文)。 python3 ui-keyrules.py [--css] [--out] 手动 — — 有
ui-metrics.py
deploy/nfos/tools/ui-metrics.py
ui-metrics.py —— 候选 A / 并发版 / 基线 的关键指标对照表(注释剥离后统计)。 python3 ui-metrics.py [--base] [--cand] [--other] [--out] 手动 — — 有
verify-page-runtime.mjs
deploy/nfos/tools/verify-page-runtime.mjs
— text verify-page-runtime.mjs 手动 — — 有

2.4 测试(1)

脚本 用途 语言 入口参数 触发方式 需 root 可 dry-run 文档
test-waf-generator.py
deploy/nfos/tests/test-waf-generator.py
离线自测 gen-waf-from-libs.py 的接线逻辑(花括号配对 + 历史命名修复 + 幂等)。 python3 test-waf-generator.py 手动 — — —

2.5 健康检查(2)

脚本 用途 语言 入口参数 触发方式 需 root 可 dry-run 文档
nats-health.sh
deploy/nfos/health/nats-health.sh
NFOS NATS 容器健康检查(挂载进容器,避免 Quadlet 多词参数的引号问题) bash nats-health.sh 手动 — — —
tsdb-health.sh
deploy/nfos/health/tsdb-health.sh
NFOS TimescaleDB 容器健康检查(挂载进容器,避免 Quadlet 多词参数的引号问题) bash tsdb-health.sh 手动 — — —

2.6 引导安装(12)

脚本 用途 语言 入口参数 触发方式 需 root 可 dry-run 文档
00-directories.sh
deploy/nfarms-scripts/00-directories.sh
NFarms deploy - 00 : create the whole directory tree bash 00-directories.sh 手动 — — —
10-nginx.sh
deploy/nfarms-scripts/10-nginx.sh
— bash 10-nginx.sh 手动 — — —
20-frontend.sh
deploy/nfarms-scripts/20-frontend.sh
NFarms deploy - 20 : frontend (nfarms web sites) + hub resources bash 20-frontend.sh 手动 — — —
30-backend.sh
deploy/nfarms-scripts/30-backend.sh
— bash 30-backend.sh 手动 — — —
40-certs.sh
deploy/nfarms-scripts/40-certs.sh
NFarms deploy - 40 : certificates import & generation bash 40-certs.sh <子命令>(见脚本内 usage) 手动 — — —
backup-aliyun.sh
deploy/nfarms-scripts/backup-aliyun.sh
NFarms backup - Aliyun Drive (阿里云盘) token backup bash alarm <body></code></td> <td>手动</td> <td>—</td> <td>—</td> <td>—</td> </tr> <tr> <td>common.sh<br><code>deploy/nfarms-scripts/common.sh</code></td> <td>NFarms deploy - common paths & helpers</td> <td>bash</td> <td><code>common.sh</code></td> <td>手动</td> <td>—</td> <td>—</td> <td>—</td> </tr> <tr> <td>deploy-all.sh<br><code>deploy/nfarms-scripts/deploy-all.sh</code></td> <td>NFarms deploy - deploy-all : 一键按序执行全部部署脚本</td> <td>bash</td> <td><code>deploy-all.sh <子命令>(见脚本内 usage)</code></td> <td>手动</td> <td>—</td> <td>—</td> <td>—</td> </tr> <tr> <td>wg-debug.sh<br><code>deploy/nfarms-scripts/wg-debug.sh</code></td> <td>—</td> <td>bash</td> <td><code>wg-debug.sh</code></td> <td>手动</td> <td>—</td> <td>—</td> <td>—</td> </tr> <tr> <td>wg-setup.sh<br><code>deploy/nfarms-scripts/wg-setup.sh</code></td> <td>standby server WireGuard server setup (executed on remote via stdin)</td> <td>bash</td> <td><code>wg-setup.sh</code></td> <td>手动</td> <td>—</td> <td>—</td> <td>—</td> </tr> <tr> <td>wg-status-install.sh<br><code>deploy/nfarms-scripts/wg-status-install.sh</code></td> <td>Standby server: install wg-status refresh timer + nginx wg location</td> <td>bash</td> <td><code>wg-status-install.sh</code></td> <td>手动</td> <td>—</td> <td>—</td> <td>—</td> </tr> <tr> <td>wg-status.sh<br><code>deploy/nfarms-scripts/wg-status.sh</code></td> <td>Standby server: WireGuard tunnel status -> JSON for frontend visualization</td> <td>bash</td> <td><code>wg-status.sh</code></td> <td>手动</td> <td>—</td> <td>—</td> <td>—</td> </tr> </tbody> </table> <h2 id="3">3. 定时器<a class="headerlink" href="#3" title="Permanent link">¶</a></h2> <p>全部 17 个已安装 timer(含 <code>OnCalendar</code>、<code>ExecStart</code> 逐字参数、幂等键与备份位置)见 <a href="timers/">定时器一览</a>。</p> <h2 id="4-hub">4. 在 HUB 里取用<a class="headerlink" href="#4-hub" title="Permanent link">¶</a></h2> <ol> <li>登录后打开 <code>https://hub.nfarms.cn/</code>;</li> <li>左侧「资源库 → 脚本库」,默认标签页就是 <strong>仓库脚本(真实)</strong>;</li> <li>支持按名称/用途/路径/定时器检索、按分组过滤、导出 CSV;</li> <li>行内「下载」直接取同源静态件 <code>scripts/<basename></code>,「详情」显示依赖、幂等、会写入什么、<code>sha256</code> 与最后改动时间。</li> </ol> <p>命令行取用(等价):</p> <div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="c1"># 按清单里的 sha256 校验下载到的脚本</span> <a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a>curl<span class="w"> </span>-fsS<span class="w"> </span>-O<span class="w"> </span>https://hub.nfarms.cn/scripts/scripts-index.json<span class="w"> </span><span class="c1"># 需带登录会话</span> <a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a>python3<span class="w"> </span>-c<span class="w"> </span><span class="s2">"import json,hashlib,sys;d=json.load(open('scripts-index.json'));</span> <a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a><span class="s2">m={s['name']:s['sha256'] for s in d['scripts']};</span> <a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a><span class="s2">print(m['digest'])"</span> </code></pre></div> <h2 id="5">5. 安全与凭据约定<a class="headerlink" href="#5" title="Permanent link">¶</a></h2> <ul> <li>清单与正文<strong>不含任何口令 / webhook / token / 私钥</strong>;生成阶段对每个脚本做了正文级凭据扫描,命中者<strong>不下发正文</strong>(只保留元数据,页面「下载」会提示无 hub 副本)。本快照命中 <strong>3</strong> 个:<code>deploy/nfos/admin-password-rotate.sh</code>、<code>deploy/nfos/monitoring/digest.py</code>、<code>deploy/nfos/monitoring/sanitize.py</code>。</li> <li>需要凭据的脚本一律从环境变量或 <code>secrets/</code> 读取,文档与页面只写变量名或 <code><redacted></code>。</li> <li>下发目录 <code>/opt/Cy/nfarms/hub/scripts/</code> 受统一登录门禁保护(未登录 401)。</li> </ul> <h2 id="6">6. 回滚<a class="headerlink" href="#6" title="Permanent link">¶</a></h2> <ul> <li>覆盖 hub 脚本库前,上一版自动归档到 <code>/opt/Cy/nfarms/.backup/hub-scripts-prev-<ts>/</code>;还原:<code>rm -rf /opt/Cy/nfarms/hub/scripts && cp -a /opt/Cy/nfarms/.backup/hub-scripts-prev-<ts> /opt/Cy/nfarms/hub/scripts</code>。</li> <li>hub 页面回滚:<code>cp -a /opt/Cy/nfarms/hub/js/pages/scripts.js.bak-<ts> /opt/Cy/nfarms/hub/js/pages/scripts.js</code>。</li> <li><strong>备份只放 <code>/opt/Cy/nfarms/.backup/</code> 或 <code>state/unit-backups/</code></strong>,绝不放在 <code>/etc/systemd/system/</code>(会触发 PS-002 完整性告警)。</li> </ul> <h2 id="_1">相关文档<a class="headerlink" href="#_1" title="Permanent link">¶</a></h2> <ul> <li><a href="timers/">定时器一览</a></li> <li><a href="../nfos/backup/">备份与容灾</a></li> <li><a href="../nfarms/hub/">资源 hub</a></li> </ul> </article> </div> <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> </div> <button type="button" class="md-top md-icon" data-md-component="top" hidden> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> 回到页面顶部 </button> </main> <footer class="md-footer"> <div class="md-footer-meta md-typeset"> <div class="md-footer-meta__inner md-grid"> <div class="md-copyright"> <div class="md-copyright__highlight"> Copyright © NFarms | <a href="https://beian.miit.gov.cn/" target="_blank" rel="noopener">沪ICP备2025145479号</a> </div> </div> <div class="md-social"> <a href="https://www.nfarms.cn/" target="_blank" rel="noopener" title="www.nfarms.cn" class="md-social__link"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M351.9 280H161c2.9 64.5 17.2 123.9 37.5 167.4 11.4 24.5 23.7 41.8 35.1 52.4 11.2 10.5 18.9 12.2 22.9 12.2s11.7-1.7 22.9-12.2c11.4-10.6 23.7-28 35.1-52.4 20.3-43.5 34.6-102.9 37.5-167.4zm-191-48h190.9c-2.8-64.5-17.1-123.9-37.4-167.4-11.4-24.4-23.7-41.8-35.1-52.4C268.1 1.7 260.4 0 256.4 0s-11.7 1.7-22.9 12.2c-11.4 10.6-23.7 28-35.1 52.4-20.3 43.5-34.6 102.9-37.5 167.4m-48 0c3.5-85.6 25.6-165.1 57.9-217.3C78.7 47.3 10.9 131.2 1.5 232zM1.5 280c9.4 100.8 77.2 184.7 169.3 217.3-32.3-52.2-54.4-131.7-57.9-217.3zm398.4 0c-3.5 85.6-25.6 165.1-57.9 217.3 92.1-32.7 159.9-116.5 169.3-217.3zm111.4-48C501.9 131.2 434.1 47.3 342 14.7c32.3 52.2 54.4 131.7 57.9 217.3z"/></svg> </a> </div> </div> </div> </footer> </div> <div class="md-dialog" data-md-component="dialog"> <div class="md-dialog__inner md-typeset"></div> </div> <script id="__config" type="application/json">{"annotate": null, "base": "..", "features": ["navigation.tabs", "navigation.sections", "navigation.top", "navigation.indexes", "search.highlight", "search.suggest", "content.code.copy", "toc.follow"], "search": "../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "\u5df2\u590d\u5236", "clipboard.copy": "\u590d\u5236", "search.result.more.one": "\u5728\u8be5\u9875\u4e0a\u8fd8\u6709 1 \u4e2a\u7b26\u5408\u6761\u4ef6\u7684\u7ed3\u679c", "search.result.more.other": "\u5728\u8be5\u9875\u4e0a\u8fd8\u6709 # \u4e2a\u7b26\u5408\u6761\u4ef6\u7684\u7ed3\u679c", "search.result.none": "\u6ca1\u6709\u627e\u5230\u7b26\u5408\u6761\u4ef6\u7684\u7ed3\u679c", "search.result.one": "\u627e\u5230 1 \u4e2a\u7b26\u5408\u6761\u4ef6\u7684\u7ed3\u679c", "search.result.other": "# \u4e2a\u7b26\u5408\u6761\u4ef6\u7684\u7ed3\u679c", "search.result.placeholder": "\u952e\u5165\u4ee5\u5f00\u59cb\u641c\u7d22", "search.result.term.missing": "\u7f3a\u5c11", "select.version": "\u9009\u62e9\u5f53\u524d\u7248\u672c"}, "version": null}</script> <script src="../assets/javascripts/bundle.d7400e89.min.js"></script> </body> </html>