项目:CloudLab 云平台 · 服务 2(第一个真实业务服务)
环境:华为云 Flexus L 实例 · 2核2G · CentOS 7.9
访问地址:https://vault.cloud321.cloud
日期:2026-10-18
一、项目介绍:Vaultwarden 是什么
Vaultwarden 是一个自托管密码管理器,是 Bitwarden 官方服务端的 Rust 重写版本,兼容所有 Bitwarden 官方客户端(浏览器扩展、手机 App、桌面端)。
它解决什么问题
密码太多记不住,记在纸上/浏览器里不安全。密码管理器可以:
- 把所有网站密码加密存储
- 浏览器自动填充
- 生成随机强密码
- 多设备同步
核心安全机制:零知识架构
这是 Vaultwarden 最关键的设计——服务器永远看不到明文密码:
手机/电脑客户端
↓ 输入主密码
↓ 本地用 AES-256 加密所有密码
↓ 只把加密后的密文发给服务器
Vaultwarden 服务器
↓ 只存密文,不知道主密码,解不开任何数据
即使服务器被入侵,攻击者拿到的也只是加密数据,没有主密码根本解不开。
Vaultwarden vs Bitwarden 官方
| 对比 | Vaultwarden | Bitwarden 官方 |
|---|---|---|
| 数据存储 | 存在自己服务器 | 存在 Bitwarden 云 |
| 资源占用 | 极轻(~10MB 内存) | 官方服务端较重 |
| 客户端 | 兼容官方客户端 | 官方客户端 |
| 费用 | 服务器费用 | 基础免费 |
为什么自托管:数据完全自己掌控,同时部署过程是很好的运维项目。
二、要做什么(任务清单)
| 步骤 | 任务 |
|---|---|
| 1 | 创建 Vaultwarden 目录和配置文件 |
| 2 | 启动容器 |
| 3 | 放行 8080 端口 |
| 4 | 解决 HTTPS 安全上下文问题(购买域名 + 解析) |
| 5 | 在 NPM 中配置反代和 HTTPS 证书 |
| 6 | 注册自己的账号 |
| 7 | 关闭公开注册(安全加固) |
最终效果:
- 通过 https://vault.cloud321.cloud 访问密码管理
- 浏览器扩展/手机 App 可连接同步
三、可能遇到的问题(预先了解)
| 问题 | 原因 | 解决 |
|---|---|---|
no configuration file |
在错误目录执行 docker-compose | cd 到含 yml 的目录 |
| curl 返回 000 | 容器没启动 | 检查配置文件并启动 |
| 8080 访问超时 | 端口未放行 | iptables + 安全组放行 |
| 提示非安全上下文 | HTTP 下 Web Crypto 受限 | 配置域名 + HTTPS |
| ping 域名失败 | DNS 缓存/解析未生效 | nslookup 验证,flushdns |
四、实际部署过程
4.1 第一次部署:在错误目录执行
最开始没有先创建配置文件,直接在 /etc/yum.repos.d 目录执行:
docker-compose ps
报错:
no configuration file provided: not found
根因:docker-compose 必须在包含 docker-compose.yml 的目录下运行,它默认在当前目录找配置文件。
用 curl 测试端口:
curl -s -o /dev/null -w "%{http_code}" http://localhost:8080
# 000
000 表示连接失败(不是 HTTP 状态码,也不是重定向),因为容器根本没启动、8080 没有服务在监听。
4.2 重新创建配置并启动
# 创建目录并进入
mkdir -p /opt/cloudlab/vaultwarden
cd /opt/cloudlab/vaultwarden
# 创建配置文件
cat > docker-compose.yml << 'EOF'
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
ports:
- '8080:80'
volumes:
- ./data:/data
environment:
- SIGNUPS_ALLOWED=true
- WEBSOCKET_ENABLED=true
EOF
# 启动
docker-compose up -d
启动结果:
[+] Running 6/6
✔ vaultwarden Pulled (5.9s)
✔ Container vaultwarden Started
验证:
docker-compose ps
结果:
NAME IMAGE STATUS PORTS
vaultwarden vaultwarden/server:latest Up (health: starting) 0.0.0.0:8080->80/tcp
配置逐项说明
| 配置 | 说明 |
|---|---|
ports: 8080:80 |
容器内 80 端口映射到宿主机 8080 |
volumes: ./data:/data |
密码数据库持久化 |
SIGNUPS_ALLOWED=true |
先开放注册,注册完账号后改成 false |
WEBSOCKET_ENABLED=true |
启用实时同步(反代需配 WebSocket) |
4.3 8080 端口访问超时
现象:浏览器访问 http://ipv4:8080 提示响应时间过长。
根因:8080 端口没有在 iptables 和华为云安全组放行。
解决:
iptables -I INPUT -p tcp --dport 8080 -j ACCEPT
service iptables save
华为云安全组入方向同时添加 8080 端口。
4.4 HTTPS 安全上下文问题
端口放行后能打开网页,但出现提示:
没使用安全上下文,而 API 的正常运行需要使用 HTTPS
根因:Vaultwarden 使用浏览器的 Web Crypto API 做客户端加密,现代浏览器要求安全上下文(HTTPS 或 localhost),纯 HTTP 下加密 API 被限制。
要解决必须配置 HTTPS,而 HTTPS 证书需要一个域名,所以接下来要购买域名并配置反代。
4.5 购买域名
个人持有 vs 企业持有:
- 个人持有:身份证认证,可做个人备案,适合个人项目
- 企业持有:营业执照认证,可做经营性网站
选择个人持有(个人运维项目完全够用,以后可过户)。
后缀选择(首年/续费):
- .top:14 / 39(性价比高)
- .cn:29-38 / 35
- .com:35-76 / 70-80(最通用)
- 注意避坑:.site 首年 12 但续费 125
最终选择域名:cloud321.cloud
优惠口令主要用于续费,首年注册用不上,直接在活动页下单即可。
4.6 域名解析
在阿里云域名控制台配置:
泛解析(所有子域名生效):
| 记录类型 | 主机记录 | 记录值 |
|---|---|---|
| A | * |
ipv4 |
根域名:
| 记录类型 | 主机记录 | 记录值 |
|---|---|---|
| A | @ |
ipv4 |
泛解析让 vault.、status.、blog. 等所有子域名自动指向服务器。
验证:
nslookup vault.cloud321.cloud 223.5.5.5
# Address: ipv4
直接查阿里 DNS(223.5.5.5)绕过本地缓存。本地 ping 不到可执行
ipconfig /flushdns刷新。
4.7 在 NPM 中配置反代 + HTTPS
登录 NPM 管理后台(http://ipv4:81)→ Proxy Hosts → Add Proxy Host。
Details 标签页:
| 配置 | 值 |
|---|---|
| Domain Names | vault.cloud321.cloud |
| Scheme | http |
| Forward Hostname/IP | 172.17.0.1 |
| Forward Port | 8080 |
| Block Common Exploits | 勾选 |
172.17.0.1是 Docker 网桥网关,NPM 容器通过它访问宿主机上的 8080 端口。
SSL 标签页:
| 配置 | 值 |
|---|---|
| SSL Certificate | Request a new SSL Certificate |
| Force SSL | 勾选 |
| HTTP/2 Support | 勾选 |
| Websockets Support | 勾选(实时同步需要) |
| 填邮箱 | |
| I Agree | 勾选 |
保存后 NPM 自动向 Let's Encrypt 申请证书并完成配置。
4.8 验证 HTTPS 并注册账号
浏览器访问 https://vault.cloud321.cloud:
- 首次加载稍慢(HTTPS 握手)
- 出现 Vaultwarden 登录页
- 地址栏显示小锁
点"创建账号",输入邮箱 + 强主密码(12 位以上,大小写+数字+符号),注册后登录。
4.9 关闭公开注册
自己注册完成后,为防止陌生人注册,修改配置:
cd /opt/cloudlab/vaultwarden
sed -i 's/SIGNUPS_ALLOWED=true/SIGNUPS_ALLOWED=false/' docker-compose.yml
docker-compose up -d
现在只有你的账号能登录。
五、客户端配置(后续完成)
Vaultwarden 兼容 Bitwarden 官方客户端:
- 浏览器扩展(Chrome/Edge/Firefox 搜 Bitwarden)
- 手机 App
- 桌面端
关键:登录前在设置里把服务器地址改成 https://vault.cloud321.cloud,否则会连到官方服务器。
六、验证清单
# 1. 容器运行(Up)
cd /opt/cloudlab/vaultwarden
docker-compose ps
# 2. 确认已关闭注册
grep SIGNUPS_ALLOWED docker-compose.yml
# SIGNUPS_ALLOWED=false
# 3. 浏览器访问
# https://vault.cloud321.cloud(地址栏小锁)
七、踩坑记录
| 问题 | 报错 | 根因 | 解决 |
|---|---|---|---|
| 找不到配置 | no configuration file | 在错误目录执行 | cd 到项目目录 |
| 端口连不上 | curl 000 | 容器没启动 | 创建配置并启动 |
| 8080 超时 | 无响应 | 端口未放行 | iptables+安全组 |
| 非安全上下文 | HTTPS 警告 | HTTP 下 Web Crypto 受限 | 配域名+HTTPS |
| WebSocket 不工作 | 同步失败 | 反代没开 WebSocket | NPM 勾选 Websockets |
| ping 域名失败 | 找不到主机 | 本地 DNS 缓存 | nslookup验证,flushdns |
八、下一步
Vaultwarden 密码服务完成,接下来部署 Uptime Kuma 服务状态监控(公开状态页,给面试官看),流程类似:容器启动 → 放行端口 → NPM 反代 + HTTPS。
九、面试话术
"我在云平台上部署了 Vaultwarden 自托管密码管理器,它采用零知识架构,密码在客户端用 AES-256 加密,服务器只存密文,即使被入侵也无法解密。我通过 docker-compose 部署,配置了数据卷持久化和 WebSocket 实时同步;为了让浏览器的 Web Crypto API 正常工作,我购买了域名并通过 Nginx Proxy Manager 配置了 Let's Encrypt HTTPS 证书;注册账号后关闭了公开注册做安全加固。过程中解决了目录错误、端口放行、安全上下文、WebSocket 代理等问题。"
评论