内网部署 Halo 建站,用 ZeroNews 免费内网穿透安全发布到公网(无公网 IP 也能 HTTPS 访问)

Halo 部署在家庭 NAS 或内网服务器上,没有公网 IP、运营商封 80 端口,外网怎么访问?本文用 ZeroNews 内网穿透,把内网 Halo 站点安全映射为固定 HTTPS 公网地址:无需维护 Nginx / TLS 证书 / 域名,访客无需安装任何客户端。附 Docker 部署 Halo(PostgreSQL + Halo 社区版)、安装 ZeroNews 客户端、添加域名与 HTTPS 隧道的完整实操步骤与避坑建议。

前言

很多朋友都有这样的经历:好不容易用 Halo 把博客或官网搭好了,结果只有自己能打开,发给朋友看,对方却访问不了。卡点往往不是建站本身,而是这三个老问题:

  • 家里/公司没有公网 IP,路由器上全是内网地址;
  • 就算有公网 IP,运营商通常封禁了 80/443 端口
  • 租一台云服务器吧,又贵,还得自己折腾 Nginx、SSL 证书、域名解析。

其实,想让内网里的 Halo 被外网访问,核心思路就一句话:站点留在内网,用一个安全隧道把流量"送"出去 。本文介绍的就是这套方案------用 ZeroNews 内网穿透 ,把部署在内网(NAS / 小主机 / 内网服务器)的 Halo 映射成一个固定的 HTTPS 公网地址

  • 不需要公网 IP,不碰 80/443 端口;
  • 不用自己维护 Nginx、TLS 证书、域名;
  • 访客浏览器直接访问,不用装任何客户端软件
  • 站点、主题、附件、数据库全部留在内网,数据不出门。

下面按完整流程走一遍:Docker 部署 Halo → 安装 ZeroNews 客户端 → 添加域名与 HTTPS 隧道 → 验证公网访问 → 更换主题美化站点。


一、Halo 是什么

Halo 是一款强大易用的开源建站工具。个人博客、知识库、企业官网,再到在线商城,都可以落在同一套系统里;主题、插件、附件和评论,也都跑在你自己的机器上------家用 NAS、工作室小主机、公司内网服务器都是很常见的部署环境。

Halo 的安装并不难,难的是**"让外面的人打得开"**。想把内网里的 Halo 博客或官网给别人访问时,卡点多半就是:没有公网 IP、运营商封 80 端口。

二、让内网 Halo 被外网访问:两种方案对比

要实现内网中的 Halo 给外部用户访问,不外乎两种方案:

|--------|---------------------|--------------------|--------------|--------------------------|
| 方案 | 站点部署位置 | Nginx / TLS / 域名维护 | 主要成本 | 适用场景 |
| 公有云方式 | 整站部署到公有云 SaaS / 云主机 | 需要自己维护 | 云主机费用较高 | 预算充足、追求极致稳定 |
| 内网穿透方式 | Halo 仍部署在内网 | 不用维护,开箱即用 | 低(免费额度或按需付费) | 家庭 NAS、工作室小主机、内网服务器、个人站点 |

公有云方式:把整站丢进公有云部署,功能上没问题,但你需要维护 nginx/tls/域名,同时面临云主机较高的成本问题。

内网穿透方式:Halo 还是部署在内网,数据留在自己手里,同时不用维护 nginx/tls/域名,简单省事。本文采用的就是这个方案。

三、ZeroNews 内网穿透是什么

ZeroNews 内网穿透(零讯)是一个企业级的安全内网穿透与反向代理平台 。简单几分钟,就可以实现企业/个人在无固定公网 IP 的网络环境下,将内网中的 Halo 快速提供为安全稳定的固定 HTTPS 端点暴露到公网。

它的几个关键特点:

  • 用户侧零安装:用户端只要有浏览器就可以访问,无需安装任何客户端软件;
  • 免运维:不用再维护 nginx、TLS 证书、域名;
  • 精确暴露:支持精确发布一个站点或站点下的特定路由,而不是把整机端口裸奔到公网;
  • 安全可控:平台支持 IP 白名单、Basic 认证、路由白名单等访问策略。

整体架构如下:Halo 站点与 PostgreSQL 数据库留在企业内网/NAS,ZeroNews Client 以 HTTPS 出站连接云端平台,访客、编辑、合作方都通过 HTTPS 访问公网域名。

!Halo + ZeroNews 方案架构图(https://aka.doubaocdn.com/s/SLCZXUt98L)


四、第一步:Docker 部署 Halo(PostgreSQL + Halo 社区版)

前置条件:一台能跑 Docker 的内网机器(Linux 服务器 / NAS 均可),已安装 Docker 与 docker compose 插件。

4.1 准备目录与 docker-compose.yaml 部署文件

先创建一个工作目录,并在其中添加 docker-compose.yaml 文件:

复制代码
mkdir -p /opt/halo && cd /opt/halo

docker-compose.yaml 内容如下(PostgreSQL + Halo 社区版,基于 Halo 官方推荐的 compose 配置;请按需修改数据库密码与数据目录):

复制代码
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:

4.2 启动 Halo 容器

在 docker-compose.yaml 所在目录执行:

复制代码
docker compose up -d

等容器启动完成后,在内网 浏览器中输入服务器 IP 加 8090 端口(例如 http://192.168.1.100:8090/),打开 Halo 平台:
按向导创建站点与管理员, 然后登录即可。

到这里,Halo 已经在内网跑起来了,下一步就是把它"发布"到公网。


五、第二步:安装 ZeroNews 客户端

5.1 在线安装

登录 ZeroNews 控制台,在"快速开始"页面中,选择 Linux,复制 Linux 的在线安装命令,回到服务器终端执行。

复制代码
curl -SLk https://download.zeronews.cc/linux/zeronews-install.sh | sudo sh -s install v3bY3nTVB3K7Yaja

安装完成后,终端里应能直接使用 zeronews 命令,即表示客户端已安装成功。

5.2 以系统服务方式后台运行

为了避免终端关闭导致隧道中断,建议按控制台指引把 ZeroNews 客户端注册为系统服务(如 systemd),实现后台常驻与开机自启。

复制代码
zeronews service start

5.3 确认客户端在线

回到 ZeroNews 控制台的"关联客户端"页面,确认刚才安装的客户端状态为在线,并记下设备名称(后面添加隧道时要绑定它):


六、第三步:添加域名与 HTTPS 隧道

6.1 添加域名

进入控制台的"自定义域名"页面,点击"添加域名",添加一个子域,前缀可以用 arpblog 这类好记的名字:

添加成功后,该域名会显示为"已激活"。

6.2 添加隧道

进入"隧道管理",新建一条映射(添加隧道),参数如下:

|-------|-----------------------|
| 配置项 | 填写值 |
| 隧道模式 | 标准隧道 |
| 隧道特性 | Raw(默认透传) |
| 隧道协议 | HTTPS |
| 带宽 | 3 Mbps(按需调整) |
| 公网域名 | 选择前面添加好的域名(如 arpblog) |
| 绑定设备 | 前面安装好的客户端 |
| 内网 IP | 127.0.0.1 |
| 内网端口 | 8090 |

HTTPS 隧道创建成功后,你会在隧道列表里拿到一个固定的公网地址 ,例如 https://arpblog.hn.takin.cc

6.3 验证公网访问

在浏览器中打开这个公网域名地址,Halo 博客首页正常访问:

到这里,内网部署的 Halo 已经通过 HTTPS 安全发布到公网,访客无需安装任何客户端,直接浏览器访问即可。


七、第四步:更换主题,让站点更好看

站点能访问之后,还可以进一步美化:

  1. 打开 Halo 控制台,进入"应用市场",筛选"主题",浏览并安装喜欢的主题(有很多免费主题可选):

通过 ZeroNews 把内网 Halo 映射成 HTTPS 公网地址后:

  • 站点、主题、附件和数据库仍留在内网,数据在自己手里;
  • 访客和编辑用浏览器就能访问,无需安装任何客户端;
  • 不用自己维护 Nginx 和证书,也不必将整机端口裸开到公网。

一句话总结这套组合:Halo 负责建站能力,ZeroNews 负责安全暴露。几分钟即可完成"内网部署、公网可达",对家庭 NAS、工作室小主机和个人站点来说,是性价比很高的发布方式。


参考链接

相关推荐
承渊政道10 小时前
星空组网使用指南:设备接入、分组隔离与 NAS 文件访问
nas·星空组网
九皇叔叔14 小时前
K8S 资源菜单
docker·容器·kubernetes·k8s
wdfk_prog15 小时前
ROS教程08:从 TransportTCP::connect() 追到 TCPROS Connection Header、序列化与 Socket 数据传输
运维·缓存·docker·容器·ros
zoutao9816 小时前
Gitea Actions 自定义 Runner 镜像与自动化部署实战
ci/cd·docker·gitea
szephyr17 小时前
HTTPS 证书申请与自动续期:acme.sh + Let‘s Encrypt 完整记录
nginx·https·acme.sh·证书续期
小马同学-18 小时前
nerdctl实战:Docker风格的Containerd操作利器
docker·容器·containerd
九皇叔叔18 小时前
Kubernetes 命令式对象配置详解:使用 YAML 管理 Kubernetes 资源
docker·容器·k8s
CVer儿19 小时前
docker内llama.cpp和TRT-LLM win11本机部署qwen3.8
docker
萤火夜19 小时前
Docker(四) Docker介绍
docker·容器