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.

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 runqua 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/servertừ 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 Manager | SSH + docker run |
|---|---|---|
| Cần gõ lệnh terminal | ✗ | ✓ |
| Cấu hình | Một file compose gọn | Lệnh dài, rời rạc |
| Dễ sửa lại sau | ✓ | ✗ |
| Thông báo khi lỗi | Rõ ràng qua giao diện | Mơ hồ, khó dò |
| Phù hợp với | Người mới dùng NAS | Người quen terminal |

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
dockerlà đủ.
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 Project → Create. Đặ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 DOMAIN và ADMIN_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:80Và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 sanglatest-alpinecho nhẹ hơn. Tuyệt đối đừng dùng tagtestingcho 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 hashchạ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ì.
Gõ 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.

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ếuhttps://, 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_ALLOWEDsau 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.sqlite3nhưng quên dọn filedb.sqlite3-walcũ 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/-shmliê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_TOKENra file.envriê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".



No comments yet