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 die offizielle Bitwarden Anleitung für Docker.
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: bitwardenrs/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
- KeePass – Passwörter über eigene Cloud synchronisieren - 17. Februar 2021
- FRITZ!Box 6660 Cable mit Vodafone Cable nutzen - 16. Februar 2021
- Jitsi Docker – Lobby aktivieren - 16. Februar 2021
15 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 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.