Self-Hosting Bitwarden Password Manager on Proxmox: A Complete Guide


Ever feel uneasy about storing all your passwords in someone else’s cloud? I totally get it. After years of using various password managers, I finally took the plunge and self-hosted my own Bitwarden instance on my Proxmox cluster. And let me tell you – it’s been a game-changer!

In this tutorial, I’ll walk you through exactly how I set up a fully functional, secure Bitwarden server using Proxmox, complete with SSL certificates and a custom domain. By the end, you’ll have your own private password vault that you control entirely.

Why Self-Host Bitwarden?

Before we dive in, let’s talk about why you might want to do this. Sure, Bitwarden’s cloud service is excellent and reasonably priced, but self-hosting gives you:

  • Complete control over your data
  • No monthly fees (beyond your server costs)
  • Custom features and configurations
  • Learning experience with containerization and server management
  • Peace of mind knowing exactly where your passwords live

What You’ll Need

Here’s what I used for this setup:

  • Proxmox VE cluster (or single node)
  • A domain name with DNS control
  • Basic understanding of Linux command line
  • About 30-60 minutes of your time

Step 1: Creating the Proxmox Container

First things first – let’s create a new LXC container in Proxmox. I went with Ubuntu 22.04 LTS for this build because it’s rock-solid and well-supported.

Container Specifications

I allocated these resources for my Bitwarden instance:

  • CPU: 2 cores
  • RAM: 2GB
  • Storage: 20GB
  • Network: Bridge to your main network

Log into your Proxmox web interface and create the container with these specs. Once it’s running, SSH into it and let’s get started with the software installation.

Step 2: Installing Docker and Docker Compose

Bitwarden runs beautifully in Docker containers, so that’s our deployment method of choice.

# Update the system
sudo apt update && sudo apt upgrade -y

# Install Docker
sudo apt install docker.io docker-compose -y

# Add your user to the docker group
sudo usermod -aG docker $USER

# Enable Docker to start on boot
sudo systemctl enable docker
sudo systemctl start docker

# Log out and back in for group changes to take effect

Step 3: Setting Up Bitwarden

Now for the fun part! Bitwarden provides an excellent installation script that makes setup incredibly straightforward.

# Create a directory for Bitwarden
mkdir ~/bitwarden
cd ~/bitwarden

# Download the Bitwarden installation script
curl -Lso bitwarden.sh https://go.btwrdn.co/bw-sh
chmod +x bitwarden.sh

# Run the installer
./bitwarden.sh install

The installer will ask you a few questions:

  • Domain name: Enter your custom domain (e.g., passwords.yourdomain.com)
  • SSL certificate: Choose “Let’s Encrypt” for automatic SSL
  • Installation ID and Key: Get these from https://bitwarden.com/host (it’s free!)

Step 4: DNS Configuration

Before starting Bitwarden, make sure your DNS is properly configured. In your domain’s DNS settings, create an A record pointing your chosen subdomain to your Proxmox server’s IP address.

For example:

passwords.yourdomain.com → 192.168.1.100

Give DNS propagation a few minutes to work its magic.

Step 5: Initial Configuration and Startup

With DNS sorted, let’s configure and start our Bitwarden instance:

# Configure Bitwarden
./bitwarden.sh start

The first startup takes a few minutes as Docker downloads all the necessary images. Grab a coffee while you wait!

Step 6: SSL Certificate Setup

If you chose Let’s Encrypt during installation, Bitwarden will automatically request and configure SSL certificates. You can verify this worked by checking:

# Check if certificates were generated
sudo ls -la ./bwdata/ssl/

You should see your domain’s certificate files there.

Step 7: Creating Your Admin Account

Navigate to your new Bitwarden instance at https://passwords.yourdomain.com (or whatever domain you chose). You’ll see the beautiful Bitwarden web vault interface!

Click “Create Account” and set up your master account. This will be your admin account, so choose a strong master password – you know the drill!

Step 8: Configuring the Admin Panel

Bitwarden includes a handy admin panel for server management. Access it at: https://passwords.yourdomain.com/admin

Here you can:

  • Configure server settings
  • Manage user registrations
  • View server statistics
  • Configure SMTP for email notifications

I highly recommend setting up SMTP so users can receive email confirmations and password reset links.

Step 9: Client Applications

The beauty of self-hosting Bitwarden is that you can use all the official client applications – they just need to know where to find your server.

Browser Extensions

  1. Install the Bitwarden browser extension
  2. Click the settings gear
  3. Set the server URL to your custom domain
  4. Log in with your credentials

Mobile Apps

The process is similar on mobile:

  1. Install the Bitwarden app
  2. Before logging in, tap the settings gear
  3. Enter your custom server URL
  4. Log in normally

Maintenance and Backups

Running your own password manager means you’re responsible for keeping it updated and backed up. Here’s my maintenance routine:

Regular Updates

cd ~/bitwarden
./bitwarden.sh updateself
./bitwarden.sh update

Backup Strategy

I set up automated backups of the bwdata directory to both local storage and an offsite location. Your passwords are too important to lose!

# Simple backup script example
tar -czf bitwarden-backup-$(date +%Y%m%d).tar.gz ./bwdata/

Performance and Monitoring

My Bitwarden instance runs like a dream on the allocated resources. Here’s what I’ve observed:

  • RAM usage: Typically around 400-600MB
  • CPU usage: Minimal during normal operation
  • Response time: Lightning fast on the local network
  • Uptime: Rock solid (thanks, Proxmox!)

Troubleshooting Common Issues

SSL Certificate Problems

If Let’s Encrypt fails, check that:

  • Your domain is properly pointing to your server
  • Port 80 and 443 are accessible from the internet
  • Your firewall isn’t blocking the certificate validation

Database Connection Issues

Occasionally, you might see database connection errors. A simple restart usually fixes this:

./bitwarden.sh restart

Memory Issues

If you’re running low on RAM, consider increasing your container’s memory allocation or adding swap space.

Security Considerations

Self-hosting comes with security responsibilities:

  • Keep everything updated – OS, Docker, and Bitwarden
  • Use strong passwords for your server accounts
  • Enable fail2ban to protect against brute force attacks
  • Monitor your logs for suspicious activity
  • Regular security audits of your setup

Final Thoughts

Setting up self-hosted Bitwarden on Proxmox has been one of my favorite homelab projects. There’s something deeply satisfying about having complete control over such a critical piece of infrastructure.

The installation process is surprisingly straightforward thanks to Bitwarden’s excellent tooling, and the performance has been flawless. Plus, I love being able to customize settings and not worry about subscription renewals.

If you’re on the fence about self-hosting your password manager, I’d encourage you to give it a try. Start with a test setup, migrate a few passwords, and see how it feels. You might just find yourself wondering why you waited so long!

What’s Next?

Now that you’ve got Bitwarden running smoothly, consider exploring:

  • Setting up automated backups to cloud storage
  • Implementing monitoring with something like Uptime Kuma
  • Adding two-factor authentication for extra security
  • Configuring email notifications for security events

Have you set up your own Bitwarden instance? I’d love to hear about your experience in the comments below. And if you run into any snags following this tutorial, drop a comment and I’ll do my best to help you troubleshoot!


Remember: With great password power comes great responsibility. Keep your Bitwarden instance updated, backed up, and secure. Your future self will thank you!

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.