Halo 是什么

一款现代化的博客/CMS系统,部署极其简单,一个 jar 包,即一个服务。

准备

赶在活动期间申请了一年的腾讯云轻量应用服务器 2c/4G/5Mbps,很划算,就用这个机子搭建博客。我选择的镜像是 Ubuntu Server 20.04 LTS,比较顺手。

部署

根据官网的介绍,部署仅需两行命令即可启动 Halo 服务。

$ wget https://dl.halo.run/release/halo-1.4.11.jar

$ java -jar halo-1.4.11.jar

此时 terminal 里已经开始显示 Halo 的日志以及 URL 等信息。Halo 服务的默认端口是 8090,所以我要去腾讯云控制台开放此端口访问权限。打开 URL 就可以看到 Halo 的安装界面,填好个人信息之后就安装完成了。由于 Halo 自带了数据库,所以除了 jdk 它几乎不依赖任何软件。安装成功后会在用户目录中(即 $HOME)生成 .halo 文件夹,里面就是 halo 的配置文件。

创建服务

由于 halo.jar 是 Halo 运行的服务,所以必要做的一件事就是让 halo.jar 持久运行,而不是退出 shell 就退出程序,就像 apache/nginx 等服务一样,重启后自动运行。此时我想到的第一个办法就是创建 systemd 服务。

$ sudo vim /lib/systemd/system/halo.service
$ sudo systemctl enable halo
$ sudo systemctl start halo

创建好服务,启动服务,发现网站访问不了

$ sudo systemctl status halo-service

发现状态是成功的?奇奇怪怪??进 URL 发现能打开了,见鬼。
百度了一下下,原来 halo 官方提供了 .service 文件的模板,halo.service 下载试试,貌似情况是一样的,那只好另辟蹊径。

一些改动

我把 halo.service 从 /lib/systemd/system 移动至 /lib/systemd/user,这两个文件夹的区别是:使用 systemctl 时,默认会去找 /lib/systemd/system 中的 .service 文件,要想使用 /lib/systemd/user 中的服务,需要加参数 --usersystemctl --usersystem 是系统级服务,user 是用户级服务,因为我在运行 halo.jar 的时候是以普通用户执行的,生成的 halo 配置文件也就保存在 /home/userxxx/.halo 中,索性就将 halo.service 设为用户级服务了(毕竟强迫症)。

启动/停止脚本

此时该另辟蹊径了,使用 nohupnohup 用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。

$ nohup java -jar /path/to/halo.jar > /var/log/halo/halo.log 2>&1 &

可以启动(注意一下 log 文件夹的权限问题,必要时 chown)。
于是就写成脚本 halostart.sh 并赋予执行权限。

# 这里是 halostart.sh

#!/bin/bash

nohup java -jar /usr/local/halo/halo-1.4.11.jar > /var/log/halo/halo.log 2>&1 &

echo $! > /var/run/halo/halo-service.pid

/var/run/halo 这里也需要设置一下权限(用户组),没有的文件夹自行创建。

# 这里是 halostop.sh

#!/bin/bash

PID=$(cat /var/run/halo/halo-service.pid)                  
kill -9 $PID

启动/停止脚本创建完成后,修改 halo.service

### 大概的样子……
[Unit]
Description=Halo Service
Documentation=https://docs.halo.run
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=userxxx
ExecStart=/home/userxxx/.local/halo/halostart.sh
ExecStop=/home/userxxx/.local/halo/halostop.sh
PrivateTmp=true

[Install]
WantedBy=multi-user.target

重载 daemon,并启动+自启动

$ systemctl --user daemon-reload
$ systemctl --user enable halo.service
$ systemctl --user start halo.service

届时,halo 完美地运行起来了。

Q.E.D.