Skip to main content

Cockpit (lokale Anwendung) hinter Traefik erreichbar machen

Um die Anwendung "Cockpit" über Traefik (läuft als Docker-Container) erreichbar zu machen sind folgende Schritte notwendig:

Zunächst muss eine Sub-Domain eingerichtet werden und diese über einen File-Provider konfiguriert werden. Diese Datei wird über Docker-Yaml-Datei in die Traefik-Konfiguration mit eingebunden:

services:
  traefik:
    image: traefik:latest
    container_name: traefik
    restart: always
    command:
      # Experimentell, um das Dashboard ohne Zugriffsschutz aufzurufen
      - "--api.insecure=true"
      - "--api.dashboard=true"
      - "--log.level=warn"
      - "--providers.docker"
      # File-Provider einbinden:
      - "--providers.file.directory=/etc/traefik/"
      - "--providers.file.watch=true"
      ##########################
      - "--providers.docker.exposedByDefault=false"
      - "--providers.docker.network=traefik_web"
      - "--entrypoints.http.address=:80"
      - "--entrypoints.https.address=:443"
      - "--entrypoints.http.http.redirections.entrypoint.to=https"
      - "--entrypoints.http.http.redirections.entrypoint.scheme=https"
      - "--entrypoints.https.address=:443"
      # Vermeidet, dass wir den resolver in jedem container mit "traefik.http.routers.https.tls.certresolver=le" angeben muessen
      - "--entrypoints.https.http.tls.certResolver=le"
      - "--certificatesresolvers.le.acme.tlschallenge=true"
      # Staging-Server von Let's encrypt nutzen (für Testzwecke, größere Limits)
      #- "--certificatesresolvers.le.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory"
      - "--certificatesresolvers.le.acme.email=thomas@atj-krueger.de"
      - "--certificatesresolvers.le.acme.storage=/letsencrypt/acme.json"
      - "--certificatesresolvers.le.acme.tlschallenge=true"

    ports:
      - "80:80"
      - "443:443"
      - "8080:8080"
    
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - /etc/docker/container/traefik:/letsencrypt
      # Konfigurationsdatei für File-Provider einbinden:
      # Hinweis: In diesem Fall muss die Datei auf dem Host links vom Doppelpunkt stehen.
      # Die Zieldatei im Traefik-Container steht entsprechende rechts von Doppelpunkt.
      - /etc/docker/container/traefik/dynamic_conf/dynamic_conf.yml:/etc/traefik/dynamic_conf.yml
 
    networks:
      - web
    extra_hosts:
      - "host.docker.internal:host-gateway"


networks:
  web:
  	external: true
    name: traefik_web

Inhalt der Datei dynamic_conf.yml (Korrekte Sub-Domain und lokale IP-dresse des Servers müssen noch angepasst werden):

# As YAML Configuration File
http:
  serversTransports:
    mytransport:
      insecureSkipVerify: true

  routers:
    cockpit:
      service: cockpit
      rule: "Host(`cockpit.domain.de`)"

  services:
    cockpit:
      loadBalancer:
        servers:
          - url: "http://ip-des-Servers:9090"

Darüber hinaus muss Cockpit selber auch noch etwas umkonfiguriert werden. Dazu legt man eine Datei mit Namen "cockpit.conf" im Pfad /etc/cockpit an. Deren Inhalt sieht bei mir so aus:

[WebService]
Origins = https://cockpit.domain.de wss://cockpit.domain.de
ProtocolHeader = X-Forwarded-Proto
AllowUnencrypted=true

Anschließend müssen der Traefik-Container neu erstellt und Cockpit neu gestartet werden:

sudo docker stop traefi
sudo docker rm traefik
sudo docker-compose -f traefik.yml up --force-recreate --build -d

sudo systemctl stop cockpit

Cockpit startet sich automatisch, wenn ein Aufruf erfolgt.

Mit dieser Konfiguration ist Cockpit nur noch über Traefik lauffähig. Ruft man Cockpit direkt über IP-Adresse und Port auf, kann man sich zwar anmelden, aber im weiteren Verlauf erscheint eine Fehlermeldung.