Mehrere Docker Server über eine Traefik Instanz veröffentlichen! Traefik-KOP

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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert