Halo 2.x 无损跨版本升级
之前为了图稳定,用的 halo版本是 2.20,结果发现应用市场很多插件用不了,用了一段时间发现这个项目非常成熟,用起来很舒服,便果断打算更新到目前最新的版本——2.24.2。
回首看自己以前写的部署教程,发现当时是用一行长长的 docker run 命令把博客给“裸跑”拉起来的。没有配置文件,没有版本控制(我更新时手快先把原docker镜像给删了,没法看以前的文章,愣是找了半天配置文件...)。借着这次升级的机会,我决定抛弃之前的单命令运行方式,用标准的 docker-compose 编排方式,给博客来一次彻底的“无损换血手术”。
核心思路:换躯壳,保灵魂
Docker 容器化部署最大的魅力在于数据与环境解耦。只要我们的数据库(MySQL)和工作目录(~/.halo2)完好无损,容器就算删掉一百次也能满血复活。
Step 1: 重构“正规军”图纸
首先,为 Halo 建立一个专属的隔离目录,并手捏一份标准的 docker-compose.yml 配置文件:
mkdir -p ~/halo && cd ~/halo
vim docker-compose.yml
💡 小插曲:如何找回遗忘的 MySQL 密码?如果你和我一样,MySQL 是以容器(如
mysql-halo)跑在后台,且忘了当初设置的密码,有几个备选选项的话,完全不需要到处翻找,直接进入容器内部“开盲盒”测试:docker exec -it mysql-halo mysql -uroot -p挨个输入候选密码,只要看到mysql>提示符,就说明密码对了!
在 docker-compose.yml文件中输入以下配置:
version: "3"
services:
halo:
image: halohub/halo:2.24.2 # 🚀 目标最新版
container_name: halo
restart: unless-stopped
ports:
- "8090:8090"
volumes:
- ~/.halo2:/root/.halo2 # 挂载旧数据目录
environment:
# 1. R2DBC 配置:必须加上 sslMode=disabled
- SPRING_R2DBC_URL=r2dbc:pool:mysql://172.17.0.1:3306/你的数据库名?sslMode=disabled&allowPublicKeyRetrieval=true&zeroDate=use_round
- SPRING_R2DBC_USERNAME=root
- SPRING_R2DBC_PASSWORD=你的数据库密码
# 2. JDBC 配置:保留 useSSL=false
- SPRING_DATASOURCE_URL=jdbc:mysql://172.17.0.1:3306/你的数据库名?useUNICODE=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
- SPRING_DATASOURCE_USERNAME=root
- SPRING_DATASOURCE_PASSWORD=你的数据库密码
# 3. 指定方言
- SPRING_SQL_INIT_PLATFORM=mysql
注意: 该版本的 Halo 全面拥抱了响应式编程,底层换成了更激进的 R2DBC 数据库驱动。这个新驱动安全意识极高,默认会强制要求与 MySQL 进行高加密级别的 SSL 握手。而我的 MySQL 5.7 并没有配置高级证书,双方直接“语言不通”,导致应用当场崩溃。所以要在 docker-compose.yml 的 environment 环境变量中,必须同时对 R2DBC(业务层)和 JDBC(Flyway 数据迁移层)禁用 SSL,并明确指定数据库名称(注意替换 你的数据库名 和 你的数据库密码)。
Step 2:辞旧迎新
不要怕删容器,容器只是消耗品!
停止并删除旧容器:
Bash
docker stop halo
docker rm halo
(注:如果你的容器名不叫 halo,请用 docker ps -a 查看并替换)
在 docker-compose.yml 所在目录,拉起新版容器:
docker compose up -d
(注:不需要先执行 docker pull halohub/halo:2.24.2 命令,docker检测到本地缺少图纸中指定的镜像时,会自动触发下载拉取动作)
紧盯日志,观察启动情况:
docker logs -f halo
当日志里跳出 Halo has started successfully,我们的换血升级就大获成功了!