Published

Vaultwarden

Self-hosted password manager server, written in Rust and compatible with the Bitwarden apps and browser extensions. An unofficial project, not affiliated with Bitwarden, Inc. Fits a household or a small team that wants its passwords on its own server.

Resources by load level

What the app itself needs at each level, next to what we recommend for a server that runs only this app.

LevelWhat it meansApp requirementsRecommended
LightEstimateUp to 10 people (a household), about 2,000 vault items, a few devices each, under 1 GiB of attachments, SQLite, no admin page.0.25 vCPU · 0.25 GiB RAM · 1.5 GiB disk0.42 vCPU · 1.8 GiB RAM · 11.04 GiB disk
MediumEstimateUp to 50 users in a small business, organizations and collections, about 25,000 items, browser extensions online all day, up to 5 GiB of attachments, SQLite.0.5 vCPU · 0.5 GiB RAM · 5.5 GiB disk0.72 vCPU · 2.1 GiB RAM · 15.64 GiB disk
HeavyEstimateUp to 250 users across several organizations, about 100,000 items, hundreds of clients connected at once, up to 20 GiB of attachments, still on SQLite.1 vCPU · 1 GiB RAM · 20.5 GiB disk1.32 vCPU · 2.7 GiB RAM · 32.89 GiB disk

Recommended = app requirements + system baseline + safety headroom, under sizing policy 2026.10.0. Options stay at their defaults. “Estimate” means the sources give no number for that case, so it is worked out from them by the method stated under Components. How the numbers are built

Size it in the Stack Sizer

Ready-to-run files

Support level Supported

Compose template from the official sources; not yet verified by a run.

Create docker-compose

Components

What each component needs at each load level, before baseline and headroom.

vCPU / GiB RAM / GiB disk
ComponentLightMediumHeavySources
Vaultwarden (app)0.25 / 0.25 / 1.50.5 / 0.5 / 5.51 / 1 / 20.5[5][10][11][12][22][29][31]
How the estimates are worked out
  • Vaultwarden · Light: No upstream figure. Vaultwarden is one Rust binary with an embedded SQLite file, built for setups where the official server is too heavy; the official image table lists it running on a Raspberry Pi Zero W and Pi 1. RAM 0.25 GiB and a quarter core cover sync and the server-side PBKDF2 (600,000 iterations) of a few logins at a time. Disk: image 90,367,076 B compressed (0.084 GiB) + 303,042,560 B unpacked (0.282 GiB), both kept by the containerd store = 0.366 GiB. 0.366 + 1 GiB data and attachments → 1.5.
  • Vaultwarden · Medium: RAM: the light 0.25 GiB ×2 for one open WebSocket per online client, the SQLite page cache of a larger vault and up to 10 pooled DB connections (DATABASE_MAX_CONNS) → 0.5 GiB. vCPU: logins at the start of the workday each run PBKDF2 with 600,000 iterations, and full syncs serialize whole organization vaults → half a core. Disk: image 90,367,076 B compressed (0.084 GiB) + 303,042,560 B unpacked (0.282 GiB), both kept by the containerd store = 0.366 GiB. 0.366 + 5 GiB → 5.5.
  • Vaultwarden · Heavy: RAM: medium ×2 for hundreds of open WebSockets and a SQLite database of about 100,000 ciphers held hot in cache → 1 GiB. vCPU: one full core for bursts of logins (each PBKDF2 with 600,000 iterations) and large syncs; SQLite serializes writes, so more cores add little. Disk: image 90,367,076 B compressed (0.084 GiB) + 303,042,560 B unpacked (0.282 GiB), both kept by the containerd store = 0.366 GiB. 0.366 + 20 GiB → 20.5.

Ports

Public ports are meant to be reached from outside the stack, usually through a reverse proxy; internal ones stay on the stack's own network.

ComponentPortExposurePurposeSources
Vaultwarden80/tcpPublic, through a proxyWeb vault, client API and WebSocket notifications (Rocket HTTP); serve only through an HTTPS reverse proxy[1][3][22]

Every port in the catalog, with conflicts between apps

User and permissions (UID/GID)

The user each container's process runs as, and the paths it writes to. A bind mount for one of these paths must be writable by that UID:GID.

ComponentUID:GIDUserStarts as rootWrites toSources
Vaultwarden0:0rootNo/data[3][6][14]

Storage growth

How much each component's data grows per month at each load level, on top of the disk in the profile. A value marked Assumption is ANAROQ's stated assumption, not a figure from the sources; the notes say what it rests on.

GiB per month
ComponentLightMediumHeavySources
VaultwardenAssumption0.050.251[5][12]
What the growth figures rest on
  • Vaultwarden: Vault items are small encrypted records; growth comes from attachments and Send files, which have no size limit by default (USER_ATTACHMENT_LIMIT unset). Assumed upload rates: 50 MB, 250 MB and 1 GiB a month. Org event logs are off by default, trash is not auto-deleted, and the icon cache expires after 30 days.

Upgrade and rollback

How to move to a new version safely, and how to go back if it fails.

Back up first

Run docker compose exec vaultwarden /vaultwarden backup (SQLite copy into /data), then copy the whole /data volume: db.sqlite3, attachments, sends, config.json and rsa_key*. [12][24][25]

Upgrade steps

  1. Back up /data first (see backup). Then set the new pinned tag in the Compose file and run docker compose pull and docker compose up -d. [12][19]
  2. Vaultwarden applies its database migrations at start, so check the logs (docker compose logs vaultwarden) and the /alive check before you rely on the new version. [4][16][24]

Roll back

Stop the stack, restore the /data backup taken before the upgrade (delete any db.sqlite3-wal when restoring a .backup or VACUUM INTO copy), pin the previous tag and run docker compose up -d. [12][24]DerivedUpstream documents no downgrade. Migrations run forward at start, so an older binary on a migrated database is not safe; restoring the pre-upgrade backup is.

Known breaking changes

  • In 1.37.4: Legacy API endpoints that upstream Bitwarden dropped were removed, along with DUO_USE_IFRAME (Duo Traditional Prompt) and the automatic email 2FA code for clients older than 2025.5.0. Update old clients before upgrading. [5][27]DerivedThe release page was not reachable from the research environment; taken from the 1.37.3 → 1.37.4 diff of .env.template and the tagged commit 'Remove legacy API endpoints and compatibility code dropped upstream' (#7809).
  • In 1.37.0: The client IP header is trusted only from private addresses (IP_HEADER_TRUSTED_PROXIES=local); a proxy on a public address must be listed, or rate limits and fail2ban see the proxy IP. A DATABASE_URL without a scheme now only works if the file exists; use sqlite://. [5][28]DerivedTaken from the 1.36.0 → 1.37.0 changes of .env.template (commits #7472 and #7061); the release page was not reachable from the research environment.

Limits

  • The web vault needs HTTPS: the browser's Web Crypto API only runs in a secure context, so open it through the HTTPS proxy (or http://localhost in the local mode). DOMAIN must be the exact https:// URL users open. [1][5][13]
  • No SMTP in the template: email verification, invitation and 2FA emails are not sent. Without push credentials from bitwarden.com/host, mobile apps do not sync live; browsers and desktop apps get WebSocket updates on the same port. [5][22][23]
  • The template uses SQLite in /data. PostgreSQL and MySQL are supported upstream through DATABASE_URL, but not templated here, and moving from SQLite later is marked unsupported in the wiki. [5][21]
  • Settings saved in the /admin page go to /data/config.json and override environment variables, so a later change in the Compose file can be silently ignored. [18]

Security

  • Vaultwarden is not affiliated with Bitwarden, Inc.; report problems to the Vaultwarden project, not to Bitwarden support. It holds every user's encrypted vault, so treat the server and its backups as critical. [1][12]
  • Anyone who reaches the URL can register while SIGNUPS_ALLOWED is true. Create your accounts, then turn on close-signups; set INVITATIONS_ALLOWED=false too if organization owners should not invite. [8][14][17]
  • The /admin page is off. If you enable it, ADMIN_TOKEN must be an Argon2id PHC string from /vaultwarden hash (single-quoted in .env), never a plain token, and HTTPS must be in place first. [5][9][25]
  • Against brute force, Vaultwarden rate-limits logins per client IP and logs each failed login with the IP, which fail2ban on the host can ban. That needs the real client IP from the proxy (IP_HEADER) and the logs in a file (LOG_FILE). [5][15][16]
  • The container runs as root (no USER in the image). Running as 1000:1000 is documented, but then Rocket must listen on a port above 1024 or get CAP_NET_BIND_SERVICE. [6][14][20]

Backup

  • Back up daily: db.sqlite3 with sqlite3 .backup on the host or /vaultwarden backup in the container (the image has no sqlite3), plus attachments (required), sends, config.json and rsa_key* from /data. Encrypt the copies: config.json and rsa_key.pem are sensitive. [12][25]
  • Restore with Vaultwarden stopped; when restoring a .backup or VACUUM INTO copy, delete any db.sqlite3-wal first, or SQLite may corrupt the database. icon_cache does not need a backup. [12]

Latest release

Newest upstream release
Vaultwarden 1.37.4 [30]
This profile was checked against

Vaultwarden 1.37.4

This profile was checked against the newest release.

Checked on
14 Oct 2026
State
Checked within the last 90 days
Where releases are published
Docker Hub tags

Latest releases of every app

Version

Profile status
Published
Checked against release
Vaultwarden 1.37.4
Profile version
1.0.0
Figures verified
14 Oct 2026
Catalog release
2026.10.10
Sizing policy
2026.10.0
Compose file
Unverified

Sources

  1. Vaultwarden README at 1.37.4: web vault needs HTTPS (secure context), docker run and compose examples (DOMAIN, /data, 127.0.0.1:8000:80), disclaimer (Official repository · read 14 Oct 2026)
  2. Vaultwarden wiki: Using Docker Compose (minimal template: DOMAIN, SIGNUPS_ALLOWED true until your account exists, ./vw-data:/data, Caddy example) (Official Compose · read 14 Oct 2026)
  3. docker/Dockerfile.debian at 1.37.4: ROCKET_ADDRESS 0.0.0.0, ROCKET_PORT 80, VOLUME /data, EXPOSE 80, no USER, HEALTHCHECK --interval=60s --timeout=10s CMD /healthcheck.sh (Official repository · read 14 Oct 2026)
  4. docker/healthcheck.sh at 1.37.4: curl --fail http://localhost:$ROCKET_PORT<base path of DOMAIN>/alive (Official repository · read 14 Oct 2026)
  5. .env.template at 1.37.4: DOMAIN, SIGNUPS_ALLOWED (true), ADMIN_TOKEN (Argon2 PHC), IP_HEADER (X-Real-IP), IP_HEADER_TRUSTED_PROXIES (local), PASSWORD_ITERATIONS 600000, DATABASE_MAX_CONNS 10 (Official repository · read 14 Oct 2026)
  6. Registry config of vaultwarden/server:1.37.4 (linux/amd64): no User, ExposedPorts 80/tcp, Volumes /data, Healthcheck CMD /healthcheck.sh every 60 s, timeout 10 s (Measurement · read 14 Oct 2026)
  7. Vaultwarden wiki: Proxy examples (terminate TLS in a reverse proxy, upstream vaultwarden:80, forward the client IP; IP_HEADER X-Forwarded-For for proxies that send it) (Official docs · read 14 Oct 2026)
  8. Vaultwarden wiki: Disable registration of new users (SIGNUPS_ALLOWED=false; org admins can still invite; admin page invites) (Official docs · read 14 Oct 2026)
  9. Vaultwarden wiki: Enabling admin page (ADMIN_TOKEN as Argon2id PHC string from vaultwarden hash; disabled when no token is set; $ escaping in Compose) (Official docs · read 14 Oct 2026)
  10. Vaultwarden wiki: Home (unofficial Bitwarden server in Rust, for deployments where the official resource-heavy service is undesirable) (Official docs · read 14 Oct 2026)
  11. Vaultwarden wiki: Which container image to use (multi-arch image, tested on Raspberry Pi Zero W, Pi 1, Pi 3, Pi 4 and Pi 5) (Official docs · read 14 Oct 2026)
  12. Vaultwarden wiki: Backing up your vault (db.sqlite3 via sqlite3 .backup or /vaultwarden backup, attachments, sends, config.json, rsa_key*, icon_cache; restore with the -wal file removed) (Official docs · read 14 Oct 2026)
  13. Vaultwarden wiki: Enabling HTTPS (needed for the web vault; reverse proxy recommended over Rocket TLS) (Official docs · read 14 Oct 2026)
  14. Vaultwarden wiki: Hardening Guide (disable registration and invitations, password hints, avoid Rocket TLS, redact access_token in proxy logs, runs as root by default) (Official docs · read 14 Oct 2026)
  15. Vaultwarden wiki: Fail2Ban Setup (brute-force protection from the 'Username or password is incorrect' log line; needs the real client IP) (Official docs · read 14 Oct 2026)
  16. Vaultwarden wiki: Logging (stdout by default, LOG_FILE for a file) (Official docs · read 14 Oct 2026)
  17. Vaultwarden wiki: Disable invitations (INVITATIONS_ALLOWED=false) (Official docs · read 14 Oct 2026)
  18. Vaultwarden wiki: Configuration overview (environment variables; config.json written by /admin overrides every other method) (Official docs · read 14 Oct 2026)
  19. Vaultwarden wiki: Updating the vaultwarden image (docker compose pull, docker compose up -d; keep the /data volume) (Official docs · read 14 Oct 2026)
  20. Vaultwarden wiki: Running docker container with non-root user (writable /data, ROCKET_PORT ≥ 1024 or CAP_NET_BIND_SERVICE) (Official docs · read 14 Oct 2026)
  21. Vaultwarden wiki: Using the PostgreSQL backend (DATABASE_URL postgresql://…, percent-encoded password; SQLite migration unsupported) (Official docs · read 14 Oct 2026)
  22. Vaultwarden wiki: Enabling WebSocket notifications (on the main HTTP port since 1.29/1.31; mobile apps use push instead) (Official docs · read 14 Oct 2026)
  23. Vaultwarden wiki: Enabling mobile client push notification (PUSH_ENABLED with an installation id and key from bitwarden.com/host) (Official docs · read 14 Oct 2026)
  24. src/db/mod.rs at 1.37.4: embedded Diesel migrations run at start; backup_sqlite writes db_<UTC time>.sqlite3 next to the database with VACUUM INTO (Official repository · read 14 Oct 2026)
  25. src/main.rs at 1.37.4: CLI commands hash (Argon2 PHC for ADMIN_TOKEN) and backup (SQLite only; also on SIGUSR1) (Official repository · read 14 Oct 2026)
  26. Vaultwarden LICENSE.txt at 1.37.4: GNU AGPL v3 (image label AGPL-3.0-only) (Official repository · read 14 Oct 2026)
  27. .env.template at 1.37.3 (still documents DUO_USE_IFRAME and older client feature flags, removed in 1.37.4) (Official repository · read 14 Oct 2026)
  28. .env.template at 1.36.0 (DATABASE_URL as a bare path, no IP_HEADER_TRUSTED_PROXIES; both changed in 1.37.0) (Official repository · read 14 Oct 2026)
  29. Docker Hub tag vaultwarden/server:1.37.4 (linux/amd64): 90,367,076 B compressed; 5 layers decompressed and counted: 303,042,560 B (Measurement · read 14 Oct 2026)
  30. Docker Hub tags of vaultwarden/server (1.37.4 newest stable on 2026-10-14, pushed 2026-10-05; testing tags are unreleased builds) (Official repository · read 14 Oct 2026)
  31. Docker: containerd image store is the default on fresh Engine 29+ installs and keeps images compressed and uncompressed (Official docs · read 14 Oct 2026)
  32. Bitwarden: plans and pricing of the hosted Bitwarden Password Manager (Official docs · read 14 Oct 2026)

All self-hosted apps