Hallo zusammen,
Wie in diesem Thread zum Nginx Proxy Manager von ThorstenGehrig, hatte ich mir den Nginx Proxy Manager auch angesehen. Dabei gefiel mir nicht, dass ich damit nicht die Letsencrypt DNS-01 Challenge für Zertifikate nutzen kann. Irgendwann bin ich dann bei Traefik gelandet. Traefik bezieht Zertifikate vollautomatisch und man merkt davon gar nichts.
Ich versuche hier mal mein aktuelles Setup zu beschreiben.
Was geht bereits:
Voraussetzungen:
Auf einem LXT Container unter Proxmox habe ich einen Docker-Host eingerichtet.
Ich habe bei den YML Dateien versucht, die Einrückungen richtig zu erstellen, bitte bei Fehlern die Einrückungen kontrollieren.
Ich habe mir dann folgende Ordnerstruktur erstellt in dem ich meiner Daten ablege.
Dort werden nun folgende Dateien erstellt.
Datei /docker-host/traefik/traefik.yml
Datei /docker-host/traefik/docker-compose.yml
Mit folgenden Befehlen wird ein Benutzer mit Passwort erstellt.
Der wird dann für den Zugriff auf das Dashboard von Traefik genutzt.
Dabei bitte <USER> durch einen Benutzernamen und <PASSWORT> mit deinem Kennwort ersetzen.
Die Ausgabe des Befehls anstatt "admin:$$apr1$$FZuF2WCo$$56qZy0kLe91O3qxwWfG9I 0" in die Datei eintragen.
Als Beispiel ist Benutzer admin mit dem Kennwort geheim hinterlegt.
Datei /docker-host/traefik/data/acme.json erstellen Darin speichert Traefik die Zertifikate.
Datei /docker-host/traefik/secrets/servercow_username.secret erstellen
Darin wird der zu erstellende Benutzername für die DNS-API hinterlegt.
Datei /docker-host/traefik/secrets/servercow_password.secret erstellen
Darin wird das Passwort des Benutzers für die DNS-API hinterlegt.
Die Datei /docker-data/traefik/data/ca.crt enthält das Root Zertifikat meiner eigenen Root CA.
Diese habe ich mit EasyRSA3 erstellt. Bei Wunsch kann ich das auch einmal beschreiben. Sind nur wenige Befehle.
Wer das (noch) nicht hat, bitte die entsprechende Zeile unter volumes auskommentieren.
Dann bitte auch in der folgenden Datei die Zeilen mit options: "edomi-user-cert" auch auskommentieren.
Achtung nicht empfohlen!
Damit ist eure Edomi Installation nur mit dem normalen Passwort der Edomi Installation abgesichert,
Jetzt erstellen wir noch die Datei /docker-host/traefik/config.yml
Darin definieren wir unsere Weiterleitung auf unseren Edomi Server und eventuell andere Dienste wie zum Beispiel Alexa.
In den Ordner /docker-host/traefik wechseln und mit
das benötigte Netzwerk erstellen und Traefik starten.
Folgende DNS Konfiguration im Pihole vornehmen:
Auf dem Router wird eine Port-Weiterleitung von Port 80 und Port 443 auf die IP des Docker-Host LXT Containers eingerichtet.
Damit das automatisch aktualisiert wird, sollte ein DNS Update auf dem Router eingerichtet werden. Bei Servercow ist das hier sehr gut für die FritzBox beschrieben.
Der DNS für traefik-dashboard.my-domain.de sollte extern NICHT eingerichtet werden!
Wenn im Webbrowser https://traefik-dashboard.my-domain.de/dashboard eingeben wird, startet das Dashboard von Traefik, nach Eingabe von Benutzername (admin) und Passwort (geheim).
Unter der Adresse https://edomi.my-domain.de/admin sollte das Admin Interface des Edomi kommen.
Beides sollte mit einem gültigen Zertifikat starten. Wenn man sehr schnell ist, kann Traefik kurze Zeit benötigen um die Zertifikate zu erstellen. Dann kurz danach noch einmal versuchen (F5).
PS:
Durch dieses DNS-01 Challenge Verfahren sind bei mir fast alle Webseiten per gültigem Zertifikat erreichbar, teilweise auch extern.
Wie in diesem Thread zum Nginx Proxy Manager von ThorstenGehrig, hatte ich mir den Nginx Proxy Manager auch angesehen. Dabei gefiel mir nicht, dass ich damit nicht die Letsencrypt DNS-01 Challenge für Zertifikate nutzen kann. Irgendwann bin ich dann bei Traefik gelandet. Traefik bezieht Zertifikate vollautomatisch und man merkt davon gar nichts.
Ich versuche hier mal mein aktuelles Setup zu beschreiben.
Was geht bereits:
- Zugriff auf die Admin Oberfläche
- Abfrage eines Client Zertifikates
- Durchleiten des Alexa Zugriffs
- Automatische Aktualisierung der Letsencrypt Zertifikate
- Anfragen auf Port 80 werden automatisch auf Port 443 umgeleitet.
- Konfiguration des Websockes für die Visu
- Eventuell Anpassungen wie in Thorsten Gehrigs Thread das man nur noch den Port 443 benötigt.
Voraussetzungen:
- my-domian.de mit entsprechender eigener Domain ersetzen
- Durch Nutzung von Zertifikaten wird der Zugriff per DNS Namen notwendig. Ich habe bei mir ein Split-DNS konfiguriert.
Dafür nutze ich den PiHole als DNS-Server im lokalen Netz. Auf meinem Router (Lancom 1783) ist der PiHole als DNS Server für das lokale Netzwerk bei den DHCP Optionen eingestellt. Somit bekommt jeder Client per DHCP den PiHole als DNS zugewiesen. Auf dem PiHole wird jeder Server mit DNS-Namen unter Local DNS eingetragen (siehe Ergänzungen dazu ganz unten). - Der Lancom Router verteilt als lokale Domäne my-domain.de. Auf dem Lancom ist der DNS Server deaktiviert.
- Die Domain my-domain.de liegt extern bei meinem Hoster Servercow.de. Dort zahle ich 7€ im Jahr und er bietet mir dafür eine DNS-API die für die Letsencrypt DNS -01 Challenge notwendig ist.
- Ein Benutzer muss auf der Servercow Admin Seite eingerichtet werden, der nur Zugriff aus das DNS hat.
- Fall ein anderer DNS Anbieter gewählt wird, in der entsprechenden Doku von Lego nachsehen wie die entsprechenden Variablen aussehen müssen und entsprechend anpassen.
- Scipte wie acme.sh oder Lego unterstützen die Letsencrypt DNS-01 Challenge mit Vorlagen für Servercow.de. Auf den entsprechenden Seiten gibt es Listen welche alternativen Hoster mit DNS-API unterstützt werden.
- Bei mir läuft Edomi auf einem Fujitsu PC. Der ist also weder virtualisiert noch als Docker eingerichtet. Wenn alles so funktioniert wie ich möchte, kommt das aber noch.
Auf einem LXT Container unter Proxmox habe ich einen Docker-Host eingerichtet.
- Die Konfiguration von Docker erfolgte nach dieser Anleitung.
- Die Konfiguration von Docker-compose nach dieser Anleitung.
Ich habe bei den YML Dateien versucht, die Einrückungen richtig zu erstellen, bitte bei Fehlern die Einrückungen kontrollieren.
Ich habe mir dann folgende Ordnerstruktur erstellt in dem ich meiner Daten ablege.
Code:
mkdir /docker-host mkdir /docker-host/traefik mkdir /docker-host/traefik/data mkdir /docker-host/traefik/secrets
Datei /docker-host/traefik/traefik.yml
Code:
api: dashboard: true debug: true entryPoints: web: address: ":80" http: redirections: entrypoint: to: websecure scheme: https websecure: address: ":443" providers: docker: endpoint: "unix:///var/run/docker.sock" exposedByDefault: false file: filename: /config.yml watch: true certificatesResolvers: servercow: acme: email: certificates@my-domain.de storage: acme.json dnsChallenge: provider: servercow resolvers: - "9.9.9.9:53" - "149.112.112.112:53"
Code:
version: '3' secrets: servercow_username: file: "./secrets/servercow_username.secret" servercow_password: file: "./secrets/servercow_password.secret" services: traefik: image: traefik:latest container_name: traefik restart: unless-stopped security_opt: - no-new-privileges:true networks: - proxy ports: - 80:80 - 443:443 secrets: - "servercow_username" - "servercow_password" environment: - "SERVERCOW_USERNAME_FILE=/run/secrets/servercow_username" - "SERVERCOW_PASSWORD_FILE=/run/secrets/servercow_password" volumes: - /etc/localtime:/etc/localtime:ro - /var/run/docker.sock:/var/run/docker.sock:ro - /docker-data/traefik/data/traefik.yml:/traefik.yml:ro - /docker-data/traefik/data/acme.json:/acme.json - /docker-data/traefik/data/ca.crt:/ca.crt - /docker-data/traefik/config.yml:/config.yml:ro labels: - "traefik.enable=true" - "traefik.http.middlewares.traefik-auth.basicauth.users=admin:$$apr1$$FZuF2WCo$$56qZy0kLe91O3qxwWfG9I0" - "traefik.http.middlewares.sslheader.headers.custom requestheaders.X-Forwarded-Proto=https" - "traefik.http.routers.traefik-secure.entrypoints=websecure" - "traefik.http.routers.traefik-secure.rule=Host(`traefik-dashboard.my-domain.de`)" - "traefik.http.routers.traefik-secure.middlewares=traefik-auth" - "traefik.http.routers.traefik-secure.tls=true" - "traefik.http.routers.traefik-secure.tls.certresolver=servercow" - "traefik.http.routers.traefik-secure.service=api@internal" networks: proxy: external: true
Der wird dann für den Zugriff auf das Dashboard von Traefik genutzt.
Dabei bitte <USER> durch einen Benutzernamen und <PASSWORT> mit deinem Kennwort ersetzen.
Die Ausgabe des Befehls anstatt "admin:$$apr1$$FZuF2WCo$$56qZy0kLe91O3qxwWfG9I 0" in die Datei eintragen.
Als Beispiel ist Benutzer admin mit dem Kennwort geheim hinterlegt.
Code:
sudo apt install apache2-utils echo $(htpasswd -nb <USER> <PASSWORD>) | sed -e s/\\$/\\$\\$/g
Datei /docker-host/traefik/data/acme.json erstellen Darin speichert Traefik die Zertifikate.
Code:
touch /docker-host/traefik/data/acme.json chmod 600 /docker-host/traefik/data/acme.json
Darin wird der zu erstellende Benutzername für die DNS-API hinterlegt.
Code:
nano /docker-host/traefik/secrets/servercow_username.secret
Darin wird das Passwort des Benutzers für die DNS-API hinterlegt.
Code:
nano /docker-host/traefik/secrets/servercow_password.secret
Diese habe ich mit EasyRSA3 erstellt. Bei Wunsch kann ich das auch einmal beschreiben. Sind nur wenige Befehle.
Wer das (noch) nicht hat, bitte die entsprechende Zeile unter volumes auskommentieren.
Dann bitte auch in der folgenden Datei die Zeilen mit options: "edomi-user-cert" auch auskommentieren.
Achtung nicht empfohlen!
Damit ist eure Edomi Installation nur mit dem normalen Passwort der Edomi Installation abgesichert,
Jetzt erstellen wir noch die Datei /docker-host/traefik/config.yml
Darin definieren wir unsere Weiterleitung auf unseren Edomi Server und eventuell andere Dienste wie zum Beispiel Alexa.
Code:
http: #region routers routers: edomi-rtr: entryPoints: - "websecure" rule: "Host(`edomi.my-domain.de`)* middlewares: - default-headers tls: certResolver: servercow domains: - main: "edomi.my-domain.de" options: "edomi-user-cert" service: edomi-sevi edomi-ws: entrypoints: - "edomiws" rule: "Host(`edomi.my-domain.de`) && PathPrefix(`/visu/`)" middlewares: - edomi-websocket tls: certResolver: servercow domains: - main: "edomi.my-domain.de" options: "edomi-user-cert" service: edomi-visu-sevi alexa-rtr: entryPoints: - "websecure" rule: "Host(`alexa.my-domain.de`)" middlewares: - default-headers - alexa-redirect tls: certResolver: servercow domains: - main: "alexa.my-domain.de" service: alexa-sevi #endregion routers #region services services: edomi-sevi: loadBalancer: servers: - url: "http://192.168.0.11" passHostHeader: true edomi-visu-sevi: loadBalancer: servers: - url: "http://192.168.0.11:8080" passHostHeader: true alexa-sevi: loadBalancer: servers: - url: "http://192.168.0.11" passHostHeader: true #endregion #region middleware middlewares: default-headers: headers: frameDeny: true sslRedirect: true browserXssFilter: true contentTypeNosniff: true forceSTSHeader: true stsPreload: true stsSeconds: 15552000 customFrameOptionsValue: SAMEORIGIN customRequestHeaders: X-Forwarded-Proto: http edomi-websocket: headers: customRequestHeaders: X-Forwarded-Proto: ws X-Forwarded-Port: 8080 alexa-redirect: replacePathRegex: regex: "^/edomi/(.*)" replacement: "/admin/lbs/alexa/$1" #endregion #region TLS Options tls: options: edomi-user-cert: clientAuth: caFiles: - /ca.crt clientAuthType: RequireAndVerifyClientCert default: minVersion: VersionTLS12 cipherSuites: - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 - TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 - TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 #endregion
In den Ordner /docker-host/traefik wechseln und mit
Code:
docker network create proxy docker-compose up -d
Folgende DNS Konfiguration im Pihole vornehmen:
- docker-host.my.domain.de zeigt als DNS Record auf die IP des Docker LXT Containers
- traefik-dashboard.my-domain.de zeigt als CNAME Record auf docker-host.my.domain.de
- edomi.my-domain.de zeigt als CNAME Record auf docker-host.my.domain.de
- edomi.my-domain.de
- alexa.my-domain.de
Auf dem Router wird eine Port-Weiterleitung von Port 80 und Port 443 auf die IP des Docker-Host LXT Containers eingerichtet.
Damit das automatisch aktualisiert wird, sollte ein DNS Update auf dem Router eingerichtet werden. Bei Servercow ist das hier sehr gut für die FritzBox beschrieben.
Der DNS für traefik-dashboard.my-domain.de sollte extern NICHT eingerichtet werden!
Wenn im Webbrowser https://traefik-dashboard.my-domain.de/dashboard eingeben wird, startet das Dashboard von Traefik, nach Eingabe von Benutzername (admin) und Passwort (geheim).
Unter der Adresse https://edomi.my-domain.de/admin sollte das Admin Interface des Edomi kommen.
Beides sollte mit einem gültigen Zertifikat starten. Wenn man sehr schnell ist, kann Traefik kurze Zeit benötigen um die Zertifikate zu erstellen. Dann kurz danach noch einmal versuchen (F5).
PS:
Durch dieses DNS-01 Challenge Verfahren sind bei mir fast alle Webseiten per gültigem Zertifikat erreichbar, teilweise auch extern.
- Der Lancom Router (acme.sh Skript)
- Das Webinterface des Proxmox Servers. Das lies sich direkt auf dem Proxmox einrichten.
- Das Webinterface meines TrueNAS Servers (acme.sh Skript)
- Der Zugriff auf meinen Unifi Controller als Docker, da der über Traefik auch noch eine Portumleitung macht muss kein extra Port 8443 freigegeben werden.
- Geofens .(über Traefik)
- Plex Server (acme.sh Skript)
- Mosquitto Server mit Letsencrypt Zertifikat.(über Traefik)
Kommentar