从阿里云到火山引擎:Rocky Linux 8.10 下 Halo 博客完整迁移实战

在近期的一次运维实践中,我完成了一个基于 Docker 的 Halo 博客跨云迁移:

  • 原环境:阿里云

  • 目标环境:火山引擎

  • 操作系统:Rocky Linux

整个迁移过程远不止“拷贝数据”这么简单,而是涉及:

云厂商网络差异 + Docker 镜像生态 + 运维稳定性问题

过程中踩了不少典型坑(镜像拉取失败、Docker Hub 限流、换源失败等),最终整理出一套稳定可复用方案,记录如下。


一、迁移核心思路(重点)

在开始之前,先讲最关键的一点:

Halo Docker 部署的本质 = /opt 目录

该目录包含:

  • 数据库数据

  • 上传附件

  • 配置文件

  • Docker Compose 配置

结论:

Halo 迁移 ≈ 直接迁移 /opt 目录


二、源服务器(阿里云)数据备份

打包 Halo 数据

cd /
tar -zcvf opt_backup.tar.gz /opt

验证:

ls -lh /opt_backup.tar.gz

下载到本地

推荐两种方式:

✔️ 图形方式(推荐)

  • 使用 Xshell + XFTP 直接拖拽下载

✔️ 命令行方式

yum install -y lrzsz
sz /opt_backup.tar.gz

三、新服务器环境搭建(Rocky Linux 8.10)


安装 Docker

curl -fsSL https://get.docker.com | bash
systemctl enable docker
systemctl start docker

验证:

docker -v

安装 Docker Compose(推荐固定版本)

curl -L https://github.com/docker/compose/releases/download/v2.29.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

验证:

docker-compose --version

安装 Nginx

dnf install -y nginx
systemctl enable nginx
systemctl start nginx

放行端口:

firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload

配置反向代理

server {
    listen 80;
    server_name yourdomain.com;

    location / {
        proxy_pass http://127.0.0.1:8090;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        client_max_body_size 100M;
    }
}

生效:

nginx -t
systemctl reload nginx

四、数据恢复与服务启动


上传备份文件

rz

解压恢复

tar -zxvf opt_backup.tar.gz -C /

启动 Halo

cd /opt/halo
docker-compose up -d

五、关键问题排查(实战重点)


问题 1:Compose version 警告

version: "3"

直接删除

原因:

  • Docker Compose V2 已废弃该字段


问题 2:Docker 镜像拉取失败

错误示例:

net/http: request canceled

本质:网络访问不稳定


解决方案:配置国内镜像源

cat > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com"
  ]
}
EOF

systemctl daemon-reexec
systemctl restart docker

问题 3:Docker Hub 限流

错误:

toomanyrequests

原因:

  • 公网 IP 共享导致触发限流


解决方案

docker system prune -a -f
docker-compose up -d

问题 4:chsrc 换源失败

错误:

sed: unknown option to 's'

结论:

❌ 不建议使用 chsrc
✔️ 手动配置最稳定


六、验证迁移结果

docker ps

确保:

  • halo 容器运行

  • 数据库容器运行

访问方式:


七、迁移收尾工作


DNS 切换

将域名解析到新服务器 IP


数据完整性检查

重点检查:

  • 文章

  • 评论

  • 图片附件


HTTPS 配置

推荐使用:

👉 Let's Encrypt


开机自启

systemctl enable docker
systemctl enable nginx

八、经验总结(核心价值)

本次迁移的本质问题,不是 Halo,而是:

云环境差异 + Docker 网络生态问题


关键结论

  • Docker 应用迁移 ≈ 数据目录迁移

  • 国内云服务器必须配置镜像加速

  • Docker Hub 限流是常态问题

  • 工具(如 chsrc)不一定可靠

  • 跨云迁移一定要预留排错时间


九、写在最后

整个迁移耗时约 1~2 小时(不含数据传输),属于中等复杂度运维任务。

如果你也在做类似迁移,这篇文章可以帮你少踩 80% 的坑。


AD域环境下网络盘不稳定?一套企业级标准方案彻底解决 2026-03-19