Zum Hauptinhalt springen

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.

.../traefik/.env
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:

.../traefik/rules/middlewares.toml
[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.

.../traefik/docker-compose.yml
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
.../homepage/html/index.html
<!DOCTYPE html>
<html>
<head>
<title>Homepage</title>
</head>
<body>
<h1>Homepage</h1>
<p>Dies ist die Homepage.</p>
</body>
</html>
.../homepage/docker-compose.yml
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