开始执行。先确认线上状态和代码使用位置。
线上状态确认:Web 20260909-lightbox-navigation-dismiss-r1 healthy,磁盘 76%。开始修复。
现在本地自测新转换器(用项目自带 TypeScript 转译后直接跑)。
本地自测全部通过(41 个有序项、56 个无序项、18 表格、5 引用、锚点 19/19 命中)。现在做类型检查与构建。
本地 node_modules 链接缺失(依赖未链接)。先恢复依赖以便本地校验。
趁依赖安装,先准备存量文章的重新转换产物。
本地依赖安装卡在链接阶段。改为直接用 Docker 构建(构建内含 next build 类型检查)。
本地 Docker 引擎未运行。先启动它。
构建上下文里有 4.3GB 的 tar 残留,先排除以免拖慢构建。
构建已启动(约 4.3GB 的 tar 已从上下文排除)。等待构建完成。
构建成功且 TypeScript 检查通过。重建为无 provenance 的单清单镜像,便于上传后核对同一 image ID。
镜像逐层一致(9 层)。现在切换线上 Web 容器。
部署完成。现在更新部署手册的发布记录。
备份文件是 psql text 格式(含转义),需要还原为原始正文才能用于回滚。
已彻底修复并部署上线。
修了什么
apps/web/components/user/submissions-section.tsx(核心) — 重写 Markdown 转换器:
| 原缺陷 | 修复方式 |
|---|---|
先对全文转义 >→>,块级判断才跑,引用块永不生效 | 块级解析改用原始行,转义下沉到行内渲染阶段 |
行内代码里的 _ * 参与强调配对,VITE_DEV_SERVER_URL 被撕成斜体、src/** 被加粗、产生非法嵌套 | 先用占位符保护行内代码,再处理链接与强调,最后还原 |
链接正则只认 https?:// 和 / 开头,锚点/相对路径不转换 | 支持 #锚点、./相对路径、mailto:,并识别 <裸 URL> |
列表遇到非列表行就断开,续行段落掉出 <li> | 列表项接管其缩进续行与嵌套列表,支持项内多段落 |
| — | 补齐表格(含 | 转义、列对齐补位)、多行引用块 |
其余 4 个文件
apps/web/lib/sanitize-html.ts:新增markdownHeadingId(),标题 id 改 GitHub 规则(先去标点再转-),目录锚点才能命中apps/web/app/legacy-home.css:补正文.contBox blockquote与投稿预览的引用块样式(原本完全没有样式)apps/web/components/code-highlight.tsx:代码块里的 NBSP 归一化为普通空格.dockerignore:排除*.tar(原来约 4.3GB 历史部署包全都会被塞进构建上下文)docs/AI-本地修改部署手册.md:更新发布记录、回滚镜像、正文回滚方式
部署结果
- 镜像
loveps-platform-web:20260920-markdown-format-r1,只切 Web,API/Admin 未重启 - 本地与服务器 RootFS 9 层逐层一致;三容器 healthy
- 首页 /
/news//sitemap.xml//user/tougao/ 目标文章页 / API health / Admin login 全部 200;Web 日志 15 分钟内 0 条 error / exception / fatal / server reference / mixed content - 产物校验:客户端 chunk
2hyb268_8qpz4.js已含新转换器;服务端 SSR chunk 只有新的锚点规则,旧规则不复存在 - 回归抽查另外 3 篇历史文章,均正常、无重复 id
存量文章已重新生成并回写
Content.id = cmu9gfitx00brpj08jgxhflzm 正文由 37423 字符替换为 40116 字符,线上实测:
- 表格 0 → 18,引用块 0 → 5,Markdown 链接 0 → 20(19 个页内锚点全部命中)
- 残留
| 层 | 选型 |段落 150 → 0,误判斜体 20 → 0 - 代码块恢复原有换行、NBSP 已去掉,「复制代码」拿到的命令可以直接跑
其余历史文章正文仍是旧转换结果,需要时可按同样方式单篇重新生成。
回滚方式
镜像:WEB_IMAGE_TAG=20260909-lightbox-navigation-dismiss-r1 ... up -d --no-build --no-deps web
正文:/www/backup/loveps-platform/20260920-markdown-format/restore.sql两点需要你知道:手册原先记录的 Web 回滚镜像 20260909-mobile-lightbox-r3 在服务器上已经不存在,本次实际回滚目标只有 20260909-lightbox-navigation-dismiss-r1,已在手册中更正;另外我启动了本机的 Docker Desktop(原本未运行),并终止了一个卡死 27 分钟的 pnpm install——本机 apps/web/node_modules 链接仍是缺失状态(我接手前就是如此),需要时自行 pnpm install,不影响本次部署(镜像在容器内独立安装依赖构建)。



