跳转至

全栈审查与验收记录

本轮稳定性与精简审查(2026-10-02)

范围为当前仓库,优先保持现有功能、接口、存储结构和第三方任务流程。审查了启动/退出、配置热重载、认证、队列、数据与日志 API、SQLite/MySQL、监控与签到公共执行方式、推送、青龙、前端交互、部署检查和文档。没有执行真实账号签到、推送或部署;外部服务和生产负载的完整可用性仍需人工验收。

项目理解与取舍

Vue 3/TypeScript/Pinia 按路由加载页面,通过 /api/v1 访问 FastAPI;任务元数据贯穿配置、注册、调度与青龙。APScheduler、启动和手动入口共用 4 worker/100 容量队列,浏览器任务单独进程隔离且并发为 1。业务默认 SQLite WAL,可启用 MySQL 权威写入、SQLite 镜像和离线 outbox;执行记录独立保存在 runs.db。配置带版本与密钥保留标记,日志采用有界增量读取,生产只有一个 Python Web/调度进程。

保留已有有界并发、线程池、浏览器隔离、分页与缓存策略。仅并行配置页两项独立读取,避免等待时间叠加;没有引入请求聚合 API、共享敏感缓存或新基础设施。参考 Vue 响应式计算、FastAPI 异步边界及同类监控项目 Uptime Kuma 的 CI,借鉴职责分层,不照搬其跨系统/Node 版本矩阵。

问题、证据与处理

问题与证据 影响 最小处理/验证
Config.vue::save 在响应后读取可变的 selected、yamlMode,并把当前 YAML 当已保存基线 慢请求期间切换模块或继续输入可能丢失编辑/误报已保存 固定提交上下文,保留请求期间编辑,YAML 基线使用提交文本;延迟响应浏览器回归
配置与元数据读取串行,YAML 展示和保存可重叠 增加初次等待,旧响应可覆盖新编辑模式 Promise.all 并行独立读取,复用 busy 状态阻止重叠操作;类型检查与真实后端配置回归
stores.ts 的 computed 直接读 MediaQueryList.matches 完整效果/触屏模式下系统减少动效变化不触发更新 独立响应式偏好;桌面与移动端动态切换回归
Logs.vue 切换来源时 refresh 因请求在途被忽略;空增量仍复制整窗 新日志额外等待轮询/退避,重复数组分配和列表更新 请求结束后补一次刷新,恢复更新立即请求,空增量不替换数组,补加载反馈;慢响应切换回归
SQLite 三个事务辅助函数仅捕获 Exception;外层在释放操作锁后再次回滚 CancelledError 可遗留未提交事务,锁外回滚可能影响下个调用者 事务内覆盖取消并回滚后向上传播,移除外层重复回滚;普通写入/outbox/镜像三个真实 SQLite 取消用例
watcher.py 只接受修改时间递增,回调失败仍确认配置 旧时间戳恢复漏应用,部分失败后不再重试 文件身份/大小/纳秒时间指纹;成功才确认,失败下轮读取最新文件重试
db_sync.py 忽略删除返回值,调度回调吞异常;重复恢复/更新触发器重算运行时间 部分清理失败被误报成功;重试可能推迟任务 删除与调度失败向上传播,主键删除可重复执行,相同触发器与已运行任务不重置
MySQL 读取保留事务,aiomysql 在归还仍有事务的连接时会关闭连接;种入逐行写、outbox 全量读取 重建连接、重复往返和大离线日志内存开销 结束读事务,500 条分批读取/批量写入,全部批次同事务;ID 范围确认避免超大 IN 参数列表
镜像读取依赖服务器默认隔离级别 READ COMMITTED 下各表可能读取不同时点 显式只读可重复读快照;真实 MySQL 并发写入实验
data_support.py 的旧内存排序与 LRU 仅被测试引用 维护不再参与实际分页的逻辑 删除三个死函数及对应测试,保留 SQL 索引分页与现有 API 回归
三个视口重复运行全部检查,导航测试两两组合,截图与 LCP 门槛依赖机器 重复安装/构建及维护成本 前端单 job,桌面关键回归加四项移动冒烟,导航单次遍历;视觉与弱网转人工
文档引用已删除的配置模板,并描述拖拽、账户底部面板和不存在的数据库状态展示 用户/开发者按错误路径操作 文档对齐 Vue、实际 API 和页面,不为旧文档增加功能

修改文件与文档整理

文件 原因与改动
frontend/src/views/Config.vue 保存竞态、并行读取与 busy 防重入
frontend/src/views/Logs.vue、frontend/src/stores.ts 日志刷新与动效响应式修复
src/storage/database.py、src/storage/mysql_backend.py 事务取消回滚、outbox 分批与确认、种入批量写入、读事务释放、跨表一致快照
src/settings/watcher.py、src/settings/db_sync.py、src/monitors/kuaishou_targets.py 文件指纹、失败重试、目标清理失败向上传播
src/jobs/lifecycle.py、src/jobs/scheduler.py 调度失败向上传播,同值重试不重置下次执行时间
src/web/data_support.py 删除无生产调用的内存分页缓存
src/tests/test_mysql_backend.py、test_main_lifecycle.py 增加事务取消、分页确认、跨批失败/取消、配置重试及调度幂等关键回归
src/tests/test_web_performance.py、test_weibo_media.py 删除死缓存测试和六项纯标题措辞断言,保留去重、媒体及富文本安全测试
frontend/tests/api.test.ts、tests/e2e/{data,navigation,workspace}.spec.ts、fixtures.ts 删除无关键价值/重复检查,共用登录夹具,覆盖保存与日志竞态;配置修改基于当前值避免视口间相互依赖
frontend/playwright.config.ts、.github/workflows/quality.yml 精简视口范围和重复安装,保留单 worker 与失败截图/trace,CI 加入已有 Ruff 检查
frontend/tests/e2e/workspace.spec.ts-snapshots/ 三张 PNG 删除停止使用的像素基线
docs/SECONDARY_DEVELOPMENT.md、.github/CI.md 检查命令集中到开发指南;CI 文档只描述流程与取舍,修正 Vue/Vite、数据库返回值契约
README.md、docs/index.md、docs/README.*.md 精简重复开发步骤与架构表,补快手平台;首页删除旧界面能力描述
docs/API.md、docs/guides/config.md、docs/guides/web-ui.md、docs/guides/tasks.md 补返回字段、虎牙图片接口、记录保留边界,纠正页面与热重载说明,集中人工自测
docs/ARCHITECTURE.md、docs/assets/screenshots/README.md、本报告 链接统一检查/验收入口;标记历史截图和数据,合并重复注册表

没有删除部署备份步骤、多语言使用说明或平台参数文档;它们具有不同使用场景。没有修改依赖版本、锁文件、数据库 schema、平台登录/验证码/签到流程或公开 API 路径。

测试精简与验证

  • Python:基线 421 项,移除六项标题措辞断言与一项死缓存检查,首轮增加三个事务取消和一个配置恢复用例;追加九项数据库批次及配置重试必要用例,当前 427 项通过(2.66 秒)。保留鉴权/CSRF/会话、配置冲突与密钥、队列去重、日志轮转、数据库回退、平台去重/重试、媒体/富文本安全、安装与发布门禁等关键保障;不按数量盲目删减,原全套只需数秒。
  • Vitest:删除空日期占位符测试,保留 CSRF 传播与错误状态,2 项通过。
  • Playwright:原 57 个视口执行项(其中 4 项按条件跳过)缩减为 21 项全部通过(最终复跑 36.7 秒),含新增的保存与日志竞态。删除重复后端 CSRF/分页断言、像素比较、单次 LCP/CLS 阈值和窄屏主题全排列;保留真实后端配置、任务终态与图片、导航等关键交互。未测远程 CI 墙钟收益。
  • Ruff、前端 Prettier、TypeScript 与 Vite 生产构建通过;全部 JS/CSS gzip 74.6 KiB,项目预算 250 KiB。此数据为本轮体积,不是新增性能基准。
  • shell 语法和根目录/slim/full 三份 Compose 配置检查通过;修改的 Python 文件 Black 检查通过,MkDocs 严格构建与 git diff --check 通过。未安装 actionlint,未运行远程 Actions。

  • 当前源码已重新构建 Linux amd64 slim 镜像 webmoniter:audit-20261002。临时容器使用 --init、禁用外网且无生产挂载:UID 10001,存活/就绪/前端页面返回 200,未登录数据库 API 返回 401;停止耗时 0.31 秒,按现有信号退出约定返回 130。构建的离线与默认网络尝试因缺少缓存/Docker DNS 失败,使用主机网络后成功;未改锁文件或 Dockerfile,未重建 full 或其他架构镜像,未推送/部署。

追加真实数据库验证:使用自动删除、仅回环绑定的临时 MySQL 8.4 容器,验证 1,500 行种入、第二批故障整体回滚、505 条 outbox 的跨批失败与取消回滚、upsert/clear/delete 顺序、提交 ID 确认、读连接复用,以及 READ COMMITTED 默认级别下另一连接提交写入时的跨表快照。最近一次单次实验中,逐行写入 0.3081 秒,分批替换(含清空表)0.0212 秒;这是本机小数据集测量,不代表生产吞吐或长事务锁等待。参考 aiomysql 批量写入 和 MySQL 一致性读取,未引入额外并发。

环境说明:沙箱内单独的 aiosqlite.connect(':memory:') 查询也无法完成跨线程唤醒;获准使用正常线程环境后全套快速通过。没有为通过测试更改数据库驱动或跳过数据库测试。浏览器运行仅访问隔离后端与模拟响应,未操作真实账号。

风险、人工验收与未实施建议

影响涉及配置编辑与热重载、日志显示、外观偏好、MySQL 同步和异常清理。正常数据格式和任务执行语义保持原状;事务保证要求 InnoDB,取消发生在数据库已经提交之后不能撤销该提交,跨库没有原子提交。配置应用也不是原子事务,重试不会撤销已完成的目标删除;平台快照由后续正常监控继续维护。缩减自动视觉覆盖后,人工验收责任见 完整用户自测清单。

以下只建议,不在这轮扩大实现:

  • 全表镜像流式化与跨批提交:outbox 分批及种入批量化已完成;镜像仍保留全量数据集和整体 SQLite 事务。进一步缩减峰值内存需要真实大表规模、锁等待和恢复压测,不能直接并行写镜像。
  • MySQL 8.4 提示旧 VALUES(column) upsert 语法弃用:现有语法仍能执行;未确定最低 MySQL/MariaDB 兼容范围前不直接替换为新别名语法。
  • 更细粒度任务并发、多进程 Web、全局敏感数据缓存:现有任务与浏览器已经限流,扩大并发会增加重复副作用和内存风险,目前无收益证据。
  • 旧未挂载路由模块仍有内部测试/兼容调用,未整批删除;只删除已确认无生产调用的排序缓存,避免扩大接口风险。
  • 真实手机弱网/滚动、真实 MySQL 断线恢复、arm64/Windows、24 小时稳定性及外部签到与推送:保留手动/专用环境验收,不能从本地模拟回归推断全部在线可用。

历史重构记录

以下为仓库原有记录及其原始证据,不是本轮重新运行的容器、平台或性能测量;旧测试数量与界面基线仅描述当时版本。当前检查入口和结果以上节为准。

日期:2026-10-02。范围:全新部署,保留 7 类监控、31 类任务(含维护与示例任务)、18 个推送适配器、MySQL 与青龙。实现与短时本地验证已完成;真实平台综合负载、arm64 实机、真实手机和 24 小时长测尚未完成,不能据此宣称全部验收通过。未修改真实服务器、未执行真实签到、未推送镜像。

审查证据与处理

优先级 原问题/证据 实施结果
P0 普通 SHA-256 摘要 Argon2id、失败关闭、登录限流、CSRF、会话轮换;按当前部署偏好默认 admin/123,环境覆盖可选
P0 手动接口等待任务完成;手动与定时未共用并发限制 /api/v1 提交返回 202;4 worker、100 队列、任务去重,SQLite 持久运行记录
P0 浏览器/OCR 主进程驻留;默认线程池 32 账号级子进程按需导入,浏览器并发 1、180 秒尝试超时、进程组回收,线程池 4
P1 两套 CSS 共 9,404 行;配置 JS 3,321 行 删除旧模板和叠加样式;Vue 路由组件、Pinia、类型化 API、统一材质与字段组件
P1 配置明文读取、无版本保护 默认遮蔽、密钥保留标记、分区保存、冲突 409、显式 YAML 查看,不持久缓存凭据
P1 列表/日志缺少上限,微博扫描正文排序 页大小 50/200,日志 1,000 行/256 KiB 游标,图片批量上限 200,微博时间入库索引
P1 容器 root 与递归 chmod 777 UID/GID 10001、必要目录检查、命名卷、init、健康检查与资源限制
P1 模型和浏览器体积难区分 共享构建阶段、依赖裁剪与导入检查、模型保留校验、OCI 压缩/展开层报告
P2 文档仍写旧 API、弱口令、旧 Dockerfile 更新 API、架构、安装、服务器部署、开发与界面文档;翻译版标记更新状态

回归中实际发现并修复:配置加载忽略容器环境路径、模型文件非 root 不可读、Cookie 刷新开关和时间被错误遮蔽。裁剪数值库 ELF 调试符号曾破坏 NumPy/OpenBLAS 加载,已将 auditwheel .libs、NumPy、OpenCV、ONNX Runtime 排除在 strip 之外,并增加构建时导入检查。不是所有 .so 都可安全一刀切裁剪。

SQLite WAL、配置原子写入、压缩、缓存、OCR 单线程以及 MySQL 权威写入/镜像/outbox 回退顺序保留。媒体图片仍可被推送渠道读取,管理 API 统一鉴权;旧无界监控状态 API 不再挂载。

功能与回归

验证 结果/边界
Python 全套 381 项通过;含注册完整性、配置映射、平台关键行为、推送、MySQL 回退、安全与执行服务
前端 TypeScript、Prettier、Vitest 3 项、Vite 生产构建通过
Playwright 桌面/移动端 9 项通过;移动端 CDP 专用性能项按设计跳过 1 项
视觉 深色账户桌面/移动端截图基线比较;概览、任务、配置、日志保存截图人工检查
调度 手动/定时同任务合并、容量上限、终态、重启中断、不重放、最近任务记录
浏览器 模拟超时杀进程组、异常类型隔离、雨云超时重试;full 镜像本地浏览器与所有模型加载
配置 账号重排后密钥保留、清除、跨分区保留、版本冲突、嵌套敏感头遮蔽、开关与时间不遮蔽
日志 增量追加、半行等待、截断轮转、字节上限、保留活动文件的总量清理

外部平台副作用通过模拟测试验证;不保证外部平台当前在线、验证码识别率或真实账号成功率。青龙沿用原有单次 CLI,Web 统一队列限制不跨不同容器/青龙进程共享。

此前 aiosqlite 测试超时在独立内存查询中同样出现;在允许异步线程正常工作的执行环境中,完整测试约 2.5 秒完成。该现象不能归因于业务 SQLite 查询。

前端体验与性能

生产全部 JS/CSS gzip 合计约 67.3 KiB,包括所有懒加载页面,低于首屏 250 KiB 预算。使用系统字体、代码内 SVG 图标,无新增远程字体、分析服务或持续全屏渲染。CSS 高光、柔和粉紫材质与弹性过渡属于 Web 近似效果;表单和日志优先可读性。

本次冷加载 LCP 884 ms,CLS 0.00965。性能测试使用 Chromium、1440×1000、5 Mbps、100 ms 延迟、4 倍 CPU 降速,禁用浏览器缓存。LCP 与 CLS 数据保存在 assets/validation/refactor-web-vitals.json。这是本地测试后端上的单次实验室测量,不等同于真实手机 INP 或生产网络分位数。

桌面概览 移动端概览
桌面概览 移动端概览

配置页 · 日志页 · 深色账户

容器资源实测

同一 amd64 开发宿主机,容器限制 1.75 CPU、1,536 MiB RAM、256 MiB shm、256 PID,禁用容器 Swap。测试创建 50 条本地监控快照,3 个访问者循环请求任务、数据和日志;full 同时执行 5 轮串行浏览器与模型加载,浏览器访问本地 data URL。原始结果保存为 assets/validation/refactor-slim-benchmark.json 与 refactor-full-benchmark.json。

镜像 时长 请求数 API P95 峰值 RAM 启动就绪 浏览器/模型
refactor-slim 30 s 684 43.2 ms 167.9 MiB 2.31 s 不包含
refactor-full 60 s 1342 64.7 ms 531.5 MiB 2.00 s 通过

两种镜像请求错误均为 0,OOM 均为 false。

这是管理 API、静态数据和浏览器模型加载的合成负载,尚未模拟 50 个真实平台监控目标的持续抓取、真实验证码推理和网络波动。短测无 OOM 不能替代 24 小时长期稳定性;开发宿主机也不是目标 EPYC VPS。

镜像体积口径

比较本地 validation-slim/full(本轮前已有 amd64 基线镜像)与 refactor-slim/full。原始镜像 ID、逐层 digest、压缩字节和展开字节保存在 assets/validation/refactor-image-sizes.json。压缩体积为 OCI 分发层大小之和,展开体积为同一组层解压后的 tar 字节之和;不是 docker image ls 的共享层磁盘占用,也未伪装成远端镜像仓库实际传输流量。

镜像 优化前压缩层 优化后压缩层 变化 优化前展开层 优化后展开层 变化
slim 68.3 MiB 66.6 MiB -2.5% 187.8 MiB 191.8 MiB +2.1%
full 625.7 MiB 590.2 MiB -5.7% 1392.5 MiB 1299.1 MiB -6.7%

slim 展开体积略增,未达到展开体积下降;主要来自固定 bookworm 基础层与新增认证依赖,删除旧前端和文档后压缩分发体积仍略降。full 的主要层(Docker history 显示值)为 Python 依赖约 467 MB、浏览器/驱动约 422 MB、系统浏览器库约 244 MB、iKuuu 模型约 99.2 MB。ddddocr 自带模型位于 Python 依赖层,未删除或转移到卷。

运行层移除旧前端、文档截图、测试与构建工具;保留包元数据、许可证和全部推理模型。基础发行版从旧未固定 slim 变为固定 bookworm,因此总体变化同时包含基础层差异,不能把所有差值归因于应用代码。浏览器、OCR 和模型仍占 full 的主要体积。

待完成验收与复现

  • 真实手机:指定机型/系统后测交互延迟、滚动帧率、软键盘和后台恢复。
  • 目标服务器:50 个模拟持续抓取目标、5 个浏览器账号、3 个访问者的完整并发负载与网络扰动。
  • 24 小时:运行 scripts/container_benchmark.py --seconds 86400,检查内存曲线、任务去重、子进程及停止行为;当前脚本长测每约 5 分钟重复浏览器加载,仍需补平台模拟流量。
  • amd64/arm64:当前 CI 在原生架构 runner 构建并做启动/浏览器冒烟,不再使用 QEMU;本地审查不替代远端 CI 或 arm64 实机验收。
  • Windows:发布流程已接入前端构建,尚未验证实际发行包。
  • CI 发布前执行新增工作流,远程标签当前不能当作本次修改的交付镜像。

常规检查统一见 开发指南。以下仅为复现历史容器测量的命令,需自行准备对应镜像:

.venv/bin/python scripts/container_benchmark.py --image webmoniter:refactor-full --seconds 60 --output /tmp/full.json
.venv/bin/python scripts/image_report.py webmoniter:validation-full webmoniter:refactor-full --output /tmp/sizes.json

参考依据:Vue 性能建议、Apple Liquid Glass、ColorOS、Uptime Kuma、Docker 构建最佳实践、Docker 资源限制。

功能注册清单

当前注册为 7 类监控、31 类定时/维护/示例任务、18 种推送适配器。清单统一见 任务指南、推送指南 和 src/jobs/metadata.py,不在审查记录重复维护另一份逐项表。注册与配置映射由关键测试核对。

安装入口简化验证(2026-10-02)

  • Docker 入口统一为 bash install.sh docker;根目录 Compose 默认 full,并复用原有资源限制、项目名和三个命名卷。三个 Compose 配置解析结果已对比一致(slim 仅镜像不同)。
  • 源码入口为 bash install.sh source;自动准备工具、依赖、前端及浏览器模型,首次配置与 Docker 共用初始化逻辑。保留 YAML 时间字符串的引号,避免后端按整数解析;现有配置不覆盖。
  • 独立临时源码副本实跑 --no-browser --prepare-only,完成依赖安装、前端类型检查与生产构建;随后两次运行 --no-browser,健康检查、静态页面、默认登录和任务接口均通过,已有配置字节保持不变,复用前端产物。
  • 安装测试覆盖并发配置创建、下载摘要失败、前端失败缓存、带空格路径、Docker 失败退出、浏览器归档安装及复用、full/HTTP 模式分支。浏览器下载与系统库安装使用模拟;本轮没有在空白 Ubuntu 上实装 apt 软件包,也未重新构建或发布镜像。此前容器体积与性能测量的版本及边界保持不变。

修改文件清单

历史重构的新增、修改和删除路径见 文件清单。新前端位于 frontend/;原 src/webUI/templates、static/js、static/css 已移除,图标和图片资源保留。