Halo Docker 迁移方法
以下是针对使用Docker部署的Halo博客(假设Halo 2.x版本,数据库为默认H2或外部MySQL)迁移到新服务器的详细方案。迁移目标是实现全站数据迁移,包括文章、评论、附件、主题、插件、配置和数据库。方案基于Halo官方文档和社区经验,确保数据完整性。适用于CentOS或其他Linux服务器。
重要前提和注意事项
- Halo版本确认:检查旧服务器Halo版本(后台 > 系统 > 关于,或查看~/.halo2/application.yaml)。新服务器使用相同版本的Docker镜像(例如halo.run/release/halo-2.x.x.jar,但Docker镜像通常为halohub/halo或ruibaby/halo)。
- 数据库类型 :默认H2(数据在/.halo2/db),或外部MySQL(需单独备份)。查看/.halo2/application.yaml确认。
- Docker环境:旧/新服务器需安装Docker和Docker Compose(可选)。迁移核心是持久化卷(-v挂载的目录,如~/.halo2)。
- 备份前停止容器 :
docker stop halo以避免数据不一致。 - 工具准备:scp/rsync用于传输;如果MySQL,需mysqldump。
- 风险:传输大文件时使用rsync增量;迁移后验证数据(如文章数量、附件URL)。如果域名变化,需更新数据库中的URL。
- 假设:新服务器干净,root权限;使用H2数据库。如果Halo 1.x,目录为~/.halo,步骤类似。
- 时间估计:30-60分钟,取决于数据大小。
- 最佳实践:先备份整个~/.halo2目录;测试迁移后更新DNS指向新IP。
迁移方案概述
- 备份旧服务器数据(文件和数据库)。
- 在新服务器安装Docker环境。
- 传输和恢复数据。
- 启动容器并验证。
- 可选:配置Nginx/SSL和数据库URL更新。
Halo官方推荐使用后台备份工具,但对于Docker,优先备份挂载卷(~/.halo2)。如果数据大,可直接打包整个卷目录。
详细操作步骤
步骤1: 备份旧服务器数据
在旧服务器上执行,确保容器停止。
-
停止Docker容器:
docker stop halo docker rm halo # 如果需要移除旧容器 -
使用Halo后台备份(推荐,包含配置/附件/主题/插件):
- 启动容器临时访问后台:
docker start halo。 - 登录Halo后台(IP:8090/admin)。
- 导航到 系统 > 备份。
- 点击"备份站点",生成ZIP文件。
- 下载ZIP到服务器(如
/tmp/halo-backup.zip)。 - 停止容器再次。
- 启动容器临时访问后台:
-
手动备份挂载卷(~/.halo2,整个数据目录):
-
备份整个目录(包括db、indices、keys、logs、plugins、themes、upload等)。
-
命令:
cd ~ tar -czvf /tmp/halo-volume-backup.tar.gz .halo2 -
这包含H2数据库。如果使用H2,无需额外备份数据库。
-
-
备份外部数据库(如果使用MySQL):
-
确认数据库名(通常
halo,查看application.yaml)。 -
导出:
mysqldump -u root -p halo > /tmp/halo.sql(替换用户/密码)。
-
-
备份Docker Compose文件(如果使用):
- 复制
docker-compose.yml到/tmp/。
- 复制
-
验证备份:检查文件大小,确保完整。
步骤2: 在新服务器安装环境
-
安装Docker:
sudo yum update -y sudo yum install -y yum-utils device-mapper-persistent-data lvm2 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo yum install -y docker-ce docker-ce-cli containerd.io sudo systemctl start docker && sudo systemctl enable docker -
拉取Halo镜像(使用与旧服务器相同版本):
docker pull halohub/halo:2.x.x # 替换为实际版本,如2.12.2或使用ruibaby/halo如果旧服务器是这个。
-
安装数据库(如果用外部MySQL):
sudo yum install -y mariadb-server sudo systemctl start mariadb && sudo systemctl enable mariadb sudo mysql_secure_installation-
创建数据库:
mysql -u root -p CREATE DATABASE halo CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; GRANT ALL ON halo.* TO 'halo_user'@'localhost' IDENTIFIED BY 'password'; FLUSH PRIVILEGES; EXIT;
-
步骤3: 传输和恢复数据
-
传输备份文件:
-
从旧服务器执行(推荐rsync):
rsync -avz -e ssh /tmp/halo-volume-backup.tar.gz root@new_ip:/tmp/ rsync -avz -e ssh /tmp/halo.sql root@new_ip:/tmp/ # 如果有(替换new_ip)。
-
-
恢复卷数据:
-
在新服务器:
mkdir -p ~/.halo2 tar -xzvf /tmp/halo-volume-backup.tar.gz -C ~- 或如果用后台ZIP:解压到~/.halo2。
-
调整权限:
chown -R root:root ~/.halo2 chmod -R 755 ~/.halo2
-
-
恢复数据库(如果MySQL):
mysql -u root -p halo < /tmp/halo.sql- 更新~/.halo2/application.yaml中的数据库连接(如果主机变)。
步骤4: 启动并验证
-
运行Docker容器:
-
简单运行:
docker run -d --name halo -p 8090:8090 -v ~/.halo2:/root/.halo2 --restart=always halohub/halo:2.x.x-
如果用Docker Compose,创建docker-compose.yml:
version: '3' services: halo: image: halohub/halo:2.x.x container_name: halo restart: always volumes: - ~/.halo2:/root/.halo2 ports: - 8090:8090然后:
docker-compose up -d。
-
-
-
验证数据:
- 访问新IP:8090/admin,检查内容。
- 查看日志:
docker logs halo。 - 如果错误,检查卷挂载和权限。
-
更新数据库URL(如果域名变化):
- 对于H2:使用h2-console访问数据库,运行SQL替换URL(例如REPLACE函数更新POSTS表的ORIGINAL_CONTENT等列)。
- 对于MySQL:直接在mysql中运行类似SQL。
步骤5: 可选优化和清理
- 配置Nginx反向代理:安装Nginx,配置server块代理到8090端口。
- SSL:使用certbot。
- 高可用:设置MySQL主从复制(主服务器配置log_bin,从服务器CHANGE MASTER)。
- 镜像打包迁移(可选,如果频繁迁移):构建自定义Dockerfile包含备份,push到仓库,然后在新服务器pull运行。
- 清理:迁移成功后删除旧备份。
如果使用Halo 1.x,替换目录为~/.halo,镜像为ruibaby/halo等。遇到问题,参考Halo社区(bbs.halo.run)或官方文档。如果数据库复杂,优先使用外部MySQL以便迁移。