Mit der initialen und einmaligen Einrichtung des Docker Servers bei einem Hoster der Wahl (ich empfehle hier Hetzner), kommen die Ideen wie von selbst. Warum für etwas zahlen, was Du schnell selbst hosten und damit deiner eigenen Obhut unterstellen kannst? Zum Beispiel einen Passwort-Manager, weshalb ich diesen Artikel Docker + Bitwarden genannt habe.
Update
16.10.2023 Ergänzung um Update-Prozess von bitwarden
15.05.2023 Ergänzungen zur Nutzung und den ersten Schritten mit bitwarden
15.05.2023 iOS Nutzung bebildert hinzugefügt
Vorbereitungen
Den Server vorbereiten heißt, am Server anmelden und in die bekannte Struktur einen neuen Ordner erstellen. In diesen schreibe ich die Konfiguration für docker compose.
mkdir -p /opt/containers/bitwarden/{data,config}
vi /opt/containers/bitwarden/docker-compose.ymlZshFür alle die vi nicht kennen gibt es hier einen kurzen Exkurs in dessen Handhabung. Wenn Du dem Link nicht folgen magst, hier die TL;DR-Version. Mit dem obigen Befehl öffnet vi die angegebene Datei.
1) Auf dem Keyboard ‚i‚ drücken, woraufhin im unteren Bereich des Fensters — INSERT — erscheint und vi in den Texteingabe-Modus versetzt wird.
2) Text einfügen oder schreiben. Die Navigation innerhalb des Dokuments erfolgt mit den Pfeiltasten.
3) Wenn alles übertragen, geschrieben oder modifiziert ist, wird mit folgenden Tasten bzw. Tastenkombinationen gesichert:
ESC
:x
ENTERZsh(Escape-Taste, dann Doppelpunkt, dann x, dann ENTER)
Bitwarden mit docker compose
Der Inhalt, der in die docker-compose.yml übertragen wird, umfasst die bekannten Elemente. Namen, Restart-Anweisung, Image und die Volumes, die ich mappen will.
Ich habe einige Kommentare eingefügt, die anzeigen, was Du für Deine Laufzeitumgebung ändern musst.
version: '3.9'
services:
bitwarden:
image: vaultwarden/server:latest
restart: unless-stopped
volumes:
- /opt/containers/bitwarden/data:/data
- /opt/containers/bitwarden/config:/etc/bitwarden
labels:
- "traefik.enable=true"
- "traefik.http.routers.bitwarden.entrypoints=http"
# set domain / Domain setzen
- "traefik.http.routers.bitwarden.rule=Host(`vault.tolledomain.tld`)"
- "traefik.http.middlewares.bitwarden-https-redirect.redirectscheme.scheme=https"
- "traefik.http.routers.bitwarden.middlewares=bitwarden-https-redirect"
- "traefik.http.routers.bitwarden-secure.entrypoints=https"
# set domain / Domain setzen
- "traefik.http.routers.bitwarden-secure.rule=Host(`vault.tolledomain.tld`)"
- "traefik.http.routers.bitwarden-secure.tls=true"
- "traefik.http.routers.bitwarden-secure.tls.certresolver=http"
- "traefik.http.routers.bitwarden-secure.service=bitwarden"
- "traefik.http.services.bitwarden.loadbalancer.server.port=80"
- "traefik.docker.network=proxy"
- "traefik.http.routers.bitwarden-secure.middlewares=secHeaders@file"
environment:
# uncomment to deactivate the admin panel / auskommentieren um Adminpanel zu laden
# our password, to be hashed will be / das zu hashende Passwort wird
# "ShuffleRandom1234%$!"
# ADMIN_TOKEN: '$argon2id$v=..$m=...,t0p=...+...+' # see below / siehe unten!
SIGNUPS_ALLOWED: 'false'
INVITATIONS_ALLOWED: 'true'
SHOW_PASSWORD_HINT: 'true'
WEBSOCKET_ENABLED: 'true'
networks:
- proxy
networks:
proxy:
external: trueYAMLGeschlossen und gespeichert wird die Konfiguration in vi wieder mit ESCAPE:x:ENTER. Und bevor ich noch auf die environment eingehe, starte ich den Container schon mal an.
docker compose /opt/containers/bitwarden/docker-compose.yml up -dZshUnter environment habe ich einige Elemente eingefügt, die meiner Ansicht nach von Vorteil sind.
bitwarden aufrufen und als Benutzer registrieren
Das ist jetzt der wichtig(st)e Schritt. Du rufst nach einer kleinen Gedenkminute den URL auf, unter dem Du den Server registriert hast. In der Gedenkminute seit dem Start des Containers, konnte docker den Container starten und ein SSL-Zertifikat einrichten.
traefik.http.routers.bitwarden.rule=Host(`vault.tolledomain.tld`)YAMLFolge hier einfach den Anweisungen: Benutzername (E-Mailadresse) und Master-Passwort. Mehr braucht es zunächst nicht, weshalb ich mir auch die weiteren Erörterungen an dieser Stelle sparen möchte. (Und es gibt auch keine Bilder! … bis auf eins)

Adminzugang absichern
In der docker-compose.yml gibt es im Bereich environment einige Parameter, die man setzen kann (nicht muss). Die aber für die weitere Administration und Nutzung schon einen Mehrwert ringen.
ADMIN_TOKEN enthält das Kennwort für die Admin-Oberfläche /admin. Wenn Du das Kommentarzeichen # entfernst, kann man sich dort nicht anmelden. Diese Direktive nimmt demnach zwei Aufgaben war. Sie bestimmt ob man sich, oder ob man sich nicht anmelden kann und bestimmt das entsprechend notwendige Kennwort.

Hinweis: Wenn Du hier keinen hash-Token in die Datei packst, dann ist das plain text == Murks. Entsprechend erscheint als dicke, fette Warnung ein Banner, der auf Deinen Murks hinweist. Seit V1.2.8 ist hier ein Schutzmechanismus etabliert [2]. Um den Server zu starten musst Du also den nächsten Schritt ausführen, das Kennwort hashen und dann den kompletten String in die docker-compose.yml eintragen.
Vaultwarden hash nutzen
Ich werde hier nicht murksen und daher bekommst Du auch gleich das richtige Vorgehen serviert. An der Kommandozeile führst Du einfach einige Befehle aus. In Schritt 1 fragst Du den Containernamen ab. Mit docker ps erhältst Du diesen (in meinem Fall bitwarden-bitwarden-1). Mit dem Containernamen rufst Du in Schritt 2, bei laufendem Container das Tool vaultwarden auf und generierst damit einen Hash, den Du dann in die entsprechende Zeile der docker-compose.yml einträgst.
docker exec -it bitwarden-bitwarden-1 /vaultwarden hashZshAn der interaktiven Eingabe liefert vaultwarden den Hash. Bei „Password“ und der „Confirmation“ gibst Du ein sicheres Passwort ein. Hier habe ich tatsächlich das von oben gehashed.
Generate an Argon2id PHC string using the 'bitwarden' preset:
Password:
Confirm Password:
ADMIN_TOKEN='$argon2id$v=19$m=65540,t=3,p=4$EoFG1F5GnAxxNLYwXbYT28KKTO10z2DPopv8z+byAtA$9cUR4WnOQBFT4zpCT4diyX45vtuJ+dRxPbOgrY5v7Os'
Generation of the Argon2id PHC string took: 337.453884msZshDen Hash trägst Du in Schritt 3 interpoliert in die docker-compose.yml ein und startest den Container einmal neu. Interpoliert bedeutet, dass die im hash enthaltenen $-Zeichen durch $$ ersetzt werden müssen. Andernfalls kommt es zu Warnmeldungen an der Kommandozeile, aber nicht zum ordnungsgemäßen Start des Containers. Das sähe dann in etwa so aus:
WARN[0000] The "argon2id" variable is not set. Defaulting to a blank string.
WARN[0000] The "v" variable is not set. Defaulting to a blank string.
WARN[0000] The "m" variable is not set. Defaulting to a blank string.
WARN[0000] The "y***K" variable is not set. Defaulting to a blank string.
WARN[0000] The "K1mSokR*******sKBOVgVMsQ8O**********" variable is not set. Defaulting to a blank string.ZshAlternative Verfahren werden in der Dokumentation [1] beschrieben. Folgerichtig sieht der Wert in der docker-compose.yml wie folgt aus:
- "traefik.http.routers.bitwarden-secure.middlewares=secHeaders@file"
environment:
# uncomment to deactivate the admin panel / auskommentieren um Adminpanel zu laden
# our password, to be hashed will be / das zu hashende Passwort wird
# "ShuffleRandom1234%$!"
ADMIN_TOKEN: '$$argon2id$$v=19$$m=65540,t=3,p=4$$EoFG1F5GnAxxNLYwXbYT28KKTO10z2DPopv8z+byAtA$$9cUR4WnOQBFT4zpCT4diyX45vtuJ+dRxPbOgrY5v7Os'
SIGNUPS_ALLOWED: 'false'
INVITATIONS_ALLOWED: 'true'ZshEs ist nicht ganz ungeschickt, wenn Du Dir dieses Passwort merkst. Vergisst Du es, dann kannst Du aber auch ein Neues einrichten (Strapazen).
Mit der Definition SIGNUPS_ALLOWED bleiben wir unter uns, oder Du unter Dir. Diese Direktive verhindert, dass man sich eben mal so an dem Server anmeldet, sich ein Konto einrichtet und Deine Ressourcen nutzt.
Mit INVITATIONS_ALLOWED kannst Du es aber wieder soweit aufweichen, dass Du zumindest jemanden hinzufügen kannst. Eine gute Kombination, wenn Du zB Konten für Family & Friends einrichten willst.
Clients
Für bitwarden gibt es natürlich auch Clients, nicht nur die Webseite. Die wahrscheinlich beliebtesten (die Mobile Clients) bekommt man aus dem AppStore für iOS und bei Google Play. Alle anderen Apps, Extensions und Clients findest Du im Downloadbereich von bitwarden.
iOS
Worum ging es bei der Einrichtung? Ich denke mal darum, dass man schnell einen Passwort-Manager an der Hand hat und überall nutzen kann? Dann zeige ich Dir am Beispiel iOS, wie Du auf Deinen Server zugreifen kann. Da mir tatsächlich nur iOS zur Verfügung steht habe ich keine Android-Anleitung. Wird sich aber wohl nicht grundlegend unterscheiden.
Zunächst musst Du Dir die App laden und dann öffnen.

Im Anschluss klickst Du auf das Zahnrad rechts oben und trägst unter Server URL Deinen Server ein. Das korreliert mit dem Eintrag Host(`…`) in der docker-compose.yml
traefik.http.routers.bitwarden.rule=Host(`vault.tolledomain.tld`)YAML
Bestätige das mit Speichern (rechts oben). Dann kannst Du Dich an die Anmeldung machen. Diese entspricht den Anmeldedaten von weiter oben. Die Anfrage wird somit an Deinen Server und nicht mehr an bitwarden.com geleitet.
Mehrere Konten nutzen
Wenn Du, so wie ich mehrere Server administrierst oder nutzt, ist bitwarden sehr einfach mit diesem zu verknüpfen. In der App kann einfach ein neues Konto hinzugefügt werden. Wichtig zu wissen ist, dass hier wieder erste über das Zahnrad die URL des Servers eingetragen werden muss!

Zusammenfassung
Wir haben hier sehr schnell einen eigenen Passwort Manager etabliert und sparen uns damit monatliche Abokosten. Vom Spaß des Einrichtens von Docker + Bitwarden mal ganz abgesehen.
Es bleibt die (Un-)Sicherheit der eigenen Person. Kein Backup, kein Mitleid.
— UPDATE
Update
Auch bitwarden / valutwarden braucht von Zeit zu Zeit ein Update. Der Update-Prozess sieht dabei wie folgt aus:
- Neuestes Version laden
- Alten Bitwarden-Container stoppen
- Alten Bitwarden-Container löschen
- Neuen Bitwarden-Container starten
Die Schritte im Einzelnen
docker pull vaultwarden/server:latestZshDamit wird völlig unverfänglich das neueste Image (Container) herunter geladen. In dieser Anleitung habe ich die docker-compose.yml so ausgelegt, dass die Daten persistent und außerhalb des Containers aufbewahrt werden. Dies ist wichtig, denn sonst kann der übernächste Schritt zum Totalausfall mutieren.
docker stop <containername>ZshDen <containername> bekommst Du mit docker ps --format "{{.Names}}" am schnellsten. In meinem Fall lautet der Name bitwarden-bitwarden-1 was zu folgendem Löschbefehl führt:
docker rm bitwarden-bitwarden-1ZshMit dem nächsten Befehl fährt der aktualisierte Container dann wieder hoch:
docker compose -f /opt/containers/bitwarden/docker-compose.yml up -dZshQuellen
https://github.com/dani-garcia/vaultwarden/wiki/Enabling-admin-page#secure-the-admin_token
https://github.com/dani-garcia/vaultwarden/wiki/Updating-the-vaultwarden-image



Ein Gedanke zu „Docker + Bitwarden (Update)“