Contents· Why self-host your password manager?1/22
  1. 01Why self-host your password manager?
  2. 02Key benefits
  3. 03Prerequisites
  4. 04Deploy Vaultwarden in 5 steps
  5. 05Configure SMTP and email-based 2FA
  6. 06Configure SMTP correctly
  7. 07Client/server compatibility and silent errors
  8. 08Symptoms of a client/server version mismatch
  9. 09Diagnose and resolve the mismatch
  10. 10Empty vault after updating to Bitwarden clients 2026.8.0: diagnosis and fix
  11. 11Symptoms of this compatibility gap
  12. 12Diagnose and repair an empty vault
  13. 13Update 1.37.4: seven security fixes and breaking changes to know
  14. 14The seven security advisories in 1.37.4
  15. 15Before moving to 1.37.4: what can break
  16. 16Bitwarden moves to dual licensing: what changes, what does not
  17. 17What changes and what does not for Vaultwarden
  18. 18Do not confuse the clients' license with the server's license
  19. 19Regression in 1.37.1: master password change blocked
  20. 20SIGNUPS_ALLOWED=false trap: only set it after creating the admin account
  21. 21Daily backups in one cron line
  22. 22Official documentation

Why self-host your password manager?

Cloud password managers charge per user per month, store your encrypted vault on servers you don't control, and can disappear or raise prices overnight. Vaultwarden flips this model: one container on your VPS, one Docker volume to back up, and without limit user accounts for a fixed infrastructure cost. Because Vaultwarden speaks the Bitwarden protocol, every Bitwarden client — Chrome extension, Firefox add-on, iOS, Android, Windows, Linux, CLI — connects to your self-hosted instance without any modification.

Key benefits

  • 100% compatible with all official Bitwarden clients — no fork, no custom app, nothing to relearn
  • End-to-end AES-256 encryption: your master password never leaves your device
  • Under 50 MB of RAM at rest — runs comfortably on a 512 MB VPS alongside other services
  • All users and organization vaults, with encrypted sharing and role-based access
  • Built-in TOTP authenticator: replace Google Authenticator with a self-hosted alternative
  • Emergency access — grant a trusted contact read access after a configurable waiting period

Prerequisites

You need a VPS with at least 1 vCPU and 512 MB RAM, with Docker installed (Ubuntu 22.04 LTS recommended). You also need a domain name pointing to your VPS — Bitwarden clients refuse non-HTTPS vaults, so HTTPS is mandatory. Open ports 80 and 443 in your firewall: ufw allow 80 && ufw allow 443.

Deploy Vaultwarden in 5 steps

  1. Install Docker

    If Docker is not already installed: curl -fsSL https://get.docker.com | sh && systemctl enable --now docker. Verify with docker --version.

  2. Start Vaultwarden

    Launch the container: docker run -d --name vaultwarden --restart=always -v vaultwarden:/data -p 127.0.0.1:8000:80 -e WEBSOCKET_ENABLED=true vaultwarden/server:latest. The server starts in under a second and listens on port 8000 on localhost.

  3. Configure HTTPS with Caddy

    Install Caddy: apt install -y caddy. Create /etc/caddy/Caddyfile with: passwords.your-domain.com { reverse_proxy localhost:8000 }. Reload Caddy: systemctl reload caddy. A Let's Encrypt TLS certificate is provisioned automatically and renewed indefinitely — zero configuration.

  4. Create your account

    Open https://passwords.your-domain.com in your browser. Click "Create Account", choose a strong master password (it encrypts everything locally before anything is sent to the server), and your vault is active immediately.

  5. Lock down registrations

    Once all accounts are created, stop the container and relaunch it adding -e SIGNUPS_ALLOWED=false to the docker run command. Your instance is now invite-only. For ongoing user management, enable the admin panel by adding -e ADMIN_TOKEN=$(openssl rand -base64 48).

  6. First login

    When you first open the URL, Vaultwarden displays the Bitwarden web vault: click "Create account" and set your own email and master password (it is not recoverable by anyone, not even by us). Do this IMMEDIATELY: registration is open.

Configure SMTP and email-based 2FA

Vaultwarden can send emails for address verification, password reset, organization invitations and email-based two-factor authentication (_ENABLE_EMAIL_2FA=true). That last point deserves attention: if SMTP is not configured or misconfigured, email 2FA is declared active but never sends anything — the code never arrives, the user can no longer log in, and Vaultwarden surfaces no visible error.

The most common confusion involves ports and encryption. Two values coexist and are not interchangeable:

- Port 465 with SMTP_SECURITY=force_tls — TLS connection from the start (formerly "SMTPS"). Compatible with most ISPs and corporate relays.
- Port 587 with SMTP_SECURITY=starttls — plain connection that upgrades to TLS via the STARTTLS command. Expected by most modern SMTP providers (SendGrid, Brevo, Postmark, Gmail SMTP).

Using force_tls on port 587 — or starttls on port 465 — silently fails the SMTP connection: Vaultwarden logs nothing, emails don't go out, and the interface shows "sent" if you test from the admin panel. The only signal is the missing email on the recipient side.

Configure SMTP correctly

  1. Choose port and security based on your provider

    Check the documentation of your SMTP relay (Gmail, Brevo, Postmark, SendGrid…). Practical rule: if your provider specifies port 465 → SMTP_SECURITY=force_tls; if it specifies port 587 → SMTP_SECURITY=starttls. Never mix the two.

  2. Pass SMTP variables to the container

    Relaunch the container with the required variables:

    docker run -d --name vaultwarden --restart=always \
      -v vaultwarden:/data \
      -p 127.0.0.1:8000:80 \
      -e SMTP_HOST=smtp.your-provider.com \
      -e [email protected] \
      -e SMTP_PORT=587 \
      -e SMTP_SECURITY=starttls \
      -e SMTP_USERNAME=your_login \
      -e SMTP_PASSWORD=your_password \
      vaultwarden/server:latest
  3. Test sending from the admin panel

    Open https://passwords.your-domain.com/admin, scroll to the SMTP Email Settings section and use the Send test email button. If the email doesn't arrive within 60 seconds, check the container logs: docker logs vaultwarden 2>&1 | grep -i smtp. A Connection refused message indicates the wrong port; a TLS handshake error indicates a security mismatch.

  4. Enable email 2FA only after validating sending

    Only enable _ENABLE_EMAIL_2FA=true once the test send is confirmed. If you enable it first, users whose client requests a code receive nothing and get locked out. To unblock a locked account: open /admin, locate the user and click Deactivate TOTP to temporarily disable 2FA.

Client/server compatibility and silent errors

Recent Bitwarden clients introduced a new initial authentication flow that calls the /identity/accounts/prelogin/password endpoint. Vaultwarden instances pinned to a version earlier than 1.36.0 don't know this endpoint and return a 404 with no explicit message — the client simply displays a generic connection failure. The trap is insidious: devices already connected before the client update continue working normally, because their session is already established and doesn't go through this new authentication path. Only new devices fail. If you run curl https://your-domain.com/identity/accounts/prelogin/password -X POST -d '{"email":"[email protected]"}' -H 'Content-Type: application/json' and get a 404, your server is too old.

Symptoms of a client/server version mismatch

  • Cannot log in on a new device or browser, while existing devices work normally
  • Generic error message with no cause indicated ("An error has occurred" or "Invalid username or password")
  • Freshly installed Chrome or Firefox extension fails, but the same version on another machine works
  • The Bitwarden web vault hosted on your instance returns 404 on /identity/accounts/prelogin/password
  • No errors in server-side Vaultwarden logs — the endpoint doesn't exist, there's nothing to log
  • The problem appeared after an automatic Bitwarden client update on the new device

Diagnose and resolve the mismatch

  1. Check your server version

    Query the version endpoint: curl https://your-domain.com/api/version. If the response shows a version earlier than 1.36.0, your server doesn't support the new authentication flow used by recent clients.

  2. Update to the latest image

    The safest approach is to always use vaultwarden/server:latest and keep the image up to date. To update: docker pull vaultwarden/server:latest && docker stop vaultwarden && docker rm vaultwarden, then rerun the same docker run command as at installation. Vaultwarden preserves data in the volume — no manual migration needed.

  3. Verify the update took effect

    After restarting, query curl https://your-domain.com/api/version again and confirm the version is 1.36.0 or higher. Then test login from a new private browsing tab.

  4. Pin a version if stability is the priority

    If you prefer to control updates manually, use a versioned tag: vaultwarden/server:1.37.2 for example. In that case, monitor releases on GitHub and update whenever a new Bitwarden client version is deployed — the two are coupled.

Empty vault after updating to Bitwarden clients 2026.8.0: diagnosis and fix

If you updated a Bitwarden app to 2026.8.0, login succeeds but the vault stays empty, the culprit is not encryption. The Vaultwarden issues (#7607 and #7612, closed in August 2026) point to a compatibility gap in organization policy data: the 2026.8.0 client expects a revision date that the server did not send, throws an error and gives up displaying the vault. The server writes nothing to its logs, which makes the problem misleading. The server-side fix shipped in Vaultwarden 1.37.2 (released in August 2026), whose release notes say it is required for clients 2026.8.0 and later. If you run 1.37.4 or newer you already have it; if the vault is still empty, the client's local state is what needs cleaning first. One important correction: an earlier version of this article blamed a "new EncString format" that Vaultwarden supposedly could not read. We found no trace of that in the official issues, and that explanation has been removed.

Symptoms of this compatibility gap

  • Login is accepted, but the vault is empty or never finishes loading after sync
  • No autofill suggestions, a desktop app that crashes, or an extension showing "failed to fetch"
  • In the browser console, the error RangeError: Invalid time value in toSdkPolicyView (seen in issue #7612)
  • No error in the Vaultwarden server logs
  • Mostly reported on accounts that belong to an organization with at least one configured policy, even a disabled one; the web vault served by Vaultwarden works

Diagnose and repair an empty vault

  1. Check the server version

    Open /admin/diagnostics or run docker exec vaultwarden /vaultwarden --version. You need 1.37.2 at minimum for 2026.8.0+ clients. Also make sure only one instance is running: a duplicated compose file has caused identical symptoms before.

  2. Update the server if needed

    Use the same procedure as for any update (pull the image, recreate the container on the same volume). Aim straight for the latest version: see the 1.37.4 section below.

  3. Clean the client's local state

    Log out completely, then log back in. If the vault stays empty, clearing the extension storage (the policies entries) or uninstalling and reinstalling it fixes most cases. On macOS, some users had to delete the desktop app's container data before signing in again.

  4. Check the environment before downgrading

    Look at /admin/diagnostics for missing headers (a TOTP failure was fixed that way), keep the admin panel and the vault on the same domain, and test with ad blockers disabled. Only as a last resort, roll clients back to 2026.7.0, the version that worked for the first reporters, until the server is updated.

Update 1.37.4: seven security fixes and breaking changes to know

Vaultwarden 1.37.4 was released on 5 October 2026. Its notes list seven security advisories, first published privately and pending CVE assignment: at release time no CVE numbers were given, only GHSA identifiers. Most concern organizations (members, invitations, logs, API keys) and sharing features. If you run organizations or use Sends, update without waiting; for a strictly personal vault the risk is lower, but the update is still recommended.

The seven security advisories in 1.37.4

  • Organization member revocation: high severity, 8.1 (GHSA-69q9-v8p6-xvx3)
  • Two-factor authentication: medium severity, 6.8 (GHSA-7jg8-8m5x-6j9r)
  • Organization invitations: medium severity, 6.8 (GHSA-v576-3wvq-xh3c)
  • Attachments: medium severity, 6.5 (GHSA-q5x6-grh5-fqgc)
  • Organization event logs: medium severity, 4.3 (GHSA-64mc-4p6f-r7x9)
  • Cipher sharing: medium severity, 4.3 (GHSA-7ccc-c43j-4p36)
  • Organization API key: low severity, 3.8 (GHSA-qwx4-wcv4-mpcv)

Before moving to 1.37.4: what can break

  1. Reverse proxy and client IP

    With IP_HEADER=X-Forwarded-For, the retained address is now the rightmost one that is not listed in IP_HEADER_TRUSTED_PROXIES (it used to be the leftmost). If several proxies sit in a row in front of Vaultwarden, list them all in IP_HEADER_TRUSTED_PROXIES, otherwise your logs and rate limits will see the wrong address.

  2. Sends and the CLI

    bw send receive no longer works with CLI 2026.4.2 and older. Creating and managing Sends still works on all clients: update the CLI if you receive Sends on the command line.

  3. MariaDB or MySQL without TLS

    If your database server does not support native TLS connections, the Alpine image may fail to connect to it. Add MARIADB_TLS_DISABLE_PEER_VERIFICATION=1 to Vaultwarden's environment. With SQLite, the default in this guide, you are not affected.

  4. Removed options and endpoints

    Several experimental flags (for example ssh-agent or mutual-tls) were removed: if they are still listed in EXPERIMENTAL_CLIENT_FEATURE_FLAGS, startup logs a warning and saving admin panel settings fails until you remove them. DUO_USE_IFRAME is removed and ignored. The legacy POST /identity/accounts/register and POST /api/accounts/prelogin endpoints are gone; the notes say no current client uses them.

  5. Rotate the organization API key

    Before this release, an organization's Admins could also view its API key. If some of them are not fully trusted, rotate the key after updating (Admin Console, Settings, Rotate API key).

Bitwarden moves to dual licensing: what changes, what does not

On 9 October 2026, Bitwarden announced on its community forum that, starting with the next release, the apps published in the stores will be the commercially licensed builds; direct downloads from its website follow the same rule. The code continues to be developed and published under GPLv3 on GitHub. The clients repository already carried two licenses: GPLv3 by default, and the Bitwarden License v1.0 limited to the bitwarden_license folder. What is new is therefore mostly the binaries being distributed, not the code. The selfh.st weekly of 16 October flagged this shift, noting that the phrase "all current features are available in both versions" says nothing about future features. That is the point to watch.

What changes and what does not for Vaultwarden

  • Does not change: Bitwarden states there is no change to self-hosting; the Vaultwarden server is an independent project under the AGPL-3.0 license and is not affected by the clients' license
  • Does not change: current features remain available in both client versions, free plan included; existing users are asked to do nothing
  • Watch: Bitwarden warns that some future components will only be published under the commercial license, and that each new feature will be judged case by case; store clients and the GPLv3 build could diverge
  • Watch: if a future feature exists only in the commercial build, nothing guarantees it works with a third-party server; test each client update on a secondary account before rolling it out
  • If you want to stay on GPLv3 code, you can build the clients from the GitHub repository, at the cost of maintaining them yourself

Do not confuse the clients' license with the server's license

The announced change affects how Bitwarden distributes its apps. Vaultwarden remains a separate free software project, reimplementing the protocol on the server side under the AGPL-3.0 license. The deployment described in this guide has nothing to change today. Note the date of the client versions you validate: it is what will let you spot the day the two builds diverge. If you are migrating from Bitwarden's hosted service, the migration checklist in this guide remains valid as is.

Regression in 1.37.1: master password change blocked

Version 1.37.1 contains a known regression (GitHub issue #7659): the master password change request returns HTTP 422 with the message missing field newMasterPasswordHash. The operation fails server-side without the client providing useful information. The fix is in version 1.37.2, released shortly after. If you pinned version 1.37.1, upgrade directly to 1.37.2 — the command is the same as any other update: docker pull vaultwarden/server:1.37.2 && docker stop vaultwarden && docker rm vaultwarden, then relaunch the container with the new tag.

SIGNUPS_ALLOWED=false trap: only set it after creating the admin account

A common installation mistake: setting -e SIGNUPS_ALLOWED=false before creating the administrator account. Result — your own instance refuses account creation and you can no longer log in. The order is mandatory: (1) start without this parameter, (2) immediately create your admin account via the web interface, (3) only then relaunch the container with SIGNUPS_ALLOWED=false. If you've already locked yourself out, the escape hatch is to enable the admin panel via -e ADMIN_TOKEN=$(openssl rand -base64 48) and invite the admin user from /admin.

Daily backups in one cron line

Add this to the root crontab (crontab -e): 0 3 * * * docker run --rm -v vaultwarden:/data -v /backup:/out busybox tar czf /out/vaultwarden-$(date +%F).tar.gz /data. Run it every night at 3 AM — the entire vault (SQLite file + attachments) lands in /backup as a timestamped archive. Send this directory to S3 or Backblaze B2 with rclone for off-site protection.

Official documentation

For advanced configuration and tool-specific options, refer to the official Vaultwarden documentation. This guide covers getting online on a VPS; the vendor docs remain the reference for fine-tuning, major updates and specific use cases.

Deploy Vaultwarden on your VPS

Order a ServOrbit VPS, deploy Vaultwarden in minutes, and own your password vault forever.