Skip to content

Instantly share code, notes, and snippets.

@lvnilesh
Forked from viertelwissen/README.md
Created November 6, 2022 23:49
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save lvnilesh/23f8d347b68c1c4986b4348357a159f3 to your computer and use it in GitHub Desktop.
Save lvnilesh/23f8d347b68c1c4986b4348357a159f3 to your computer and use it in GitHub Desktop.
Traefik Reverse Proxy mit DNS-Challenge und Bitwarden (vaultwarden)

Traefik mit Bitwarden

Beispieldateien für Traefik als Reverse-Proxy und Bitwarden als zu nutzender Dienst. Traefik nutzt die DNS-Challenge, um ein Wildcard-Zertifikat zu beantragen und um keinen Port im Heimnetzwerk nach außen öffnen zu müssen. In diesem Beispiel wird davon ausgegangen, dass Netcup als DNS-Provider genutzt wird.

Einträge mit sub.domain.tld müssen mit der eigenen Domain ersetzt werden. Alle Keys und Logins müssen ebenfalls mit den eigenen Daten ersetzt werden.

Anderer DNS-Provider als Netcup

Traefik unterstützt viele weitere Anbieter für die DNS-Challenge. Eine Liste gibt es in der Dokumentation: https://doc.traefik.io/traefik/https/acme/#dnschallenge Wird ein anderer Provider eingesetzt, müssen in der docker-compose.yml von Traefik die Variablen, die mit "NETCUP_" beginnen, entfernt und stattdessen die Variablen für den jeweiligen Provider (siehe Traefik Doku) eingesetzt werden.

Aufbau der Ordnerstruktur

├── /home/USERNAME/docker/
│   ├── traefik
│   │   ├── docker-compose.yml
│   │   ├── config/
│   │   │   ├── traefik.yml
│   │   │   ├── dynamic/
│   │   │   │   ├── simpleAuth_middleware.yml
│   ├── bitwarden/
│   │   ├── docker-compose.yml

Reihenfolge

  1. Konfigs für Traefik anlegen
  2. Traefik: docker-compose.yml erstellen und Container starten (docker compose up -d)
  3. Es dauert bis zu 15 Minuten, bis das Wildcard Zertifikat beantragt wurde, dies abwarten.
  4. Prüfen, ob die Traefik Weboberfläche funktioniert (unter der Domain, die bei Traefik angegeben wurde). Wenn ok:
  5. Bitwarden: docker-compose.yml erstellen und Container starten (docker compose up -d)

Benutzername/Passwort erstellen

In der Datei simpleAuth_middleware.yml müssen ein Benutzername und ein Passwort hinterlegt werden, mit denen man sich an der Traefik Weboberfläche anmelden möchte. Diese werden nicht im Klartext hinterlegt, sondern über folgenden Befehl erzeugt (den Wert "benutzername" mit dem gewünschten Wert ersetzen):

echo $(htpasswd -nB benutzername)
New password: 
Re-type new password: 
benutzername:$2y$05$Wz.GxsiC37w/CBVKTOpBjO8mdHND1G0duWj6l8f5G5S5u1oh94OKi

Nach Ausführung des ersten Befehls werdet ihr zur Eingabe eines gewünschten Passworts aufgefordert und am Ende wird eine Zeichenkette ausgegeben, die in der Datei "simpleAuth_middleware.yml" eingesetzt werden muss.

version: '3'
services:
bitwarden:
container_name: bitwarden
hostname: bitwarden
image: vaultwarden/server:latest
restart: always
volumes:
- bitwarden-data:/data
- /etc/localtime:/etc/localtime:ro
- /var/log/vaultwarden:/var/log/vaultwarden
networks:
- mariadb
- traefik
environment:
# Lange zufällige Zeichenkette für den Zugriff auf das Adminpanel
# Kann mit folgendem Befehl erzeugt werden: openssl rand -base64 48
ADMIN_TOKEN: VERY_SECRET_AND_VERY_LONG_SECURITY_KEY_FOR_ADMIN_PANEL
RUST_BACKTRACE: 1
LOG_FILE: /var/log/vaultwarden/vaultwarden.log
WEBSOCKET_ENABLED: "true"
DOMAIN: https://sub.domain.tld
DOMAIN_ORIGIN: https://sub.domain.tld
labels:
# Watchtower
com.centurylinklabs.watchtower.enable: true
# Traefik
traefik.enable: true
# Web-UI
traefik.http.routers.bitwarden.entrypoints: websecure
traefik.http.routers.bitwarden.rule: Host(`sub.domain.tld`)
traefik.http.routers.bitwarden.service: bitwarden-service
traefik.http.services.bitwarden-service.loadbalancer.server.port: 80
traefik.http.routers.bitwarden.tls: true
# Websocket
traefik.http.routers.bitwarden-ws.entrypoints: websecure
traefik.http.routers.bitwarden-ws.rule: Host(`sub.domain.tld`) && Path(`/notifications/hub`)
traefik.http.routers.bitwarden-ws.service: bitwarden-ws-service
traefik.http.services.bitwarden-ws-service.loadbalancer.server.port: 3012
traefik.http.routers.bitwarden-ws.tls: true
networks:
traefik:
external: true
volumes:
bitwarden-data:
name: bitwarden-data
http:
middlewares:
simpleAuth:
basicAuth:
users:
- "benutzername:$2y$05$Wz.GxsiC37w/CBVKTOpBjO8mdHND1G0duWj6l8f5G5S5u1oh94OKi"
# siehe README, wie man diese Zeichenkette erzeugt
# Traefik static config
global:
checkNewVersion: true
sendAnonymousUsage: false
entrypoints:
web:
address: ":80"
http:
redirections:
entryPoint:
to: websecure
scheme: https
permanent: true
websecure:
address: ":443"
api:
dashboard: true
log:
level: INFO
certificatesResolvers:
netcupdns:
acme:
email: email@email.de
storage: "/acme/acme.json"
dnsChallenge:
provider: netcup
delayBeforeCheck: 900
providers:
docker:
watch: true
network: traefik
exposedByDefault: false
file:
directory: "./dynamic"
watch: true
version: "3"
services:
traefik:
container_name: traefik
hostname: traefik
image: traefik:latest
restart: always
security_opt:
- no-new-privileges:true
ports:
- 80:80/tcp
- 443:443/tcp
environment:
TZ: Europe/Berlin
NETCUP_CUSTOMER_NUMBER: "123456"
NETCUP_API_KEY: "sEcreT-aPI-keY"
NETCUP_API_PASSWORD: "VEry_sEcRet_API_PaSswOrD"
volumes:
- traefik-acme:/acme
- ./config/traefik.yml:/traefik.yml
- ./config/dynamic:/dynamic
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
networks:
- traefik
labels:
# Watchtower
com.centurylinklabs.watchtower.enable: true
# Traefik
traefik.enable: true
traefik.http.routers.traefik.entrypoints: websecure
traefik.http.routers.traefik.rule: Host(`sub.domain.tld`)
traefik.http.routers.traefik.tls: true
traefik.http.routers.traefik.tls.certresolver: netcupdns
traefik.http.routers.traefik.service: api@internal
traefik.http.routers.traefik.middlewares: simpleAuth@file
traefik.http.routers.traefik.tls.domains[0].main: "domain.tld"
traefik.http.routers.traefik.tls.domains[0].sans: "*.domain.tld"
networks:
traefik:
name: traefik
volumes:
traefik-acme:
name: traefik-acme
@BolsPipa
Copy link

BolsPipa commented Aug 25, 2023

wie bindet man externe Dienste an z.B Nextcloud ?

@lvnilesh
Copy link
Author

English please. Thank you

@lvnilesh
Copy link
Author

Use traefik proxy to manage the ingress.
Use haproxy in pfsense to manage the ingress
There are many other ways

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment