自从建这个博客到现在已经快 6 年了,最开始用的是 Jekyll,用的服务器甚至是放在家里的树莓派 Zero W。接着是使用 Handsome 主题的 Typecho,虽然没有几张图片但是还为他专门架设了一个 Chevereto 图床。配合上 Handsome 主题的 Typecho 功能很齐全也很美观,但是热衷于重装系统的我自然而然的每隔一两年都要重装一次服务器的系统,并徘徊在安装 Typecho 和 Chevereto 的各种文件权限问题中。而 Handsome 主题大而全的另一个反面就是繁杂的配置选项,尽管外观上仍然保持了作者的克制,但我更希望我的博客能更专注于传达信息。于是借着给实验室搭建官网的工夫,我就顺手将博客迁移到了 Hugo。
Typecho 数据导出
我最希望能够原样从 Typecho 原样迁移的数据大概有以下几个部分:
- 文章内容及封面
- 几年来积累的评论
- 友链
- 由于 Typecho 和 Hugo 的 URL 结构有所不同,我需要将原先博客文章的链接 301 映射到新链接,避免 SEO 降低权重。
幸运的是,我的大部分需求都能被 从 Typecho 完美迁移到 Hexo 这篇文章满足,基于这位作者提供的代码,我进行了一些修改以满足我的需求。
导出文章内容及封面
使用这个脚本可以导出文章的标题、头图、发表日期、标签、分类、slug 等信息。由于 slug 通常是唯一的,且相对于标题更容易搜索,后续脚本将使用这个字段在创建新旧链接对应表时进行数据库搜索。
请注意,该脚本仅能处理文章属于一个分类的情况。如果有多个分类,建议先在 Typecho 中手动将所有属于多个分类的文章去掉多余的分类。
article_exporter.py
|
|
映射新旧文章链接
你需要将以下脚本的倒数第二行链接修改为你在 Typecho 中设置的格式。下图是我之前设置的文章路径,你需要将脚本修改为你设置的路径格式。
link_convert.py
|
|
运行以上脚本后新建 postmap.txt,复制输出的内容到该文本文件中。
将 postmap.txt 转换为 nginx 规则
运行一下脚本,并将输出的内容粘贴到 nginx 配置文件中即可。
|
|
评论数据迁移
由于 Hugo 是静态网站,需要部署一个评论后端,这里我使用了 Hugo Stack 主题原生支持的 Waline。当时用 Jekyll 做博客的时候似乎就听说过它的前身 Valine。
部署好 Waline 后,安装 Export2Valine 插件导出评论。
如果你的评论数据较多,有概率在点击导出后显示 502 Bad Gateway,并且日志中提示 upstream sent too big header while reading response header from upstream
,这时你需要在 nginx 中的 location 字段添加如下代码启用缓存。
|
|
修改后如图所示:
成功下载 valine.2024-02-15.jsonl
后,删去文件头部的 #filetype:JSON-streaming
,将其改名为 valine.json。并将该文件与 Waline 的 sqlite 数据库文件放在同一个目录下。之后运行如下脚本:
comment_convert.py
|
|
运行成功后,将 waline 的数据库文件传回服务器,如果你使用的是 Stack 主题,添加如下配置项启用 Waline
|
|
导出友链
我使用 phpMyAdmin 管理我的数据库,可以在 phpMyAdmin 中进入 typecho_links 数据表,选择导出,格式选择 JSON。
复制导出的 JSON 文件内容,粘贴至下面的脚本中运行,会将其转换为 YAML 格式。
|
|
接下来,对于 Stack 主题,您只需新建一个页面(Page),并将脚本输出的内容粘贴到 index.md
的 Frontmatter 部分即可。
至此,大部分的迁移工作已经完成,只需将在 source/_post
目录中生成的文件复制到 Hugo 中即可。
如果使用 hugo server
命令渲染网站,包括评论在内的大部分内容应该可以正常访问。
一些优化
(绝赞更新中