一、 核心架构设计
为了对抗“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。
三、 避坑指南(极客总结)
-
关于 IP 填写: 在 Halo 的 R2DBC 连接串中,不要使用
127.0.0.1,因为它会指向容器内部,导致找不到宿主机上的数据库。 -
关于端口封锁: 务必确认路由器和 NAS 系统的防火墙均已放行
8888端口,否则 IPv6 域名在外网无法穿透。 -
关于字符集: 必须使用
utf8mb4,否则 OpenClaw 或自动化脚本推送带表情或特殊符号的日志时会直接报错。
