主题模式
Are you an LLM? You can read better optimized documentation at /fe/docker/self-hosted-stack.md for this page in Markdown format
Docker Compose 自托管服务部署合集:从零搭建你的 Homelab
买了 VPS 或小主机,除了跑代理还能做什么?答案是:自托管一切。密码管理、影音中心、网盘挂载、AI 聊天、服务监控……全都可以用 Docker Compose 一键部署,不依赖任何第三方云服务。
本文按从底层到上层的顺序,带你搭建一个完整的 Homelab 服务栈。
前置准备
确保你的服务器已经安装 Docker 和 Docker Compose。参考 Docker 安装教程 和 Docker Compose 模板库。
创建项目目录
sh
mkdir -p /opt/homelab && cd /opt/homelab后续所有 docker-compose.yml 都放在这个目录下(或子目录中)。
Docker 镜像源配置
国内拉 Docker 镜像经常卡。先配置镜像源加速,参考 Docker 镜像源配置。
第一层:基础设施
基础设施层是所有上层服务运行的前提——反向代理、容器管理、自动更新。
1. Nginx Proxy Manager — 反向代理 + SSL
为什么需要反向代理?因为你的服务会越来越多,每个服务分配一个子域名(如 jellyfin.example.com、uptime.example.com),NPM 统一处理 HTTPS 证书和路由转发。
yaml
# nginx-proxy-manager/docker-compose.yml
services:
npm:
image: jc21/nginx-proxy-manager:latest
container_name: npm
restart: unless-stopped
ports:
- '80:80' # HTTP
- '81:81' # 管理界面
- '443:443' # HTTPS
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt配置步骤:
- 访问
http://你的IP:81进入管理界面 - 默认账号:
[email protected]/changeme - 添加 Proxy Host:转发子域名到对应服务的内部端口
- 开启 SSL:Let's Encrypt 自动申请免费证书
💡 配合 Cloudflare Tunnel 使用
如果你没有公网 IP,可以用 Cloudflare Tunnel 替代 NPM 的公网暴露功能。Tunnel 不需要开放端口,安全性更高。
2. Portainer — 容器管理面板
网页端管理 Docker 容器,比命令行直观多了。
yaml
# portainer/docker-compose.yml
services:
portainer:
image: portainer/portainer-ce:latest
container_name: portainer
restart: unless-stopped
ports:
- '9443:9443'
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./data:/data访问 https://你的IP:9443,首次设置管理员密码即可使用。
3. Watchtower — 自动更新容器
自动检测镜像更新并重启容器,省去手动维护。
yaml
# watchtower/docker-compose.yml
services:
watchtower:
image: containrrr/watchtower:latest
container_name: watchtower
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- WATCHTOWER_CLEANUP=true # 删除旧镜像
- WATCHTOWER_SCHEDULE=0 0 4 * * * # 每天凌晨4点检查更新第二层:媒体服务
媒体层是 Homelab 最常用的功能——看电影、听音乐、管理文件。
4. Jellyfin — 开源影音中心
Emby/Jellyfin/Plex 三选一,Jellyfin 完全开源免费。
yaml
# jellyfin/docker-compose.yml
services:
jellyfin:
image: jellyfin/jellyfin:latest
container_name: jellyfin
restart: unless-stopped
ports:
- '8096:8096' # Web 界面
- '8920:8920' # HTTPS(可选)
volumes:
- ./config:/config
- ./cache:/cache
- /media/movies:/data/movies # 电影目录
- /media/tv:/data/tvshows # 电视剧目录
- /media/music:/data/music # 音乐目录
devices:
- /dev/dri:/dev/dri # 硬件解码(N100/Intel GPU)💡 N100 硬件解码
Jellyfin 配合 Intel N100 的 QuickSync 硬解,4K 视频转码功耗只有 10W。需要在 PVE 中把 GPU 直通给 Docker 容器。参考 N100 家庭服务器搭建。
5. Alist — 网盘挂载神器
把阿里云盘、百度网盘、OneDrive 等 30+ 网盘统一挂载,通过 Web 界面浏览和下载。
yaml
# alist/docker-compose.yml
services:
alist:
image: xhofe/alist:latest
container_name: alist
restart: unless-stopped
ports:
- '5244:5244'
volumes:
- ./data:/opt/alist/data
environment:
- PUID=0
- PGID=0首次访问 http://你的IP:5244,管理员密码查看日志:
sh
docker logs alist | grep password6. Navidrome — 音乐服务器
轻量级 Subsonic 兼容音乐服务器,界面美观。
yaml
# navidrome/docker-compose.yml
services:
navidrome:
image: deluan/navidrome:latest
container_name: navidrome
restart: unless-stopped
ports:
- '4533:4533'
volumes:
- ./data:/data
- /media/music:/music:ro
environment:
- ND_LOGLEVEL=info
- ND_SESSIONTIMEOUT=24h7. qBittorrent — BT 下载工具
yaml
# qbittorrent/docker-compose.yml
services:
qbittorrent:
image: linuxserver/qbittorrent:latest
container_name: qbittorrent
restart: unless-stopped
ports:
- '8080:8080' # Web 界面
- '6881:6881' # BT 端口
- '6881:6881/udp'
volumes:
- ./config:/config
- /downloads:/downloads
environment:
- PUID=1000
- PGID=1000
- WEBUI_PORT=8080第三层:工具服务
8. Vaultwarden — 密码管理
Bitwarden 的轻量版,自托管密码管理器。浏览器插件 + 手机 App + 网页端三端同步。
yaml
# vaultwarden/docker-compose.yml
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
ports:
- '8222:80'
volumes:
- ./data:/data
environment:
- ADMIN_TOKEN=你的管理密码Hash # 可用 argon2 生成
- SIGNUPS_ALLOWED=true # 首次开启注册,之后改为 false⚠️ 安全提示
Vaultwarden 必须走 HTTPS(通过 NPM 配置 SSL)。密码管理器在 HTTP 下传输有泄露风险。注册完自己的账号后,建议立即关闭注册(SIGNUPS_ALLOWED=false)。
9. Uptime Kuma — 服务监控
监控你所有服务的运行状态,支持 HTTP/TCP/DNS/Push 等多种检测方式。
yaml
# uptime-kuma/docker-compose.yml
services:
uptime-kuma:
image: louislam/uptime-kuma:latest
container_name: uptime-kuma
restart: unless-stopped
ports:
- '3001:3001'
volumes:
- ./data:/app/data访问 http://你的IP:3001,添加监控项即可。支持 Telegram/微信/Discord/邮件 告警通知。
10. Memos — 轻量笔记
Flomo 的开源替代,支持 Markdown、标签、图片。
yaml
# memos/docker-compose.yml
services:
memos:
image: neosmemo/memos:latest
container_name: memos
restart: unless-stopped
ports:
- '5230:5230'
volumes:
- ./data:/var/opt/memos第四层:AI 服务
11. Ollama + Open WebUI — 本地 AI 聊天
在本地跑大模型,数据不泄露。N100 4GB 内存可以跑 7B 模型。
yaml
# ollama/docker-compose.yml
services:
ollama:
image: ollama/ollama:latest
container_name: ollama
restart: unless-stopped
ports:
- '11434:11434'
volumes:
- ./data:/root/.ollama
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
restart: unless-stopped
ports:
- '3000:8080'
volumes:
- ./open-webui-data:/app/backend/data
environment:
- OLLAMA_BASE_URL=http://ollama:11434
depends_on:
- ollama首次使用:
sh
# 拉取模型(在 Ollama 容器内)
docker exec ollama ollama pull qwen2.5:7b # 推荐中文模型
docker exec ollama ollama pull deepseek-coder:6.7b # 编程模型详细配置参考 Ollama 本地部署教程 和 Open WebUI 教程。
12. Dify — AI 应用开发平台
如果你想基于大模型构建 AI 应用(如客服机器人、知识库问答),Dify 是最易用的平台。
yaml
# dify/docker-compose.yml
# Dify 官方提供完整的 docker-compose.yml
# 下载方式:
git clone https://github.com/langgenius/dify.git
cd dify/docker
docker compose up -dDify 自带 Web 界面,访问 http://你的IP 即可使用。
一键部署完整模板
把所有服务合并到一个 docker-compose.yml?不建议。原因:
- 单文件太长,维护困难
- 一个服务挂了影响所有服务
- 无法独立升级/重启
推荐方式:每个服务独立目录 + 独立 compose 文件。
但如果你确实想要一键部署,可以用项目目录结构:
sh
/opt/homelab/
├── nginx-proxy-manager/
│ └── docker-compose.yml
├── portainer/
│ └── docker-compose.yml
├── watchtower/
│ └── docker-compose.yml
├── jellyfin/
│ └── docker-compose.yml
├── alist/
│ └── docker-compose.yml
├── vaultwarden/
│ └── docker-compose.yml
├── uptime-kuma/
│ └── docker-compose.yml
├── memos/
│ └── docker-compose.yml
├── ollama/
│ └── docker-compose.yml
└── .env # 共享环境变量一键启动所有服务:
sh
# 在 /opt/homelab 下
for dir in */; do
cd "$dir" && docker compose up -d && cd ..
done数据备份与迁移方案
备份策略
自托管最大的风险是数据丢失。建议三层备份:
| 层级 | 方案 | 保留时间 | 成本 |
|---|---|---|---|
| 本地快照 | 定期备份数据目录到另一块磁盘 | 最近 7 天 | 零(磁盘空间) |
| 异地备份 | rsync 到另一台服务器 | 最近 30 天 | 另一台 VPS |
| 云端备份 | rclone 上传到 S3/Backblaze | 最近 90 天 | $5/月起 |
备份脚本示例
sh
#!/bin/bash
# /opt/homelab/backup.sh
BACKUP_DIR="/opt/homelab-backups"
DATE=$(date +%Y%m%d)
# 停止服务(可选,保证数据一致性)
# docker compose -f /opt/homelab/vaultwarden/docker-compose.yml down
# 备份各服务数据目录
for dir in /opt/homelab/*/; do
service=$(basename "$dir")
if [ -d "$dir/data" ]; then
tar czf "$BACKUP_DIR/${service}_${DATE}.tar.gz" -C "$dir" data
fi
done
# 清理 7 天前的备份
find "$BACKUP_DIR" -name "*.tar.gz" -mtime +7 -delete
# 重启服务
# docker compose -f /opt/homelab/vaultwarden/docker-compose.yml up -d迁移到新服务器
sh
# 1. 在旧服务器打包所有数据
rsync -avz /opt/homelab/ newserver:/opt/homelab/
# 2. 在新服务器启动所有服务
for dir in /opt/homelab/*/; do
cd "$dir" && docker compose up -d && cd ..
done常见问题
1. 端口冲突怎么办?
多个服务可能使用相同端口(如 8080)。解决方案:
- 修改 compose 文件中的
ports映射 - 使用 NPM 反向代理,所有服务通过子域名访问(不再需要记端口)
2. 内网服务如何暴露到外网?
两种方案:
| 方案 | 适合场景 | 参考 |
|---|---|---|
| NPM + 公网 IP | 有公网 IP 的 VPS | 本文第一层 |
| Cloudflare Tunnel | 无公网 IP / 家庭 NAS | CF Tunnel 教程 |
3. Docker 镜像拉不动?
国内网络拉 Docker Hub 镜像经常失败。配置镜像源加速:Docker 镜像源配置。
4. 内存不够怎么办?
| 服务 | 最低内存 | 推荐内存 |
|---|---|---|
| NPM | 128MB | 256MB |
| Portainer | 128MB | 256MB |
| Jellyfin | 512MB | 1-2GB |
| Alist | 64MB | 128MB |
| Vaultwarden | 32MB | 64MB |
| Uptime Kuma | 64MB | 128MB |
| Ollama (7B) | 4GB | 8GB |
N100 8GB 内存方案:NPM + Portainer + Watchtower + Jellyfin + Alist + Vaultwarden + Uptime Kuma + Memos ≈ 2.5GB,还有 5.5GB 留给 Ollama。
5. 如何在软路由上跑 Docker?
iStoreOS 内置 Docker 支持,可以直接在软路由上部署自托管服务。参考 软路由系统横评。
延伸阅读
- Docker 安装教程 — 环境准备
- Docker Compose 模板库 — 开发服务模板
- Docker 镜像源配置 — 拉镜像加速
- Ollama 本地部署教程 — AI 大模型
- Open WebUI 教程 — AI 聊天界面
- Cloudflare Tunnel 教程 — 无公网 IP 方案
- N100 家庭服务器搭建 — 硬件选购
- Tailscale 异地组网 — 远程访问
