Halo 留在内网,用 ZeroNews 安全发布到公网:无需公网 IP,不用维护 Nginx 和证书
-
- 前言
- 一、准备目录与 docker-compose.yaml 部署文件
- 启动 Halo 容器
- 二、安装 ZeroNews 客户端
- 三、添加域名与 HTTPS 隧道
- 小结
前言
Halo 是一款强大易用的开源建站工具,个人博客、知识库、企业官网甚至在线商城都能一套系统搞定,数据和插件也都跑在自己机器上,家用 NAS、工作室小主机、公司内网服务器都很常见。
可 “装好” 并不难,难的是 “让外面的人打得开”。想把内网里的 Halo 给人访问时,卡点多半是没有公网 IP,或者运营商封锁了 80 端口。要实现外部访问,不外乎两种方案:一是把整站搬到公有云 SaaS 上,但需要自己维护 Nginx、TLS、域名,还要承担不低的云主机成本;二是内网穿透,Halo 依然部署在内网,不用维护 Nginx/TLS/ 域名,简单省事。
本文走的就是第二条路:以 Halo 社区版 + PostgreSQL 为例,用 ZeroNews 将内网 Halo 安全、稳定地发布到公网,提供固定 HTTPS 地址,全程不用暴露整机端口,也不用碰证书和域名配置。整个流程几分钟即可完成,希望对你有所帮助。
一、准备目录与 docker-compose.yaml 部署文件
mkdir -p /opt/halo && cd /opt/halo
添加 docker-compose.yaml 文件, 文件内容如下:
services:
halo:
image: registry.fit2cloud.com/halo/halo:2.25
restart: on-failure:3
depends_on:
halodb:
condition: service_healthy
networks:
– halo_network
volumes:
– ./halo2:/root/.halo2
ports:
– "8090:8090"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"]
interval: 30s
timeout: 5s
retries: 5
start_period: 30s
environment:
– JVM_OPTS=-Xmx256m -Xms256m
command:
– –spring.r2dbc.url=r2dbc:pool:postgresql://halodb/halo
– –spring.r2dbc.username=halo
– –spring.r2dbc.password=openpostgresql
– –spring.sql.init.platform=postgresql
– –halo.external-url=http://0.0.0.0:8090/
halodb:
image: postgres:15.4
restart: on-failure:3
networks:
– halo_network
volumes:
– ./db:/var/lib/postgresql/data
healthcheck:
test: ["CMD", "pg_isready"]
interval: 10s
timeout: 5s
retries: 5
environment:
– POSTGRES_PASSWORD=openpostgresql
– POSTGRES_USER=halo
– POSTGRES_DB=halo
– PGUSER=halo
networks:
halo_network:
启动 Halo 容器
docker compose up -d
浏览器中,输入内网服务器的IP加8090 端口打开 halo 平台:
http://127.0.0.1:8090/console
按向导创建站点与管理员, 然后登录即可。

二、安装 ZeroNews 客户端
登陆 ZeroNews 控制台,在快速开始页面中,选择 Linux, 复制 Linux 的在线安装命令:
curl -SLk https://download.zeronews.cc/linux/zeronews-install.sh | sudo sh -s install v3bY3nTVB3K7Yaja
装完后终端里应有 zeronews 命令。
在以系统服务方式后天启动 ZeroNews 客户端
zeronews service start
在用户控制台中确认客户端是否已经在线。 
三、添加域名与 HTTPS 隧道
添加域名 在控制台进入域名,添加子域,前缀可用 arpblog 这类好记的名字, 
添加隧道 进入隧道管理新建一条映射: ● 隧道参数:协议:HTTPS ●内网 IP:127.0.0.1 ●内网端口:8090 ●绑定设备:前面安装好的客户端 ●公网域名:选择前面添加好的域名 arpblog ●带宽:带宽分配 3M

HTTPS 隧道创建成功后,你会拿到类似下面的公网地址:
https://arpblog.hn.takin.cc
在浏览器中打开该域名地址,blog 首页正常访问 
打开 halo 的控制台,我们可以在应用市场中下载 halo 的主题UI 
可以在 主题的主题管理下面,更换下载好的主题

小结
至此,内网中的 Halo 已通过 ZeroNews 成功映射为固定 HTTPS 公网地址:站点、主题、附件和数据库全部留在内网,访客和编辑者用浏览器就能访问,无需自己维护 Nginx 和证书,也不必把整机端口裸开到公网。
整个流程只需三步:Docker 部署 Halo → 安装 ZeroNews 客户端 → 添加域名与 HTTPS 隧道。相比公有云方案,既省下了云主机成本,又免去了域名、证书、反代的日常运维;相比传统端口映射,还多了按站点 / 路由精确发布的控制粒度,安全性和灵活性都更好。
如果你也受困于 “没有公网 IP”" 运营商封 80",不妨试试这个方案,把更多内网服务安全、稳定地发布到公网。



