过去两年我用 Docker 跑了 7 个自托管服务,替代了 7 个商业 SaaS。
年成本从约 1200 元降到一台服务器的钱。更重要的是数据完全在自己手里。
1. Vaultwarden — 替代 1Password / Bitwarden 付费版
Bitwarden 的轻量开源实现,Rust 编写,内存占用不到 50MB。
services:
vaultwarden:
image: vaultwarden/server:latest
ports:
- "8080:80"
volumes:
- ./vw-data:/data
environment:
- DOMAIN=https://vault.example.com
- SIGNUPS_ALLOWED=false关键配置:SIGNUPS_ALLOWED=false,关掉公开注册,只允许你自己创建账号。否则任何人都能在你的服务器上注册。
手机端用官方 Bitwarden App,设置里把服务器地址改成你的域名,体验和付费版几乎一样。
2. Gitea — 替代 GitHub Private Repo
轻量 Git 服务,Go 编写,启动不到 2 秒。我的私人代码仓库全在这里。
services:
gitea:
image: gitea/gitea:latest
ports:
- "3000:3000"
- "2222:22"
volumes:
- ./gitea-data:/data
environment:
- GITEA__server__DOMAIN=git.example.com
- GITEA__server__SSH_PORT=2222SSH 端口用 2222 而不是 22,避免和宿主机 SSH 冲突。
3. Nextcloud — 替代 Google Drive / Dropbox
文件同步、共享、在线预览。功能比商业云盘多,但也更重。
services:
nextcloud:
image: nextcloud:latest
ports:
- "8081:80"
volumes:
- ./nc-data:/var/www/html
environment:
- MYSQL_HOST=db
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
- MYSQL_PASSWORD=yourpassword
db:
image: mariadb:latest
environment:
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
- MYSQL_ROOT_PASSWORD=yourrootpassword
volumes:
- ./db-data:/var/lib/mysqlNextcloud 是这些服务里最吃资源的。2GB 内存起步,文件多了以后同步速度会变慢。轻量替代方案考虑 Seafile。
4. n8n — 替代 Zapier
工作流自动化。比 Zapier 灵活,但学习曲线更陡。
services:
n8n:
image: n8nio/n8n:latest
ports:
- "5678:5678"
volumes:
- ./n8n-data:/home/node/.n8n
environment:
- N8N_HOST=flow.example.com
- N8N_PROTOCOL=https
- WEBHOOK_URL=https://flow.example.com/我目前用它自动化三件事:RSS 新文章推送到 Telegram、GitHub Release 通知、每日天气预报。Webhook 触发,免费额度内随便用。
5. Linkding — 替代 Pocket / Raindrop.io
极简书签管理。支持标签、全文搜索、网页存档。
services:
linkding:
image: sissbruecker/linkding:latest
ports:
- "9090:9090"
volumes:
- ./linkding-data:/etc/linkding/data装个浏览器插件,一键保存当前页面。比 Pocket 快,比 Raindrop 轻。
6. Umami — 替代 Google Analytics
隐私友好的网站分析。不追踪用户、不用 Cookie、不需要隐私政策横幅。
services:
umami:
image: ghcr.io/umami-software/umami:postgresql-latest
ports:
- "3001:3000"
environment:
- DATABASE_URL=postgresql://umami:umami@db:5432/umami
- DATABASE_TYPE=postgresql
- APP_SECRET=replace-me-with-a-random-string
db:
image: postgres:16-alpine
environment:
- POSTGRES_DB=umami
- POSTGRES_USER=umami
- POSTGRES_PASSWORD=umami
volumes:
- ./umami-db:/var/lib/postgresql/data我的博客分析就用的 Umami。数据够用,界面清爽,没有 GA 的那些广告和追踪。
7. Homepage — 自托管仪表盘
把上面所有服务集中到一个起始页。
services:
homepage:
image: ghcr.io/benphelps/homepage:latest
ports:
- "3002:3000"
volumes:
- ./homepage-config:/app/configYAML 配置,几行就能加一个服务卡片。打开浏览器第一眼看到所有服务的状态,不用记端口号。
共同踩过的坑
反向代理。 所有服务都需要 HTTPS,用 Nginx Proxy Manager 或 Caddy 统一处理。Caddy 更简单,自动申请 Let’s Encrypt 证书。
数据备份。 Docker volume 不是备份。我写了个脚本,每天把所有 volume 打 tar 包传到另一个位置。下周计划接入 rclone 同步到云存储。
内存。 7 个服务跑在一台 4GB 内存的 VPS 上,Nextcloud 是大头。如果内存紧张,砍 Nextcloud 或者加 swap。
更新。 Watchtower 容器自动拉取最新镜像并重启服务。方便,但生产环境建议手动更新——大版本升级可能有 breaking changes。