2
0

Halo 2.x 无损跨版本升级

2026-05-25
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.ymlenvironment 环境变量中,必须同时对 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,我们的换血升级就大获成功了!

评论