1.系统要求
Vaultwarden 使用 Rust 编写,支持 SQLite、MySQL 和 PostgreSQL 数据库后端,运行时只需要 10M 内存,可以说对硬件基本没有要求。
2.预设环境
- 假设使用域名
vault.ekhysis.com
访问 Vaultwarden 实例 - Vaultwarden 容器的 80 端口暴露到宿主机的 3280 端口上,注意防火墙开放端口
- 使用 acme.sh 由 Let’s Encrypt 生成并自动更新的免费证书
- 在 Nginx 上设置反向代理为 Vaultwarden 开启 https
3.设置 http 跳转到 https、设置反向代理
server { listen 80; # listen [::]:80; server_name vault.ekhysis.com; index index.html index.htm index.php default.html default.htm default.php; root /usr/share/nginx/html; return 301 https://$server_name$request_uri; #设置 http 跳转到 https # include rewrite/none.conf; # error_page 404 /404.html; # Deny access to PHP files in specific directory # location ~ /(wp-content|uploads|wp-includes|images)/.*\.php$ { deny all; } # include enable-php.conf; access_log off; } server { listen 443 ssl http2; # listen [::]:443 ssl http2; server_name vault.ekhysis.com; "/etc/nginx/sites-available/vault.ekhysis.com" 91L, 2754C 8,2 Topserver { listen 80; # listen [::]:80; server_name vault.ekhysis.com; index index.html index.htm index.php default.html default.htm default.php; root /usr/share/nginx/html; return 301 https://$server_name$request_uri; #设置 http 跳转到 https # include rewrite/none.conf; # error_page 404 /404.html; # Deny access to PHP files in specific directory # location ~ /(wp-content|uploads|wp-includes|images)/.*\.php$ { deny all; } # include enable-php.conf; access_log off; } server { listen 443 ssl http2; # listen [::]:443 ssl http2; server_name vault.ekhysis.com; index index.html index.htm index.php default.html default.htm default.php; root /usr/share/nginx/html; ssl_certificate /root/cert/vault.ekhysis.com.cer; ssl_certificate_key /root/cert/vault.ekhysis.com.key; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers "TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5"; ssl_session_cache builtin:1000 shared:SSL:10m; # openssl dhparam -out /usr/local/nginx/conf/ssl/dhparam.pem 2048 # ssl_dhparam /usr/local/nginx/conf/ssl/dhparam.pem; # include rewrite/none.conf; # error_page 404 /404.html; # Deny access to PHP files in specific directory # location ~ /(wp-content|uploads|wp-includes|images)/.*\.php$ { deny all; } # include enable-php.conf; # ==设置反向代理开始== # client_max_body_size 128M; #允许大型附件 location / { proxy_pass http://127.0.0.1:3280; 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; # Proxy timeouts proxy_connect_timeout 60s; proxy_send_timeout 60s; proxy_read_timeout 60s; } location /notifications/hub { proxy_pass http://127.0.0.1:3012; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } location /notifications/hub/negotiate { proxy_pass http://127.0.0.1:3280; } location /admin { 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; proxy_pass http://127.0.0.1:3280; } # ==设置反向代理结束== # location ~ /.well-known { allow all; } location ~ /\. { deny all; } access_log off; }
4.部署 Vaultwarden
docker run -d --name vaultwarden \ -e ADMIN_TOKEN=some_random_token \ -v ./vaultwarden-data/:/data/ \ --restart unless-stopped \ -p 3280:80 \ vaultwarden/server:latest
-d
:指定容器运行于前台或者后台(默认为false
表示运行于后台)--restart always
:自动启动(在宿主机重启后或者 Docker 服务重启后)--name vaultwarden
:指定容器名称为vaultwarden
-e ADMIN_TOKEN=some_random_token
:设置 ADMIN_TOKEN 环境变量以启用管理页面,some_random_token可以用openssl rand -base64 48
命令来生成一个长 token 来保护 admin 页面,开启 admin 页面后会在DATA_FOLDER
目录下生成一个config.json
文件,如果后期需要关闭 admin 页面,需要同时删除环境变量和config.json
文件中的admin_token
参数-v ./vaultwarden-data/:/data/
:挂载容器的data
目录到宿主机的 /root/vaultwarden-data
目录上-p 3280:80
:指定容器的80
端口暴露在宿主机的3280
端口上
4.1vaultwarden 常用环境变量
通过设置环境变量或在 admin 管理页面(会将设置写入 data
目录下的 config.json
文件)来配置 vaultwarden。注意,config.json
中的设置会覆盖相应的环境变量设置,因此推荐两种方式二选一。完整的环境变量参数可以参考 .env.example,通过 docker run --env-file <env-file>
或者 docker run -v /path/to/.env:/.env
来使用自定义环境变量,下面是一些我使用到的参数,仅供参考:
SIGNUPS_ALLOWED=false
:禁止注册新用户INVITATIONS_ALLOWED=false
:禁止邀请用户,即使设置了禁止注册/邀请用户,在 admin 页面仍然可以邀请用户ADMIN_TOKEN=some_long_long_random_token
:开启 admin 管理页面,推荐使用openssl rand -base64 48
命令来生成一个长 token 来保护 admin 页面,开启 admin 页面后会在DATA_FOLDER
目录下生成一个config.json
文件,如果后期需要关闭 admin 页面,需要同时删除环境变量和config.json
文件中的admin_token
参数LOG_FILE=/data/vaultwarden.log
:输出日志,默认使用 stdout 输出日志,可以通过设置该参数输出到文件SHOW_PASSWORD_HINT=false
:关闭密码提示
5.常见故障解决
5.1直接修改 config.json
文件不生效
通过管理页面修改配置并保存后,会将配置参数写入 config.json 文件,但当通过直接编辑 config.json 文件配置参数后,管理页面无法读取修改后的配置参数。
原因为只有在 Vaultwarden 容器启动时才会读取 config.json 文件。修改 config.json 文件后要使功能生效,需要在修改 config.json 文件后重启 Vaultwarden 容器:
docker restart vaultwarden
5.2日志记录项的时间和系统时间不一致
日志记录使用 UTC(全球标准时间),而中国使用时间为 UTC+8,比 UTC 推后 8小时。
在创建 Vaultwarden 容器时加上时区环境变量:复制
-e TZ=Asia/Shanghai
0