【网盘密码 01】用 VPS 打造私有云全家桶:搭建 Nextcloud 网盘与 20MB 内存的 Vaultwarden 密码库
2026-08-14 · DevCraft Studio
不想给 iCloud、Dropbox 和 Bitwarden 交订阅费?用一台便宜 VPS,搭配 Nextcloud 和 Vaultwarden 把网盘和密码库都建在自己手里。本文用大白话讲清动机、轻量原理和基于 Docker 的部署。
网盘与密码自托管 · 共 2 篇
最近几年,我把自己的数字生活一点点搬到自建服务上,说实话…体验比想象中好太多了。这篇就当朋友之间聊天,跟你聊聊怎么用一台便宜 VPS,搭一套最实用的「私有云全家桶」:一个自己的网盘(Nextcloud),加一个自己的密码库(Vaultwarden)。
先说清楚,我不是来跟你推销什么的。自托管有它的麻烦和取舍,下面都会摊开讲。但如果你也跟我一样,不太想每月给各家 SaaS 交"保护费",又想让数据真正攥在自己手里,那这套方案值得一试。
延伸阅读
更多相关攻略推荐:连云厂商也看不到你的数据?机密计算(Confidential Com、被割裂的"云上互联网":数据主权(GDPR)、本地化存储与主权云(S、为什么你自己 VPS 发的邮件总进垃圾箱?邮件协议(SPF、DKIM、百兆带宽如何流畅看 4K?视频切片(HLS/DASH)、AVIF 压、告别繁琐密码:OAuth 2.0、SSO 单点登录与 Passkey。
为什么要自建?把数字资产攥回自己手里
我们平时用的这些服务,其实都在"租":
- iCloud / Dropbox 存文件,空间稍微大一点月费就蹭蹭涨;
- Bitwarden 免费版够用,但高级功能(比如 TOTP 二步验证存储、加密文件附件)要交年费;
- 更关键的是,你的数据躺在别人服务器上,哪天账号被封、服务商改政策、或者单纯想导出,都挺被动。
说白了,自建的核心动机就两条:省钱 和 掌控感。你把东西放在自己买的 VPS 上,机器是你租的,硬盘是你买的,数据是你存的,谁也动不了。
但咱也得讲实话,自托管不是只有好处:
- 你得自己负责备份,服务商不会帮你兜底;
- 软件要自己更新,安全漏洞要自己盯;
- 出问题得自己排查,没有客服 24 小时救你。
所以我的态度一直很朴素:把重要但不敏感的东西放自建服务(网盘、密码库、笔记),把真正离了就活不了的(比如主邮箱、关键身份)还是交给靠谱大厂。 这样既有掌控感,又不至于半夜被自己服务器搞崩溃。
先说结论:这套全家桶到底要什么配置
很多人一听"网盘 + 密码库"就觉得得整台大机器。其实真不用。
- Nextcloud:吃内存的主要是 PHP 和数据库。1GB 内存的机器能跑,但会紧巴巴;建议 2GB 内存跑得比较舒服,配合外部数据库(MariaDB)和 Redis 缓存会更稳。
- Vaultwarden:这是重头戏,它闲时只占 大约 20MB 内存,官方 Bitwarden 服务端要 2GB 起步——差了快一百倍。
所以一台 2GB 内存、1~2 核、40GB SSD 的便宜 VPS,就足够把这两个服务都稳稳跑起来。像 RackNerd、ColoCrossing 这类商家,这种配置年付也就几十块钱。下面我按这个配置来讲。
Nextcloud:你的私有云网盘
它能干嘛
Nextcloud 你可以理解成"开源版 iCloud + 轻度版 Google Drive"。装上之后你能:
- 文件同步:手机、电脑装个客户端,文件夹自动双向同步,跟 Dropbox 一个体验;
- 在线预览与编辑:网页端直接看文档、图片,甚至用内置的 Office(Collabora/OnlyOffice,可选装)改 Word/Excel;
- 相册备份:手机照片自动上传,相当于自己的 Google 相册;
- 扩展生态:日历、通讯录、笔记、密码管理……插件市场里一堆,按需装。
为什么低配 VPS 也能跑
Nextcloud 本体是个 PHP 应用 + 数据库。它默认用 SQLite 也能跑(仅限测试),但正经用建议上 MariaDB 或 PostgreSQL 当数据库,再挂个 Redis 做缓存,这样日常操作会快很多。
关键点在于:它不需要什么高端硬件。官方 Docker 镜像给的 PHP 内存上限默认是 512M,如果你内存紧,可以自己调小到 256M。数据库和 Redis 都跑在独立的轻量容器里,加起来的内存开销对 2GB 的机器来说完全可控。
用 Docker 一键跑起来
最省事的办法是 docker-compose。下面这个配置是我自己一直在用的简化版,把数据库、缓存、应用三个容器串起来:
services:
db:
image: mariadb:lts
restart: always
command: --transaction-isolation=READ-COMMITTED --innodb-buffer-pool-size=64M
volumes:
- db:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=换成你自己的强密码
- MYSQL_PASSWORD=换成你自己的强密码
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
redis:
image: redis:alpine
restart: always
app:
image: nextcloud:apache
restart: always
ports:
- 8080:80
depends_on:
- db
- redis
volumes:
- nextcloud:/var/www/html
environment:
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
- MYSQL_PASSWORD=换成你自己的强密码
- MYSQL_HOST=db
- REDIS_HOST=redis
- PHP_MEMORY_LIMIT=512M
- NEXTCLOUD_ADMIN_USER=admin
- NEXTCLOUD_ADMIN_PASSWORD=换成你的管理员密码
- NEXTCLOUD_TRUSTED_DOMAINS=你的域名或IP
volumes:
nextcloud:
db:把这段存成 compose.yaml,在同级目录执行:
docker compose up -d等个一两分钟,浏览器打开 http://你的服务器IP:8080 就能看到登录页了。后面想映射到域名 + HTTPS,在前面套一层 Nginx/Caddy 反代就行,这里不展开。
几点小提醒:
- 数据库密码、管理员密码一定用强密码,别用我写的占位符;
- 默认
PHP_MEMORY_LIMIT=512M,1GB 小机器可以把 app 单独跑、数据库换成更省的 SQLite,但体验会打折; - 文件真正存哪?在
nextcloud这个 volume 里,备份时直接打包它就行。
资源建议一句话总结
想舒服就 2GB 内存 + 外部数据库 + Redis;只想先试水、机器只有 1GB,用默认 SQLite 也能跑起来,只是别指望多流畅。
Vaultwarden:只占 20MB 内存的密码库
它到底是啥
Vaultwarden 是一个用 Rust 重写的 Bitwarden 服务端。说白了,它就是"开源、轻量的 Bitwarden"。你手机、浏览器、电脑上装的还是官方 Bitwarden 客户端,只是把"密码存在哪台服务器"从 Bitwarden 官方换成了你自己的 VPS。
为什么它能在 20MB 内存上跑?
这才是它最香的地方。对比一下就很清楚了:
- 官方 Bitwarden 服务端是 .NET 技术栈 + Microsoft SQL Server 数据库,光数据库就要吃掉 2GB 内存,整套得 4GB 内存的机器才跑得动;
- Vaultwarden 是 Rust 写的,默认用 SQLite 单文件数据库(也支持 MySQL/PostgreSQL),没有一堆微服务、没有重型数据库。
Rust 本身内存开销极低,SQLite 又是个轻量到极致的嵌入式数据库,再加上它把官方那些企业级用不上的功能(SCIM、目录同步、企业 SSO)都砍了,所以闲时内存占用通常只有 20~50MB,跑上百个用户也很难超过 200MB。社区里甚至有人把它装在树莓派、路由器的 512MB 小机器上。
一句话:它不是"将就将就也能跑",而是天生就为小机器设计的。
用 Docker 部署
同样用 docker-compose,非常简单:
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
environment:
- DOMAIN=https://你的域名
- WEBSOCKET_ENABLED=true
- SIGNUPS_ALLOWED=false
volumes:
- ./vw-data/:/data/
ports:
- 127.0.0.1:8000:80存成 compose.yaml,然后:
docker compose up -d这里有个必须注意的点:Bitwarden 网页端用了 Web Crypto API,这个 API 要求 HTTPS 安全上下文。也就是说,Vaultwarden 必须走 HTTPS 才能用网页版。上面我把端口只绑定在 127.0.0.1:8000,就是建议你前面再套一层带 SSL 的反代(Nginx 或 Caddy),用免费证书把 https://你的域名 指过来。
另外两个环境变量说明一下:
SIGNUPS_ALLOWED=false:部署完、你自己注册好账号后,建议关掉注册,免得被陌生人扫到你的密码库;DOMAIN:填你最终访问的 HTTPS 地址,客户端同步要用它。
全平台同步是怎么实现的
客户端这一层你零成本:去官网下 Bitwarden 的浏览器插件、手机 App、桌面端,登录时在设置里把"服务器 URL"改成你的域名,剩下的体验和用官方一模一样——多设备自动同步、自动填充、TOTP 二步验证、加密附件、Send 临时分享,全都有,而且这些在官方是付费功能,在 Vaultwarden 里全免费。
密码在到你服务器之前,客户端就已经用 AES-256 加密好了,服务器存的只是密文。所以哪怕有人拿到你数据库文件,没主密码也解不开。这点跟官方 Bitwarden 的加密模型完全一致。
别忘了备份:用 Rclone 把数据异地存一份
自托管最大的坑不是部署,是忘了备份。机器被商家回收、硬盘坏掉、手滑 rm -rf,数据就没了。我的习惯是:本地一份 + 异地一份。
异地备份用 Rclone 最方便。它支持 70 多种存储后端(Google Drive、OneDrive、Backblaze B2、Cloudflare R2、阿里云 OSS、腾讯云 COS……),被称为"云存储的瑞士军刀"。
先配置一个远程存储:
rclone config按交互提示选 "New remote",跟着选你要的后端(比如 Google Drive、B2)授权好,给它起个名字比如 remote。
然后,把你 Nextcloud 的数据卷和 Vaultwarden 的数据目录一起同步过去:
# 备份 Nextcloud 数据卷(先停服务或靠 SQLite 一致性,简单起见打包目录)
docker run --rm -v nextcloud_nextcloud:/data -v $(pwd):/backup alpine tar czf /backup/nextcloud-$(date +%F).tar.gz -C /data .
# 用 rclone 推到异地
rclone copy /backup/ remote:我的VPS备份/nextcloud --delete-afterVaultwarden 的 SQLite 库可以直接在线备份,不用停机:
# 用 sqlite3 在线热备(容器里自带)
docker exec vaultwarden sqlite3 /data/db.sqlite3 ".backup '/data/db-backup.sqlite3'"
rclone copy ./vw-data/ remote:我的VPS备份/vaultwarden最后把它做成定时任务,每天凌晨跑一次:
crontab -e
# 每天 3 点执行备份脚本
0 3 * * * /root/backup.sh >> /var/log/selfhost-backup.log 2>&1一个小忠告:备份做完一定要试一次恢复。没恢复过的备份等于没备份,这是自托管圈子里最常踩的坑。Rclone 传的时候会校验 MD5/SHA1 哈希,还支持断点续传和加密(Crypt 后端),安全性够用,省心。
一个收尾的小提醒
把网盘和密码库都放一台 VPS 上,等于"鸡蛋放一个篮子"。所以除了异地备份,还有两件事建议你顺手做:
- 开防火墙,只放行 80/443/22,数据库、Vaultwarden 的 8000 这些端口别暴露在公网;
- 勤更新,Docker 镜像隔三差五拉一次
docker compose pull && docker compose up -d,安全补丁别拖。
另外,密码库是最高敏感数据,Vaultwarden 的 ADMIN_TOKEN 建议设一个强口令,平时甚至可以关掉管理后台,只留同步。
结论
用一台 2GB 内存的便宜 VPS,你就能把"网盘 + 密码库"这两块最日常的云服务,从别人手里搬回自己手里:Nextcloud 负责文件同步、相册备份和在线预览,Vaultwarden 用 20MB 出头的内存给你全平台密码同步——而且官方收费的功能它都免费。
麻烦是有的:备份、更新、排查都得自己来。但换个角度想,每个月省下的订阅费,加上"数据真正属于我"那份踏实,挺值。先从一台年付几十块的 RackNerd / ColoCrossing 机器起步,跑通这套全家桶,你就再也回不去到处交订阅费的日子了。