可能是因为我用 Halo 作为技术博客的 CMS 用得比较早,这个 1.3 版也一直够用,所以就一直没有升级 Halo。不过最近想要搞点事情,发现这个旧版本的已经不支持了,于是升级了一下。
Halo Update
去年的时候在帮朋友搭 Halo 的时候发现 2.x 的版本已经非常不一样了,而且对 1.x 的版本数据并不兼容。今年朋友想再搭一个新站的时候发现需要全面使用 Docker Compose,对于一般的开发者来讲不太熟悉 Docker 的朋友就可能没办法快速的搭建,这次升级自己的技术博客(也就是本站),既是一个升级记录,也是一个安装教程。大家各取所需~

因为 Halo 2.x 没有向下兼容,我们这次升级就直接“全新安装”之后再迁移数据。所以大概流程就是:

  • 买一台新的服务器
  • 全新安装 Halo 2.9
  • 配置服务、反向代理和 SSL
  • 迁移旧的 Halo 1.3 数据到新服务

还有另一个背景,就是 Tengine 已经开源几年了,而且在使用上和 Nginx 基本一致,所以这一次就安装 Tengine 代替 Nginx 来配置服务。如果依旧使用 Nginx的话,可以参照这篇文章:吃瓜:网站或者服务应该怎么部署?

买一台全新的服务器

我自己是选择了一台阿里云 ECS,双核心、2G 内存,20G 数据盘,一个公网 IP,2M 带宽。操作系统依旧是选择了 Ubuntu。

各大云服务商每隔一段时间都会推出活动、教育优惠之类的,Amazon AWS 还有一年免费的 VPS 可以用(不过很慢)。大家也可以多对比一下各个云的价格,选便宜的买。

由于众所周知的原因,如果你的域名没有备案,是不能访问的,所以一般我们也建议先做一个简单的页面做备案,然后再开始搭博客。备案时候页面是不允许“正在开发”这样的情况的,还是好好做一个页面吧。不过有的时候我们也会建议选一些国外的服务器,就省事多了。

全新安装 Halo 2.9

Halo 2.x 开始就必须用 Docker 安装了,而且如果使用 Docker Compose 的话会省事很多。所以我也就直接用 Docker Compose 安装的方法安装了。文档参见:Halo 文档 - 入门 - 安装指南 - 使用 Docker Compose 部署

值得说明的是,Docker Compose 安装和启动的部分不知道是文档过旧的原因还是写文档的人粗心,有部分指令是错的。这时候以我这里的指令为准。

安装 Docker 和 Docker Compose

虽然你也可以使用 apt-get install docker 的方法获取 docker,不过按照 Docker 官网的说法,最简单的方案是安装 Docker Desktop(虽然我们不见得会使用 GUI 的 Docker,甚至不会使用 GUI 的 Ubuntu)。

以下命令为使用 root 用户执行的例子,如果使用非 root 用户,则在命令前加上 sudo。

# 安装 gnome
# Docker Desktop 是在 Ubuntu 界面上直接操作 Docker 的一个应用,它要求必须存在一个图形界面,所以安装一下 gnome
apt-get install gnome-terminal

# 清理以往可能存在的技术预览版、测试版或者遗留的版本
apt-get remove docker-desktop

# 清理遗留的垃圾数据
# 在这一步可能会提示没有这个数据或者没有这个应用,不用理会
rm -r $HOME/.docker/desktop
rm /usr/local/bin/com.docker.cli
apt-get purge docker-desktop

docker docs - Install on Ubuntu 找到 2. Download latest DEB package,然后点击 DEB package 下载 deb 包到本地电脑(这一步你也可以直接在服务器上 wget,就省去了上传的操作),然后上传到服务器根目录(使用 scp 或者 rsync 都可以),我们假定文件上传到了服务器的 /root/download 目录

回到服务器,安装 Docker Desktop

在这一步会出现一个权限问题:

N: Download is performed unsandboxed as root, as file '/home/user/Downloads/docker-desktop.deb' couldn't be accessed by user '_apt'. - pkgAcquire::Run (13: Permission denied)

需要提前给予权限:

chown -Rv _apt:root /root/download
chown -Rv 700 /root/download

以下命令第二行,后面的文件中包含版本和 cpu 平台信息,直接以刚刚下载的 DEB package 文件名为准。

apt-get update
apt-get install ./docker-desktop-<version>-<arch>.deb

最后启动 Docker Desktop 并且设置开机自动启动

systemctl --user start docker-desktop
systemctl --user enable docker-desktop

创建容器组,并且启动 Halo 2.9

我这里的数据库使用的是阿里云 RDS(mysql 版),没有使用本地服务器上启动的数据库,这也是几年前因为自己的一个操作失误留下的教训:Hello Halo - 这是一段心酸的历程,非常的心酸。所以我也建议大家使用独立的数据库,如果使用本地服务器的数据库,则参照 Halo 的安装文档。

使用独立数据库时,要先提前创建数据库、然后给数据库分配用户。这一部分不做详细解释了。值得提醒的是:你需要在数据库中对你的新服务器开放 白名单 才能正常访问。

为 docker 中的 halo 2.9 准备一个工作目录。接下来使用 halo 产生的文件将会全部保存在这个目录里:例如我创建的是 /srv/mitkimi.com-halo。然后在这个目录下创建一个 docker-compose.yaml 文件:

其中,volumes 指的是工作目录,如果你使用了其他的工作目录,那就要把这个地方修改成对应的工作目录。
your.database.address 指的是你的数据库服务地址(例如阿里云 RDS 就登录阿里云 RDS 控制台,找到对应的实例,然后找到“数据库连接”)
port 指的是使用的端口号,一般是 3306
database.name 指的是你在这个数据库实例(服务)中创建的数据库名称
database.username 指的是你分配的、可以使用这个数据库用户的用户名
database.password 指的是上述用户的密码

halo.external-url 要根据你绑定的域名进行配置,如果是有证书的,还要改成 https

version: "3"

services:
  halo:
    image: halohub/halo:2.9
    container_name: halo
    restart: on-failure:3
    network_mode: "host"
    volumes:
      - ./root/.halo:/srv/mitkimi.com-halo
    command:
      # 修改为自己已有的 MySQL 配置
      - --spring.r2dbc.url=r2dbc:pool:mysql://{your.database.address}:{port}/{database.name}
      - --spring.r2dbc.username={database.username}
      - --spring.r2dbc.password={database.password}
      - --spring.sql.init.platform=mysql
      # 外部访问地址,请根据实际需要修改
      - --halo.external-url=http://localhost:8090/
      # 端口号 默认8090
      - --server.port=8090

保存后,在当前目录执行 docker compose 启动命令。

注意! 在这里,docker compose 官网的启动命令是错误的,以这个命令为准(初步推断是由于 docker 的版本升级,命令格式做了一些调整,所以实际上 halo 官网的命令也是无法生效的):

# 启动容器,自动拉取镜像并且运行
docker compose up -d

自此,你的 halo 2.9 就已经运行在服务器上了。

其他的操作参考使用 Docker Compose 部署

安装 Tengine,像使用 nginx 一样使用它

Ubuntu 下缺少 Tengine 需要的依赖 PCRE,所以要提前安装(参考文章:linux 所需的 pcre 库和 zlib 库从网上下载的步骤):

# 在服务器上
wget -c https://netix.dl.sourceforge.net/project/pcre/pcre/8.40/pcre-8.40.tar.gz
tar -zxvf pcre-8.40.tar.gz
cd pcre-8.40.tar.gz
./configure
make
make install

除此之外,Tengine 还依赖 openssl,也需要提前安装:

# 在服务器上
apt-get install openssl

安装完成后,进入 Tengine 下载页面 下载 Tengine 并且上传到服务器上(也可以在服务器上直接 wget),这里的例子使用 tengine 3.0.0

假设上传到 10.1.5.233/root/download 目录

# 在本地电脑
rsync tengine-3.0.0.tar.gz root@10.1.5.233:/root/download

Tengine 默认安装到 /usr/local/nginx,但是按照我的个人习惯会安装到 /etc 目录下,所以用 --prefix 修改安装路径

# 在服务器上,已访问到 /root/download,使用 root 用户
tar -zxvf tengine-3.0.0.tar.gz
cd tengine-3.0.0
./configure --prefix=/etc/nginx
make
make install

安装完成后,进入工作目录,启动 nginx 即可:

cd /etc/nginx/sbin
./nginx

反向代理

由于 Tengine 使用 nginx 一样的网站配置文件,所以也一样参考这篇文章:
吃瓜:网站或者服务应该怎么部署? 来部署网站。

如果使用免费的证书,也可以参考这篇文章:抛弃 freessl,用 acme.sh 自动为网站证书续期 获取免费证书和自动续期。

在这里,我们仅展示我的博客的配置文件(去掉了 ssl 的版本):

upstream mitkimi.halo {
  server 127.0.0.1:8090;
}
server {
  listen 80;
  listen [::]:80;
  server_name www.mitkimi.com;
  client_max_body_size 1024m;
  location / {
    proxy_pass http://mitkimi.halo;
    proxy_set_header HOST $host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}

然后执行 nginx 检查,如果没有问题,就可以重启 tengine 了:

cd /etc/nginx/sbin

# 执行检查
./nginx -t

# 重启 tengine
./nginx -s reload

这时,你就可以通过域名访问自己的 Halo 2.9 了。

迁移旧的 Halo 1.3 数据。

按照官网的说法,1.4 版本的数据需要升级到 1.5 或者 1.6 才能正常向 2.x 进行迁移,所以我们需要先升级到 1.6

但是我用的竟然是 1.3,现在连官网上都没有 1.3 的信息了。我先尝试了升级到 1.4,结果发现根本无法启动,我自己也不懂 java,算了,只能一点一点贴过来了。

走到最后一步才发现原来这么绝望。。