什么是 HomeLab?
HomeLab 就是在家里的服务器上跑你自己需要的服务——不依赖云、不受限、完全可控。
和 NAS 不同,HomeLab 的重点不是「存文件」,而是「跑服务」。一台小主机 + Docker,你就能拥有:
- 私人 Git 托管(不依赖 GitHub)
- 密码管理器(不依赖 1Password)
- 书签管理(不依赖浏览器同步)
- 工作流自动化(不依赖 Zapier)
- 服务监控(知道你的网站有没有挂)
- 私人网盘(不依赖百度网盘)
- 媒体服务器(不依赖爱奇艺会员)
- RSS 阅读器(不依赖算法推荐)
- 笔记同步(不依赖 Notion)
- AI 聊天(不依赖 ChatGPT 网页)
硬件选择
方案一:迷你主机(推荐)
| 型号 | CPU | 内存 | 存储 | 功耗 | 参考价 |
|---|---|---|---|---|---|
| 零刻 EQ13 | N305(8核) | 16GB | 500GB NVMe | 10-15W | ¥1,000 |
| 铭凡 UM790 | R9 7940HS | 32GB | 1TB NVMe | 20-35W | ¥2,800 |
| Intel N100 小主机 | N100(4核) | 16GB | 256GB | 6-10W | ¥600 |
推荐 N100 小主机:功耗低(一年电费 ¥40-60)、性能够跑 10+ Docker 服务、体积小(巴掌大)、静音。
方案二:旧笔记本/台式机
零成本入门。笔记本自带 UPS(电池),台式机性能更强。
方案三:树莓派 5
ARM 架构,功耗极低(5W),但性能有限,适合轻量服务。
系统选择
| 系统 | 特点 | 适合谁 |
|---|---|---|
| Ubuntu Server 24.04 LTS | 最通用,教程最多 | 大多数人 |
| Debian 12 | 稳定,资源占用更低 | 追求稳定 |
| CasaOS | 图形化管理 Docker,极简 | 新手 |
| Proxmox VE | 虚拟化平台,跑 VM + 容器 | 极客 |
本文用 Ubuntu Server + Docker Compose,最通用。
基础环境搭建
1. 安装系统
下载 Ubuntu Server 24.04 LTS → 用 Rufus 写入 U 盘 → 安装到小主机。
2. 安装 Docker
curl -fsSL https://get.docker.com | bash
sudo usermod -aG docker $USER
# 重新登录使 docker 组生效
3. 创建项目目录
mkdir -p /opt/homelab
cd /opt/homelab
4. 安装管理工具
# htop — 资源监控
sudo apt install htop
# ncdu — 磁盘占用分析
sudo apt install ncdu
# lazydocker — Docker TUI 管理
bash -c "$(curl -sL https://raw.githubusercontent.com/jesseduffield/lazydocker/master/scripts/install_update_linux.sh)"
10 个自托管服务
所有服务放在一个 docker-compose.yml 中,方便统一管理。
# /opt/homelab/docker-compose.yml
version: '3.8'
services:
# 1. Gitea — 私人 Git 托管
gitea:
image: gitea/gitea:latest
restart: unless-stopped
environment:
- USER_UID=1000
- USER_GID=1000
- GITEA__database__DB_TYPE=sqlite3
- GITEA__server__ROOT_URL=http://你的IP:3000
ports:
- "3000:3000"
- "222:22"
volumes:
- ./gitea/data:/data
# 2. Vaultwarden — 密码管理器
vaultwarden:
image: vaultwarden/server:latest
restart: unless-stopped
environment:
- DOMAIN=http://你的IP:8080
- SIGNUPS_ALLOWED=false
ports:
- "8080:80"
volumes:
- ./vaultwarden/data:/data
# 3. Linkwarden — 书签管理
linkwarden:
image: ghcr.io/linkwarden/linkwarden:latest
restart: unless-stopped
environment:
- DATABASE_URL=postgresql://postgres:linkwarden@linkwarden-db:5432/linkwarden
- NEXTAUTH_SECRET=change-me-to-random-string
- NEXTAUTH_URL=http://你的IP:3001
ports:
- "3001:3000"
volumes:
- ./linkwarden/data:/data/data
depends_on:
- linkwarden-db
linkwarden-db:
image: postgres:16-alpine
restart: unless-stopped
environment:
- POSTGRES_DB=linkwarden
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=linkwarden
volumes:
- ./linkwarden/db:/var/lib/postgresql/data
# 4. Uptime Kuma — 服务监控
uptime-kuma:
image: louislam/uptime-kuma:latest
restart: unless-stopped
ports:
- "3002:3001"
volumes:
- ./uptime-kuma/data:/app/data
# 5. N8N — 工作流自动化
n8n:
image: n8nio/n8n:latest
restart: unless-stopped
environment:
- GENERIC_TIMEZONE=Asia/Shanghai
- N8N_PORT=5678
ports:
- "5678:5678"
volumes:
- ./n8n/data:/home/node/.n8n
# 6. Miniflux — RSS 阅读器
miniflux:
image: miniflux/miniflux:latest
restart: unless-stopped
environment:
- DATABASE_URL=postgres://miniflux:miniflux@miniflux-db:5432/miniflux?sslmode=disable
- RUN_MIGRATIONS=1
- CREATE_ADMIN=1
- ADMIN_USERNAME=admin
- ADMIN_PASSWORD=change-me
ports:
- "8081:8080"
depends_on:
- miniflux-db
miniflux-db:
image: postgres:16-alpine
restart: unless-stopped
environment:
- POSTGRES_USER=miniflux
- POSTGRES_PASSWORD=miniflux
- POSTGRES_DB=miniflux
volumes:
- ./miniflux/db:/var/lib/postgresql/data
# 7. Memos — 碎片化笔记
memos:
image: neosmemo/memos:latest
restart: unless-stopped
ports:
- "5230:5230"
volumes:
- ./memos/data:/var/opt/memos
# 8. Stirling-PDF — PDF 工具箱
stirling-pdf:
image: stirlingtools/stirling-pdf:latest
restart: unless-stopped
ports:
- "8082:8080"
volumes:
- ./stirling-pdf/trainingData:/usr/share/tessdata
# 9. Open WebUI — AI 聊天界面
open-webui:
image: ghcr.io/open-webui/open-webui:main
restart: unless-stopped
environment:
- OLLAMA_BASE_URL=http://host.docker.internal:11434
ports:
- "8083:8080"
volumes:
- ./open-webui/data:/app/backend/data
extra_hosts:
- "host.docker.internal:host-gateway"
# 10. Portainer — 容器管理面板
portainer:
image: portainer/portainer-ce:latest
restart: unless-stopped
ports:
- "9000:9443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./portainer/data:/data
cd /opt/homelab
docker compose up -d
服务清单与访问
| # | 服务 | 端口 | 用途 | 替代谁 |
|---|---|---|---|---|
| 1 | Gitea | 3000 | 私人 Git 托管 | GitHub / GitLab |
| 2 | Vaultwarden | 8080 | 密码管理 | 1Password / LastPass |
| 3 | Linkwarden | 3001 | 书签管理 | Raindrop / 浏览器书签 |
| 4 | Uptime Kuma | 3002 | 服务监控 | UptimeRobot |
| 5 | N8N | 5678 | 工作流自动化 | Zapier / IFTTT |
| 6 | Miniflux | 8081 | RSS 阅读 | Feedly / Inoreader |
| 7 | Memos | 5230 | 碎片笔记 | flomo / 备忘录 |
| 8 | Stirling-PDF | 8082 | PDF 工具 | iLovePDF / SmallPDF |
| 9 | Open WebUI | 8083 | AI 聊天 | ChatGPT 网页版 |
| 10 | Portainer | 9000 | 容器管理 | Docker CLI |
远程访问
方案一:Tailscale(最简单)
# 小主机上安装
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
# 手机/笔记本也装 Tailscale
# 之后通过 Tailscale IP 访问所有服务
方案二:域名 + Nginx 反代 + HTTPS
# 安装 Nginx
sudo apt install nginx certbot python3-certbot-nginx
# 配置反代(以 Gitea 为例)
# /etc/nginx/sites-available/gitea.yourdomain.com
server {
listen 80;
server_name gitea.yourdomain.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
# 启用站点 + 申请证书
sudo ln -s /etc/nginx/sites-available/gitea.yourdomain.com /etc/nginx/sites-enabled/
sudo certbot --nginx -d gitea.yourdomain.com
运维脚本
一键更新所有服务
#!/bin/bash
# /opt/homelab/update.sh
cd /opt/homelab
echo "Pulling latest images..."
docker compose pull
echo "Recreating containers..."
docker compose up -d
echo "Cleaning up unused images..."
docker image prune -f
echo "Update complete!"
docker compose ps
自动备份
#!/bin/bash
# /opt/homelab/backup.sh
BACKUP_DIR="/opt/backups/homelab/$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR
# 备份所有数据
cd /opt/homelab
tar czf $BACKUP_DIR/homelab-data.tar.gz \
gitea/data \
vaultwarden/data \
linkwarden/data \
linkwarden/db \
uptime-kuma/data \
n8n/data \
miniflux/db \
memos/data \
open-webui/data \
portainer/data
# 备份 docker-compose.yml
cp docker-compose.yml $BACKUP_DIR/
# 保留最近 7 天
find /opt/backups/homelab/ -maxdepth 1 -mtime +7 -exec rm -rf {} \;
echo "Backup: $BACKUP_DIR ($(du -sh $BACKUP_DIR | cut -f1))"
# 定时任务
chmod +x /opt/homelab/update.sh /opt/homelab/backup.sh
echo "0 3 * * 0 /opt/homelab/backup.sh" | crontab - # 每周日凌晨 3 点备份
echo "0 4 * * 1 /opt/homelab/update.sh" | crontab - # 每周一凌晨 4 点更新
资源占用参考
N100 小主机(4 核 / 16GB 内存 / 256GB SSD)运行全部 10 个服务:
| 资源 | 使用量 | 说明 |
|---|---|---|
| CPU | 5-15% | 空闲时极低 |
| 内存 | 2-3GB | 最大消耗:Open WebUI ~500MB, Gitea ~300MB |
| 磁盘 | 10-20GB | 取决于 Gitea 仓库和 Memos 数据量 |
| 功耗 | 10-15W | 一年电费约 ¥50-80 |
| 网络 | 极低 | 仅远程访问时消耗带宽 |
常见问题
Q:停电了怎么办? 迷你主机 + UPS(不间断电源,¥100-200)可以撑 30 分钟,足够安全关机。推荐 APC BK650。
Q:公网 IP 没有怎么办? Tailscale 不需要公网 IP。如果要用域名访问,可以用 Cloudflare Tunnel(免费)做内网穿透。
Q:数据安全怎么保证?
- 重要数据定期备份到外接硬盘或云端(Backblaze B2, ¥42/TB/年)
- 密码管理器数据库加密
- 开启各服务的 HTTPS
Q:性能不够怎么办? N100 跑 10 个轻量服务没问题。如果要用 AI 聊天(Open WebUI + Ollama),建议 32GB 内存 + 更大的 CPU(如 R9 7940HS),或者 AI 部分用云端 API。
原文出处