Bitwarden ist ein Online Passwort Dienst, den ihr selbst hosten könnt. Dies hat für euch den Vorteil, dass ihr genau wisst, wo eure Daten gespeichert sind.
Nun zeige ich euch, wie ihr dies in wenigen Minuten mit Docker realisiert. Traefik dient uns hier als Reverse Proxy und stellt später den Dienst verschlüsselt per TLS bereit.
Inhaltsverzeichnis
Wer Traefik noch nicht installiert hat, findet hier eine Anleitung, wie ihr dies schnell tun könnt.
Als Grundlage meiner Anleitung dient diese Anleitung von Bitwarden_rs. Bitwarden_rs wurde vor kurzem in Vaultwarden umbenannt. Weitere Infos dazu findet ihr hier.
Bitwarden rs ist kein offizielles Bitwarden sondern eine für Docker angepasste Version. Mehr Infos dazu hier.
1. Ordner anlegen
Zuerst legen wir uns passende Ordner-Strukturen an.
mkdir -p /opt/containers/bitwarden/data
2. Docker Compose anlegen
Nun legen wir die eigentliche Docker Datei an
cd /opt/containers/bitwarden/ nano docker-compose.yml
version: '3' services: bitwarden: image: vaultwarden/server:latest restart: unless-stopped volumes: - /opt/containers/bitwarden/data:/data labels: - "traefik.enable=true" - "traefik.http.routers.bitwarden.entrypoints=http" - "traefik.http.routers.bitwarden.rule=Host(`bitwarden.euredomain.de`)" ## Hier anpassen ## - "traefik.http.middlewares.bitwarden-https-redirect.redirectscheme.scheme=https" - "traefik.http.routers.bitwarden.middlewares=bitwarden-https-redirect" - "traefik.http.routers.bitwarden-secure.entrypoints=https" - "traefik.http.routers.bitwarden-secure.rule=Host(`bitwarden.euredomain.de`)" ## Hier anpassen ## - "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" networks: - proxy networks: proxy: external: true
Notwendige Anpassungen:
- 2x eure Domain bei Traefik anpassen (“bitwarden.euredomain.de”)
Diese Docker Compose Datei funktioniert nur, wenn ich euch mittels meiner Anleitung hier Traefik installiert habt. Sonst heißen einige Traefik Variablen wohl anders. Diese müsst ihr dann dementsprechend bei euch anpassen.
3. Bitwarden Server starten
Den Server startet ihr wie gewohnt mit folgendem Befehl:
docker-compose -f /opt/containers/bitwarden/docker-compose.yml up -d
4. Quellen
https://hub.docker.com/r/bitwarden/server
https://hub.docker.com/r/vaultwarden/server
22 Kommentare
Hi Christian,
vorab dein Blog ist klasse, der hat mir sehr geholfen.
aber zu dem bitwardenrs hier hab ich eine frage.
das ist doch nur das webfrontend in rust (not official)… wie flunche ich denn da das richtige bitwarden ran ?
das ist eine container composition aus vielen microservicen:
installier bar hierrueber:
https://github.com/bitwarden/server/blob/master/scripts/bitwarden.sh
gruesse
Matthias
ps
ich habs nun hinbekommen dort traefik als reverse zu nehmen. (ich hab die tage mein ganzes homelab von nginx/certbot (old but gold – es hat funktioniert) zu traefik migriert, so bin ich auf deinen blog hier aufmerksam geworden.
Hallo Christian,
Hallo Matthias
Hallo Dee
auch mir war die abgespreckte Version aus einer in meinen Augen nicht ausreichend verifizierten Quelle, nicht ganz geheuer. Deshalb ich mich ein paar Abende damit beschäftig die Originalversion von Bitwarden unter Docker und Traefik zu installieren. Den größten Teil der Konfiguration habe ich aus diesen beiden Beiträgen bei Reddit
https://www.reddit.com/r/Bitwarden/comments/dja93a/selfhosted_bitwarden_behind_traefik_v20_reverse/
https://www.reddit.com/r/selfhosted/comments/8ekjjh/bitwarden_traefik_docker_installation/
Meine daraus resoltierenden Konfigurationsdateien sehen wie folgt aus:
/opt/containers/bitwarden/bwdata/config.yml
——————-
#
# Note: After making changes to this file you need to run the `rebuild` or `update`
# command for them to be applied.
#
# Full URL for accessing the installation from a browser. (Required)
url: https://bitwarden.DEINEDOMAIN.de ########## Domain ändern
#
# Auto-generate the `./docker/docker-compose.yml` config file.
# WARNING: Disabling generated config files can break future updates. You will be
# responsible for maintaining this config file.
# Template: https://github.com/bitwarden/server/blob/master/util/Setup/Templates/DockerCompose.hbs
generate_compose_config: true
#
# Auto-generate the `./nginx/default.conf` file.
# WARNING: Disabling generated config files can break future updates. You will be
# responsible for maintaining this config file.
# Template: https://github.com/bitwarden/server/blob/master/util/Setup/Templates/NginxConfig.hbs
generate_nginx_config: true
#
# Docker compose file port mapping for HTTP. Leave empty to remove the port mapping.
# Learn more: https://docs.docker.com/compose/compose-file/#ports
http_port: 8080
#
# Docker compose file port mapping for HTTPS. Leave empty to remove the port mapping.
# Learn more: https://docs.docker.com/compose/compose-file/#ports
https_port: 8443
#
# Docker compose file version. Leave empty for default.
# Learn more: https://docs.docker.com/compose/compose-file/compose-versioning/
compose_version:
#
# Configure Nginx for SSL.
ssl: false
#
# SSL versions used by Nginx (ssl_protocols). Leave empty for recommended default.
# Learn more: https://wiki.mozilla.org/Security/Server_Side_TLS
ssl_versions:
#
# SSL ciphersuites used by Nginx (ssl_ciphers). Leave empty for recommended default.
# Learn more: https://wiki.mozilla.org/Security/Server_Side_TLS
ssl_ciphersuites:
#
# Installation uses a managed Let’s Encrypt certificate.
ssl_managed_lets_encrypt: false
#
# The actual certificate. (Required if using SSL without managed Let’s Encrypt)
# Note: Path uses the container’s ssl directory. The `./ssl` host directory is mapped to
# `/etc/ssl` within the container.
ssl_certificate_path:
#
# The certificate’s private key. (Required if using SSL without managed Let’s Encrypt)
# Note: Path uses the container’s ssl directory. The `./ssl` host directory is mapped to
# `/etc/ssl` within the container.
ssl_key_path:
#
# If the certificate is trusted by a CA, you should provide the CA’s certificate.
# Note: Path uses the container’s ssl directory. The `./ssl` host directory is mapped to
# `/etc/ssl` within the container.
ssl_ca_path:
#
# Diffie Hellman ephemeral parameters
# Learn more: https://security.stackexchange.com/q/94390/79072
# Note: Path uses the container’s ssl directory. The `./ssl` host directory is mapped to
# `/etc/ssl` within the container.
ssl_diffie_hellman_path:
#
# Communicate with the Bitwarden push relay service (push.bitwarden.com) for mobile
# app live sync.
push_notifications: true
#
# Use a docker volume (`mssql_data`) instead of a host-mapped volume for the persisted database.
# WARNING: Changing this value will cause you to lose access to the existing persisted database.
# Learn more: https://docs.docker.com/storage/volumes/
database_docker_volume: false
#
# Defines “real” IPs in nginx.conf. Useful for defining proxy servers that forward the
# client IP address.
# Learn more: https://nginx.org/en/docs/http/ngx_http_realip_module.html
real_ips:
——————-
/opt/containers/bitwarden/bwdata/docker/docker-compose.override.yml
(Achtung: im Gegensatz zu den Anleitungen von Christian heißt das Traefik-Netzwerk bei mir “Traefik”)
——————-
version: ‘3’
services:
mssql:
labels:
– traefik.enable=false
networks:
– default
web:
labels:
– traefik.enable=false
networks:
– default
attachments:
labels:
– traefik.enable=false
networks:
– default
api:
labels:
– traefik.enable=false
networks:
– default
identity:
labels:
– traefik.enable=false
networks:
– default
admin:
labels:
– traefik.enable=false
networks:
– default
icons:
labels:
– traefik.enable=false
networks:
– default
nginx:
labels:
– traefik.enable=true
– traefik.docker.network=traefik
– traefik.port=8080
– traefik.backend=bitwarden-nginx
– traefik.frontend.rule=Host:bitwarden.DEINEDOMAIN.de
– traefik.http.routers.bitwarden.entryPoints=https
– traefik.http.routers.bitwarden.rule=Host(“bitwarden.DEINEDOMAIN.de”)
# – traefik.http.middlewares.strip.stripprefix.prefixes=/
– traefik.http.routers.bitwarden.tls=true
– traefik.http.routers.bitwarden.tls.certresolver=http
– traefik.http.services.bitwarden.loadbalancer.server.port=8080
networks:
– traefik
– default
networks:
traefik:
external: true
——————-
Ich hoffe es hilft. Vielleicht macht Christian ja noch eine richte Anleitung daraus.
Gruß aus Hamburg
Hein Mück
Hallo Hein, Christian,
danke für die kurze Anleitung, aber leider komme ich damit nicht so richtig klar.
@Christian,
vielleicht könntest du eine Anleitung dafür erstellen?
Hallo,
vielen dank erstmal für die Anleitung. Ist leicht nachgestellt.
Paar Fragen habe ich jedoch zu der Konfiguration:
1. Kann ich das offizielle Bitwarden Image auch nutzen? Da ich bei RS einige Funktionen vermisse.
2. Kann ich den Standard Port von Bitwarden in der Docker-Compose direkt beim installieren ändern?
Hallo Christian,
vielen Dank für die tollen Anleitungen! Alles topaktuell und es hat mir sehr weitergeholfen!
Ich versuche nun, aus Ermangelung einer subdomain die Anwendung mit subdirectory zum Laufen zu bekommen.. also anstatt bitwarden.meinedomain.de meinedomain.de/bitwarden
Weißt Du wie das geht?
Vielen Dank vorab, viele Grüße
Stefan
Versuch es mal mit dem PathPrefix Kommando:
– “traefik.http.routers.bitwarden.rule=Host(`bitwarden.euredomain.de`) && PathPrefix(`/bitwarden`)” ## Hier anpassen ##
Ähhhm eine Frage:
Wenn man deine Anleitung genauso umsetzt, dann kann sich ja jeder auf z.B. bitwarden.meinserver.de einen account anlegen? ist das so richtig?
Wenn ja, wie schützt man sich davor?
VG Hardy
Das ist korrekt und ein wichtiger Hinweis, den Christian leider verschwitzt hat.
Dazu muss noch auf der Ebene unter bitwarden, also image, restart, volumes, etc..
environment Variablen gesetzt werden:
hier vom Entwickler:
https://github.com/dani-garcia/bitwarden_rs/wiki/Disable-registration-of-new-users
environment:
– SIGNUPS_ALLOWED=false
– INVITATIONS_ALLOWED=false
Möchtest du die Admin Page aufrufen können, musst du diese noch via Token freischalten.
environment:
– SIGNUPS_ALLOWED=false
– INVITATIONS_ALLOWED=false
– ADMIN_TOKEN=some_random_token_as_per_above_explanation
Die Erklärung vom Token auch beim Entwickler
https://github.com/dani-garcia/bitwarden_rs/wiki/Enabling-admin-page
Aufpassen, dass du wirklich über Traefik per HTTPS gesichert bist, bevor du das freischaltest, nicht, dass da jemand zwischenlauscht.
Du rufst die Admin-Seite dann per bitwarden.euredomain.de/admin auf und gibst das Token ein.
Nicht verwundern wenn du dann auf localhost/admin verwiesen wirst und dann nicht weiterkommst.
Das ist der Default-Wert. Hier dann nochmal deine bitwarden.euredomain.de einfügen und dann bist du im Admin-Panel. Dort dann unter General Settings wieder bitwarden.euredomain.de als Domain-Url einfügen und nächstes Mal kommste auch sofort drauf. Im Anschluss würde es sich anbieten das Admin-Token wieder aus der docker-compose.yml zu entfernen, da es dort nicht mehr benötigt wird.
Zusammenfassend also:
Einmal normal starten wie Christian beschrieben. docker-compose up -d.
Dann einen User erstellen. docker-compose.yml mit den Variablen anpassen. Wieder docker-compose up -d. Solltest du den Admin-Bereich erstellt haben, beim zweiten Mal dann das Token auch gleich mit entfernen aus der .yaml. Du kannst auch über den Admin-Bereich dann steuern, ob du signups / invitations zulässt.
Hoffe das hilft und ich habe keinen Mist erzählt. Würde ggf. den Admin-Bereich weglassen, wenn man sich unsicher ist. Das Blockieren von neuen Signups hat so wie beschrieben auf jeden Fall funktioniert.
hallo Christian
ich habe Traefik und bitwarden gemäss Deinen Angaben installiert. Traefik und Portainer laufen klaglos.
Nur bitwarden zeigt in Traefik einen Error:
Name: bitwarden-secure@docker
error: middleware “secHeaders@file” does not exist
Was für einen Fehler meint Traefik damit?, resp. was kann ich machen?
Hallo Jakob,
Hallo Christian,
ich habe den gleichen Fehler.
Hallo zusammen,
dasselbe auch hier:
middleware “secHeaders@file” does not exist.
Traefik-Setup nach der Anleitung hier erstellt und auch Seafile erfolgreich im Einsatz. Nur bei Bitwarden zeigt Traefik den obigen Fehler.
Habe nun nach noch das “SSL-Check-Bonusprogramm” durchlaufen, das im Traefik-Setup-Artikel verlinkt war, weil mir die erst darin erstellte dynamic_conf des Rätsels Lösung zu sein scheint bzw. schien – denn: ich bekomme trotzdem noch den selben Fehler. :-/
Weiß wer weiter?
Hallo Jakob und Christian,
die Anzeige “error: middleware „secHeaders@file“ does not exist ” beruht auf 90% Zertifikatsfehler. Das könnte 2 Ursachen haben.
– Die URL bitwarden.euredomain.de/ ist nicht richtig aus dem Internet erreichbar 443 oder dümDNS usw. Eine Aufruf aus den Internet sollt den Fehler 402 bringen und damit diesen Ursache ausschließen.
– Wenn traefit in v.2.4.8 im Einsatz ist und jewals eine yml Dateien für jeden Container verwendet werden ist diese Anpassung in jeder Datei erforderlich. z.B.
alt
– „traefik.http.routers.bitwarden-secure.middlewares=traefik-auth,secHeaders@file“
neu
– “traefik.http.routers.bitwarden-secure.middlewares=secHeaders@file”
– “traefik.http.routers.bitwarden-secure.middlewares=traefik-auth”
Sollte die Anleitung noch Probleme bereiten, bitte melden. Dann kann ich auch noch mehr schreiben.
Hallo Christian,
kannst du mir sagen wie ich das updaten kann
Diagnostics Version
Server Installed Ok 1.18.0
Server Latest 1.18.0
Web Installed Update 2.17.1 <—-
Web Latest 2.18.1
Weißt Du wie das geht?
Vielen Dank vorab, viele Grüße
Oliver
Hi,
danke für den Artikel für den Einstieg ins Thema! Hast du bereits die WebSocket connection per Traefik realisiert? Das wäre für unser Team wichtig – ggf. muss ich mich noch damit beschäftigen.
Wer es benötigt mit folgenden Zeilen in der Service-Definition kann der Service ohne root Berechtigungen laufen (999999 muss natürlich mit den eigenen Nummern ersetzt werden). Auch die SMTP Konfiguration war bei mir zwingend.
“`
…
env_file: ../.env
user: ${PUID:-999999}:${PGID:-999999}
sysctls:
– net.ipv4.ip_unprivileged_port_start=0
volumes:
– ./bitwarden/data:/data
– /etc/localtime:/etc/localtime:ro
– /etc/timezone:/etc/timezone:ro
…
environment:
# – WEBSOCKET_ENABLED=true
– DOMAIN=http://benoetigt.fuer.die.email.local
– SIGNUPS_ALLOWED=true
– SMTP_HOST=${SMTP_HOST}
– SMTP_FROM=${MAIL_FROM_ADDRESS}
– SMTP_PORT=${SMTP_PORT}
– SMTP_SSL=true
– SMTP_USERNAME=${SMTP_NAME}
– SMTP_PASSWORD=${SMTP_PASSWORD}
…
“`
https://github.com/dani-garcia/bitwarden_rs/wiki/Proxy-examples#traefik-v1-labels-migrated-to-traefik-v2
mahlzeit!
@christian: danke für deine super erklärungen und deine compose dateien! damit war ich dann endlich in der lage aus meinem etwas zickigen asustor nas einen homeserver zu realisieren.
an die leute mit dem middleware „secHeaders@file“ does not exist fehler: ihr müßt nicht nur den ssl test durch führen sondern das komplette workaround dann ist der fehler weg und alles läuft wie es soll.
soweit ich weiß gibt es keinerlei funktionalen unterschied zwischen bitwarden_rs und dem orig bitwarden. die einzigen unterschiede sind das ihr keine extra datenbank benötigt und dass das ganze dadurch ressourcen schonender ist das wars dann auch schon. das admin panel bietet übrigens auch die funktion des sperrens der möglichkeit neue accounts zu erstellen.
Hallo Christian
Um es noch mal für Alle klar zu sagen:
Diese Anleitung installiert keinen Bitwarden-Server, sondern Bitwarden RS https://github.com/dani-garcia/bitwarden_rs/.
Der Link am Anfang des Artikels zeigt auf die Original-Bitwarden-Doku.
Die installierte Software meldet sich dann sogar mit “© 2021, Bitwarden Inc.”
Das ist schon maximal verwirrend!!
Man vertraut seine Daten also Dani Garcia an, und nicht Bitwarden Inc.
Das solltest DU auf jeden Fall klarstellen.
Grüße
M
Habs angepasst.
LG
Christian
Hallo Christian,
vielen Dank für die Mühe und gigantische Zeit, die Du investierst, um Leuten zu helfen.
Ich finde deine Anleitungen super und gut verständlich.
Begonnen habe ich mit deinen Anleitungen zum Thema Traefik, hat super funktioniert, danach habe ich auch die Security-Anpassungen vorgenommen, nun bin ich auch bei A+ 🙂
Dann habe ich mich an die Bitwarden Anleitung gewagt und diese bekomme ich nicht hin.
D.h. alles hat funktioniert, der Container wird installiert, die Zertifikate werden erstellt, mache ich auf der Domain den SSL Server Test, bekomme ich auch ein A. D.h. alles sieht gut aus, rufe ich aber meine URL auf, bekomme ich ein “Gateway Timeout”, hast Du einen Tipp für mich?
Beste Grüße
Frank
Ohhh … Mann …. wie so oft, das Problem sitzt vor dem Rechner 😉
Ich habe gerade festgestellt, das ich Traefik, wie auch immer das passiert ist, im Netzwerk proxy_traefik aufgesetzt habe. Da Bitwarden dann aber im Netzwerk proxy war, ging es nicht. Das Ändern des Netzwerkes war der Schlüssel.
Beste Grüße
Frank
Hallo Christian,
Nachdem ich deine super Anleitung umgesetzt habe, bekomme ich wenn ich die Subdomain aufrufe einen 404 Fehler. Woran könnte das liegen?
VG
Marvin
Hi,
ich versuch grad bitwarden auf “(Host(`meine-domain.de`) && PathPrefix(`/bitwarden`))” zum laufen zu bekommen aber es kommt nur:
404: Not Found
The requested resource could not be found.
Rocket
wenn ich auf https://meine-domain.de/bitwarden gehe
Mach ich was falsch? hab ich was vergessen?