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.
sudo docker network create proxy-network
Verzeichnis anlegen
mkdir traefikcd traefiktouch traefik.logmkdir sharedmkdir acmetouch acme/acme.jsonchmod 600 acme/acme.jsonmkdir rulestouch rules/middlewares.tomltouch .env docker-compose.yml
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.deNETCUP_CUSTOMER_NUMBER=50000NETCUP_API_KEY=LDBfH4MNyDlgBgww0lGry0OkouhkMqUI5ENETCUP_API_PASSWORD=uEzCAzISBUBwGqW9oSEzRJuL3D26Gm1yQFMlnqSB1Lhjjb5Z98EMAIL_ADDRESS=mail@hallo.de
Installation
Authentifizierung
Für die Authentizifiertung wird eine Benutzername / Passwort Kombination benötigt.
sudo apt install apache2-utilshtpasswd -nb benutzername passwort > /shared/.htpasswd
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.
### NETWORKS ###networks: proxy-network: external: true
### 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"
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.
Andere Anwendung
Eine andere Anwendung kann über labels mit traefik verbunden werden.
mkdir homepagecd homepagemkdir htmltouch html/index.htmltouch docker-compose.yml
<!DOCTYPE html><html> <head> <title>Homepage</title> </head> <body> <h1>Homepage</h1> <p>Dies ist die Homepage.</p> </body></html>
networks: proxy-network: external: true
### 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 pullsudo docker compose downsudo docker compose up -d