场景 A · 两人合伙 / 合租共享订阅
旧做法
密码发微信,改了不同步,分手后还登得上。
新做法
建组织,共享集合放流媒体/工具账号;退出时移出成员并改密。
实践教程
用免费/低成本 VPS、Cloudflare 隧道和 Vaultwarden,搭一套兼容 Bitwarden 官方客户端的密码系统: 个人能用,小团队能按权限共享,数据落在你控制的服务器上。
读完本节约 2 分钟,应能判断:这套方案是什么、适不适合你、最短怎么做。需要细节再往下翻。
在一台云服务器上运行 Vaultwarden(兼容 Bitwarden 协议的轻量服务端), 通过 Cloudflare Tunnel 用你的域名提供 HTTPS 访问; 人用官方 Bitwarden App/浏览器插件,团队用 Organization + Collection 做权限隔离。
| 适合 | 不太适合 |
|---|---|
| 个人或小团队(大约 2–20 人)要统一管密码 | 完全不想碰服务器、域名、备份 |
| 要协作共享账号,又不想在聊天里发明文 | 需要等保/审计报告/厂商 SLA |
| 希望数据在自己机器上,客户端继续用 Bitwarden | 把 1GB 小鸡塞满 VPN 与一堆服务还要求永远稳 |
| 能接受「轻度运维」:备份、升级、偶尔排障 | 只想开通即走、永不看文档 |
https://vault.example.com 是 Vault 登录页| 你的情况 | 建议 |
|---|---|
| 只想判断值不值得 | 读完本「速览」即可 |
| 已有 VPS,只差分发 | 第 5 章 部署与隧道 |
| 页面能开,不会协作分享 | 第 7 章 组织与协作 |
| 怕翻车、关心边界 | 第 9 章 · 第 10 章 |
| 完整照做 | 从 第 3 章 前置准备 顺序往下 |
vault.example.com、you@example.com 等占位符。
请把示例全部换成你自己的域名与账号;不要把 Admin Token、Tunnel Token、主密码发到公开地方。
先对齐「为什么值得做」,再谈怎么装。工具是手段,工作流才是价值。
| 痛点 | 常见失败做法 | 本方案怎么回应 |
|---|---|---|
| 密码到处都是 | 浏览器各记各的、备忘录、Excel | 统一加密保险库 + 多端客户端 |
| 要和别人共享账号 | 群里发明文、口头报密码 | Organization + Collection 权限 |
| 人走了密码还在 | 改不动、不知道有哪些 | 移出成员 + 轮换共享密文 |
| 不信任或付不起协作云 | 继续明文,或强上企业套餐 | 数据在自管 VPS,入口走 Cloudflare |
| 脚本/自动化也要密钥 | 写死在仓库或环境变量长期裸奔 | 可选:机器账号 + CLI 最小权限(进阶) |
三个关键选择:Vaultwarden、Cloudflare Tunnel、默认关闭公开注册。
传统做法是:VPS 安全组放行 80/443,Nginx/Caddy 反代并申请证书。 可行,但攻击面更大,证书与防火墙都要自己盯。 Tunnel 把「对公网开洞」变成「出站连 Cloudflare」,域名与 TLS 在边缘处理,VPS 侧可只暴露 SSH(甚至 SSH 也收紧)。
| 方案 | 优点 | 代价 |
|---|---|---|
| Bitwarden / 1Password 官方云 | 省心、功能全、有 SLA | 订阅费;数据在厂商侧 |
| 自托管 + 公网 443 | 完全自控 | 证书、防火墙、扫描面 |
| 本方案:VW + Tunnel | 自控 + 客户端现成 + 端口策略更干净 | 你要会 Docker/备份;免费 VPS 有额度限制 |
动手前把账号与信息备齐,避免装到一半卡住。
| 项 | 说明 |
|---|---|
| 云厂商账号 | 能创建 Linux 实例;下文以「Always Free 类免费档」叙述,其它 VPS 步骤几乎相同 |
| 域名 | 能在 Cloudflare 添加站点并改 NS(或至少能加 CNAME/隧道路由) |
| Cloudflare | 免费计划通常足够 DNS + Tunnel;进阶可加 Access / WAF |
| SSH 客户端 | 手机可用 Termius 等;电脑用终端即可 |
| 主密码策略 | 管理员主密码要足够强,并尽早开客户端 2FA |
| 第二 Owner(协作) | 避免「一个人离职/失联 → 组织锁死」 |
vault.example.comyou@example.comowner2@example.comAcme Team目标:拿到一台能 SSH 的 Linux,有出网能力。厂商控制台名称会变,以「能力」为准。
sudo apt update(或对应包管理器)确认网络正常。
ssh -i /path/to/your-key.pem ubuntu@YOUR_VPS_IP
完成标志:域名 HTTPS 打开是 Vault 页面;VPS 业务端口不必对全世界打开。
在 VPS 上安装 Docker Engine 与 Compose 插件(以 Ubuntu 为例,具体以官方文档为准):
# 安装 Docker 后验证
docker --version
docker compose version
mkdir -p ~/vaultwarden
cd ~/vaultwarden
准备 compose.yml(示意,按你模板调整):
services:
vaultwarden:
image: vaultwarden/server:latest
restart: unless-stopped
environment:
DOMAIN: "https://vault.example.com"
SIGNUPS_ALLOWED: "false"
ADMIN_TOKEN: "${VW_ADMIN_TOKEN}"
volumes:
- vw-data:/data
# 建议仅监听本机或 compose 网络,不直接映射公网
# ports:
# - "127.0.0.1:8080:80"
cloudflared:
image: cloudflare/cloudflared:latest
restart: unless-stopped
command: tunnel --no-autoupdate run
environment:
TUNNEL_TOKEN: "${CF_TUNNEL_TOKEN}"
depends_on:
- vaultwarden
volumes:
vw-data:
http://vaultwarden:80(服务名)。
若隧道指向宿主机本机端口,则用 http://127.0.0.1:8080 并正确发布端口。
以你实际拓扑为准。
准备 .env(勿提交到公开仓库):
VW_ADMIN_TOKEN=请用 openssl rand -base64 48 生成
CF_TUNNEL_TOKEN=从 Cloudflare Zero Trust 控制台复制
openssl rand -base64 48
.env。vaultHTTP → vaultwarden:80(或你的实际回源地址)cd ~/vaultwarden
docker compose pull
docker compose up -d
docker compose ps
docker compose logs -f --tail=100
# 公网应能打开 Vault(示例域名)
curl -sI https://vault.example.com | head -1
# 本机存活(若映射了 127.0.0.1:8080)
curl -s http://127.0.0.1:8080/alive
完成标志:
https://vault.example.com 看到 Bitwarden/Vaultwarden 界面docker compose ps 中相关容器为 runningADMIN_TOKEN、TUNNEL_TOKEN、主密码属于最高敏感信息。
不要发到群聊、公开 Git、截图不打码。泄露后立刻轮换。
先能登录,再立刻关掉公开注册;客户端改自建服务器地址。
生产基线建议 SIGNUPS_ALLOWED=false(禁止公开注册)。
但「世界上第一个用户」有时会卡住:没有用户就无法登录,没有 SMTP 就收不到邀请邮件。
可行路径(选一):
SIGNUPS_ALLOWED 改为 true,
docker compose up -d 重建/重载后注册管理员,再改回 false 并重启。
/admin + Admin Token 进入管理后台发送邀请
(需要 SMTP 时邮件才到;部分情况可配合邀请链接流程,以你版本文档为准)。
SIGNUPS_ALLOWED=false 并确认生效,避免被扫成「公开注册的密码站」。
https://vault.example.com/adminADMIN_TOKEN 登录https://vault.example.com(不要多写路径)。协作价值从 Organization 开始;权限靠 Collection / Group,而不是「一个大杂烩库」。
https://vault.example.com| 集合 | 放什么 | 谁碰 |
|---|---|---|
infra-prod |
生产服务器、云控制台、数据库 | 仅核心运维读写 |
infra-dev |
测试/开发环境 | 运维 + 工程师 |
services-shared |
共用 SaaS、订阅、工具账号 | 多数人只读,少数人可写 |
agents-ci(可选) |
CI/脚本用 Token | 对应机器账号只读 |
优先「人 → 加入 Group → Group 拥有 Collection 权限」,少给个人直接绑一堆例外。
core-ops:生产相关读写engineers:开发相关 + 共享服务everyone:共享服务只读入职:邀请 → 注册并开 2FA → 加入 Group → 确认可见集合符合预期。
离职:
装好只是一半;下面这些故事才是方案要传递的价值。
旧做法
密码发微信,改了不同步,分手后还登得上。
新做法
建组织,共享集合放流媒体/工具账号;退出时移出成员并改密。
旧做法
root 密码口头相传,新同事进组就「先用这个」。
新做法
infra-prod 仅核心组;开发只碰 infra-dev;人员变动改集合权限而不是改群公告。
旧做法
路由器密码写在纸条或老人手机备忘录。
新做法
家庭组织 + 只读集合;小孩/长辈客户端只看得到该看的,主管理仍在你这。
旧做法
项目结束仍留在共享文档里。
新做法
到期移出 Org,轮换项目相关密码;权限有时间感。
旧做法
浏览器不同步,关键密码靠猜。
新做法
官方客户端 + 自建 URL + 2FA,新设备登录即同步。
原则
单独机器账号,只读某一个集合;用 Bitwarden CLI(bw)短期 unlock 取密。
不要把生产管理员主密码塞进 CI。
能上线不算成功;能恢复、能升级、少裸奔才算。
compose.yml / .env 的私密离线副本(注意 .env 含密钥)cd ~/vaultwarden
docker compose stop vaultwarden
# 备份命名卷或绑定目录,例如:
# docker run --rm -v vw-data:/data -v "$PWD:/backup" alpine \
# tar czf /backup/vw-$(date +%F).tar.gz -C /data .
docker compose start vaultwarden
cd ~/vaultwarden
docker compose pull
docker compose up -d
docker compose ps
升级前先备份;关注 Vaultwarden 发行说明中的破坏性变更。
/admin自托管的「便宜」往往用时间与责任换。写清楚,读者才不会被教程卖惨或卖安利。
| 维度 | 自托管本方案 | 官方云密码库 |
|---|---|---|
| 金钱 | VPS 可免费档 + 域名;时间成本更高 | 按人/月订阅,省运维时间 |
| 数据位置 | 在你的 VPS / 备份桶 | 在厂商基础设施 |
| 可用性 | 取决于你的机器、隧道、你是否在线救火 | 通常更高,有状态页与支持 |
| 协作权限 | Org/Collection 够用小团队 | 企业功能往往更全 |
| 合规 | 需自证流程,本教程不构成合规结论 | 厂商可能提供认证材料 |
cloudflared 日志vaultwarden 是否在跑:docker compose ps这是 SIGNUPS_ALLOWED=false 的预期行为。首用户用临时开放或邀请流程;完成后保持关闭。
多半未配置 SMTP 或邮件进垃圾箱。先保证 Admin/SMTP 配置正确;过渡期可用临时注册策略。
请到 Web Vault 用户界面创建。Admin 是运维面板。
许多客户端需先保存条目,再从条目菜单「附件/Attachments」管理。以你使用的客户端版本为准。
仅 Vaultwarden + cloudflared 通常可以。若再叠加重服务,先加监控,不够再升级规格。
技术上可以,但请配套:双 Owner、2FA、备份演练、入离职流程。关键生产权限仍建议最小化。
| 词 | 含义 |
|---|---|
| Vaultwarden | 兼容 Bitwarden API 的自托管服务端实现 |
| Web Vault | 浏览器里的密码库界面(用户侧) |
| Admin | 服务端管理面板 /admin |
| Organization | 组织,协作与共享的容器 |
| Collection | 集合,组织内权限边界单位 |
| Tunnel | Cloudflare 出站隧道,暴露内网 HTTP 服务 |
| 主密码 | 解锁保险库的密钥派生口令,服务端也不应「知道明文」 |
cd ~/vaultwarden
docker compose up -d
docker compose logs -f --tail=200
docker compose pull && docker compose up -d
docker compose ps
curl -s http://127.0.0.1:8080/alive