升级 Halo 2.9!这次玩把大的
可能是因为我用 Halo 作为技术博客的 CMS 用得比较早,这个 1.3 版也一直够用,所以就一直没有升级 Halo。不过最近想要搞点事情,发现这个旧版本的已经不支持了,于是升级了一下。
去年的时候在帮朋友搭 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,算了,只能一点一点贴过来了。
走到最后一步才发现原来这么绝望。。