{"id":150,"date":"2026-06-15T16:17:48","date_gmt":"2026-06-15T16:17:48","guid":{"rendered":"https:\/\/shattered.io\/de\/2026\/06\/15\/vaultwarden-einrichten\/"},"modified":"2026-06-15T16:19:10","modified_gmt":"2026-06-15T16:19:10","slug":"vaultwarden-einrichten","status":"publish","type":"post","link":"https:\/\/shattered.io\/de\/2026\/06\/15\/vaultwarden-einrichten\/","title":{"rendered":"Vaultwarden einrichten: 12 Schritte, 15 MB RAM [2026]"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Ein eigener Passwort-Manager auf eigener Hardware, voll kompatibel mit allen Bitwarden-Apps, und das mit rund 15 MB Arbeitsspeicher: Genau das liefert Vaultwarden. Das in Rust geschriebene Projekt bildet die Bitwarden-Server-API nach und l\u00e4uft selbst auf einem Raspberry Pi oder einem alten NAS fl\u00fcssig. Der offizielle Bitwarden-Server braucht daf\u00fcr typischerweise 1 GB RAM und mehr, weil er auf einem Java-Stack mit mehreren Containern aufsetzt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Diese Anleitung f\u00fchrt Sie in 12 Schritten durch eine produktionsreife Installation: Docker, <code>docker-compose.yml<\/code>, ein Argon2-gehashter Admin-Token, ein Reverse Proxy mit HTTPS, automatische Backups und H\u00e4rtung mit Fail2ban. Alle Befehle sind getestet, alle Versionsangaben stammen aus offiziellen Quellen. Stand: 15. Juni 2026, Vaultwarden 1.36.0.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"was-ist-vaultwarden-und-warum-selbst-hosten\">Was ist Vaultwarden und warum selbst hosten?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Vaultwarden (fr\u00fcher unter dem Namen Bitwarden_RS bekannt) ist eine inoffizielle, quelloffene Neuimplementierung der Bitwarden-Server-API in Rust. Das Projekt von Daniel Garc\u00eda steht unter der AGPL-3.0-Lizenz und z\u00e4hlt im Juni 2026 \u00fcber 62.000 Sterne auf GitHub, bei rund 2.900 Forks. Damit geh\u00f6rt es zu den popul\u00e4rsten Self-Hosting-Projekten \u00fcberhaupt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Der entscheidende Punkt: Vaultwarden spricht dasselbe Protokoll wie die offiziellen Bitwarden-Clients. Sie nutzen also die regul\u00e4ren Apps f\u00fcr Desktop, Browser-Erweiterung, iOS und Android sowie die Web-Oberfl\u00e4che, verbinden sie aber mit Ihrem eigenen Server statt mit der Bitwarden-Cloud. Funktionen wie Tresor-Freigaben, TOTP-Generierung, Passkeys, Organisationen und Notfallzugriff funktionieren weiterhin.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Warum \u00fcberhaupt selbst hosten? Drei Gr\u00fcnde stechen heraus. Erstens die Datensouver\u00e4nit\u00e4t: Ihre verschl\u00fcsselten Tresore liegen auf Ihrer Infrastruktur, nicht auf US-Servern. F\u00fcr Unternehmen und Beh\u00f6rden im DACH-Raum ist das ein DSGVO-Argument von Gewicht. Zweitens die Kosten: Premium-Funktionen, die bei Bitwarden Geld kosten (etwa der integrierte TOTP-Generator oder Organisationen mit mehreren Nutzern), sind bei Vaultwarden ohne Abo verf\u00fcgbar. Drittens die Effizienz: Der Ressourcenhunger ist minimal.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ein wichtiger Hinweis zur Verantwortung: Mit dem eigenen Server \u00fcbernehmen Sie auch das Risiko. Updates, Backups, TLS-Zertifikate und Erreichbarkeit liegen jetzt bei Ihnen. Wer eine zentrale Datei verliert oder den Server falsch absichert, gef\u00e4hrdet alle gespeicherten Zugangsdaten. Diese Anleitung deckt deshalb nicht nur die Installation ab, sondern auch Backup und H\u00e4rtung.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"vaultwarden-vs-offizieller-bitwarden-server\">Vaultwarden vs. offizieller Bitwarden-Server<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Beide Server lassen sich selbst betreiben, unterscheiden sich aber technisch deutlich. Die offizielle Bitwarden-Self-Hosting-Variante besteht aus mehreren Docker-Containern (API, Identity, Web-Vault, SQL Server, Nginx) und ist f\u00fcr gr\u00f6\u00dfere Organisationen mit kommerziellem Support gedacht. Vaultwarden packt alles in eine einzige Rust-Bin\u00e4rdatei und ist f\u00fcr kleine bis mittlere Setups ideal.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Merkmal<\/th><th>Vaultwarden 1.36.0<\/th><th>Bitwarden (offiziell, self-hosted)<\/th><\/tr><\/thead><tbody><tr><td>Sprache<\/td><td>Rust<\/td><td>C#\/.NET und Java-Komponenten<\/td><\/tr><tr><td>RAM-Bedarf (Leerlauf)<\/td><td>ca. 10 bis 15 MB<\/td><td>ca. 1 bis 1,5 GB<\/td><\/tr><tr><td>Container<\/td><td>1 (alles inklusive)<\/td><td>mehrere (API, Identity, DB, Proxy)<\/td><\/tr><tr><td>Standard-Datenbank<\/td><td>SQLite<\/td><td>MS SQL Server<\/td><\/tr><tr><td>Premium-Funktionen<\/td><td>kostenlos enthalten<\/td><td>teils kostenpflichtige Lizenz<\/td><\/tr><tr><td>Lizenz<\/td><td>AGPL-3.0<\/td><td>propriet\u00e4r plus AGPL-Anteile<\/td><\/tr><tr><td>Eignung<\/td><td>Privat, Familie, kleines Team<\/td><td>Unternehmen mit Support-Vertrag<\/td><\/tr><tr><td>Offizieller Support<\/td><td>Community-Forum<\/td><td>kommerzieller Bitwarden-Support<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Der Unterschied von rund Faktor 100 beim Arbeitsspeicher ist kein Tippfehler. Genau deshalb l\u00e4uft Vaultwarden problemlos auf einem Raspberry Pi 4, einem Synology- oder QNAP-NAS oder einem g\u00fcnstigen VPS mit 1 GB RAM. Wer dagegen mehrere hundert Nutzer mit kommerziellem SLA verwalten muss, f\u00e4hrt mit der offiziellen Variante oder der Bitwarden-Cloud besser.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ein Detail zur Lizenz: Vaultwarden b\u00fcndelt das offizielle Web-Vault, das unter einer eigenen Lizenz steht. Der private Eigenbetrieb ist davon nicht betroffen. Eine kommerzielle Weiterverbreitung sollte die Lizenzbedingungen genau pr\u00fcfen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"voraussetzungen-und-versionen\">Voraussetzungen und Versionen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Bevor Sie starten, sollten diese Komponenten bereitstehen. Die Versionsangaben sind getestete Mindestst\u00e4nde, neuere Versionen funktionieren ebenfalls.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Ein Linux-Server (empfohlen: Debian 12, Ubuntu 24.04 LTS oder vergleichbar) mit Root- oder sudo-Zugriff.<\/li><li>Docker Engine 27 oder neuer und das Plugin Docker Compose v2 (Befehl <code>docker compose<\/code>, nicht das alte <code>docker-compose<\/code>).<\/li><li>Eine eigene (Sub-)Domain, etwa <code>vault.example.de<\/code>, mit einem A- bzw. AAAA-Record, der auf die \u00f6ffentliche IP des Servers zeigt.<\/li><li>Offene Ports 80 und 443 in der Firewall, da Let&#8217;s Encrypt f\u00fcr die Zertifikatsausstellung Port 80 erreichen muss.<\/li><li>Ein Reverse Proxy. Diese Anleitung nutzt Nginx, Caddy oder Traefik funktionieren analog.<\/li><li>Vaultwarden 1.36.0 (Docker-Image <code>vaultwarden\/server<\/code>, ver\u00f6ffentlicht am 3. Mai 2026).<\/li><li>Mindestens 512 MB RAM und 1 GB freier Speicher, f\u00fcr Backups etwas mehr.<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Warum eine echte Domain und nicht nur eine IP? Die Bitwarden-Clients setzen auf die WebCrypto-API des Browsers (<code>window.crypto.subtle<\/code>). Diese ist nur in einem sicheren Kontext (HTTPS) verf\u00fcgbar. Ohne g\u00fcltiges TLS-Zertifikat scheitert die Ver- und Entschl\u00fcsselung im Browser, und der Tresor l\u00e4dt nicht. Eine Domain brauchen Sie deshalb zwingend, ein selbstsigniertes Zertifikat f\u00fchrt auf Mobilger\u00e4ten regelm\u00e4\u00dfig zu Problemen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pr\u00fcfen Sie zuerst, ob Docker korrekt installiert ist:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ docker --version\nDocker version 27.5.1, build 9f9e405\n\n$ docker compose version\nDocker Compose version v2.32.4<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"schritt-1-bis-3-server-vorbereiten-und-docker-installieren\">Schritt 1 bis 3: Server vorbereiten und Docker installieren<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"schritt-1-system-aktualisieren\">Schritt 1: System aktualisieren<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Bringen Sie das Betriebssystem zuerst auf den aktuellen Stand. Auf Debian oder Ubuntu:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt update &amp;&amp; sudo apt upgrade -y\nsudo apt install -y curl ca-certificates sqlite3<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"schritt-2-docker-und-compose-installieren\">Schritt 2: Docker und Compose installieren<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Das offizielle Installationsskript von Docker richtet Engine und Compose-Plugin in einem Schritt ein. Eine ausf\u00fchrliche Referenz dazu liefert die <a href=\"https:\/\/docs.docker.com\/compose\/\" target=\"_blank\" rel=\"noopener nofollow\">offizielle Docker-Compose-Dokumentation<\/a>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -fsSL https:\/\/get.docker.com | sudo sh\nsudo usermod -aG docker $USER\n# danach einmal ab- und wieder anmelden, damit die Gruppe greift<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Die Zugeh\u00f6rigkeit zur Gruppe <code>docker<\/code> erlaubt Docker-Befehle ohne <code>sudo<\/code>. Beachten Sie, dass diese Gruppe faktisch Root-Rechte gew\u00e4hrt. Nehmen Sie nur vertrauensw\u00fcrdige Konten auf.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"schritt-3-projektverzeichnis-anlegen\">Schritt 3: Projektverzeichnis anlegen<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Legen Sie einen festen Ort f\u00fcr Konfiguration und Daten an. Diese Trennung erleichtert sp\u00e4tere Backups:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo mkdir -p \/opt\/vaultwarden\/vw-data\ncd \/opt\/vaultwarden<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Im Ordner <code>vw-data<\/code> wird Vaultwarden sp\u00e4ter die SQLite-Datenbank (<code>db.sqlite3<\/code>), den RSA-Schl\u00fcssel, Anh\u00e4nge und die Logdatei ablegen. Dieser Ordner ist Ihr wertvollstes Gut. Wer ihn verliert, verliert alle Tresore.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"schritt-4-bis-6-docker-compose-yml-und-admin_token\">Schritt 4 bis 6: docker-compose.yml und ADMIN_TOKEN<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"schritt-4-admin-token-mit-argon2-erzeugen\">Schritt 4: Admin-Token mit Argon2 erzeugen<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Das Admin-Panel von Vaultwarden ist \u00fcber <code>\/admin<\/code> erreichbar und sch\u00fctzt sich mit dem <code>ADMIN_TOKEN<\/code>. Speichern Sie diesen Token niemals im Klartext. Vaultwarden bringt einen Befehl mit, der Ihr Passwort als Argon2id-Hash im PHC-Format ausgibt:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker run --rm -it vaultwarden\/server \/vaultwarden hash<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Sie werden zur Eingabe eines starken Passworts aufgefordert. Die Ausgabe sieht etwa so aus:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Generate an Argon2id PHC string...\nPlease provide the password:\n\nADMIN_TOKEN='$argon2id$v=19$m=65540,t=3,p=4$bXBhc3N3b3Jkc2FsdA$Nq7l...gP4'<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Kopieren Sie die gesamte Zeichenkette inklusive <code>$argon2id...<\/code>. Argon2id ist ein speicherintensives Hash-Verfahren, das Brute-Force auf den Token erheblich verteuert. Mehr zur Funktionsweise solcher Verfahren lesen Sie in unserem Beitrag zur <a href=\"\/de\/passwortsicherheit\/\">Passwortsicherheit mit Hashing und 2FA<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"schritt-5-docker-compose-yml-schreiben\">Schritt 5: docker-compose.yml schreiben<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Erstellen Sie die Datei <code>\/opt\/vaultwarden\/docker-compose.yml<\/code>. Tragen Sie Ihre Domain und den eben erzeugten Token ein. Achtung beim Dollarzeichen: Docker Compose interpretiert <code>$<\/code> als Variable. Hinterlegen Sie den Token deshalb in einer separaten <code>.env<\/code>-Datei oder verdoppeln Sie jedes <code>$<\/code> zu <code>$$<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>services:\n  vaultwarden:\n    image: vaultwarden\/server:1.36.0\n    container_name: vaultwarden\n    restart: unless-stopped\n    environment:\n      DOMAIN: \"https:\/\/vault.example.de\"\n      SIGNUPS_ALLOWED: \"true\"\n      ADMIN_TOKEN: ${ADMIN_TOKEN}\n      LOG_FILE: \"\/data\/vaultwarden.log\"\n      LOG_LEVEL: \"warn\"\n      ROCKET_PORT: \"80\"\n    volumes:\n      - .\/vw-data:\/data\n    ports:\n      - \"127.0.0.1:8080:80\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Legen Sie daneben eine Datei <code>.env<\/code> an, die den Token enth\u00e4lt. So vermeiden Sie das Escaping-Problem und halten das Geheimnis aus der Compose-Datei heraus:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># \/opt\/vaultwarden\/.env\nADMIN_TOKEN='$argon2id$v=19$m=65540,t=3,p=4$bXBhc3N3b3Jkc2FsdA$Nq7l...gP4'<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Zwei Punkte sind hier zentral. Erstens bindet <code>ports: \"127.0.0.1:8080:80\"<\/code> den Dienst nur an localhost. Vaultwarden ist damit nicht direkt aus dem Internet erreichbar, sondern ausschlie\u00dflich \u00fcber den Reverse Proxy. Zweitens fixiert das Tag <code>:1.36.0<\/code> die Version. Verwenden Sie nicht das Tag <code>:latest<\/code>, denn unkontrollierte Upgrades k\u00f6nnen Migrationen ausl\u00f6sen, die Sie nicht eingeplant haben.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"schritt-6-wichtige-umgebungsvariablen-verstehen\">Schritt 6: Wichtige Umgebungsvariablen verstehen<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Vaultwarden steuert nahezu alles \u00fcber Umgebungsvariablen. Diese Auswahl deckt die wichtigsten F\u00e4lle ab:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Variable<\/th><th>Beispielwert<\/th><th>Funktion<\/th><\/tr><\/thead><tbody><tr><td><code>DOMAIN<\/code><\/td><td>https:\/\/vault.example.de<\/td><td>Vollst\u00e4ndige URL, zwingend f\u00fcr Login und WebCrypto<\/td><\/tr><tr><td><code>ADMIN_TOKEN<\/code><\/td><td>$argon2id$v=19$&#8230;<\/td><td>Argon2-Hash f\u00fcr das Admin-Panel<\/td><\/tr><tr><td><code>SIGNUPS_ALLOWED<\/code><\/td><td>false<\/td><td>Selbstregistrierung erlauben oder sperren<\/td><\/tr><tr><td><code>SIGNUPS_DOMAINS_WHITELIST<\/code><\/td><td>example.de<\/td><td>Registrierung nur f\u00fcr bestimmte Mail-Domains<\/td><\/tr><tr><td><code>INVITATIONS_ALLOWED<\/code><\/td><td>true<\/td><td>Einladungen trotz gesperrter Registrierung<\/td><\/tr><tr><td><code>SMTP_HOST<\/code><\/td><td>mail.example.de<\/td><td>Mailserver f\u00fcr Einladungen und 2FA-Mails<\/td><\/tr><tr><td><code>PUSH_ENABLED<\/code><\/td><td>true<\/td><td>Push-Benachrichtigungen an Mobil-Apps<\/td><\/tr><tr><td><code>LOG_FILE<\/code><\/td><td>\/data\/vaultwarden.log<\/td><td>Logdatei, Voraussetzung f\u00fcr Fail2ban<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Die vollst\u00e4ndige Referenz pflegt das Projekt im <a href=\"https:\/\/github.com\/dani-garcia\/vaultwarden\/wiki\" target=\"_blank\" rel=\"noopener nofollow\">offiziellen Vaultwarden-Wiki<\/a>. Stellen Sie <code>SIGNUPS_ALLOWED<\/code> nur f\u00fcr die Ersteinrichtung auf <code>true<\/code> und sperren Sie es danach sofort wieder.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"schritt-7-bis-9-reverse-proxy-und-https-mit-nginx\">Schritt 7 bis 9: Reverse Proxy und HTTPS mit Nginx<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"schritt-7-container-starten\">Schritt 7: Container starten<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Starten Sie Vaultwarden im Hintergrund und pr\u00fcfen Sie den Status:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd \/opt\/vaultwarden\ndocker compose up -d\ndocker compose logs -f --tail 20<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Eine erfolgreiche Ausgabe sieht so aus:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>vaultwarden  | [INFO] Rocket has launched from http:\/\/0.0.0.0:80\nvaultwarden  | [INFO] Starting Vaultwarden 1.36.0\nvaultwarden  | [INFO] Web-Vault version: 2026.x.x\nvaultwarden  | [INFO] Database: SQLite<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"schritt-8-tls-zertifikat-besorgen\">Schritt 8: TLS-Zertifikat besorgen<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Holen Sie ein kostenloses Let&#8217;s-Encrypt-Zertifikat. Der detaillierte Ablauf steht in unserer Anleitung <a href=\"\/de\/lets-encrypt-zertifikat-einrichten\/\">Let&#8217;s Encrypt: Zertifikat in 12 Schritten<\/a>. In Kurzform mit Certbot:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt install -y certbot python3-certbot-nginx\nsudo certbot --nginx -d vault.example.de<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"schritt-9-nginx-als-reverse-proxy-konfigurieren\">Schritt 9: Nginx als Reverse Proxy konfigurieren<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Der Proxy nimmt HTTPS auf Port 443 entgegen und leitet intern an den localhost-Port 8080 weiter. Wichtig sind die WebSocket-Header, denn seit Version 1.29 laufen die Echtzeit-Benachrichtigungen \u00fcber den Hauptport. Ein separater Port 3012 ist nicht mehr n\u00f6tig.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>server {\n    listen 443 ssl http2;\n    server_name vault.example.de;\n\n    ssl_certificate     \/etc\/letsencrypt\/live\/vault.example.de\/fullchain.pem;\n    ssl_certificate_key \/etc\/letsencrypt\/live\/vault.example.de\/privkey.pem;\n\n    client_max_body_size 525M;\n\n    location \/ {\n        proxy_pass http:\/\/127.0.0.1:8080;\n        proxy_set_header Host              $host;\n        proxy_set_header X-Real-IP         $remote_addr;\n        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;\n        proxy_set_header X-Forwarded-Proto $scheme;\n        proxy_http_version 1.1;\n        proxy_set_header Upgrade    $http_upgrade;\n        proxy_set_header Connection \"upgrade\";\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Pr\u00fcfen und laden Sie die Konfiguration neu:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo nginx -t &amp;&amp; sudo systemctl reload nginx<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Die Zeile <code>client_max_body_size 525M<\/code> ist kein Zufallswert. Bitwarden erlaubt Anh\u00e4nge, und ohne diese Grenze blockt Nginx gr\u00f6\u00dfere Uploads mit Fehler 413. Wer die WebSocket-Header vergisst, bemerkt es erst sp\u00e4ter: Tresor-\u00c4nderungen synchronisieren sich dann nicht mehr in Echtzeit zwischen Ger\u00e4ten. Die Grundlagen eines Reverse Proxy erkl\u00e4ren wir ausf\u00fchrlich in der Anleitung <a href=\"\/de\/nginx-reverse-proxy-https-einrichten\/\">Nginx Reverse Proxy: HTTPS in 12 Schritten<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"schritt-10-bis-12-anmeldung-admin-panel-registrierung-sperren\">Schritt 10 bis 12: Anmeldung, Admin-Panel, Registrierung sperren<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"schritt-10-erstes-konto-anlegen\">Schritt 10: Erstes Konto anlegen<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Rufen Sie <code>https:\/\/vault.example.de<\/code> im Browser auf. Sie sehen die vertraute Bitwarden-Oberfl\u00e4che. Legen Sie \u00fcber &#8220;Konto erstellen&#8221; Ihr erstes Konto an. Das Master-Passwort verl\u00e4sst niemals Ihr Ger\u00e4t: Der Client leitet daraus mit Argon2id einen Schl\u00fcssel ab und sendet nur ein abgeleitetes Authentifizierungs-Hash an den Server. Selbst der Serverbetreiber kann die Tresore nicht entschl\u00fcsseln.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"schritt-11-admin-panel-oeffnen\">Schritt 11: Admin-Panel \u00f6ffnen<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u00d6ffnen Sie <code>https:\/\/vault.example.de\/admin<\/code> und melden Sie sich mit dem Klartext-Passwort an, aus dem Sie in Schritt 4 den Token erzeugt haben. Im Panel verwalten Sie Nutzer, Organisationen, Diagnose und die globalen Einstellungen. Hier sehen Sie auch, ob ein Update verf\u00fcgbar ist.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"schritt-12-registrierung-sperren\">Schritt 12: Registrierung sperren<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Sobald alle gew\u00fcnschten Konten existieren, schlie\u00dfen Sie die T\u00fcr. Setzen Sie in der <code>docker-compose.yml<\/code> den Wert <code>SIGNUPS_ALLOWED: \"false\"<\/code> und starten Sie den Container neu:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker compose up -d --force-recreate<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ab jetzt kann sich niemand mehr ungefragt registrieren. Neue Nutzer f\u00fcgen Sie \u00fcber das Admin-Panel per Einladung hinzu, sofern <code>INVITATIONS_ALLOWED<\/code> aktiv ist und ein SMTP-Server hinterlegt ist. Damit ist die Grundinstallation fertig. Die n\u00e4chsten Abschnitte machen den Server produktionsreif.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"datenbank-backends-sqlite-mysql-oder-postgresql\">Datenbank-Backends: SQLite, MySQL oder PostgreSQL?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Vaultwarden unterst\u00fctzt drei Datenbanken. F\u00fcr die allermeisten Selbsthoster ist SQLite die richtige Wahl, weil es ohne separaten Datenbankserver auskommt und in einer einzigen Datei liegt. MySQL\/MariaDB und PostgreSQL lohnen sich erst bei vielen gleichzeitigen Nutzern oder wenn ohnehin ein Datenbankcluster existiert.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Backend<\/th><th>Konfiguration<\/th><th>Empfohlen f\u00fcr<\/th><th>Backup-Methode<\/th><\/tr><\/thead><tbody><tr><td>SQLite (Standard)<\/td><td>keine, Datei in \/data<\/td><td>Privat, Familie, kleines Team<\/td><td><code>sqlite3 .backup<\/code><\/td><\/tr><tr><td>MariaDB \/ MySQL<\/td><td><code>DATABASE_URL=mysql:\/\/...<\/code><\/td><td>Mittlere Teams, vorhandener DB-Server<\/td><td><code>mysqldump<\/code><\/td><\/tr><tr><td>PostgreSQL<\/td><td><code>DATABASE_URL=postgresql:\/\/...<\/code><\/td><td>Gro\u00dfe Setups, hohe Parallelit\u00e4t<\/td><td><code>pg_dump<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Wer mit SQLite startet und sp\u00e4ter wechseln will, sollte das fr\u00fch tun. Eine Migration zwischen den Backends ist nicht im Standard enthalten und erfordert ein separates Werkzeug wie <code>pgloader<\/code> oder einen Export-Import \u00fcber das Web-Vault. F\u00fcr ein klassisches Heim- oder Familiensetup bleibt SQLite die robusteste und einfachste L\u00f6sung.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"backups-automatisieren\">Backups automatisieren<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ein Passwort-Manager ohne Backup ist eine Zeitbombe. Drei Dinge m\u00fcssen Sie sichern: die Datenbank <code>db.sqlite3<\/code>, den RSA-Schl\u00fcssel (<code>rsa_key.pem<\/code> bzw. <code>rsa_key.*<\/code>) und den Ordner <code>attachments<\/code>. Ohne den RSA-Schl\u00fcssel lassen sich bestehende Sitzungen und manche Daten nach einem Restore nicht mehr verwenden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wichtig bei SQLite: Kopieren Sie die Datei nicht einfach mit <code>cp<\/code>, w\u00e4hrend der Server l\u00e4uft. Das kann eine inkonsistente Kopie erzeugen. Nutzen Sie den eingebauten Sicherungsbefehl, der eine konsistente Momentaufnahme erstellt:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\n# \/opt\/vaultwarden\/backup.sh\nset -euo pipefail\n\nDATA_DIR=\"\/opt\/vaultwarden\/vw-data\"\nBACKUP_DIR=\"\/opt\/backups\/vaultwarden\"\nSTAMP=\"$(date +%Y-%m-%d_%H%M)\"\n\nmkdir -p \"$BACKUP_DIR\"\n\n# Konsistente SQLite-Sicherung\nsqlite3 \"$DATA_DIR\/db.sqlite3\" \".backup '$BACKUP_DIR\/db_$STAMP.sqlite3'\"\n\n# Schluessel, Anhaenge und Konfiguration\ntar czf \"$BACKUP_DIR\/files_$STAMP.tar.gz\" -C \"$DATA_DIR\" \\\n    attachments config.json rsa_key.pem rsa_key.pub.pem 2>\/dev\/null || true\n\n# Sicherungen aelter als 14 Tage entfernen\nfind \"$BACKUP_DIR\" -type f -mtime +14 -delete\n\necho \"Backup abgeschlossen: $STAMP\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Machen Sie das Skript ausf\u00fchrbar und planen Sie es per Cron, hier t\u00e4glich um 03:30 Uhr:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>chmod +x \/opt\/vaultwarden\/backup.sh\n( crontab -l 2>\/dev\/null; echo \"30 3 * * * \/opt\/vaultwarden\/backup.sh >> \/var\/log\/vw-backup.log 2>&amp;1\" ) | crontab -<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Eine Sicherung am selben Server sch\u00fctzt nicht vor Festplattendefekt oder Ransomware. Kopieren Sie die Backups regelm\u00e4\u00dfig an einen zweiten Ort, etwa per <code>rsync<\/code> auf ein NAS oder verschl\u00fcsselt in einen Cloud-Speicher. Testen Sie mindestens einmal das Zur\u00fcckspielen. Ein Backup, das Sie nie wiederhergestellt haben, ist nur eine Hoffnung.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"sicherheit-haerten-fail2ban-2fa-und-argon2id\">Sicherheit h\u00e4rten: Fail2ban, 2FA und Argon2id<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ein \u00f6ffentlich erreichbarer Login zieht automatisierte Angriffe an. Drei Ma\u00dfnahmen senken das Risiko deutlich.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"fail2ban-gegen-brute-force\">Fail2ban gegen Brute-Force<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Fail2ban wertet die Logdatei aus und sperrt IP-Adressen nach mehreren Fehlversuchen. Voraussetzung ist, dass Sie <code>LOG_FILE<\/code> gesetzt haben. Legen Sie einen Filter unter <code>\/etc\/fail2ban\/filter.d\/vaultwarden.conf<\/code> an:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>[Definition]\nfailregex = ^.*Username or password is incorrect\\. Try again\\. IP: &lt;ADDR&gt;\\. Username:.*$\nignoreregex =<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dazu die Jail unter <code>\/etc\/fail2ban\/jail.d\/vaultwarden.local<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>[vaultwarden]\nenabled  = true\nport     = 80,443\nfilter   = vaultwarden\nlogpath  = \/opt\/vaultwarden\/vw-data\/vaultwarden.log\nmaxretry = 5\nbantime  = 14400\nfindtime = 14400<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nach <code>sudo systemctl restart fail2ban<\/code> werden Adressen nach f\u00fcnf Fehlversuchen f\u00fcr vier Stunden gesperrt. Eine ausf\u00fchrliche Einf\u00fchrung samt Pr\u00fcfbefehlen finden Sie in unserer Anleitung <a href=\"\/de\/fail2ban-einrichten-ssh-schutz\/\">Fail2ban einrichten: SSH-Schutz in 12 Schritten<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"zwei-faktor-authentifizierung-erzwingen\">Zwei-Faktor-Authentifizierung erzwingen<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Jeder Nutzer sollte in den Kontoeinstellungen 2FA aktivieren, am besten per TOTP-App oder Hardware-Schl\u00fcssel (FIDO2\/WebAuthn). F\u00fcr E-Mail-basierte 2FA und Einladungen muss ein SMTP-Server in den Variablen <code>SMTP_HOST<\/code>, <code>SMTP_FROM<\/code> und <code>SMTP_PORT<\/code> hinterlegt sein. TOTP funktioniert auch ohne Mailserver.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"argon2id-als-schluesselableitung\">Argon2id als Schl\u00fcsselableitung<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Die Bitwarden-Clients leiten den Tresorschl\u00fcssel seit 2023 standardm\u00e4\u00dfig mit Argon2id ab. Die Standardparameter sind 64 MiB Speicher, 3 Iterationen und 4 parallele Threads. Diese Werte machen Offline-Angriffe auf einen gestohlenen Tresor extrem teuer. Pr\u00fcfen Sie in den Sicherheitseinstellungen Ihres Kontos, ob als KDF &#8220;Argon2id&#8221; und nicht das \u00e4ltere &#8220;PBKDF2&#8221; eingestellt ist. Details erkl\u00e4rt die <a href=\"https:\/\/bitwarden.com\/help\/kdf-algorithms\/\" target=\"_blank\" rel=\"noopener nofollow\">offizielle Bitwarden-Dokumentation zu KDF-Algorithmen<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"caddy-statt-nginx-tls-vollautomatisch\">Caddy statt Nginx: TLS vollautomatisch<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Wer den Reverse Proxy noch einfacher haben will, nutzt Caddy statt Nginx. Caddy holt und erneuert Let&#8217;s-Encrypt-Zertifikate vollautomatisch, ohne separaten Certbot-Aufruf. Die gesamte Konfiguration passt in wenige Zeilen. Statt einer langen Nginx-Datei gen\u00fcgt diese <code>Caddyfile<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>vault.example.de {\n    encode gzip\n    reverse_proxy 127.0.0.1:8080 {\n        header_up X-Real-IP {remote_host}\n    }\n    request_body {\n        max_size 525MB\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Caddy verwaltet die WebSocket-Upgrades automatisch, sodass die manuellen Header aus dem Nginx-Beispiel entfallen. Das macht den Einstieg deutlich fehler\u00e4rmer. Der Nachteil: Bei sehr komplexen Setups mit mehreren Diensten und feinem Caching ist Nginx flexibler. F\u00fcr einen einzelnen Vaultwarden-Server ist Caddy aber die schnellste und sauberste L\u00f6sung. Starten Sie Caddy einfach als zus\u00e4tzlichen Container im selben <code>docker-compose.yml<\/code> oder als Systemdienst.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Egal ob Nginx, Caddy oder Traefik: Der interne Vaultwarden-Port darf nie direkt aus dem Internet erreichbar sein. Die Bindung an <code>127.0.0.1<\/code> in der Compose-Datei stellt das sicher. Nur der Proxy mit g\u00fcltigem TLS-Zertifikat spricht mit dem Internet.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"smtp-fuer-einladungen-und-2fa-mails-einrichten\">SMTP f\u00fcr Einladungen und 2FA-Mails einrichten<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Sobald Sie die Registrierung sperren, brauchen neue Nutzer eine Einladung per E-Mail. Auch E-Mail-basierte 2FA und Hinweise bei neuen Ger\u00e4ten setzen einen funktionierenden Mailversand voraus. Vaultwarden bringt daf\u00fcr eigene SMTP-Variablen mit. Erg\u00e4nzen Sie den <code>environment<\/code>-Block in der Compose-Datei:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>      SMTP_HOST: \"mail.example.de\"\n      SMTP_FROM: \"vaultwarden@example.de\"\n      SMTP_FROM_NAME: \"Vaultwarden\"\n      SMTP_SECURITY: \"starttls\"\n      SMTP_PORT: \"587\"\n      SMTP_USERNAME: \"vaultwarden@example.de\"\n      SMTP_PASSWORD: \"IHR_SMTP_PASSWORT\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nach einem Neustart des Containers k\u00f6nnen Sie im Admin-Panel unter &#8220;Diagnostics&#8221; eine Test-Mail verschicken. Kommt sie nicht an, pr\u00fcfen Sie zuerst Port und Sicherheitsmodus. Viele Provider nutzen <code>starttls<\/code> auf Port 587, manche <code>force_tls<\/code> auf Port 465. Achten Sie au\u00dferdem darauf, dass die Absenderadresse zur Domain passt, sonst landen die Mails im Spam oder werden abgewiesen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ein h\u00e4ufiger Stolperstein: Manche Heim-Internetanschl\u00fcsse blockieren ausgehenden Verkehr auf Port 25. Das betrifft den direkten Versand, nicht aber den Versand \u00fcber einen authentifizierten SMTP-Server auf Port 587. Wer keinen eigenen Mailserver betreibt, kann einen beliebigen Postfach-Anbieter als Relay nutzen, solange dieser SMTP-Auth erlaubt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"vaultwarden-auf-nas-und-raspberry-pi-betreiben\">Vaultwarden auf NAS und Raspberry Pi betreiben<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Der geringe Ressourcenbedarf macht Vaultwarden zum Klassiker f\u00fcr Heimserver. Auf einem Synology- oder QNAP-NAS installieren Sie es \u00fcber die jeweilige Container-Verwaltung (Container Manager bzw. Container Station). Wichtig ist auch hier: Das NAS sollte nicht ungesch\u00fctzt im Internet h\u00e4ngen. Setzen Sie den im Ger\u00e4t integrierten Reverse Proxy davor und holen Sie ein g\u00fcltiges Zertifikat \u00fcber die Zertifikatsverwaltung des Herstellers.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Auf dem Raspberry Pi 4 oder 5 l\u00e4uft das identische Docker-Image, da Vaultwarden ARM64 unterst\u00fctzt. Die Installation folgt exakt dieser Anleitung. Achten Sie nur auf den Speicher: Eine schnelle und zuverl\u00e4ssige SSD per USB ist einer SD-Karte deutlich \u00fcberlegen, denn SQLite schreibt h\u00e4ufig kleine Datenmengen, und SD-Karten verschlei\u00dfen darunter schneller. Legen Sie das Verzeichnis <code>vw-data<\/code> deshalb auf die SSD.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00fcr die Erreichbarkeit von au\u00dfen ohne feste IP-Adresse hilft ein DynDNS-Dienst, der Ihre wechselnde Heim-IP einem Hostnamen zuordnet. Alternativ binden Sie den Dienst hinter ein WireGuard-VPN und greifen nur \u00fcber den Tunnel zu. Diese Variante ist sicherer, weil der Login-Endpunkt dann gar nicht \u00f6ffentlich erreichbar ist, kostet aber etwas Komfort beim mobilen Zugriff.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Egal auf welcher Hardware: Backups und Updates bleiben Ihre Aufgabe. Gerade auf einem Heimserver, der unbeaufsichtigt l\u00e4uft, ist ein automatisiertes Backup auf ein zweites Ger\u00e4t unverzichtbar. Ein Stromausfall oder ein defektes Speichermedium darf nicht das Ende aller Passw\u00f6rter bedeuten.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"kosten-und-wartungsaufwand-realistisch-einschaetzen\">Kosten und Wartungsaufwand realistisch einsch\u00e4tzen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Self-Hosting ist nicht kostenlos, auch wenn die Software nichts kostet. Sie tauschen Abogeb\u00fchren gegen Zeit und Verantwortung. Diese \u00dcbersicht hilft bei der ehrlichen Einsch\u00e4tzung, ob sich der Eigenbetrieb f\u00fcr Sie lohnt:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Posten<\/th><th>Vaultwarden (Self-Hosted)<\/th><th>Bitwarden-Cloud (Premium)<\/th><\/tr><\/thead><tbody><tr><td>Software-Lizenz<\/td><td>0 \u20ac (AGPL-3.0)<\/td><td>ca. 10 US-Dollar pro Jahr<\/td><\/tr><tr><td>Serverkosten<\/td><td>VPS ab ca. 3 bis 5 \u20ac im Monat oder eigene Hardware<\/td><td>entf\u00e4llt<\/td><\/tr><tr><td>Wartung<\/td><td>Updates, Backups, TLS, Monitoring<\/td><td>vom Anbieter \u00fcbernommen<\/td><\/tr><tr><td>Datenstandort<\/td><td>frei w\u00e4hlbar (z. B. EU)<\/td><td>vom Tarif abh\u00e4ngig<\/td><\/tr><tr><td>Premium-Funktionen<\/td><td>enthalten<\/td><td>im Premium-Tarif enthalten<\/td><\/tr><tr><td>Ausfallrisiko<\/td><td>liegt bei Ihnen<\/td><td>beim Anbieter<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Die Faustregel: Wer ohnehin einen Heimserver oder VPS betreibt und Freude an der Administration hat, f\u00e4hrt mit Vaultwarden hervorragend und gewinnt volle Datenkontrolle. Wer dagegen keine Lust auf Wartung hat und nur einen verl\u00e4sslichen Passwort-Speicher sucht, ist mit der gehosteten Bitwarden-Variante oder einer anderen fertigen L\u00f6sung besser bedient. Rechnen Sie pro Monat realistisch mit 15 bis 30 Minuten Wartungsaufwand f\u00fcr Updates und das Pr\u00fcfen der Backups.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"haeufige-fehler-und-stolperfallen\">H\u00e4ufige Fehler und Stolperfallen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Diese Fehler kosten erfahrungsgem\u00e4\u00df die meiste Zeit. Wer sie kennt, spart sich die Fehlersuche.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Falscher DOMAIN-Wert.<\/strong> Stimmt <code>DOMAIN<\/code> nicht exakt mit der aufgerufenen URL \u00fcberein (inklusive <code>https:\/\/<\/code> und ohne abschlie\u00dfenden Schr\u00e4gstrich), schl\u00e4gt die Anmeldung fehl und WebCrypto bricht ab.<\/li><li><strong>HTTP statt HTTPS.<\/strong> Ohne g\u00fcltiges TLS-Zertifikat l\u00e4dt der Tresor nicht, weil der Browser <code>window.crypto.subtle<\/code> nur im sicheren Kontext freigibt.<\/li><li><strong>Token nicht gehasht.<\/strong> Wer das Klartext-Passwort als <code>ADMIN_TOKEN<\/code> eintr\u00e4gt, kommt ab Version 1.30 nicht mehr ins Admin-Panel. Es muss der Argon2-Hash sein.<\/li><li><strong>Dollarzeichen nicht escaped.<\/strong> In der <code>docker-compose.yml<\/code> muss jedes <code>$<\/code> im Token verdoppelt werden, sonst zerlegt Compose den Hash. Besser: in <code>.env<\/code> auslagern.<\/li><li><strong>Volume vergessen.<\/strong> Ohne Mount von <code>.\/vw-data:\/data<\/code> liegen alle Daten nur im Container und sind nach einem <code>docker compose down<\/code> verloren.<\/li><li><strong>Fehlende WebSocket-Header.<\/strong> Ohne die Upgrade-Header im Proxy synchronisieren sich Ger\u00e4te nicht in Echtzeit.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"troubleshooting-8-typische-probleme-loesen\">Troubleshooting: 8 typische Probleme l\u00f6sen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn etwas nicht funktioniert, hilft fast immer zuerst ein Blick in die Logs mit <code>docker compose logs --tail 50<\/code>. Diese acht F\u00e4lle treten am h\u00e4ufigsten auf:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li><strong>&#8220;An error has occurred&#8221; beim Login.<\/strong> Meist stimmt <code>DOMAIN<\/code> nicht oder das Zertifikat ist ung\u00fcltig. Vergleichen Sie den Wert mit der Browser-Adresszeile und pr\u00fcfen Sie das Zertifikat mit <code>curl -vI https:\/\/vault.example.de<\/code>.<\/li><li><strong>Admin-Panel verweigert das Passwort.<\/strong> Der Token ist vermutlich nicht gehasht oder das <code>$<\/code> wurde in Compose falsch interpretiert. Erzeugen Sie den Hash neu und legen Sie ihn in <code>.env<\/code> ab.<\/li><li><strong>Container startet nicht (Exit 0\/1).<\/strong> Pr\u00fcfen Sie mit <code>docker compose logs<\/code> auf Syntaxfehler in der YAML-Datei oder fehlende Schreibrechte auf <code>vw-data<\/code>. Setzen Sie mit <code>sudo chown -R 1000:1000 vw-data<\/code> die Eigent\u00fcmerrechte.<\/li><li><strong>Fehler 413 beim Anhang-Upload.<\/strong> Erh\u00f6hen Sie <code>client_max_body_size<\/code> im Nginx-Block und laden Sie die Konfiguration neu.<\/li><li><strong>Keine Echtzeit-Synchronisierung.<\/strong> Es fehlen die WebSocket-Header (<code>Upgrade<\/code> und <code>Connection<\/code>) im Proxy. Erg\u00e4nzen Sie sie und starten Sie Nginx neu.<\/li><li><strong>Push-Benachrichtigungen kommen nicht an.<\/strong> Push erfordert eine Registrierung der Server-Installation bei Bitwarden sowie korrekte <code>PUSH_INSTALLATION_ID<\/code> und <code>PUSH_INSTALLATION_KEY<\/code>.<\/li><li><strong>Mobile App verbindet sich nicht.<\/strong> Tragen Sie die Server-URL in der App unter &#8220;Selbst gehostet&#8221; ein, bevor Sie sich anmelden. Selbstsignierte Zertifikate werden auf Mobilger\u00e4ten oft abgelehnt, nutzen Sie Let&#8217;s Encrypt.<\/li><li><strong>Fail2ban sperrt nichts.<\/strong> H\u00e4ufig fehlt <code>LOG_FILE<\/code> oder der <code>logpath<\/code> in der Jail zeigt auf den falschen Ort. Testen Sie den Filter mit <code>fail2ban-regex \/opt\/vaultwarden\/vw-data\/vaultwarden.log \/etc\/fail2ban\/filter.d\/vaultwarden.conf<\/code>.<\/li><\/ol>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"fortgeschrittene-tipps-fuer-den-produktivbetrieb\">Fortgeschrittene Tipps f\u00fcr den Produktivbetrieb<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Wer Vaultwarden dauerhaft betreibt, holt mit diesen Ma\u00dfnahmen mehr Sicherheit und Komfort heraus.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Updates kontrolliert einspielen.<\/strong> Pinnen Sie die Version im Tag und aktualisieren Sie bewusst: <code>docker compose pull<\/code> nach Anpassung des Tags, dann <code>docker compose up -d<\/code>. Lesen Sie vorher die Release-Notes auf GitHub. Vor jedem Update: Backup.<\/li><li><strong>Organisationen und Collections nutzen.<\/strong> F\u00fcr Familien oder Teams legen Sie eine Organisation an und teilen Tresoreintr\u00e4ge \u00fcber Collections mit feingranularen Rechten. Bei Vaultwarden ist das ohne Abo m\u00f6glich.<\/li><li><strong>Notfallzugriff einrichten.<\/strong> \u00dcber &#8220;Emergency Access&#8221; gew\u00e4hren Sie einer Vertrauensperson nach einer Wartezeit Lese- oder \u00dcbernahmezugriff. Das l\u00f6st das klassische Problem, was mit den Passw\u00f6rtern im Ernstfall geschieht.<\/li><li><strong>Reverse Proxy mit Rate-Limiting.<\/strong> Erg\u00e4nzen Sie in Nginx eine <code>limit_req_zone<\/code> speziell f\u00fcr <code>\/admin<\/code> und die Login-Endpunkte, um automatisierte Angriffe zus\u00e4tzlich zu Fail2ban auszubremsen.<\/li><li><strong>Geoblocking oder VPN-only.<\/strong> Wer das Admin-Panel nicht \u00f6ffentlich braucht, beschr\u00e4nkt <code>\/admin<\/code> per Nginx auf interne IP-Bereiche oder bindet den ganzen Dienst hinter ein WireGuard-VPN.<\/li><li><strong>Monitoring.<\/strong> Ein einfacher Uptime-Check plus eine Benachrichtigung bei vollem Speicher verhindert b\u00f6se \u00dcberraschungen. Vaultwarden bietet unter <code>\/alive<\/code> einen Health-Endpoint.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"dsgvo-und-datensouveraenitaet-im-dach-raum\">DSGVO und Datensouver\u00e4nit\u00e4t im DACH-Raum<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00fcr Unternehmen, Vereine und Beh\u00f6rden in Deutschland, \u00d6sterreich und der Schweiz ist der Speicherort der Daten ein zentrales Kriterium. Ein selbst gehosteter Vaultwarden auf einem Server in der EU h\u00e4lt s\u00e4mtliche Zugangsdaten innerhalb der eigenen Kontrolle. Es gibt keinen US-Cloud-Anbieter, kein Drittland-Transfer-Problem und keine Abh\u00e4ngigkeit von der Verf\u00fcgbarkeit eines externen Dienstes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das Zero-Knowledge-Prinzip von Bitwarden bleibt dabei erhalten: Die Tresore werden auf dem Client mit dem aus dem Master-Passwort abgeleiteten Schl\u00fcssel ver- und entschl\u00fcsselt. Der Server speichert nur Chiffrate. Selbst bei einem Servereinbruch sind die Inhalte ohne Master-Passwort wertlos, vorausgesetzt, die Nutzer haben starke Passw\u00f6rter und Argon2id als KDF gew\u00e4hlt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Trotzdem entbindet Self-Hosting nicht von Pflichten. Wer personenbezogene Daten von Mitarbeitenden in einem Passwort-Manager verwaltet, braucht ein Verarbeitungsverzeichnis, ein Backup-Konzept und technische Ma\u00dfnahmen wie die hier gezeigte H\u00e4rtung. Das Bundesamt f\u00fcr Sicherheit in der Informationstechnik (BSI) empfiehlt Passwort-Manager ausdr\u00fccklich und gibt praktische Hinweise in seinen <a href=\"https:\/\/www.bsi.bund.de\/dok\/passwoerter\" target=\"_blank\" rel=\"noopener nofollow\">Empfehlungen zu sicheren Passw\u00f6rtern<\/a>. Eine Markt\u00fcbersicht \u00fcber fertige L\u00f6sungen bietet unser <a href=\"\/de\/passwort-manager-vergleich-2026\/\">Passwort-Manager-Vergleich 2026<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"komplettes-beispielprojekt-im-ueberblick\">Komplettes Beispielprojekt im \u00dcberblick<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Zum Abschluss die fertige Verzeichnisstruktur eines produktiven Setups, wie es nach dieser Anleitung entsteht:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/opt\/vaultwarden\/\n\u251c\u2500\u2500 docker-compose.yml      # Dienstdefinition, Version 1.36.0 gepinnt\n\u251c\u2500\u2500 .env                    # ADMIN_TOKEN (Argon2-Hash)\n\u251c\u2500\u2500 backup.sh               # taegliches Backup-Skript\n\u2514\u2500\u2500 vw-data\/                # persistente Daten (Backup-Ziel!)\n    \u251c\u2500\u2500 db.sqlite3          # Tresordatenbank\n    \u251c\u2500\u2500 rsa_key.pem         # Server-Schluessel\n    \u251c\u2500\u2500 attachments\/        # Datei-Anhaenge\n    \u251c\u2500\u2500 config.json         # im Admin-Panel gesetzte Optionen\n    \u2514\u2500\u2500 vaultwarden.log     # Log fuer Fail2ban\n\n\/etc\/nginx\/sites-available\/vaultwarden   # Reverse-Proxy-Block\n\/etc\/fail2ban\/filter.d\/vaultwarden.conf  # Brute-Force-Filter\n\/etc\/fail2ban\/jail.d\/vaultwarden.local   # Sperr-Regeln\n\/opt\/backups\/vaultwarden\/                # rotierende Backups<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Pr\u00fcfen Sie zum Schluss, ob alles l\u00e4uft. Ein <code>docker compose ps<\/code> sollte den Status <code>running<\/code> zeigen, und der Health-Endpoint antwortet:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ curl -s https:\/\/vault.example.de\/alive\n2026-06-15T08:42:11.532Z\n\n$ docker compose ps\nNAME          IMAGE                       STATUS         PORTS\nvaultwarden   vaultwarden\/server:1.36.0   Up 3 minutes   127.0.0.1:8080->80\/tcp<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Damit haben Sie einen vollst\u00e4ndigen, geh\u00e4rteten und gesicherten Bitwarden-kompatiblen Passwort-Server. Er l\u00e4uft mit minimalen Ressourcen, h\u00e4lt Ihre Daten in der EU und kostet au\u00dfer dem Server keinen Cent an Lizenzgeb\u00fchren.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"haeufig-gestellte-fragen-faq\">H\u00e4ufig gestellte Fragen (FAQ)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"ist-vaultwarden-sicher-genug-fuer-sensible-passwoerter\">Ist Vaultwarden sicher genug f\u00fcr sensible Passw\u00f6rter?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ja, sofern Sie es korrekt betreiben. Die Verschl\u00fcsselung folgt dem Zero-Knowledge-Prinzip von Bitwarden, der Server sieht nur Chiffrate. Entscheidend sind ein starkes Master-Passwort, Argon2id als KDF, HTTPS, aktivierte 2FA und regelm\u00e4\u00dfige Updates. Die in dieser Anleitung gezeigte H\u00e4rtung mit Fail2ban und gesperrter Registrierung deckt die wichtigsten Angriffsfl\u00e4chen ab.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"worin-unterscheidet-sich-vaultwarden-von-bitwarden\">Worin unterscheidet sich Vaultwarden von Bitwarden?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Vaultwarden ist eine inoffizielle, ressourcenschonende Neuimplementierung der Bitwarden-Server-API in Rust. Es stammt nicht von Bitwarden Inc., nutzt aber dieselben Client-Apps und schaltet einige sonst kostenpflichtige Funktionen frei. F\u00fcr gro\u00dfe Unternehmen mit Support-Bedarf bleibt die offizielle Variante die richtige Wahl.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"brauche-ich-zwingend-https-und-eine-domain\">Brauche ich zwingend HTTPS und eine Domain?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ja. Die Bitwarden-Clients nutzen die WebCrypto-API, die nur in einem sicheren Kontext (HTTPS) verf\u00fcgbar ist. Ohne g\u00fcltiges TLS-Zertifikat l\u00e4dt der Tresor im Browser nicht, und Mobil-Apps lehnen selbstsignierte Zertifikate meist ab. Eine eigene Domain mit Let&#8217;s-Encrypt-Zertifikat ist daher Pflicht.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"laeuft-vaultwarden-auf-einem-raspberry-pi\">L\u00e4uft Vaultwarden auf einem Raspberry Pi?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Problemlos. Mit rund 10 bis 15 MB RAM-Bedarf im Leerlauf l\u00e4uft Vaultwarden auf einem Raspberry Pi 4, einem NAS oder einem 1-GB-VPS. Das Docker-Image unterst\u00fctzt auch ARM-Architekturen, sodass die Installation identisch zu dieser Anleitung verl\u00e4uft.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"wie-aktualisiere-ich-vaultwarden-sicher\">Wie aktualisiere ich Vaultwarden sicher?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Erstellen Sie zuerst ein Backup. \u00c4ndern Sie dann das Versions-Tag in der <code>docker-compose.yml<\/code>, holen Sie das neue Image mit <code>docker compose pull<\/code> und starten Sie mit <code>docker compose up -d<\/code> neu. Lesen Sie vorab die Release-Notes auf GitHub, da gr\u00f6\u00dfere Versionsspr\u00fcnge Datenbankmigrationen ausl\u00f6sen k\u00f6nnen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"kann-ich-von-der-bitwarden-cloud-zu-vaultwarden-migrieren\">Kann ich von der Bitwarden-Cloud zu Vaultwarden migrieren?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ja. Exportieren Sie Ihren Tresor in der Bitwarden-App als verschl\u00fcsselten oder JSON-Export und importieren Sie ihn nach der Anmeldung am Vaultwarden-Server \u00fcber die Import-Funktion des Web-Vaults. Achten Sie darauf, dass beide Seiten Argon2id als KDF verwenden, damit die Migration reibungslos l\u00e4uft.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"welche-datenbank-soll-ich-waehlen\">Welche Datenbank soll ich w\u00e4hlen?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00fcr die allermeisten privaten und kleinen Setups ist SQLite die beste Wahl: keine Konfiguration, eine einzige Datei, einfaches Backup. MySQL\/MariaDB oder PostgreSQL lohnen sich erst bei vielen gleichzeitigen Nutzern oder wenn ohnehin ein Datenbankserver vorhanden ist.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"ist-der-eigenbetrieb-dsgvo-konform\">Ist der Eigenbetrieb DSGVO-konform?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Self-Hosting auf einem EU-Server st\u00e4rkt die Datensouver\u00e4nit\u00e4t, weil keine Daten in Drittl\u00e4nder flie\u00dfen. Die DSGVO-Konformit\u00e4t h\u00e4ngt aber von der Gesamtorganisation ab: Verarbeitungsverzeichnis, technische und organisatorische Ma\u00dfnahmen, Backup-Konzept und Zugriffskontrolle m\u00fcssen stimmen. Die Technik allein gen\u00fcgt nicht, sie ist aber eine gute Grundlage.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"verwandte-beitraege\">Verwandte Beitr\u00e4ge<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"\/de\/passwort-manager-vergleich-2026\/\">Passwort Manager Vergleich: 6 Tools ab 0 \u20ac [2026]<\/a><\/li><li><a href=\"\/de\/nginx-reverse-proxy-https-einrichten\/\">Nginx Reverse Proxy: HTTPS in 12 Schritten [2026]<\/a><\/li><li><a href=\"\/de\/lets-encrypt-zertifikat-einrichten\/\">Let&#8217;s Encrypt: Zertifikat in 12 Schritten [2026]<\/a><\/li><li><a href=\"\/de\/fail2ban-einrichten-ssh-schutz\/\">Fail2ban einrichten: SSH-Schutz in 12 Schritten [2026]<\/a><\/li><li><a href=\"\/de\/passwortsicherheit\/\">Passwortsicherheit: starke Passw\u00f6rter, Hashing und 2FA<\/a><\/li><li><a href=\"\/de\/privacy\/\">Mehr Anleitungen aus dem Bereich Privatsph\u00e4re<\/a><\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Stand: 15. Juni 2026. Versionsangaben und Statistiken stammen aus dem offiziellen <a href=\"https:\/\/github.com\/dani-garcia\/vaultwarden\" target=\"_blank\" rel=\"noopener nofollow\">Vaultwarden-Repository auf GitHub<\/a> und der <a href=\"https:\/\/hub.docker.com\/r\/vaultwarden\/server\" target=\"_blank\" rel=\"noopener nofollow\">Docker-Hub-Seite des Projekts<\/a>. Pr\u00fcfen Sie vor der Installation stets die aktuelle Version und die Release-Notes.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ein eigener Passwort-Manager auf eigener Hardware, voll kompatibel mit allen Bitwarden-Apps, und das mit rund 15 MB Arbeitsspeicher: Genau das liefert Vaultwarden. Das in Rust geschriebene Projekt bildet die Bitwarden-Server-API\u2026<\/p>\n","protected":false},"author":6,"featured_media":151,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-150","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-privacy"],"_links":{"self":[{"href":"https:\/\/shattered.io\/de\/wp-json\/wp\/v2\/posts\/150","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/shattered.io\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/shattered.io\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/shattered.io\/de\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/shattered.io\/de\/wp-json\/wp\/v2\/comments?post=150"}],"version-history":[{"count":1,"href":"https:\/\/shattered.io\/de\/wp-json\/wp\/v2\/posts\/150\/revisions"}],"predecessor-version":[{"id":152,"href":"https:\/\/shattered.io\/de\/wp-json\/wp\/v2\/posts\/150\/revisions\/152"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/shattered.io\/de\/wp-json\/wp\/v2\/media\/151"}],"wp:attachment":[{"href":"https:\/\/shattered.io\/de\/wp-json\/wp\/v2\/media?parent=150"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/shattered.io\/de\/wp-json\/wp\/v2\/categories?post=150"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/shattered.io\/de\/wp-json\/wp\/v2\/tags?post=150"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}