🧱博客搭建:从零开始,打造属于自己的技术角落

106

说来惭愧,这已经不是我第一次尝试搭建博客了。早在 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。于是:

  1. 将光猫改为 桥接模式,由路由器拨号;
  2. 在飞牛 OS 应用市场中安装 DDNS 服务
  3. 结合域名解析,实现 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 已普及,但仍有大量用户未开启。为了兼容所有访客,我做了如下优化:

  1. 使用 腾讯云 CDN 站点加速(免费);
  2. 在本地部署 NginxWebUI,反向代理 Halo 容器(端口 2809082);
  3. CDN 回源地址设为 www.iiain.top:82
  4. SSL 证书分两段配置:
    • 客户端 ↔ CDN:腾讯云自动签发的免费证书;
    • CDN ↔ Nginx:使用阿里云密钥绑定,配合自动续签。

这样一来,无论用户是否支持 IPv6,都能通过 https://blog.iiain.top 快速、安全地访问我的博客。

✨ 写在最后

从一台老旧笔记本,到一个稳定运行的个人博客,整个过程充满了折腾的乐趣。技术或许会过时,但持续学习和分享的习惯,才是开发者最宝贵的财富。

如果你也在考虑搭建自己的博客,不妨试试 Halo + 家用 NAS 的组合——低成本、高自由度,还能顺便提升运维能力!

⮕ 时序图

%%{init: { "theme": "dark" } }%% sequenceDiagram autonumber participant Client as 客户端浏览器 participant AliDNS as 阿里云 DNS participant CDN as 腾讯云 CDN
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 返回博客页面