<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Vaultwarden – Serverküche</title><link>https://serverkueche.de/tags/vaultwarden/</link><description>Vaultwarden – Neueste Beiträge von Serverküche</description><generator>Hugo</generator><language>de-DE</language><managingEditor>feedback@serverkueche.de (Serverküche)</managingEditor><webMaster>feedback@serverkueche.de (Serverküche)</webMaster><copyright>2026 Serverküche</copyright><lastBuildDate>Sun, 19 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://serverkueche.de/tags/vaultwarden/index.xml" rel="self" type="application/rss+xml"/><item><title>Vaultwarden: eigener Passwortmanager hinter Traefik</title><link>https://serverkueche.de/tutorials/vaultwarden-passwortmanager/</link><pubDate>Sun, 19 Jul 2026 00:00:00 +0000</pubDate><author>feedback@serverkueche.de (Serverküche)</author><guid>https://serverkueche.de/tutorials/vaultwarden-passwortmanager/</guid><description>Vaultwarden selbst hosten: ein schlanker, Bitwarden-kompatibler Passwortmanager hinter Traefik mit HTTPS, Admin-Panel und verschlüsseltem Backup.</description><content:encoded><![CDATA[<p>Passwörter gehören in einen Passwortmanager – aber müssen sie in der Cloud eines
fremden Anbieters liegen? Mit <strong>Vaultwarden</strong> hostest du deinen eigenen, verschlüsselt
und unter deiner Kontrolle. Er spricht die Bitwarden-Sprache, also nutzt du die
gewohnten Bitwarden-Apps und -Browser-Erweiterungen – nur zeigen sie auf <strong>deinen</strong>
Server.</p>
<h2 id="was-bauen-wir">Was bauen wir?</h2>
<p>Am Ende läuft <strong>Vaultwarden 1.36</strong> in einem Container hinter deinem Traefik-Proxy,
erreichbar unter <code>https://vault.DEINE_DOMAIN</code> mit gültigem HTTPS-Zertifikat. Vaultwarden
ist eine schlanke, in Rust geschriebene Neuimplementierung des Bitwarden-Servers:
API-kompatibel, aber sparsam genug, um auf einem kleinen VPS zu laufen. Du verbindest
die offiziellen <strong>Bitwarden-Clients</strong> (Browser-Erweiterung, Handy-App, Desktop) mit
deinem Server, legst deine Zugangsdaten ab – Ende-zu-Ende verschlüsselt – und
verwaltest den Dienst über ein abgesichertes <strong>Admin-Panel</strong>.</p>
<p>Deine Passwörter liegen damit auf deinem Server, in deinem Land, unter deinem Backup –
und du zahlst keine Abo-Gebühr für Funktionen wie 2FA oder Attachments.</p>
<div class="not-prose my-6 rounded-lg border-l-4 p-4 border-sky-300 bg-sky-50 dark:border-sky-800 dark:bg-sky-900/20">
  <p class="mb-1 flex items-center gap-2 font-semibold text-slate-900 dark:text-white">
    <span aria-hidden="true">ℹ️</span>Vaultwarden ≠ Bitwarden
  </p>
  <div class="prose-kitchen text-sm">Vaultwarden ist ein <strong>inoffizielles</strong>, community-getriebenes Projekt, das die
Bitwarden-Server-API nachbaut. Es ist nicht mit Bitwarden Inc. verbunden. Für den
privaten und kleinen Team-Einsatz ist es hervorragend geeignet; die Clients (Apps,
Erweiterungen) sind die echten, offiziellen von Bitwarden.</div>
</div>
<h2 id="voraussetzungen">Voraussetzungen</h2>
<ul>
<li>Ein laufender <strong>Traefik-Reverse-Proxy</strong> mit dem gemeinsamen <code>proxy</code>-Netzwerk und dem
Let&rsquo;s-Encrypt-Resolver <code>le</code> – genau das Setup aus dem Tutorial
<a href="/tutorials/reverse-proxy-traefik/">Reverse Proxy mit Traefik</a>. Ohne Traefik
funktioniert dieses Rezept nicht: Vaultwarden <strong>verlangt HTTPS</strong>.</li>
<li>Eine Subdomain, z. B. <code>vault.DEINE_DOMAIN</code>, deren DNS-Record (A/AAAA) auf deine
Server-IP zeigt – siehe <a href="/tutorials/domain-mit-server-verbinden/">Domain mit Server verbinden</a>.</li>
<li>Ein funktionierendes <strong>Backup</strong> deines Servers. Ein Passwortmanager ist der Ort, an
dem Datenverlust am meisten wehtut – richte, falls noch nicht geschehen, zuerst
<a href="/tutorials/backups-mit-restic/">Backups mit Restic</a> ein.</li>
</ul>
<p>Willst du später mehrere Dienste kombinieren, hilft der <a href="/serverempfehlung/">Server-Rechner</a>
bei der passenden Server-Größe.</p>
<div class="not-prose my-6 overflow-hidden rounded-xl border border-paprika-200 bg-paprika-50 dark:border-paprika-800 dark:bg-paprika-900/20">
  <div class="flex items-center justify-between border-b border-paprika-200 bg-paprika-100 px-4 py-1.5 text-xs font-semibold uppercase tracking-wide text-paprika-700 dark:border-paprika-800 dark:bg-paprika-900/40 dark:text-paprika-300">
    <span>🍳 Empfehlung</span>
    <span title="Mit * markierte Links sind Affiliate-Links.">Anzeige</span>
  </div>
  <div class="flex flex-col gap-4 p-4 sm:flex-row sm:items-center sm:justify-between">
    <div>
      <p class="text-lg font-bold text-slate-900 dark:text-white">VPS 1000 G12</p>
      <p class="mt-1 text-sm text-slate-600 dark:text-slate-300">4 vCore · 8 GB RAM · 256 GB NVMe</p>
      <p class="mt-1 text-sm font-semibold text-paprika-700 dark:text-paprika-400">ab 10,36 €/Monat</p>
      <p class="mt-2 text-sm text-slate-600 dark:text-slate-400">Vaultwarden ist so sparsam, dass schon der kleinste VPS locker reicht.</p>
    </div>
    <a href="https://www.netcup.com/de/server/vps/vps-1000-g12-12m?ref=44083" rel="sponsored noopener" target="_blank"
   class="inline-flex shrink-0 items-center justify-center rounded-lg bg-paprika-600 px-5 py-2.5 font-semibold text-white transition-colors hover:bg-paprika-700">
  Zu netcup →
</a>

  </div><div class="px-4 pb-4"><p class="not-prose my-3 flex flex-wrap items-center gap-x-2 gap-y-1 rounded-lg border border-herb-500/40 bg-herb-50 px-3 py-2 text-sm text-slate-700 dark:bg-herb-900/20 dark:text-slate-200">
  <span>💶 <strong>5 € Gutschein</strong> für netcup-Neukunden:</span>
  <code class="rounded bg-white px-2 py-0.5 font-mono text-sm font-semibold text-herb-800 dark:bg-slate-800 dark:text-herb-400">36nc17844976032</code>
  <span class="text-xs text-slate-500 dark:text-slate-400">(nur Neukunden, keine Domains)</span>
</p></div>
</div>

<h2 id="schritt-für-schritt">Schritt für Schritt</h2>
<h3 id="schritt-1-den-admin_token-erzeugen">Schritt 1: Den ADMIN_TOKEN erzeugen</h3>
<p>Vaultwarden hat ein Admin-Panel unter <code>/admin</code>. Zugriff darauf schützt ein
<code>ADMIN_TOKEN</code>. Den solltest du <strong>nicht</strong> im Klartext hinterlegen, sondern als Hash –
dann steht dein Panel-Passwort nirgends lesbar in der Compose-Datei.</p>
<p>Vaultwarden bringt dafür einen eigenen Befehl mit. Wir lassen ihn kurz in einem
Wegwerf-Container laufen:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker run --rm -it vaultwarden/server:1.36.0 /vaultwarden <span class="nb">hash</span> --preset owasp</span></span></code></pre></div>
</div>
<p>Der Befehl fragt dich zweimal nach einem Passwort (Eingabe bleibt unsichtbar) und gibt
dann einen <strong>Argon2id-Hash</strong> aus – eine lange Zeichenkette, die so beginnt:</p>
<div class="sk-code">
  <span class="sk-code-head">Ausgabe</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Generate an Argon2id PHC string using the &#39;owasp&#39; preset.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Password:
</span></span><span class="line"><span class="cl">Confirm Password:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">ADMIN_TOKEN=&#39;$argon2id$v=19$m=19456,t=2,p=1$FkxFEQ64Wy4zlQOWMI1fJ...$TxULe6MSND3By6GPVPKB1...&#39;</span></span></code></pre></div>
</div>
<p>Kopiere die komplette Zeichenkette zwischen den Anführungszeichen (inklusive der
<code>$argon2id$…</code>-Teile) heraus – die brauchst du gleich. Das Passwort, das du hier
eingegeben hast, ist dein <strong>Admin-Panel-Passwort</strong>; leg es im Passwortmanager ab (fürs
Erste noch im alten).</p>
<div class="not-prose my-6 rounded-lg border-l-4 p-4 border-herb-400 bg-herb-50 dark:border-herb-700 dark:bg-herb-900/20">
  <p class="mb-1 flex items-center gap-2 font-semibold text-slate-900 dark:text-white">
    <span aria-hidden="true">🧑‍🍳</span>Warum der Umweg über den Hash?
  </p>
  <div class="prose-kitchen text-sm">Du könntest den <code>ADMIN_TOKEN</code> auch als Klartext-Passwort setzen. Der Hash ist aber
sicherer: Selbst wer deine <code>compose.yaml</code> in die Finger bekommt, kann daraus dein
Panel-Passwort nicht zurückrechnen. <code>--preset owasp</code> wählt Argon2-Parameter nach der
aktuellen OWASP-Empfehlung.</div>
</div>
<h3 id="schritt-2-die-composeyaml-anlegen">Schritt 2: Die compose.yaml anlegen</h3>
<p>Leg einen eigenen Ordner an und wechsle hinein:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">mkdir -p ~/vaultwarden <span class="o">&amp;&amp;</span> <span class="nb">cd</span> ~/vaultwarden</span></span></code></pre></div>
</div>
<p>Erstelle die <code>compose.yaml</code>. Ersetze <code>vault.DEINE_DOMAIN</code> durch deine echte Subdomain
und den <code>ADMIN_TOKEN</code> durch den Hash aus Schritt 1:</p>
<div class="sk-code">
  <span class="sk-code-head">YAML</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">services</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">vaultwarden</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">vaultwarden/server:1.36.0</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">./vw-data:/data</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">environment</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">DOMAIN</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;https://vault.DEINE_DOMAIN&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">SIGNUPS_ALLOWED</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;true&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">ADMIN_TOKEN</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;$$argon2id$$v=19$$m=19456,t=2,p=1$$FkxFE...$$TxULe...&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;traefik.enable=true&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;traefik.http.routers.vaultwarden.rule=Host(`vault.DEINE_DOMAIN`)&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;traefik.http.routers.vaultwarden.entrypoints=websecure&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;traefik.http.routers.vaultwarden.tls.certresolver=le&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;traefik.http.services.vaultwarden.loadbalancer.server.port=80&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">networks</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">proxy</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">restart</span><span class="p">:</span><span class="w"> </span><span class="l">unless-stopped</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">networks</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">proxy</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">external</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div>
</div>
<p>Die wichtigsten Zeilen im Detail:</p>
<ul>
<li><strong><code>image: vaultwarden/server:1.36.0</code></strong> – wir pinnen die Version bewusst fest, statt
<code>latest</code> zu nehmen. So aktualisierst du kontrolliert (siehe „Wartung&quot;). Für ein noch
kleineres Image gibt es auch <code>:1.36.0-alpine</code>.</li>
<li><strong><code>volumes: ./vw-data:/data</code></strong> – hier liegen deine Datenbank (<code>db.sqlite3</code>), die
Verschlüsselungs-Keys und die Attachments. <strong>Dieses Volume ist Pflicht.</strong> Ohne
Volume verweigert Vaultwarden absichtlich den Start, damit du deine Daten nicht in
einem flüchtigen Container verlierst.</li>
<li><strong><code>DOMAIN</code></strong> – die vollständige HTTPS-URL. Vaultwarden braucht sie u. a. für WebAuthn/
2FA und Einladungslinks. Muss exakt zu deiner Router-Regel passen.</li>
<li><strong><code>SIGNUPS_ALLOWED: &quot;true&quot;</code></strong> – erlaubt vorerst die Registrierung, damit du dein
erstes Konto anlegen kannst. Das drehen wir gleich wieder ab.</li>
<li><strong><code>ADMIN_TOKEN</code></strong> – dein Hash aus Schritt 1. <strong>Wichtig:</strong> In einer Compose-Datei muss
jedes Dollarzeichen <strong>verdoppelt</strong> werden (<code>$</code> → <code>$$</code>), sonst versucht Compose, es als
Variable zu interpretieren. Aus <code>$argon2id$…</code> wird also <code>$$argon2id$$…</code>.</li>
<li><strong><code>loadbalancer.server.port=80</code></strong> – Vaultwarden lauscht im Container auf <strong>Port 80</strong>.
Diese Zeile sagt Traefik explizit, wohin es intern weiterleiten soll, statt den
Zielport aus dem Image raten zu lassen – dasselbe Muster wie bei jeder App hinter
Traefik.</li>
<li><strong>Kein <code>ports:</code></strong> – wie bei jeder App hinter Traefik ist Vaultwarden nur über den
Proxy erreichbar, niemals direkt von außen.</li>
</ul>
<h3 id="schritt-3-starten-und-den-ersten-aufruf">Schritt 3: Starten und den ersten Aufruf</h3>
<p>Starte den Container:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker compose up -d</span></span></code></pre></div>
</div>
<p>Beim ersten Start legt Vaultwarden das Datenverzeichnis an und initialisiert die
Datenbank. Wirf einen Blick ins Log:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker compose logs -f vaultwarden</span></span></code></pre></div>
</div>
<p>Du solltest am Ende diese Zeile sehen – sie bestätigt, dass der Dienst läuft:</p>
<div class="sk-code">
  <span class="sk-code-head">Ausgabe</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">[INFO] Rocket has launched from http://0.0.0.0:80</span></span></code></pre></div>
</div>
<p>Mit <code>Strg+C</code> verlässt du die Log-Ansicht wieder (der Container läuft weiter). Ruf jetzt
<code>https://vault.DEINE_DOMAIN</code> im Browser auf. Traefik holt beim ersten Zugriff das
Let&rsquo;s-Encrypt-Zertifikat – das kann ein paar Sekunden dauern. Danach erscheint die
Bitwarden-Web-Oberfläche.</p>
<p>Klick auf <strong>Konto erstellen</strong> und leg dein erstes Konto an – mit deiner E-Mail-Adresse
und einem Namen:</p>
<p><figure class="my-6"><img src="/tutorials/vaultwarden-passwortmanager/vaultwarden-konto-erstellen_hu_4a122f72dc709159.webp" srcset="/tutorials/vaultwarden-passwortmanager/vaultwarden-konto-erstellen_hu_38c8998945a4d549.webp 480w, /tutorials/vaultwarden-passwortmanager/vaultwarden-konto-erstellen_hu_4a122f72dc709159.webp 768w, /tutorials/vaultwarden-passwortmanager/vaultwarden-konto-erstellen_hu_874c7bf999471364.webp 1200w, /tutorials/vaultwarden-passwortmanager/vaultwarden-konto-erstellen_hu_f44917561bbcc1d1.webp 1920w" sizes="(min-width: 768px) 768px, 100vw"
    width="768" height="432"
    data-full="/tutorials/vaultwarden-passwortmanager/vaultwarden-konto-erstellen_hu_a7bbe3db7cd7fb21.webp"
    alt="Das Vaultwarden-Web-Interface zeigt das Formular zum Erstellen eines neuen Kontos mit E-Mail-Adresse und Name" title="Konto erstellen – Vaultwarden nutzt die offizielle Bitwarden-Web-Oberfläche"
    loading="lazy" decoding="async" class="rounded-lg"><figcaption class="mt-2 text-sm text-center text-slate-500 italic">Konto erstellen – Vaultwarden nutzt die offizielle Bitwarden-Web-Oberfläche</figcaption></figure></p>
<p>Im nächsten Schritt legst du dein <strong>Master-Passwort</strong> fest. Das ist der eine
Schlüssel, der deinen gesamten Tresor entsperrt:</p>
<p><figure class="my-6"><img src="/tutorials/vaultwarden-passwortmanager/vaultwarden-master-passwort_hu_849cc40e7b1cd644.webp" srcset="/tutorials/vaultwarden-passwortmanager/vaultwarden-master-passwort_hu_d511b12d9d26dc4a.webp 480w, /tutorials/vaultwarden-passwortmanager/vaultwarden-master-passwort_hu_849cc40e7b1cd644.webp 768w, /tutorials/vaultwarden-passwortmanager/vaultwarden-master-passwort_hu_9991a23fb3f21fe9.webp 1200w, /tutorials/vaultwarden-passwortmanager/vaultwarden-master-passwort_hu_e17e3e4cebab462b.webp 1920w" sizes="(min-width: 768px) 768px, 100vw"
    width="768" height="432"
    data-full="/tutorials/vaultwarden-passwortmanager/vaultwarden-master-passwort_hu_11fe2cf7874e5264.webp"
    alt="Die Vaultwarden-Seite zum Festlegen eines starken Master-Passworts mit Passwortfeld und Stärke-Anzeige" title="Das Master-Passwort verschlüsselt deinen gesamten Tresor – wähle es mit Bedacht"
    loading="lazy" decoding="async" class="rounded-lg"><figcaption class="mt-2 text-sm text-center text-slate-500 italic">Das Master-Passwort verschlüsselt deinen gesamten Tresor – wähle es mit Bedacht</figcaption></figure></p>
<div class="not-prose my-6 rounded-lg border-l-4 p-4 border-paprika-400 bg-paprika-50 dark:border-paprika-700 dark:bg-paprika-900/20">
  <p class="mb-1 flex items-center gap-2 font-semibold text-slate-900 dark:text-white">
    <span aria-hidden="true">🔥</span>Das Master-Passwort ist nicht wiederherstellbar
  </p>
  <div class="prose-kitchen text-sm">Dein Master-Passwort wird <strong>nie</strong> an den Server übertragen; es entschlüsselt deinen
Tresor lokal. Vergisst du es, sind <strong>alle</strong> darin gespeicherten Passwörter verloren –
niemand, auch du selbst nicht, kann sie wiederherstellen. Wähle eine lange, einmalige
Passphrase und hinterlege sie an einem sicheren Ort (z. B. ausgedruckt im Safe).</div>
</div>
<h3 id="schritt-4-die-registrierung-wieder-schließen">Schritt 4: Die Registrierung wieder schließen</h3>
<p>Sobald dein Konto steht, willst du <strong>verhindern, dass Fremde sich ebenfalls
registrieren</strong> können – dein Vaultwarden hängt schließlich offen im Internet. Setz
<code>SIGNUPS_ALLOWED</code> in der <code>compose.yaml</code> auf <code>false</code>:</p>
<div class="sk-code">
  <span class="sk-code-head">YAML</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="w">    </span><span class="nt">environment</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">DOMAIN</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;https://vault.DEINE_DOMAIN&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">SIGNUPS_ALLOWED</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;false&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">ADMIN_TOKEN</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;$$argon2id$$...&#34;</span></span></span></code></pre></div>
</div>
<p>Und übernimm die Änderung:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker compose up -d</span></span></code></pre></div>
</div>
<p>Compose erkennt die geänderte Umgebungsvariable und startet den Container neu. Ab jetzt
weist die Anmeldeseite neue Registrierungen ab. Weitere Nutzer (z. B. für die Familie)
lädst du bei Bedarf gezielt über das Admin-Panel ein – dazu gleich mehr.</p>
<div class="not-prose my-6 rounded-lg border-l-4 p-4 border-amber-400 bg-amber-50 dark:border-amber-700 dark:bg-amber-900/20">
  <p class="mb-1 flex items-center gap-2 font-semibold text-slate-900 dark:text-white">
    <span aria-hidden="true">⚠️</span>Nicht vergessen
  </p>
  <div class="prose-kitchen text-sm">Ein offenes <code>SIGNUPS_ALLOWED: &quot;true&quot;</code> ist die häufigste Fehlkonfiguration bei
selbst gehostetem Vaultwarden. Jeder, der deine Domain kennt, könnte sich sonst ein
Konto anlegen. Dieser Schritt ist Pflicht, kein Extra.</div>
</div>
<h3 id="schritt-5-das-admin-panel">Schritt 5: Das Admin-Panel</h3>
<p>Ruf <code>https://vault.DEINE_DOMAIN/admin</code> auf und melde dich mit dem <strong>Passwort</strong> an, das
du in Schritt 1 beim Erzeugen des Hashes eingegeben hast (nicht mit dem Hash selbst).
Du landest in der Verwaltungsoberfläche:</p>
<p><figure class="my-6"><img src="/tutorials/vaultwarden-passwortmanager/vaultwarden-admin_hu_473707ac677392b3.webp" srcset="/tutorials/vaultwarden-passwortmanager/vaultwarden-admin_hu_9aeb46075faece5c.webp 480w, /tutorials/vaultwarden-passwortmanager/vaultwarden-admin_hu_473707ac677392b3.webp 768w, /tutorials/vaultwarden-passwortmanager/vaultwarden-admin_hu_5667882637e7d363.webp 1200w, /tutorials/vaultwarden-passwortmanager/vaultwarden-admin_hu_d5ec00afc73e4d04.webp 1920w" sizes="(min-width: 768px) 768px, 100vw"
    width="768" height="432"
    data-full="/tutorials/vaultwarden-passwortmanager/vaultwarden-admin_hu_6e7aad8d3eec6a20.webp"
    alt="Das Vaultwarden-Admin-Panel mit den Bereichen General, SMTP Email und Backup Database" title="Das Admin-Panel – hier verwaltest du Nutzer, SMTP und globale Einstellungen"
    loading="lazy" decoding="async" class="rounded-lg"><figcaption class="mt-2 text-sm text-center text-slate-500 italic">Das Admin-Panel – hier verwaltest du Nutzer, SMTP und globale Einstellungen</figcaption></figure></p>
<p>Hier steuerst du den Dienst zentral:</p>
<ul>
<li><strong>Users</strong> – vorhandene Nutzer einsehen, neue <strong>einladen</strong> (auch bei
<code>SIGNUPS_ALLOWED=false</code>), Konten deaktivieren.</li>
<li><strong>Settings → SMTP Email Settings</strong> – trag hier die Zugangsdaten deines Mail-Servers
ein, damit Vaultwarden Einladungen und 2FA-Codes per Mail verschicken kann. Ohne SMTP
funktioniert die Einladung per Link zwar auch, aber E-Mail-basierte 2FA nicht.</li>
<li><strong>Diagnostics</strong> – zeigt dir, ob deine <code>DOMAIN</code> korrekt gesetzt ist und ob Vaultwarden
von außen erreichbar ist – praktisch bei der Fehlersuche.</li>
</ul>
<div class="not-prose my-6 rounded-lg border-l-4 p-4 border-herb-400 bg-herb-50 dark:border-herb-700 dark:bg-herb-900/20">
  <p class="mb-1 flex items-center gap-2 font-semibold text-slate-900 dark:text-white">
    <span aria-hidden="true">🧑‍🍳</span>Einstellungen im Panel vs. Umgebungsvariablen
  </p>
  <div class="prose-kitchen text-sm">Was du im Admin-Panel speicherst, wird in <code>vw-data/config.json</code> abgelegt und
<strong>überschreibt</strong> die Umgebungsvariablen aus der <code>compose.yaml</code>. Entscheide dich pro
Einstellung für einen Weg, um Verwirrung zu vermeiden. Für die Grund-Konfiguration
(Domain, Token, Signups) bleiben wir bewusst bei der Compose-Datei – sie ist
versionierbar und reproduzierbar.</div>
</div>
<h3 id="schritt-6-die-clients-verbinden">Schritt 6: Die Clients verbinden</h3>
<p>Jetzt kommt der eigentliche Nutzen. Installiere die <strong>offizielle Bitwarden-App</strong> oder
-Browser-Erweiterung (aus dem jeweiligen App- bzw. Add-on-Store). Bevor du dich
anmeldest, stellst du den Server um:</p>
<ol>
<li>Öffne in der App/Erweiterung <strong>noch vor dem Login</strong> die Einstellungen für die
<strong>selbst gehostete Umgebung</strong> (Zahnrad-Symbol bzw. „Region: Selbst gehostet&quot;).</li>
<li>Trag als <strong>Server-URL</strong> <code>https://vault.DEINE_DOMAIN</code> ein und speichere.</li>
<li>Melde dich jetzt mit deiner E-Mail und deinem Master-Passwort an – die App spricht
ab sofort mit deinem Server.</li>
</ol>
<p>Das Schöne: Es sind dieselben ausgereiften Clients wie beim kommerziellen Bitwarden.
Autofill, Passwort-Generator, sichere Notizen, Attachments und 2FA-Speicherung
funktionieren genauso – nur liegen die Daten auf deinem Server.</p>
<p><strong>Bestehende Passwörter importieren:</strong> Wechselst du von einem anderen Manager (oder
dem Browser-Passwortspeicher), musst du nicht alles abtippen. Exportiere dort deine
Einträge als CSV oder JSON und importiere sie über die <strong>Web-Oberfläche</strong> unter
<code>Werkzeuge → Daten importieren</code>. Vaultwarden versteht die Exportformate der gängigen
Manager (KeePass, LastPass, 1Password, Chrome/Firefox u. a.) direkt.</p>
<div class="not-prose my-6 rounded-lg border-l-4 p-4 border-amber-400 bg-amber-50 dark:border-amber-700 dark:bg-amber-900/20">
  <p class="mb-1 flex items-center gap-2 font-semibold text-slate-900 dark:text-white">
    <span aria-hidden="true">⚠️</span>Export-Dateien danach sicher löschen
  </p>
  <div class="prose-kitchen text-sm">Eine Export-CSV enthält alle Passwörter <strong>im Klartext</strong>. Lösche die Datei sofort nach
dem erfolgreichen Import wieder – und leere den Papierkorb. Lass sie niemals in
Downloads oder einem Cloud-Ordner liegen.</div>
</div>
<div class="not-prose my-6 rounded-lg border-l-4 p-4 border-herb-400 bg-herb-50 dark:border-herb-700 dark:bg-herb-900/20">
  <p class="mb-1 flex items-center gap-2 font-semibold text-slate-900 dark:text-white">
    <span aria-hidden="true">🧑‍🍳</span>Zwei-Faktor-Authentifizierung aktivieren
  </p>
  <div class="prose-kitchen text-sm">Aktiviere in den Kontoeinstellungen deines Tresors die <strong>2FA</strong> (z. B. per
Authenticator-App). Damit ist selbst bei geknacktem Master-Passwort dein Tresor nicht
sofort offen. Für E-Mail-basierte 2FA muss vorher SMTP im Admin-Panel eingerichtet
sein.</div>
</div>
<h2 id="wenn-es-nicht-funktioniert">Wenn es nicht funktioniert</h2>
<p><strong>Symptom:</strong> Der Container startet nicht, das Log sagt sinngemäß
<code>Running without a persistent volume is not recommended</code>.</p>
<p><strong>Ursache &amp; Lösung:</strong> Es fehlt das <code>volumes:</code>-Mapping. Vaultwarden verweigert absichtlich
den Start ohne Datenverzeichnis, damit deine Passwörter nicht in einem flüchtigen
Container landen. Ergänze <code>./vw-data:/data</code> wie in Schritt 2 und starte neu.</p>
<p><strong>Symptom:</strong> Die Web-Oberfläche zeigt „<strong>You need to enable HTTPS!</strong>&quot; oder der Login
scheitert mit Krypto-Fehlern.</p>
<p><strong>Ursache &amp; Lösung:</strong> Vaultwarden nutzt die Web-Crypto-API des Browsers, die nur in
einem <strong>sicheren Kontext</strong> (echtes HTTPS) verfügbar ist. Du hast die Seite über <code>http://</code>
oder mit ungültigem Zertifikat aufgerufen. Stell sicher, dass Traefik ein gültiges
Let&rsquo;s-Encrypt-Zertifikat geholt hat (Traefik-Log prüfen) und du die Seite über
<code>https://</code> erreichst. Die <code>DOMAIN</code>-Variable muss ebenfalls mit <code>https://</code> beginnen.</p>
<p><strong>Symptom:</strong> Das Admin-Panel weist dein Passwort ab, obwohl es stimmt.</p>
<p><strong>Ursache &amp; Lösung:</strong> Vermutlich sind die Dollarzeichen im <code>ADMIN_TOKEN</code> nicht
verdoppelt. In der <code>compose.yaml</code> muss aus jedem <code>$</code> ein <code>$$</code> werden. Prüfe mit
<code>docker compose config</code>, wie der Token tatsächlich ankommt (Compose zeigt dort den
aufgelösten Wert). Denk auch daran: Beim Login gibst du das <strong>Passwort</strong> ein, nicht den
Hash.</p>
<p><strong>Symptom:</strong> Die Handy-App findet den Server nicht oder meldet „Server-URL ungültig&quot;.</p>
<p><strong>Ursache &amp; Lösung:</strong> Die Server-URL muss die vollständige <code>https://</code>-Adresse ohne
abschließenden Pfad sein (<code>https://vault.DEINE_DOMAIN</code>). Prüfe außerdem, ob die Domain
von außen per Browser erreichbar ist und das Zertifikat gültig ist – Apps sind bei
Zertifikatsfehlern strenger als Browser.</p>
<p><strong>Symptom:</strong> Trotz <code>SIGNUPS_ALLOWED=false</code> konnte sich jemand registrieren.</p>
<p><strong>Ursache &amp; Lösung:</strong> Wahrscheinlich wurde die Einstellung im Admin-Panel gesetzt und
überschreibt die Umgebungsvariable, oder der Container wurde nach der Änderung nicht neu
gestartet. Kontrolliere den Wert unter <strong>Settings → General settings</strong> im Panel und
starte mit <code>docker compose up -d</code> neu.</p>
<h2 id="wartung--backups">Wartung &amp; Backups</h2>
<ul>
<li>
<p><strong>Backups sind bei einem Passwortmanager nicht verhandelbar.</strong> Dein gesamter Tresor
steckt im Verzeichnis <code>vw-data/</code> (SQLite-Datenbank, Keys, Attachments). Sichere es
<strong>verschlüsselt und off-site</strong> mit <a href="/tutorials/backups-mit-restic/">Restic</a> – nimm den
Ordner <code>~/vaultwarden/vw-data</code> in deine Backup-Quellen auf. Für einen konsistenten
Datenbank-Stand führst du vor dem Backup kurz <code>docker compose stop</code> aus oder nutzt die
„Backup Database&quot;-Funktion im Admin-Panel. Eine bloße Dateikopie bei <strong>laufendem</strong>
Container kann dagegen einen inkonsistenten Stand erwischen (SQLite schreibt in
WAL-Dateien) – bei einem Passwortmanager ist das kein Risiko wert.</p>
</li>
<li>
<p><strong>Updates kontrolliert einspielen.</strong> Weil wir die Version gepinnt haben, aktualisierst
du bewusst: Vor dem Wechsel die
<a href="https://github.com/dani-garcia/vaultwarden/releases">Release-Notes</a> lesen, dann den
Tag in der <code>compose.yaml</code> erhöhen (z. B. auf die nächste <code>1.x</code>) und neu ziehen:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker compose pull <span class="o">&amp;&amp;</span> docker compose up -d</span></span></code></pre></div>
</div>
<p>Prüfe danach im Log wieder die <code>Rocket has launched</code>-Zeile und teste einen Login.</p>
</li>
<li>
<p><strong>Registrierung geschlossen lassen.</strong> Kontrolliere gelegentlich, dass
<code>SIGNUPS_ALLOWED</code> weiterhin <code>false</code> ist – neue Nutzer immer gezielt über das
Admin-Panel einladen.</p>
</li>
<li>
<p><strong>ADMIN_TOKEN rotieren</strong>, wenn er kompromittiert sein könnte: neuen Hash mit dem
<code>hash</code>-Befehl aus Schritt 1 erzeugen, in der <code>compose.yaml</code> ersetzen, neu starten.</p>
</li>
<li>
<p><strong>Master-Passwort niemals verlieren.</strong> Es gibt keine Wiederherstellung. Bei einem
Team/Familien-Setup kann ein Notfall-Zugang (Emergency Access) sinnvoll sein – den
richtest du pro Tresor in den Kontoeinstellungen ein.</p>
</li>
</ul>
]]></content:encoded></item></channel></rss>