Traefik
Traefik ist ein kostenloser, Open-Source-Proxy-Manager. Er wird über labels konfiguriert.
Das Projekt ist sehr gut in die Verwendung mit Docker Containern integriert.
Vorbereitung
Docker Netzwerk
Zunächst sollte ein Docker Netzwerk erstellt werden. Dadurch ist es dann nicht mehr nötig, Ports für jeden einzelnen Dienst freizugeben. Ausreichend sind dann die Ports 80 und 443 für den Proxy Manager sowie ggf. in bestimmten Fällen auch andere.
caution
Auf einigen Geräten (insbesondere auf fertigen NAS Geräten) ist es nicht möglich, den Port 80 und 443 freizugeben, weil diese Ports bereits von einem anderen Dienst genutzt werden. An dieser Stelle kann dann zunächst ein Macvlan Netzwerk erstellt werden, auf welchem widerrum die Ports 80 und 443 freigegeben werden können.
sudo docker network create proxy-network
Verzeichnis anlegen
mkdir traefik
cd traefik
touch traefik.log
mkdir shared
mkdir acme
touch acme/acme.json
chmod 600 acme/acme.json
mkdir rules
touch rules/middlewares.toml
touch .env docker-compose.yml
info
Befindet man sich nicht im Home Verzeichnis, müssen die Befehle eventuell um sudo
ergänzt werden.
Umgebungsvariablen
Es werden einige Umgebungsvariablen benötigt, um den Proxy Manager zu konfigurieren. Für eine DNS-Challenge wird eine Domain von einem unterstützten Anbieter benötigt.
Ein Beispiel ist Netcup, mit .de-Domains, die 5 EUR pro Jahr kosten. (Affiliate-Link)
In diesem Fall braucht man die Domain, seine Kundennummer, den API-Key sowie das API-Password.
Diese werden zusammen mit einer E-Mail-Adresse in die .env eingetragen.
DOMAINNAME=domain.de
NETCUP_CUSTOMER_NUMBER=50000
NETCUP_API_KEY=LDBfH4MNyDlgBgww0lGry0OkouhkMqUI5E
NETCUP_API_PASSWORD=uEzCAzISBUBwGqW9oSEzRJuL3D26Gm1yQFMlnqSB1Lhjjb5Z98
EMAIL_ADDRESS=mail@hallo.de
Installation
Authentifizierung
Für die Authentizifiertung wird eine Benutzername / Passwort Kombination benötigt.
sudo apt install apache2-utils
htpasswd -nb benutzername passwort > /shared/.htpasswd
info
Benutzername und Passwort sollten natürlich angepasst werden.
Anschließend muss die Middleware angepasst werden:
[http.middlewares]
[http.middlewares.middlewares-basic-auth]
[http.middlewares.middlewares-basic-auth.basicAuth]
realm = "Traefik Basic Auth"
usersFile = "/shared/.htpasswd"
Docker Compose
Die Installation erfolgt über Docker Compose.
version: "3.7"
### NETWORKS ###
networks:
proxy-network:
external:
name: proxy-network
### SERVICES ###
services:
traefik:
container_name: traefik
image: traefik:latest
restart: unless-stopped
command:
- --global.checkNewVersion=true
- --global.sendAnonymousUsage=false
- --entryPoints.http.address=:80
- --entryPoints.https.address=:443
- --entryPoints.traefik.address=:8080
- --api=true
- --api.dashboard=true
- --log=true
- --log.level=WARN
- --accessLog=true
- --accessLog.filepath=/traefik.log
- --accessLog.bufferingSize=100
- --accessLog.filters.statusCodes=400-499
- --providers.docker=true
- --providers.docker.endpoint=unix:///var/run/docker.sock
- --providers.docker.exposedByDefault=false
- --providers.docker.network=web
- --providers.docker.swarmMode=false
- --providers.file.directory=/rules
- --providers.file.watch=true
- --certificatesResolvers.dns-netcup.acme.dnsChallenge.provider=netcup
# - --certificatesResolvers.dns-netcup.acme.caServer=https://acme-staging-v02.api.letsencrypt.org/directory
- --certificatesResolvers.dns-netcup.acme.email=$EMAIL_ADDRESS
- --certificatesResolvers.dns-netcup.acme.storage=/acme.json
- --certificatesResolvers.dns-netcup.acme.dnsChallenge.resolvers=1.1.1.1:53,8.8.8.8:53
- --certificatesResolvers.dns-netcup.acme.dnschallenge.delayBeforeCheck=300
networks:
- proxy-network
security_opt:
- no-new-privileges:true
ports:
- target: 80
published: 80
protocol: tcp
mode: host
- target: 443
published: 443
protocol: tcp
mode: host
- target: 8080
published: 8080
protocol: tcp
mode: host
volumes:
- ./rules:/rules
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./acme/acme.json:/acme.json
- ./traefik.log:/traefik.log
- ./shared:/shared
environment:
- NETCUP_CUSTOMER_NUMBER=$NETCUP_CUSTOMER_NUMBER
- NETCUP_API_KEY=$NETCUP_API_KEY
- NETCUP_API_PASSWORD=$NETCUP_API_PASSWORD
labels:
- "traefik.enable=true"
- "traefik.http.routers.http-catchall.entrypoints=http"
- "traefik.http.routers.http-catchall.rule=HostRegexp(`{host:.+}`)"
- "traefik.http.routers.http-catchall.middlewares=redirect-to-https"
- "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
- "traefik.http.routers.traefik-rtr.entrypoints=https"
- "traefik.http.routers.traefik-rtr.rule=Host(`traefik.$DOMAINNAME`)"
- "traefik.http.routers.traefik-rtr.tls=true"
- "traefik.http.routers.traefik-rtr.tls.certresolver=dns-netcup"
- "traefik.http.routers.traefik-rtr.tls.domains[0].main=$DOMAINNAME"
- "traefik.http.routers.traefik-rtr.tls.domains[0].sans=*.$DOMAINNAME"
- "traefik.http.routers.traefik-rtr.service=api@internal"
- "traefik.http.routers.traefik-rtr.middlewares=middlewares-basic-auth@file"
info
Nutzt man einen anderen Provider, muss man die entsprechenden Zeilen anpassen.
info
Befindet man sich im Netzwerk mit einem Router, der vorgeschaltet ist, muss die Portfreigabe von Port 80 und 443 an den Server erfolgen.
sudo docker compose up -d
info
Bei Docker Compose Version 1 lautet der Befehl sudo docker-compose up -d
Es kann einige Minuten dauern, bis traefik geladen ist. Insbesondere die DNS-Challenge kann viel Zeit beanspruchen. Anschließend sollte unter traefik.domain.de
das Dashboard erreichbar sein.
tip
Sollte das nicht geklappt haben, kann der Container gestoppt werden und nochmal mit log.level=DEBUG
gestartet werden. Im Log sollte dann stehen, wieso es nicht funktioniert.
Andere Anwendung
Eine andere Anwendung kann über labels mit traefik verbunden werden.
mkdir homepage
cd homepage
mkdir html
touch html/index.html
touch docker-compose.yml
<!DOCTYPE html>
<html>
<head>
<title>Homepage</title>
</head>
<body>
<h1>Homepage</h1>
<p>Dies ist die Homepage.</p>
</body>
</html>
version: "3.7"
networks:
proxy-network:
external:
name: proxy-network
### SERVICE ###
services:
homepage:
container_name: homepage
image: nginx:latest
restart: unless-stopped
networks:
- proxy-network
security_opt:
- no-new-privileges:true
volumes:
- /html:/usr/share/nginx/html:ro
labels:
- "traefik.enable=true"
- "traefik.http.routers.testseite-rtr.entrypoints=https"
- "traefik.http.routers.testseite-rtr.rule=Host(`homepage.$DOMAINNAME`)"
- "traefik.http.routers.testseite-rtr.tls=true"
- "traefik.http.routers.testseite-rtr.service=testseite-svc"
- "traefik.http.services.testseite-svc.loadbalancer.server.port=80"
sudo docker compose up -d
Die Seite müsste nun unter homepage.domain.de
erreichbar sein.
Update
Dank Docker und Docker Compose ist das Updaten von Traefik einfach.
sudo docker compose pull
sudo docker compose down
sudo docker compose up -d