Vaultwarden trên Synology Docker: tự host Bitwarden

Vaultwarden trên Synology Docker: tự host Bitwarden

Vaultwarden là bản viết lại server Bitwarden bằng Rust, do dani-garcia phát triển trên GitHub. Nó nói đúng ngôn ngữ API mà Bitwarden dùng, nên mọi client chính chủ — extension trình duyệt, app điện th

Vaultwarden là gì, giải quyết bài toán gì

Vaultwarden là bản viết lại server Bitwarden bằng Rust, do dani-garcia phát triển trên GitHub. Nó nói đúng ngôn ngữ API mà Bitwarden dùng, nên mọi client chính chủ — extension trình duyệt, app điện thoại, app desktop, CLI — đều cắm thẳng vào được, không cần app riêng, không cần học lại thao tác. Điểm khác biệt là nó nhẹ hơn server Bitwarden gốc rất nhiều lần, kiểu "cùng bộ não, ít đồ nội thất hơn".

Nỗi đau nó giải quyết đơn giản: bạn muốn tự giữ vault mật khẩu trên NAS của mình, không muốn nó nằm trên server của một công ty thứ ba, nhưng cũng không có hứng tự viết cả một hệ thống mã hoá từ đầu. Vaultwarden gánh phần khó, bạn chỉ cần dựng container và trỏ app vào.

Vaultwarden làm được gì:

  • Vault nằm hoàn toàn trên NAS — không đi qua server của Bitwarden Inc, bạn toàn quyền dữ liệu.
  • Dùng thẳng app Bitwarden chính chủ trên điện thoại, máy tính, extension trình duyệt — chỉ đổi server URL, không cài thêm gì lạ.
  • Không giới hạn số lượng item/thiết bị như bản Free, cũng không mất phí Premium hàng năm để có 2FA nâng cao hay báo cáo bảo mật.
  • Container Rust cực nhẹ, NAS 2-4 khay cấu hình phổ thông chạy vẫn mượt, không cần máy mạnh.

Vài tình huống hay gặp: người đã tự host Plex hay Synology Photos muốn gom nốt password manager vào hệ sinh thái tự quản; gia đình hoặc nhóm nhỏ 2-6 người dùng chung NAS muốn có vault chung an toàn hơn kiểu lưu mật khẩu trong Chrome; hoặc đơn giản là bạn không thích ý tưởng mọi mật khẩu của mình nằm gọn trong một cơ sở dữ liệu tập trung ở đâu đó ngoài kia.

So với Bitwarden Cloud (free hoặc Premium khoảng 10 USD/năm), Vaultwarden đánh đổi: bạn tự lo backup, tự lo uptime, đổi lại được toàn quyền dữ liệu và full tính năng premium miễn phí. Hợp với người đã quen vọc NAS. Không hợp với người muốn "cài xong là quên luôn" — vault mật khẩu mà tự host thì không có chuyện quên được, bạn vẫn phải chăm nó như chăm NAS.

Sơ đồ luồng hoạt động của Vaultwarden: app Bitwarden kết nối vào container Vaultwarden trên NAS để lưu vault mã hoá

Vì sao chọn Container Manager thay vì cách khác

Cách nhanh gọn nhất để cài Vaultwarden trên Synology là mở Container Manager , vào tab Project, dán nguyên file docker-compose.yml vào rồi bấm chạy. Không cần SSH, không cần gõ lệnh terminal.

Lý do chọn cách này thay vì các cách khác:

  • Toàn bộ thao tác — tạo project, nhập file cấu hình, Start container — đều qua giao diện DSM, không đụng dòng lệnh.
  • File docker-compose gom hết cấu hình vào một chỗ, dễ sửa dễ backup sau này hơn cách gõ tay lệnh docker run qua Task Scheduler mà một số hướng dẫn cũ (như mariushosting) hay dùng — kiểu đó dài dòng, sai một tham số là container không lên được, mà lỗi lại chẳng nói rõ sai chỗ nào.
  • Dùng thẳng image chính chủ vaultwarden/server từ Docker Hub, luôn bám sát release mới nhất của dự án, không phải chờ ai đó đóng gói lại.

Có một lựa chọn còn đơn giản hơn nữa: SynoCommunity cũng có gói Vaultwarden cài qua Package Center, bấm một nút là xong, không đụng gì đến Docker. Đổi lại bạn phải thêm kho nguồn bên thứ ba (không phải Synology chính chủ) vào Package Center, và version thường đi sau image Docker gốc vài bản. Nếu bạn ngại Docker và chỉ cần chạy được là đủ, đây là phương án đáng cân nhắc. Bài này đi theo Container Manager vì bám sát Docker — image chính chủ, cập nhật nhanh, và cấu hình gói gọn trong một file dễ quản lý.

Tiêu chíContainer ManagerSSH + docker run
Cần gõ lệnh terminal
Cấu hìnhMột file compose gọnLệnh dài, rời rạc
Dễ sửa lại sau
Thông báo khi lỗiRõ ràng qua giao diệnMơ hồ, khó dò
Phù hợp vớiNgười mới dùng NASNgười quen terminal
Thecus N4100+ HDD Bays
Ảnh: William Hook (flickr) CC BY-SA

Chuẩn bị trước khi cài

  • DSM 7.2 trở lên (DSM cũ hơn thì gói tương đương tên là "Docker" thay vì "Container Manager").
  • Cài gói Container Manager từ Package Center nếu NAS chưa có.
  • Một thư mục lưu dữ liệu vault — không dùng shared folder public, để File Station tự tạo trong docker là đủ.

Cài Vaultwarden qua Container Manager

Mở File Station, vào thư mục docker (tạo nếu chưa có), tạo thư mục con tên vaultwarden. Đường dẫn đầy đủ sẽ là /volume1/docker/vaultwarden — đây là nơi chứa database SQLite, file đính kèm và khoá ký token của toàn bộ vault. Mất thư mục này là mất sạch dữ liệu, nên đừng để nó thành shared folder ai cũng vào được.

Mở Container Manager → tab ProjectCreate. Đặt tên project (ví dụ vaultwarden), chọn đường dẫn vừa tạo, rồi ở phần nguồn cấu hình chọn dán trực tiếp nội dung file docker-compose.yml. Dán đoạn sau vào, sửa lại DOMAINADMIN_TOKEN theo NAS của bạn:

services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: always
    environment:
      - DOMAIN=https://ten-nas.synology.me
      - SIGNUPS_ALLOWED=true
      - ADMIN_TOKEN=<argon2-phc-hash>
    volumes:
      - /volume1/docker/vaultwarden:/data
    ports:
      - 8080:80

Vài điểm cần biết về file trên:

  • Image: dùng tag latest (đa kiến trúc, tự nhận x86_64/ARM64). NAS cấu hình thấp có thể đổi sang latest-alpine cho nhẹ hơn. Tuyệt đối đừng dùng tag testing cho môi trường thật — đúng như tên gọi, nó là bản thử.
  • Port: chỉ cần map một port duy nhất như 8080:80. Nhiều hướng dẫn cũ (kể cả bài trên mariushosting) vẫn ghi phải mở thêm port 3012 cho WebSocket — thông tin đó lỗi thời rồi. Từ Vaultwarden v1.29.0, WebSocket đã gộp chung vào port HTTP chính, mở thêm 3012 chỉ tổ thừa một cổng phơi ra ngoài không cần thiết.
  • ADMIN_TOKEN: đừng gõ một chuỗi văn bản thường vào đây. Ai cầm được token này là nắm quyền admin server, xem hay xoá user tuỳ ý. Tạo hash argon2 bằng lệnh vaultwarden hash chạy một lần trong container, rồi dán chuỗi hash (dạng PHC) vào thay vì chuỗi thuần.

Bấm Next rồi Done. Container Manager tự kéo image và khởi động container — lần đầu hơi lâu vì phải tải image về, mấy lần sau restart thì nhanh gần như tức thì.

http://ip-nas-cua-ban:8080 trên trình duyệt để kiểm tra. Thấy trang đăng ký Vaultwarden hiện ra là container đã sống. Đăng ký tài khoản đầu tiên ngay lúc này, vì SIGNUPS_ALLOWED đang để true.

Đăng ký xong, quay lại Container Manager, sửa SIGNUPS_ALLOWED=true thành false, bấm cập nhật lại project. Bước này nghe hiển nhiên mà lại là bước hay bị quên nhất — server để mở đăng ký công khai nghĩa là bất kỳ ai biết được URL NAS của bạn cũng tự tạo được tài khoản vào chung server, kể cả khi họ không nằm trong nhà bạn.

Data storm
Ảnh: Herkie (flickr) CC BY-SA

Kết nối app Bitwarden vào Vaultwarden

Mở app Bitwarden (điện thoại, desktop, hoặc extension trình duyệt) — không cần app riêng, dùng đúng app Bitwarden chính chủ tải từ App Store/Google Play/trang chủ. Trên màn hình đăng nhập, bấm vào Settings (icon bánh răng góc trên), chọn Self-hosted, nhập server URL là domain bạn đã set ở biến DOMAIN, rồi đăng nhập bằng tài khoản vừa tạo ở bước trên.

Bật ngay hai bước xác thực cho tài khoản này: vào Account Settings → Security → Two-step Login, chọn TOTP (dùng được app như Aegis, Authy, Google Authenticator) hoặc WebAuthn/security key nếu có. Đây là vault chứa mọi mật khẩu khác của bạn — mất quyền truy cập tài khoản này coi như mất trắng, nên đừng bỏ qua bước này dù chỉ một ngày.

Lỗi hay gặp khi cài Vaultwarden

  • Quên set hoặc set sai DOMAIN (thiếu https://, sai port): gây lỗi khi tải lên/tải xuống file đính kèm, hoặc WebAuthn và 2FA hoạt động chập chờn. Set đúng ngay từ đầu, đổi domain sau này dễ kéo theo rắc rối khác.
  • Dùng extension trình duyệt qua HTTP thường, không phải localhost: Bitwarden client thẳng thừng từ chối kết nối. Đây chính là lý do HTTPS gần như bắt buộc, dù về mặt cấu trúc bài mình xếp nó vào phần "nâng cao" — xem mục dưới.
  • ADMIN_TOKEN để dạng chuỗi thuần, không hash argon2: log sẽ liên tục cảnh báo bảo mật, và ai đọc được file compose là nắm hết quyền admin. Đừng chủ quan vì "chỉ chạy trong LAN nhà mình" — file cấu hình vẫn có thể lộ qua backup, qua chia sẻ nhầm, qua nhiều cách không ngờ tới.
  • Quên tắt SIGNUPS_ALLOWED sau khi tạo tài khoản đầu tiên: đã nhắc ở trên, nhưng đáng nhắc lại vì đây là lỗi phổ biến nhất trong danh sách này.
  • Mobile app không sync tức thời như kỳ vọng: do chưa cấu hình push notification (xem phần nâng cao). Lưu ý thêm, push chỉ chạy với app tải từ App Store/Google Play chính chủ — bản F-Droid không hỗ trợ, dù server có cấu hình đúng cách mấy.
  • Restore backup sai cách: phục hồi file db.sqlite3 nhưng quên dọn file db.sqlite3-wal cũ còn sót lại, khiến Vaultwarden cố ráp dữ liệu từ WAL không khớp với database mới — dễ sinh lỗi hoặc corrupt. Xoá sạch các file -wal/-shm liên quan trước khi restore.

Tùy chọn nâng cao (không bắt buộc)

Mấy mục dưới đây không cần thiết để container chạy được, nhưng riêng mục đầu tiên thì thật ra gần như ai cũng cần làm ngay — chỉ là nó không thuộc phần "dựng container cơ bản" nên mình tách ra đây.

HTTPS qua Reverse Proxy

Vào Control Panel → Login Portal → Advanced → Reverse Proxy, tạo rule trỏ domain HTTPS (dùng *.synology.me có sẵn hoặc domain riêng) về port nội bộ của container Vaultwarden. Nghe thì nằm trong mục "nâng cao", nhưng thực tế extension trình duyệt Bitwarden từ chối thẳng thừng mọi kết nối không phải HTTPS hoặc localhost — nên nếu bạn định dùng extension, đây không phải bước tuỳ chọn, mà là bước gần như bắt buộc phải làm ngay sau khi container chạy được.

Push notification cho app di động

Không bật thì app vẫn hoạt động bình thường, chỉ là sync chậm hơn — vault chỉ cập nhật khi bạn mở app lên, thay vì đẩy về ngay lập tức. Muốn bật, đăng ký miễn phí ID/Key tại bitwarden.com/host, rồi thêm ba biến PUSH_ENABLED, PUSH_INSTALLATION_ID, PUSH_INSTALLATION_KEY vào phần environment trong compose.

SMTP và đổi database

Cấu hình SMTP để Vaultwarden tự gửi email mời user mới hoặc cảnh báo đăng nhập lạ — hữu ích nếu vault dùng chung cho cả gia đình. Còn việc đổi từ SQLite mặc định sang PostgreSQL hoặc MySQL chỉ thật sự cần khi số người dùng đông và truy cập đồng thời nhiều — đa số hộ gia đình dùng SQLite mặc định là đủ, không cần vọc thêm.

Backup và bảo mật vault

  • Không tạo shared folder cho thư mục /volume1/docker/vaultwarden — chỉ để admin truy cập qua File Station hoặc Docker, vì đây là nơi chứa toàn bộ vault đã mã hoá.
  • Không expose port 80/8080 thẳng ra Internet. Mọi truy cập từ ngoài LAN phải đi qua HTTPS (domain thật hoặc DDNS Synology + reverse proxy).
  • Cân nhắc tách ADMIN_TOKEN ra file .env riêng thay vì hard-code thẳng trong docker-compose, đỡ lộ khi chia sẻ file cấu hình.
  • Cấu hình Hyper Backup sao lưu định kỳ (hàng đêm) thư mục dữ liệu. Muốn chắc chắn tuyệt đối cho database SQLite đang chạy, dừng container trước khi backup, hoặc dùng lệnh backup built-in của Vaultwarden để tạo snapshot nhất quán thay vì copy file khi container đang ghi dở.

Backup xong nhớ thử restore ít nhất một lần. Backup mà chưa restore thử thì chỉ là một file nằm đó cho yên tâm — thứ bạn thật sự cần là chắc chắn nó dùng được lúc cần, chứ không phải chắc chắn nó "có tồn tại".

Mua NAS chính hãng

Xem tất cả →

Thiết bị NAS Synology & ổ cứng chính hãng Nhật Bản — tư vấn cấu hình, lắp đặt và bảo hành. Mua qua Shopee, giao toàn quốc.

No comments yet