死后如何更新博客
2019-05-07

我的博客会在每年情人节发第一篇,之后每月日子是七的倍数也就是 7、14、21、28 日准时更新,到 12 月 21 日发完当年最后一篇,这样周而复始持续了五年有余。今天是第 222 篇。

表面上我不像个处女座,但从更博这件事上,完美主义这点是实锤了。

之前有遇到过博客更新日外出有事,文章虽然提前写好了但身边没有电脑,就在手机上安装了一个 SSH 客户端,登录服务器拉代码更新。

假如有一天我去了一个没有网络的海岛,甚至极端一点假如我死了,还能继续如期更新博客吗?别说,我还真整了个办法。本文接下来就是技术细节了。

没到时间的不发布

我是用 Hugo 生成博客的,文章用 markdown 格式书写,每篇文章都有一个头,如下:

---
title: XXX
date: 2019-04-28T00:00:00+08:00
---

头部的 date 字段是发布时间。需要注意的是,时区默认是格林威治时间,写2019-05-07要到北京时间 2019 年 5 月 7 日早上八点才算到。如果想北京时间零点发布,就得把时区加在后面。

运行 hugo 命令,默认只会生成当前时间之前的文章。利用这个特性,就可以预先写好文章,并指定在某个日期自动发布。

之前我都是在本地生成好 HTML,推倒 Git 上然后再从服务器拉取到生成好的 HTML 网页文件。而现在要在服务器上执行 hugo 命令来生成 HTML,就不必再在本地生成了,于是在本地只需要写 Markdown 文件就好,比以前轻松了一些。代价就是需要在服务器上安装 Hugo.

服务器上安装 Hugo

在 GitHub 上找到 Hugo 的最新版本,我们选择 Linux-64bit 的二进制文件,把压缩包下载下来,开箱即用。为了简化过程,我还是写了一个脚本 install-hugo.sh,指定版本号,一键完成下载和安装。

例如,当前最新版本是 0.55.5,就这样来执行命令:

sh install-hugo.sh 0.55.5

脚本非常简单就两步,第一步下载,第二步解压到指定目录:

# 下载指定版本的二进制文件压缩包,版本通过参数来指定
wget https://github.com/gohugoio/hugo/releases/download/v$1/hugo_$1_Linux-64bit.tar.gz

# 从压缩包中抽取出可执行文件 hugo,并放到命令行能找到的目录下
tar -xzvf hugo_$1_Linux-64bit.tar.gz hugo -C /usr/local/bin

定时任务

用 crontab 来定时执行拉取代码 git pull 和生成网页 hugo 的命令。

例如每天早上 07:00 发布:

0 7 * * * (cd /usr/share/nginx/html/blog/ && git pull && hugo)

我有时候会提前写完博客,有时会在发布日的当天写完,偶尔发布完成后发现哪不对会立刻做一下修改。用技术语言描述需求,就是在每个月的 7、14、21、28 日每半小时更新一下博客(分别在每小时的 0 分和 30 分),crontab 写法如下:

0,30 * 7,14,21,28 * * (cd /usr/share/nginx/html/blog/ && git pull && hugo)

因为项目名就叫 blog,直接 git clone 到了 Nginx 默认的网站目录 ,于是就进到 /usr/share/nginx/html/blog 这个目录下,拉取代码并生成页面。


写到最后,我想,在一个没有网络的海岛上和死了好像真没太大区别。存在需要被感知,正如信息需要被传递。例如这篇文章是我的第 222 篇博客,而恰逢 Hugo 的版本号走到 0.55.5,这个巧合和我有关,我不说它也就不存在。

END