本文将手把手教你在家庭服务器(以群晖 NAS 为例)上搭建属于自己的个人博客。无需公网 IP,无需动路由配置,全程零代码基础友好。
注册一个域名
访问一个网站,本质上是去网络世界拜访一位朋友。
IP 地址:好比朋友家的 GPS 坐标(如
116.40, 39.90),机器能懂,但人类记不住。域名:好比通讯录里的名字(如
yourblog.com),简单好记,通过解析服务自动指向背后的坐标。
我推荐在 Cloudflare 购买域名。理由很简单:良心。他们的价格基本就是批发成本价,而且首年与续费同价。不像某些平台首年 $1 诱惑你,续费时突然涨到 $20 割韭菜。
另一个原因是本文使用的一项关键免费服务来自Cloudflare,在这里注册会省事不少。为了下文叙述方便,我们假设你注册了一个名为yourblog.com的域名。

公网访问的方案
域名买好后,如何让外网用户访问你放在家里的 NAS 呢?传统方案使用公网IP地址+域名解析,但今天看来有很多问题。
❌ 传统方案的痛点
公网 IPv4:国内家庭宽带几乎不提供。IPv4 地址资源近乎枯竭,除非你办理昂贵的企业专线,否则很难拿到。
公网 IPv6:虽然 IPv6 地址多到能给地球上每一粒沙子编号,但目前连通性并不完美。受限于路由配置或防火墙策略,可能有 30%-50% 的用户因网络环境不支持 IPv6 而无法访问你的博客。
✅ 终极方案:Cloudflare Tunnel
这是 Cloudflare 提供的一项反向代理服务(Zero Trust)。简单来说,就是让 Cloudflare 帮你打通一条从你家 NAS 到互联网的专属隧道。
它比公网IP方案强在哪?
而且非常重要的一点是,这项服务是免费的!这曾经是一项收费服务(以前叫 Argo Tunnel),但后来 Cloudflare 把它的基础功能下放到了 Zero Trust 免费套餐 里。对于个人用户挂个博客或者远程管理NAS后台,免费版完全够用,甚至可以说是“性能过剩”。
Zero Trust 免费套餐的唯一雷区是:通过 Cloudflare Tunnel 搭建大流量的流媒体服务(比如在群晖上搭建 Plex、Emby、Jellyfin 并且通过隧道在公网看 4K 电影)。Cloudflare 的免费 CDN 主要是为了加速网页(HTML/CSS/JS/图片)。如果你用来传输大量的视频流、大文件下载(比如做下载站),会被视为滥用。
在本地部署Cloudflare Tunnel服务
获取隧道令牌/Token
当你的服务器跟Cloudflare联络时,双方必须对上暗号,才能互相确定“你哪个部分的?”,这个暗号就是令牌/Token。
登录 Cloudflare 面板,在左侧菜单点击 Zero Trust。如果是首次使用,根据提示点击免费订阅(费用为 $0)。
进入 Networks网络 -> Tunnels连接器,点击 Create a tunnel创建隧道。
Connector隧道类型 选择 Cloudflared,给隧道取个名。
在 Install and run a connector安装并运行连接器 页面,操作系统选择 Docker。
在下方的代码框中,找到 tunnel run --token 后面的那串长字符(Token),复制并保存好。

在群晖上运行Tunnel容器
打开群晖 Container Manager (或 Docker) 套件。
点击“注册表/镜像仓库”,搜索 cloudflared。选择 cloudflare/cloudflared,标签选 latest,点击下载。由于国内网络环境,Docker Hub 可能拉取失败。如果下载不动,请配置国内 Docker 镜像源,或使用代理环境。

选中下载好的镜像,点击“运行”开始创建容器。
常规设置:
容器名称:填写
cloudflared-tunnel。自动重启:务必勾选 “启用自动重新启动”,确保 NAS 重启后隧道自动重连。

高级设置(关键点):
网络:选择
host。这步非常重要,否则 Cloudflare 无法转发请求到 NAS 的其他端口。执行命令:在“命令”框中填写:
tunnel run --token 你的那串长token。

完成向导并启动容器。回到 Cloudflare 网页,如果看到隧道状态变为 Healthy正常,恭喜你,隧道已打通!

配置域名转发
现在你家和Cloudflare之间的隧道已经打通,现在我们需要告诉 Cloudflare:当有人访问 yourblog.com 时,请将客人请到客厅。也就是把请求转发到群晖的 8090 端口——我们接下来要部署的博客端口。
在 Tunnel连接器页面点击刚才创建的隧道,选择 Configure配置。
进入 Public Hostname已发布应用程序路由 标签,点击 Add a public hostname添加已发布应用程序路由。

然后填写以下信息

Domain域:选择你的域名。
Service服务:
Type类型:
HTTPURL:
localhost:8090(这里的 8090 是接下来我们要部署的博客端口)。
点击 Save hostname保存。
部署博客服务,以Halo为例
Halo 是目前国内口碑极佳的开源博客系统,颜值高、生态好、上手即用。
准备文件夹:打开群晖 File Station,在 docker 目录下新建文件夹 halo,然后在halo文件夹下再创建halo2和db文件夹,其实脚本会自己创建,但是有时候会因为权限问题报错。
创建项目:
打开 Container Manager -> 项目 (Project) -> 新增。
项目名称:
halo_blog。路径:选择刚才创建的
/docker/halo。来源:选择“创建 docker-compose.yml”。
version: "3"
services:
halo:
image: registry.fit2cloud.com/halo/halo:2.21 #默认使用halo团队在维护的国内镜像源以方便拉取
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 参数,默认为 -Xmx256m -Xms256m,可以根据实际情况做调整,置空表示不添加 JVM 参数
- JVM_OPTS=-Xmx256m -Xms256m
command:
- --spring.r2dbc.url=r2dbc:pool:postgresql://halodb/halo
- --spring.r2dbc.username=halo
- --spring.r2dbc.password=你的数据库强密码 #数据库密码,请保证与下方一致
- --spring.sql.init.platform=postgresql
- --halo.external-url=https://yourblog.com/ #外部访问地址,填入你在Cloudflare注册的域名
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=你的数据库强密码 #数据库密码,请保证与上方一致
- POSTGRES_USER=halo
- POSTGRES_DB=halo
- PGUSER=halo
networks:
halo_network:⚠️ 修改说明:
你的数据库强密码:请务必修改为复杂的密码(代码中有两处,必须保持一致)。https://yourblog.com:修改为你实际绑定的域名(注意是https开头)。
点击“下一步”完成创建。群晖会自动拉取镜像并启动。由于 Java 应用启动稍慢,初始化可能需要 1-2 分钟。
打开Halo管理面板
现在,断开手机 WiFi,使用 4G/5G 网络访问你配置的域名: https://yourblog.com
如果一切顺利,你将看到 Halo 精美的初始化引导界面。恭喜你,你已经成功拥有了一个属于自己的、运行在家里、全网可访问的独立博客!
如果想进入控制台,输入以下域名:
公网访问:
https://yourblog.com/console/dashboard局域网访问:
http://你的群晖局域网IP:8090/console/dashboard
接下来,你可以在后台挑选喜欢的主题,开始记录生活与技术。数据完全掌握在自己手中,这种踏实感,是任何第三方平台都给不了的!