Halo部署实录

一、 核心架构设计

为了对抗“AI 幻觉”和“误删风险”,我们采用了物理脱钩的方案:

  • 网络层: 公网 IPv6 + Lucky 反向代理(避开运营商 80 端口封锁)。

  • 存储层: NAS 本地路径挂载(确保数据物理可控)。

  • 数据库层: 独立 MySQL 容器(数据与应用逻辑解耦)。

  • 应用层: Halo 2.23.0-beta.1(追求最新特性的极客选择)。


二、 部署全流程回顾

1. 地基搭建:MySQL 专属数据库初始化

由于 Halo 默认的 H2 数据库不便于大规模日志管理,我们通过命令行直接接管了 NAS 里的 MySQL。

  • 指令:

    Bash

     
    # 进入 MySQL 容器
    docker exec -it <mysql_container_name> mysql -u root -p
    # 创建支持 Emoji 的专属数据库
    CREATE DATABASE halo CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    

2. 核心部署:Halo 容器装配

在 Docker 管理器中拉取 halohub/halo:2.23.0-beta.1,并配置以下关键点:

  • 物理挂载: 本地路径 /docker/halo2 ➜ 容器路径 /root/.halo2

  • 环境变量 (与 MySQL 握手):

    | 变量名 | 推荐值 | 说明 |

    | :--- | :--- | :--- |

    | SPRING_R2DBC_URL | r2dbc:pool:mysql://[NAS_IP]:[PORT]/halo | 必须填局域网真实 IP |

    | SPRING_R2DBC_USERNAME | root | 数据库用户名 |

    | SPRING_R2DBC_PASSWORD | ******** | 数据库密码 |

    | SPRING_SQL_INIT_PLATFORM | mysql | 显式声明数据库类型 |

3. 隧道打通:Lucky 反向代理设置

针对国内移动宽带环境,利用 Lucky 绕过 80 端口限制。

  • 监听端口: 8888 (或其他高位端口)。

  • 后端地址: http://[NAS_IP]:8090 (指向 Halo 容器映射出的内网端口)。

  • 外网访问地址: http://home.jovz.cn:8888


三、 避坑指南(极客总结)

  1. 关于 IP 填写: 在 Halo 的 R2DBC 连接串中,不要使用 127.0.0.1,因为它会指向容器内部,导致找不到宿主机上的数据库。

  2. 关于端口封锁: 务必确认路由器和 NAS 系统的防火墙均已放行 8888 端口,否则 IPv6 域名在外网无法穿透。

  3. 关于字符集: 必须使用 utf8mb4,否则 OpenClaw 或自动化脚本推送带表情或特殊符号的日志时会直接报错。