When 1Password announced their price hike in early 2026, a 128-upvote thread on r/selfhosted lit up with the same question: "What's the alternative?" The answer, for anyone with a homelab, is Vaultwarden — a Rust reimplementation of Bitwarden that runs on a fraction of the resources and doesn't charge per family member.
I've been running Vaultwarden for two years. It stores 400+ passwords, handles TOTP codes, manages secure notes, and syncs across five family devices. Total cost: $0. This guide covers the full setup — Docker deployment, reverse proxy configuration, family organization, and mobile app integration.
What Is Vaultwarden?
Vaultwarden is an unofficial Bitwarden server implementation written in Rust. It's API-compatible with Bitwarden, meaning the official clients (iOS, Android, browser extensions, desktop apps) all work seamlessly.
Why not just use Bitwarden?
| Feature | Bitwarden Cloud | Vaultwarden Self-Hosted |
|---|---|---|
| Cost | $10-40/year | Free |
| Family members | 6 max on family plan | Unlimited |
| Attachments | 1GB limit | As much storage as you give it |
| 2FA (TOTP) | Premium feature | Included |
| Emergency access | Premium feature | Included |
| Server resources | N/A (they host) | ~100MB RAM |
The tradeoff: you manage the server. For homelab operators, that's not a tradeoff — that's Tuesday.
Prerequisites
- A server running Docker (or Docker Compose)
- A reverse proxy with HTTPS (Nginx Proxy Manager, Traefik, or Caddy)
- A domain or subdomain pointed at your server
- 10 minutes
Step 1: Deploy Vaultwarden
Vaultwarden runs as a single container with SQLite by default. No separate database required.
# docker-compose.yml
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
environment:
- WEBSOCKET_ENABLED=true
- SIGNUPS_ALLOWED=true
- ADMIN_TOKEN=${ADMIN_TOKEN}
- SMTP_HOST=${SMTP_HOST}
- SMTP_FROM=${SMTP_FROM}
- SMTP_PORT=${SMTP_PORT}
- SMTP_SECURITY=${SMTP_SECURITY}
- SMTP_USERNAME=${SMTP_USERNAME}
- SMTP_PASSWORD=${SMTP_PASSWORD}
volumes:
- ./vw-data:/data
ports:
- "80:80"
- "3012:3012" # Websocket for live sync
Create a .env file:
ADMIN_TOKEN=$(openssl rand -base64 48)
SMTP_HOST=smtp.gmail.com
[email protected]
SMTP_PORT=587
SMTP_SECURITY=starttls
[email protected]
SMTP_PASSWORD=your-app-password
Notes:
ADMIN_TOKENenables the admin panel at/adminSIGNUPS_ALLOWED=truelets you create accounts. Set tofalseafter setup.- SMTP is optional but recommended for email verification and notifications
Start the container:
docker compose up -d
Step 2: Reverse Proxy Configuration
Vaultwarden requires HTTPS. The WebSocket connection for live sync also needs proper forwarding.
Nginx Proxy Manager
- Add a proxy host for
vaultwarden.yourdomain.com - Forward to
http://vaultwarden:80 - Enable Websocket Support
- Request an SSL certificate
Traefik
labels:
- "traefik.enable=true"
- "traefik.http.routers.vaultwarden.rule=Host(`vaultwarden.yourdomain.com`)"
- "traefik.http.routers.vaultwarden.tls.certresolver=letsencrypt"
- "traefik.http.services.vaultwarden.loadbalancer.server.port=80"
- "traefik.http.routers.vaultwarden.service=vaultwarden"
# WebSocket support
- "traefik.http.routers.vaultwarden-ws.rule=Host(`vaultwarden.yourdomain.com`) && Path(`/notifications/hub`)"
- "traefik.http.routers.vaultwarden-ws.tls.certresolver=letsencrypt"
- "traefik.http.routers.vaultwarden-ws.service=vaultwarden-ws"
- "traefik.http.services.vaultwarden-ws.loadbalancer.server.port=3012"
Caddy
vaultwarden.yourdomain.com {
reverse_proxy localhost:80
# WebSocket for live sync
@ws {
path /notifications/hub
}
reverse_proxy @ws localhost:3012
}
Step 3: Initial Setup
- Visit
https://vaultwarden.yourdomain.com - Click Create account
- Use a strong master password — this is the only password you'll need to remember
Critical: Your master password cannot be recovered. If you forget it, your vault is permanently inaccessible. Store it in a physical safe or password manager escrow.
Step 4: Admin Panel Configuration
Access the admin panel at https://vaultwarden.yourdomain.com/admin using your ADMIN_TOKEN.
Recommended settings:
-
General Settings:
- Disable signups after creating your accounts
- Set
INVITATIONS_ALLOWED=trueto invite family members manually - Enable
SHOW_PASSWORD_HINT=falsefor security
-
SMTP Settings:
- Verify email verification is enabled
- Test with the "Send test email" button
-
Security:
- Set
KDF_ITERATIONS=600000(OWASP recommended minimum) - Enable
REQUIRE_EMAIL_2FA=truefor admin accounts
- Set
Step 5: Family Organization Setup
Vaultwarden supports organizations for secure password sharing.
Creating a Family Organization
- In the web vault, click New Organization
- Name it "Family" or similar
- Choose the free plan (all features are unlocked in Vaultwarden)
Collections and Access Control
Collections are folders within an organization. Create collections like:
- Home — WiFi, smart home accounts, utilities
- Finance — Banking, investment, tax software
- Shared — Netflix, Spotify, Amazon
- Emergency — Insurance, medical, estate documents
Access levels:
- Owner: Full control, can delete organization
- Admin: Manage users and collections
- User: Access assigned collections
- Manager: Manage users within specific collections
Inviting Family Members
- Go to Organization → People → Invite
- Enter their email
- Assign to appropriate collections
- They'll receive an email to join
Step 6: Client Setup
iOS / Android
- Download the official Bitwarden app
- Tap Settings → Self-hosted Environment
- Enter
https://vaultwarden.yourdomain.com - Log in with your credentials
Browser Extensions
- Install the Bitwarden extension
- Click Settings → Self-hosted Environment
- Set server URL
- Log in
Desktop Apps
Same process — all official Bitwarden clients support self-hosted instances.
Step 7: Migrating from Another Password Manager
From 1Password
- In 1Password, go to File → Export → All Items
- Choose
.1pifor.csvformat - In Vaultwarden web vault: Tools → Import Data
- Select 1Password format and upload
From Bitwarden Cloud
- Bitwarden web vault: Tools → Export Vault
- Choose
.json(encrypted) or.csv - Vaultwarden: Tools → Import Data → Bitwarden
From Chrome / Edge
- Chrome: Settings → Passwords → Export passwords
- Vaultwarden: Import as Chrome CSV
Advanced: Security Hardening
Fail2Ban
Protect against brute force attempts:
# /etc/fail2ban/jail.d/vaultwarden.conf
[vaultwarden]
enabled = true
port = http,https
filter = vaultwarden
logpath = /path/to/vw-data/vaultwarden.log
maxretry = 5
bantime = 3600
# /etc/fail2ban/filter.d/vaultwarden.conf
[Definition]
failregex = ^.*Username or password is incorrect\. Try again\. IP: <ADDR>.*$
ignoreregex =
Backup Strategy
Your password vault is critical infrastructure. Back it up:
#!/bin/bash
# /opt/backup-vaultwarden.sh
BACKUP_DIR="/backups/vaultwarden"
DATE=$(date +%Y%m%d_%H%M%S)
# Stop container for consistent backup
docker stop vaultwarden
# Backup data directory
tar -czf "$BACKUP_DIR/vaultwarden_$DATE.tar.gz" /path/to/vw-data
# Restart container
docker start vaultwarden
# Keep only last 30 days
find "$BACKUP_DIR" -name "vaultwarden_*.tar.gz" -mtime +30 -delete
Add to crontab for daily backups:
0 2 * * * /opt/backup-vaultwarden.sh
Offsite Backup with Rclone
# Sync to S3-compatible storage
rclone sync /backups/vaultwarden remote:password-backups
Troubleshooting
"Websocket connection failed"
Check your reverse proxy WebSocket configuration. The client needs access to /notifications/hub on port 3012.
"SMTP test failed"
- Gmail requires an App Password, not your regular password
- Check firewall rules for outbound port 587
- Verify
SMTP_FROMmatches the authenticated user
Slow sync on mobile
- Enable WebSocket support in your reverse proxy
- Check that
WEBSOCKET_ENABLED=trueis set - Verify mobile client is set to your self-hosted URL
Forgot master password
There is no recovery. This is by design. Export your vault regularly as a backup.
When to Use Bitwarden Cloud Instead
Consider Bitwarden's official service if:
- You don't want to manage a server
- You need guaranteed 99.99% uptime
- You want official support
- Compliance requirements mandate SOC2/ISO27001
For personal and family use, Vaultwarden provides the same security with more control.
Conclusion
Vaultwarden turns your homelab into a secure password management platform. For the cost of a few hundred megabytes of RAM, you get unlimited family members, unlimited attachments, and full control over your most sensitive data.
The 30 minutes you spend setting it up pays for itself in the first month of not paying subscription fees. And when the next password manager price hike hits, you'll be glad you made the switch.
Resources:
Running Vaultwarden in your homelab? Have a clever backup or integration setup? Share it in the Discord — always curious how people are securing their digital lives.