什么是 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:数据安全怎么保证?

  1. 重要数据定期备份到外接硬盘或云端(Backblaze B2, ¥42/TB/年)
  2. 密码管理器数据库加密
  3. 开启各服务的 HTTPS

Q:性能不够怎么办? N100 跑 10 个轻量服务没问题。如果要用 AI 聊天(Open WebUI + Ollama),建议 32GB 内存 + 更大的 CPU(如 R9 7940HS),或者 AI 部分用云端 API。


原文出处