本文把实施方案映射到现有 blog-demo 项目,并保留迁移启动时的工程盘点。截至 2026 年 9 月 12 日,静态双目标构建、ECS 私有预发布、生产配置和正式 HTTPS 切流已经完成;自动发布与后端仍按后续阶段推进。不要把仓库重组、编辑器改造和数据库业务混入静态迁移。
已识别的工程入口
| 范围 | 当前实现 | 迁移处理 |
|---|---|---|
| Astro | astro.config.mjs,静态输出,package-lock.json 锁定 5.18.2 | 保持根目录结构与锁文件,不迁移前端框架 |
| 运行时 | .github/workflows/deploy.yml 使用 Node 22 与 npm ci | 首批镜像和新工作流沿用兼容版本 |
| 站点路径 | SITE_BASE 默认 /,Pages 使用 /blog-demo/ | 沿用变量名,不引入平行的 BASE_PATH |
| 规范域名 | SITE_URL 控制 Astro site,缺省仍为 Pages 源站 | Pages 构建保留默认值;ECS 构建使用 https://www.doyouhang.live |
| 旧链接 | 配置含 cooking 到 food 的重定向 | 验证两种 base 下的跳转结果 |
| 搜索 | scripts/index-search.mjs 与 scripts/site-base.mjs | 每个构建目标单独生成 Pagefind 索引 |
| 字体 | prebuild 调用 scripts/build-fonts.mjs | 容器构建保留字体源及依赖,运行镜像只带产物 |
| 发布 | deploy.yml 支持 main 推送、手动及交易日定时重建 | 第一批改动保持旧 Pages 发布可用 |
| 行情 | 工作流抓取行情后构建,失败可回退已有数据 | ECS 后续发布仍需定时内容更新,不把旧数据当新数据 |
| Studio | studio/server.mjs,本地 4331 端口,含内容和 Git 操作 | 保留本地用途,不打包或开放为公网 API |
| 验证 | tests/run.mjs 启动 preview;另有 Studio、集合和视觉测试 | 构建与测试使用同一 SITE_BASE,写入型检查顺序运行 |
以上表格记录当前工程入口。阶段三、四的构建、浏览器、容器、公网和 Pages Actions 验收结果见搭建与切流记录;临时日志和端口探测原始输出不写入长期项目约定。
第一组 双目标构建
涉及 astro.config.mjs、已有路径工具、tests/smoke.mjs 及相应配置测试。只有定位到实际路径问题时才修改页面或组件;站内链接继续使用 import.meta.env.BASE_URL。
- 为 Astro
site增加 SITE_URL 输入,默认保留现有 Pages 地址。拒绝无效 URL,并明确需要绝对 HTTP 或 HTTPS URL。 - 沿用 SITE_BASE,Pages 为
/blog-demo/,ECS 为/;不得改掉 deploy.yml 的 Pages 参数。 - 增加回归覆盖:未设置 SITE_URL 时仍使用 Pages 域名;指定新域名时 sitemap、RSS 与 canonical 使用新值;两种 base 的资源、搜索结果与旧重定向可访问。
- 每个目标运行完整 npm run build 并独立验证;前一次 dist 不得混入后一次发布。不要直接编辑 dist 或生成的 CHANGELOG.md。
- 校验 diff 后单独提交“配置与测试”这一组,与文档、内容修改分开。
本机验证应依次执行;命令输出保存到任务临时日志并保留原始退出码:
SITE_BASE=/blog-demo/ npm run check
SITE_BASE=/blog-demo/ npm run build
SITE_BASE=/blog-demo/ npm run test
SITE_BASE=/ npm run check
SITE_BASE=/ npm run build
SITE_BASE=/ npm run test
SITE_URL 功能实现后,根路径那一组再使用验证用域名检查产物中的绝对 URL;实际 ECS 域名不能凭空填写。若仅改配置且无视觉差异,按影响运行路径与搜索回归;有 UI 变化时补充视觉比较,有 Studio 变化时补充独立 Studio 测试。集合测试目前内部固定 /blog-demo/,不能用它单独证明根路径兼容。
第二组 静态容器与私有入口
在第一组通过后新增 infra/docker/web.Dockerfile、infra/nginx/staging.conf、infra/compose.yaml、infra/compose.staging.yaml 和 .dockerignore;暂不新增 API 或数据库空壳。
- 构建使用 npm ci 与 npm run build;仅 dist 进入运行镜像,排除 Studio、Git 元数据、密钥、文档和本地工具。
- 基础 Compose 不含 ports;预发布只发布
127.0.0.1:8080:80,检查最终合并配置。 - Nginx 正确提供静态深层路由、404、哈希资源与 Pagefind 文件;不采用通用 SPA fallback。
- 在目标 ECS 核实架构、内存、磁盘、Docker 和镜像源可达性;检查现有端口占用,保留已有服务。
- 先做服务器 localhost 检查,再做 SSH Tunnel 浏览器验证;阶段二期间从外网确认 8080 不可达。
第三组 自动发布工作流
该组对应主方案阶段七,尚未实施。当前生产发布采用本机构建与校验、归档传输、ECS 导入镜像和固定发布目录的受控手工流程;deploy.yml 继续负责 Pages。自动化前仍需验证不可变镜像摘要、配置匹配、并发锁、失败保留当前版本和回滚。
CI 与部署端分别防并发;不能为 GitHub 托管 runner 把 ECS SSH 向任意来源开放。推荐出站拉取发布清单,具体仓库选型以 ECS 的可达性和权限验证为准。行情刷新职责需明确保留,未来切停 Pages 时不能一起丢失。
正式静态入口已经上线。后端和 PostgreSQL 继续按照主方案的后续阶段实施;首个动态业务尚未确定时,不部署公网写入口。
服务器信息取得情况
- 域名、规范域名策略、ICP备案和阿里云接入状态已经确认;公安备案尚未办理。
- ECS 系统、CPU 架构、内存、磁盘、公网 IPv4、现有服务和计划端口已经盘点;未确认 IPv6,因此不发布 AAAA。
- SSH 连接方式可用;密钥和实际连接参数只保存在安全配置中,不写入本目录。
- 确定 ECS 可稳定拉取的镜像仓库、只读凭据和备份位置;完成前继续使用已校验的受控镜像传输。
- 明确首个真实动态业务、身份与权限要求,以及可接受的恢复点和恢复时长。
未完成项不阻塞当前纯静态站,但会阻塞自动发布或后端阶段的完成声明。