创建一个典型且需求明确的家庭实验室(HomeLab)场景
只要你拥有一台工控机/软路由/nas,比如我的就是(极空间 NAS + OpenWrt 软路由)和明确的目标(建站、外网访问)。
针对我的需求: GitHub 高星、中文 UI界面、功能全面、Docker 部署、同时由于没有公网 IPv4 需要内网穿透且支持自定义域名。
以下是详细教程:最佳组合方案及最优部署步骤。
核心推荐方案
1. 博客项目:Halo (2.x 版本)
- GitHub Stars: 32k+
- 项目地址: [halo-dev/halo: 强大易用的开源建站工具。](https://github.com/halo-dev/halo)
- 理由:
- 为写作而生: 不同于 WordPress 的笨重,Halo 是专为博客设计的,后台逻辑非常符合国人习惯。
- 现代化 UI: 默认主题就非常美观,且拥有丰富的主题/插件市场。
- 原生 Docker: 对 Docker 支持极佳,极空间部署非常轻松。
- Markdown 支持: 也就是通常所说的“所见即所得”,写作体验极佳。
2. 内网穿透方案:Cloudflare Tunnel (Zero Trust)
- 理由:
- 虽然你列出了 ngrok, ddnsto, frp 等,但在 没有公网 IP 且 不持有 VPS 的前提下,想要 免费 + 自定义域名 + 无限流量 + 配置简单 , Cloudflare Tunnel 是目前的 “降维打击” 级方案。
- 无需公网 IP: 它可以穿透任何内网(包括大内网 IPv4)。
- 无需配置路由器: 不需要动 OpenWrt 的防火墙,不需端口映射。
- 安全性: 隐藏了你家里的真实 IP。
- 对比你的列表: DDNSTO 绑定自定义域名通常需要付费; Frp/Nps 需要你额外购买 VPS; DDNS 必须依赖公网 IP(IPv6 是个变数)。因此 Cloudflare 是最优解。
最优部署步骤 (极空间 + OpenWrt 环境)
#第一阶段:准备工作(域名托管)
为了使用 Cloudflare Tunnel,你需要将你的域名 seguzhixue.top 的 DNS 解析托管给 Cloudflare(免费)。
1. 注册一个 账号:Cloudflare Dashboard | Manage Your Account
2. 在 Cloudflare 中点击 Add a site ,输入 Seguzhixue.top

3. 选择 Free 套餐。
4. Cloudflare 会给你两个 Nameservers(NS 记录)。

5. 去你购买域名的服务商(阿里云/腾讯云等),将域名的 DNS 修改为 Cloudflare 提供的这两个地址。( 也可以再cf上直接购买 )
6. 等待生效(通常几分钟到几小时)。
第二阶段:在极空间部署 Halo 博客
1. 打开极空间 Docker 管理器 -> 镜像仓库 。

2. 搜索 halohub/halo ,下载 latest 或 2.13 以上版本, 这里尤为注意不要选后面有后缀的 )。
请 不要 选择截图里显示的这些版本(带有 rc, alpha, cnb 后缀的)。
截图里的 rc 代表候选发布版, alpha 代表内部测试版,这些都不够稳定,可能会有 Bug。
目前HALO最新更新了2.22(无损更新教程如下:点此进入)
✅ 正确的选择策略:
请在列表中向下滚动,或者直接搜索,寻找以下两种标签之一:
1. 首选: latest
- 这是最推荐的,代表当前的 最新正式版 。
2. 备选:纯数字版本(不带任何英文后缀)
- 如果找不到 latest ,请往下翻,找到版本号最大且 后面没有横杠和字母 的版本。
- 例如: 2.21.0 或 2.20.x

- 解释:根据你截图里有 2.22.0-rc.1 *,说明 2.22 还没正式发布,你应该去找* ***2.21.x*** 这种纯数字版本。
总结: 选 latest 或者 2.21.x 这种纯数字的, 千万别选 带 alpha/c 的。

1. 创建容器 :
- 基本设置 :名称填 halo ,勾选“开机自启”。
- 文件夹路径(重要) :
- 在极空间文件管理中新建一个文件夹,例如 /Docker/halo 。
- 映射路径: /Docker/halo 映射到容器内的 /root/.halo2 (注意:Halo 2.0 路径变了,是.halo2)。

- 端口 :
- 容器端口 8090 映射到 本地端口 8090 或者你喜欢的其他端口)。


- 环境 (这一步可选,但建议配置):
- 点击添加一行,名称 HALO_EXTERNAL_URL ,值填 https://seguzhixue.top (这是告诉 Halo 它的外部地址)。
2. 启动容器 。
- 此时,我在局域网内访问 http://192.168.5.178:8081 (我的路由器的网关是 192.168.5.1,nas的IP在内网是192.168.5.178所以这么设置) 应该能看到 Halo 的初始化界面。 先不要急着初始化,搞定穿透再来。
第三阶段:配置 Cloudflare Tunnel (实现外网访问)
这一步我们直接在极空间的 Docker 中跑一个 Cloudflare 的守护进程,不需要动路由器。
1. 获取 Token :
2. 进入 Cloudflare 后台,左侧菜单点击 Zero Trst (能需要点一下开通,免费的)

- 在 Zero Trust 面板中,点击 Networks -> Tunnels

- 点击 Ceate a tunnel

- 选择 Cloudflared 模式。
- 起个名字(例如 nas-blog ),保存。
- 关键步骤 :在 "Install and run a connector" 页面,选择 Docker 。你会看到下面有一串代码 docker
run .. --token eJhbG iOi..

- **只复制 第三部分后面的:*--token **后面那一长串字符。
注意:**
==这里有一个在国内使用 Cloudflare Tunnel 时非常经典且常见的问题,直接这么联结,隧道过一会儿就断了(几分钟)
根本原因: Cloudflare Tunnel 默认使用 QUIC 协议 (基于 UDP)。在国内的网络环境下,运营商(ISP)和防火墙通常会对长时间连接的 UDP 流量进行 QOS 限速或直接阻断(RST),导致连接不稳定,运行几分钟后就会断开。
解决方案: 强制 Cloudflare Tunnel 使用 HTTP2 协议 (基于 TCP)。TCP 协议在国内网络环境下比 UDP 稳定得多,看起来更像是普通的网页浏览流量,不易被阻断。
请按照以下步骤在极空间 Docker 中进行修改:
第一步:修改启动命令(最核心的步骤)
你需要停止当前的 cloudflared 容器,并修改它的启动参数。
1. 打开极空间 Docker -> 容器 。
2. 找到你的 cf-tunnel (或你起的其他名字) 容器,点击 停止 。
3. 点击 编辑 。
4. 找到你填写 Token 的地方(通常在 “命令” 或者 “环境” 里的 Args / Command 栏)。
5. 在原有的命令中加入 --protocol http2 。
- 原命令可能长这样:
Bash
```
tunnel run --token eyJhbGciOiJ...
```
- 修改后的命令应该是:
Bash
```
tunnel run --protocol http2 --token eyJhbGciOiJ...
```
(注意: --protocol http2 和 --token 之间要有空格)
6. 保存 并 启动 容器。
3. 在极空间部署 Cloudflared :
- 镜像仓库搜索 cloudflare/cloudflare 并下载
- 创建容器 :


网络必须选择Host : ==因为必须把Cloudflare服务从docker容器暴露到极空间nas一个网段。==
==隧道才能找到你的服务器IP地址==


命令 (在“环境”或“命令”选项卡中):
- 极空间 Docker 界面可能需要在“命令”处填写。
- 在“启动命令”或“Args”里填入:

- 为什么要加---protocol http2--在中间: 这是一个在国内使用 Cloudflare Tunnel 时非常 经典且常见 的问题。
根本原因: Cloudflare Tunnel 默认使用 QUIC 协议 (基于 UDP)。在国内的网络环境下,运营商(ISP)和防火墙通常会对长时间连接的 UDP 流量进行 QOS 限速或直接阻断(RST),导致连接不稳定,运行几分钟后就会断开。
解决方案: 强制 Cloudflare Tunnel 使用 HTTP2 协议 (基于 TCP)。TCP 协议在国内网络环境下比 UDP 稳定得多,看起来更像是普通的网页浏览流量,不易被阻断。
如果你没加,被阻断了,请按照以下步骤在极空间 Docker 中进行修改:
1. 停止当前的 cloudflared 容器,并修改它的启动参数。打开极空间 Docker -> 容器 。
1. 找到你的 cf-tunnel (或你起的其他名字) 容器,点击 停止 ,点击 编辑 。
2. 找到你填写 Token 的地方(通常在 “命令” 或者 “环境” 里的 Args / Command 栏)。
3. 在原有的命令中加入 --protocol http2 。 (注意: --protocol http2 和 --token 之间要有空格
4. 启动容器。
5. 回到 Cloudflare 网页,你应该能看到 Connector 状态变为了 Connected (绿色)。
绑定域名 :
- 在 Cloudflare Tunnel 页面点击如图:建立应用路由

- Subdomain: 留空(如果你想直接用主域名)或者填 blog(二级域名) 。
- Domain: 选择 seguzhixue.top 。
- Service:
- Type: HTTP

- URL: 192.168.5.178:8081 (极间的局域网 IP和 服务端口)。

- 点击 Save Tunnel 。
第四阶段:最终验证
1. 拿出手机, 关闭 WiFi,使用 5G/4G 流量 。
2. 浏览器访问 https://seguzhixue.top 。
3. 你应该能直接看到 Halo 的初始化界面!
4. 按照提示设置管理员账号、博客标题,开始你的创作。
最后注意:检查 OpenWrt 的干扰
看到你第一张图里有 PassWall 和 OpenClash 。软路由上的代理软件有时候会“好心办坏事”,劫持了 Cloudflare Tunnel 的流量,导致连接不稳定。
1. 直连设置 :建议进入你的 OpenClash 或 PassWall 设置。
2. 访问控制 :将极空间 NAS 的 IP地址( 192.168.5.178 )设置为 “不走代理” (Direct / 直连) 或者 “绕过核心” 。
3. 原因 :Cloudflare Tunnel 本身就是为了穿透到外网,如果它再被软路由代理一次,会形成“套娃”,极大增加延迟和断连概率。让 NAS 能够直接连接 Cloudflare 的国内/周边节点通常更稳定。
---
### 为什么这个方案是“最优”的?
1. 避开了公网 IP 痛点 :你正在申请 IP,但这个方案 现在就能用 ,而且就算申请失败也没关系。
2. 符合你的“自定义域名”需求 :完全使用 seguzhixue.top ,并且自带 ==HTTPS 小绿锁(Cloudflare 自动颁发证书)== ,看起来非常专业。
3. 通过 Docker 隔离 :博客和穿透程序都跑在极空间 Docker 里,不污染你的 OpenWrt 软路由环境。
4. 无限流量 : ==Cloudflare Free Plan 不限制流量,只限制极其夸张的滥用,个人博客完全没问题。==
### 对速度要求不满的:一个备选提示 (关于你的 OpenWrt):
既然你正在申请公网 IP, 一旦电信/联通给了你公网 IPv4 ,或者你发现你有 公网 IPv6 (现在的宽带几乎都有),你可以切换到更高速的方案:
- 方案 :在 OpenWrt 上使用 AliDDNS (你有这个插件) + 端口映射 (Port Forwarding) 。
- 优势 :访问速度就是你家宽带的上行带宽,比 Cloudflare(在国内有时候会绕路)要快。
- 操作 :
1. OpenWrt 防火墙 -> 端口转发 -> 外部 8090 转发到 192.168.5.178:8090。
2. AliDDNS 绑定你的域名到公网 IP。
建议: 先按我上面的 Cloudflare Tunnel 方案部署,这能保证你立刻拥有一个可用的、带 HTTPS 的博客。等你公网 IP 下来后,如果觉得 Cloudflare 速度慢,再折腾 AliDDNS 也不迟。