Self-host Bitwarden with Vaultwarden on your home server. Docker Compose setup, HTTPS with Nginx Proxy Manager, Tailscale remote access, and family sharing configuration.
In the age of countless online accounts, a password manager is non-negotiable for security. However, trusting a third-party company with your digital keys can be a point of contention. This guide will walk you through deploying Vaultwarden, a lean, self-hosted implementation of the popular Bitwarden password manager, putting you in full control of your most sensitive data.

Bitwarden is a widely respected, open-source password manager praised for its security and cross-platform clients. Vaultwarden (formerly known as bitwarden_rs) is an unofficial, community-built server implementation written in Rust. It is fully compatible with the official Bitwarden mobile, desktop, and browser extension clients but uses a fraction of the resources, making it ideal for home servers.
So, why go through the trouble of self-hosting it?
Vaultwarden vs. Official Bitwarden Server:
| Feature | Official Bitwarden Server | Vaultwarden |
|---|---|---|
| Code Language | C#/.NET | Rust |
| Resource Usage | High (requires several GB RAM) | Very Low (~50-100MB RAM idle) |
| Setup Complexity | High | Low (single Docker container) |
| Features | All enterprise features | Core user features + some extras |
| Ideal For | Large organizations | Individuals, families, homelabs |

Before diving in, ensure you have the following ready:
# Install Docker and Docker Compose plugin on Debian/Ubuntu
sudo apt update && sudo apt install -y docker.io docker-compose-plugin
sudo systemctl enable --now docker
# Add your user to the docker group (log out and back in after)
sudo usermod -aG docker $USER
ssh, navigate directories, and edit text files (using nano or vim).
We'll use Docker Compose to define and run the Vaultwarden service in a single, manageable file. This method keeps your configuration persistent and makes updates trivial.
Create a Project Directory: This keeps everything organized.
mkdir ~/vaultwarden && cd ~/vaultwarden
Create the docker-compose.yml file: This is the core configuration. Use nano docker-compose.yml to create and edit it, then paste the following configuration.
version: '3.8'
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
environment:
# Admin token for the /admin interface (generate with: openssl rand -base64 48)
- ADMIN_TOKEN=your_super_secret_generated_token_here
# The URL your users will access the web vault from (change this!)
- DOMAIN=https://vault.your-domain.com
# Enable web vault (the admin UI)
- WEB_VAULT_ENABLED=true
# Disable new user signups after you create your account
- SIGNUPS_ALLOWED=false
# Enable event logging (for audit)
- LOG_LEVEL=warn
- LOG_FILE=/data/vaultwarden.log
- EXTENDED_LOGGING=true
# Enable WebSocket notifications for real-time sync
- WEBSOCKET_ENABLED=true
# Database connection (using the built-in SQLite is fine for most)
- DATABASE_URL=/data/db.sqlite3
volumes:
# Persistent volume for all vault data, attachments, and config
- ./vw-data:/data
ports:
# Maps host port 8812 to container port 80 (Web Vault)
# Maps host port 3012 to container port 3012 (WebSocket)
- "8812:80"
- "3012:3012"
# Uncomment the resource limits section if you want to constrain CPU/RAM
# deploy:
# resources:
# limits:
# cpus: '0.5'
# memory: 512M
Critical Actions:
ADMIN_TOKEN: Run openssl rand -base64 48 in your terminal and paste the output as the value. Save this token in your own password manager (like your old one)! You'll need it to access the admin panel at https://your-domain.com/admin.DOMAIN: Change vault.your-domain.com to the full public URL you plan to use (e.g., https://vault.mydomain.duckdns.org). This is crucial for proper functioning of attachments and icons.Launch Vaultwarden:
docker compose up -d
The -d flag runs it in detached (background) mode. Docker will pull the image and start the container. Verify it's running with docker compose ps.
With the container running, follow these steps to make your vault secure and accessible.
Reverse Proxy & HTTPS with Nginx Proxy Manager (NPM): Exposing port 8812 directly is unsafe. Use NPM to add SSL/TLS encryption.
vault.your-domain.com (the one you set in the DOMAIN variable).httpyour-server-ip (use the server's internal IP, e.g., 192.168.1.100).8812Web Vault First-Time Setup:
https://vault.your-domain.com.SIGNUPS_ALLOWED is still true. Create your master account. This will be your admin user account. Use a strong, unique master password and store its recovery code safely.docker-compose.yml, set SIGNUPS_ALLOWED: false, and run docker compose up -d again. Future accounts must be created via invites (see Family Sharing below).Remote Access Securely with Tailscale: Instead of opening ports on your router, use a VPN mesh like Tailscale for free, secure remote access.
100.x.x.x). Now you can access your vault at https://vault.your-domain.com only when your device is connected to your Tailscale network.Connect Clients: Download the Bitwarden app on your phone, or the browser extension for Chrome/Firefox. In the settings, change the server URL to https://vault.your-domain.com. Log in with the account you just created. Your data will sync securely to your self-hosted server.
Beyond storing passwords, Vaultwarden offers powerful features.
This is how you securely share passwords (like Netflix, WiFi) or secure notes with family members.
A unique feature that lets you create a one-time, expiring, encrypted link to send a note or file to someone. They don't need a Bitwarden account to view it. Great for sharing a Wi-Fi password with a guest or a single sensitive document.
Designate a trusted family member as an "Emergency Contact." They can request access to your vault. If you don't deny the request within a configured time (e.g., 7 days), they are granted access. This is crucial for disaster recovery.
Vaultwarden's efficiency is its superpower. Here's what you can expect on typical homelab hardware:
| Hardware Platform | Idle RAM Usage | CPU Usage (Idle/Sync) | Notes |
|---|---|---|---|
| Raspberry Pi 5 (4GB RAM) | ~50 MB | <1% / 5-15% | Runs effortlessly. Use an SSD via USB for better database performance. |
| Intel N100 Mini PC (e.g., Beelink S12 Pro) | ~70 MB | <1% / 2-5% | Overkill in the best way. Handles dozens of users without breaking a sweat. |
| Old Laptop (Intel i5-5200U) | ~80 MB | <1% / 2-8% | Perfect second life for aging hardware. |
Real-World Example: On a Beelink S12 Pro (Intel N100, 16GB RAM) running 10+ containers including Vaultwarden, the entire system idles around 3W of power. Vaultwarden's contribution to that is negligible. A full sync of a vault with 500 items on a mobile client takes 2-3 seconds and causes a brief, minor CPU spike.
correct-horse-battery-staple-42-Globe). Never reuse it../vw-data folder. Backup this entire directory regularly.
# Simple cron job to tar the data folder weekly
0 3 * * 0 tar -czf /path/to/backups/vaultwarden-$(date +\%Y\%m\%d).tar.gz -C /home/user/vaultwarden vw-data
SMTP_HOST, SMTP_FROM) so Vaultwarden can send invite emails, 2FA recovery codes, and security alerts. A free SendGrid or your ISP's SMTP server works.https://your-domain.com/admin with your ADMIN_TOKEN. Here you can view server metrics, delete old invite tokens, and see active user logs.cd ~/vaultwarden
docker compose pull vaultwarden
docker compose up -d --force-recreate vaultwarden
DOMAIN= variable in your docker-compose.yml. It must match exactly the URL you use to access the web vault (including https://).WEB_VAULT_ENABLED=true and the web vault is left open in a browser tab. The web vault is a single-page app that can use several hundred MB of RAM in your browser, not on the server. The server container remains lean.docker compose logs vaultwarden to see error messages. Common causes are permission issues on the ./vw-data folder.docker-compose.yml. There is no recovery.Self-hosting your password manager with Vaultwarden strikes a perfect balance between ultimate security/privacy control and sheer practicality. Its minimal resource footprint makes it a quintessential service for any low-power home server, from a Raspberry Pi tucked on a shelf to a dedicated mini-PC. By following this guide, you've not only secured your passwords but also taken a significant step in owning your personal data infrastructure. The initial setup is the hardest part; now you can enjoy a lifetime of free, private, and fast password management for you and your family.
Use Cases
Run your own Git server with Gitea. Docker Compose setup, SSH key authentication, mirroring GitHub repos, CI/CD with Gitea Actions, and resource usage on low-power hardware.

Use Cases
Go paperless with Paperless-ngx on your home server. Docker Compose installation, scanner integration, OCR configuration, auto-tagging rules, and mobile app setup.
Use Cases
Replace Google Photos with Immich on your home server. Complete Docker Compose setup on Intel N100, machine learning face recognition, mobile app configuration, and backup automation.
Check out our build guides to get started with hardware.
View Build Guides