一、 核心架构设计
为了对抗“AI 幻觉”和“误删风险”,我们采用了
物理脱钩的方案:
-
网络层: 公网 IPv6 + Lucky 反向代理(避开运营商 80 端口封锁)。
-
存储层: NAS 本地路径挂载(确保数据物理可控)。
-
数据库层: 独立 MySQL 容器(数据与应用逻辑解耦)。
-
应用层: Halo 2.23.0-beta.1(追求最新特性的极客选择)。
二、 部署全流程回顾
1. 地基搭建:MySQL 专属数据库初始化
由于 Halo 默认的 H2 数据库不便于大规模日志管理,我们通过命令行直接接管了 NAS 里的 MySQL。
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 或自动化脚本推送带表情或特殊符号的日志时会直接报错。