Bitwarden’s recent announcement about eliminating the freemium tier, combined with the April 2026 CLI compromise incident, has pushed more homelab operators toward self-hosted password management.
Vaultwarden is the natural answer. It’s a lightweight, Rust-based reimplementation of the Bitwarden server API that runs in under 50 MB of RAM, works with every official Bitwarden client (browser extensions, desktop, iOS, Android), and gives you full control over your vault data.
This guide covers a production-ready Vaultwarden deployment with Docker Compose and Traefik, including the admin panel, automated backups, SMTP notifications, and security hardening. The result is a password manager that matches the official Bitwarden feature set without the subscription or resource overhead.
Why Vaultwarden Over Official Bitwarden
The official Bitwarden self-hosted option requires Docker with Microsoft SQL Server, consumes 2+ GB of RAM, and demands regular maintenance. Vaultwarden uses SQLite, runs on a Raspberry Pi Zero, and is a single binary.
| Feature | Official Bitwarden | Vaultwarden |
|---|---|---|
| RAM usage | 2-4 GB | ~50 MB |
| Database | SQL Server | SQLite |
| Image size | ~2 GB | ~50 MB |
| Setup time | 30-60 minutes | 5 minutes |
| Client compatibility | Full | Full |
| Organizations | Premium only | Included |
| Admin panel | Web UI | Web UI |
If you’re already running Docker in your homelab, Vaultwarden takes five minutes to deploy and uses fewer resources than most of your other containers.
Step 1: Directory Structure and Environment File
Create the project directory and environment configuration:
|
|
Environment file — /opt/vaultwarden/vaultwarden.env:
|
|
Generate the admin token:
|
|
Why disable signups immediately: Create your account before setting
SIGNUPS_ALLOWED=false. After that, new users join only via email
invitation through the admin panel. This prevents random internet
traffic from creating accounts if Vaultwarden is exposed (it shouldn’t
be — see Traefik security below).
Step 2: Docker Compose Configuration
/opt/vaultwarden/docker-compose.yml:
|
|
This compose file does three things in one stack:
- Vaultwarden — The password server itself. Connects to your
existing Traefik proxy network for automatic TLS. The label
vaultwarden-ipwhitelistis optional — add a middleware to restrict access to your home IP if you don’t need remote access. - Backup container — A lightweight Alpine container that runs a
sqlite3 .backupevery 24 hours. The backup is a live, consistent snapshot that doesn’t require stopping the Vaultwarden container. - Separate volumes —
vaultwarden_datafor the live database and attachments,vaultwarden_backupsfor daily backups. This keeps backups isolated from the live data.
Step 3: Deploy and Create Your Account
|
|
Vaultwarden starts on port 80 inside the container. Traefik routes
vault.gntech.dev to it and provisions a Let’s Encrypt certificate
automatically.
Create your account:
- Open
https://vault.gntech.devin your browser - Create your account with email and master password
- Log in, verify everything works
- Immediately disable open signups:
|
|
Install Bitwarden clients:
Every official Bitwarden app supports custom server URLs. Point them at your Vaultwarden domain:
- Browser extension: Settings → Self-hosted →
https://vault.gntech.dev - iOS/Android: Settings → Self-hosted →
https://vault.gntech.dev - Desktop app: File → Settings → Self-hosted →
https://vault.gntech.dev
Once connected, your vault syncs in real-time via WebSocket (enabled by
WEBSOCKET_ENABLED=true in the env file). Changes in the browser
extension appear on your phone within seconds.
Step 4: Admin Panel Configuration
The admin panel at https://vault.gntech.dev/admin gives you
server-wide management without needing to edit the env file.
What the admin panel lets you do:
- View all users and their vault status
- Send email invitations to new users
- Disable or delete user accounts
- View server configuration and diagnostics
- Check database and attachment storage usage
- Enable/disable 2FA requirements per organization
Access it with the ADMIN_TOKEN from your env file. It’s the single
password for the admin area — keep it long and generated via
openssl rand -base64 48.
Security note on the admin panel: Don’t expose the /admin path to
the public internet without additional protection. The Traefik
whitelist middleware restricts by source IP:
|
|
If you need remote access, use a WireGuard tunnel back to your homelab instead of opening the admin panel to the internet.
Step 5: Automated Backup and Restore
The backup container in the compose file runs sqlite3 .backup daily
and keeps 14 days of snapshots. SQLite’s .backup command produces a
consistent, transaction-safe copy without downtime.
Verify backup is running:
|
|
Restore a backup:
|
|
Extend the backup strategy with offsite copies:
|
|
For a complete disaster recovery plan, also back up these items:
vaultwarden.env— Contains SMTP and admin credentialsdocker-compose.yml— The compose file itself- Traefik certificate files — If you need to rebuild from scratch
Store the env file in an encrypted archive (age, GPG, or Ansible Vault) since it contains the admin token.
Step 6: Security Hardening
Vaultwarden is secure by default, but a few extra steps make it production-ready.
1. Use strong admin token
|
|
2. Keep Vaultwarden on the internal network only
Don’t expose Vaultwarden to the public internet. Route through Cloudflare Tunnel or WireGuard instead:
|
|
3. Enable 2FA on your vault
Bitwarden clients support TOTP, FIDO2/WebAuthn, and YubiKey. Enable two-step login from the web vault settings:
Account Settings → Security → Two-Step Login
Even if someone gets your master password, they can’t access your vault without the second factor.
4. Restrict database file permissions
|
|
5. Monitor for unusual activity
Check the Vaultwarden logs periodically:
|
|
If you use a monitoring stack, Vaultwarden exposes minimal metrics. Add a log shipper (Grafana Alloy, Loki, or similar) to watch for authentication failures.
Step 7: Updates
Vaultwarden releases frequently with security patches and features.
The :latest tag is updated on each release. Update with:
|
|
Check the Vaultwarden releases page for changelog highlights before updating.
Consider adding Watchtower or Diun for update notifications:
|
|
Diun checks for new images and sends a Telegram notification when an update is available. Pair it with Watchtower for automatic updates on non-critical containers.
Summary
Deploying Vaultwarden gives you a full-featured, self-hosted password manager that works with every Bitwarden client, uses minimal resources, and gives you complete control over your credentials.
The setup from this guide takes under ten minutes and gives you:
- Full Bitwarden API compatibility — All official clients work
- 50 MB RAM footprint — Runs alongside your other containers
- Automated daily backups — 14-day retention with SQLite consistency
- SMTP notifications — Email invites, password resets, account setup
- Admin panel management — User management without config file edits
- Traefik TLS — Automatic Let’s Encrypt certificates
- Disaster recovery — Offsite backup preparation included
With Bitwarden’s freemium tier being phased out and the recent security incidents, now is the right time to bring password management in-house. Vaultwarden makes it trivially easy — your passwords stay on your hardware, under your control, with no subscription required.
The compose file and env template from this guide are available on the GnTech GitHub repo. Point it at your domain, create your account, disable signups, and you’re done.