利用群晖 NAS + Cloudflare Tunnel 零成本搭建高颜值个人博客

本文将手把手教你在家庭服务器(以群晖 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方案强在哪?

比较维度

公网IP直连 / DDNS

Cloudflare Tunnel (推荐)

公网 IP

必须有(IPv4或IPv6)

不需要,能上网就行

端口限制

80/443 端口被运营商封锁,域名后必须带端口号(如 :8090),不美观

无限制,直接通过 https://域名 访问

网络配置

需配置光猫桥接、路由器拨号、防火墙端口转发

零配置,无需动路由器

SSL 证书

需配置 Let's Encrypt 并定期续期

全自动,Cloudflare 自带证书

安全性

暴露家中真实 IP,容易被扫描攻击

隐藏真实 IP,自带 DDoS 防护

而且非常重要的一点是,这项服务是免费的!这曾经是一项收费服务(以前叫 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类型: HTTP

  • URL: localhost:8090 (这里的 8090 是接下来我们要部署的博客端口)。

点击 Save hostname保存

部署博客服务,以Halo为例

Halo 是目前国内口碑极佳的开源博客系统,颜值高、生态好、上手即用。

准备文件夹:打开群晖 File Station,在 docker 目录下新建文件夹 halo,然后在halo文件夹下再创建halo2db文件夹,其实脚本会自己创建,但是有时候会因为权限问题报错。

创建项目

  • 打开 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

接下来,你可以在后台挑选喜欢的主题,开始记录生活与技术。数据完全掌握在自己手中,这种踏实感,是任何第三方平台都给不了的!