In einem der letzten Beiträge habe ich euch gezeigt wie Ihr Traefik aufsetzt.
In meinem HomeLab habe ich aber das Problem das ich mehrere Server mit verschiedenen Docker Containern am laufen habe.
Das Setup sieht so aus:
- Server 1 – Zimaboard (läuft 24/7) 192.168.2.50
- Server 2 – HP Server (läuft von 08:00-22:30Uhr) 192.168.2.51
- Server 3 – Raspberry Pi (läuft 24/7) 192.168.2.52
Auf allen Server laufen wie gesagt verschiedene Docker Container von denen ich einige öffentlich zugänglich machen wollte.
Das Problem dabei war dass ich auf meinem Router nur für einen Server die Ports 80/443 öffnen kann, somit musste ich mich bis jetzt für einen Server bzw. eine Traefik Instanz entscheiden und dort dann auch alle zu veröffentlichen Container laufen lassen.
Da das aber aufgrund des Systems und der Services nicht möglich war musste eine andere Lösung her. Natürlich könnte ich das ganze mit DockerSwarm oder Kubernetes realisieren, jedoch wollte ich nicht meine komplette Struktur über den Haufen werfen.
Mit traefik-kop ist das auch überhaupt nicht nötig. Hier wird auf einem Server ( Server 1) Traefik und redis installiert. Dieser Server (Server 1) stellt dann auch die Services öffentlich zur Verfügung. Auf Server 2 & Server 3 wird dann der traefik-kop Container und eben verschiedene andere Container erstellt und dann mittels Labels an redis (Server 1) weitergeleitet.
GitHub Repository zu traefik-kop: https://github.com/jittering/traefik-kop
Wie Ihr grundsätzlich Traefik einrichtet findet Ihr hier: https://bangertech.de/traefik-setup-mit-opnsense-pi-hole-cloudflare/
Als erstes fügen wir redis der standard Traefik docker-compose.yml hinzu.
Server 1 (192.168.2.50) Traefik docker-compose.yml
version: '3.5'
services:
traefik:
image: traefik:latest
container_name: traefik
restart: unless-stopped
security_opt:
- no-new-privileges:true
networks:
proxy:
ports:
- 80:80
- 443:443
environment:
- CF_API_EMAIL=die-email-adresse-eures-cloudflare-accounts
- CF_DNS_API_TOKEN=erstellter-DNS-Token-für-eureDomain
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./data/traefik.yml:/traefik.yml:ro
- ./data/acme.json:/acme.json
- ./data/config.yml:/config.yml:ro
- ./data/logs:/var/log/traefik
labels:
- "traefik.enable=true"
- "traefik.http.routers.traefik.entrypoints=http"
- "traefik.http.routers.traefik.rule=Host(`traefik.testspage.org`)"
- "traefik.http.middlewares.traefik-auth.basicauth.users=USER:Password"
- "traefik.http.middlewares.traefik-https-redirect.redirectscheme.scheme=https"
- "traefik.http.middlewares.sslheader.headers.customrequestheaders.X-Forwarded-Proto=https"
- "traefik.http.routers.traefik.middlewares=traefik-https-redirect"
- "traefik.http.routers.traefik-secure.entrypoints=https"
- "traefik.http.routers.traefik-secure.rule=Host(`traefik.testspage.org`)"
- "traefik.http.routers.traefik-secure.middlewares=traefik-auth"
- "traefik.http.routers.traefik-secure.tls=true"
- "traefik.http.routers.traefik-secure.tls.certresolver=cloudflare"
- "traefik.http.routers.traefik-secure.tls.domains[0].sans=*.testspage.org"
- "traefik.http.routers.traefik-secure.service=api@internal"
redis:
image: redis
container_name: redis
restart: always
ports:
- "6379:6379"
environment:
- REDIS_REPLICATION_MODE=master
volumes:
- ./redis:/data
networks:
proxy:
networks:
proxy:
name: proxy
external: true
In die traefik.yml datei wird ebenfalls redis unter providers eingefügt:
api:
dashboard: true
debug: true
entryPoints:
http:
address: ":80"
http:
redirections:
entryPoint:
to: https
scheme: https
https:
address: ":443"
serversTransport:
insecureSkipVerify: true
providers:
docker:
endpoint: "unix:///var/run/docker.sock"
exposedByDefault: false
file:
filename: /config.yml
redis:
endpoints:
- "redis:6379"
certificatesResolvers:
cloudflare:
acme:
email: eure-email-für-cloudflare
storage: acme.json
dnsChallenge:
provider: cloudflare
resolvers:
- "1.1.1.1:53"
- "1.0.0.1:53"
Nachdem diese Schritte erledigt wurden kann dann der Traefik Container inkl. redis auch schon wieder gestartet werden.
Auf den Servern 2 & 3 müsst Ihr dann noch den traefik-kop Container erstellen:
version: "3"
services:
traefik-kop:
image: "ghcr.io/jittering/traefik-kop:latest"
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- "REDIS_ADDR=192.168.2.50:6379"
- "BIND_IP=192.168.2.51"
Wobei hier die REDIS_ADDR die Adresse des Servers mit Traefik ist, in diesem Fall: 192.168.2.50:6379
Die BIND_IP ist die IP Adresse auf dem dieser Container läuft also hier Server 2: 192.168.2.51 oder auf Server 3: 192.168.2.52
Bei den bestehenden Container auf Server 2 & Server 3 sieht dann die Konfiguration der docker-compose.yml so aus:
version: "3.3"
services:
homepage:
image: ghcr.io/gethomepage/homepage:latest
container_name: homepage
ports:
- 3009:3000
restart: always
volumes:
- ./config:/app/config # Make sure your local config directory exists
- /var/run/docker.sock:/var/run/docker.sock:ro # (optional) For docker integrations
labels:
- "traefik.enable=true"
- "traefik.http.routers.homepage.rule=Host(`homepage.tests.org`)"
- "traefik.http.routers.homepage.tls=true"
- "traefik.http.routers.homepage.tls.certresolver=cloudflare"
- "traefik.http.services.homepage.loadbalancer.server.scheme=http"
- "traefik.http.services.homepage.loadbalancer.server.port=3009"
networks:
- proxy
networks:
proxy:
external: true
Die Container bzw. die Labels auf Server 1 können wie hier beschrieben unverändert belassen werden.
Nun müssen im Router nur noch Port 80 & 443 für den Server 1 (192.168.2.50) geöffnet werden.
Falls Ihr PI-Hole nutzt müsst Ihr noch einen DNS Record anlegen, hier wird auf die IP Adresse des Servers mit der Traefik Instanz verwiesen. In diesem Beispiel ist das der Server 1 – 192.168.2.50