说在前面
最近想给自己搭一个密码管理器,选来选去还是 Vaultwarden 最轻量(Bitwarden 的 Rust 版本,省资源)。
我的环境:
- 系统:Ubuntu 22.04(其他 Debian 系也通用)
- 服务器:香港(跑得飞快)
- 域名:
pass.nkcdn.net.cn(随便起的,别笑)
折腾过程中踩了几个坑:docker-compose 找不到、Nginx 报错缺文件、证书权限不对……最后整理出一套严格按顺序的部署方案。
整体顺序(别问为什么,问就是试出来的):
> 装 Nginx → 装 Docker → 部署 Vaultwarden → 宝塔申请证书并写入 pem → 配置 Nginx 反代
下面直接开干。每条命令我都加了注释,你复制粘贴的时候看一眼就行。
一、安装 Nginx
首先更新软件源,然后安装 Nginx。
apt update
apt install -y nginx
设置开机自启并立即启动:
systemctl enable nginx
systemctl start nginx
检查运行状态

systemctl status nginx 输出,显示绿色的 active (running)
systemctl status nginx
如果看到 active (running),恭喜,Nginx 站好了。
二、安装 Docker
使用官方一键脚本安装 Docker(最省事):
curl -fsSL https://get.docker.com | bash
启动 Docker 并设置开机自启:
systemctl enable --now docker
验证版本

docker –version 输出结果
docker --version
如果提示
curl: command not found,先apt install curl -y。
三、部署 Vaultwarden
创建工作目录并进入:
mkdir -p /opt/vaultwarden
cd /opt/vaultwarden
创建 docker-compose.yaml:
nano docker-compose.yaml
粘贴以下内容(注意:SIGNUPS_ALLOWED 我先关掉,防止路人注册):
version: "3"
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
environment:
DOMAIN: "https://pass.nkcdn.net.cn"
SIGNUPS_ALLOWED: "false"
volumes:
- ./vw-data:/data
ports:
- 8000:80
启动容器(注意:这里用 docker compose,不是 docker-compose,新版 Docker 自带):
docker compose up -d
查看容器状态

docker ps 显示 vaultwarden 容器 running
docker ps
如果看到 vaultwarden 在运行,并且端口映射 0.0.0.0:8000->80/tcp,说明 Vaultwarden 已经在后台跑着了。
坑1:如果你用旧版
docker-compose命令报错command not found,就用docker compose(中间是空格)。
四、宝塔面板申请 SSL 证书并写入 pem 文件
这一步放在 Vaultwarden 部署之后,是因为证书和反代可以最后配,但顺序不能乱:先让 Vaultwarden 跑起来,再绑域名、上证书。
4.1 宝塔面板操作(我用的1panel大差不差)
- 登录宝塔面板 → 左侧 网站 → 添加站点
– 域名填:pass.nkcdn.net.cn(你用你自己域名,在dns服务商A解析给你服务器的ip)
– 其他默认,PHP 版本选“纯静态” - 点击域名进入设置 → SSL → 申请免费证书
– 推荐 Let’s Encrypt 或宝塔自带的免费证书
– 勾选域名,点击申请,等几秒就会成功 - 申请成功后,你会看到两段内容:
– 证书(CRT) —— 包含完整证书链
– 私钥(KEY)

宝塔 SSL 界面,显示“已部署”和复制按钮
4.2 在服务器上创建证书目录并写入
不要偷懒直接用宝塔生成的路径,因为 Nginx 后面要读,我们手动放一个干净的位置。
mkdir -p /etc/letsencrypt/live/pass.nkcdn.net.cn/
写入证书链(fullchain):
nano /etc/letsencrypt/live/pass.nkcdn.net.cn/fullchain.pem
将宝塔里复制的 证书(CRT) 内容完整粘贴进去,保存(Ctrl+O, 回车, Ctrl+X)。
写入私钥:
nano /etc/letsencrypt/live/pass.nkcdn.net.cn/privkey.pem
粘贴宝塔里的 私钥(KEY) 内容,保存。
设置严格权限(这一步很多人忘,导致 Nginx 报错 cannot load certificate):
chmod 700 /etc/letsencrypt/live/pass.nkcdn.net.cn/
chmod 600 /etc/letsencrypt/live/pass.nkcdn.net.cn/*.pem
为什么要 600?私钥只能属主读写,避免泄露。
五、配置 Nginx 反向代理
创建 Nginx 站点配置文件:
nano /etc/nginx/sites-available/pass.nkcdn.net.cn
写入以下完整配置(已处理好 HTTP 自动跳转 HTTPS + SSL 证书路径 + 反代 Vaultwarden):
server {
listen 80;
server_name pass.nkcdn.net.cn;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name pass.nkcdn.net.cn;
ssl_certificate /etc/letsencrypt/live/pass.nkcdn.net.cn/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/pass.nkcdn.net.cn/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
启用站点(创建软链接):
ln -s /etc/nginx/sites-available/pass.nkcdn.net.cn /etc/nginx/sites-enabled/
测试 Nginx 配置语法:
nginx -t

nginx -t 输出 syntax ok 和 test successful
如果输出 syntax is ok 和 test is successful,就说明没问题。
如果报错,看下一节的“问题解决”。
重新加载 Nginx:
systemctl reload nginx
六、部署中遇到的问题及解决方法
问题1:docker-compose: command not found
原因:系统没有独立安装 docker-compose,或者 Python 版本不兼容。
解决:直接用 Docker 内置的 docker compose 命令(注意中间是空格)。
验证:docker compose version
问题2:Nginx 报错 cannot load certificate "/etc/letsencrypt/live/.../privkey.pem"
原因:文件不存在,或者权限过大导致 Nginx 无法读取。
解决:
– 确保手动创建了目录并粘贴了内容
– 执行 chmod 600 那两个 pem 文件
– 检查路径是否写错(尤其是域名部分)
问题3:Nginx 报错 no such file or directory: "options-ssl-nginx.conf"
原因:配置文件里引用了 certbot 自动生成的文件,但本机没有安装 certbot。
解决:删掉那两行引用,直接用上面配置里的通用 SSL 参数(我已经帮你删干净了)。
问题4:想关闭公开注册
原因:Vaultwarden 默认允许注册,不安全。
解决:在 docker-compose.yaml 中添加环境变量:
SIGNUPS_ALLOWED: "false"
然后重启容器:
docker compose down
docker compose up -d
七、最终效果
- 浏览器访问
https://pass.nkcdn.net.cn - 看到 Vaultwarden 的登录界面(说明 HTTPS 生效)
- 没有注册入口(因为
SIGNUPS_ALLOWED=false) - 首次访问会让你创建管理员账号(通过
/admin页面,需要设置环境变量ADMIN_TOKEN,这个我下次再写)

浏览器打开 https://pass.nkcdn.net.cn ,地址栏小锁标志,显示 Vaultwarden 登录界面
📖 3. 使用说明
接下来将介绍 Vaultwarden 的基本功能,包括:创建账户、密码库、Send、工具、报告。
3.1 创建账户
首次使用需要先建个账户:

填写邮箱与名称:

设置账户的密码:

登录后的界面如下:

3.2 密码库
Vaultwarden 支持记录的密码类型有:登录、支付卡、身份、笔记、SSH 密钥。以创建“登录”类型为例,点击右上角的「+新增」,选择「登录」,填写相关信息:

新增的密码会出现在密码库中:

登录类型的密码有些额外的操作,可以复制用户名、密码,也可以直接前往:

3.3 Send
某些场景下,我们可能会发送敏感信息。这时候就可以使用 Send 功能,信息将在限制曝光的同时保持端到端加密。

以发送文本为例,填写要分享的文本,然后保存:

选择要发送的 Send,复制链接:

其它人可以直接访问该链接,显示效果如下:

3.4 工具
Vaultwarden 还集成了一些工具,包括:生成器、导入以及导出。这里说说生成器。生成器除了可以生成随机密码,还支持短语和用户名:

3.5 报告
Vaultwarden 的报告可以识别密码库中的安全漏洞。

比如弱密码这里,我加的简单密码就被识别出来了:

4. 写在最后
体验下来,Vaultwarden 部署简单,功能齐全,可以说完全满足了我对密码管理的需求。无论是个人用户还是小型团队,都可以通过它来提高管理密码的效率和安全性。如果你和我一样,平时需要管理大量账密信息,那么 Vaultwarden 可能就是你要的答案。
📷 本文使用说明部分图片引用自知乎专栏 《Vaultwarden 使用指南》,仅供学习参考。
尾巴
整个过程下来,最大的感受就是:顺序别乱,证书权限别忘,反代别写错 upstream。
Vaultwarden 跑起来之后,你就可以把所有密码都交给它了——比存浏览器里安全一百个猫爪印。
如果你也按照这个教程搭好了,欢迎在评论区秀出你的域名。
有问题直接留言,我看到会回。
🐾 —— 喵 ~