24.01.2025: Pi-Hole als Docker-Container hinzufügen
Pi-Hole ist eine Werbeblocker und kann als Container der Umgebung hinzugefügt werden. Hier zu müssen nur die beiden Dateien .env und docker-compose.yml ergänzt werden.
Die Pi-Hole-Weboberfläche ist dann unter https://IP-RASPI:8100'/admin erreichbar.
Webseite des Pi-Hole-Projekts: https://pi-hole.net/
In der Datei .env am Ende hinzufügen:
# Service pihole
SERVICES_PIHOLE_CONTAINER_NAME=pihole_IHRE_DOMAAIN_DE
SERVICES_PIHOLE_IMAGE=pihole/pihole
SERVICES_PIHOLE_IMAGE_VERSION=latest
SERVICES_PIHOLE_HOSTNAME=pihole_l_IHRE_DOMAAIN_DE
SERVICES_PIHOLE_DOMAIN="`pihole._IHRE.DOMAAIN.DE"
SERVICES_PIHOLE_NETWORKS_LAN_IPV4='IP-ADRESSE-IHRES-PI-IM-LAN'
In der Datei docker-compose.yml im Abschnitt services: einfügen:
pihole:
hostname: ${SERVICES_PIHOLE_HOSTNAME}
image:${SERVICES_PIHOLE_IMAGE}:${SERVICES_PIHOLE_IMAGE_VERSION}
container_name: ${SERVICES_PIHOLE_CONTAINER_NAME}
ports:
- "53:53/tcp"
- "53:53/udp"
- "8100:80/tcp"
environment:
- WEBPASSWORD:'HIER_IHR_PASSWORT_EINTRAGEN'
- DNS1:"8.8.8.8"
-DNS2:"8.8.4.4"
# IP-Adress für Pihole im LAN
- SERVER-IP:${SERVICES_PIHOLE_NETWORKS_LAN_IPV4}
- FTLCONF_REPLY_ADDR4:${SERVICES_PIHOLE_NETWORKS_LAN_IPV4}
labels:
traefik.enable: "true"
traefik.docker.network: $NETWORKS_CROWDSEC_NAME
traefik.http.routers.pihole.entrypoints: websecure
traefik.http.routers.pihole.rule: "HOST($SERVICES_PIHOLE_DOMAIN) "
traefik.http.routers.pihole.tls.certresolver: http_resolver
traefik.http.routers.pihole.tls: "true"
volumes:
- /etc/localtime:/etc/localtime:ro
- './pihole/etc-pihole:/etc/pihole'
- './pihole/etc-dnsmasq.d:/etc/dnsmasq.d'
restart: unless-stopped
networks:
crowdsec:
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)
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.env | Leere Datei, wird für die Erzeugung des Containers benötigt. | |
/srv/web/crowdsec/config/acquis.yaml | Definiton 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 .