SSD Nodes Learn
Hướng dẫn Matt ConnorBởi Matt Connor · Cập nhật ngày 2026-07-23

Cách cài Vaultwarden trên VPS bằng Docker

Hướng dẫn tự host Vaultwarden trên VPS bằng Docker. Cách cấu hình HTTPS, quản lý admin token và backup dữ liệu an toàn để thay thế Bitwarden chính thức.

Những gì bạn đang xây dựng

Một trình quản lý mật khẩu mà bạn toàn quyền sở hữu: Vaultwarden chạy trong một container nhỏ gọn phía sau một reverse proxy thực hiện HTTPS, với các ứng dụng Bitwarden chính thức trên điện thoại, laptop và trình duyệt được trỏ về nó. Vaultwarden tái triển khai Bitwarden server API bằng Rust và sử dụng cùng một protocol với bitwarden.com, vì vậy mọi client chính thức đều hoạt động bình thường mà không cần thay đổi — nhưng nó chỉ tốn khoảng 100 MB RAM thay vì một stack chính thức gồm nhiều container.

Việc cài đặt chỉ mất một vài dòng Compose. Ba điều thực sự quan trọng — và cũng là những thứ dễ gây lỗi — là: TLS phải có sẵn trước khi bạn tải web vault, tính năng đăng ký công khai phải được đóng ngay khi tài khoản của bạn đã tồn tại, và volume dữ liệu phải được backup và test-restore, vì thư mục đó chứa mọi mật khẩu bạn sở hữu.

Điều kiện tiên quyết và những rắc rối thực tế

  • Một VPS chạy Docker Engine và plugin Compose, trên một máy Ubuntu 24.04 KVM mới có quyền root hoặc sudo. 512 MB RAM là thực sự đủ; 1 GB thì thoải mái. Đây là một trong những thứ nhẹ nhất bạn có thể chạy — nó nằm ở nhóm đầu trong danh sách các dịch vụ đáng để tự host.
  • Một domain có bản ghi A (và AAAA nếu bạn dùng IPv6) trỏ vault.example.com về VPS. Chứng chỉ TLS được cấp cho chính xác tên này, nên DNS phải phân giải được trước khi bạn bắt đầu.
  • Các port 80 và 443 phải mở ra internet, được xử lý bởi reverse proxy của bạn — không bao giờ để Vaultwarden xử lý trực tiếp. Port 80 chỉ dùng cho ACME certificate challenge và redirect HTTP-to-HTTPS.
  • Rắc rối lớn nhất ngay từ đầu: các client của Bitwarden từ chối kết nối với một server không có HTTPS. Không có kiểu "thử nghiệm qua http trước" — đường dẫn đó không hoạt động vì một lý do cụ thể sẽ nói ở phần tiếp theo.

Tại sao chọn Vaultwarden thay vì stack Bitwarden chính thức

Cùng một client, nhưng nhẹ hơn rất nhiều. Bản self-hosted chính thức của Bitwarden đi kèm một bundle các container (MSSQL, Nginx, Identity, Api, Admin và nhiều hơn nữa) và đòi hỏi khoảng 2 GB RAM. Vaultwarden là một binary duy nhất, mặc định lưu trữ mọi thứ trong một database SQLite và chạy ở trạng thái idle chỉ tốn vài chục megabytes. Đối với một cá nhân, một gia đình hoặc một nhóm nhỏ, đây là lựa chọn hiển nhiên, và vì nó triển khai Bitwarden API một cách trung thực nên dữ liệu của bạn có thể di chuyển linh hoạt giữa nó và bitwarden.com.

Những gì bạn mất đi là hầu hết các tính năng dành cho doanh nghiệp: không có SCIM provisioning (mặc dù OpenID Connect SSO thử nghiệm đã có trong bản 1.35.0), và bạn là người vận hành, nên việc patching, HTTPS và backup là việc của bạn. Hướng dẫn này sẽ giải quyết ba việc đó.

Tại sao HTTPS là bắt buộc

Bitwarden web vault và các browser extension tạo encryption keys ngay trên trình duyệt bằng cách sử dụng Web Crypto API (window.crypto.subtle). Trình duyệt chỉ cung cấp crypto.subtle trong một secure context — tức là HTTPS, hoặc trường hợp đặc biệt là http://localhost. Qua http://vault.example.com thuần túy, nó là undefined, nên ngay khi app tạo key, nó sẽ báo lỗi và console sẽ hiển thị:

Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'importKey')

Trang web sẽ bị treo hoặc hiển thị lỗi crypto chung chung, và không thể đăng nhập. Các client trên desktop, mobile và browser sẽ tự chạy kiểm tra đối với một URL tự host, và đối với một endpoint http (hoặc không thể truy cập), chúng sẽ từ chối với lỗi:

This is not a recognized Bitwarden server. You may need to check with your provider or update your server.

Cả hai đều có cùng nguyên nhân: không có HTTPS hợp lệ. Vì vậy, chúng ta sẽ thiết lập TLS trước và không bao giờ mở vault qua http, dù chỉ một lần để xem thử.

Bước 1 — DNS và reverse proxy (Thiết lập TLS trước)

Trỏ bản ghi về VPS của bạn và xác nhận nó phân giải đúng địa chỉ:

dig +short vault.example.com

Dòng kết quả in ra phải là IP của VPS. Nếu nó trống hoặc sai, hãy sửa DNS và đợi TTL — việc cấp chứng chỉ sẽ thất bại nếu tên miền không phân giải được.

Để làm front end cho HTTPS, hướng dẫn này sử dụng Traefik, nó tự động cấp và gia hạn chứng chỉ Let's Encrypt và tích hợp trực tiếp vào Compose. Nếu bạn chưa chạy nó, hãy làm theo thiết lập Traefik reverse proxy và automatic TLS trước; nó sẽ tạo một Docker network bên ngoài (proxy bên dưới) và một ACME resolver (letsencrypt) mà service Vaultwarden sẽ kết nối vào. Dùng nginx thuần với chứng chỉ tự cấp cũng hoạt động tương tự từ phía Vaultwarden.

Bạn thích dùng nginx và Certbot hơn Traefik? Hãy đặt Vaultwarden vào 127.0.0.1:8080 (thêm ports: ["127.0.0.1:8080:80"] vào service và bỏ các Traefik labels), sau đó cấp chứng chỉ và proxy tới nó. Phần chứng chỉ đã được đề cập trong cấp chứng chỉ Let's Encrypt với Certbot và nginx. Điểm quan trọng cần thêm là WebSocket upgrade trên path notifications:

server {
    listen 443 ssl;
    server_name vault.example.com;

    client_max_body_size 525M;

    location / {
        proxy_pass http://127.0.0.1:8080;
        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_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

Lưu ý dòng X-Real-IP — đây là thứ giúp Fail2ban sau này nhìn thấy attacker thật thay vì 127.0.0.1. Mọi thứ khác trong hướng dẫn này là giống nhau bất kể bạn dùng Traefik hay nginx ở phía trước.

Bước 2 — File Compose

Tạo thư mục dự án trước. Hướng dẫn này sử dụng /opt/vaultwarden, giúp tên dự án Compose — và do đó là volume dữ liệu, vaultwarden_vw-data — trở nên nhất quán; các bước Fail2ban và backup bên dưới phụ thuộc vào chính xác tên đó.

sudo mkdir -p /opt/vaultwarden
cd /opt/vaultwarden

Tạo một .env cho admin secret và file Compose trong thư mục đó.

# .env
ADMIN_TOKEN=paste-a-strong-token-here

Tạo token đó bằng openssl rand -base64 48 và dán vào. (Một dạng hash mạnh hơn sẽ được nói ở phần tiếp theo; một chuỗi ngẫu nhiên dài là đủ để bắt đầu.)

# docker-compose.yml
services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: unless-stopped
    environment:
      DOMAIN: "https://vault.example.com"
      SIGNUPS_ALLOWED: "true"          # closed in Step 4, keep true just to register
      ADMIN_TOKEN: "${ADMIN_TOKEN}"
      IP_HEADER: "X-Forwarded-For"     # X-Real-IP if your proxy sends that instead
      LOG_FILE: "/data/vaultwarden.log"
      LOG_LEVEL: "warn"
    volumes:
      - vw-data:/data
    networks:
      - proxy
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.vw.rule=Host(`vault.example.com`)"
      - "traefik.http.routers.vw.entrypoints=websecure"
      - "traefik.http.routers.vw.tls.certresolver=letsencrypt"
      - "traefik.http.services.vw.loadbalancer.server.port=80"

volumes:
  vw-data:

networks:
  proxy:
    external: true

Có hai điều trong file này quyết định toàn bộ thiết kế. Không có mapping ports:, nên Vaultwarden chỉ có thể truy cập thông qua Traefik và TLS của nó — việc publish port của nó lên host là cách khiến mọi người vô tình chạy vault qua http. Và DOMAIN phải là URL HTTPS công khai đầy đủ: nó được nhúng vào các link đính kèm, WebAuthn 2FA và endpoint notifications, nên nếu giá trị sai hoặc là http, các tính năng đó sẽ hỏng ngay cả khi trang web vẫn load được. Tag latest là một ngoại lệ có chủ đích cho quy tắc không bao giờ-latest thông thường — Vaultwarden phát hành các bản stable dưới dạng một single rolling image, với :testing là channel pre-release riêng biệt — vì vậy hãy update có chủ đích và đọc kỹ release notes trước khi bạn pull.

Chạy lên và theo dõi log:

docker compose up -d
docker compose logs -f vaultwarden

Một quá trình khởi động thành công sẽ kết thúc bằng một dòng như Rocket has launched from http://0.0.0.0:80. Hãy đợi Traefik vài giây để lấy chứng chỉ, sau đó load https://vault.example.com — bạn sẽ thấy Bitwarden web vault với biểu tượng ổ khóa hợp lệ và không có cảnh báo chứng chỉ.

Bước 3 — Một ADMIN_TOKEN mạnh mẽ, và bẫy $$

ADMIN_TOKEN bảo vệ /admin, panel có thể đọc mọi user và setting trên instance của bạn, vì vậy hãy coi nó như password của root. Có hai cách dùng.

Cách đơn giản là chuỗi ngẫu nhiên bạn đã tạo bằng openssl rand -base64 48. Vì base64 không bao giờ chứa ký tự $, nó sẽ được đưa thẳng vào .env mà không cần escaping.

Cách bảo mật hơn là một Argon2 PHC hash, để token plaintext không bao giờ được lưu trên disk. Hãy tạo một hash bằng chính image đó:

docker run --rm -it vaultwarden/server /vaultwarden hash --preset owasp

Nó sẽ hỏi hai lần và in ra một chuỗi bắt đầu bằng $argon2id$v=19$.... Đây là bẫy khiến nhiều người mất cả tiếng đồng hồ: Docker Compose coi $ là biến để interpolate, nên bạn phải double mọi ký tự $ thành $$ khi dán hash vào file Compose. Đặt nó trực tiếp dưới environment:, không thông qua .env, và không bọc trong dấu ngoặc kép:

    environment:
      ADMIN_TOKEN: $$argon2id$$v=19$$m=19456,t=2,p=1$$c29tZXNhbHQ$$RdescudvJCsgt3ub+b+dWRWJTmaaJObG

Nếu bạn để dấu $ đơn, Compose sẽ cảnh báo The "argon2id" variable is not set và làm trống token, và /admin sau đó sẽ từ chối password đúng của bạn. Chạy docker compose up -d, và hãy lưu plaintext bạn đã nhập ở prompt vào password store của riêng bạn.

Bước 4 — Đăng ký tài khoản, sau đó khóa cửa

Với SIGNUPS_ALLOWED: "true", mở https://vault.example.com, click Create account, và đăng ký bằng email và một master password mạnh. Master password này không thể khôi phục — không có tính năng reset — nên hãy lưu nó ở đâu đó bền vững trước.

Bây giờ hãy khóa cửa. Chỉnh sửa file Compose để tắt tính năng đăng ký:

      SIGNUPS_ALLOWED: "false"

Áp dụng lại với docker compose up -d. Đây không phải là việc hardening có thể trì hoãn. Nếu để mở, bất kỳ ai tìm thấy URL — và các crawler sẽ tìm thấy — đều có thể tạo tài khoản trên server của bạn. Họ không thể đọc vault của bạn, nhưng họ tiêu tốn tài nguyên và biến instance riêng tư của bạn thành một dịch vụ công khai. Dấu hiệu cho thấy bạn vẫn để mở: /admin liệt kê các tài khoản mà bạn không hề tạo.

Để thêm gia đình hoặc đồng đội sau này mà không cần mở lại đăng ký công khai, hãy dùng nút Invite User trong /admin; cách đó cần cấu hình SMTP để người được mời nhận được link.

Bước 5 — Truy cập /admin

Truy cập https://vault.example.com/admin và nhập plaintext admin token (chuỗi ngẫu nhiên, hoặc password bạn đã hash — không phải chính cái hash đó). Bên trong, bạn có thể liệt kê user, chỉnh sửa settings, gửi email test và chụp snapshot database.

Nếu trang trả về 404 Not Found, ADMIN_TOKEN đang trống hoặc chưa được thiết lập, điều này sẽ vô hiệu hóa hoàn toàn panel — bản thân nó là một lựa chọn hợp lý nếu bạn không bao giờ cần dùng đến. Nếu nó load được nhưng từ chối token của bạn, hãy xem bẫy escaping $$ trong danh sách lỗi bên dưới. Quên token? Không có prompt khôi phục; hãy sửa .env hoặc file Compose, đặt một cái mới, và docker compose up -d.

Bước 6 — Kết nối các client Bitwarden

Mọi client chính thức đều có thể trỏ về một server tự host, vì vậy hãy cài đặt Bitwarden desktop, mobile hoặc browser client từ các store thông thường — bạn không cần bản build Vaultwarden đặc biệt.

Trước khi đăng nhập, hãy mở icon settings trên màn hình đăng nhập (có nhãn Self-hosted hoặc Region → Self-hosted), đặt Server URL thành https://vault.example.com, và lưu lại. Sau đó đăng nhập bằng email và master password bạn đã đăng ký; client sẽ kết nối ngay lập tức và đề xuất điền cũng như lưu credentials.

Nếu một client hiển thị This is not a recognized Bitwarden server. You may need to check with your provider or update your server., URL bị sai, dùng http, hoặc chứng chỉ không đáng tin cậy — hãy kiểm tra xem https://vault.example.com có load bình thường trên trình duyệt trước không. Việc cập nhật chậm trên các thiết bị khác là do WebSocket push, sẽ nói ở phần dưới.

Bước 7 — Một Fail2ban jail cho login endpoint

Vaultwarden log mọi lần đăng nhập thất bại vào file được thiết lập bởi LOG_FILE — chính xác là những gì một guard chống brute-force cần. Nếu bạn chưa chạy Fail2ban, việc cài đặt và các bước cơ bản nằm trong hướng dẫn hardening SSH với Fail2ban; ở đây chúng ta thêm một jail cho vault.

Đầu tiên, tìm xem named volume nằm ở đâu trên host, để Fail2ban có thể đọc log:

docker volume inspect vaultwarden_vw-data --format '{{ .Mountpoint }}'

Nó sẽ in ra thứ gì đó như /var/lib/docker/volumes/vaultwarden_vw-data/_data; log nằm ở vaultwarden.log bên trong đó. Tạo filter:

# /etc/fail2ban/filter.d/vaultwarden.conf
[Definition]
failregex = ^.*Username or password is incorrect\. Try again\. IP: <ADDR>\. Username:.*$
ignoreregex =

Và jail:

# /etc/fail2ban/jail.d/vaultwarden.local
[vaultwarden]
enabled   = true
filter    = vaultwarden
logpath   = /var/lib/docker/volumes/vaultwarden_vw-data/_data/vaultwarden.log
banaction = iptables-allports
chain     = DOCKER-USER
maxretry  = 5
findtime  = 600
bantime   = 3600

Reload với sudo systemctl restart fail2ban và xác nhận với sudo fail2ban-client status vaultwarden.

Ba chi tiết Docker sẽ quyết định việc này có bảo vệ được gì không. Thứ nhất, nếu log hiển thị IP: 127.0.0.1 hoặc địa chỉ proxy của bạn trong mọi lần thử thất bại, Vaultwarden đang ban proxy — hãy đặt IP_HEADER thành header mà proxy của bạn thực sự gửi (X-Forwarded-For cho Traefik, X-Real-IP cho block nginx ở trên, CF-Connecting-IP nếu dùng sau Cloudflare). Thứ hai, iptables chain đúng phụ thuộc vào proxy của bạn: với Traefik chạy như một container có publish ports, traffic đi qua đường FORWARD của Docker, nên lệnh ban phải nằm ở DOCKER-USER như trên; nhưng nếu bạn chọn tùy chọn host-nginx từ Bước 1, các kết nối kết thúc tại nginx trên chain INPUT của host và một lệnh ban DOCKER-USER sẽ không bao giờ thấy chúng — trong trường hợp đó hãy xóa dòng chain = DOCKER-USER để Fail2ban dùng chain mặc định INPUT. Thứ ba, hãy dùng banaction = iptables-allports thay vì default dựa trên port — jail này không định nghĩa port, và một lệnh ban tất cả các port trong DOCKER-USER sẽ chặn kẻ tấn công khỏi mọi service đã publish trên máy.

Bước 8 — Backup vault, sau đó thực sự restore nó

Volume vw-data chính là trình quản lý mật khẩu của bạn. Nó chứa db.sqlite3 (mọi entry), các thư mục attachments/sends/, các file rsa_key.* dùng để ký login session, và config.json từ admin panel. Một bản backup bỏ qua bất kỳ thứ nào trong số này sẽ thất bại khi bạn cần dùng.

Việc copy db.sqlite3 khi Vaultwarden đang ghi có thể capture phải một file bị lỗi do ghi dở, vì vậy hãy thực hiện cold snapshot — thời gian downtime chỉ mất vài giây:

#!/usr/bin/env bash
set -euo pipefail
STAMP=$(date +%F)
DEST=/root/vw-backups
VOL=$(docker volume inspect vaultwarden_vw-data --format '{{ .Mountpoint }}')
mkdir -p "$DEST"
docker compose -f /opt/vaultwarden/docker-compose.yml stop vaultwarden
tar czf "$DEST/vw-$STAMP.tgz" -C "$VOL" .
docker compose -f /opt/vaultwarden/docker-compose.yml start vaultwarden

Hãy chạy nó bằng cron hàng đêm và copy .tgz ra khỏi máy — một bản backup chỉ nằm trên chính server bạn đang bảo vệ thì không phải là bản backup. Cách sạch nhất để chuyển nó là dùng restic backup hàng đêm sang một server khác hoặc object storage, nó sẽ mã hóa archive và deduplicate các snapshot lặp lại cho bạn. Nút Backup Database của admin panel là một cách snapshot nhanh file SQLite đơn lẻ, nhưng nó bỏ qua attachments và keys.

Bây giờ là nghi thức phân biệt một bản backup thật sự với một bản backup "hy vọng" — hãy restore nó một lần và chứng minh nó hoạt động:

mkdir -p /tmp/vw-restore
tar xzf /root/vw-backups/vw-2026-07-15.tgz -C /tmp/vw-restore
docker run --rm -p 127.0.0.1:8888:80 -v /tmp/vw-restore:/data vaultwarden/server

Từ laptop của bạn, tunnel tới nó bằng ssh -L 8888:127.0.0.1:8888 you@your-vps và mở http://localhost:8888. Vì localhost là một secure context, crypto.subtle sẽ khả dụng và vault sẽ decrypt qua http thuần ở đây — nơi duy nhất được phép. Đăng nhập bằng master password và xác nhận các entry của bạn đã có mặt: nếu có, database, RSA keys và master password của bạn đều đã round-trip thành công, và bạn có thể rebuild trên một VPS mới trong vài phút. Dừng container bằng Ctrl-C và xóa /tmp/vw-restore.

Các lỗi thường gặp, kèm theo các chuỗi ký tự bạn sẽ thấy

Cannot read properties of undefined (reading 'importKey') trong browser console. Vault được load qua http, nên crypto.subtle là undefined; chỉ truy cập qua https:// và thêm HTTP-to-HTTPS redirect tại proxy.

This is not a recognized Bitwarden server... trên client. Server URL là http, bị gõ sai, hoặc chứng chỉ không đáng tin cậy; hãy xác nhận https://vault.example.com hiển thị ổ khóa hợp lệ, sau đó nhập lại vào phần self-hosted settings của client.

/admin từ chối password đúng. Argon2 hash đã mất phần escaping — mọi $ phải là $$ trong Compose — hoặc bạn đã nhập hash thay vì plaintext mà nó đại diện.

Đồng bộ giữa các thiết bị bị chậm; console hiển thị WebSocket connection to 'wss://vault.example.com/notifications/hub' failed. Proxy không forward các header Upgrade/Connection; Traefik làm việc này tự động, nginx cần hai dòng upgrade từ Bước 1. Vault vẫn hoạt động, chỉ là việc sync sẽ diễn ra khi bạn mở app. Port chuyên dụng 3012 cũ đã bị bỏ từ v1.31.0, nên không cần route WebSocket riêng biệt.

Fail2ban báo có ban nhưng attacker vẫn kết nối được. Nó đang ban 127.0.0.1IP_HEADER bị sai, hoặc lệnh ban nằm sai iptables chain — hãy đặt chain = DOCKER-USERbanaction = iptables-allports.

Nâng cấp

Pull image mới và recreate; named volume và toàn bộ dữ liệu của bạn vẫn được giữ nguyên:

docker compose pull
docker compose up -d

Vaultwarden phát hành các bản cập nhật thường xuyên. Hãy theo dõi release notes của dự án thay vì chỉ cố định một patch version, vì một số bản phát hành có kèm theo các ghi chú migration. Hãy backup một bản mới trước bất kỳ đợt update lớn nào; bạn có thể rollback bằng cách restore file tarball vào một volume mới.

FAQ

Vaultwarden có giống Bitwarden không?

Nó là một server độc lập, tương thích, không phải bản chính thức. Vaultwarden tái triển khai Bitwarden server API bằng Rust, nên các client desktop, mobile, browser và CLI chính thức đều hoạt động với nó, với tài nguyên chỉ bằng một phần nhỏ so với stack chính thức. Định dạng vault là giống nhau, nên bạn có thể di chuyển theo cả hai hướng bằng cách export và import.

Tôi có thực sự cần HTTPS, hay có thể chạy qua http trên LAN không?

Bạn cần HTTPS cho bất kỳ thứ gì ngoại trừ một bài test localhost. Bitwarden web vault và extensions sử dụng Web Crypto API của trình duyệt, vốn chỉ khả dụng trong một secure context, nên qua http thuần, client sẽ báo lỗi Cannot read properties of undefined và không bao giờ đăng nhập được. Địa chỉ http duy nhất hoạt động là http://localhost, đó là lý do tại sao bài test restore ở Bước 8 sử dụng SSH tunnel.

Làm sao để ngăn người lạ đăng ký trên server của tôi?

Đặt SIGNUPS_ALLOWED: "false" trong file Compose và chạy docker compose up -d ngay sau khi tạo tài khoản của chính bạn. Từ đó về sau, hãy thêm người mới thông qua nút Invite User trong /admin, việc này cần cấu hình SMTP để họ nhận được link mời. Thỉnh thoảng hãy kiểm tra danh sách admin user để đảm bảo không có tài khoản lạ nào xuất hiện.

Tôi backup Vaultwarden vault như thế nào?

Dừng container trong chốc lát và archive toàn bộ volume vw-data — bao gồm db.sqlite3, attachments/, sends/, config.json và các file rsa_key.* — sau đó copy archive đó ra khỏi server, lý tưởng nhất là chạy cron hàng đêm. Việc copy file SQLite đang chạy có nguy cơ tạo ra snapshot bị lỗi, vì vậy hãy thực hiện khi server đã dừng. Quan trọng nhất, hãy restore nó một lần vào một container tạm thời và đăng nhập, để bạn biết bản backup là thật trước khi thực sự phụ thuộc vào nó.

Tự host mật khẩu có thực sự an toàn không?

Có, khi bạn thực hiện ba điều mà hướng dẫn này đề cập: HTTPS thật sự, tắt đăng ký công khai kèm một admin token mạnh, và các bản backup đã được test. Vault của bạn được mã hóa phía client bằng master password, nên ngay cả server cũng không bao giờ thấy mật khẩu của bạn ở dạng plaintext — một file db.sqlite3 bị đánh cắp sẽ vô dụng nếu không có nó. Sự đánh đổi là việc patching và backup giờ đây là trách nhiệm của bạn, đó là lý do tại sao Fail2ban và nghi thức restore là không thể bỏ qua ở đây.

#vaultwarden#passwords#bảo mật#Docker#tự lưu trữ