Storing master credentials inside third-party commercial clouds always involves trusting an external infrastructure team with your crown jewels. Even with mathematically sound zero-knowledge encryption, cloud-hosted password vaults present attractive central targets for sophisticated credential-stuffing campaigns, unexpected pricing model shifts, and forced telemetry. For sysadmins, software developers, and home lab builders, running a self-hosted password manager is the ultimate step toward complete digital sovereignty.
When reviewing the best password managers for engineers and sysadmins, Bitwarden is almost universally recognized as the top open-source standard. Its client applications across macOS, Windows, Linux, Android, iOS, and major browsers provide flawless autofill and hardware security key integration. However, deploying the official upstream Bitwarden backend is overkill for individuals and small teams: written in C# and .NET Core, it requires multiple interlinked Docker containers and a dedicated Microsoft SQL Server instance that easily demands 3 GB to 4 GB of system RAM.
That resource burden led to the creation of Vaultwarden (originally known as Bitwarden_rs). Written from the ground up in lightweight, memory-safe Rust, Vaultwarden implements the entire Bitwarden server API while operating comfortably on less than 40 MB of RAM. It delivers enterprise-grade credential management on a $4/month cloud VPS from Hetzner, a local Proxmox VE home lab hypervisor, or even a modest Raspberry Pi.
This tutorial provides a complete, battle-tested production walkthrough for deploying, securing, backing up, and maintaining Vaultwarden using Docker Compose, automated reverse proxies, zero-downtime hot backups, and intrusion detection.
1. Quick Takeaway & Architecture Comparison
If you need a fast architectural comparison before committing to your deployment plan, here is how Vaultwarden compares to the official Bitwarden stack:
| Dimension | Official Bitwarden Server | Vaultwarden (Rust Server) |
|---|---|---|
| Core Runtime | Microsoft .NET Core / C# | Single Native Compiled Rust Binary |
| Typical RAM Usage | 3,000 MB – 4,500 MB | 25 MB – 50 MB |
| Storage Engine | Microsoft SQL Server (MSSQL) | SQLite (Default with WAL), PostgreSQL, MariaDB |
| Docker Architecture | 10+ Connected Microservice Containers | 1 Single Container |
| Client Support | Official Desktop, Mobile, CLI & Extensions | 100% Native Compatibility with Official Clients |
| Premium Features | Requires Paid Enterprise License | Unlocked by Default (TOTP, Attachments, Org Sharing) |
| Best Suited For | Large Enterprises (500+ Enterprise Seats) | Home Labs, Small Teams, Families, Tech Enthusiasts |
Understanding the Zero-Knowledge Cryptographic Model
Vaultwarden operates on a strict zero-knowledge, client-side encryption principle:
- Client-Side Key Derivation: When you submit your master password, your device never sends it in plaintext over the wire. Instead, your local client uses PBKDF2 (or modern Argon2id) to compute an encryption key directly on your local machine.
- Local Payload Encryption: Vault items—passwords, notes, card numbers, and custom fields—are encrypted and decrypted strictly in memory using your browser’s native Web Crypto API.
- Encrypted Blob Storage: The Vaultwarden server receives only AES-256 encrypted blobs (ciphertext).
- Zero Server Visibility: If a threat actor gains physical or root access to your Linux host and dumps the underlying database, they will see only encrypted gibberish. Without your local master password, the vault contents cannot be decrypted.
Before creating your master vault credentials, test your passphrase strength with our Password Strength Checker or generate a high-entropy password using our Password Generator. You can also audit whether previous passwords have appeared in public data breaches using our guide on how to check if a password was leaked.
2. Infrastructure Requirements & Pre-Flight Planning
A password manager is critical infrastructure. If your server goes offline, you cannot access your systems. Plan your underlying infrastructure with resilience in mind.
System & Hardware Sizing
- CPU: 1 vCPU (x86_64 or ARM64). Vaultwarden’s Rust engine compiles efficiently across architectures.
- RAM: 512 MB minimum (1 GB recommended if running an automated reverse proxy like Caddy or Nginx Proxy Manager).
- Disk Storage: 10 GB SSD/NVMe storage formatted with a modern filesystem like Btrfs or Ext4.
Networking & Security Prerequisites
- Dedicated Domain Name: You must assign a subdomain (such as
vault.example.com) to your server. Understand how DNS resolution functions via what is DNS and what happens when you type a URL into a browser, and map anAorAAAArecord to your server’s IPv4 or IPv6 address. - Mandatory SSL/TLS (HTTPS): Modern web browsers enforce strict security isolation for cryptographic routines. The Bitwarden extension and web vault will fail to load over unencrypted HTTP. A valid TLS certificate from Let’s Encrypt or Cloudflare is mandatory.
- Hardened Linux Host: Deploy on a clean installation of Debian, Ubuntu Server, or Rocky Linux. Before exposing ports, implement SSH hardening best practices, configure firewall policies with our UFW Firewall Guide, isolate your containers with our guide to securing Docker in production, and configure mandatory access controls with AppArmor vs SELinux.
3. Step-by-Step Production Docker Deployment
Deploying Vaultwarden using Docker Compose provides a clean, declarative configuration that you can track with Git and GitHub.
Step 3.1: Directory Hierarchy & Permissions
Establish an isolated directory on your host:
sudo mkdir -p /opt/vaultwarden/vw-data
cd /opt/vaultwarden
Assign proper ownership so Docker containers can write persistent data without running as an unconfined root user:
sudo chown -R 1000:1000 /opt/vaultwarden/vw-data
(You can verify directory permission bits using our Linux Permission Calculator. For terminal editing, see our top Linux CLI text editors guide or use Micro editor.)
Step 3.2: Generating an Argon2id Admin Token
Vaultwarden provides an administrative portal at /admin for server health diagnostics and user management. Securing this endpoint with an Argon2id hash prevents brute-force compromises.
Generate the hash directly using Vaultwarden’s built-in CLI utility:
docker run --rm -it vaultwarden/server:latest /vaultwarden hash
Type a strong administrative passphrase when prompted. The utility outputs a structured Argon2id hash:
$argon2id$v=19$m=65536,t=3,p=4$TXVzaWMxMjM0...$9zX...
Copy the entire hash string. In Docker Compose files, dollar signs ($) must be escaped as double dollar signs ($$) to prevent shell variable substitution errors. Generate additional companion secrets with our Hash Generator and ENV Variable Generator.
Step 3.3: Composing the Production Stack
Create your compose configuration:
nano /opt/vaultwarden/docker-compose.yml
Paste the following production configuration:
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
environment:
- DOMAIN=https://vault.example.com
- WEBSOCKET_ENABLED=true
- SIGNUPS_ALLOWED=true
- INVITATIONS_ALLOWED=true
- SHOW_PASSWORD_HINT=false
- ADMIN_TOKEN=$$argon2id$$v=19$$m=65536,t=3,p=4$$your-escaped-hash-here
- LOG_FILE=/data/vaultwarden.log
- LOG_LEVEL=warn
- EXTENDED_LOGGING=true
- IP_HEADER=X-Forwarded-For
volumes:
- ./vw-data:/data
ports:
# Bound to localhost loopback for reverse proxy routing
- "127.0.0.1:8080:80"
networks:
- vault-net
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:80/alive"]
interval: 30s
timeout: 10s
retries: 3
networks:
vault-net:
driver: bridge
Environment Variable Reference
DOMAIN=https://vault.example.com: Informs the server of its public base URL. Mandatory for WebAuthn, FIDO2 keys (like YubiKey), and invitation links.WEBSOCKET_ENABLED=true: Enables real-time push syncing via WebSockets so vault edits on one device reflect immediately across all connected extensions and mobile apps.SIGNUPS_ALLOWED=true: Allows registration during initial deployment. Must be turned off immediately after registering your account.IP_HEADER=X-Forwarded-For: Instructs Vaultwarden to log the originating client IP forwarded by your reverse proxy, enabling accurate intrusion blocking with Fail2ban.
4. Reverse Proxy & Automated SSL Configuration
Because Vaultwarden binds to 127.0.0.1:8080, an edge reverse proxy is required to terminate TLS, manage HTTPS certificates, and handle WebSocket upgrade headers.
Option A: Caddy Server (Recommended for Automatic HTTPS)
Caddy provides zero-maintenance automatic TLS certificate management through Let’s Encrypt and natively handles WebSocket routing.
Create or edit /etc/caddy/Caddyfile:
vault.example.com {
encode gzip zstd
reverse_proxy 127.0.0.1:8080 {
header_up X-Forwarded-Proto {scheme}
header_up X-Real-IP {remote_host}
}
header {
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
X-Content-Type-Options "nosniff"
X-Frame-Options "DENY"
Referrer-Policy "strict-origin-when-cross-origin"
}
}
Reload Caddy to apply the changes:
sudo systemctl reload caddy
Option B: Nginx Virtual Host Configuration
For traditional Nginx deployments, generate a tuned virtual host. You can format custom configurations with our Nginx Config Generator.
Create /etc/nginx/sites-available/vaultwarden.conf:
server {
listen 80;
listen [::]:80;
server_name vault.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name vault.example.com;
ssl_certificate /etc/letsencrypt/live/vault.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/vault.example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Frame-Options "DENY" always;
add_header X-Content-Type-Options "nosniff" always;
client_max_body_size 128M;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSocket support
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
Enable the configuration and reload Nginx:
sudo ln -s /etc/nginx/sites-available/vaultwarden.conf /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Option C: Traefik Dynamic Labels
If running Traefik as your edge router, attach container labels directly in docker-compose.yml:
labels:
- "traefik.enable=true"
- "traefik.http.routers.vault.rule=Host(`vault.example.com`)"
- "traefik.http.routers.vault.entrypoints=websecure"
- "traefik.http.routers.vault.tls.certresolver=letsencrypt"
- "traefik.http.services.vault.loadbalancer.server.port=80"
(For web-based reverse proxies, follow our Nginx Proxy Manager Security Guide or explore deployment through PaaS orchestrators like Coolify, CapRover, or DokPloy.)
5. Initial Configuration & Security Lockdown
Start your Vaultwarden instance:
cd /opt/vaultwarden
docker compose up -d
Step 5.1: Register the Primary Administrator Account
- Open your browser and navigate to
https://vault.example.com. - Click Create Account.
- Choose a high-entropy Master Passphrase.
- Download and securely store your emergency recovery key.
Step 5.2: Lock Down Public Registrations (Mandatory Step)
To prevent unauthorized users from registering accounts on your server, immediately disable registration.
Edit /opt/vaultwarden/docker-compose.yml:
environment:
- DOMAIN=https://vault.example.com
- WEBSOCKET_ENABLED=true
- SIGNUPS_ALLOWED=false # <-- Set to false
- INVITATIONS_ALLOWED=false # <-- Set to false
Apply the updated configuration:
docker compose up -d --force-recreate
New users can now only be invited directly through the protected /admin console.
6. Configuring Transactional SMTP Email
Vaultwarden requires an SMTP email server to send two-factor authentication (2FA) codes, invitation links, emergency access alerts, and new login notifications. You can connect reliable transactional providers like Postmark, Brevo, SendGrid, or a self-hosted Mailcow instance.
Add SMTP variables to docker-compose.yml:
environment:
- SMTP_HOST=smtp.postmarkapp.com
- [email protected]
- SMTP_FROM_NAME=Vaultwarden Security
- SMTP_SECURITY=starttls
- SMTP_PORT=587
- SMTP_USERNAME=your-smtp-api-key
- SMTP_PASSWORD=your-smtp-token
- SMTP_AUTH_MECHANISM=Plain
Recreate the container:
docker compose up -d
Send a test email using the diagnostics tool in the /admin portal to confirm deliverability.
7. Connecting Official Bitwarden Clients
Vaultwarden is 100% compatible with all official Bitwarden client applications.
Connecting Browser Extensions (Chrome, Firefox, Safari, Edge, Brave)
- Install the official Bitwarden extension from your browser’s store.
- Before entering your email, click the Settings gear icon (⚙️) in the top-left corner of the extension popup.
- Under Server URL, enter your self-hosted instance address:
https://vault.example.com - Click Save and log in with your credentials.
Connecting Mobile Apps (iOS & Android)
- Download the official Bitwarden application from the Apple App Store or Google Play Store. (For alternative open-source mobile tools, check our KeePassDX Complete Guide or our curated list of best open-source Android apps).
- Tap the Settings gear (⚙️) on the welcome screen.
- Enter
https://vault.example.comin the Server URL field. - Tap Save and log in.
Configuring Push Notifications (Bitwarden Push Relay)
To enable instant mobile push notifications for login approvals, register your self-hosted instance on the official Bitwarden host portal to acquire an installation ID and key, then add:
- PUSH_ENABLED=true
- PUSH_INSTALLATION_ID=your-installation-id
- PUSH_INSTALLATION_KEY=your-installation-key
8. Enterprise Database Option: PostgreSQL
While SQLite with WAL mode easily handles millions of queries for personal use, organizations running multi-node clusters or deploying on Kubernetes across cloud computing providers can connect to PostgreSQL.
Here is a complete multi-container stack using PostgreSQL:
services:
postgres:
image: postgres:16-alpine
container_name: vaultwarden-db
restart: unless-stopped
environment:
POSTGRES_DB: vaultwarden
POSTGRES_USER: vw_user
POSTGRES_PASSWORD: StrongPostgresDatabasePasswordHere
volumes:
- db-data:/var/lib/postgresql/data
networks:
- vault-backend
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
depends_on:
- postgres
environment:
- DOMAIN=https://vault.example.com
- DATABASE_URL=postgresql://vw_user:StrongPostgresDatabasePasswordHere@postgres:5432/vaultwarden
- WEBSOCKET_ENABLED=true
- SIGNUPS_ALLOWED=false
volumes:
- ./vw-data:/data
ports:
- "127.0.0.1:8080:80"
networks:
- vault-backend
volumes:
db-data:
networks:
vault-backend:
driver: bridge
(You can format SQL queries and validate schemas using our SQL Formatter and JSON Formatter & Validator. If managing config files, convert between data formats with our JSON to YAML Converter.)
9. Automated Zero-Loss Backup Strategy
When self-hosting passwords, you are entirely responsible for backups. If your drive fails without a valid backup, your passwords cannot be recovered. Follow the 3-2-1 backup strategy detailed in our Self-Hosted Server Backup Strategies.
The SQLite Hot Backup Rule
Never copy an active SQLite database file (db.sqlite3) directly while Vaultwarden is writing to it. Doing so can cause database corruption. Instead, use SQLite’s atomic .backup API.
Production Backup Script
Create /usr/local/bin/backup-vaultwarden.sh:
sudo nano /usr/local/bin/backup-vaultwarden.sh
Paste the following script:
#!/usr/bin/env bash
set -euo pipefail
SOURCE_DIR="/opt/vaultwarden/vw-data"
BACKUP_DIR="/var/backups/vaultwarden"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
TEMP_DIR="/tmp/vw_backup_${TIMESTAMP}"
mkdir -p "${BACKUP_DIR}" "${TEMP_DIR}"
echo "[$(date)] Starting Vaultwarden atomic backup..."
# 1. Hot backup SQLite database atomically
sqlite3 "${SOURCE_DIR}/db.sqlite3" ".backup /db.sqlite3"
# 2. Copy cryptographic keys and uploaded attachments
cp "${SOURCE_DIR}/rsa_key"* "${TEMP_DIR}/" 2>/dev/null || true
if [ -d "${SOURCE_DIR}/attachments" ]; then
cp -r "${SOURCE_DIR}/attachments" "${TEMP_DIR}/"
fi
if [ -d "${SOURCE_DIR}/sends" ]; then
cp -r "${SOURCE_DIR}/sends" "${TEMP_DIR}/"
fi
# 3. Create compressed archive
ARCHIVE_FILE="${BACKUP_DIR}/vaultwarden_backup_${TIMESTAMP}.tar.gz"
tar -czf "${ARCHIVE_FILE}" -C "${TEMP_DIR}" .
# Clean temporary directory
rm -rf "${TEMP_DIR}"
# 4. Prune local backups older than 14 days
find "${BACKUP_DIR}" -name "vaultwarden_backup_*.tar.gz" -type f -mtime +14 -delete
echo "[$(date)] Backup completed: ${ARCHIVE_FILE}"
Make the script executable:
sudo chmod +x /usr/local/bin/backup-vaultwarden.sh
Scheduling with Cron
Schedule the backup script to run nightly at 3:00 AM. Generate custom cron syntax using our Cron Expression Generator.
sudo crontab -e
Add the following cron line:
0 3 * * * /usr/local/bin/backup-vaultwarden.sh >> /var/log/vaultwarden_backup.log 2>&1
For off-site disaster recovery, synchronize /var/backups/vaultwarden to encrypted remote object storage (such as AWS S3, Backblaze B2, or Azure Storage) using Restic, BorgBackup, Rclone, or Duplicati. You can also replicate backups between physical servers using rsync, scp, or Syncthing. For automation pipelines, explore n8n self-hosted workflows or system daemon units using our Systemd Service Builder.
10. Security Hardening & Intrusion Defense
Because your password vault is an internet-facing endpoint, apply defense-in-depth security layers.
1. Fail2ban Brute-Force Protection
Configure Fail2ban to monitor authentication logs and ban IP addresses that repeatedly fail login attempts.
Create /etc/fail2ban/filter.d/vaultwarden.conf:
[Definition]
failregex = ^.*\[AUTH\].*IP: <HOST>.*Invalid password.*$
^.*\[AUTH\].*IP: <HOST>.*User does not exist.*$
^.*\[AUTH\].*IP: <HOST>.*2FA verification failed.*$
ignoreregex =
Create /etc/fail2ban/jail.d/vaultwarden.local:
[vaultwarden]
enabled = true
port = 80,443
filter = vaultwarden
logpath = /opt/vaultwarden/vw-data/vaultwarden.log
maxretry = 4
findtime = 600
bantime = 86400
Restart Fail2ban:
sudo systemctl restart fail2ban
sudo fail2ban-client status vaultwarden
Alternatively, integrate CrowdSec for collaborative threat intelligence blocking. To scan server files for malware, check our ClamAV Antivirus Tutorial.
2. Enforcing Hardware Security Keys (FIDO2 / WebAuthn)
- Navigate to Account Settings -> Security -> Two-Step Login.
- Enable FIDO2 WebAuthn and register a physical hardware key such as a YubiKey.
- Disable insecure SMS 2FA.
3. Private VPN Isolation (Zero Public Exposure)
If you prefer not to expose your Vaultwarden instance over the public internet, deploy Tailscale or a self-hosted WireGuard VPN mesh. Binding Vaultwarden exclusively to your private VPN interface keeps the vault invisible to internet port scanners and automated bots. When sharing links safely, verify URLs with our malicious link checker guide.
11. Monitoring, Maintenance & Container Updates
Live System Monitoring
Monitor Vaultwarden service availability and SSL certificate expiration using Uptime Kuma. Track container metrics (CPU, RAM, disk I/O) with Netdata, Glances, or a Prometheus, Grafana, and Loki observability stack.
Automated Container Updates
You can automate container updates using Watchtower or pull updates manually:
cd /opt/vaultwarden
docker compose pull
docker compose up -d --remove-orphans
Perform regular security and vulnerability scans on your host using Ansible, Terraform, Trivy, and Lynis. For AI infrastructure, explore Ollama local models on Linux.
12. Troubleshooting Production Issues
Issue 1: “Web Crypto API Not Available”
- Symptom: Browser displays an error stating the Web Crypto API is unavailable and refuses to initialize the vault.
- Root Cause: Connecting over plain HTTP (
http://) or an invalid self-signed SSL certificate. - Fix: The Web Crypto API requires a secure HTTPS context. Ensure your reverse proxy has a valid Let’s Encrypt certificate.
Issue 2: Real-Time Sync Fails on Mobile
- Symptom: Edits on desktop do not push to mobile devices until a manual pull-to-refresh is performed.
- Root Cause: Reverse proxy missing WebSocket upgrade headers on
/notifications/hub. - Fix: Ensure
proxy_http_version 1.1andUpgradeheaders are forwarded in your Caddy or Nginx configuration as shown in Section 4.
Issue 3: SQLite Database Lock Errors
- Symptom: Vaultwarden logs report
database is locked (error 5). - Root Cause: Running the SQLite database on an NFS network mount that lacks POSIX locking support.
- Fix: Store
./vw-dataon local high-speed SSD/NVMe storage. Vaultwarden uses SQLite WAL mode by default, which requires shared-memory locking unsupported by some remote filesystems.
13. Vaultwarden vs Alternative Password Managers
| Solution | Best For | Advantages | Trade-Offs |
|---|---|---|---|
| Vaultwarden | Self-hosters, families, tech teams | Uses official Bitwarden apps, 50MB RAM, free TOTP | You manage host backups and server uptime |
| Official Bitwarden Server | Large enterprises (500+ seats) | Vendor enterprise support, SCIM/SSO integration | Heavy 4GB RAM footprint, MSSQL dependency |
| KeePassXC / KeePassDX | Offline local storage | Zero server infrastructure, .kdbx file vault | Manual file sync via Syncthing or Nextcloud |
| Passbolt | DevOps and engineering teams | Role-based GPG credential sharing | Complex multi-tier server setup |
| 1Password (Commercial) | Non-technical consumers | Polished proprietary ecosystem | Closed source, paid monthly subscription, cloud-locked |
For complementary self-hosted tools and open-source software, explore our guides on best open source alternatives, Nextcloud complete setup, Paperless-ngx document indexing, Immich photo management, Jellyfin media server, Stirling-PDF tools, yt-dlp open-source guide, and hosting websites for free. If inspecting authentication tokens or social metadata, test with our JWT Token Decoder, Base64 Encoder, Regex Tester, Schema Markup Generator, and Open Graph Social Preview.
Official Documentation
- Vaultwarden Official GitHub Repository
- Vaultwarden Official Wiki & Setup Documentation
- Bitwarden Official Help Center & App Downloads
- Vaultwarden Docker Hub Container Registry
- Bitwarden Security Whitepaper & Cryptography Specifications
Frequently Asked Questions
What is Vaultwarden and how does it differ from official Bitwarden?
Vaultwarden is an independent, lightweight implementation of the Bitwarden server API written in Rust. While the official Bitwarden server requires a large .NET and MSSQL stack consuming several gigabytes of RAM, Vaultwarden operates in a single container consuming under 50MB of RAM while remaining 100% compatible with official Bitwarden client apps.
Is Vaultwarden safe and secure for production password storage?
Yes. Vaultwarden uses the exact same zero-knowledge, end-to-end client-side encryption model as official Bitwarden. Your master password derives encryption keys locally on your device via PBKDF2 or Argon2id, and only encrypted ciphertext is transmitted to the server. Even if the server database is compromised, your credentials cannot be read without your master password.
Can I use the official Bitwarden mobile and browser apps with Vaultwarden?
Yes. Vaultwarden is fully compatible with the official Bitwarden desktop clients, mobile apps (iOS and Android), browser extensions (Chrome, Firefox, Safari, Edge, Brave), and the Bitwarden CLI. You simply configure the Custom Server URL in the client settings before logging in.
Why do Bitwarden clients require an HTTPS connection to connect to Vaultwarden?
Modern web browsers require a secure HTTPS context to expose the native Web Crypto API (window.crypto.subtle). Because Bitwarden clients perform all encryption and decryption operations locally using this API, they will refuse to initialize over unencrypted HTTP. A reverse proxy with a valid SSL certificate (like Let’s Encrypt) is mandatory.
How do I back up my self-hosted Vaultwarden database safely?
Because Vaultwarden uses SQLite with Write-Ahead Logging (WAL) by default, you should never copy active database files directly. Use SQLite’s atomic .backup command in an automated backup script to create a hot backup, compress attachments and encryption keys into a tarball, and sync the archive off-site using Restic, BorgBackup, or Rclone.
How do I update Vaultwarden to the latest version with Docker?
Upgrading Vaultwarden with Docker Compose takes seconds. Navigate to your project directory and run docker compose pull followed by docker compose up -d. Docker will download the latest container image and restart the service while preserving your persistent /data volume.
Can I share credentials with family members or team members in Vaultwarden?
Yes. Vaultwarden includes full support for organizations, collections, and shared credential folders. You can create an organization in the web vault and invite users via email. Premium features like organization sharing and built-in TOTP authenticators are fully unlocked in Vaultwarden without extra licensing fees.
What should I do if I forget my Vaultwarden master password?
Due to the zero-knowledge encryption architecture, your master password is the cryptographic key used to decrypt your database. Neither Vaultwarden administrators nor the database engine can recover or reset a forgotten master password. Always export an encrypted backup of your vault and store your emergency recovery kit in a secure offline location.
How can I restrict Vaultwarden access to a private home network or VPN?
To prevent exposing Vaultwarden to the public internet, you can bind the container to a private network interface managed by Tailscale, WireGuard, or local VLANs. By routing traffic through an internal reverse proxy without public port forwarding, your password vault remains completely inaccessible to internet threat actors.
Can I migrate existing credentials from Bitwarden Cloud, 1Password, or LastPass to Vaultwarden?
Yes. Export your existing credentials as a .csv or .json file from your current password manager. In your self-hosted Vaultwarden web interface, navigate to Tools -> Import Data, select your previous password manager format, upload the file, and click Import.



Discussion
Loading comments...