在宝塔面板上部署halo博客框架遇到的问题和解决方法

我把我的博客功能从WordPress框架变成了Halo框架,我在宝塔面板上面部署Hello框架时出现了非常非常多问题,本以为是常规操作,却踩了一连串坑,从端口映射失效到数据库连接失败,耗时2小时才彻底解决。以下是我遇到的问题和一些解决方法,希望能够帮助你。

主要问题

首先就是官方的部署文档当中他的博客加上MySQL数据库的形式并不是调用宝塔本地的MySQL数据库,而是又创建了一个docker容器拉取了MySQL的镜像,安装了一个docker版的MySQL数据库。这会导致一个非常大的问题,就是会无缘无故的多出四百兆到六百兆的内存占用,这对于一个服务器来说是很吃紧的,这一点在官方的文档当中是没有讲清楚的。所以为了使用调用宝塔面板当中本地的MySQL数据库。就要去使用。官方docker composed其它数据库,但是经过我的测试,它出现了以下问题,第一。官方的compost命令无法正常调用宝塔面板的MySQL数据库,核心原因是配置中使用了network_mode: "host"(主机网络模式),这会直接导致 Docker 端口映射失效,宝塔面板也无法识别和配置容器端口,Docker 的host主机网络模式有一个关键特性:容器会直接共享宿主机的网络命名空间,容器自身没有独立的网络端口

此时 Docker 的ports端口映射配置会完全失效(因为容器不需要端口映射,直接使用宿主机端口),宝塔面板的容器端口管理功能也无法识别到容器的任何端口,因此会出现 “端口无法映射、无法访问” 的现象。

同时,原配置中 MySQL 连接地址用了localhost,如果保留host模式,localhost会指向容器自身(而非宿主机),即使端口没问题,也会导致 Halo 无法连接本地 MySQL

核心坑点及解决方案

坑点1:官方的镜像源已经失效,而且非常古老

我也不明白为什么官方的镜像源是一个非常老的镜像源。如果你用它官方的部署教程就会出现镜像无法拉取的现象,即使你设置的标签是最新,但是它还是会拉取1.0版本时期的框架,这一直没人维护,解决方法就是在镜像的那个compose的命令里面修改镜像来源

    image: halohub/halo:2.22.13

坑点2:端口无法映射,宝塔容器列表无端口显示,无法访问

1. 问题现象

按照Halo官方文档编写Docker Compose配置,部署后Halo容器状态为“运行中”,但宝塔面板Docker容器列表的“端口”列为空,无法通过「公网IP:8090」访问,且无任何访问日志。

2. 错误日志(无明显报错,仅端口映射失效)

容器日志无异常,但宝塔容器端口栏显示“无”,执docker ps查看,容器端口列显示“8090/tcp”,无宿主机端口映射。

3. 原因解析

核心原因是官方配置中启用了「host网络模式」network_mode: "host"),该模式下容器会共享宿主机网络,Dockerports端口映射配置会完全失效,宝塔面板也无法识别容器端口,导致端口映射失败。

4. 解决方案(关键修改2处)

修改Docker Compose配置文件docker-compose.yml),删除host网络模式,添加标准端口映射,同时修正MySQL连接地址(避免后续连接失败):

version: "3"
services:
  halo:
    image: halohub/halo:2.22.13
    restart: on-failure:3
    # 关键1:删除 network_mode: "host" 配置(核心坑点)
    volumes:
      - ./halo2:/root/.halo2
    environment:
      - JVM_OPTS=-Xmx256m -Xms256m
    command:
      # 关键2:MySQL连接地址改为172.17.0.1(Docker宿主机内网默认地址)
      - --spring.r2dbc.url=r2dbc:pool:mysql://172.17.0.1:3306/halo
      - --spring.r2dbc.username=halo
      - --spring.r2dbc.password=你的MySQL密码
      - --spring.sql.init.platform=mysql
      - --halo.external-url=https://你的公网IP:8090/
      - --server.port=8090
    # 关键3:添加端口映射,宝塔可识别
    ports:
      - "8090:8090"

修改后,重新部署容器(先停止删除旧容器,再执行Compose部署),宝塔容器列表会显示「8090:8090」,端口映射生效。

坑点3:MySQL连接失败,日志提示「Connection unexpectedly closed」

1. 问题现象

端口映射成功后,Halo容器状态频繁“退出”,查看容器日志,出现连接意外关闭报错,无法正常启动。

2. 错误日志

2026-02-05T15:46:45.553+08:00  WARN 7 --- [tor-tcp-epoll-3] i.a.r.mysql.client.ReactorNettyClient    : Connection unexpectedly closed

3. 原因解析

该错误指向Halo的R2DBC MySQL客户端连接失败,本质是「宝塔本地MySQL拒绝了Docker容器网段的连接」,宝塔MySQL默认有3层拦截:

  • MySQL绑定地址127.0.0.1,仅允许本地访问,拒绝内网/外网连接;

  • 宝塔防火墙未放行Docker网段访问MySQL 3306端口;

  • Halo的MySQL账号仅授权localhost访问,未授权Docker容器网段。

4. 解决方案(按顺序操作,必做3步)

步骤1:修改MySQL绑定地址,允许所有网段访问
  1. 宝塔面板 → 软件商店 → 找到已安装的MySQL → 点击「设置」→「配置修改」;

  2. [mysqld]节点下bind-address,将其改bind-address = 0.0.0.0(若未找到,直接新增);

  3. 保存配置,点击「服务重启」,重启MySQL生效。

步骤2:宝塔防火墙放行Docker网段访问3306端口
  1. 宝塔面板 → 安全 → 防火墙 → 找到3306端口(无则添加规则);

  2. 放行IP填172.17.0.0/16(Docker容器专属内网网段,精准放行,更安全);

  3. 保存规则,重启防火墙。

步骤3:授权Halo MySQL账号访问权限
  1. 宝塔面板 → 数据库 → 找到Halo专属数据库(如halo)→ 点击「管理」,进入phpMyAdmin;

  2. 顶部「用户账户」→ 找到halo账号 → 点击「编辑权限」;

  3. 「更改主机」→ 选择「任意主机」%)→ 执行,确保账号允许所有IP访问;

  4. 兜底方案(宝塔操作无效时):宝塔终端执行以下命令: mysql -uroot -p(输入MySQL根密码) GRANT ALL PRIVILEGES ON halo.* TO 'halo'@'%' IDENTIFIED BY '你的halo账号密码'; FLUSH PRIVILEGES; exit;

坑点3:使用反向代理的时候出现连接超时并且断连的现象

这个问题很大原因是因为宝塔面板默认安装的Nginx太过于古老,建议直接删除或重装服务器,然后重新安装较新的版本,就能很大程度解决断流的问题。


在宝塔面板上部署halo博客框架遇到的问题和解决方法
https://blog.shany.cc/archives/bt-halo
作者
Shany Jin
更新于
2026年02月06日
许可协议