引言:为什么你需要一个家庭实验室
在这个万物皆云的时代,"把数据握在自己手里"正在从一句口号演变为越来越多的技术爱好者的默认选择。家庭实验室(Homelab)不仅仅是搭一台 NAS 那么简单——它是你的私有云计算中心、智能家居控制枢纽、开发测试沙盒,更是持续提升系统工程能力的实践基地。
本文不谈理论,只讲实战。我将从硬件选型、虚拟化平台搭建、容器编排、存储规划、服务矩阵部署到监控备份,完整复盘一台总价不到 2000 元的 mini 主机如何撑起一个四口之家全部的数字生活基础设施。
一、硬件选型:小身材大世界
1.1 为什么选 mini 主机而非塔式服务器
2026 年的 mini 主机市场已经今非昔比。以下是我在搭建过程中验证过的关键对比:
| 维度 | Mini 主机 | 塔式服务器 | 树莓派 5 |
|---|---|---|---|
| 性能上限 | i7-1260P (12核16线程) | 双路 Xeon (数百核) | BCM2712 (4核) |
| 功耗 | 15-35W (典型负载) | 100-300W | 5-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 安装过程简单,但有几个关键决策点:
- 文件系统选择:单盘请选 ext4 + LVM-thin(ZFS 单盘虽可用但内存占用高)。如有双盘,ZFS mirror 是最佳选择
- 网络桥接:默认 vmbr0 绑定主网口,确保虚拟机与宿主机在同一二层网络
- UPS 集成:如配备 USB UPS,安装 nut 工具包实现断电自动安全关机
2.3 我的虚拟机规划
| VM/LXC | 系统 | 配置 | 运行服务 |
|---|---|---|---|
| CT-100 | Debian 12 LXC | 1C/512MB | Pi-hole + Unbound(DNS 去广告) |
| CT-101 | Debian 12 LXC | 2C/2GB | Traefik(反向代理/自动 SSL) |
| CT-102 | Alpine LXC | 1C/256MB | WireGuard VPN |
| VM-200 | Ubuntu 24.04 | 4C/8GB | Docker 主节点(全部重量级服务) |
| VM-201 | Home Assistant OS | 2C/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 | 文件同步/日历/联系人 | 512MB | 200GB+ |
| Immich | 照片备份/AI 识别 | 1GB | 150GB |
| Jellyfin | 影音库/硬解转码 | 512MB | 500GB+ |
| Vaultwarden | 密码管理(全家共享) | 128MB | 10MB |
| Paperless-ngx | OCR 文档归档 | 512MB | 20GB |
| Uptime Kuma | 服务可用性监控 | 256MB | 1GB |
| FreshRSS | RSS 聚合 | 128MB | 500MB |
| Stirling-PDF | PDF 工具箱 | 256MB | 50MB |
| Authentik | 统一身份认证 | 512MB | 2GB |
| Navidrome | 音乐流媒体 | 128MB | 30GB |
| Komga | 漫画管理 | 512MB | 50GB |
| Headscale | Tailscale 自组网 | 128MB | 500MB |
总计:约 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 |
| SSD | 512GB NVMe PCIe 3.0 | ¥229 |
| HDD | 2TB 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 历程中踩过的坑,提前帮你避雷:
- 不要把所有鸡蛋放在一个容器里:曾经 Pihole 和关键服务跑在同一台 LXC 里,结果一次 apt 升级导致 DNS 全家中断。现在关键基础设施独立 VM
- ZFS 去重会吃掉所有内存:除非你内存以 TB 计,否则不要开启 ZFS 去重,用 LZ4 压缩足够
- 不要忽视 UPS:一次意外断电导致 ZFS 池 degraded,花了一整天排查。¥239 的 UPS 是最值的投资
- 命名规范很重要:一开始给 VM 随便起名,半年后完全不记得用途。现在统一用 CT/LXC + 三位数字编号,结合文档对齐
- 监控没用不如不用:曾经只装了 Uptime Kuma 但没配告警,结果 Nextcloud 挂了 3 天才被发现。监控的价值在于告警,不是看板
- 先上备份再上线新服务:"等跑稳了再加备份"是很危险的赌习惯
九、未来演进方向
当前的 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 开始吧。一晚上的时间就能跑起来,而这可能是你踏入系统运维世界的第一步。

发表评论 取消回复