私有密码管理器(一)

Naseele 技术工坊 59 次阅读 2142 字 预计阅读时间: 10 分钟 发布于 2025-11-25 最后更新于 2025-12-05


AI 摘要

嘿,小伙伴们!想拥有自己的私人密码保险箱吗?这篇文章手把手教你用Docker部署Vaultwarden(Bitwarden的轻量版)。就像搭积木一样,我们会用Caddy做安全门卫,配置SSL证书,还能开启管理员面板。跟着步骤走,你的密码就能安全地住进专属小别墅啦!下期还会教你怎么自动备份到云端哦~

一、前置准备

linux服务器,caddy(运行在docker容器),已备案域名一个

本来我打算用Bitwarden,我在逛github的时候找到了一个使用rust重构的轻量版本,功能基本一致,star50k,比较靠谱,所以下面我们来部署这个。

二、申请证书

将域名解析到服务器,然后为你的域名申请证书,下载nginx格式的(pem/key),上传到服务器。可以考虑使用二级域名和A解析,具体请自行搜索或者ai。

三、创建目录

项目参考结构如下:

vaultwarden/
 ├── docker-compose.yml
 ├── Caddyfile
 ├── caddy_data/ 
 ├── caddy_certs/ # 存放证书 
 └── caddy_config/

四、配置Caddy反向代理

创建Caddyfile

cd vaultwarden
touch Caddyfile
{
    # ===直接关闭ocsp封套,阻止caddy每次启动时检查证书有效性(因为服务[>
    ocsp_stapling off
}
你的域名 {
    encode gzip

    # 指向新容器的 80 端口
    reverse_proxy vaultwarden:80 {
        header_up X-Real-IP {remote_host}
    }

    # 你的新证书路径 (请确保容器内路径和证书文件名字正确)
    tls /etc/caddy/vaultwarden_certs/pass.pem /etc/caddy/vaultwarden_certs/pass.key
    log {
        output file /data/access_vaultwarden.log
    }
}

五、配置docker compose

创建docker-compose.yml

touch docker-compose.yml

配置docker-compose.yml:

services:
  # Caddy 反向代理 
  caddy:
    image: caddy:latest
    container_name: caddy
    restart: always
    ports:
      - "80:80"
      - "443:443"
      - "443:443/udp"  # HTTP/3 
 #     - "8080:8080"
    environment:
      TZ: Asia/Shanghai
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - ./caddy_data:/data
      - ./caddy_config:/config
      - ./caddy_certs:/etc/caddy/certs
    networks:
      - caddy_net  
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: unless-stopped
    stop_grace_period: 60s
    environment:
      - DOMAIN=https://你的域名
      - WEBSOCKET_ENABLED=true
      - SIGNUPS_ALLOWED=true  # 注册完记得改成 false 并重建容器
      # 改为请求 Bitwarden 的全球 CDN 服务器,加速获取图标
      - ICON_SERVICE=bitwarden
    volumes:
      - ./vw-data/:/data/
    networks:
      - caddy_net  # 指定加入这个网络
# 这里声明网络是外部存在的
networks:
  caddy_net:
    external: true

注意:在你注册完成之后,记得把SIGNUPS_ALLOWED=true改成SIGNUPS_ALLOWED=false

六、启动容器

docker compose up -d

如果这里一直卡着,连不上中央仓库的,可以试试配置镜像源,或者直接从镜像源拉取:

docker pull docker.m.daocloud.io/vaultwarden/server:latest
docker tag docker.m.daocloud.io/vaultwarden/server:latest vaultwarden/server:latest

如果自己的电脑可以连上中央仓库,也可以选择用自己电脑拉取,然后打包上传到服务器,流程如下:

1.拉取镜像并打包

# 拉取
docker pull vaultwarden/server:latest

# 打包成文件 (会在当前目录下生成一个 vw.tar)
docker save -o vw.tar vaultwarden/server:latest

2.上传到服务器

3.在服务器上加载

docker load -i ~/vw.tar

4.启动

docker compose up -d

七、配置

登录进去后,会让你创建一个账号,然后我们可以从其他浏览器导入我们以前存储的密码,至此基本配置完成,下面我们说说admin面板相关配置。

admin面板权限很大(可以删除任意用户、查看所有配置),所以默认是不开启的。要开启它,我们需要设置一个环境变量 ADMIN_TOKEN。这个 Token 就是登录 域名/admin 页面时的“密码”。

参考官方对admin面板的描述,以及保护admin密码的提示,我将后续步骤分为两类,一类是不打算给admin密码加密,打算直接明文放在docker-compose.yml的;另一类是打算给admin密码加密的。不管你喜欢哪种,官方都建议使用长随机字符串来充当admin密码,因为这个面板我们几乎不会进入,日常我们根本用不到这个面板。

1.明文

如果打算给admin密码进一步加密的请跳过这部分!

请按照以下步骤操作:

1. 生成一个安全的 Token

因为你是在 Linux 服务器上,可以直接用 openssl 生成一个随机的长字符串作为 Token。在终端运行:

openssl rand -base64 48

(如果没有 openssl,你自己随便乱按键盘敲一串又长又复杂的字符串也可以,比如 MySeCreTToKen_123456_DoNotHackMe,但强烈建议用生成的随机串)

复制生成出来的这串字符,先记在记事本里,别丢了。

2. 修改 docker-compose.yml

编辑我们的 docker-compose.yml 文件:

nano docker-compose.yml

environment: 下面增加一行 ADMIN_TOKEN。修改后的样子大概是这样:

yaml
services:
  vaultwarden:
    # ... 其他配置保持不变 ...
    environment:
      - DOMAIN=https://你的域名
      - WEBSOCKET_ENABLED=true
      - SIGNUPS_ALLOWED=true
      # === 新增下面这一行 ===
      - ADMIN_TOKEN=你刚才生成的那个长字符串粘贴在这里
    # ... 其他配置保持不变 ...

3. 重建容器生效

保存退出后,执行:

docker compose up -d

(它会检测到环境变量变化,自动重建容器)

4. 访问 Admin 页面

现在你可以再次访问 https://你的域名/admin 了。

点击 Enter 即可进入。

Authentication Token: 输入你刚才设置的那个字符串。

2.哈希加密

第一步:生成 Argon2 哈希值

你现在的容器已经在运行了(名字叫 vaultwarden),我们可以直接利用这个容器内部的工具来生成密码哈希。

  1. 想好一个你用来登录 Admin 面板的密码(比如 MySuperSecretPassword)。
  2. 在你的服务器终端运行以下命令:
docker exec -it vaultwarden /vaultwarden hash
  1. 程序会提示你输入密码(Password:),输入你想好的密码,按回车。
  2. 它会让你再次确认密码(Confirm Password:),再次输入并回车。
  3. 屏幕上会输出一长串以 $argon2id 开头的字符,这就是你的哈希值

注意: 这一串字符类似这样: $argon2id$v=19$m=65540,t=3,p=4$DnJF... 请把它完整复制下来,最好先粘在记事本里。

第二步:修改 docker-compose.yml

这是最容易出错的地方:“Variable Interpolation(变量插值)”。

docker-compose.yml 文件中,Docker 会把 $ 符号后面当作变量。但 Argon2 的哈希值里全是 $所以,我们需要把所有的 $ 替换成 $$

假设生成的哈希是: $argon2id$v=19$m=65540,t=3,p=4$DnJF...

yaml 文件里必须写成: $$argon2id$$v=19$$m=65540,t=3,p=4$$DnJF...

第三步:重建容器

修改完文件保存后,执行:

docker compose up -d

第四步:验证登录

  1. 回到浏览器访问 https://你的域名/admin
  2. 重点: 在输入框里,不要输入那一长串 $$argon...,而是输入第一步里想好的那个明文密码,它会自动将其哈希处理,然后跟存储的哈希值进行比对。
  3. 如果成功进入,说明配置成功。

至此,我们已经配置好了自己的密码管理器,你还可以通过安装浏览器插件和手机app的方式,让你的密码管理器在多端通用,下载链接在这里

下一节我们会讲讲如何自动化备份到阿里oss对象存储。