Skip to main content

Docker 架設Vaultwarden密碼管理工具

Vaultwarden是以Bitwarden為原型、用Rust語言重新改寫的版本,比原始的Bitwarden更加輕量化

安裝Vaultwarden

docker pull vaultwarden/server
cd /var/lib/docker/volumes
mkdir vaultwarden
cd vaultwarden

建立docker-compose.yml

version: '3'
services:
  app:
    image: 'vaultwarden/server:latest'
    container_name: vaultwarden
    restart: always
    volumes:
      - ./vw-data/:/data/
    environment:
      - ADMIN_TOKEN=1qaxxwsx3xx
    ports:
      - 80:80
      - 443:443
docker compose up -d

管理介面

Vaultwarden強制使用SSL才能使用,Docker啟動後先進入admin頁面修改網域 http://ip/admin

Admin Token為上方docker-compose.yml的token

image.png

修改網域

image.png

修改ADMIN TOKEN

image.png

Nginx 反向代理設定

server {
	listen 443 ssl;
	ssl_certificate /etc/letsencrypt/live/xxx.com/fullchain.pem;
	ssl_certificate_key /etc/letsencrypt/xxx.com/privkey.pem;
	root /var/www/html;
	index index.php;
	server_name xxx.com;
	server_tokens off;
	location /vaultwarden/ {
		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://ip/;
}

瀏覽器輸入https://xxx.com/vaultwarden/

 

備份Vaultwarden

我在Synoloy裡也建立一台Vaultwarden來做備份

Synoloy先對Vaultwarden的docker主機做SSH免密登入

並加入排程任務自動備份

#!/bin/bash

# 參數設定
REMOTE_HOST="192.168.12.245"
REMOTE_USER="root"               # 請修改為遠端 SSH 帳號
REMOTE_DIR="/var/lib/docker/volumes/vaultwarden"
TARGET_FOLDER="vw-data"
LOCAL_DEST="/volume10/docker/vaultwarden"
LOCAL_CONTAINER_NAME="vaultwarden"
SSH_CMD="ssh -q -o BatchMode=yes -o ConnectTimeout=10 ${REMOTE_USER}@${REMOTE_HOST}"

# 1. 檢查本地目錄
if [ ! -d "$LOCAL_DEST" ]; then
    mkdir -p "$LOCAL_DEST" || { echo "[失敗] 無法建立本地目錄 $LOCAL_DEST"; exit 1; }
fi

# 2. 測試 SSH 與遠端目錄
$SSH_CMD "test -d '${REMOTE_DIR}/${TARGET_FOLDER}'" >/dev/null 2>&1 || { echo "[失敗] 遠端 SSH 連線失敗或找不到 ${REMOTE_DIR}/${TARGET_FOLDER}"; exit 1; }

# 3. 停止本地容器
if docker ps --format '{{.Names}}' | grep -q "^${LOCAL_CONTAINER_NAME}$"; then
    docker stop "$LOCAL_CONTAINER_NAME" >/dev/null 2>&1 || { echo "[失敗] 停止本地容器 $LOCAL_CONTAINER_NAME 失敗"; exit 1; }
fi

# 4. 使用 scp 同步檔案 (複製整個 vw-data)
scp -B -q -r "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}/${TARGET_FOLDER}" "${LOCAL_DEST}/" >/dev/null 2>&1 || { 
    docker start "$LOCAL_CONTAINER_NAME" >/dev/null 2>&1
    echo "[失敗] scp 檔案複製失敗"
    exit 1
}

# 5. 修正權限
chmod -R 777 "${LOCAL_DEST}/${TARGET_FOLDER}" >/dev/null 2>&1 || { echo "[失敗] 修正檔案權限失敗"; exit 1; }

# 6. 啟動本地容器
docker start "$LOCAL_CONTAINER_NAME" >/dev/null 2>&1 || { echo "[失敗] 啟動本地容器 $LOCAL_CONTAINER_NAME 失敗"; exit 1; }

# 成功輸出
echo "[成功] Vaultwarden 同步與重啟完成!"