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
中的服务,需要加参数 --user
即 systemctl --user
,system
是系统级服务,user
是用户级服务,因为我在运行 halo.jar
的时候是以普通用户执行的,生成的 halo 配置文件也就保存在 /home/userxxx/.halo
中,索性就将 halo.service
设为用户级服务了(毕竟强迫症)。
启动/停止脚本
此时该另辟蹊径了,使用 nohup
。nohup
用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。
$ 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.