引言:为什么你需要一个家庭实验室

在这个万物皆云的时代,"把数据握在自己手里"正在从一句口号演变为越来越多的技术爱好者的默认选择。家庭实验室(Homelab)不仅仅是搭一台 NAS 那么简单——它是你的私有云计算中心、智能家居控制枢纽、开发测试沙盒,更是持续提升系统工程能力的实践基地。

本文不谈理论,只讲实战。我将从硬件选型、虚拟化平台搭建、容器编排、存储规划、服务矩阵部署到监控备份,完整复盘一台总价不到 2000 元的 mini 主机如何撑起一个四口之家全部的数字生活基础设施。

一、硬件选型:小身材大世界

1.1 为什么选 mini 主机而非塔式服务器

2026 年的 mini 主机市场已经今非昔比。以下是我在搭建过程中验证过的关键对比:

维度Mini 主机塔式服务器树莓派 5
性能上限i7-1260P (12核16线程)双路 Xeon (数百核)BCM2712 (4核)
功耗15-35W (典型负载)100-300W5-8W
噪音<25dB (不可感知)40-55dB (需要单独房间)被动散热 0dB
价格¥800-1500 (准系统)¥3000+ (二手也贵)¥400-600
扩展性2x M.2 + 1x 2.5" SATA多盘位 + PCIe极有限
16GB 内存足够跑 10+ 容器起步配置最高 8GB

对于家庭场景,mini 主机是功耗、噪音、性能和价格的最优折中点。我当前使用的是一台搭载 N100 处理器的准系统(¥699),16GB DDR5 + 512GB NVMe。

1.2 存储扩展策略

mini 主机通常只有 1-2 个 M.2 和 1 个 2.5" SATA 位。规划如下:

  • M.2 槽位 1:512GB NVMe SSD,安装 Proxmox 系统 + 容器镜像存储(高 IOPS 保证虚拟机启动速度)
  • 2.5" SATA 位:2TB 监控级 HDD(如 Seagate IronWolf),用于数据卷挂载(照片、视频、备份)
  • 外置 USB 硬盘盒:4TB 冷备份盘,每周定时 rsync + 每月离线保存(防火灾盗窃)

二、Proxmox VE:你的虚拟化基石

2.1 为什么选 Proxmox 而不是 ESXi 或 Hyper-V

  • 开源免费:无授权限制,社区支持活跃(ESXi 免费版已阉割 vMotion 等关键功能)
  • 内置 ZFS:开箱即用的存储池管理、快照、压缩、去重
  • LXC 容器支持:轻量级容器比虚拟机节省 50-70% 内存开销
  • Web UI 完善:不依赖 vCenter,浏览器直接管理

2.2 安装与基础配置

Proxmox 8.x 安装过程简单,但有几个关键决策点:

  1. 文件系统选择:单盘请选 ext4 + LVM-thin(ZFS 单盘虽可用但内存占用高)。如有双盘,ZFS mirror 是最佳选择
  2. 网络桥接:默认 vmbr0 绑定主网口,确保虚拟机与宿主机在同一二层网络
  3. UPS 集成:如配备 USB UPS,安装 nut 工具包实现断电自动安全关机

2.3 我的虚拟机规划

VM/LXC系统配置运行服务
CT-100Debian 12 LXC1C/512MBPi-hole + Unbound(DNS 去广告)
CT-101Debian 12 LXC2C/2GBTraefik(反向代理/自动 SSL)
CT-102Alpine LXC1C/256MBWireGuard VPN
VM-200Ubuntu 24.044C/8GBDocker 主节点(全部重量级服务)
VM-201Home Assistant OS2C/4GB智能家居中枢(PCIe 直通 Zigbee 棒)

将 Docker 跑在虚拟机中而非 LXC 中的理由是:Docker 嵌套在 LXC 中需要开启嵌套虚拟化,而且内核模块隔离不如 VM 彻底。给 Docker 一个独立 VM,出问题不影响其他容器。

三、Docker 服务矩阵:docker-compose 的优雅编排

3.1 目录结构规范

我的 VM-200 采用如下目录结构:

~/docker/
├── docker-compose.yml        # 主 compose 文件(或按功能拆分)
├── .env                      # 全局环境变量(UID/GID/时区/域名)
├── traefik/
│   ├── traefik.yml           # 静态配置
│   └── dynamic/              # 动态配置目录
├── nextcloud/
│   ├── config/               # Apache/NGINX 配置
│   ├── data/                 # 用户文件(挂载到 HDD)
│   └── db/                   # MariaDB 数据
├── immich/                   # 照片管理
├── jellyfin/                 # 媒体服务
├── vaultwarden/              # Bitwarden 密码管理
├── paperless-ngx/            # 文档管理
├── uptime-kuma/              # 监控
└── watchtower/               # 自动更新容器

3.2 核心 .env 文件

# ~/.docker/.env
PUID=1000
PGID=1000
TZ=Asia/ShangHai
DOMAIN=homelab.local
[email protected]
DATA_ROOT=/mnt/data/docker  # 指向 HDD 挂载点

3.3 Traefik 反向代理配置

Traefik 是整个服务网格的入口。它监听 80/443 端口,根据域名自动路由到对应容器,并自动申请和续签 Let's Encrypt 证书:

# traefik/docker-compose.yml
services:
  traefik:
    image: traefik:v3.1
    command:
      - "--api.insecure=false"
      - "--providers.docker=true"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      - "--certificatesresolvers.letsencrypt.acme.tlschallenge=true"
      - "--certificatesresolvers.letsencrypt.acme.email=${ACME_EMAIL}"
      - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
      - "--entrypoints.web.http.redirections.entryPoint.to=websecure"
      - "--entrypoints.web.http.redirections.entryPoint.scheme=https"
      - "--log.level=WARN"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./letsencrypt:/letsencrypt
    restart: unless-stopped

之后每个服务只需添加 Label 即可暴露到公网:

labels:
  - "traefik.enable=true"
  - "traefik.http.routers.nextcloud.rule=Host(`cloud.${DOMAIN}`)"
  - "traefik.http.routers.nextcloud.tls.certresolver=letsencrypt"
  - "traefik.http.services.nextcloud.loadbalancer.server.port=80"

3.4 服务矩阵全景

以下是我当前在 VM-200 中运行的全部服务及其资源占用:

服务用途内存存储
Nextcloud文件同步/日历/联系人512MB200GB+
Immich照片备份/AI 识别1GB150GB
Jellyfin影音库/硬解转码512MB500GB+
Vaultwarden密码管理(全家共享)128MB10MB
Paperless-ngxOCR 文档归档512MB20GB
Uptime Kuma服务可用性监控256MB1GB
FreshRSSRSS 聚合128MB500MB
Stirling-PDFPDF 工具箱256MB50MB
Authentik统一身份认证512MB2GB
Navidrome音乐流媒体128MB30GB
Komga漫画管理512MB50GB
HeadscaleTailscale 自组网128MB500MB

总计:约 4GB 内存常驻占用,对 16GB 的 VM 绰绰有余。

四、存储与备份:数据的最后防线

4.1 ZFS 存储池配置

如果选择了双盘 ZFS mirror,创建和使用方式如下:

# 创建 mirror 池
zpool create -f tank mirror /dev/sda /dev/sdb

# 启用压缩(LZ4 几乎零开销)
zfs set compression=lz4 tank

# 创建数据集
zfs set mountpoint=/mnt/data tank/data
zfs set mountpoint=/mnt/backup tank/backup

# 自动快照(每 15 分钟)
# 使用 zfs-auto-snapshot
apt install zfs-auto-snapshot
# 默认会创建 15min/hourly/daily/weekly/monthly 级别快照

4.2 3-2-1 备份策略落地

不论多好的 RAID 都只是容灾(Disk Failure),不能防误删、勒索病毒和火灾。我的方案:

  • 3 份数据:主存储 + ZFS 快照 + 异地备份
  • 2 种媒介:NVMe/SATA(在线)+ USB HDD(近线冷备)
  • 1 份异地:通过 WireGuard VPN rclone 同步加密数据到云端(如 Backblaze B2,每 GB 仅 $0.005/月)

4.3 自动化备份脚本

#!/bin/bash
# /root/scripts/backup.sh
set -e

DATE=$(date +%Y%m%d_%H%M)
LOG="/var/log/backup-${DATE}.log"

echo "[$(date)] Backup started" >> $LOG

# 1. ZFS 快照
zfs snapshot tank/data@${DATE}
zfs snapshot tank/backup@${DATE}

# 2. rsync 到 USB HDD
rsync -avz --delete /mnt/data/ /mnt/usb-backup/data/ >> $LOG 2>&1

# 3. rclone 加密同步到 B2
rclone sync /mnt/data/data remote:crypt-b2-homelab   --transfers 4 --bwlimit "08:00,5M 23:00,10M"   >> $LOG 2>&1

# 4. 清理超过 30 天的本地快照
zfs list -t snapshot -o name -s creation -r tank/data |   head -n -30 | xargs -r zfs destroy

echo "[$(date)] Backup completed" >> $LOG

加入 crontab:0 3 * * * /root/scripts/backup.sh(每天凌晨 3 点执行)

五、监控与告警:让问题看得见

5.1 Uptime Kuma:零配置心跳监控

Uptime Kuma 是我最推荐的轻量监控工具。它支持 HTTP(s)/TCP/Ping/DNS 等多种监控类型,界面美观,告警渠道丰富:

  • Telegram Bot:最常用,推送及时,支持富文本
  • 邮件 (SMTP):Gmail 应用密码即可
  • Webhook:可对接飞书/钉钉/企业微信
  • ntfy.sh:自托管推送通道,极度轻量

5.2 Node Exporter + Prometheus + Grafana(进阶三件套)

如果想要更深入的系统监控,可以在 VM-200 中添加:

# docker-compose.yml 片段
services:
  node-exporter:
    image: prom/node-exporter
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    command:
      - '--path.procfs=/host/proc'
      - '--path.sysfs=/host/sys'

  prometheus:
    image: prom/prometheus
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml

  grafana:
    image: grafana/grafana
    volumes:
      - grafana-data:/var/lib/grafana
    labels:
      - "traefik.http.routers.grafana.rule=Host(`grafana.${DOMAIN}`)"

5.3 告警规则示例

# prometheus/alerts.yml
groups:
  - name: node
    rules:
      - alert: HighCpuUsage
        expr: 100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85
        for: 10m
        labels:
          severity: warning
      - alert: DiskSpaceLow
        expr: (node_filesystem_avail_bytes / node_filesystem_size_bytes) < 0.15
        for: 5m
        labels:
          severity: critical
      - alert: ZFSPoolDegraded
        expr: zfs_pool_health != 0
        labels:
          severity: critical

六、网络架构与远程访问

6.1 内网服务发现

我使用 Tailscale 的 MagicDNS 来实现内网服务发现。全家设备安装 Tailscale 后,通过 homelab.tailnet-name.ts.net 即可访问所有内网服务,无需配置 hosts 文件或本地 DNS。

对于不使用 Tailscale 的设备(如智能家居产品),Pi-hole 上配置本地 DNS 记录:

# /etc/pihole/custom.list
192.168.1.100  proxmox.homelab.local
192.168.1.100  cloud.homelab.local
192.168.1.100  photos.homelab.local
192.168.1.100  jellyfin.homelab.local

6.2 安全暴露公网的原则

不是所有服务都需要暴露到互联网。我的原则是:

  • 仅暴露:Nextcloud(需异地文件访问)、Vaultwarden(密码随时取用)
  • 反向代理 + WAF:仅暴露的服务前面加一层 Cloudflare Tunnel(隐藏源 IP + 零信任访问策略)
  • 绝不暴露:Proxmox UI、SSH、Traefik Dashboard
  • VPN 替代:其他服务通过 VPN 访问

七、成本核算与投资回报

7.1 初始硬件投入

项目型号/规格价格
Mini 主机零刻 EQ12 N100 准系统¥699
内存DDR5 16GB SODIMM¥249
SSD512GB NVMe PCIe 3.0¥229
HDD2TB Seagate IronWolf¥399
USB 备份盘4TB Elements 移动硬盘¥599
UPS山特 BK650 650VA¥239
合计¥2,414

7.2 运营成本(月度)

  • 电费:N100 典型功耗约 18W,全年约 158 度电,按 ¥0.6/度计算 ¥7.9/月
  • 网络:家庭宽带已有,公网 IP 免费申请(部分地区需要打 10000 号申请)
  • 域名:.top 域名 ¥10/年,约 ¥0.83/月
  • B2 异地备份:当前数据量 ~80GB,¥3.3/月
  • 总计:约 ¥12/月

7.3 替代的云服务成本

如果不自建,使用等价云服务(Google One 2TB + Netflix + 1Password 家庭版 + 网盘等),月费超过 ¥200。约 2 个月回本,之后每月净省 ¥190。更重要的是:数据主权归你所有。

八、踩坑记录与经验教训

两年 Homelab 历程中踩过的坑,提前帮你避雷:

  1. 不要把所有鸡蛋放在一个容器里:曾经 Pihole 和关键服务跑在同一台 LXC 里,结果一次 apt 升级导致 DNS 全家中断。现在关键基础设施独立 VM
  2. ZFS 去重会吃掉所有内存:除非你内存以 TB 计,否则不要开启 ZFS 去重,用 LZ4 压缩足够
  3. 不要忽视 UPS:一次意外断电导致 ZFS 池 degraded,花了一整天排查。¥239 的 UPS 是最值的投资
  4. 命名规范很重要:一开始给 VM 随便起名,半年后完全不记得用途。现在统一用 CT/LXC + 三位数字编号,结合文档对齐
  5. 监控没用不如不用:曾经只装了 Uptime Kuma 但没配告警,结果 Nextcloud 挂了 3 天才被发现。监控的价值在于告警,不是看板
  6. 先上备份再上线新服务:"等跑稳了再加备份"是很危险的赌习惯

九、未来演进方向

当前的 Homelab 仍有几个正在规划的升级方向:

  • Kubernetes 迁移:当前 Docker Compose 已经够用,但想尝试 K3s + GitOps(FluxCD/CD)来研究声明式部署
  • GPU 扩展:计划通过 Thunderbolt eGPU 坞给 VM-200 加一块 GTX 1660,用于 Immich 的机器学习识别加速
  • Solar + Battery 方案:用太阳能板 + 磷酸铁锂电池组为 mini 主机和路由器提供离网续航(野外露营用途)
  • 家庭自动化深化:Matter 协议普及后,Home Assistant + 全屋 Zigbee/Thread 设备的联动场景将更加丰富

结语:动手是最好的学习方式

家庭实验室的魅力不在于"拥有了什么",而在于"学到了什么"。从第一次用 SSH 连上机器的兴奋,到看着 Grafana 上平稳的绿色曲线的满足,每次排查故障和优化性能的过程,都在积累不可替代的实战经验。

如果你正在犹豫——先从一台二手 mini 主机 + Proxmox + Pi-hole 开始吧。一晚上的时间就能跑起来,而这可能是你踏入系统运维世界的第一步。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部