🧱博客搭建:从零开始,打造属于自己的技术角落
说来惭愧,这已经不是我第一次尝试搭建博客了。早在 2023 年,趁着阿里云新用户免费两个月的福利,我玩起了宝塔面板,也是那时第一次听说了 Halo 这个轻量级开源博客系统。可惜当时热情来得快去得也快,没多久就不了了之。
如今,作为一名入行四年的 Java 开发者,我逐渐意识到:写博客不仅是记录,更是思考与沉淀的过程。这些年,为了解决项目中的问题,我逛过不少技术人的个人博客,也结识了来自前端、后端、运维甚至硬件领域的同行朋友。从曾经只会刷剧打游戏,到现在摸鱼研究 Linux、写博客、折腾 Voron 3D 打印机……我的“成分”确实有点复杂 😅。
于是,这次我决定认真地、完整地搭建一个属于自己的博客站点,并把它长期维护下去。
🖥️ 硬件准备:旧电脑变身私人 NAS
我的服务器是一台二手的 Intel Core i5-5300U 笔记本(2 核 4 线程),通过 垃圾佬论坛(lajilao.top) 在闲鱼上淘来的。虽然性能一般,但作为家用 NAS 完全够用。
硬件接口情况:
- 3 个 SATA 接口
- 1 个 PCIe 3.0 插槽
- 4 个 USB-A 接口
🛠️ 搭建步骤详解
第一步:安装飞牛 OS(fnOS)
我选择的是国产 NAS 系统 飞牛 OS(官方安装指南)。按照教程制作 U 盘引导盘,刷入系统并完成初始化配置。
飞牛 OS 对新手友好,自带应用市场,极大简化了后续服务部署。
第二步:公网访问 —— 利用 IPv6 + DDNS
由于是家庭宽带,没有固定公网 IPv4,但我家运营商支持 IPv6。于是:
- 将光猫改为 桥接模式,由路由器拨号;
- 在飞牛 OS 应用市场中安装 DDNS 服务;
- 结合域名解析,实现 IPv6 地址的动态更新(因为 IPv6 地址会定期变化)。
这样,我的 NAS 就具备了“类云服务器”的公网访问能力。
第三步:购买域名 & 解析
我在阿里云以 9 元 / 年 的价格购买了一个域名:iiain.top。
- 主站:
www.iiain.top - 博客:
blog.iiain.top
通过阿里云 DNS 解析 + DDNS 联动,确保 blog.iiain.top 始终指向最新的 IPv6 地址。
第四步:部署 Halo 博客系统(Docker Compose)
飞牛应用市场虽然提供 Halo 镜像,但版本较旧。我选择手动编写 docker-compose.yml,使用最新版 Halo 2.21.10。
services:
halo:
image: halohub/halo:2.21.10
container_name: halo
restart: unless-stopped
depends_on:
halodb:
condition: service_healthy
networks:
- trim-default
volumes:
- /var/apps/docker-halo/var/halo2:/root/.halo2
ports:
- "28090:8090"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"]
interval: 30s
timeout: 5s
retries: 5
start_period: 30s
environment:
- JVM_OPTS=-Xmx256m -Xms256m
command:
- --spring.r2dbc.url=r2dbc:pool:postgresql://halodb/halo
- --spring.r2dbc.username=halo
- --spring.r2dbc.password=openpostgresql
- --spring.sql.init.platform=postgresql
- --halo.external-url=https://blog.iiain.top
halodb:
image: registry.fnnas.com/fnapp/postgres:15.4
restart: unless-stopped
networks:
- trim-default
volumes:
- /var/apps/docker-halo/var/data:/var/lib/postgresql/data
healthcheck:
test: ["CMD", "pg_isready"]
interval: 10s
timeout: 5s
retries: 5
environment:
- POSTGRES_PASSWORD=openpostgresql
- POSTGRES_USER=halo
- POSTGRES_DB=halo
- PGUSER=halo
networks:
trim-default:
external: true
第五步:解决 IPv4 用户访问问题 —— CDN + 反向代理
虽然 IPv6 已普及,但仍有大量用户未开启。为了兼容所有访客,我做了如下优化:
- 使用 腾讯云 CDN 站点加速(免费);
- 在本地部署 NginxWebUI,反向代理 Halo 容器(端口
28090→82); - CDN 回源地址设为
www.iiain.top:82; - SSL 证书分两段配置:
- 客户端 ↔ CDN:腾讯云自动签发的免费证书;
- CDN ↔ Nginx:使用阿里云密钥绑定,配合自动续签。
这样一来,无论用户是否支持 IPv6,都能通过 https://blog.iiain.top 快速、安全地访问我的博客。
✨ 写在最后
从一台老旧笔记本,到一个稳定运行的个人博客,整个过程充满了折腾的乐趣。技术或许会过时,但持续学习和分享的习惯,才是开发者最宝贵的财富。
如果你也在考虑搭建自己的博客,不妨试试 Halo + 家用 NAS 的组合——低成本、高自由度,还能顺便提升运维能力!
⮕ 时序图
blog.iiain.top.eo.dnse0.com participant NAS as 飞牛 NAS
fnos.iiain.top (IPv6) participant Nginx as Nginx WebUI
:82 participant Docker as Docker participant Halo as Halo 博客
:28090
Client->>AliDNS: 解析 blog.iiain.top
AliDNS-->>Client: CNAME 指向 blog.iiain.top.eo.dnse0.com
Client->>CDN: HTTPS 请求 blog.iiain.top
Note over Client,CDN: IPv4 / IPv6 均可访问
CDN->>NAS: 回源请求 fnos.iiain.top(IPv6)
Note over CDN,NAS: CDN 回源使用 IPv6
NAS->>Nginx: 转发到 82 端口
Nginx->>Docker: 反向代理
Docker->>Halo: 转发 HTTP 请求
Halo-->>Docker: 返回页面内容
Docker-->>Nginx: 返回响应
Nginx-->>NAS: 返回响应
NAS-->>CDN: 回源响应
CDN-->>Client: HTTPS 返回博客页面