Menü

06.02.2024: Mit Docker einen Webserver mit vorgeschalteten Proxy und automatisierten HTTPS-Zertifikaten von Letsencrypt aufsetzen

Auf der Seite  https://goneuland.de/traefik-v2-3-reverse-proxy-mit-crowdsec-im-stack-einrichten bin ich auf eine Anleitung zum Thema Letsencrypt-Zertifikate für einen eigenen Webserver unter Ubuntu gekommen.

Hierzu wurde Traefik als Docker-Container verwendet.

Informationen zu Traefik sind auf der offiziellen Projektseite https://traefik.io/traefik zu finden.

Hier nun die Beschreibung meiner Vorgehensweise auf einem Raspberry Pi 4:

Voraussetzungen

Domain die beim Aufruf auf unseren Proxy weiterleitet

Wir benötigen eine Domain, die auf unseren Router per DynDNS weitergeleitet wird. Ich habe hierzu auf den kostenlosen Dienst von IPv64.net zugegriffen und mir auf der Seite https://ipv64.net/account.php die Domäne demo.ipv64.net  angelegt.

Wie man den Router DNS-fähig bekommt, erhält man auf der Seite https://ipv64.net/dyndns_helper gleich zur soeben erstellten Domain angezeigt.

Rechner auf dem ein Linux als Betriebssystem läuft

Ich habe hierzu einen Rasperry Pi 4 verwendet. Das passende Betriebssystem kann auf der Seite https://www.raspberrypi.com/software/operating-systems/ heruntergeladen werden. Bitte beachten, daß derzeit von Docker nur die 32-Bit-Variante unterstützt wird. Es genügt, die OS-Light-Version. Da ich mich manchmal auch direkt an meinem Raspi 4 anmelde um ihn als PC-Ersatz zu verwenden, läuft bei mir die Destop-Variante.

Dockerinstallation auf dem Raspberry

Zur Installation von Docker habe ich die Anleitung auf der Seite  
https://docs.docker.com/engine/install/raspberry-pi-os/#install-using-the-repository verwendet und in der Kommandozeile folgende, in der Datei docker_install.txt zusammengefassten, Befehle ausgeführt.


Das für Version 1 benötige docker-compose habe ich weggelassen, da es veraltet ist. Sie können es mit folgendem Befehl installieren:
sudo apt-get install docker-compose-plugin

jetzt den aktuellen Benutzer der Gruppe docker hinzufügen
sudo usermod -aG docker $USER

falls die Gruppe docker noch fehlt kann Sie mit
sudo groupadd docker
angelegt werden.

Damit die Zuordnung der Gruppe wirkt, einmal ab- und wieder anmelden oder einen reboot durchführen.

Danach kann durch die Eingabe von docker version die Informationen zur aktuellen Dockerinstallation angezeigt werden.

den Befehl "tree" einrichten

Um den Verzeichnisbaum in der SSH-Konsole anzeigen zu können, habe ich mit sudo apt-get install tree noch den Befehl tree eingerichtet. Dieser Befehl ist für die Funktion des Traefik-Containers nicht notwendig.

Anlegen der Verzeichnisstruktur

Ich möchte die Installation auf dem Raspi in das Verzeichnis /srv/web legen.

Nun melden wir uns mittels ssh auf dem Raspberry Pi an und führen folgende Befehle auf der Eingabezeile durch:

(die mit dem #-Zeichen markierten Zeilen stellen nur Kommentare dar und müssen nicht in der Konsole eingegeben werden !)

# Hauptverzeichnis erstellen und zusätzliche Unterordner in 'crowdsec' erstellen

sudo mkdir /srv

sudo chown pi:root /srv


mkdir -p /srv/web/{traefik,html/demo,var/log,php,crowdsec/{config,data},config}

# .env Datei im Hauptverzeichnis erstellen
touch /srv/web/.env

# Umgebungsspezifische .env Dateien in 'config' erstellen
touch /srv/web/config/{crowdsec.env,traefik.env,traefik-crowdsec-bouncer.env}


# Zusätzliche Dateien in 'traefik' erstellen und Zugriffsrechte für bestimmte Dateien festlegen
touch /srv/web/traefik/{acme_letsencrypt.json,traefik.yml,dynamic_conf.yml,tls_letsencrypt.json}

#Zugriffsrechte aus json-Datei passend setzen, damit die Letsencrypt-Zertifikate erstellt werden
sudo chmod 600 /srv/web/traefik/{acme_letsencrypt.json,tls_letsencrypt.json}

#Verzeichnisstruktur anzeigen lassen und prüfen
tree -L 2 -a /srv/web/

Das Ergebnis sollte so aussehen:

(durch Klick auf das Bild können Sie sich eine Vergrößerung anzeigen lassen)

Datei mit cmd-Befehlen anzeigen

Minimalversion zur Erzeugung von Zertifikaten

Um Traefik als Reversproxy einzurichten genügt für eine Minimalversion eine docker-compose.yaml mit folgendem Inhalt.

Die Angabe zur Domain und E-Mail-Adresse sowie die Zugangsdaten bitte auf Ihre Verhältnisse anpassen.

Nach dem Start mittels docker compose up dauert es ein paar Minuten, bis im Unterverzeichnis letsecrypt die json-Datei gefüllt wird.

Nun kann im Browser durch Aufruf der angegeben Domain das Traefik-Dashboard aufgerufen werden und die Übertragung wird mittels HTTPS-Verschlüsselung gesichert.

Nun kommen wir aber zur etwas ausführlicheren Variannte:

Anlegen der Konfigurationsdateien

Es werden folgende Konfigurationsdateien benötigt:


Dateiname Beschreibung Link zur Anzeige des Inhaltes
/srv/web/.env
Variablen zur Verwendung in der docker-compose.yaml Inhalt von .env anzeigen
/srv/web/docker-compose.yaml Definition der Dienste, Netzwerke und Verzeichnisse Inhalt von docker-compose.yaml anzeigen
/srv/web/config/crowdsec.env Konfiguration des Containers crowdsec Inhalt von crowdsec.env anzeigen
/srv/web/config/traefik-crowdsec-bouncer.env
Konfiguration des Containers crowdsec-bouncer Inhalt von traefik-crowedsec-bouncer.env anzeigen
/srv/web/config/traefik.envLeere Datei, wird für die Erzeugung des Containers benötigt.
/srv/web/crowdsec/config/acquis.yamlDefiniton der Logdateien, deren Ereignisse mit Crowdsec ausgewertet werden.Inhalt von acquis.yaml anzeigen
/srv/web/traefik/traefik.yml
Fixe Einstellungen für den Betrieb von Traefik Inhalt von traefik.yml anzeigen
Bitte an zwei Stellen die E-Mail-Adresse Testmail@gmx.de durch Ihre E-Mail-Adresse ersetzen. Diese wird von Letsencrypt verwendet, um notfalls wichtige Informationen an den Zertifikatsinahber zu senden.
/srv/web/traefik/dynamic_conf.yml Dynamische Einstellungen für den Betrieb von Traefik
(diese werden im laufenden Betrieb regelmäßig neu eingelesen)
Inhalt von dynamic_conf.yaml anzeigen
/srv/web/html/demo/index.php
Index-Datei für Test-Webseite
Inhalt von index.php anzeigen
/srv/web/html/demo/favicon.ico
Icon für Test-Webseite
Icons können kostenlos auf der Seite
https://www.ionos.de/tools/favicon-generator 
erstellt werden
Anzeige favicon
/srv/web/php/dockerfile_php7
Definition zur Erzeugung eine Containers mit Apache und PHP 7 Inhalt von dockerfile_php7 anzeigen
/srv/web/php/dockerfile_php8 Definition zur Erzeugung eine Containers mit Apache und PHP8
Inhalt von dockerfile_pjp8 anzeigen

Nun zeigt unser Verzeichnis folgenden Umfang:

(durch Klick auf das Bild können Sie sich eine Vergrößerung anzeigen lassen)

Nun setzen wir sicherheitshalber nochmal die Dateieigenschaften in unserem Verzeichnis auf den User pi und die Gruppe root:

sudo chown pi:root /srv/web -R

Container erzeugen

Wir gehen also in unser Verzeichnis:
cd /srv/web

und testen unsere docker-compose-Datei auf Fehler:
docker compose config

Wenn uns in diesem Schritt keine Fehlermeldungen angezeigt werden, können wir  den Bau unserer Container starten mit:
docker compose up -d

Nun werden die Container erzeugt und im Hintergrund gestartet. Beim ersten Aufruf dauert der Vorgang etwas länger, da die Images vom Docker-Hub heruntergeladen und daraus die Container gebaut werden. Die Ergebnisse der dabei angewandten Zwischenschritte werden von Docker lokal gespeichert und müssen erst nach Änderungen an den Images oder den dockkerfiles neu gebaut werden.

Wenn der Vorgang erfolgreich war, werden die Container mit "gestarted" oder "healthy" markiert. Die gerade aktiven Container können Sie sich mit docker ps anzeigen lassen.

Wir müssen aber erst noch diverse Einstellungen vornehmen und deshalb die Container nochmal beenden:
docker compose down

API-Key für Crowdsec-bouncer erzeugen

Als nächstes den crowdsec-Container im Hintergrund starten lassen

docker compose up crowdsec -d

 und den API-Key erzeugen:

docker compose exec -t crowdsec cscli bouncers add traefik-crowdsec-bouncer

danach den Crowdsec-Container wieder herunterfahren:
docker compose down

Es erscheint eine Anzeige mit dem generierten API-Key:
(Durch Klick auf das Bild kann das vergrößerte Bild angezeigt werden.)

Damit der User pi die soeben erzeugten config-Dateien bearbeiten kann, setzen wir die Zugriffsrechte erneut mit folgendem Befehl:
sudo chown pi:root /srv/web/ -R

Nun kann der API-KEY in die Datei /srv/web/config/traefik-crowdsec-bouncer.env in der ersten Zeile bei CROWDSEC_BOUNCER_API_KEY eingetragen werden.

Hier können Sie gleich noch mit Umstellung der Logging-Funktion des crowdsec-containers festelegen.
Ich habe hierzu die Datei /srv/web/crowdsec/config/config.yaml geöffnet und den Eintrag log_media im Abschnitt common 
von stdout auf file geändert.

Gleichzeitig aktualisieren wir die Datei automatisch erstellte Datei /srv/crowdsec/config/acquis.yaml mit den aktuell gewünschten Log-Dateien, die überwacht werden sollen.
(siehe Link oben in der Tabelle)


Letsencrypt-Zertifkat für den Traefik-Server erzeugen

Nun erzeugen wir ein durch Letsencrypt erzeugtes Zertifikat für unseren Server.

Hierzu muss der Aufruf unserer Domain auf unserem Raspi weitergeiletet werden. Dies haben wir ja weiter oben durch die Einrichtung der Verbindung zu IP64.net auf unserem Router erledigt. Weiterhin haben wir zur Speicherung der LetsEncrypt-Daten die beiden json-Datein zur Verfügung gestellt und mit der Zugriffstufe 0600 versehen.

Zuvor müssen Sie in der Datei /srv/web/traefik/traefik.yaml in den zwei Resolvern jeweils im Abschnitt acme die Angaben der E-Mail-Adresse auf eine gültige E-Mail-Adresse ändern. 

Starten Sie die Container im Hintergund mit dem Kommando:
docker compose up -d

Nach einer kurzen Zeitspanne von wenigen Minuten sollten alle Container als "Healthy" oder "gestartet" erscheinen. Die können Sie auch mit dem Befehl docker ps kontrollieren.

Im Fehlerfall stoppen Sie durch Eingabe von docker compose down alle Container. Ob der Bezug des Zertifikates funkionierte, können Sie z. B. in der Datei /srv/web/var/log/traefik/traefik.log erkennen. Bei Erfolg finden Sie Angaben zum Zertifikat in der Datei /srv/web/traefik/acme_letsencrypt.json .