As a senior software engineer, I spend most of my professional life building things on top of infrastructure someone else owns and controls. At some point I decided to reclaim control of my own personal data from the major tech companies — driven by privacy concerns and the need to be more productive and intentional about my digital life. I wanted tools that worked for me, on my terms, without ads, without telemetry.

Part 1: Initial Deployment with Docker, Coolify, and Vaultwarden

This is the first post in a series. This one covers password management. Future installments will cover photo storage and file management — all running on a single VPS behind a reverse proxy with automatic SSL. Total monthly cost: roughly €8–12.

The Stack

The infrastructure relies on three components:

I chose Hetzner specifically for its EU location, GDPR compliance, and lack of US CLOUD Act exposure.

Setting Up the Server

Step 1 — Generate an SSH Key

ssh-keygen -t ed25519 -f ~/.ssh/hetzner

This generates a private key (never shared) and a public key (deployed to the server).

Step 2 — Create Your Hetzner Server

Create a Hetzner Cloud account, spin up a CAX11 instance, and paste your public key contents into the SSH key field.

To retrieve the public key contents:

cat ~/.ssh/hetzner.pub

Step 3 — Connect to Your Server

ssh -i ~/.ssh/hetzner root@YOUR_SERVER_IP

Step 4 — Set Up the Firewall

ufw allow 22    # SSH
ufw allow 80    # HTTP
ufw allow 443   # HTTPS
ufw enable

This restricts access to essential ports only.

Step 5 — Install Coolify

curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash

After installation, access the Coolify dashboard at http://YOUR_SERVER_IP:8000 to create an admin account. All subsequent management happens through the browser interface.

A Note on End-to-End Encryption

The applications deployed in this series use end-to-end encryption, meaning:

The security doesn't live at the server level. It lives at the client level.

Deploying Vaultwarden (Self-Hosted Bitwarden)

Vaultwarden is an unofficial but fully compatible Bitwarden server implementation written in Rust. It needs roughly 50MB of RAM versus 2GB+ for the official server, while maintaining identical AES-256 encryption. The server never sees plaintext passwords.

Step 1 — Deploy via Coolify

Navigate to your project, select New Resource, search for Vaultwarden, and deploy. Coolify pulls the vaultwarden/server:latest Docker image and configures the container internally.

Step 2 — Set Your Domain

After deployment, configure the Vaultwarden service domain as:

https://vault.yourdomain.com

Coolify automatically obtains a Let's Encrypt SSL certificate and configures Traefik routing.

Step 3 — Point Your DNS

Add an A record with your DNS provider:

vault.yourdomain.com → YOUR_SERVER_IP

Optionally, a wildcard record for automatic subdomain routing:

*.yourdomain.com → YOUR_SERVER_IP

Step 4 — Create Your Accounts

Visit https://vault.yourdomain.com and register accounts for every family member who needs access.

Step 5 — Disable Open Registration

Once accounts are created, prevent unauthorized sign-ups by setting Signup Allowed to false in Coolify, then restart the service.

Step 6 — Connect Your Devices

Vaultwarden is just the backend — you keep using the official Bitwarden clients on iOS, Android, browser extensions, and desktop. During setup, open Advanced Settings and point the app at your self-hosted server instead of bitwarden.com:

https://vault.yourdomain.com

Log in, and passwords sync across devices through your own server — no subscription, no third-party dependency, no unexpected policy changes.

What's Next

Part one establishes a self-hosted, end-to-end encrypted password manager on personal German infrastructure at minimal cost. The next post covers photo storage and file management, followed by disaster recovery.


Pricing reflects accuracy at time of publication and is subject to change. Self-hosting requires ongoing responsibility for updates, security, and backups. I have no affiliation with any of the tools mentioned.