跳到主内容
最新版本 · 发布于 2026-10-12

v2.11.098

🕷️ 蜘蛛池 · v2.11.098: 分类外推词读不到词修复 + 深色主题 + 泛域名 sitemap 修复

$curl -fsSL https://dl.wztseo.com/spider-pool.sh | bash
50
累计版本
50
2026 年发布
0
下载总次数
100%
自托管 CDN

版本历史

点击卡片展开/收起

v2.11.098

最新
2026-10-12·155234768.0

v2.11.098: 分类外推词读不到词修复 + 深色主题 + 泛域名 sitemap 修复

  • ▸修复「分类外推词体检」读不到词:Billy 反馈外推词数全为 0、随机抽词顺序混乱 —— 根因是文件库上传的词在库里存的是内部 ID,标签按文件名写就永远匹配不上。现在分类名支持直接写「关键词管理→文件库」里的文件名,渲染也按分类取词,不再兜底乱抽
  • ▸关键词导入新增「保留重复词」开关:同一个词在文件里写 N 遍 = 抽取概率 N 倍(想让「上海」比「广州」多发 3 倍,就把上海写 3 行)
  • ▸体检弹层:内容区内部滚动 + 宽度自适应,教程展开不再撑出屏幕
  • ▸修复深色主题下弹层「白底白字」导致部分说明文字看不见
  • ▸修复泛域名站点 sitemap 生成四级域名(如 xxx.子域.主域.com)导致整个分页 sitemap 抓取失败:泛前缀现在正确加在配置根域上
  • ▸建议所有用户更新至最新版本

v2.11.097

2026-10-12·152248144.0

v2.11.097: 综合设置修复 + 外链分类体检 + AI 增强

  • ▸综合设置深度修复:多项此前「保存不生效」的设置现在改完立即生效(页面缓存/HTTPS/操作日志 IP 等)
  • ▸新增「🔍 分类外推词体检」:外链管理里一眼看清 {随机关键词:分类名} 各分组有没有外推词,缺词标红并给出教程;可开「严格分类模式」(缺词不兜底乱填)
  • ▸修复外链/TKD 多个 {随机关键词} 渲染成同一个词、标签锚文本上限读不回、自定义 404 页等问题
  • ▸AI 接口新增「🔄 从 API 拉取模型」:自动获取服务商最新可用模型,不用等版本更新
  • ▸支持自有证书 / 自动证书的 HTTPS 监听(可选,默认关闭)
  • ▸安全:AI 辅助功能(网站名/TKD/栏目/重写/评分)改为正式版授权
  • ▸建议所有用户更新至最新版本

v2.11.096

2026-10-11·151426928.0

v2.11.096: 渲染修复 + 商城门禁

  • ▸修复外链 URL 中多个 {随机关键词} 会全部渲染成同一个词的问题(现各自独立抽词,组合不再重复)
  • ▸修复 TKD 标题/关键词/描述中多个 {随机关键词}/{随机栏目} 全同的问题
  • ▸模板商城改为独立授权门禁:试用版不能安装官方商城模板(自建/编辑模板不受影响)
  • ▸建议所有用户更新至最新版本

v2.11.095

2026-10-10·164315504.0

v2.11.095: 稳定性与兼容性更新

  • ▸修复若干已知问题, 提升系统整体稳定性
  • ▸优化后台多项功能的异常处理与容错能力, 减少极端场景下的异常中断
  • ▸改进任务调度与资源回收流程, 长时间运行更平稳
  • ▸优化部分接口的响应处理, 提升前端操作流畅度
  • ▸建议所有用户更新至最新版本

v2.11.094

2026-10-02·154268080.0

v2.11.094: 外推词分类组合标签 + 每页使用说明 + 界面深度优化

  • ▸外链新增分类组合标签 {随机关键词:分类名}/{固定关键词:分类名}: 外推词按分类(地名/内容/联系方式等)分组建组, 渲染时按类各抽一个拼组合, 几千词=千万级组合
  • ▸新增「🧩分类组合」生成器: 外链导入/批量栏点选分类自动拼标签, 不用手写语法; 存量纯 URL 外链可一键批量追加
  • ▸每个功能页新增「使用说明」帮助条(默认收起, 点击展开), 覆盖全部功能页; 各处多行说明块统一改点击展开
  • ▸外链/关键词管理表格重设计: 列宽贴内容自动收缩, 任何分辨率紧凑显示; 添加时间恢复完整年份
  • ▸系统管理·存储清理页重设计: 双栏布局 + 存储总览占比条 + 危险操作独立卡
  • ▸修复: 关键词分类改选下拉过窄、表格时间列换行

v2.11.093

2026-10-01·152101648.0

v2.11.093: 外推词/网站词分离 + 正规站模式修复 + 存储自动清理计划任务

  • ▸关键词管理新增「词库用途」: 网站文章词/外推留痕词彻底分开, 外推词只用于替换外链 URL 里的 {随机关键词}/{固定关键词}, 不出现在网站内容中
  • ▸支持批量把词在两种用途间搬运; AI/新闻采集候选词自动只用网站词
  • ▸新增外链标签 {固定关键词}: 同一外链恒定同一个词, 跨页面/跨抓取一致
  • ▸正规站模式 4 处关键词漏网全修: 页面文本/标签块/外链 URL/抓取锚文本, 正规站下零营销词痕迹
  • ▸系统管理→存储清理新增「自动清理计划任务」: 每隔 N 天自动删 ClickHouse 旧分区 + 清文本日志, 整表清空永不自动执行, 失败自动告警

v2.11.092

2026-09-12·152740368

v2.11.092: 图片文件管理 — 浏览/删除上传的图片二进制 + 孤儿清理

  • ▸图片库新增「图片文件」页:缩略图网格浏览已上传的图片文件(data/pic-files/),显示分组/大小/时间
  • ▸单删 + 勾选批删 + 全选;双击缩略图放大预览
  • ▸引用状态标记:扫描所有分组 TXT 链接清单,无引用的标红「未引用」(孤儿),一键清理全部孤儿释放磁盘
  • ▸删除图片文件时同步清除链接库里的对应行(跨组识别),蜘蛛侧即时生效
  • ▸分组下拉过滤 + 总量统计(张数/体积/孤儿数)

v2.11.091

2026-09-09·149083312.0

v2.11.091: AI SEO 一次性增强低分文章 + 自选 AI 接口(客户反馈)

  • ▸「AI SEO 状态」一键升级为弹窗:自定义分数阈值(默认80)+ 数量上限 + AI 接口下拉,一次性只增强低于阈值的文章,别的动都不动
  • ▸勾选文章批量增强同一弹窗,选哪些增强哪些
  • ▸AI 接口绑定到任务:这批任务固定用所选接口处理,中途改全局设置不影响;留空跟随全局「AI 接口」;端点临时故障自动切备用救急
  • ▸未评分(0分)文章视为低分优先处理;已增强/排队中的自动跳过不烧token

v2.11.090

2026-09-08·148158256.0

v2.11.090: AI SEO 增强省 token — 按评分排序 + 阈值筛选 + 勾选增强

  • ▸文章管理新增按 SEO 评分排序(低→高/高→低)与「仅显示 SEO 分低于 N」筛选(默认80),低分文章一目了然
  • ▸批量栏新增「AI SEO 增强」按钮:勾选哪些增强哪些,已增强/处理中的自动跳过
  • ▸一键增强支持分数上限:开启阈值筛选后一键入队自动只挑低分文章,高分文章不再被二次增强白白烧 token
  • ▸未评分(0分)文章视为低分优先处理

v2.11.089.4

2026-09-06·151915728

v2.11.089.4: AI端点超时不持久化修复 + 主题打磨

  • ▸修复AI接口「超时(秒)」改大后不生效:保存被静默重置回30s,自建慢AI服务器响应超30s被截断 — 旧数据自动按60s回显,保存立即生效
  • ▸AI审评分/关键词长尾扩展两条路径超时默认从30s统一为60s,与生成路径一致
  • ▸「采集管理」更名「AI内容生成」
  • ▸el-tabs激活态8套主题重设计,白字对比度全部≥4.5:1;句子池工具栏紧凑化
  • ▸全仓16处硬编码浅色边框(#ddd/#ccc/#eee)主题化,深色主题无白线残留

v2.11.088

2026-09-05·148067728.0

v2.11.088: 新闻翻译批次 deadline 兜底

  • ▸修复批次搁浅:慢/429 端点把一批拖数小时导致轮次永不结束、队列卡死只能重启
  • ▸批次级 context deadline 到点取消在途 AI 调用,被打断条目回 pending 下轮自动重译
  • ▸429 退避睡眠改为可中断;gate/信号量等待在取消时立即退出

v2.11.087

2026-09-05·142 MB(压缩包 52 MB 自动解压)

# v2.11.087 · 新闻翻译管线修复:端点级限流 + 429 退避 + 队列可见性

新闻采集(AI 翻译)

  • ▸修复:AI 端点并发限制在新闻翻译批次不生效,Coding Plan 类小配额端点被默认 8 并发打爆——现在按端点独立限流,端点未配并发时退回全局 news_concurrency
  • ▸修复:429 限流错误被立即标 failed 的恶性循环——现在 5s/15s 退避重试 3 次后才走 fallback 端点,限流不再烧队列
  • ▸修复:老 failed 行在采集列表显示全空(status/error_msg/时间丢失)——NULL 列容错,历史失败原因恢复可见
  • ▸新增:采集页「⚡ 翻译吞吐」对话框——批量大小/并发数/端点池自助调整,即时生效
  • ▸新增:端点健康面板——每端点并发配置 + 近 1 小时 429 限流次数,页顶限流告警条自动刷新

在线更新

  • ▸修复:多路同时更新并发写 .new 报 ETXTBSY 假失败(单飞行闸门)
  • ▸更新体积上限放宽:gz 200M / 解压 400M / 上传 300M

升级建议

新闻采集使用 GLM Coding Plan 或其他小配额端点的用户:升级后在 AI 端点配置里设置「并发数」(建议 1-3),系统将按端点自动限流。

v2.11.086

2026-09-04·145 MB

# v2.11.086 · GEO 套件 + 新闻队列自愈 + 正规站批量切换

GEO(生成式引擎优化)完整套件

  • ▸AI 引用监测 v1.3:Perplexity + OpenAI Responses + Gemini Grounding 多引擎探测,四态覆盖率 + 原子配额,设置页双子标签
  • ▸搜索可见度:Serper organic Top1/3/10(权威态 SQLite + 明细 ClickHouse)
  • ▸数字事实一致闸(G1 覆盖/G2 数值日期/G3 跨注册域双源/标题闸)
  • ▸E-E-A-T 模板内嵌 Schema + Article JSON-LD;AI 爬虫放行/看板
  • ▸GEO 综合可见度报告/健康分(四路只读聚合)
  • ▸收录速度监控:Google+百度 site: 覆盖率,总览/历史趋势双子标签

新闻采集

  • ▸修复:翻译队列被孤儿 pending(采集源已删除)卡死队头的致命 bug,升级后自动出队
  • ▸残留 translating 自动重置;默认吞吐 batch 50→200 / 并发 5→8
  • ▸AI 模型目录 2026-09 刷新:GLM-5.3(-flash 3x 额度)/GPT-5.6/Qwen3.8-max/Kimi kimi-k3/Grok-4.6

域名管理

  • ▸正规站模式批量切换:按当前筛选/搜索一键全开/全关,几百域名不再逐个点

安全/其他

  • ▸防破解期一+期二:授权策略下发与域名管控(合法用户不受影响,域名写默认放行)
  • ▸采集图片模式(源URL直引/代理/本地) + 热门标签按分组隔离

升级建议

新闻采集用户建议配 news_batch_size=200 / news_concurrency=10,多端点可配 news_translate_pool 分摊。非 critical,可择机一键升级。

v2.11.085

2026-08-23·48 MB(压缩,自动解压)

# v2.11.085 · 防破解重构:默认放行 + 定向冻结(fail-open)

背景

v2.11.084 的域名写门控是 fail-closed(无有效签名租约即拒写)。一台合法永久授权机

(103,NTP 未开、时钟快 117s)升级后,续租的 r1_ts 超服务端仅 5s 未来容差 → 空挑战 →

拿不到租约 → 域名写被静默锁死。合法用户被防破解误伤,不可接受,故 084 已撤回、本版重构。

产品定调(硬约束):合法授权用户永不因防破解被自动锁;只锁破解者(后台手动封 /

自动检测);我方官网服务器崩溃 72 小时内不影响已授权用户的域名写。

变更(设计反转)

  • ▸域名写默认放行(fail-open):domainWriteAllowed() 默认允许;仅当客户端本地持有

一份有效签名的 frozen 策略(hasActiveSignedFreeze())时才拒写(403)。

无租约 / 租约过期 / 官网不可达 / 签名密钥缺失 —— 一律放行,不再锁合法用户。

  • ▸定向冻结(sticky):后台「封设备」或自动检测破解 → 服务端签发 frozen 策略;客户端

一旦 ACK 该 frozen,即粘滞保留,即使服务器不可达 / 令牌过期也保持锁定,直到收到

严格更高 (epoch,seq) 的 normal 策略才解冻(单调,防降级绕过)。

  • ▸72h 宽限:官网崩溃期间,合法客户端凭已有 normal 状态继续放行,不受影响。
  • ▸时钟自愈:续租响应带 server_now,客户端据此校正时钟偏移,消除 084 那类

"时钟快 → 续租被拒" 的连锁;装机脚本/系统修复同步启用 NTP(systemd-timesyncd)。

  • ▸商业门与防破解门分离:
  • ▸门 A CanAddDomain:授权到期禁新增域名(402,商业);
  • ▸门 A′ IsDomainWritable:到期后非主域只读(402,既有商业机制);
  • ▸门 B hasActiveSignedFreeze:防破解冻结门,拦所有域名写(403)。三门互不越界。
  • ▸max_domains 暂不执法:忽略 policy token 里的自定义 max_domains,只认免费版 3 / unlimited

商业判断,避免远程误限合法用户。

  • ▸后台监控五态:freeze_pending / freeze_active_sticky / unfreeze_pending /

normal_confirmed / offline(+ supported_uninitialized 未初始化),基于客户端 last_ack

单调记账判定,手动冻结附 SLA 提示;控制面只翻标志 + 推进代际,签令在续租时发生。

兼容/升级建议

  • ▸非 critical:客户端可择机「系统管理 → 🔍 立即检查 → ⚡ 一键升级」。双进程重启,大库冷启勿急杀。
  • ▸老客户端(082/无设备协议)升级后按默认放行工作,不会被防破解锁;仅破解/被封设备才会被定向冻结。
  • ▸服务端(wztseo.com)已就绪:POLICY_SIGN_SEED/LIC_SIGN_SEED 已配置;缺 seed 时不锁合法用户

(仅无法签发/更新策略,含 frozen)。

v2.11.082

2026-08-11·48 MB(压缩,自动解压)

# v2.11.082 · 后台侧栏滚动与分组展开修复

问题

  • ▸升到 v2.11.080/081 后侧栏菜单变多,鼠标滚轮滚不动;滚到下方时体感像在「收缩侧栏」。
  • ▸分组手风琴一次只开一组,一切换菜单其它组就收起,像不断换「标签页」、无法固定展开。

修复

  • ▸侧栏滚动区补 min-height:0 / flex-basis:0,在整页 overflow:hidden 下可正常上下滚。
  • ▸多分组可同时展开,并 sessionStorage 记住本次会话状态;路由只保证当前组展开,不再关掉其它组。
  • ▸子菜单展开动画 max-height 400→2000,避免核心/域名长列表被裁切。
  • ▸底部「收起侧栏」改为明确 button,减少误触感。

升级说明

  • ▸非 critical,纯前端。
  • ▸升级路径:系统管理 → 🔍 立即检查 → ⚡ 一键升级(双进程重启;大库冷启勿急杀)。

v2.11.084

2026-08-11·48 MB(压缩,自动解压)

# v2.11.084 · 授权防破解 期一+期二(设备绑定 + 签名域名租约 + 后台封设备)

背景

针对客户端被破解绕过授权的问题,引入设备身份 + 短期签名域名租约机制:

只有持有服务端签发的有效租约,客户端才允许「新增/修改域名」写操作;破解/盗用可在后台一键封禁。

本版为纯增量:蜘蛛出站建站/正常访问流量不受影响,仅「域名管理写操作」受租约门控。

新增

  • ▸设备身份:客户端首次运行生成 install_id + Ed25519 设备密钥(本地设置库持久化)。
  • ▸设备绑定(挑战-应答):两回合握手,R1 用设备私钥签 install_id+nonce 证明持钥,绑定到授权账号。
  • ▸签名域名租约:服务端用 Ed25519 子密钥签发 domain-policy 租约(含 epoch/seq 单调基线、

install_id/公钥哈希绑定、nbf/exp、domain_write=normal/frozen、max_domains)。客户端严格验签 +

单调接受 + trusted_time 防回拨,domainWriteAllowed() 为域名写唯一入口,fail-closed。

  • ▸续租:verify / 心跳后两回合续租(R1 持钥证明 + 新鲜 nonce 防重放),拿更高 tuple 租约。
  • ▸后台封设备:授权监控页「封设备」——冻结设备(拒续租)+ install 黑名单(拒重绑),

被封机旧租约到期(≤TTL)后写操作 fail-closed 锁死;支持解封恢复。

  • ▸用户级封禁增强:被封用户返回签名 active=false 令牌并裁剪敏感信息,禁止再绑设备。

兼容/升级建议

  • ▸非 critical:客户端可择机「系统管理 → 🔍 立即检查 → ⚡ 一键升级」。双进程重启,大库冷启勿急杀。
  • ▸升级后客户端启动时会自动 verify→绑定设备→拿 normal 租约(秒级),域名写不受影响;

仅在拿到租约前的极短窗口、或异常拿不到租约时才会临时锁写。

  • ▸服务端(wztseo.com)已就绪:签名密钥 POLICY_SIGN_SEED/LIC_SIGN_SEED 已配置。

v2.11.081

2026-08-10·48 MB(压缩,自动解压)

# v2.11.081 · 仅允许名单 IP 防误开 UI + AI SEO 清除失败记录

一、仅允许名单 IP(原「IP放行」)防误开

  • ▸侧栏改名「仅允许名单IP」;设置页顶部危险说明,明确 开启 = 名单外全部 403。
  • ▸开启需二次确认;空名单禁止开启。
  • ▸安全中心顶栏露出独占状态;开启时红条 + 一键关闭。
  • ▸「IP/UA 名单」页注明:本页白名单只跳过云 IP/限流,与独占模式不是同一功能。
  • ▸起因:客户误开后全站 403,误以为关「屏蔽终端」即可恢复。

二、AI SEO 清除失败记录

  • ▸POST /api/admin/articles/ai-seo-clear-failed:按 all_failed 或 ids 把 failed 重置为未增强,不删文章。
  • ▸状态 API 增加 recent_failures;文章页失败区可一键清除后重试。

升级说明

  • ▸非 critical。
  • ▸升级路径:系统管理 → 🔍 立即检查 → ⚡ 一键升级(双进程重启;大库冷启勿急杀进程)。
  • ▸若前台曾 403:到安全中心确认「仅允许名单IP」为关;或侧栏打开该页关掉独占开关。

v2.11.080

2026-08-10·47 MB(压缩,自动解压)

# v2.11.080 · Bing IndexNow 中心 + Bing 全家桶对齐 + 强引/防火墙蜘蛛选择 UI

一、Bing IndexNow 中心(独立页)

  • ▸菜单:推送中心 → Bing IndexNow 中心(/push/indexnow)。
  • ▸记 Key / 自动写站根 {key}.txt / 验文件 / 手动推送 / 简单自动推(worker + 历史)。
  • ▸API:/api/admin/indexnow/*;提交走 api.indexnow.org,带 keyLocation。
  • ▸百度推送页增加跳转提示,避免和 IndexNow 混淆。

二、微软 Bing 全家桶对齐 Google 标准

  • ▸Detect 认 msnbot / adidxbot / BingPreview / MicrosoftPreview,展示名统一「微软Bing」。
  • ▸防火墙白名单勾「微软Bing」即可覆盖全家桶;CF 假蜘蛛 UA、护栏 CIDR、蜘蛛族 salt 同步。
  • ▸AS8075 预设注释警示:可能误伤 Bingbot,须保证 verified-bot-skip 在前。

三、强引「指定蜘蛛」与防火墙列表同源

  • ▸强引弹窗不再硬编码短列表,改为 GET /spider/all-names → detector.AllDisplayNames()(与防火墙一致)。
  • ▸蜘蛛配置页 IP 识别卡片列表同步动态拉取。

四、蜘蛛选择 UI 重排

  • ▸强引:三列紧凑 chip;未选 --text-faint、已选主题色;显示已选数量。
  • ▸防火墙编辑弹窗:去掉旧表格左右栏;顶部上下文条 + 白/黑名单双卡 + 4 列等宽预设 + chip 列表。

升级说明

  • ▸非 critical。
  • ▸升级路径:系统管理 → 🔍 立即检查 → ⚡ 一键升级(双进程重启;大库冷启勿急杀进程)。
  • ▸IndexNow:升后可在新页管理 Key;已有 indexnow_key / 站根 txt 会自动识别。
  • ▸防火墙:若白名单原先只勾 Google,需自行加「微软Bing」才放行 Bing(代码不改写生产配置)。

v2.11.079

2026-08-10·48 MB(压缩,自动解压)

# v2.11.079 · 关键词文件库 + 外推取词修正 + 强引来源可读名

一、关键词管理「📄 文件库」(对齐外链 v4.3)

  • ▸多选 txt 导入、归属轴(全局 / 模型公共库 / 网站分组库)、预览 / 下载 / 改名 / 改归属 / 删整组。
  • ▸表 keyword_file_groups;热路径 GetKeywordsByGroup 合并手动词 + _common + 归属落在该组的文件词。
  • ▸file_ 为系统保留前缀;通用整组清空/改组对文件组返回 422,须走文件库 API。

二、外推 / 强引取词修正

  • ▸mix 错组:只要能从选中外链反查到 group_name 就优先用,不再要求 Type==linklib|mix(mix 开启时 Type 仍可能是 custom)。
  • ▸{随机关键词}:改为保留空格 / 大小写 / 【品牌】,只剥离会拆坏 URL 的 ?#&= 与控制字符(不再空格改 -、砍 50 字)。

三、强引记录「按具体来源」下拉

  • ▸linklib:file_* 显示注册表 display_name(或从 file_<slug>_<hash> 还原文件名),不再露出整串 hash。
  • ▸/spider-redirect-logs/sources 附带 label;前端优先使用。

升级说明

  • ▸非 critical。
  • ▸升级路径:系统管理 → 🔍 立即检查 → ⚡ 一键升级(双进程重启;大库冷启勿急杀进程)。
  • ▸含关键词文件库迁移;首次启动会建表/索引。
  • ▸103:已有取词热修;本版为正式 garble 通吃包,可择机一键升替换。

v2.11.078

2026-08-10·48 MB(压缩,自动解压)

# v2.11.078 · 修复站点互链共享池无界拷贝导致蜘蛛 OOM

一、生产事故:互链一开蜘蛛内存冲到 ~120GB 被反复 OOM

生产 103 在站点互链(site_interlink)开启且文章落在共享池(domain_id=0)时,

GetArticlesByDomainAndGroup(domain, "", n, seed) 的 fallback 写成:

```go

shared = append(shared, ga...) // 先把整组几十万篇全拷进临时 slice

if len(shared) >= n*4 { break }

```

互链锚文本路径每次请求都会触发 → 单次分配数 GB → RSS 冲到约 120GB →

内核 OOM kill → 8080 accept 队列打满 → Cloudflare 回源失败 → Google 抓取量塌到一万级。

heap profile 实证:GetArticlesByDomainAndGroup 占 alloc_space >97%。

二、修复

  • ▸共享池 fallback:只 pickArticlesByHash 取需要的 N 篇,禁止 append(整组)。
  • ▸指定 article_group:改走内存索引(与 GetArticlesByHash 同口径),禁止每请求

SELECT ... body 把整组正文拖进堆(互链只要标题)。

  • ▸单测:TestGetArticlesByDomainAndGroup_SharedFallback_NoFullGroupCopy(20 万篇组不炸)。

升级说明

  • ▸非 critical,但 103 / 开了站点互链 + 大共享文章池的节点强烈建议尽快升。
  • ▸升级路径:系统管理 → 🔍 立即检查 → ⚡ 一键升级(双进程重启;大库冷启勿急杀进程)。
  • ▸103 今日已用热修包止血;本版为正式 garble 通吃包,升上来与热修同修复、可替换热修二进制。

v2.11.077

2026-08-05·47 MB(压缩,自动解压)

# v2.11.077 · 域名健康巡检页主题修复(跟随主题切换)

一、域名健康巡检页不跟随主题(修一堆写死的黑色底色)

域名健康巡检(DomainHealth.vue)页面的 hero / KPI 卡片 / 标签容器三处底色写死为

var(--panel-bg, #1a1d24),而 --panel-bg 这个变量主题系统从未定义,导致永远回退到

写死的深黑 #1a1d24 —— 即便切到「明亮白」等主题,该页仍是黑底,与系统主题切换不匹配。

  • ▸三处底色 var(--panel-bg,#1a1d24) → var(--card-bg),边框 → var(--card-border),

并加 backdrop-filter: blur(8px) 与其他现代化页面玻璃质感统一。

  • ▸hero 标题、KPI 数字补 var(--text-primary);.dh-muted 改 var(--text-faint)。
  • ▸以上变量在全部 8 套主题(含「明亮白」)均有定义,现在正确跟随主题切换。

升级说明

  • ▸非 critical。纯前端样式修复。升级路径:系统管理 → 🔍 立即检查 → ⚡ 一键升级

(重启 spider+admin,大库冷启勿急杀)。

v2.11.076

2026-08-04·47 MB(压缩,自动解压)

# v2.11.076 · 外链文件库 v4.3(归属轴)+ 外链入库统一强制 http/https

一、外链文件库 v4.3:归属轴 + 文件列表(双轴布局)

在保持 v4.2「DB 为真源 + 文件名确定性 group_name」不变的前提下,新增归属轴

(全局 / 模型公共库 / 网站分组库)做第二维筛选,并把 📄 文件分组做成文件列表

(文件名 / 行数 / 大小 / 时间 + 预览 / 下载 / 改名 / 改归属 / 删除)。

  • ▸link_file_groups 加 scope_type(common|model|site)/scope_key(dirname);老库自动补列。
  • ▸多文件导入需选归属;import-multi / stats / move-file-group-scope 后端贯通。
  • ▸同名文件跨归属导入拒绝(group_name 由文件名派生、不可变)。
  • ▸前端双轴筛选栏显示该归属外链总条数(悬浮看文件数);深链 ?view=files&scope=&key=。
  • ▸file_ 前缀系统保留:模型 / 网站分组 / link_group alias 均禁用该前缀。

二、外链入库统一强制 http:// / https://(修强引空转)

裸域名会让强引 http.Redirect 跳到「本站相对路径」→ 蜘蛛到不了外部域名 → 强引空转。

故所有入库路径统一:去 UTF-8 BOM + 校验绝对 scheme,非法行跳过(不再整份拒绝)。

  • ▸单条新增:缺 scheme → 400。
  • ▸批量文本 / 文件库多文件导入:逐行入库,表头「URL」/ 裸域名 / 空行跳过;全非法才 400;

成功提示分列 新增 / 去重 / 跳过。

  • ▸租赁三入口(客户自助下单 / 建单批量 / 追加外链)、sitemap 导入、种子 txt 导入:同口径校验。

三、蜘蛛强引配置补「文件库」多分组

强引「混合(池内 + 外链管理库)」的多分组菜单补上 📄 文件库(按文件名分组)分组来源。

升级说明

  • ▸非 critical。升级路径:系统管理 → 🔍 立即检查 → ⚡ 一键升级(重启 spider+admin,大库冷启勿急杀)。

v2.11.074

2026-08-01·46 MB(压缩,自动解压)

# v2.11.074 · 日志清理中心 + 系统管理标签化 + 强引清空修复

一、系统管理四标签

系统管理拆为:运行概览 / 运行控制 / 存储清理 / 系统更新。

深链用 ?tab=(禁止改 location.hash,避免与 Vue hash 路由冲突黑屏)。

顶栏有新版本时「手动/详情」直达系统更新页。

二、日志与存储清理中心

统一清理 ClickHouse 三表(logs / redirect_logs / external_link_stats)+ 可选文本日志:

  • ▸缩 TTL / 删旧分区 / 整表清空(超管 + 打字确认表名)
  • ▸副作用说明:清明细 ≠ 清首页 KPI;CH 空间可能异步下降
  • ▸强引无筛选全清改为 400,引导走清理中心

三、重置首页蜘蛛访问计数(独立危险操作)

存储清理页单独卡片。超管输入 RESET_STATS 后,打蜘蛛进程清零内存计数并落盘。

首页「今日 / 昨日 / 累计」归零;不碰 CH 明细。蜘蛛不可达则失败(防假成功)。

四、强引记录分池清空修复 + 中文

  • ▸清空按图表同一套 pool 键匹配(含 source 空、靠 group_name 归池的旧行)
  • ▸mutations_sync=1 等删完再返回,并失效 list/count 缓存
  • ▸按钮 / 图例 / 租赁 tab 中文化(不再显示 linklib:pool:breed 等英文)

五、CF 权限提示小修

识别 code=0 + request is not authorized;补 Bot Management 权限点名提示。

升级说明

  • ▸非 critical。升级路径:系统管理 → 🔍 立即检查 → ⚡ 一键升级。
  • ▸一键升级会重启 spider+admin;大库冷启可能数分钟,073 起已有 watchdog 宽限,勿急杀进程。

v2.11.073

2026-07-31·46 MB(压缩,自动解压)

# v2.11.073 · 蜘蛛防护 BFM dual-API + admin 冷启防误杀(接替已撤版的 072)

> 072 已从更新通道撤下(大库机器一键升级后后台起不来)。本版保留 072 的 BFM 修法,

> 并修掉真正导致「升级后后台打不开」的 watchdog 误杀。

一、蜘蛛防护 BFM(承接 072)

Cloudflare 已全网废弃老 /settings/bot_fight_mode(返 code=1003)。蜘蛛防护应用/状态改走 dual-API:

读 getBotFightModeDual、写 setBotFightModeWithFallback,自动回退 /zones/{id}/bot_management。

进程级 legacyBFMDead:见一次 1003 后直走新端点,避免数百 zone 双倍调用加剧 971 限流。

二、admin 冷启宽限(072 事故根因)

一键升级会重启 spider+admin。大库(10G+) + 大 WAL 时 admin 进程已在跑、但绑端口要数分钟。

旧 watchdog「查不到端口就回落探 8081 → 连续 3 次失败 → restart」≈每 3 分钟掐一次,后台永远起不来。

  • ▸有 PID 且无监听端口:宽限内(ADMIN_START_GRACE 默认 600 秒)只记 note、NOT restarting。
  • ▸超过宽限仍无端口才当卡住去 restart。
  • ▸两处副本同步:scripts/spider-pool.sh + admin/system_repair.go;同步测试钉死。

升级说明

  • ▸非 critical。用蜘蛛防护、或库较大的机器建议升级。
  • ▸升级路径仍是:系统管理 → 🔍 立即检查 → ⚡ 一键升级(不会静默换包)。
  • ▸升完若后台稍慢出来属大库冷启正常;有宽限后不会再被 watchdog 误杀循环。

质量

  • ▸watchdog_script_sync_test.go 加冷启宽限断言;cf_bot_fight_mode_test.go 仍覆盖 BFM 回退。
  • ▸go test ./admin/ -run 'Watchdog|BotFightMode|SpiderProtect' 通过。

v2.11.071

2026-07-31·46 MB(压缩,自动解压)

# v2.11.071 · CF 控制中心批三收口 + 域名体检结果稳定化

> 两块:①Cloudflare 控制中心批三修复收口(假绿/吞错/快照增强/冲突语义/死代码清理 + 两条破坏性防护);

> ②「域名体检」结果稳定化——修同一域名两次体检评分/等级会变的老毛病。

一、Cloudflare 控制中心 · 批三收口

破坏性防护(架构师直接实现)
  • ▸Origin 端口批量默认 merge:只按本工具指纹增改,不再默认 replace 覆盖整个 phase;replace 必须显式 confirm,防误删用户其它 Origin Rules。remove 只删本工具规则,不误删同端口的用户规则。
  • ▸清空规则:phase 白名单 + dry-run 预览(区分本工具规则 vs 用户自建条数)+ 二次确认;预览失败即中止。通用 rules/batch、rules/copy 对 Origin phase 做 replace 也强制 confirm,闭环防绕过。
收口修复
  • ▸健康总览不再假绿:未取到的指标标 unknown,不当成健康。
  • ▸批量删 Page Rules 计错误数;蜘蛛防护拆成 BFM / verified-bot / spider-rule 子项,BFM 失败不缓存成 false。
  • ▸同 description 多条即冲突:ASN 黑名单 / 国家封禁 / 蜘蛛防护发现重复规则时返回 conflict,不删不写。
  • ▸WAF 托管规则禁用保留 execute 规则并置 enabled:false,复启时保留原 action_parameters。
  • ▸快照回滚:真实回滚前先建 pre_restore 快照;24h 过期快照挂 drift cron 自动清理。
  • ▸死代码清理:删 verified-bot-stats / cf-audit-logs / certificates / migrate-preview 等无效路由与前端未用封装。
复检发现并修的两条
  • ▸P1:蜘蛛防护把冲突检测提到改 BFM 之前 —— 冲突时任何写(含 BFM)都不做,兑现「冲突即不写」。
  • ▸P2:新增 cfConflictError 哨兵,批处理器保留 conflict 状态,不再压成笼统 error,前端可区分「需人工处理的重复规则」与「CF API 失败」。

二、域名体检 · 结果稳定化

用户反馈:同一域名连做两次体检,评分/等级都不一样。根因是体检聚合十多个免费外部源(RDAP/Wayback/Tranco/Bing/crt.sh/情报源…),超时/限流即被静默当「无数据/0」,而评分用 earned/maxp 动态分母会因此整体重算。

  • ▸结果缓存 6h:同域名 6 小时内重复体检直接复用上次结果(用已有 domain_vet_results 表当缓存),既消抖动又降低对公共源的重复压力;前端加「强制刷新(忽略 6h 缓存)」开关,命中缓存的行带「缓存」徽标。
  • ▸DR 信号兜底真正计入评分:原来 Tranco/OPR 一超时,DR 的 16 分整块从分母消失导致评分乱跳;改为按信号(域龄/Wayback/反链/子域)推算值(封顶 58)计入,分母稳定,抖动大幅收敛。
  • ▸置信度门槛:关键四维(域龄/收录/Wayback/DR)取到不足 2 项 → 判 low_confidence,最高按 C 呈现并提示重试,堵住「只有 DNS 通就 100 分 A」的假高分;历史黄赌毒风险词一票否决 F 仍优先。前端展示 data_completeness 与「数据不足」徽标。

升级建议

  • ▸本版为非 critical 增强/修复,按需升级。
  • ▸用了 Cloudflare 控制中心批量操作(尤其 Origin 端口、清空规则)的强烈建议升级——含防误删的破坏性防护与越权/冲突语义收口。

质量

  • ▸双人复检(架构师 + GPT-5.6)3 轮通过。
  • ▸cf_batch3_remaining_test.go(冲突/BFM 顺序/conflict 状态保留)、cf_batch3b_test.go(Origin merge/replace、清空 dry-run)、domain_check_stability_test.go(置信度门槛/DR 兜底/风险词 F)。
  • ▸build / vet / go test ./admin/ / npm build 全绿。

v2.11.070

2026-07-30·46 MB(压缩,自动解压)

# v2.11.070 — 069 复检缺陷收口(522 防护补强 + 句子池加固)

> 纯修复补丁,不含新功能。针对 v2.11.069 双人复检(架构 + GPT-5.6)检出的真缺陷逐条收口。

> 非 critical。

修复

P0:522 防护缺口
  • ▸跳转站 human 流量纳入统一保险丝:v2.11.069 只挡了渲染路径,redirect_mode=all 的蜘蛛池站

其 human 302/js 跳转绕过了 Connection: close 与全局 inflight/RPS —— 302/js-200 在

keep-alive 下被 IdleTimeout 拖住,照样打满 accept 队列。070 抽出 guardHuman,渲染与跳转

两条 human 出口统一走它。

P0:watchdog 存活探针名副其实
  • ▸服务端放行 unix 来源:/internal/status、/internal/waf-stats 原先只认 127.0.0.1/::1,

走 unix socket 时 host 为空 → 返 403。watchdog 的 unix 探针因此只拿到 403、退化成「socket

上有人应答」。现放行空 host(unix 连接),真实远端 IP 仍拒。

  • ▸watchdog 探针判据收紧为 code==200:配合上一条,unix 探针拿到真 200 才算健康,并能白拿

/internal/status 的 goroutines。对「非 200 但有应答」(如未升级的旧二进制 unix 侧 403)仍判

存活、绝不重启、只告警版本错配 —— 避免「070 脚本 + 069 旧二进制」在手工升级窗口触发死循环。

P1:watchdog socket 不再写死
  • ▸systemd unit 通过 Environment=SPIDER_UNIX_SOCK= 传入真实 socket:装机脚本从既有

config.yaml 的 server.unix_socket 解析(缺省 /tmp/spider-pool.sock);后台「⚡ 恢复生产

服务器标准」注入运行时 cfg.Server.UnixSocket。自定义 socket 部署不再退化成 TCP 探针。

P1:句子池 admin 内存加固
  • ▸preview 只读前 2MB(原 os.ReadFile 整文件再切片,预览 200MB+ 文件会 OOM);总行数改走

mtime+size 缓存,不再每次预览全量重扫。

  • ▸countLinesStreaming 改真有界:只维护「本行是否有非空白字符」的布尔状态,不缓存整行 ——

一个无换行的 512MB 单行 txt 不再吃等量内存。

P2:上传健壮性 + 文案同步
  • ▸大文件上传改用 os.CreateTemp 唯一临时名(并发上传同名文件不再互相截断),并 chmod 0644

与小文件分支对齐(修 CreateTemp 默认 0600 导致他用户蜘蛛进程读不到)。

  • ▸「一键修复」成功文案、帮助中心看门狗说明同步为「存活探针:蜘蛛优先 unix socket / TCP 兜底、

过载不误杀」。

守卫

  • ▸admin/watchdog_script_sync_test.go 新增「unix 探针必须以 code==200 判据」断言;两处 watchdog

脚本仍逐字一致校验。

  • ▸新增单测:guardHuman(渲染/跳转/拒绝三态)、internalRequestAllowed(unix 放行 / 远端拒)、

countLinesStreaming 无换行有界、writeSentencePoolFile 大文件 0644。

复检

架构 + GPT-5.6 双人复检:核心逻辑(guardHuman defer 时序、Connection: close 不被跳转覆盖、

internalRequestAllowed 边界、watchdog 版本错配容忍、计数等价性、临时文件并发)确认无误;

检出的两处中等问题(临时文件 0600、装机脚本 socket 写死)已修复并回归。

门禁

go build ./... / go vet / go test ./config ./handler ./admin + 根包全绿;新增代码 gofmt 干净;

bash -n scripts/spider-pool.sh 通过。

v2.11.069

2026-07-30·45 MB(压缩,自动解压)

# v2.11.069 · 源站打满/522 防护 + 句子池管理页

> 两块:①修「accept 队列满 → watchdog 误杀 → 全站 522」死循环,并给蜘蛛池加源站 human 保险丝;

> ②后台「内容管理 → 句子池」管理片段拼装用的 content/title 语料(与「随机句子」分离)。

> 治本仍是 CF「仅放行已验证蜘蛛」;本版让源站在漏拦时也能撑住,且不再自己把自己重启死。

1. Watchdog 优先探 unix socket

health-watchdog.sh(装机脚本 + 一键修复两处副本同步):

  • ▸蜘蛛存活探针优先 curl --unix-socket /tmp/spider-pool.sock …/internal/status
  • ▸unix 通则绝不 restart(即使 TCP :8080 已超时)
  • ▸TCP 不通仅记日志:accept backlog full, NOT restarting

背景:2026-07-30 生产 Recv-Q 顶满时本机 curl 127.0.0.1:8080 超时,unix sock 仍 200;旧 watchdog 连续 3 次失败就 systemctl restart,冷启动再被灌满 → 522 死循环。

2. 蜘蛛池 human 全局准入 + Connection: close

仅 operation_mode=spider_pool(站群/单站默认不动):

| 设置 | 默认 | 含义 |

|---|---|---|

| spider_pool_human_guard | 开(空/1) | 总开关,0 关闭 |

| human_global_inflight | 3000 | 同时处理的 human 上限,0=不限 |

| human_global_rps | 8000 | 每秒 human 上限,0=不限 |

超限 → 429 + 立刻拆连接。human 响应强制 Connection: close,避免假浏览器把 keep-alive 占满。

说明:历史 Google 高峰(~95 万/时、~1000 IP 复用)从不顶满;打满的是「~15 万独立 IP × 1.2 次/IP」的散弹连接形态 —— per-IP 限流对此无效。

3. rejectClosed:有 body 后主动关连接

拦截路径(403/429):能 Hijack 时手写完整 HTTP 响应再 Close,既避免 068 以前的空关 520,又减少 CLOSE-WAIT 堆积。

4. 拒连告警文案

ListenOverflows 告警引导优先开 CF「仅放行已验证蜘蛛」,并明确勿在 TCP 过载时反复重启。

5. 句子池管理页

  • ▸后台「内容管理 → 句子池」:上传/预览/下载/删除 data/content|title/(含 _common 与分组目录)。
  • ▸供蜘蛛池片段拼装(spider_pool_fragment_body)使用;不是设置页里的「随机句子」指纹库。
  • ▸大文件建议用 scripts/deploy-sentence-pool.sh 直传,避免浏览器上传超时。

升级建议

  • ▸蜘蛛池强烈建议升级;升完后可用「系统修复 → 恢复生产服务器标准」刷新 watchdog 脚本,或重装 watchdog。
  • ▸已在 CF 开 only-bots 的机器:本版是双保险 + 可安全重开 watchdog timer。
  • ▸未开 only-bots:请到 Cloudflare 页一键开启(免费版规则满 5 条时需先删一条非关键规则)。

质量

  • ▸watchdog_script_sync_test 钉死两处副本 + unix socket / NOT restarting
  • ▸human_admit_test / reject_closed_test(含 Hijack 路径)
  • ▸sentence_pool_test

v2.11.068

紧急
2026-07-29·46 MB(压缩,自动解压)

# v2.11.068 · Sitemap URL 统一开关 + 修 CF 520 误伤(critical)

> 两件事:①给蜘蛛池一个「URL 统一」开关(默认关=063 抓量优先);②修掉源站空关连接 / 自动封电信联通导致的 Cloudflare Error 520。

1. Sitemap URL 与页面统一(设置项)

  • ▸新键 sitemap_url_unify:默认关(空/0)。
  • ▸关:sitemap / 发现图用蜘蛛家族盐(与 063 相同)——蜘蛛池推荐,抓量优先。
  • ▸开:sitemap 与页面 canonical 同盐(064 风格)——利于收录,但会改发现图路径。
  • ▸设置页露出开关;分组可覆盖。改完 reload,sitemap 缓存键带 |u=1 避免串缓存。
  • ▸页面 <link rel=canonical> 始终按文章 ID,不受此开关影响。

2. 修 CF 520 误伤(生产事故)

根因链:源站对真人 Hijack 后空关 TCP(或自动封整个电信/联通 ASN)→ Cloudflare 看成「源站未知错误」→ Error 520,用户以为全站挂了,蜘蛛日志却是空的。

2.1 拦截改为正规响应 + Connection: close

auto_ban / 规则 block·deny / IP·UA 黑名单 / 云 IP / 人类限流:不再 Hijack 空关,统一 403/429 + 短 body + Connection: close。

拦归拦,CF 不再报 520。

2.2 自动封 ASN 永不碰国内宽带

anomaly 跳过并自动禁用已存在的:

  • ▸电信 AS4134 / AS4809 / AS4812
  • ▸联通 AS4837 / AS9929
  • ▸移动 AS9808 及常见移动 ASN

垃圾流量请用单 IP / bot_score / CF only-bots;整 ASN 封住宅网 = 全国用户 520。

2.3 自动规则动作用 deny

新建 auto-ip / auto-ua / auto-asn 规则改为 deny(有 body),与上面 2.1 一致。

升级建议

建议所有在用 Cloudflare 回源的部署立即升级(critical)。

已在 067 的蜘蛛池也要升——067 修了 TTL/URL 发现图,但不含本版 520 误伤修复。

升级后 anomaly 下一轮会自动关掉误伤的 auto-asn-AS4134 等;若后台仍开着 l5_bot_score_high/mid 的 enforce,可按需改回 shadow(模板默认本就是 shadow)。

v2.11.067

紧急
2026-07-29·46 MB(压缩,自动解压)

# v2.11.067 · 紧急:蜘蛛池 sitemap 默认缓存改回 3600 秒(critical)

> 容量事故热修。064 把蜘蛛池 sitemap 默认 max-age 从历史的 ~1 小时打成 60 秒,

> CF/Google 回源频率暴涨,accept 队列被灌满 → ListenOverflows → 域名打不开 / CF 521。

> 多位用户反馈 063 正常、一升 064+ 就炸。本版默认改回 3600 秒。

改动

  • ▸[handler/sitemap_cache.go](handler/sitemap_cache.go):蜘蛛池 sitemapCachePolicyFor 未配置时默认 3600(原 60)。
  • ▸仍可按分组/全局设 sitemap_cache_ttl_seconds 调短(要配合 sitemap_fresh_signals 勤刷时再用 300/60)。
  • ▸命中与未命中仍用同一 Cache-Control(064 修好的那部分保留)。
  • ▸站群 / 单站 / 泛目录行为不变。

与 066 的关系

  • ▸066:回退 URL 发现图(familySalt)。
  • ▸067:回退 sitemap 缓存默认 TTL。
  • ▸两条都是 064 引入的对外行为变化;都要退。

升级建议

已升 064/065/066 的蜘蛛池部署请立即升级(critical)。

等不及可先在后台设 sitemap_cache_ttl_seconds=3600 后 /internal/reload,或退 063 二进制。

v2.11.066

紧急
2026-07-29·46 MB(压缩,自动解压)

# v2.11.066 · 紧急回退 064 URL 统一 —— 恢复抓取发现图

> 事故热修(critical)。064 把 sitemap / 内链 / 链尾 URL 全部改成与页面 canonical 同盐后,

> Google 已认识的路径与泛子域主机名一夜断裂,已升级用户抓量全线下跌。

> 本版把发现图侧算法退回 063;065 的片段拼装与合成 URL 保留。

修了什么

  • ▸sitemap 真文章 URL:恢复蜘蛛家族盐(google=17 等)生成路径;主机名恢复 art.ID*13+familySalt。
  • ▸站内互链 / 404 推荐 / crawl 链尾:恢复 seed 盐,参与发现图的链接不再跟 064 一起换盐。
  • ▸页面 <link rel=canonical>:仍用文章 ID(与 063 一致)。短期接受「抓了不收录」,优先救抓量。
  • ▸合成 URL / 片段拼装(065):保留;合成路径继续自指 canonical(新 ID 无旧图可断)。
  • ▸观测告警(064):保留。若后台出现 ListenOverflows 拒连告警,那是容量/垃圾流量问题,

与本次 URL 回退无关——退 063 或升 066 都治不好拒连,需按 somaxconn / 异常 UA / 迁域名排查。

没动什么

  • ▸B1 模式隔离、B3 sitemap 缓存策略、B4 日志 status+route_kind、设置审计、四条告警 —— 全部保留。

升级建议

所有已升到 v2.11.064 / v2.11.065 的部署请立即升级本版(critical)。

等不及编译推送的,可先手工退 063(只换二进制):

```bash

cd /tmp && curl -fsSL -o sp063.gz https://dl.wztseo.com/spider-pool/v2.11.063/spider-pool-linux-amd64.gz && gunzip -c sp063.gz > sp063 && echo '0ca29838f6ef7bea230603170bfaaabc3f606976a8031916fa76b291a762d51e sp063' | sha256sum -c && systemctl stop spider-pool spider-admin && cp -a /opt/spider-pool/spider-pool /opt/spider-pool/spider-pool.bak.from064 && install -m 755 sp063 /opt/spider-pool/spider-pool && systemctl start spider-pool spider-admin && /opt/spider-pool/spider-pool --version

```

有 ListenOverflows 告警的机器:先按拒连排障,不要指望换版本 alone 恢复。

v2.11.065

2026-07-29·46 MB(压缩,自动解压)

# v2.11.065 · 蜘蛛池片段拼装 + sitemap 合成 URL

> 把秒速排那套「句子池现拼 + 无限 URL」搬到我们引擎上,只动蜘蛛池模式。

> 站群 / 单站 / 泛目录对外行为零变更。

🧩 片段拼装:任意 URL 都能产出实质正文

文章库找不到 ID 时,蜘蛛池模式从句子池现抽约 15 句拼成正文。

页面集合不再被文章库大小(约 40 万篇)封顶。

  • ▸按 URL 稳定(不是每请求都变)—— 抓取空间是 URL 集合不是响应集合;

同一 URL 每次变对空间零增益,只会废掉缓存和 304。

  • ▸三道闸:必须 spider_pool + 开关未关 + 句子池已导入。没导入池子时行为与改之前一致。
  • ▸顺带修掉一处陈年死代码:content 句子池类别此前从未被加载,中间级兜底一直是空的。

设置:spider_pool_fragment_body(默认开)、spider_pool_fragment_paras(默认 15)。

📡 sitemap 合成 URL:把空间兑现成流量

蜘蛛池 sitemap 在真文章之外再发 N 倍未知 ID(默认 10×,基数 1 亿):

  • ▸路径走 ArticleURLPathCanonical(..., id, 0, ""),与伪文章 canonical 自指
  • ▸extractID 往返校验失败的不发(挡 {id}_{日期}.html 这类模板)
  • ▸按小时桶轮换;缓存键带桶,桶内仍可缓存
  • ▸修复:文章写入计入 urlsWritten,防止边界页超 pageSize

设置:sitemap_synthetic(默认开)、sitemap_synthetic_ratio(默认 10)。

📦 句子池

试跑组 ennews(清洗后约 144 万句 / 14.7 万标题)需放到

data/content/*.txt 与 data/title/*.txt(根级文件 → _common)。

清洗脚本:scripts/clean-sentence-pool.py。

升级建议

  • ▸蜘蛛池部署建议升级;站群/单站不受影响。
  • ▸⚠️ 首日建议把 sitemap_synthetic_ratio 设为 1,观察 sitemap 抓取与内存后再调回 10。
  • ▸秒关:sitemap_synthetic=0 或 spider_pool_fragment_body=0,然后 /internal/reload。
  • ▸未导入句子池时,合成 URL 仍会发放,正文回退到关键词兜底(偏薄)。

v2.11.064

2026-07-29·46 MB(压缩,自动解压)

# v2.11.064 · 文章 URL 规范化 + 抓取观测盲区清零

> 这一版围绕「蜘蛛来了,但抓了不收录 / 收录不了也看不出为什么」。

> 主角是一个隐藏很久的 URL 规范化缺陷 —— 实测每域名 18.99 万条 URL 里 92% 中招。

> 其余五项都在补观测:让「抓取量到底花在哪」「谁改了配置」「源站是不是在拒连」变得可查。

🎯 92% 的 sitemap URL 被 Google 判为「非规范副本」

同一篇文章,系统里原先有 7 个地方各自生成 URL,而且各传各的随机盐:

| 生产者 | 用的盐 |

|---|---|

| sitemap | 蜘蛛家族盐 17 / 101 / 43 / 71 |

| 页面 canonical 标签 | 文章 ID |

| GSC 推送 | 17 |

| 百度推送 | 101 |

| 站内互链 | 渲染上下文 seed |

| 404 推荐 | 0 |

结果是同一篇文章有好几个不同的 URL,而只有 canonical 那一个是自指的。

sitemap 挂出去的全是非规范副本 —— Google 抓到后判定「替代网页(含适当的规范标记)」,

抓了但不索引。这正是「蜘蛛量不低、收录却上不去」的直接原因。

修复:新增唯一入口 ArticleURLPathCanonical / ArticleURLCanonical,

URL 只由文章自身决定(文章 ID + 它自己的栏目),不再受渲染上下文影响,七个生产者全部改走这里。

顺带修掉三个同源问题:

  • ▸合并两份重复的 URL 渲染实现。 两份的日期种子不同,{cid} 一个填真实栏目 ID、一个填空;

用 {cid}+{aid} 规则的站点,两边算出来是完全不同的路径,不只差一个月份。

  • ▸同一篇文章出现在不同栏目的列表页里,原先会拿到不同 URL。 现在一律用文章自己的栏目。
  • ▸GSC / 百度推送原先完全绕过域名 URL 规则,推出去的 URL 跟站点实际 URL 对不上,

白烧 Indexing API 配额。

📊 蜘蛛日志补上状态码与路由类型

spider.logs 此前只记「谁来了、访问了什么路径」,不记响应结果。

于是「1000 万次抓取」这个数字里,有多少是真实内容页、多少是跳转空转、多少是 5xx 报错,

在任何统计里都分不出来。

本版新增两列:

  • ▸status —— HTTP 状态码。302 灌水、503 降级、5xx 故障从此可分。
  • ▸route_kind —— 路由类型(内容页 / robots / sitemap / 跳转 / 缓存命中)。

> 实测意义:高抓取量时段里 robots.txt 稳定占全部请求的 41%~58%。

> 这在泛域名场景下是正常的(每发现一个新子域就要取一次 robots),

> 但在补上这两列之前,它和真实内容抓取混在同一个数字里,无法区分。

表结构变更为幂等加列,升级时自动执行,不影响历史数据。

🔀 修模式隔离:蜘蛛池的全局设置会串到站群

同一台机器上混跑多种模式时,有三处代码在读全局运营模式,而不是域名所在分组的模式。

后果是:给蜘蛛池调的设置,会影响到站群/单站域名的 sitemap 顶层信号和渲染策略。

三处已全部改为按分组解析。另加了一条源码审计测试——

今后谁再在这个包里直接读全局 operation_mode,测试会直接失败。

⏱ sitemap 缓存策略:摘掉一个压抓取频率的响应头

原先三处各说各话:内部缓存 10 分钟 / 5 分钟(写死),命中时回 max-age=300,

未命中时回 max-age=3600。同一个 URL 的缓存指令,取决于我们的缓存碰巧热不热 ——

从 Google 角度看是随机的。

更要紧的是那个 3600:它和历史上从页面摘掉后换来 2.9 倍抓取量的是同一个值,

在 sitemap 这条路径上一直留着。它在对 Google 说「一小时内别再来取 sitemap」,

而「每天刷新 lastmod」想要的恰恰是它勤来取 —— 两件事互相抵消。

现在:蜘蛛池模式下 TTL 可配(默认 60 秒),命中与未命中用同一个缓存指令,

对外 max-age 严格等于内部 TTL。

> 站群 / 单站 / 泛目录模式逐字节不变,包括上面那个命中/未命中不一致的历史行为 ——

> 改动它会影响这些模式的对外表现,应当单独评估,不在本版范围内。

🔔 四条新告警

此前所有告警盯的都是「机器和服务有没有事」。但有几类故障发生时机器一切正常:

  • ▸强引开着却没在生效 —— 配置显示开启,实际一条跳转都没产生。
  • ▸抓取量断崖式下跌 —— 与自身基线对比,跌幅超阈值即报。
  • ▸源站在 TCP 层拒连 —— 读内核 ListenOverflows 计数。这类失败根本到不了应用层,

应用日志里干干净净,而 Cloudflare 那边已经在报 521。

  • ▸域名集体转黑 —— 昨天还有抓取、今天归零的域名批量出现。

阈值均可配置,填 0 即关闭该条。

📝 设置变更审计

后台保存系统设置从来没有写过操作日志。

曾经发生过关键开关被改动、事后无法追溯是谁改的、什么时候改的。现在补上了。

两个细节:

  • ▸设置页每次保存都提交整张表单(几百个键),因此只记录真正发生变化的键。
  • ▸敏感字段(密码 / 密钥 / Token)不回显明文,但附一段短指纹 ——

否则「密钥被换过」和「密钥没动过」在日志里长得一模一样,审计就失去意义。

🧪 验证

  • ▸新增约 45 个单元测试。
  • ▸关键模块全部通过变异测试自证(逐条把生产代码改坏,确认测试确实会失败):

sitemap 缓存策略 7/7、设置审计 11/11、告警与日志字段全部捕获。

  • ▸另有两个源码审计测试,用于阻止同类问题复发:

一个盯「文章 URL 是否都走规范入口」,一个盯「是否有人直接读全局运营模式」。

  • ▸门禁全绿:build / vet / 全量测试 / race 竞态检测 / 格式检查。

升级建议

建议所有部署升级,尤其是「蜘蛛量正常但收录上不去」的站点。

> ⚠️ 部分站点的文章 URL 会发生变化。 本版把七个生产者统一到同一套规则,

> 因此原先由 sitemap / 推送 / 互链产生的那批非规范 URL 会改为与页面 canonical 一致。

> 使用含日期或 {cid} 占位符的 URL 规则的站点,变化范围更大。

>

> 这正是修复的目的 —— 让挂出去的 URL 和自指的 canonical 对齐。

> 旧 URL 在默认配置(block_invalid_url = off)下仍可正常打开;

> 若把该项设为 404,建议升级后重新提交一次 sitemap。

升级后可关注两处:Search Console 里「替代网页(含适当的规范标记)」的数量应逐步下降;

蜘蛛统计中 robots.txt 与真实内容页的比例首次变得可查。

v2.11.063

2026-07-28·46 MB(压缩,自动解压)

# v2.11.063 · 授权降级 503 可见性 + sitemap 抓取信号开关

> 这一版围绕同一个问题:「后台显示没蜘蛛,但说不出为什么」。

> 两条改动分别堵住了两个「系统自己在挡蜘蛛、却在任何统计里都看不见」的盲区。

> 对外行为默认零变更——新开关默认关闭,不主动改变任何站点当前的表现。

🔍 授权降级正在回 503,现在能看见了

授权异常时,系统会对搜索引擎返回 503(签名失效 / 部分降速 / 完全停服)。

问题在于这三处 503 都发生在写日志之前——ClickHouse 里查不到、蜘蛛统计里不计数。

于是会出现这样的场景:一个有 2000 个域名的站点,1999 个非主域名正在对 Google 说

「24 小时内别来」,而后台只显示「没蜘蛛」,查不出任何线索。

现在:

  • ▸进程内按原因(签名失效 / 部分降速 / 完全停服)和域名分别计数。
  • ▸后台新增接口 /api/admin/license/degrade,把「静态授权状态」和「实际已经回了多少次 503」

一并给出,并附上人话解释。

  • ▸新增告警规则:降级正在发生时主动报。此前所有告警盯的都是「机器/服务有没有事」,

而这件事发生时机器一切正常,蜘蛛却被系统自己挡在门外。

  • ▸相关日志按 5 分钟节流写入 journalctl,不刷屏;节流不影响计数准确性。

> 说明:这一版只做可见性,不改变降级逻辑本身。授权正常的站点不受任何影响。

🕷 sitemap 抓取信号开关(默认关闭)

新增分组级配置项 sitemap_fresh_signals。开启后,该分组的 sitemap 会把

lastmod 报为当天、changefreq 报为 always、priority 报为 1.0。

背景:当前默认策略出于稳妥考虑,会把 lastmod 锁定为本周一(每周才变一次),

并按文章发布年龄把 priority 逐级衰减到 0.4、changefreq 降到 monthly。

文章库越老,被标成「一个月才变一次」的比例越高,Google 的回访频率也就越低。

新开关允许按域名分组解除这一限制,便于先在部分分组上验证效果再决定是否推广。

  • ▸默认关闭,不开启则与上一版逐字节一致。
  • ▸分组级生效:可以只对一部分域名开启,其余作为对照。
  • ▸修改后需要重载配置,叠加 sitemap 缓存约 10 分钟内全量生效。

> ⚠️ 三个信号里,只有 lastmod 是 Google 明确会用于安排抓取计划的;

> 官方已声明忽略 changefreq 与 priority。三者一并给出,是为了让对比实验的

> 变量收敛成单一开关,不代表后两者本身有效果。

>

> ⚠️ 该开关目前没有后台界面,在分组配置里维护。请注意:通过后台保存分组时

> 会整体覆盖分组配置,可能导致该项被清除。

🧪 验证

  • ▸新增 24 个单元测试(授权降级 17 个 + sitemap 信号 7 个)。
  • ▸两组测试均通过变异测试自证(逐条把生产代码改坏,确认测试确实会失败):

授权降级 6/6、sitemap 信号 7/7 全部捕获。

  • ▸门禁全绿:build / vet / 全量测试 / race 竞态检测 / 格式检查。

升级建议

  • ▸建议所有部署升级。默认行为无变化,升级风险低。
  • ▸若曾遇到「后台显示没蜘蛛但查不出原因」,升级后可先看

「授权降级」接口的返回,通常能直接给出答案。

v2.11.062

2026-07-27·45 MB(压缩,自动解压)

# v2.11.062 · 文章库增量加载 + 文章 ID 不再复用(环形文章库 阶段 A0)

> 这一版是基础设施改造,对外行为零变更:后台看到的文章、蜘蛛端渲染的内容、

> 所有页面输出都和上一版完全一致。改的是"文章数据怎么进内存"和"文章 ID 怎么分配",

> 为后续的环形文章库(固定容量、自动汰换)打地基。

>

> 直接可感知的收益是大库的 CPU/GC 压力显著下降,以及批量导入快一个数量级。

🚀 增量加载:文章变更不再触发全量 reload

以前每次新增/修改文章,蜘蛛端都要把整个文章库重新读进内存。库越大越吃力,

高频采集时能到每分钟三次全量 reload。

现在文章的增删改会通过数据库触发器记进一份变更日志,蜘蛛端只消费增量:

  • ▸后台批量更新 3000 篇 → 增量应用约 1 秒(42 万篇规模实测)。
  • ▸一次性导入 12 万篇产生的 12 万条变更 → 分批追赶共约 10.7 秒,一条不丢。
  • ▸全量 reload 现在只服务配置类变更(设置/域名/模板),去抖仍是 20 秒,不变。

🔒 文章 ID 不再复用

以前文章被删除后,它的 ID 可能被新文章重新占用。而翻译、AI 生成记录、推送历史、

搜索引擎已收录的 URL 里可能还挂着旧的那个 ID —— 于是新文章会莫名其妙继承旧文章的关联数据。

现在 ID 由单调序列分配,发放过的号永不回收,从根上消除这类串数据的问题。

📦 导入更快、更可靠

  • ▸批量导入分批事务:1 万篇导入从 20.85 秒降到 1.03 秒。
  • ▸不再静默丢文章:导入过程中分配失败、写入失败、文件读取失败,以前会跳过继续、

最后照样报"导入完成";现在一律明确报错。

  • ▸不再"报错又报成功":批量导入出错时以前可能先返回错误、再返回成功,客户端无所适从。
  • ▸读取中断不再留半截数据:导入文件读到一半出错时,已读部分不再被提交,重试不会重复导入。
  • ▸跨服务器迁移修正:完整导出/导入会重新分配 ID,但以前仍把 similar_to_id(指向另一篇文章的 ID)

原样搬到目标库,导致相似度关联指向毫不相关的文章。现在该字段与相似度评分一并清空,由目标库重算。

🧪 验证

  • ▸五轮"修复 → 双人独立复检"收敛;单元/集成测试新增约 42 个用例,含 20 万轮随机差分测试。
  • ▸真机演练(测试机灌到生产量级):30 万篇迁移 + 载入共 9.7 秒;

再灌 12 万篇域私有后共 42 万篇,3 路并发随机泛二级域流量持续压测,

累计数千次请求零失败,内存稳定在 ~925MB 不增长。

  • ▸Schema 改动全为加法(只加列/表/触发器/索引),回滚安全:装了本版再退回旧版仍可正常读写。

升级建议

  • ▸建议所有部署升级,文章库越大收益越明显。
  • ▸首次启动会执行一次数据迁移(加列 + 建触发器):30 万篇实测约 10 秒,期间服务不可用,属正常重启窗口。
  • ▸环形文章库(固定容量汰换)本版尚未启用,article_ring_capacity 默认为 0。

v2.11.061

2026-07-25·45 MB(压缩,自动解压)

# v2.11.061 · AI 生成文章自动带表格(提升 SEO 评分 + SERP 表格富摘要)

> 针对内容管理批量 SEO 评分里「缺 markdown 表格(失 SERP 表格预览)」的扣分项:

> AI 采集与新闻采集生成的新文章现在会稳定带上表格,拿满评分的表格维度,

> 并争取 Google 搜索结果的表格富摘要展示。

✨ 双保险机制

  • ▸提示词补强:给通用中文提示词(SEO 博客/百科/测评/产品)补上「必须含至少 1 个表格」的硬要求,

让 AI 优先生成与内容相关的真表格(对比/参数/要点归纳)。

  • ▸自动兜底:AI 未按要求生成表格时,系统在写入前自动补插一个「关键信息速览」表(插在首个 H2 之后),

保证成品文章正文一定含表格。AI/新闻两条采集链路均已接入。

📈 效果

  • ▸新生成文章的 SEO 评分表格维度(10 分)稳定得分;有机会获得 Google SERP 表格富摘要,提升点击率。
  • ▸已含表格的文章不受影响;仅作用于新生成文章,不改动存量已发布文章。

升级建议

  • ▸做 AI 采集/新闻采集的部署建议升级。改动仅影响新文章生成链路,不改数据结构与核心抓取/渲染/授权逻辑。

v2.11.060

2026-07-25·45 MB(压缩,自动解压)

# v2.11.060 · 蜘蛛访问日志页体验优化:IP/城市分列 + 筛选重排 + 无感刷新

> 「蜘蛛访问日志」页继续打磨:访问明细 IP 与城市拆为独立列、域名统计筛选区重新布局、

> 下拉面板跟随主题、两页数据定时自动刷新改为无感更新。纯前端展示层,零数据/逻辑变更。

📋 访问明细

  • ▸「IP/城市」拆成 IP 与 城市 两个独立列,各自对齐,信息一目了然。

🌐 域名统计

  • ▸筛选区重排:范围 / 口径 / 排序 分组整齐、搜索区右对齐,蜘蛛选择器独立成行,布局更规整。
  • ▸下拉面板主题修复:口径、排序由原生 select 换成 Element Plus 下拉,

面板配色现在完美跟随后台主题切换器(深色/浅色一致),不再是突兀的白色。

⚡ 无感更新

  • ▸域名统计(45s)、访问明细(60s)的定时自动刷新改为无感更新:后台静默拉取最新数据,

不再出现"加载中"闪烁、列表清空重排;刷新失败时保留当前数据、不闪报错,下个周期自愈。

  • ▸用户主动操作(切换筛选/翻页/重试)仍正常显示加载与错误反馈。

升级建议

  • ▸建议升级以获得更顺滑的后台观测体验。纯 UI/交互调整,零数据/逻辑变更,升级无风险。

v2.11.059

2026-07-24·45 MB(压缩,自动解压)

# v2.11.059 · 蜘蛛访问日志页 UI 精修:访问明细瘦身 + 域名统计配色分层

> 「蜘蛛访问日志」页两个标签的界面细节优化,让信息更聚焦、分类更清晰。

> 纯前端展示层调整,不改任何数据口径、抓取/渲染/授权与统计逻辑。

📋 访问明细

  • ▸精简表格:去掉独立的「域名」列(8 列 → 7 列),把横向空间让给「访问地址」等更需要宽度的列。
  • ▸IP/城市保持单行显示,更紧凑清爽。
  • ▸筛选区重排为三段式:日期行 / 蜘蛛行 / 域名行,各行内部高度一致、间距拉开,

快捷按钮右对齐,不再挤成一团。

🌐 域名统计

  • ▸指标卡改版:带左侧语义色条,数字加大加粗;总到访=主色、泛域=青、未分类告警=橙、

最佳站点=紫,一眼区分指标类别。

  • ▸表格分类信息配色分层:站点类型(单域/泛域站/混合/推断)、域名类型(主域/泛域/未分类)

按语义上色并加描边;统计对象/域名高亮、归属主域弱化,文字层次分明,不再"一片白"。

  • ▸占比条改为蓝→青渐变、表头与输入框聚焦态增强等细节打磨。

升级建议

  • ▸建议升级以获得更清晰的后台观测体验。纯 UI 调整,零数据/逻辑变更,升级无风险。

v2.11.058

2026-07-24·45 MB(压缩,自动解压)

# v2.11.058 · 蜘蛛访问日志改版:三标签视图 + 域名分类统计

> 「蜘蛛访问日志」页整体改版:拆为「数据概览 / 域名统计 / 访问明细」三个标签,

> 域名统计从「单纯排行」升级为「按分类聚合」,一眼看清各类站点的蜘蛛到访分布。

> 纯后台观测功能,不改抓取/渲染/授权与核心计数逻辑。

📊 三标签视图

  • ▸数据概览:总到访、活跃域名、按搜索引擎分布等汇总指标集中展示。
  • ▸域名统计:域名 × 搜索引擎到访次数,支持按分类聚合查看各类站点吸引蜘蛛的情况;

支持时间范围(今天/昨天/近7天/近30天)、升降序、域名关键字搜索、分页与占比。

  • ▸访问明细:保留原始逐条访问记录查询,来源明细抽屉宽度自适应窗口。

⚙️ 实现要点

  • ▸数据源:沿用 ClickHouse spider.stats_domain_daily(日×蜘蛛×域名预聚合)+ 物化视图

增量维护,查询走聚合表,秒级响应;无 ClickHouse 的单站/小节点自动走按天文本日志聚合,口径一致。

  • ▸迁移解耦:建表(DDL)、历史回填、失败重试全部移到独立后台迁移服务,与 API 热路径彻底分离;

迁移状态机(idle/running/completed/backoff)带指数退避重试,不会因反复调用而重启已完成的迁移。

  • ▸数据一致性:单日回填采用不可变分类快照 + 前后校验和(checksum)双重校验,配置中途变更也不会

混入不一致口径;REPLACE PARTITION 后二次校验,校验不过不写完成标记。

  • ▸稳健性:ClickHouse 计数严格解析(区分空响应/协议异常与真实 0 值,异常明确报错而非误当 0);

聚合全程 int64 溢出保护;崩溃遗留的临时 stage 表可安全清理,不误伤活跃 worker 与目标表。

升级建议

  • ▸建议所有部署升级。纯后台观测功能,不改数据结构与核心抓取/渲染/授权逻辑;

有 ClickHouse 的服务器升级后由后台迁移服务自动完成建表与近 30 天历史回填。

v2.11.057

2026-07-24·45 MB(压缩,自动解压)

# v2.11.057 · 后台新增「域名 × 搜索引擎 蜘蛛到访排行」

> 蜘蛛访问日志页新增「域名到访排行」:按搜索引擎给各域名的蜘蛛到访次数排序,

> 一眼看出哪些域名吸引蜘蛛、哪些不引蜘蛛。纯后台观测功能,不改抓取/渲染/授权。

🏆 功能

  • ▸在「蜘蛛访问日志」页新增域名排行面板:选中某搜索引擎(如 Google),即列出各域名被该蜘蛛

访问的次数,降序排列;选「全部」则按所有已识别蜘蛛合计。

  • ▸时间范围:今天 / 昨天 / 近7天 / 近30天。
  • ▸支持:按次数升/降序、域名关键字搜索、分页;显示每个域名的到访次数与占比。

⚙️ 实现要点

  • ▸数据源:新增 ClickHouse spider.stats_domain_daily(按 日×蜘蛛×域名 预聚合)+ 物化视图

增量维护,查询走聚合表而非直扫每天数千万行的原始日志,秒级响应。无 ClickHouse 的单站/小节点

自动走按天文本日志聚合,口径一致。

  • ▸升级自愈:有 CH 的服务器升级后自动建表 + 建 MV,并逐日回填近 30 天历史(缺哪天补哪天,

幂等,不会重复累加也不会丢历史);建表未完成时不回填、失败自动重试。

  • ▸稳健性:统计口径一致、翻页稳定不重不漏、关键字按字面量匹配;CH 查询异常时明确报错而非

返回空数据误导;时区统一在后端换算并在启动校验 CH 与服务器时区。

升级建议

  • ▸建议所有部署升级。纯后台观测功能,不改数据结构与核心抓取/渲染/授权逻辑;

有 ClickHouse 的服务器升级后自动完成建表与近 30 天历史回填。

v2.11.056

2026-07-23·44 MB(压缩,自动解压)

# v2.11.056 · 统一安装包 + legacy 版加固(打包/发布改进,产品逻辑不变)

> 本版不改产品代码,只优化发布打包:合并为单一安装包、并让老系统包也获得同等混淆。

> 无需担心兼容性,授权/抓取/渲染逻辑与 v2.11.055 完全一致。

📦 统一为一个安装包(新老系统通吃)

以前按系统 glibc 分两个变体下载:标准版(GLIBC_2.34,仅新系统)+ legacy 版(GLIBC_2.28,老系统)。

两者源码完全相同,只是编译环境不同。因 GLIBC_2.28 向后兼容(新老系统都能跑),现统一为一个包:

  • ▸所有系统统一下载 spider-pool-linux-amd64(GLIBC_2.28 编译,Debian11+/Ubuntu20.04+/RHEL8+ 通吃);
  • ▸install 脚本去掉 glibc 分流逻辑,只做最低门槛校验(≥2.28 放行);
  • ▸发布链路减半,不再需要分别构建两个变体。
  • ▸过渡兼容:仍保留一份 -legacy 同内容别名,旧版 install 脚本升级前不会 404。

🔒 legacy/老系统包同等混淆加固

老系统包以前是普通 build(字符串明文、易逆向),现改为与标准版同等的 garble -literals

混淆 + 字符串加密:授权判断逻辑符号、包结构、内部字符串全部混淆,逆向可读性大幅降低。

(说明:白嫖满速本就需要伪造官网私钥签名或 patch 二进制,混淆进一步抬高 patch 定位难度。)

🧰 发布工具链

  • ▸Dockerfile.bullseye:固化 garble 进构建镜像(走 goproxy.cn)。
  • ▸build-on-vm.sh:统一走 VM 上 bullseye-Docker garble 编译产出通吃包;修复历史「编译失败被吞、误报已发布」与「go 版本过低不生成二进制」两个发布链路隐患。
  • ▸publish.sh:上传主包三件套 + 向后兼容 -legacy 别名。

升级建议

  • ▸建议所有部署升级。产品逻辑与 v2.11.055 一致,仅打包与老系统安全性改进。

v2.11.055

2026-07-23·44 MB(压缩,自动解压)

# v2.11.055 · 安全加固:客户端补授权过期校验,堵已签名过期缓存白嫖

> 本版核心为一处授权安全修复(经 GPT-5.6 复检),另附新增模板预设与电商多语言。

> 不改数据结构、不影响抓取渲染,建议所有部署升级。

🔒 授权:客户端校验 license 过期(堵长期白嫖)

原客户端速度因子只看「厂商签名有效 + active=true」,漏了到期校验:

一份历史正版缓存(active=true)在过期后仍被当满速使用,可长期白嫖,且无需 patch 二进制。

  • ▸新增 isExpired() 过期判定:
  • ▸ExpiresAt 为空 = 永久授权,豁免不过期;
  • ▸非空但无法解析(非 RFC3339)= 保守当已过期(fail-closed),堵住「malformed 已签名日期被当永久满速」的 fail-open 口子;
  • ▸带 24h 宽限,防时钟/时区抖动把刚过期几分钟的正版立刻掐断。
  • ▸verifiedActive = 签名有效 && active && !isExpired();过期后不再算满速,落到「按过期天数梯度降速」的正版宽限逻辑。
  • ▸新增测试覆盖:过期 / 永久 / 未过期 / malformed 已签名日期 四类场景,回归全绿。

> 兼容性:正版授权都是合法 RFC3339 或空(永久),不受影响;仅历史过期缓存被正确降速。

🎨 新增模板预设

  • ▸新增 preset-company / preset-ecommerce / preset-news 三类行业预设模板集;
  • ▸新增 preset-universal/darksuite 通用深色套系。

🌐 电商多语言(i18n)

  • ▸新增 engine/i18n_ecommerce 电商场景多语言词库与测试,配合电商模板本地化渲染。

🧪 其它

  • ▸同步 engine 包两处陈旧测试断言:unicode 过滤器自 v2.11.021 改用 HTML 数字实体 &#xXXXX;(标题进 <title>/<h1> 才能被浏览器/Google 正确解码);postdate 经 naturalPubTime 去指纹扰动后不再等于原始日期。测试全绿。

升级建议

  • ▸建议所有部署升级。核心为授权过期校验修复,不改数据结构、不影响抓取渲染。

v2.11.054

2026-07-23·45 MB(压缩,自动解压)

# v2.11.054 · 安全加固:SSRF 防护 / 首装抢注 / 模板并发数据竞争

> 本版为纯安全加固,修复三处经 GPT-5.6 多轮独立审查确认的问题,均不改数据结构、不影响抓取渲染。

> 建议所有部署尽快升级。

🔒 S2 · 图片代理(/img-proxy)匿名 SSRF 加固

/img-proxy 是供蜘蛛匿名访问的公网接口,旧实现仅校验 URL 前缀就去拉取任意地址,

可被利用请求内网服务 / 回环 / 云元数据(169.254.169.254)造成 SSRF 数据外泄。

  • ▸新增拨号层(DialContext)IP 拦截:拒绝环回、私网(10/172.16/192.168)、link-local、

CGNAT(100.64/10)、198.18/15、未指定、多播等高危网段;用已校验 IP 直连防 DNS rebinding,

每跳重定向重新校验防重定向绕过。

  • ▸URL 只允许 http/https scheme(挡 file://、gopher:// 等)。
  • ▸响应内容以字节魔数为准判定是否图片,不信任上游 Content-Type:伪造 CT=image/* 的

HTML/JSON/SVG 一律拒绝;对外输出 Content-Type 按魔数权威推导(不回传上游 CT),

配合 X-Content-Type-Options: nosniff,彻底挡住 SVG / polyglot 造成的存储型 XSS。

  • ▸失败响应头不再回显内部错误明文(防泄露被拦内网 IP / DNS 细节)。
  • ▸缓存命中同样复验,清理历史版本可能缓存过的非图片内容。

🔒 S1 · 首次安装接口抢注防护

首装接口(创建首个管理员)是无鉴权公网接口,旧实现仅靠「admins 表为空」判断,

一旦删库 / 部署空窗期,可能被扫描器抢注管理员接管后台。

  • ▸首装成功写持久 install_completed 标记;标记存在后,即使 admins 表被清空也拒绝公网首装

(此时用命令行 --reset-admin 恢复)。

  • ▸创建管理员 + 写标记放入同一事务(BEGIN IMMEDIATE),任一步失败回滚,消除中间态被利用的窗口;

事务内二次校验管理员数,兼顾多实例竞态。

  • ▸旧部署升级时自动回填标记,防历史部署删库后被抢注。

🔧 B1 · 模板集并发读写数据竞争

模板热更新(/internal/reload)整体替换 map 时,与请求路径高并发读存在 data race。

  • ▸模板快照改为 atomic.Pointer 原子读写,消除竞争(go test -race 通过,无竞争)。

🧪 其它

  • ▸修正 admin 包一处陈旧测试断言(模板集数量由 3 扩到 12 后一直误报),回归全绿。

升级建议

  • ▸建议所有部署升级。纯安全加固,不改数据结构、不影响抓取渲染与授权逻辑。

v2.11.053

2026-07-22·45 MB(压缩,自动解压)

# v2.11.053 · 修复模板商城「换了缩略图后台仍显示旧图」

> 官网商城的缩略图已更新,但蜘蛛池后台里部分模板(🌐 通用/深色 dark 系列等)仍显示旧缩略图。

> 这一版修掉后台预览图的缓存机制,让换图后能自动跟上。

🐛 问题:后台部分模板缩略图换了不更新

模板缩略图有两种来源:

  • ▸内嵌 SVG(如 TechWire / NoirPress 等精品套):图直接写在目录里,换图立即生效 —— 一直正常;
  • ▸COS 图片(dark1–9、pgslot 系列、cryptonova 等):后台走 /api/admin/market/preview/{id} 代理取图。

旧的代理实现有三个问题,导致 COS 换了 preview.jpg 后后台仍吐旧图:

1. 内存缓存按模板 id 存、几乎不过期;

2. Cache-Control: max-age=86400,浏览器也缓存一整天;

3. 预览 URL 不带版本号,换图后地址不变,一直命中旧缓存。

🔧 修复

对齐官网做法,给后台预览代理加版本感知:

  • ▸预览 URL 改为 /api/admin/market/preview/{id}?v={version} —— 版本变了 URL 就变,自动绕开旧缓存;
  • ▸内存缓存键改为 id::version + 5 分钟 TTL,Cache-Control 降到 300 秒;
  • ▸点商城「刷新」时清空预览内存缓存,立刻和 COS 新图对齐。

💡 之后维护模板的提示

  • ▸更新商城模板(dark/pgslot/crypto 等走 COS 的):传新 preview.jpg / zip 到 COS 后,

务必把目录里该模板的 version 一并 +1 —— 这样后台/浏览器才会自动取新图,不会命中旧缓存。

  • ▸内嵌 SVG 缩略图的官方预设、以及指纹/引擎逻辑,仍需发版才能更新(不属在线更新范围)。

升级建议

  • ▸用模板商城、遇到过「换了缩略图后台不更新」的建议升级。纯后台预览缓存修复,不改数据结构、不影响抓取渲染。

v2.11.052

2026-07-22·43 MB(压缩,自动解压)

# v2.11.052 · 修复模板商城「卸载后绑定残留」+ 卸载确认弹窗改为系统内置

> 解决两个模板商城的体验问题:卸载弹窗还是浏览器原生灰框、以及**卸载模板后绑定关系没清干净,

> 导致「模板已删、绑定还在、想给域名换装新模板却绑不上」。**

🐛 核心修复:卸载模板后绑定残留,新模板无法绑定

模板↔域名的真正绑定存在 template_domains(渲染引擎实际认的机制)。旧版商城卸载有两个漏洞:

  • ▸绑定检查查错地方:只查了 domains.template 字段,没查真正生效的 template_domains ——

于是某域名明明绑在该模板上,卸载检查却看不到,结果「模板目录删了、绑定却残留」。

  • ▸卸载后不清理绑定:删完模板目录就返回,template_domains 里的残留(ghost)条目没删 →

再给该域名装新模板时,系统认为它还绑在已删的旧模板上,绑不上。

现在:

  • ▸卸载前的绑定检查合并 template_domains 来源,拦截提示会列出正在使用的具体域名,指引先换绑;
  • ▸卸载成功后自动清掉该模板在 template_domains 里的绑定,杜绝 ghost 残留;
  • ▸若历史上已有残留(旧版卸载留下的),给对应域名重新装模板即可正常绑定。

🎨 卸载确认弹窗改为系统内置弹窗

模板商城「卸载」的确认框以前是浏览器原生 confirm()(灰白系统框、无法跟随主题)。现改为系统内置弹窗:

  • ▸玻璃磨砂样式、跟随主题切换器(亮/暗色、主题色一致);
  • ▸模板名加粗、多行说明清晰,按钮为「确定卸载 / 取消」。

升级建议

  • ▸用模板商城装卸模板、遇到过「卸载后换不了模板 / 绑不上」的建议升级。
  • ▸纯后台模板管理修复,不改数据结构、不影响抓取与渲染,可随需升级。

v2.11.051

2026-07-22·43 MB(压缩,自动解压)

# v2.11.051 · 修复「普通用户流量分析」明明选中网段却显示「封禁 0」

> 解决一个反复出现、之前几版都没根治的困惑:**在「安全中心 → 普通用户流量分析」里,

> 一个明显被识别为工具/脚本的网段,点封禁却提示「封禁 0」,让人以为没生效。**

> 这一版把封禁结果讲成人话、并修掉底层的两个隐患。

🐛 核心修复:封禁结果不再含糊,分「新封 / 已在名单 / 被拒」三类

以前后台只回一个「封禁 X 个」,当网段本来就在名单里时这个数是 0 —— 于是显示

「封禁 0」,让人误以为失败。实际上它一直在生效。现在封禁后会明确告诉你:

  • ▸✅ 新封 N 个 —— 本次新增、已写入「威胁情报名单」;
  • ▸ℹ️ M 个本就在名单里(正在生效) —— 不是失败,是已经封着,无需重复封;
  • ▸⛔ K 个被安全护栏拒绝 —— 逐条给出原因(搜索引擎/CDN 段、段内有蜘蛛流量、非法 CIDR)。

🔧 修复:封禁时的「聚合窗口漂移」隐患

页面展示的网段是某一刻聚合出来的,而封禁是在你点击的几秒后再判断。由于聚合用的是

滑动时间窗口,那几秒里窗口会漂移,可能让刚才还在列表里的网段「掉出」结果 →

老逻辑据此误判「不在最近聚合里,拒绝封禁」,造成「明明选中了却封不了」。

新版封禁时改用独立护栏校验,只守三条安全红线,不再依赖那次会漂移的聚合:

1. CIDR 必须合法(纯本地判断);

2. 不能落在搜索引擎 / CDN 回源段(纯本地 protectedCIDRs,永远可靠);

3. 段内不能有蜘蛛流量(实时精确查这一个段,不受窗口/排序波动影响)。

🧹 顺带:名单写入格式更稳

写入「威胁情报名单」时,注释与网段各自单独成行,杜绝历史上「行内注释导致

ParseCIDR 解析失败、整条被静默丢弃」的坑;读取端也兼容老的行内注释格式。

升级建议

  • ▸用过「安全中心 → 普通用户流量分析」封网段、遇到过「封禁 0」困惑的,建议升级。
  • ▸纯后台安全功能修复,不改数据结构、不影响抓取与渲染,可随需升级。

v2.11.050

2026-07-22·43 MB(压缩,自动解压)

# v2.11.050 · 文章配图新增「📚 图片库」来源 + 一键恢复动态兜底

> 解决一个很常见的困惑:「文章配图全是 AI 生成的 SVG 色块,想用自己的图片库,却没有入口。」

> 这一版把图片库接进批量配图,并让「用固定图」和「跟随图片库动态取图」两种模式可逆切换。

📚 新增:批量配图来源「图片库」

「文章管理 → 批量配图」的图源里新增 📚 图片库:直接用你在

「内容管理 → 图片库」里导入的图片链接(或上传的本地图)给文章配图。

  • ▸即时完成,无需下载、无需外部 API key、图存本地永不死链。
  • ▸按所选分组匹配图片库(留空 = 各文章用自己所属分组的图片库);

同分组多篇会均匀分到不同图片、同一篇结果稳定,不会整站撞同一张。

  • ▸对应分组图片库为空的文章会跳过,并提示去图片库导入(模型公共库 / 网站分组库均可)。

🧹 新增:「清空缩略图(恢复动态兜底)」

批量配图会把图片写死进文章缩略图,之后不再随图片库变化。新增一个按钮把这一步变可逆:

  • ▸点「🧹 清空缩略图」→ 文章封面恢复动态兜底:渲染时图片库对应分组有图就用图片库

(改图片库随改随生效、不撞图),没有则用 SVG 占位(永不 404)。

  • ▸支持按分组清空或全站清空;全站清空需二次强化确认 + 后端 confirm_all 保护,防误清整库。

说明:两种模式怎么选

| 想要 | 操作 |

|---|---|

| 每篇内容相关的独特图 | 批量配图选 AI 图源(Pollinations / Unsplash / 自定义) |

| 用自己管理的固定图库 | 批量配图选「📚 图片库」 |

| 改图片库随改随生效、不撞图 | 点「🧹 清空缩略图」回到动态兜底 |

对话框顶部有醒目提示讲清「写死 vs 动态跟随」的差异,点错了随时可用「清空缩略图」还原。

升级建议

  • ▸想用自有图片库给文章配图、或觉得配图老是 SVG 色块的,建议升级。
  • ▸纯显示层 / 后台功能增强,不影响已有文章数据,可随需升级。

v2.11.049

2026-07-22·43 MB(压缩,自动解压)

# v2.11.049 · 修复大流量机器上「普通用户流量」分析/封禁/AI 研判超时失败

🔴 现象

在请求量大的机器上,点「👤 普通用户流量」页的「🤖 让 AI 研判」或「封禁选中」,报错:

```

AI 研判失败:聚合失败: Post "http://127.0.0.1:8123/..." context deadline exceeded

```

而且封禁也会连带失败 —— 封完「🎯 威胁情报名单」里空空如也。

根因

「普通用户流量」分析要在 spider.logs 上做多次按 /24 网段的重聚合(count/uniqExact/

countIf/正则匹配)。这类查询本身没问题,但 ClickHouse 客户端写死了 30 秒超时 ——

在日志量大的机器(数百 GB / 每天数千万行)上,聚合跑不完 30 秒就被客户端掐断,

报 context deadline exceeded。

更隐蔽的连带问题:封禁网段时,服务端会重新聚合一次做安全校验(不信任前端)。

聚合一超时,封禁就整体失败 —— 于是「确认封禁成功」但威胁情报名单里什么都没有。

这也是之前反馈「封了但名单空白」的一个真实来源。

修复

  • ▸ClickHouse 客户端新增 QueryTimeout,重聚合类查询超时从 30s 放宽到 90s。
  • ▸同时在 ClickHouse 服务端附加 max_execution_time,让服务端在同样时限内主动优雅中止

慢查询(返回明确错误而不是静默挂起),避免极端慢查询拖垮 ClickHouse。

  • ▸「普通用户流量」的 5 处聚合查询(主聚合 / 蜘蛛流量校验 / 昼夜节律 / 分钟峰值 / 总量)

全部走新的 90s 超时。

实测(测试机造 2.3 亿行放大数据复现)

| | 结果 |

|---|---|

| 旧行为(30s) | 30 秒被掐断 → context deadline exceeded(复现用户报错) |

| 新行为(90s) | 37 秒顺利完成 ✅ |

升级建议

  • ▸请求量大、点 AI 研判/封禁报「聚合失败/超时」的机器,建议升级。
  • ▸请求量小的机器本来就不会超时,可随下一版一起升。

v2.11.048

2026-07-21·42 MB(压缩,自动解压)

# v2.11.048 · 修复封禁网段后「威胁情报名单」仍显示空白

> 承接 v2.11.046。上一版让封禁的网段写得进、能生效、有地方看,

> 但这一版修的是最后一步:封完之后那个「威胁情报名单」框当场不刷新,

> 让人误以为封禁没写进去。

🔴 封禁成功了,但「🎯 威胁情报名单」框还是空的

在「安全 → 👤 普通用户流量」页封禁网段并确认后,切到「安全 → 🚫 IP/UA 名单」页,

底部的「🎯 威胁情报名单(自动写入)」框仍然是空的 —— 让人以为封禁根本没写进去。

(有用户反馈:确认封禁了 16 个网段,名单框却一片空白。)

原因:封禁结果确实写进了 settings.threat_intel_ips(数据没丢、也真的生效了),

但前端封禁成功后只刷新了「普通用户流量」的聚合列表,没有重新拉取配置。

而「威胁情报名单」框绑定的配置只在进入安全页时加载一次,不重新拉取就一直显示

打开页面时的旧值(空)。必须手动刷新整个页面(F5)才会显示 —— 这就是「封了却看不见」的真正原因。

修复:封禁成功后自动重新拉取配置,「威胁情报名单」框立即显示新封的网段,

无需手动刷新。封禁成功提示也明确写清:已写入威胁情报名单、本页已自动刷新、

到「IP/UA 名单」页底部查看/撤销。

> 说明:这是纯显示层问题。之前用 v2.11.046/047 封禁的网段其实早就写进去并生效了,

> 只是需要刷新页面才看得到;升级本版后不用手动刷新,封完当场可见。

升级建议

  • ▸用过「普通用户流量」封禁功能、且觉得「封了但名单空白」的,建议升级。
  • ▸没用过这个功能的不受影响,可随下一版一起升。

v2.11.047

2026-07-21·41 MB(压缩,自动解压)

# v2.11.047 · 修复「AI 文章存进网站分组库后前台不显示」

> ⚠️ **如果你在「AI 内容生成 → 文章存入分组」里选的是「🏷 网站分组库」,

> 生成的文章在网站上一直不显示 —— 这就是这个 bug。** 升级本版即修复,

> 不需要重新生成文章,原来存进去的会立刻显示出来。

🔴 现象:选「网站分组库」存文章,网站空白;换「模型公共库」就有

在「AI 内容生成」把文章存入网站分组库(网站管理里的分组),网站前台

列表/首页一篇都不显示;把同样的内容改存到模型公共库(模型管理),

立刻就有了。很多人因此以为「网站分组库」是坏的,只能都往模型公共库塞。

原因:文章「存进哪个库」和「从哪个库读」对不上

  • ▸存:选「网站分组库」→ 文章按分组目录名(group_dirname)归档
  • ▸读:网站渲染文章时只认模型目录名(model_dirname)

两个名字不是一回事(分组有自己的目录名,同时又挂在某个模型下),于是

存进分组库的文章,前台按模型库的名字去找 → 永远找不到 → 空白。

而「模型公共库」恰好存和读都用模型名,所以看起来只有它「能用」。

修复:前台读文章时,分组库优先、模型库兜底

网站渲染文章(列表、首页、正文推荐内容、随机标题、相关文章、爬虫锚文本等)

统一改为:该分组自己的「网站分组库」有内容就优先用它,没有再退回「模型公共库」

—— 与模板选择「分组模板优先、模型模板兜底」的优先级一致。

  • ▸存进「网站分组库」的文章,现在正常显示
  • ▸只用「模型公共库」的用户完全不受影响(分组库为空时行为和以前一模一样)

说明

  • ▸两个库仍是分开的:「网站分组库」= 该分组专属内容(同分组的站点共享);

「模型公共库」= 同一模型下所有分组共享。按需选择即可。

  • ▸已加回归测试锁死该行为,并在测试机用真实数据复现→修复→复验通过。

v2.11.046

2026-07-20·40 MB(压缩,自动解压)

# v2.11.046 · 修复「普通用户流量」封禁的网段既看不见也没生效

> ⚠️ **如果你在 v2.11.044 / v2.11.045 用过「普通用户流量」页的封禁功能,那些封禁实际上

> 从未生效。 升级本版后会自动恢复**,不需要重新操作。详见下方第 2 条。

🔴 1. 封禁的网段在后台找不到

在「安全 → 👤 普通用户流量」页封禁网段后,到「安全 → 🚫 IP/UA 名单」页看不到任何记录,

也无法撤销。

原因:封禁结果写入的是「威胁情报名单」,而 IP/UA 名单页只显示手工维护的四个名单

(IP 黑/白名单、UA 黑/白名单),威胁情报名单在后台没有任何展示界面。

封禁成功的提示语还写着「可在 IP/UA 名单页查看和撤销」—— 这是错的,把人指向了错误的位置。

修复:IP/UA 名单页新增「🎯 威胁情报名单」框,可查看、可编辑、带条数统计。

撤销封禁 = 删掉对应行再点保存。 提示语也改成指向正确位置。

> 这个名单和你手工维护的四个名单是分开存放的(便于整体回滚),但同样生效。

> 「普通用户流量」页的封禁、以及威胁情报源自动拉取的 IP,都写在这里。

🔴 2. 更严重:封禁其实根本没生效

上面那条只是「看不见」。查下去发现封禁压根没起作用 ——

封禁写入的格式是 1.2.3.0/24 # 说明文字(注释跟在网段后面),而黑名单解析只跳过

整行以 # 开头的注释;这种行内注释会让网段解析失败,整条被静默丢弃。

也就是说:界面提示封禁成功,实际一条都没进黑名单。 属于最容易误事的一类问题 ——

看起来生效了,其实没有,而且没有任何报错。

修复:

  • ▸写入时注释单独成行,不再跟在网段后面
  • ▸解析时容忍行内注释 —— 因此升级后,之前按旧格式写坏的封禁会自动恢复生效,

你不需要重新封一遍

升级建议

  • ▸在 v2.11.044 / v2.11.045 用过封禁功能的,建议升级。 升级后先到

「安全 → IP/UA 名单 → 🎯 威胁情报名单」确认一下里面的内容是不是你想封的;

如果有不想要的,删行保存即可。

  • ▸没用过这个功能的不受影响,可随下一版一起升。

历史版本均通过 wztseo.com 自托管 CDN 提供下载,长期可用。