PassNAT LogoPassNAT

自己的博客不用租服务器:飞牛 NAS 用一个容器装 Halo,配内网穿透在外面也能写也能看

作者

小编

发布时间

Curving abstract shapes with an orange and blue gradient

项目介绍

Halo 是一个自己部署的建站工具。个人博客、知识库、公司官网都能用它来搭,后台是中文的,写文章跟用在线编辑器差不多,装完就能直接开写。

它最舒服的一点是够轻:一个容器就跑起来,**不用再另外起一个数据库容器** —— 它默认用的是内置的文件型数据库,整个实例的家当(文章、图片、评论、数据库、搜索索引、日志)全落在同一个目录里。备份就是把那个文件夹拷走,换机器就是把文件夹拷过去。

东西放在哪儿是它跟各家在线博客平台最大的区别:文章和图片都在你自己 NAS 的盘上,不在别人的服务器里,也不用担心平台哪天改规则。项目在 GitHub 上开源,用 Java 写的,官方镜像给了 amd64、arm64 等多种架构,家用 NAS 基本都跑得动。

项目地址:halo-dev/halo

部署安装

装在自己的 NAS 上之后,它默认只能在家里的网络里打开 —— 可博客这东西恰恰是要给外面看的:你自己在通勤路上想补两句、朋友点开链接想看看,都得从外网进得来。家里没有公网 IP 的话,可以用 帕斯内网穿透 把它开放到公网,飞牛的应用中心里就能直接装到插件,不用另外找工具。下面这套流程在飞牛 NAS 上从头到尾走一遍。

第一步:准备编排文件

下面这份编排可以直接用,要认的有三处。

1services:
2 halo:
3 image: halohub/halo:2.26
4 container_name: halo
5 restart: unless-stopped
6 ports:
7 - "3406:8090"
8 environment:
9 TZ: Asia/Shanghai
10 volumes:
11 - ./data:/root/.halo2
12

端口:冒号左边的 3406 是 NAS 上对外的端口,待会儿在浏览器里输的是它,建隧道时填的也是它;右边的 8090 是容器内部的端口,不要动。3406 如果被别的容器占了,换一个没用过的即可。

数据目录:./data 挂到容器里的 /root/.halo2,这是整个实例的家当所在 —— 文章、图片附件、数据库文件、搜索索引、日志全在里面。它是相对于编排文件所在目录的,所以整个项目文件夹拷走就是一份完整备份。

镜像标签:这里写的是 2.26,**不要改成 latest**。Halo 这个镜像的 latest 标签最后一次更新是 2022 年 11 月,指向的还是上一个大版本;而 2.26 这一支是 2026 年 9 月推的。官方 README 的快速开始里写的也正是 2.26 这种写法。这一条跟大多数项目不一样,值得单独记一下。

时区:TZ 填 Asia/Shanghai。不填的话文章的发布时间会跟本地差八小时。

第二步:在飞牛上建 Compose 项目

打开飞牛的 Docker 应用,切到 Compose,点右上角的新增项目。项目名称填 halo。

路径这一栏点开,在「我的文件」下面挑一个空文件夹选中 —— 没有就当场新建一个。这个文件夹以后就是这个项目的家,编排文件和上面说的 data 目录都会放在里面。

来源选「创建 docker-compose.yml」,把上面那份编排整段贴进去。

下面「创建项目后立即启动」勾上,点确认。镜像两百多兆,比纯前端的应用大一些;而且 Halo 是 Java 写的,**第一次启动明显比一般容器慢**,别急着刷新,等个半分钟左右。

第三步:建内网穿透隧道(先别通电)

在飞牛的应用中心里搜 PassNAT,装上,账号登一次。打开插件点创建隧道:名字随便起;接入节点和协议留默认;本地地址留它默认的 127.0.0.1;本地端口填上面那个 3406。

建好之后**先不要按电源**。这一步很关键,原因在下一步:Halo 是「谁第一个打开谁建管理员」的那种应用 —— 它不像有些程序那样出厂带一个默认账号,而是首次访问时弹出安装向导,谁填谁就是这个站的超级管理员。所以正确的顺序是:隧道先建好不通电,在家里的网络上把管理员建好,再回来按电源。

顺便把详情面板里那一行公网地址记下来 —— **隧道即使没通电,系统也已经把地址分配好了**,下一步马上要用。

第四步:在局域网上跑安装向导

用 NAS 的局域网地址加 3406 打开它,会直接进安装向导。语言挑「简体中文」。

🔴 **「外部访问地址」这一栏,要换成刚才记下来的公网地址**,不要用它预填的局域网地址。Halo 会拿这个地址去拼绝对链接 —— 图片附件、订阅地址、分享出去的文章链接都靠它。填成局域网地址的话,在外面打开你的博客,图看不到、链接点不开。这一栏以后在后台设置里也能改,但一开始就填对最省事。

剩下的填站点标题、用户名、邮箱和密码,点下面的按钮,管理员就建好了,页面会跳到登录页。

这一页顶上还挂着一条提醒,值得说清楚:它自带的这个文件型数据库,官方说不建议拿去扛生产环境。怎么看这句话?个人博客、知识库这种量级完全够用,很多人一用就是几年;真正要留意的是**定期备份** —— 把上面那个 data 文件夹拷走就行,它里面本来就带了一个 backups 目录。如果你的站点以后访问量上来了,或者要放很重要的内容,再把编排换成 PostgreSQL 版本更稳妥。

第五步:通电,然后在公网地址上写第一篇

回 PassNAT 插件里,给刚才那条隧道按一下电源,状态转成运行中。这时候用刚才那个公网地址打开,就是你自己的博客了,后面所有操作都在这个地址上做。

地址后面加一个 /console 进后台,用刚才建的账号登进去。左边「文章」里点新建,标题和正文写上,正文区就是个所见即所得的编辑器,中文直接打就行。

写完点右上角的发布,它会再弹一个确认,里面的「别名」会自动按标题生成好,不用管,**再点一次里面那个发布**才算真发出去。回到前台刷新一下,文章就在首页上了。

常见问题

端口 3406 打不开:先在飞牛的 Docker 列表里确认容器是「正在运行」。Halo 首启比较慢,刚创建完就去访问多半还没起来,等半分钟再试。

在外面打开博客,图片显示不出来 / 分享的链接点不开:多半是安装时「外部访问地址」填成了局域网地址。进后台的设置里把它改成公网地址就好。

公网地址打不开但局域网能开:回 PassNAT 插件看那条隧道的状态是不是「运行中」,没通电的话按一下电源。

忘记管理员密码:登录页上有「忘记密码」,走邮箱重置;没配邮件服务的话,最省事的办法是把 data 目录备份好之后重新初始化。

小结

Halo 装在 NAS 上属于那种一次装好、之后只管写的应用:一个容器、一个数据目录、备份就是拷文件夹。再配一条内网穿透,就是一个真正属于自己的博客 —— 文章和图片都在自己的盘上,在哪儿都能打开,也不用每年交服务器的钱。