Cài Vaultwarden tự host: kho mật khẩu riêng trên VPS của bạn

Hướng dẫn cài Vaultwarden tự host trên VPS bằng Docker hoặc panel, bắt buộc HTTPS, khoá đăng ký, đặt ADMIN_TOKEN an toàn và sao lưu kho mật khẩu đúng cách.

Sơ đồ: app Bitwarden kết nối tới máy chủ Vaultwarden trên VPS qua HTTPS

Ý chính

  • Vaultwarden là máy chủ không chính thức, viết bằng Rust, tương thích với app Bitwarden chính thức.
  • Vaultwarden bắt buộc chạy qua HTTPS vì web vault cần Web Crypto API.
  • Sau khi tạo xong tài khoản, hãy tắt đăng ký mới và dùng ADMIN_TOKEN dạng hash Argon2.
  • Phải sao lưu db.sqlite3, thư mục attachments và file rsa_key, kèm một bản ngoài server.

Để cài Vaultwarden tự host, bạn cần một VPS, một tên miền có chứng chỉ SSL và Docker: chạy container vaultwarden/server, đặt nó sau một reverse proxy HTTPS như nginx, tạo tài khoản, rồi tắt đăng ký mới. Vaultwarden nhẹ (khoảng 256 MB RAM là đủ cho gia đình hoặc nhóm nhỏ) và dùng được với app Bitwarden chính thức trên điện thoại, máy tính và trình duyệt.

Bài viết này giải thích Vaultwarden là gì và khác Bitwarden ra sao, cách cài bằng ZoPanel và cách cài thủ công bằng Docker Compose trên Ubuntu/Debian, rồi đến hai phần quan trọng nhất mà nhiều hướng dẫn bỏ qua: khoá chặt máy chủ sau khi cài và sao lưu kho mật khẩu sao cho khôi phục được thật.

Vaultwarden là gì, khác gì Bitwarden?

Vaultwarden là một bản cài đặt không chính thức của API máy chủ Bitwarden, viết bằng Rust. Dự án trước đây tên là bitwarden_rs và được đổi tên để tránh nhầm với máy chủ chính thức. Vaultwarden không liên kết với Bitwarden, Inc.; nó chỉ nói chuyện được với app Bitwarden chính thức.

Bạn có ba lựa chọn khi muốn dùng hệ sinh thái Bitwarden:

Lựa chọn Ai vận hành Tài nguyên Ghi chú
Bitwarden cloud Bitwarden, Inc. Không cần server Dễ nhất; dữ liệu nằm ở nhà cung cấp (đã mã hoá đầu cuối).
Bitwarden tự host chính thức Bạn Tối thiểu 2 GB RAM, khuyến nghị 4 GB Cần installation ID và key từ Bitwarden; được hãng hỗ trợ.
Vaultwarden Bạn Khoảng 256 MB RAM Nhẹ, một container; do cộng đồng phát triển.

Số liệu tài nguyên của bản chính thức lấy từ tài liệu cài đặt của Bitwarden tại thời điểm viết (tháng 10/2026). Bitwarden cũng có bản triển khai "lite"; hãy xem tài liệu của hãng nếu bạn cần hỗ trợ chính thức.

Vaultwarden phù hợp khi bạn muốn sự tiện lợi của Bitwarden (tự điền, đồng bộ nhiều thiết bị, chia sẻ kho trong gia đình hay nhóm) mà không giao dữ liệu cho bên thứ ba, và chấp nhận tự chịu trách nhiệm vận hành.

Cần chuẩn bị gì để cài Vaultwarden tự host?

  • Một VPS chạy Ubuntu 22.04/24.04 hoặc Debian 12/13. Vaultwarden rất nhẹ, có thể chạy chung với website khác.
  • Một tên miền hoặc subdomain, ví dụ vault.tenmien.com, trỏ bản ghi A về IP của VPS.
  • HTTPS là bắt buộc. Web vault của Vaultwarden cần Web Crypto API của trình duyệt, mà API này chỉ hoạt động trong secure context, nên qua HTTP thường nó không chạy.
  • Một nơi lưu bản sao lưu ngoài server. Kho mật khẩu là dữ liệu bạn không được phép mất.
  • (Tuỳ chọn) SMTP để gửi email mời thành viên và email xác minh.

Cách cài Vaultwarden với ZoPanel

Vaultwarden có sẵn trong Kho ứng dụng của ZoPanel. Panel tạo website cho tên miền, chạy container và cấu hình reverse proxy có SSL.

  1. Nếu server chưa có Docker, bấm Kho ứng dụng → Cài Docker (hoặc cài thành phần Docker trong Thành phần).
  2. Mở Kho ứng dụng, chọn Vaultwarden, nhập tên miền, ví dụ vault.tenmien.com. Quản trị viên chọn thêm tài khoản hosting sở hữu ứng dụng.
  3. Bấm Cài đặt và theo dõi log tác vụ.
  4. Trỏ bản ghi A của tên miền về server nếu chưa trỏ. Chờ SSL được cấp xong trước khi mở trang.
  5. Mở https://vault.tenmien.com và chọn Create account. Mật khẩu chính (master password) dùng để mã hoá kho và không khôi phục được: hãy ghi lại và cất ở nơi an toàn.
  6. Trong app Bitwarden hoặc tiện ích trình duyệt, chọn Self-hosted và nhập https://vault.tenmien.com làm địa chỉ máy chủ.
  7. Khi mọi người trong gia đình hoặc nhóm đã có tài khoản, mở https://vault.tenmien.com/admin bằng ADMIN_TOKEN ở mục Thông tin đăng nhập trong tab Docker của website, rồi tắt Allow new signups. Bạn vẫn mời người mới được từ trang admin.

Ứng dụng có giới hạn bộ nhớ 256 MB. ZoPanel chạy container trong user namespace, chỉ mở cổng trên 127.0.0.1 (khách truy cập đi qua nginx có SSL), không cho container kết nối với nhau hay vào mạng nội bộ của server, và lưu dữ liệu ứng dụng trong /var/lib/zopanel-apps/<instance>/, chỉ root và container đọc được. Cập nhật lên bản mới bằng nút Cập nhật bản mới trong tab Docker; dữ liệu được giữ nguyên. Chi tiết trong tài liệu Kho ứng dụng và danh mục ứng dụng.

Cài Vaultwarden thủ công bằng Docker Compose

Nếu bạn tự quản lý server, cài Docker Engine và plugin Compose theo hướng dẫn chính thức của Docker (dùng kho apt của Docker, không chạy script lạ). Sau đó làm theo các bước dưới đây.

Bước 1: Tạo ADMIN_TOKEN dạng hash

Đừng để ADMIN_TOKEN ở dạng văn bản thường. Vaultwarden có sẵn lệnh tạo hash Argon2:

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

Lệnh hỏi mật khẩu hai lần và in ra chuỗi bắt đầu bằng $argon2id$. Bạn đăng nhập trang /admin bằng mật khẩu gốc, không phải chuỗi hash.

Bước 2: Viết file compose

Tạo thư mục /opt/vaultwarden, rồi tạo file .env (dùng nháy đơn, không cần nhân đôi dấu $):

ADMIN_TOKEN='$argon2id$v=19$m=65540,t=3,p=4$...'

Và file compose.yaml:

services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: unless-stopped
    environment:
      DOMAIN: "https://vault.example.com"
      SIGNUPS_ALLOWED: "true"
      ADMIN_TOKEN: ${ADMIN_TOKEN}
    volumes:
      - ./vw-data:/data
    ports:
      - "127.0.0.1:8000:80"

Chạy sudo chmod 600 .env rồi docker compose up -d. Dòng 127.0.0.1:8000:80 rất quan trọng: theo tài liệu của Docker, lưu lượng tới cổng được publish bị định tuyến trước khi quy tắc UFW được áp dụng, nên chỉ mở trên localhost và để nginx đứng trước (Docker và tường lửa).

Bước 3: Reverse proxy nginx và SSL

server {
    listen 80;
    server_name vault.example.com;

    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;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

Kiểm tra bằng sudo nginx -t && sudo systemctl reload nginx, rồi cấp chứng chỉ bằng sudo certbot --nginx -d vault.example.com. Hai dòng Upgrade/Connection cho phép WebSocket, giúp app đồng bộ thay đổi gần như tức thì.

Bước 4: Tạo tài khoản rồi khoá đăng ký

Tạo tài khoản cho mọi người, sau đó đổi SIGNUPS_ALLOWED thành "false" và chạy lại docker compose up -d. Lưu ý: lần đầu bạn lưu thiết lập trong trang /admin, Vaultwarden tạo file config.json trong thư mục dữ liệu, và giá trị trong file này ghi đè biến môi trường. Từ đó trở đi, nên đổi thiết lập trong trang admin.

Bảo mật kho mật khẩu sau khi cài

Kho mật khẩu được mã hoá ở phía app bằng mật khẩu chính, nên kẻ chiếm server không đọc ngay được mật khẩu của bạn. Nhưng họ có thể thay mã JavaScript của web vault, khoá bạn khỏi dữ liệu hoặc thử dò mật khẩu chính. Hãy làm thêm:

  • Tắt đăng ký mới ngay khi đủ người. Một máy chủ mở đăng ký là chỗ cho người lạ lưu dữ liệu.
  • ADMIN_TOKEN dạng Argon2, như ở bước 1. Nếu không dùng trang admin, có thể bỏ hẳn biến này để tắt trang /admin.
  • Bật xác thực hai lớp cho từng tài khoản trong web vault (ứng dụng TOTP hoặc khoá bảo mật).
  • Mật khẩu chính dài và duy nhất. Nó là thứ duy nhất bảo vệ kho nếu file database bị lộ.
  • Cập nhật thường xuyên. Theo dõi trang release của Vaultwarden và kéo image mới.
  • Giữ server sạch. Vá bảo mật tự động, SSH bằng key, tường lửa chỉ mở 22, 80, 443. Xem hướng dẫn bảo mật VPS Ubuntu.

Trên ZoPanel, nhiều mục ở trên đã có sẵn: Fail2ban, tường lửa, tự cài bản vá bảo mật, và Trung tâm bảo mật chấm điểm cấu hình SSH. Xem tài liệu bảo mật.

Sao lưu Vaultwarden thế nào cho đúng?

Theo wiki của Vaultwarden, những thứ cần sao lưu trong thư mục dữ liệu là:

File / thư mục Mức độ
db.sqlite3 Bắt buộc: toàn bộ kho mật khẩu
attachments/ Bắt buộc nếu dùng file đính kèm
config.json Nên có: thiết lập trang admin
rsa_key* Nên có: ký token đăng nhập; mất thì mọi người phải đăng nhập lại
sends/, icon_cache/ Tuỳ chọn

Đừng chép thẳng db.sqlite3 khi container đang chạy, vì có thể ra bản hỏng. Dùng lệnh .backup của SQLite, an toàn khi database đang được dùng:

sudo apt install sqlite3
sudo sqlite3 /opt/vaultwarden/vw-data/db.sqlite3 \
  ".backup '/var/backups/vaultwarden/db-$(date +%Y%m%d-%H%M).sqlite3'"

Đặt lệnh này vào cron hằng ngày, rồi đưa bản sao (cùng attachments/, config.json, rsa_key*) ra ngoài server, ví dụ lên S3. Kho đã được mã hoá bằng mật khẩu chính, nhưng mã hoá thêm bản sao lưu vẫn là thói quen tốt.

Trên ZoPanel, dữ liệu ứng dụng nằm trong /var/lib/zopanel-apps/<instance>/. Hãy kiểm tra rằng kế hoạch sao lưu của bạn thực sự chứa thư mục này, và thử khôi phục lên một server khác ít nhất một lần. Bản sao lưu chưa từng được thử khôi phục chỉ là một hy vọng.

Những rủi ro cần cân nhắc khi tự host

Tự host không tự động an toàn hơn. Bạn đổi việc tin một công ty lấy việc tin chính mình:

  • Nếu server chết và không có bản sao lưu, mất toàn bộ kho. Không có bộ phận hỗ trợ nào khôi phục cho bạn.
  • Nếu quên mật khẩu chính, không ai giải mã được kho. Kể cả bạn với quyền root.
  • Bạn phải theo dõi bản vá. Một lỗ hổng chưa vá trên máy chủ chứa mật khẩu là rủi ro lớn.
  • Thời gian chạy phụ thuộc vào VPS. Khi server ngừng, bạn không thêm hay đồng bộ mục mới được.

Nếu bạn chưa sẵn sàng cho những điều trên, dịch vụ cloud của Bitwarden là lựa chọn hợp lý. Nếu đã sẵn sàng, Vaultwarden là một trong những ứng dụng tự host đáng chạy nhất: nhẹ, ổn định và bạn dùng nó mỗi ngày.

Kết luận

Cài Vaultwarden mất chưa tới 15 phút. Phần tạo nên khác biệt là những việc sau đó: HTTPS ngay từ đầu, khoá đăng ký, ADMIN_TOKEN dạng hash, 2FA, và sao lưu có thử khôi phục. Nếu muốn bỏ qua phần Docker, nginx và SSL, Vaultwarden có sẵn một cú bấm trong Kho ứng dụng của ZoPanel, chạy trong container cách ly. Kho ứng dụng chạy được trên gói Free (3 tài khoản hosting, 10 website, 10 database, không giới hạn thời gian); sao lưu từ xa lên S3 cần gói Pro. Xem bảng giá để biết thêm.

Câu hỏi thường gặp

Vaultwarden có an toàn không?

Kho được mã hoá ở phía app bằng mật khẩu chính trước khi gửi lên server, giống Bitwarden chính thức. Độ an toàn tổng thể phụ thuộc vào cách bạn vận hành: HTTPS, khoá đăng ký, 2FA, cập nhật thường xuyên và sao lưu. Vaultwarden là dự án cộng đồng, không do Bitwarden, Inc. kiểm định.

Vaultwarden cần cấu hình VPS bao nhiêu?

Rất ít. Khoảng 256 MB RAM là đủ cho gia đình hoặc nhóm nhỏ, nên bạn có thể chạy nó chung với website trên một VPS 1–2 GB. Dung lượng đĩa phụ thuộc chủ yếu vào file đính kèm.

Có dùng được app Bitwarden chính thức với Vaultwarden không?

Có. Trong app di động, app máy tính hay tiện ích trình duyệt Bitwarden, chọn Self-hosted ở màn hình đăng nhập và nhập địa chỉ https:// của máy chủ Vaultwarden.

Vì sao Vaultwarden báo lỗi khi mở bằng HTTP?

Web vault cần Web Crypto API của trình duyệt, mà API này chỉ hoạt động qua HTTPS (hoặc localhost). Hãy trỏ tên miền về server và cấp chứng chỉ SSL trước khi tạo tài khoản.

Quên mật khẩu chính thì có lấy lại được không?

Không. Mật khẩu chính dùng để mã hoá kho và không được lưu trên server, nên quản trị viên cũng không khôi phục được. Hãy ghi nó ra giấy và cất ở nơi an toàn mà người thân tin cậy biết cách tìm.