从Wordpress迁移到Hugo

大概半年以前?我尝试过从Wordpress迁移到Hexo,但是有太多的问题没法解决:WP的文章在导出后整理图片路径很麻烦,也没想到很好的同步文章到服务器的方式,因此简单尝试后还是放弃了。

最近开始梳理过去的知识点,记录每周的学习内容,但是用WP写作的话每次都要开浏览器,不是很方便也不是WYSIWYG,修改文章也不如编辑Markdown文档方便,还得发布后再去查看,于是考虑换个方式写文章。本来是打算用Hexo的,因为主题很漂亮(Hexo-NexT主题的颜值是真的高啊🤤)。然后由于没法比较优雅地解决图片路径的问题,谷歌着谷歌着就发现了另外一个静态网页框架:Hugo,比Hexo 更流行 ,性能也更好,干脆就用Hugo了。 Hexo-NexT主题现在Hugo也有了移植: Hugo-NexT ,因此我最后还是选择了使用Hugo作为博客框架。

花了两天时间,试过了N个Markdown编辑器,从Hexo转到了Hugo,趟过不少坑,总算是打通了写作即发布的流程,于是开篇文章记录一下。

Markdown编辑器的艰难选择

Typora不是开始收费了嘛,于是打算换个别的编辑器,在尝试过Joplin、Mark Text、Notable、Notion之后发现都不是很好用,而且对于文档中的图片保存路径自定义选项不够丰富(大坑之一,路径一旦不对图片就加载不出来,但是网页能正常显示的路径对于本地编辑器来说又是错的,体验很差),折腾了半天还是换回了Typora,真香😂

Hugo配置

hugo -D or hugo server?

Hugo provides its own webserver which builds and serves the site. While hugo server is high performance, it is a webserver with limited options. Many run it in production, but the standard behavior is for people to use it in development and use a more full featured server such as Nginx or Caddy.

hugo server | Hugo (gohugo.io)

根据官方文档,hugo server不应该用于Production环境,使用正确的做法是使用hexo -D生成生成静态网页,然后配置Nginx实现Web服务。

nginx.conf server block如下:

server {
        listen 443;
        server_name hugo.izeroo.cn;
        root /home/zero/hugo/public;
        index index.html;
}

经测试发现hugo server会有一些bug,文末链接不会随网站域名变化,就像下面这样

本文链接: http://localhost:1313/post/migrating-to-hugo.html

解决办法是使用下列参数启动hugo server

hugo server --appendPort=false -b "https://hexo.izeroo.cn/"

还有一个类似的bug,就是文末链接会变成

在Gitter上得知是Hugo-NexT主题在develop分支引入的bug,目前develop分支已经修复 🐛 Fixed the local search engine can’t find indexes file & repose … · hugo-next/hugo-theme-next@f1fafdc (github.com)

图片如何正常显示?

要让图片同时在本地和服务器上正常显示,最头疼的就是到底把图片放到哪里了,经过N小时的搜索和尝试,大致了解到大概这几种方式:

  1. 放到 static/image
  2. 放到 post/image/xx.png
  3. 放到 post/post_name/xx.png

折腾了半天最后还是最后一种比较符合人类直觉,当文章内需要插入图片时在post文件夹内新建post_name文件夹,图片放在里边,md文档使用index.md命名即可。如果不需要插入图片直接在post文件夹内放入文档即可。

自定义设置

见 “config.yaml”,说明很详细,按照提示自定义即可。

评论插件

giscus的风格和主题不太搭,最后还是选择了waline。

waline有很多种部署方式,我们既然有专用的主机那肯定是选择独立部署了。不过配置过程也是一波三折🤣

node.js版本过低

我使用的发行版是Debian bullseye,官方仓库内的node.js版本还停留在12.0,但是waline运行需要node版本>14.0,因此需要手动安装node.js

nodesource/distributions: NodeSource Node.js Binary Distributions (github.com)

Node.js v18.x:

# Using Ubuntu
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs

# Using Debian, as root
curl -fsSL https://deb.nodesource.com/setup_18.x | bash -
apt-get install -y nodejs

环境安装好之后即可部署waline,我使用的是 Waline 服务端一键独立部署解决方案 | Loclink Blog (tj520.top) ,默认的数据库用户是root,可以改一下。

还有个小问题需要留意一下,管理界面中文章的URL不对,因为.env文件中没有设置SITE_URL的值,默认用的就是waline服务端的URL,可以设置成自己博客的URL。

实现waline服务端自启动

waline部署好后,在服务端启动后执行下列命令即可

sudo npm install pm2 -g
pm2 save
pm2 startup

是时候解决文章同步了!

一直以来都有这样的问题:在本地写好文章后如何同步到服务器?

push到github再由服务器clone下来?由于众所周知的原因在网络环境不好时此方案并不理想。

在本地写完再复制到服务端post文件夹?仅复制发生更改的文件还是复制并覆盖重复文件?如何追踪文件更改?比较麻烦。

那么有没有一种方法比较好的解决这个问题呢?有!那就是映射服务器目录到本地硬盘,这样一来编辑文章就和本地体验一样了,而且省去了上传的步骤。唯一的问题就是在没有网络的情况下服务会不可用,但是这种情况比较罕见可以单独处理,不成问题。

如何实现?

使用sshfs-win-manager即可实现映射Linux服务器任意路径到网络硬盘,之后就可以使用Typora愉快地进行编辑啦🎈🎈🎈

Github项目见: evsar3/sshfs-win-manager: A GUI for SSHFS-Win (https://github.com/billziss-gh/sshfs-win)

使用很方便,界面也很漂亮,附一张软件截图:

image-20220928210057209