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

项目介绍
Halo 是一个自己部署的建站工具。个人博客、知识库、公司官网都能用它来搭,后台是中文的,写文章跟用在线编辑器差不多,装完就能直接开写。
它最舒服的一点是够轻:一个容器就跑起来,**不用再另外起一个数据库容器** —— 它默认用的是内置的文件型数据库,整个实例的家当(文章、图片、评论、数据库、搜索索引、日志)全落在同一个目录里。备份就是把那个文件夹拷走,换机器就是把文件夹拷过去。
东西放在哪儿是它跟各家在线博客平台最大的区别:文章和图片都在你自己 NAS 的盘上,不在别人的服务器里,也不用担心平台哪天改规则。项目在 GitHub 上开源,用 Java 写的,官方镜像给了 amd64、arm64 等多种架构,家用 NAS 基本都跑得动。
项目地址:halo-dev/halo
部署安装
装在自己的 NAS 上之后,它默认只能在家里的网络里打开 —— 可博客这东西恰恰是要给外面看的:你自己在通勤路上想补两句、朋友点开链接想看看,都得从外网进得来。家里没有公网 IP 的话,可以用 帕斯内网穿透 把它开放到公网,飞牛的应用中心里就能直接装到插件,不用另外找工具。下面这套流程在飞牛 NAS 上从头到尾走一遍。
第一步:准备编排文件
下面这份编排可以直接用,要认的有三处。
1services:2 halo:3 image: halohub/halo:2.264 container_name: halo5 restart: unless-stopped6 ports:7 - "3406:8090"8 environment:9 TZ: Asia/Shanghai10 volumes:11 - ./data:/root/.halo212
端口:冒号左边的 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 上属于那种一次装好、之后只管写的应用:一个容器、一个数据目录、备份就是拷文件夹。再配一条内网穿透,就是一个真正属于自己的博客 —— 文章和图片都在自己的盘上,在哪儿都能打开,也不用每年交服务器的钱。