blog-demo · 规划
v1.0 生产入口解耦与发布收尾计划
将公网入口从博客内容镜像拆出,由独立 Edge 统一管理 TLS 和域名路由。
- 状态
- 已完成
- 最后核对
- 源码修订
e0d3baa2
v1.0 生产入口解耦与发布收尾计划
状态:架构切换已完成。独立 Edge 与解耦后的博客于 2026-09-13 完成生产切换和验收;早期 v1.0.0 制品只作为切换证据与回滚基线,最终标签以本轮完整发版结果为准。
背景
当前生产环境由博客 Web 容器直接占用 80/443,并由 ai-infra 通过 Compose overlay 把 ai.doyouhang.live 的 Nginx 配置挂进同一容器。这个结构已经在线运行,但博客完整发版若漏掉私有 overlay,会在重建 Web 容器时移除 AI 域名入口。远程 Studio 也把入口配置叠加在 Web 容器上,进一步放大了发布耦合。
本计划把公网入口从内容镜像中拆出,作为 v1.0 的生产架构收尾。用户已于 2026-09-13 明确批准本计划完成后直接实现与全面复核,无需再等待一次实施确认。
范围
- 新建由私有
ai-infra维护的独立 Edge Nginx 容器和 Compose 项目,由它唯一占用公网 80/443、读取 TLS/ACME,并路由博客与 AI 域名。 - 创建固定名称的外部 Docker 网络;博客 Web 作为无公网端口的静态后端加入该网络,使用稳定别名供 Edge 访问。
- 远程 Studio 的 oauth2-proxy 作为另一个无公网端口后端加入同一网络;最终发版前已完成 DNS、证书、OAuth 输入和真实登录验收。
- 删除博客仓库中直接终止生产 TLS、占用 80/443 的 Nginx 配置与证书续期职责,不维护两套生产入口。
- 更新 Studio 受限部署器,使内容发布只替换 Web 后端,不重建 Edge 或 AI 入口。
- 更新容器契约测试、发布测试、运维手册、迁移记录和 v1.0 发布说明。
- 处理本轮全面复核发现的生产依赖高危/严重漏洞;若安全升级要求跨 Astro 主版本,则完成兼容修复和完整回归,不带漏洞例外发布。
规划时的非目标
以下边界描述最初的 Edge 拆分实施窗口。远程 Studio 后续已在独立验收中正式启用,并作为最终 v1.0.0 收尾,不改变 Edge 与 Web 的发布隔离。
- 初始仓库实现阶段不修改公网 DNS、安全组、真实证书或服务器运行容器;获批发布后再按运维手册单独切换生产。
- Edge 首次切换窗口不同时启用
studio.doyouhang.live,不在入口迁移中混入 OAuth 凭据变更。 - 不改变 AI 网关的 Bearer 鉴权、WoL、frp 或模型服务。
- 标签、版本制品、GitHub Release 和生产部署都必须由站点作者逐阶段批准,不能由普通提交自动触发。
架构
Internet :80/:443
|
v
private edge project (TLS / ACME / Host routing)
|-----------------------|
| |
v v
blog-web:80 host gateway:18080
(public repo image) (AI auth gateway)
optional after activation:
edge -> studio-auth:4180 -> studio:4331
- Edge、博客和 Studio 通过预创建的外部网络
doyouhang-edge连接,稳定别名分别为blog-web与studio-auth。 - Edge 配置使用 Docker 内置 DNS 的运行时解析,缺少可选 Studio 后端时仍能启动;未启用域名不装载对应 server 配置。
- 博客镜像只含生成站点与内部 HTTP Nginx;生产与预发布使用同一后端配置,差别只在是否发布回环端口、是否加入外部网络。
- 正式博客发布只更新
blog-demo-production项目的web服务。Edge 项目独立发布,因此不会随博客镜像重建,也不会丢失 AI 路由。 - Edge TLS 证书和续期 hook 由私有基础设施仓库管理;公开博客仓库只记录接口契约与验收步骤,不记录 AI 内部拓扑或凭据。
风险与控制
- 切换顺序错误导致停机:先创建外部网络并启动新 Edge 的受限演练实例,再让现有 Web 加入网络;正式切换需预留旧容器回滚配置,最后才释放/接管 80/443。
- Docker DNS 别名冲突:生产网络只允许一个已验收
blog-web后端;迁移与回滚均检查解析结果和容器 ID。 - TLS 域名遗漏:上线前校验证书 SAN 至少覆盖根域、
www、ai;启用 Studio 前再要求studio。 - Edge 成为单点:只读根文件系统、最小 capabilities、健康检查、日志轮转、固定镜像摘要与
restart: unless-stopped;回滚保留上一份已验证配置。 - 公共/私有仓库漂移:两边都保存同一网络名与后端别名契约,并以测试验证;发布手册明确列出跨仓库修订号。
- 依赖安全升级回归:升级后顺序运行类型检查、151 项单元测试、根路径构建、Edge 冒烟、Studio、规模集合与 60 张视觉基线,再构建真实
linux/amd64镜像。
生产执行输入的闭环
- Edge 生产目录与 Compose 项目名(默认
/opt/doyouhang-edge、doyouhang-edge)。 - 迁移窗口和上一可用 Edge/博客镜像引用。
- Studio 的 DNS、证书 SAN、OAuth 回调与唯一账号白名单已完成生产验证;秘密只保存在服务器受限文件中,不写入仓库。
验收标准
- 合并后的博客生产配置不发布任何主机端口,不挂载 TLS/ACME,Web 仍为只读、非特权、最小 capabilities 并健康。
- 独立 Edge 是唯一发布 80/443 的服务;未知 Host/SNI 拒绝,HTTP 308,TLS 仅 1.2/1.3,博客、AI、404、安全头、ACME 和健康探针均通过。
- 在只替换博客 Web 容器后,Edge 容器 ID 不变,
ai.doyouhang.live/healthz仍为 200、未认证 API 仍为 401。 - 内容发布器只更新 Web 后端,不能控制或重建 Edge。
- 生产依赖审计不再包含 high/critical;秘密扫描无真实凭据。
- 完整检查、真实
linux/amd64多容器运行和 Edge 浏览器回归通过;工作树无未解释改动。
提交组
docs: plan v1 production edge splitrefactor(infra): isolate the production edgetest: enforce edge and release boundariesbuild: remediate release dependency advisoriesdocs: finalize v1 edge operations
ai-infra 使用对应独立分支,提交私有 Edge Compose、Nginx、证书 hook、迁移/回滚手册和验证脚本;两边完成全部检查后才分别合入本地主线。
复核记录(2026-09-13)
- 博客生产 Compose 不再发布端口或挂载证书;Web 使用
blog-web,Studio 认证入口使用studio-auth。 - Astro 升级到 7.3.2,
svgo升级到 4.1.0,生产依赖审计为 0 漏洞;同时修正 Astro 7 对分页路由参数的严格校验。 - 单元、根路径构建、Microsoft Edge 全站冒烟、Studio 真实草稿构建、大规模内容分页和当时的 48 张视觉快照均通过;文档库合入后基线增至 60 张,进入最终发版门禁。
- 本机真实容器演练覆盖博客 200/404、AI 200/401、HTTP 308、ACME、安全头、TLS 1.2/1.3、TLS 1.1 拒绝和未知 Host/SNI 拒绝。替换博客后端后 Edge 容器 ID 未变化,AI 401 保持。
- 生产维护窗口已按私有
ai-infra手册完成:Edge 接管 80/443,博客仅作为blog-web:80后端运行;替换博客前后 Edge ID 未变。 - 配套私有实现已推进到
ai-infra@8e050ca,在84ad1a1的 Edge 基线上增加分类后的运维文档与安全快照导出;博客发布记录应同时保存两个仓库的最终修订号。 - GitHub Actions Run
34715861348与 Web 提交46aa21b是提前上线版本的门禁和制品证据,不代表包含文档库及 Studio 登录闭环的最终v1.0.0;最终发布必须生成新的 Run、镜像摘要和生产版本记录。 - 远程 Studio 已接入同一 Edge 网络,oauth2-proxy 与 Studio 均无主机端口;唯一账号完成多次全新 OAuth callback 和完整进入验收,博客 Web 发布不重建二者。
- 公网验收覆盖主要路由、搜索、RSS、sitemap、404、HTTP 308、TLS 1.2/1.3、未知 Host/SNI、AI 200/401 与真实推理;8080、18080 仍不可达,证书续期 dry-run 通过。