前言
号称好久之前就要开始自己搭个个人 blog 系统的,却迟迟因为各种原因,一直没有付诸于行动。
想写的东西有很多,却也迟迟没有整理出对外可以分享的东西。 不想写些流水,不想将就。
但是世界上本没有完美之物,这才是进化被需要的本质所在
好了,前言废话结束,直接进入正篇。
系统选型
按照程序员的思维,搭建之前肯定需要技术选型。 放狗搜索了一阵子,综合对比下来,选择了 Halo 这个 blog 开源系统。 选择它有四个核心因素,分别是:功能相对比较完备,系统皮肤做得不错,开源,Java 代码编写,插件也相对比较丰富。
其他的一些开源 blog 产品,要不皮肤做得差,要不维护更新不太频繁。 当然如果有你觉得更好的blog,也可以帮忙推荐下。
环境搭建
四大问题
主要参考官方文档,但是官方文档的安装还是挺有门槛的,非程序员出身一般都搞不定。我当时买的是腾讯云主机,在根据Halo官方文档安装时,主要遇到如下几个问题:
默认的 【Docker部署】 方式需要使用 H2 Database 数据库。但是作为一个长期运营的平台,H2 肯定不行,所以只能选择【DockerCompose部署】方式
腾讯云 Linux 发行版软件仓库中的 Docker 版本过旧,默认的 docker 版本较低,与 halo 的compose.yml 不兼容。
腾讯云主机访问跨境网络不太稳定,如果需要从 github 上安装相关软件,则经常会下载失败。
官方文档说的 Nginx Proxy Manager 并不好用,无法帮我生成 https 证书(反向代理还是比较 work 的)。
关键步骤
安装 docker
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
安装成功后的版本
lighthouse@VM-4-3-ubuntu:~$ docker compose version
Docker Compose version v2.21.0
lighthouse@VM-4-3-ubuntu:~$ docker --version
Docker version 24.0.7, build afdd53b
修改compose.yml
主要是修改这两处数据库密码:
- --spring.r2dbc.password=o#DwN&JSa56
- MYSQL_ROOT_PASSWORD=o#DwN&JSa56
完整的 yam 格式如下:
version: "3"
services:
halo:
image: halohub/halo:2.11
container_name: halo
restart: on-failure:3
depends_on:
halodb:
condition: service_healthy
networks:
halo_network:
volumes:
- ./halo2:/root/.halo2
ports:
- "8090:8090"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"]
interval: 30s
timeout: 5s
retries: 5
start_period: 30s
command:
- --spring.r2dbc.url=r2dbc:pool:mysql://halodb:3306/halo
- --spring.r2dbc.username=root
# MySQL 的密码,请保证与下方 MYSQL_ROOT_PASSWORD 的变量值一致。
- --spring.r2dbc.password=o#DwN&JSa56
- --spring.sql.init.platform=mysql
# 外部访问地址,请根据实际需要修改
- --halo.external-url=http://localhost:8090/
halodb:
image: mysql:8.1.0
container_name: halodb
restart: on-failure:3
networks:
halo_network:
command:
- --default-authentication-plugin=caching_sha2_password
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_general_ci
- --explicit_defaults_for_timestamp=true
volumes:
- ./mysql:/var/lib/mysql
- ./mysqlBackup:/data/mysqlBackup
ports:
- "3306:3306"
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "--silent"]
interval: 3s
retries: 5
start_period: 30s
environment:
# 请修改此密码,并对应修改上方 Halo 服务的 SPRING_R2DBC_PASSWORD 变量值
- MYSQL_ROOT_PASSWORD=o#DwN&JSa56
- MYSQL_DATABASE=halo
networks:
halo_network:
安装Nginx
这里需要先说明一下,我的测试联调步骤:
测试 java serverr 能否正常访问
测试 http+nginx 协议访问网站
测试 https++nginx 协议访问网站
官方文档推荐安装 NPM(Nginx Proxy Manager) (https://docs.halo.run/getting-started/install/other/nginxproxymanager) 但是我发现成功安装后,通过 http+nginx 协议能够正常访问网站,但是 https 证书无法安装成功,NPM 各种报错。
这里附一下常用的命令
sudo docker pull halohub/halo:2.11
vi compose.yaml
sudo docker compose up -d
sudo docker compose down
wget http://127.0.0.1:8090/console (看看Java server 能否正常工作)
另外,记得最后需要关闭在外网测试使用的一些端口,比如 8090 81 端口 。
Https证书
因为 NPM 报错了,所以我根据了它的报错信息,发现它也是封装了certbot 这种工具。然后我就决定索性绕过 NPM,直接使用certbot来安装了。
根据官网 https://certbot.eff.org/ 介绍,选择对应的反向代理和操作系统版本,进行安装就基本可以了。
这里有个点需要注意,就是配置自动更新证书。根据 https://www.digitalocean.com/community/tutorials/how-to-use-certbot-standalone-mode-to-retrieve-let-s-encrypt-ssl-certificates-on-ubuntu-20-04#step-4-handling-certbot-automatic-renewals 的介绍,我们需要在系统重启后或者证书更新后,重新触发 nginx 等反向代理去刷新配置。在 numnan.com.conf 这个文件最后,加上这句话
renew_hook = systemctl reload nginx #
cd /etc/letsencrypt/renewal
lighthouse@VM-4-3-ubuntu:/etc/letsencrypt/renewal$ ls ## 显示结果根据你的域名而定
numnan.com.conf
lighthouse@VM-4-3-ubuntu:/etc/letsencrypt/renewal$ vi numnan.com.conf
lighthouse@VM-4-3-ubuntu:/etc/letsencrypt/renewal$ sudo vi numnan.com.conf
lighthouse@VM-4-3-ubuntu:/etc/letsencrypt/renewal$ sudo certbot renew --dry-run # 执行没有报错信息即可