Docker installieren#
System aktualisieren#
apt update && apt upgrade -y && apt install ca-certificates curl -yDocker-Paketquelle einrichten#
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian $(. /etc/os-release && echo "$VERSION_CODENAME") stable" > /etc/apt/sources.list.d/docker.listDocker und Docker Compose installieren#
apt update && apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -ySo funktioniert Traefik#
Traefik beobachtet Docker und liest die Labels deiner Container aus. Steht dort zum Beispiel, dass ein Container unter app.deine-domain.de erreichbar sein soll, richtet Traefik die Weiterleitung ein und holt das passende Zertifikat bei Let’s Encrypt. Alle Dienste, die Traefik erreichen soll, hängen dafür in einem gemeinsamen Docker-Netzwerk namens proxy.
Traefik einrichten#
Netzwerk und Ordner anlegen#
docker network create proxy
mkdir -p /opt/stacks/traefik/letsencrypt
touch /opt/stacks/traefik/letsencrypt/acme.json
chmod 600 /opt/stacks/traefik/letsencrypt/acme.jsonIn der Datei acme.json speichert Traefik deine Zertifikate. Mit den Rechten 600 darf nur root sie lesen, sonst verweigert Traefik den Start.
Passwort für das Dashboard erzeugen#
Das Dashboard von Traefik schützt du mit Benutzername und Passwort:
apt install apache2-utils -y
htpasswd -nbB admin 'dein-sicheres-passwort' | sed -e 's/\$/\$\$/g'Die Ausgabe sieht ungefähr so aus: admin:$$2y$$05$$.... Kopier sie, du brauchst sie gleich. Die doppelten Dollarzeichen sind Absicht, damit Docker Compose sie nicht als Variable versteht.
docker-compose.yml erstellen#
cd /opt/stacks/traefik && nano docker-compose.ymlFüge diesen Inhalt ein. Ersetze dabei deine E-Mail-Adresse, die Domain für das Dashboard und bei basicauth.users die Ausgabe aus dem vorherigen Schritt:
services:
traefik:
image: traefik:v3
container_name: traefik
restart: unless-stopped
command:
- --providers.docker=true
- --providers.docker.exposedbydefault=false
- --providers.docker.network=proxy
- --entrypoints.web.address=:80
- --entrypoints.web.http.redirections.entrypoint.to=websecure
- --entrypoints.web.http.redirections.entrypoint.scheme=https
- --entrypoints.websecure.address=:443
- --certificatesresolvers.letsencrypt.acme.email=du@deine-domain.de
- --certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json
- --certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web
- --api.dashboard=true
ports:
- 80:80
- 443:443
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./letsencrypt:/letsencrypt
networks:
- proxy
labels:
- traefik.enable=true
- traefik.http.routers.dashboard.rule=Host(`traefik.deine-domain.de`)
- traefik.http.routers.dashboard.entrypoints=websecure
- traefik.http.routers.dashboard.tls.certresolver=letsencrypt
- traefik.http.routers.dashboard.service=api@internal
- traefik.http.routers.dashboard.middlewares=dashboard-auth
- traefik.http.middlewares.dashboard-auth.basicauth.users=admin:$$2y$$05$$HIER-DEIN-HASH
networks:
proxy:
external: trueWas die wichtigsten Zeilen bedeuten:
- exposedbydefault=false: Traefik veröffentlicht nur Container, bei denen du es ausdrücklich mit
traefik.enable=trueerlaubst. - redirections: Alles, was über HTTP kommt, wird automatisch auf HTTPS umgeleitet.
- httpchallenge: Let’s Encrypt prüft über Port 80, dass dir die Domain gehört, und stellt dann das Zertifikat aus.
DNS-Einträge anlegen#
Leg bei deinem Domain-Anbieter für traefik.deine-domain.de und jeden weiteren Dienst einen A-Eintrag an, der auf die IP-Adresse deines Servers zeigt. Ohne diese Einträge kann Let’s Encrypt keine Zertifikate ausstellen.
Traefik starten#
docker compose up -dRuf danach https://traefik.deine-domain.de auf und melde dich mit deinem Benutzer und Passwort an. Im Dashboard siehst du alle Router, Dienste und Middlewares.
Einen Dienst hinter Traefik stellen#
Zum Testen eignet sich der kleine Dienst whoami, der einfach Infos über die Anfrage anzeigt. Leg dafür einen eigenen Stack an:
services:
whoami:
image: traefik/whoami
container_name: whoami
restart: unless-stopped
networks:
- proxy
labels:
- traefik.enable=true
- traefik.http.routers.whoami.rule=Host(`whoami.deine-domain.de`)
- traefik.http.routers.whoami.entrypoints=websecure
- traefik.http.routers.whoami.tls.certresolver=letsencrypt
- traefik.http.services.whoami.loadbalancer.server.port=80
networks:
proxy:
external: trueNach dem Start ist der Dienst unter https://whoami.deine-domain.de erreichbar, mit gültigem Zertifikat. Genauso gehst du bei jedem anderen Dienst vor: Container ins Netzwerk proxy hängen, die vier Labels mit Router-Namen, Domain und Port anpassen, fertig.
whoami, muss jeder Dienst einen eigenen eindeutigen Namen bekommen. Haben zwei Container denselben Namen, überschreiben sie sich gegenseitig.Fehlersuche#
Bekommt ein Dienst kein Zertifikat oder ist nicht erreichbar, schau in die Logs von Traefik:
docker logs traefik --tail 50Die häufigsten Ursachen sind ein fehlender DNS-Eintrag, ein geschlossener Port 80 in der Firewall oder ein Container, der nicht im Netzwerk proxy hängt.
Traefik aktualisieren#
cd /opt/stacks/traefik && docker compose pull && docker compose up -d
