Files

251 lines
16 KiB
Markdown
Raw Permalink Normal View History

# SiteForge Factory V7.2 项目差距审计与下一步实施计划
> 审计对象:`C:\Users\30997\Downloads\SiteForge_Factory_V5_Web_Docker\SiteForge_Factory_V7_2`
> 审计日期:2026-10-22
> 目标:把当前“可控试点版”推进为需求文档所描述的可迁移、可搭建、可发布、可运维的网站工厂。
## 1. 执行结论
当前项目已经形成可运行的产品骨架,具备:站点管理、内容模型、区块编辑器、主题安装与版本固定、静态构建、构建队列、基础质量检查、备份接口、团队角色、审计记录、PostgreSQL/Redis 部署骨架和 HTTPS/HMAC 远程发布代理。
但它还不能被定义为“完整需求已实现”或“生产就绪”。更准确的定位是:
- 单机/小团队、受控数据量下可演示和试点;
- 主要快乐路径已有自动化测试;
- 真实迁移、批量数据、跨平台恢复、多语言、企业身份、生产可观测性仍不完整;
- PostgreSQL、远程发布和备份链路目前属于“有骨架,尚未完成生产证明”。
建议不要继续堆叠零散页面或按钮,而是先关闭平台正确性,再按“迁移闭环 → 数据工厂 → 编辑/模板 → 发布/多语言 → 生产治理”推进。
## 2. 本次验证事实
### 2.1 自动化与静态验证
- Python 测试共发现 86 项。
- Windows 默认编码环境:80 通过、6 失败。
- `PYTHONUTF8=1` 环境:85 通过、1 失败。
- 5 项失败来自测试使用 `Path.read_text()` 却未显式指定 UTF-8,属于跨平台测试可靠性问题。
- 剩余 1 项是真实缺陷:SQLite 在线备份后临时数据库文件句柄在 Windows 未及时释放,`TemporaryDirectory` 清理时报 `WinError 32`。
- 39 个 Python 文件通过 AST 解析。
- 7 个 JavaScript 文件通过语法检查。
- 默认、Enterprise、Release Agent 三套 Compose 配置解析通过。
### 2.2 尚未完成的环境验证
以下项目不能用“Compose 配置能解析”替代,仍需在真实 Docker Engine/目标服务器验证:
- 镜像完整构建及冷启动;
- Web/Worker 心跳、异常重启和任务续租;
- PostgreSQL + Redis 全量测试;
- 浏览器端端到端、响应式、可访问性和视觉回归;
- 备份恢复演练;
- Release Agent 的 TLS、真实传输、切换、回滚和发布后探测。
## 3. 需求覆盖矩阵
| 能力域 | 当前状态 | 主要缺口 | 结论 |
|---|---|---|---|
| 站点/内容基础 | 已有 | 站点环境、默认语言、发布策略、蓝图不是一等模型 | 部分完成 |
| 迁移工厂 | 有 WXR、WordPress REST、CSV/JSON/XLSX、有限抓取 | 无持久化迁移会话、断点续传、媒体盘点、冲突队列、回滚和真实大型样本证明 | 试点级 |
| 数据工厂 | 有映射、dry-run、提交 | 无通用 XML、认证 API、只读 MySQL、分批暂存、可逆导入、人工覆盖保护、5 万行证明 | 明显缺失 |
| 内容模型 | 基础字段可用 | 缺 enum/relation/array/media、唯一性、索引、跨字段校验、完整工作流 | 部分完成 |
| 页面编辑器 | 12 类区块、嵌套布局、响应式属性、撤销/重做、复用组件 | 缺审批/锁定/冲突合并、更多业务区块、视觉回归、完整无障碍保证 | 部分完成 |
| 主题/模板 | 主题包、版本固定、兼容检查、预览 | “模板”仍主要是主题+首页预设,不是可复用多页面站点蓝图;升级差异/回滚验证不足 | 部分完成 |
| 构建系统 | 静态构建、版本目录、质量报告 | 构建读取实时数据库而非冻结快照;无内容哈希、依赖图、增量构建和产物保留策略 | 高风险缺口 |
| 作业系统 | 幂等、租约、取消、重试、容量限制 | 仅正式支持 build;无统一进度、死信、诊断日志;未覆盖迁移/导入/媒体/发布 | 部分完成 |
| 发布系统 | 本地发布、HMAC Release Agent、版本切换/回滚 | 缺完整 TLS 部署证明、重放防护、发布后外部探测、CDN 清理、SFTP/S3/Git 等目标 | 试点级 |
| 多语言 | 文档有设计 | 无 locale、翻译组、canonical/hreflang、多语言 sitemap 全链路实现 | 未实现 |
| PostgreSQL/Redis | 有兼容桥和 Compose | DDL 迁移不完整;全局 advisory lock 串行化;无连接池/按站点锁;Redis 仅唤醒 | 非生产级 |
| 安全/权限 | 登录、CSRF、Origin 检查、角色、审计 | 缺 CSP/Permissions-Policy/TrustedHost;代理信任过宽;无 OIDC/MFA/会话撤销/密钥生命周期 | 部分完成 |
| 备份恢复 | SQLite 在线备份和部分目录打包 | Windows 句柄缺陷;遗漏主题包/发布数据等;无统一清单、校验和、外部副本与定期恢复证明 | 阻断生产 |
| 可观测性 | Request ID、基础日志、健康接口 | 无 metrics/tracing/告警/SLO/作业看板 | 未完成 |
| 供应链/CI | Python/JS/Compose/PG 基础 CI | 锁文件无哈希;无依赖审计、镜像扫描、SBOM、签名;CI 允许 commit=`unknown` | 不完整 |
| 商业验收 | 有 readiness/report 概念 | 架构要求的四类真实试点没有签字验收证据 | 未闭环 |
## 4. 当前必须先修的缺陷
### P0:发布阻断
1. **修复 Windows SQLite 备份句柄泄漏**
显式关闭在线备份使用的源/目标连接,再退出临时目录;增加 Windows 与 Linux 的备份→恢复→内容/媒体校验测试。
2. **统一 UTF-8 测试和文件协议**
所有文本读写显式 `encoding="utf-8"`;CI 增加 Windows runner,避免用 `PYTHONUTF8=1` 掩盖代码问题。
3. **让版本证据真实可信**
CI 构建必须注入真实 Git SHA;健康检查拒绝 `unknown`;镜像 OCI revision、API commit、部署清单三者必须一致。
4. **建立一次真实容器验收**
默认 SQLite 和 Enterprise PostgreSQL 两种拓扑都执行冷启动、建站、导入、编辑、构建、预览、发布、备份恢复。
5. **补安全基线**
增加 CSP、Permissions-Policy、TrustedHost;把受信代理网段做成显式配置,避免无条件 `forwarded-allow-ips=*`;核对 Cookie、上传、登录限速和错误回显。
6. **同步文档与事实**
README 当前测试数量与实际 86 项不一致;V6 运维文档的版本返回示例也需要更新。所有“已完成”声明都必须绑定自动化或验收报告。
### P1:平台正确性
1. 把所有历史 `CREATE TABLE IF NOT EXISTS` 收敛到有序、校验和固定、可回滚/可恢复的 schema migration;SQLite 和 PostgreSQL 使用同一版本账本。
2. PostgreSQL 从 SQL 翻译桥升级为明确支持的持久层:连接池、事务语义、唯一约束错误、按站点 advisory lock、并发测试。
3. 作业模型推广到 `build/import/crawl/media/publish/migration`,增加进度、阶段、结构化日志、死信、重放和保留清理。
4. 每个构建先生成不可变输入快照:`site_blueprint + theme@version + content_snapshot + asset_manifest + route_registry + seo_policy`;Worker 只读取快照。
5. 为构建输入、产物和报告记录 SHA-256,保证相同输入可复现,并能证明审批后内容没有漂移。
6. 扩大备份范围到数据库、media、theme_packages、构建/发布元数据、配置引用;生成 manifest 和校验和;备份自动复制到独立存储。
7. 为 secrets 增加版本、轮换、撤销和使用审计;环境变量/文件引用保留为开发模式,生产对接 Secret Manager/Vault 类接口。
## 5. 分阶段实施路线图
### M0 — V7.2.1 稳定基线(3–5 人日)
交付:
- 关闭上述 P0 缺陷;
- Windows/Linux、Python 3.12/3.13 全绿;
- 两套 Compose 最小端到端 smoke;
- 一份可重复执行的备份恢复报告;
- CI 中真实 SHA、镜像摘要和版本清单可追踪。
退出门槛:86/86 测试通过;不依赖环境编码;备份恢复后数据库记录、媒体哈希和构建记录一致;health commit 不为 `unknown`。
### M1 — 平台内核完成(7–12 人日)
交付:
- 全量 schema migration;
- 不可变构建快照及内容哈希;
- 通用作业状态机与结构化任务日志;
- 产物/日志/失败任务保留策略;
- PostgreSQL 并发和事务测试;
- metrics、基础告警和运维面板。
退出门槛:排队后修改内容不会改变已提交构建;Worker 崩溃后任务可续租或明确进入死信;两个站点并发构建不会被单一全局锁无谓串行。
### M2 — 迁移工厂闭环(8–12 人日)
交付:
- `migration_sessions` 持久化状态机;
- 探测→抓取→解析→路由/模板识别→媒体盘点→映射→预览→提交→对比报告;
- WordPress REST/WXR、Sitemap、受控 crawl 统一为可恢复任务;
- 冲突/警告队列、人工确认、断点续传;
- 旧 URL→新 URL、SEO 字段、媒体、页面数量对账。
退出门槛:用一份获得授权的真实 WordPress 网站完成两次可重复迁移;中途杀死 Worker 后可续传;报告能解释所有缺失、冲突和重定向。
### M3 — 数据工厂闭环(10–15 人日)
交付:
- CSV/JSON/XLSX/XML、认证 HTTP API、只读 MySQL 连接器;
- 数据源 profile 与加密 secret reference;
- 分页/游标、限速、超时、重试、断点续传;
- staging rows、字段映射、验证、去重、错误下载;
- import batch、原始来源标识、人工覆盖优先级、可逆提交。
退出门槛:5,000 行交互验收和 50,000 行压力验收;故障注入后无半提交;回滚只撤销本批变更,不覆盖后续人工编辑。
### M4 — 编辑器、内容模型与站点模板(10–15 人日)
交付:
- locale/environment/publish policy/site blueprint 成为一等模型;
- 内容字段增加 enum、relation、array、media、唯一性、搜索/筛选和跨字段校验;
- draft→review→published→archived 工作流和审批审计;
- carousel/video/tabs/pricing/form-link/map/timeline/testimonials/team 等高频区块;
- 多页面站点模板,实例化时不复制私有业务内容;
- 主题升级差异预览、兼容检查和一键回滚。
退出门槛:从模板新建站点后能独立升级内容;键盘操作、焦点、语义、对比度和三档响应式视觉回归通过;多人编辑冲突不会静默覆盖。
### M5 — 发布与多语言(12–20 人日)
交付:
- 先加固现有 Release Agent:TLS、nonce/replay cache、最小权限、审计、外部健康探测、失败自动回滚;
- 再按业务优先级增加 SFTP、S3/CDN 或 Git CI 目标,不同时铺开所有连接器;
- `site_locales`、translation groups、locale route registry;
- canonical、双向 hreflang、多语言 sitemap 和语言切换;
- 灰度/预发布、缓存失效、发布后链接抽检。
退出门槛:一次失败发布可自动回到上个健康版本;重复签名请求不能重放;双语言站点不存在孤立翻译或错误 hreflang。
### M6 — 生产与企业治理(15–30 人日)
交付:
- OIDC/SSO、可选 MFA、会话撤销、权限回归测试;
- 审计日志外送/不可变保留;
- Prometheus/OpenTelemetry 或等价指标与追踪、SLO 和告警手册;
- 依赖审计、镜像扫描、SBOM、镜像签名和许可证清单;
- 容量、峰值、混沌、灾备演练;
- RPO/RTO 与保留策略经业务签字。
退出门槛:达到约定 SLO;恢复演练达到 RPO/RTO;高危漏洞为零或有经批准的限时豁免;值班人员仅凭 Runbook 能完成恢复。
## 6. 推荐的下一迭代(两周)
两周内只做一条平台纵切,不开启大规模 UI 扩展:
### 第 1 周
1. 修复备份句柄和 5 个 UTF-8 测试。
2. CI 增加 Windows,校正测试计数,注入并校验真实 SHA。
3. 增加安全响应头、TrustedHost 和可信代理配置。
4. 建立 SQLite/PG 两套 Docker smoke 脚本。
5. 定义 build snapshot、job event、artifact manifest 三个数据契约。
### 第 2 周
1. 实现不可变 build snapshot,改 Worker 只消费 snapshot id。
2. 给作业增加 progress/stage/events/dead-letter。
3. 迁移第一批遗留表到 schema registry,并验证空库升级和旧库升级。
4. 完成备份 manifest、SHA-256 校验和独立恢复命令。
5. 在 CI 执行一次“建站→构建→备份→清空测试部署→恢复→重新构建”的闭环。
迭代结束演示必须证明:提交构建后再修改页面,原任务仍生成提交时版本;Worker 被终止后任务不会丢;备份能在空白环境恢复;所有测试跨平台通过。
## 7. 架构优化原则
1. **数据库是业务事实源,队列不是。** Redis 只做通知;任务状态、幂等键和租约落数据库。
2. **构建输入必须不可变。** 审批、构建、发布都引用 snapshot/hash,不读取“现在的站点”。
3. **外部输入先暂存再提交。** 爬取、API、数据库和文件导入必须进入 staging,校验/映射/人工确认后再原子提交。
4. **路由是一等数据。** 使用 route registry 管理 locale、来源、行为和冲突,不从标题临时推断最终 URL。
5. **人工编辑优先级显式化。** 每个字段记录 source、source key、同步时间和 manual override,增量同步不得静默覆盖。
6. **大任务统一进入作业系统。** 请求线程只创建任务;迁移、抓取、媒体处理、构建、发布都可恢复、可观测、可取消。
7. **每个“完成”都有证据。** 单元测试证明代码分支,E2E 证明用户流程,恢复演练证明可恢复,试点签字证明商业可用。
## 8. 四个最终业务验收场景
项目不能仅以“测试全绿”宣告完整,还需完成架构文档要求的四类试点:
1. **A:WordPress 汽车网站迁移** — 页面、文章、产品、媒体、SEO 和重定向全量对账。
2. **B:工业企业新站搭建** — 从模板到内容录入、响应式编辑、构建、预发布和正式发布。
3. **C:增量数据更新** — 再次同步时更新源数据,但保留人工修改并提供冲突报告。
4. **D:模板复用** — 从已验收站点提炼多页面模板,新建站点不携带客户私有内容。
每个试点必须保存:输入清单、映射版本、构建 snapshot/hash、质量报告、发布记录、回滚记录、遗留问题和业务负责人签字。
## 9. 预计投入与排期建议
- M0–M1:10–17 人日,先串行完成,建立稳定地基。
- M2–M5:40–62 人日,可由两条工作流并行,但共享 schema/job/snapshot 契约。
- M6:15–30 人日,需结合真实部署和企业要求。
- 总计:65–109 人日;若由 2 名熟悉 Python/FastAPI、前端和 Docker 的工程师执行,合理日历周期约 9–14 周,另加真实试点反馈时间。
估算不包含大规模视觉设计、客户数据清洗、第三方服务采购和等保/渗透测试认证。若首个商业目标只需要 WordPress 迁移 + 静态发布,应把 SFTP/S3、多语言、SSO 分阶段开启,避免范围同时膨胀。
## 10. “完整项目”定义(Definition of Done)
只有同时满足以下条件,才能将版本标记为完整:
- 需求覆盖矩阵无未解释的缺口,所有延期项有明确版本和责任人;
- Windows/Linux 支持矩阵全绿,真实浏览器 E2E 和可访问性门禁通过;
- SQLite 和 PostgreSQL 的升级、备份、恢复、并发和故障测试通过;
- 迁移/导入/构建/发布均可中断恢复、审计和回滚;
- 构建产物可由不可变输入重现,发布可追踪到 commit、snapshot、theme 和 artifact hash;
- 四个业务试点完成并签字;
- 安全、供应链、监控、告警、Runbook、RPO/RTO 均有证据;
- 文档内容与当前代码、版本、测试数量和部署方式一致。