今晚干了一件挺爽的事:把跑了十几年的 WordPress 博客从美国的老主机迁移到了新加坡的腾讯云 CVM,同时还搭了一个全新的 Hugo 静态博客站点。两件事加起来,一个晚上搞定。
先说结论:
- 老的 WordPress 博客:https://zrj.me(Docker 化部署,保留原始风格)
- 新的 Hugo 静态站点:https://blog.zrj.me(Stack 主题,更快更现代)
两个域名,两种形态,同一份内容。下面说说整个过程。
为什么要搬
原来的博客跑在美国的一台主机上,访问速度一直不太行,尤其是从国内访问,动不动就转圈。这个博客从 2012 年开始写,到现在 300 多篇文章,虽然更新频率不高,但毕竟是自己十几年的技术笔记,还是希望它能活得好一点。
正好手上有一台新加坡的腾讯云 CVM,上面已经跑了一些其他服务,干脆把博客也搬过来。
WordPress 迁移:Docker 一把梭
迁移的思路很直接:从老主机导出数据库 dump 和网站文件,在新机器上用 Docker 跑 WordPress + MySQL。
整个过程大概是这样的:
- 从老主机打包下载
public_html.zip(44MB,3894 个文件)和localhost.sql.zip(1.9MB 的数据库 dump) - 写一个
docker-compose.yml,MySQL 5.7 + WordPress PHP 7.4 - 数据库挂载到
docker-entrypoint-initdb.d自动导入,WordPress 文件挂载到/var/www/html - Nginx 反向代理,acme.sh 签 SSL 证书
- 最后一步:通过 DNSPod API 把
zrj.me的 A 记录指向新机器
踩的几个坑
PHP 版本不兼容:一开始用了 wordpress:php8.1-apache 镜像,结果 WordPress 5.2 和 PHP 8.x 不兼容——花括号数组访问语法在 PHP 8.0 被移除了。降级到 PHP 7.4 解决。
HTTPS 重定向混乱:老站点装了个 wp-force-https 插件,在反向代理环境下行为异常,HTTP Location 头被截断成奇怪的格式。解决方案是禁用这个插件,HTTPS 交给 Nginx 层处理,在 wp-config.php 里加了 X-Forwarded-Proto 检测。
LiteSpeed Cache 的 .htaccess 规则:老站点用的是 LiteSpeed 服务器,.htaccess 里有一堆 LiteSpeed 专属的 RewriteRule,在 Apache 下会出问题。直接清理掉,只保留 WordPress 标准的 permalink 规则。
Hugo 静态站点:给老博客换个新衣服
WordPress 跑起来之后,我又想:既然内容都在了,不如再搞一个静态站点?加载快,不怕宕机,部署也简单。
选了 Hugo + Stack 主题,流程是:
- 用 WP-CLI 从 WordPress 导出 XML
- 用
wordpress-export-to-markdown工具转成 Markdown - 从数据库导出评论(214 条),以静态形式嵌入每篇文章底部
- 为每篇文章添加
/archives/{id}的 alias,兼容老链接 - Docker 化:Hugo 构建 + Nginx 提供静态文件,监听 8082 端口
代码块修复:最折腾的部分
这个博客跨越了十几年,不同时期嵌入代码的方式不一样。早期用 SyntaxHighlighter 插件的 [bash]...[/bash]、[cpp]...[/cpp] 这种方括号标签,后来有段时间用的是 [py]、[js] 这种缩写形式,还有带属性的写法 [cpp highlight="3"],最新的文章是从微信公众号粘贴过来的带内联 style 的 HTML。
导出工具把这些代码块转得一塌糊涂:换行丢失、方括号被转义、HTML 实体没解码(" 原样输出为 ")、非代码内容带了 4 空格缩进被 Markdown 当成代码块……
最后的解决方案是:不信任导出工具的代码块转换结果,直接从 WordPress 数据库原文中提取代码块,包含完整的换行和原始格式,反转义 HTML 实体后替换到 Markdown 文件中。写了三个 Python 脚本分别处理不同类型的问题,前前后后迭代了好几个版本才把 200 多篇文章的代码块都修好。
代码高亮的明暗适配
Stack 主题支持暗黑模式,但 Hugo 默认的代码高亮是内联样式,没法跟着主题切换。解决方案是用 noClasses = false 配合两套 Chroma CSS——亮色用 monokailight(米黄色暖底),暗色用 dracula,通过 @media (prefers-color-scheme: dark) 和 [data-scheme=dark] 选择器自动切换。
最大的感受:AI 协作真的太爽了
说实话,如果是以前纯手工搞这些事情,WordPress 迁移 + DNS 切换 + SSL 证书 + Hugo 搭建 + 300 篇文章的代码块修复 + 各种踩坑调试,怎么也得两三天。
但今晚整个过程,从第一步解压文件到最后一步部署上线,全程都是和 AI 协作完成的。我只需要描述需求、确认方案、验证结果,AI 负责写配置、写脚本、排查问题、修 bug。那种感觉就像是有一个特别靠谱的搭档在旁边,你说一句,它就能理解你的意思然后快速执行,遇到问题还能自己分析原因给出解决方案。
整个过程非常流畅,而且——说实话——很愉悦。不是那种"终于搞完了"的如释重负,而是一种"wow 这也太快了吧"的惊喜感。原本预期要花好几天的事情,一个晚上就全部搞定了,而且质量一点没打折。
这大概就是人机协作的魅力吧。人负责想清楚要做什么、把关方向和质量,AI 负责快速高质量地执行。两者配合起来,效率提升不是百分之几十,是好几倍。
现在的状态
| 站点 | 地址 | 形态 |
|---|---|---|
| WordPress 博客 | https://zrj.me | Docker 容器化,原汁原味 |
| Hugo 静态站点 | https://blog.zrj.me | Stack 主题,快速轻量 |
两个站点内容一致,313 篇文章 + 214 条历史评论都完整保留。你可以随便挑一个访问,看看从 2012 年到 2026 年这十几年的技术笔记。