自托管(Self-Hosting)不是什么新鲜事,但 2026 年的开源生态已经足够成熟,让你可以用一台 VPS 或 NAS,替代几乎所有的付费云服务。本文是一份可直接粘贴使用的 Docker Compose 配置清单,覆盖文件同步、照片备份、媒体流、密码管理、广告拦截、运维监控等场景。


一、为什么要自托管?

三句话讲清楚:

隐私:你的照片、文件、笔记、密码不再躺在 Google / Dropbox / Notion 的服务器上。数据 100% 在你自己的硬盘里。

成本:一套覆盖文件同步+媒体流+密码管理+广告拦截+PDF处理的完整自托管栈,硬件成本约为 $5-15/月(VPS)。同等功能的 SaaS 订阅加起来轻松超过 $50/月

控制权:没有平台封号、没有突然涨价、没有"该服务已停止运营"。你决定什么时候升级、什么时候迁移、什么时候删数据。

成本速算

SaaS 服务月费
Google One (2TB)$9.99
Netflix Premium$22.99
1Password$2.99
Spotify$10.99
Zapier Pro$19.99
合计$66.95/月

自托管替代方案:VPS (8GB RAM / 200GB SSD) $12-15/月,节省 75%+


二、硬件准备与基础环境

2.1 硬件选择

级别配置价格适合
入门树莓派 5 / 旧电脑 (4-8GB RAM)¥0-5005-8 个轻量服务
推荐Intel N100 小主机 (16GB RAM + 1TB SSD)¥800-1500全部服务 + 媒体库
进阶二手企业级服务器 / 多盘位 NAS¥2000+大规模存储 + 高性能

2026 年最低门槛:一台 8GB 内存的 x86 设备 + 512GB SSD,就足够跑本文推荐的全部服务。

2.2 Docker 一键安装

BASH
# Ubuntu/Debian 一键安装
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER
# 安装 Docker Compose 插件
sudo apt install docker-compose-plugin -y
# 验证
docker compose version

2.3 创建共享网络

所有容器通过统一的 Docker 网络互相通信:

BASH
docker network create homelab

2.4 推荐目录结构

PLAINTEXT
~/homelab/
├── adguard/
├── jellyfin/
├── immich/
├── nextcloud/
├── npm/              # Nginx Proxy Manager
├── vaultwarden/
├── uptime-kuma/
├── stirling-pdf/
├── n8n/
├── portainer/
└── syncthing/

三、反向代理与 SSL — 所有服务的入口

Nginx Proxy Manager(NPM)是自托管栈的核心基础设施。它为所有服务提供统一的 HTTPS 入口,自动申请和续期 Let’s Encrypt 证书,零命令行操作。

YAML
# ~/homelab/npm/docker-compose.yml
services:
  nginx-proxy-manager:
    image: jc21/nginx-proxy-manager:latest
    restart: unless-stopped
    ports:
      - "80:80"       # HTTP
      - "443:443"     # HTTPS
      - "81:81"       # 管理后台
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
    networks:
      - homelab

networks:
  homelab:
    external: true

部署后访问 http://<IP>:81,默认账户 admin@example.com / 密码 changeme

NPM vs Traefik

维度Nginx Proxy ManagerTraefik
适合人群新手 / 家庭用户开发者 / 追求自动化
配置方式Web UI 图形化YAML 标签 / 自动发现
SSL鼠标点击一键申请Docker labels 自动配置
Docker 集成手动添加域名和端口自动发现 Docker 容器
学习曲线中偏高
性能Nginx 内核,非常稳定Go 编写,云原生优先

推荐:新手用 NPM,容器多(30+)且需要自动发现用 Traefik。


四、网络与安全 — 广告拦截与 DNS 防护

AdGuard Home:全家去广告 DNS

将路由器 DNS 指向 AdGuard Home,所有设备(包括电视、手机、IoT)自动屏蔽广告和追踪器。支持自定义过滤规则、家长控制、DNS-over-HTTPS。

YAML
# ~/homelab/adguard/docker-compose.yml
services:
  adguardhome:
    image: adguard/adguardhome:latest
    restart: unless-stopped
    ports:
      - "53:53/tcp"
      - "53:53/udp"
      - "3000:3000/tcp"     # 初始配置(一次性)
      - "8083:80/tcp"       # 管理后台
    volumes:
      - ./workdir:/opt/adguardhome/work
      - ./confdir:/opt/adguardhome/conf
    networks:
      - homelab

networks:
  homelab:
    external: true

首次配置:访问 http://<IP>:3000 完成向导,此后管理后台在端口 8083

Pi-hole(备选方案)

Pi-hole 更轻量、专注 DNS 级别的广告过滤,资源占用更低。如果你已经部署了 AdGuard Home,不需要同时安装 Pi-hole——两者的核心功能高度重叠。

维度AdGuard HomePi-hole
Web UI现代化,实时日志简洁,需插件增强统计
DNS-over-HTTPS内置支持需额外配置
家长控制内置(安全搜索、时间限制)需额外配置
资源占用~50MB RAM~30MB RAM
推荐功能更全,新手友好极简主义,树莓派首选

五、存储与同步 — 替代 Google Drive / iCloud

Nextcloud:全能私有云

Nextcloud 是自托管生态的"瑞士军刀"——文件同步只是基本功,在线 Office 协同编辑、日历、通讯录、相册(Memories 插件)、RSS 阅读器、即时通讯(Talk 插件)全部集成。

YAML
# ~/homelab/nextcloud/docker-compose.yml
services:
  nextcloud-db:
    image: mariadb:11
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: <强密码>
      MYSQL_DATABASE: nextcloud
      MYSQL_USER: nextcloud
      MYSQL_PASSWORD: <强密码>
    volumes:
      - ./db:/var/lib/mysql
    networks:
      - homelab

  nextcloud:
    image: nextcloud:30
    restart: unless-stopped
    ports:
      - "8080:80"
    environment:
      MYSQL_HOST: nextcloud-db
      MYSQL_DATABASE: nextcloud
      MYSQL_USER: nextcloud
      MYSQL_PASSWORD: <强密码>
    volumes:
      - ./data:/var/www/html
      - /mnt/storage/nextcloud:/data   # 数据存储目录
    depends_on:
      - nextcloud-db
    networks:
      - homelab

networks:
  homelab:
    external: true

推荐插件(应用商店一键安装)

Immich:Google Photos 的完美替代

Immich 2026 年 1 月发布了 v2.5.0(9万星里程碑),是目前最火的开源相册方案。支持手机自动备份、AI 人脸识别、地图视图、非破坏性编辑、释放手机空间、图片搜索。

YAML
# ~/homelab/immich/docker-compose.yml
# 注:完整配置建议从官网获取最新版本
# https://immich.app/docs/install/docker-compose
services:
  immich-server:
    image: ghcr.io/immich-app/immich-server:release
    restart: unless-stopped
    volumes:
      - ${UPLOAD_LOCATION}:/usr/src/app/upload
      - /etc/localtime:/etc/localtime:ro
    env_file:
      - .env
    ports:
      - "2283:2283"
    depends_on:
      - redis
      - database
    networks:
      - homelab

  immich-machine-learning:
    image: ghcr.io/immich-app/immich-machine-learning:release
    restart: unless-stopped
    volumes:
      - model-cache:/cache
    env_file:
      - .env
    networks:
      - homelab

  redis:
    image: redis:7
    restart: unless-stopped
    volumes:
      - ./redis:/data
    networks:
      - homelab

  database:
    image: tensorchord/pgvecto-rs:pg16-v0.4.0
    restart: unless-stopped
    env_file:
      - .env
    environment:
      POSTGRES_PASSWORD: <强密码>
      POSTGRES_USER: postgres
      POSTGRES_DB: immich
    volumes:
      - ./pgdata:/var/lib/postgresql/data
    networks:
      - homelab

volumes:
  model-cache:

networks:
  homelab:
    external: true

.env 示例

BASH
UPLOAD_LOCATION=/mnt/storage/immich
DB_PASSWORD=<强密码>
IMMICH_VERSION=release

Immich v2.5.0 亮点:非破坏性编辑(裁剪/旋转/镜像,随时恢复原图)、释放手机空间(已备份的自动清空本地)、Web 端数据库备份恢复、渐进式 JPEG 加载、移动端星级评分。

Syncthing:点对点同步(无需服务器)

与 Nextcloud/Immich 不同,Syncthing 是点对点协议——设备之间直接同步文件,不经过中心服务器。适合不需要"云端存储"、只要多台电脑/NAS之间保持文件一致的场景。

YAML
# ~/homelab/syncthing/docker-compose.yml
services:
  syncthing:
    image: syncthing/syncthing:latest
    restart: unless-stopped
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Asia/Shanghai
    ports:
      - "8384:8384"         # Web UI
      - "22000:22000/tcp"   # TCP 文件传输
      - "22000:22000/udp"   # QUIC 文件传输
      - "21027:21027/udp"   # 本地发现
    volumes:
      - ./config:/var/syncthing/config
      - /mnt/storage/sync:/data
    networks:
      - homelab

networks:
  homelab:
    external: true

Nextcloud vs Immich vs Syncthing 场景选型

场景推荐
替代 Google Drive(文件+文档+日历+邮件)Nextcloud
替代 Google Photos(手机照片自动备份+AI相册)Immich
多设备文件夹单向/双向同步Syncthing
公司/团队私有云盘Nextcloud
摄影爱好者 RAW 管理Immich + PhotoPrism

六、媒体与娱乐 — 替代 Netflix / Spotify / Plex

Jellyfin:完全免费的媒体服务器

Jellyfin 是 Plex/Emby 的开源替代,完全免费、零跟踪、无付费墙。支持硬件转码、自动刮削海报和字幕、多用户独立进度。

YAML
# ~/homelab/jellyfin/docker-compose.yml
services:
  jellyfin:
    image: jellyfin/jellyfin:latest
    restart: unless-stopped
    ports:
      - "8096:8096"
      - "8920:8920"           # HTTPS(可选)
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - ./config:/config
      - ./cache:/cache
      - /mnt/media/movies:/media/movies:ro
      - /mnt/media/tv:/media/tv:ro
      - /mnt/media/music:/media/music:ro
    devices:
      - /dev/dri:/dev/dri     # Intel 核显硬件转码
    networks:
      - homelab

networks:
  homelab:
    external: true

性能提示:在管理后台「控制台 → 播放 → 转码」中开启 VAAPI 硬件加速。4K HEVC 转码时,CPU 占用从 300% 降到 15%。

Navidrome 是一个轻量级音乐流媒体服务器,兼容 Subsonic API,支持几乎所有平台的客户端(iOS: play:Sub; Android: DSub / Symfonium; Web: 内置播放器)。

YAML
# ~/homelab/navidrome/docker-compose.yml
services:
  navidrome:
    image: deluan/navidrome:latest
    restart: unless-stopped
    ports:
      - "4533:4533"
    environment:
      ND_SCANSCHEDULE: "1h"
      ND_LOGLEVEL: info
      ND_MUSICFOLDER: /music
      ND_ENABLETRANSCODINGCONFIG: "true"
      ND_TRANSCODINGCACHESIZE: "4000M"
    volumes:
      - ./data:/data
      - /mnt/media/music:/music:ro
    networks:
      - homelab

networks:
  homelab:
    external: true

媒体栈全家桶

如果你追求极致的自动化媒体库体验,可以搭配:

工具功能配合 Jellyfin
Sonarr电视节目自动下载+重命名自动导入
Radarr电影自动下载+重命名自动导入
Prowlarr统一管理索引器(BT/Usenet)给 Sonarr/Radarr 用
Bazarr自动下载字幕内嵌支持
Jellyseerr用户请求+发现(类似 Overseerr)请求→下载→Jellyfin

七、效率与生产工具

Vaultwarden:自托管密码管理器

Vaultwarden 是 Bitwarden 服务端的 Rust 重写版,资源占用仅为官方版的 1/10(约 15MB RAM),完全兼容所有 Bitwarden 客户端(浏览器扩展、手机 App、桌面客户端)。

YAML
# ~/homelab/vaultwarden/docker-compose.yml
services:
  vaultwarden:
    image: vaultwarden/server:latest
    restart: unless-stopped
    ports:
      - "8082:80"
    environment:
      - WEBSOCKET_ENABLED=true
      - SIGNUPS_ALLOWED=false        # 初始注册后立即关闭
      - LOGIN_RATELIMIT_SECONDS=10   # 登录频率限制
      - TZ=Asia/Shanghai
    volumes:
      - ./data:/data
    networks:
      - homelab

networks:
  homelab:
    external: true

⚠️ 安全要点:Vaultwarden 必须通过 NPM 配置 HTTPS,否则浏览器扩展会拒绝连接。注册完账号后立即将 SIGNUPS_ALLOWED 设为 false

Stirling PDF:本地 PDF 全能工具箱

50+ PDF 操作全部在本地处理——合并、拆分、压缩、OCR、格式转换、加水印、签名……替代 Smallpdf / ILovePDF 等所有在线 PDF 工具。敏感文档零泄露风险

YAML
# ~/homelab/stirling-pdf/docker-compose.yml
services:
  stirling-pdf:
    image: frooodle/s-pdf:latest
    restart: unless-stopped
    ports:
      - "8085:8080"
    environment:
      - DOCKER_ENABLE_SECURITY=false
      - LANGS=zh_CN                   # 中文界面
      - SYSTEM_DEFAULTLOCALE=zh-CN
    volumes:
      - ./trainingData:/usr/share/tessdata   # OCR 中文语言包
      - ./config:/configs
    networks:
      - homelab

networks:
  homelab:
    external: true

n8n:开源自动化(替代 Zapier)

可视化工作流自动化平台,400+ 集成。拖拽配置自动化流程——文件来了自动备份、GitHub 事件触发通知、表单数据同步到数据库。

YAML
# ~/homelab/n8n/docker-compose.yml
services:
  n8n:
    image: n8nio/n8n:latest
    restart: unless-stopped
    ports:
      - "5678:5678"
    environment:
      - N8N_HOST=n8n.yourdomain.com
      - N8N_PORT=5678
      - N8N_PROTOCOL=https
      - NODE_ENV=production
      - WEBHOOK_URL=https://n8n.yourdomain.com
      - GENERIC_TIMEZONE=Asia/Shanghai
    volumes:
      - ./data:/home/node/.n8n
      - ./files:/files
    networks:
      - homelab

networks:
  homelab:
    external: true

八、监控与运维

Uptime Kuma:服务可用性监控

简洁漂亮的监控面板,支持 HTTP/TCP/DNS/Ping 检测,通过邮件、Telegram、飞书、Discord 等多渠道告警。还能生成公开状态页向用户展示服务健康度。

YAML
# ~/homelab/uptime-kuma/docker-compose.yml
services:
  uptime-kuma:
    image: louislam/uptime-kuma:latest
    restart: unless-stopped
    ports:
      - "3001:3001"
    volumes:
      - ./data:/app/data
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - homelab

networks:
  homelab:
    external: true

Dockge:Docker Compose 可视化管理

Dockge 是 Uptime Kuma 作者的新作,专门为 Docker Compose 栈设计的管理面板。与 Portainer 不同,Dockge 专注于 Compose 文件编辑、启动/停止/更新、日志查看。

YAML
# ~/homelab/dockge/docker-compose.yml
services:
  dockge:
    image: louislam/dockge:latest
    restart: unless-stopped
    ports:
      - "5001:5001"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./data:/app/data
      - /home/$USER/homelab:/home/$USER/homelab  # 管理你的 compose 目录
    environment:
      - DOCKGE_STACKS_DIR=/home/$USER/homelab
    networks:
      - homelab

networks:
  homelab:
    external: true

Portainer(备选):容器全功能管理面板

如果你需要管理 Swarm 集群、镜像仓库、网络配置等更高级的 Docker 功能,Portainer 是更全面的选择。

YAML
# ~/homelab/portainer/docker-compose.yml
services:
  portainer:
    image: portainer/portainer-ce:latest
    restart: unless-stopped
    ports:
      - "9000:9000"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./data:/data
    networks:
      - homelab

networks:
  homelab:
    external: true

Dockge vs Portainer

维度DockgePortainer
定位Compose 文件管理器全功能 Docker 面板
Compose 编辑核心功能,内建编辑器支持但不在首屏
集群管理✅ Swarm / K8s
资源占用极低 (~30MB)中等 (~100MB)
推荐个人/家庭 Compose 栈团队/企业/多节点

九、安全加固

自托管意味着你要自己负责安全。以下是 6 条必须遵守的规则:

1. 不要直接暴露端口到公网

YAML
# ❌ 危险:直接暴露 8082 到所有网络接口
ports:
  - "8082:80"

# ✅ 安全:只暴露给 NPM(同一 Docker 网络)
# 不映射端口,只通过 NPM 反向代理访问
expose:
  - "80"

推荐方案:使用 Cloudflare Tunnel 或 Tailscale 做内网穿透,完全避免开放端口。

2. 所有 Web 服务强制 HTTPS

通过 NPM 为每个服务配置域名+SSL,Let’s Encrypt 证书自动续期。

3. 关闭公开注册

Vaultwarden: SIGNUPS_ALLOWED=false
Gitea: 管理后台关闭公开注册
Nextcloud: 关闭「允许用户自行注册」

4. 定期备份

BASH
# 备份所有数据卷
tar -czf homelab-backup-$(date +%Y%m%d).tar.gz ~/homelab/

# 推荐:3-2-1 备份策略
# 3 份副本 + 2 种存储介质 + 1 份异地

5. 保持镜像更新

BASH
# 定期执行
cd ~/homelab
for d in */; do
  cd "$d"
  docker compose pull
  docker compose up -d
  cd ..
done

可以使用 Watchtower 自动更新(但生产环境建议手动审阅更新日志后再操作)。

6. 设置资源限制

防止单个容器吃光所有内存:

YAML
services:
  nextcloud:
    # ...
    deploy:
      resources:
        limits:
          memory: 512M

十、一键启动脚本

把所有服务启动整合到一个脚本:

BASH
#!/bin/bash
# ~/homelab/start-all.sh

SERVICES=(
  npm adguard nextcloud immich jellyfin
  vaultwarden uptime-kuma stirling-pdf
  syncthing dockge navidrome n8n
)

for svc in "${SERVICES[@]}"; do
  if [ -f ~/homelab/$svc/docker-compose.yml ]; then
    echo "▶ Starting $svc..."
    docker compose -f ~/homelab/$svc/docker-compose.yml up -d
  fi
done

echo "✅ All services started."

十一、端口速查表

服务端口用途
Nginx Proxy Manager81反向代理管理后台
AdGuard Home8083DNS 广告拦截管理
Nextcloud8080私有云盘
Immich2283照片管理
Jellyfin8096媒体服务器
Navidrome4533音乐流媒体
Vaultwarden8082密码管理器
Stirling PDF8085PDF 工具箱
n8n5678自动化工作流
Uptime Kuma3001服务监控
Dockge5001Compose 管理器
Portainer9000容器管理面板
Syncthing8384文件同步

十二、按场景推荐起点

不知道从哪开始?按你的核心需求选择入口:

你的需求优先部署
手机照片太多,不想充 iCloudImmich
文件多设备同步Nextcloud 或 Syncthing
看电影追剧Jellyfin
密码记不住Vaultwarden
全家去广告AdGuard Home
担心服务挂了不知道Uptime Kuma
处理敏感 PDF 文件Stirling PDF
「我全都要」NPM → Immich → Jellyfin → Vaultwarden → AdGuard Home

十三、常见坑与避雷

  1. 不要用 root 用户运行容器:使用 PUID=1000PGID=1000 映射为普通用户,防止权限混乱
  2. 数据卷必须持久化:所有 volumes 挂载到宿主机绝对路径,不在容器内存储数据
  3. 不要裸 HTTP 暴露公网:Vaultwarden/Nextcloud 等涉及账号密码的服务,公网访问必须是 HTTPS
  4. Immich 不要用 latest 标签:Immich 更新频繁且有破坏性变更,建议固定版本或使用 release 标签
  5. 数据库密码不要再改:选好强密码后就不要动了,否则所有关联服务都得重新配置
  6. 先装 NPM 再装其他:反向代理是整个栈的入口,第一个部署可以避免后续反复修改

总结

2026 年的自托管生态已经非常成熟。Awesome-Selfhosted 榜单收录了超过 2000 个开源项目,覆盖你能想到的几乎所有场景。本文推荐的 12 个工具是目前社区公认的最佳实践组合

如果你已经有一台 NAS 或 VPS 在跑 Docker,不妨今天就按这个列表挑一个最需要的服务部署试试。第一个容器跑起来之后,后面的就快多了。

版权声明

作者: 易邦

链接: https://blog.e8k.net/posts/docker-selfhosted-tools-2026/

许可证: 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。