Skip to content

Forward Proxy ​

Dozzle kann Proxy-Header lesen, wenn --auth-provider auf forward-proxy gesetzt ist.

sh
$ docker run -v /var/run/docker.sock:/var/run/docker.sock -v /path/to/dozzle/data:/data -p 8080:8080 amir20/dozzle --auth-provider forward-proxy
yaml
services:
  dozzle:
    image: amir20/dozzle:latest
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /path/to/dozzle/data:/data
    ports:
      - 8080:8080
    environment:
      DOZZLE_AUTH_PROVIDER: forward-proxy

Hänge /data auch hier ein. Benutzereinstellungen werden auch im Forward-Proxy-Modus auf die Festplatte geschrieben und gehen ohne das Volume bei jedem Neuerstellen des Containers verloren.

In diesem Modus erwartet Dozzle die folgenden Header:

  • Remote-User als Benutzername, z. B. johndoe
  • Remote-Email als E-Mail-Adresse des Benutzers. Über diese E-Mail wird auch der passende Gravatar gefunden.
  • Remote-Name als Anzeigename wie John Doe
  • Remote-Filter als kommagetrennte Liste der für den Benutzer erlaubten Filter.
  • Remote-Roles als kommagetrennte Liste der für den Benutzer erlaubten Rollen.

Zusätzlich kannst du eine Logout-URL konfigurieren:

yaml
DOZZLE_AUTH_LOGOUT_URL: http://oauth2.example.ru/oauth2/sign_out

Dozzle mit Authelia einrichten ​

Authelia ist ein quelloffener Authentifizierungs- und Autorisierungsserver samt Portal für Identitäts- und Zugriffsverwaltung. Die Einrichtung von Authelia selbst geht über diesen Abschnitt hinaus, aber die Konfiguration lässt sich als Beispiel für die Einrichtung von Dozzle mit Authelia teilen.

➡️ Zum Aufklappen des Authelia-Beispiels klicken
yaml
networks:
  net:
    driver: bridge

services:
  authelia:
    image: authelia/authelia
    container_name: authelia
    volumes:
      - ./authelia:/config
    networks:
      - net
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.authelia.rule=Host(`authelia.example.com`)"
      - "traefik.http.routers.authelia.entrypoints=https"
      - "traefik.http.routers.authelia.tls=true"
      - "traefik.http.routers.authelia.tls.options=default"
      - "traefik.http.middlewares.authelia.forwardAuth.address=http://authelia:9091/api/authz/forward-auth"
      - "traefik.http.middlewares.authelia.forwardAuth.trustForwardHeader=true"
      - "traefik.http.middlewares.authelia.forwardAuth.authResponseHeaders=Remote-User,Remote-Groups,Remote-Name,Remote-Email"
    expose:
      - 9091
    restart: unless-stopped

  traefik:
    image: traefik:v3.5
    container_name: traefik
    volumes:
      - ./traefik:/etc/traefik
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - net
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.api.rule=Host(`traefik.example.com`)"
      - "traefik.http.routers.api.entrypoints=https"
      - "traefik.http.routers.api.service=api@internal"
      - "traefik.http.routers.api.tls=true"
      - "traefik.http.routers.api.tls.options=default"
      - "traefik.http.routers.api.middlewares=authelia@docker"
    ports:
      - "80:80"
      - "443:443"
    command:
      - "--api"
      - "--providers.docker=true"
      - "--providers.docker.exposedByDefault=false"
      - "--providers.file.filename=/etc/traefik/certificates.yml"
      - "--entrypoints.http=true"
      - "--entrypoints.http.address=:80"
      - "--entrypoints.http.http.redirections.entrypoint.to=https"
      - "--entrypoints.http.http.redirections.entrypoint.scheme=https"
      - "--entrypoints.https=true"
      - "--entrypoints.https.address=:443"
      - "--log=true"
      - "--log.level=DEBUG"

  dozzle:
    image: amir20/dozzle:latest
    networks:
      - net
    environment:
      DOZZLE_AUTH_PROVIDER: forward-proxy
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - dozzle:/data
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.dozzle.rule=Host(`dozzle.example.com`)"
      - "traefik.http.routers.dozzle.entrypoints=https"
      - "traefik.http.routers.dozzle.tls=true"
      - "traefik.http.routers.dozzle.tls.options=default"
      - "traefik.http.routers.dozzle.middlewares=authelia@docker"
    expose:
      - 8080
    restart: unless-stopped

volumes:
  dozzle:
yaml
###############################################################
#                   Authelia configuration                      #
###############################################################

server:
  address: tcp://0.0.0.0:9091

log:
  level: info

totp:
  issuer: authelia.com

identity_validation:
  reset_password:
    jwt_secret: a_very_important_secret

authentication_backend:
  file:
    path: /config/users_database.yml

access_control:
  default_policy: deny
  rules:
    - domain: traefik.example.com
      policy: one_factor
    - domain: dozzle.example.com
      policy: one_factor

session:
  secret: unsecure_session_secret
  cookies:
    - domain: example.com # Sollte zu deiner geschützten Root-Domain passen
      authelia_url: https://authelia.example.com
      default_redirection_url: https://public.example.com

regulation:
  max_retries: 3
  find_time: 120
  ban_time: 300

storage:
  encryption_key: you_must_generate_a_random_string_of_more_than_twenty_chars_and_configure_this
  local:
    path: /config/db.sqlite3

notifier:
  filesystem:
    filename: /config/notification.txt

Gültige SSL-Schlüssel sind erforderlich, da Authelia nur SSL unterstützt.

Authelia schickt die Gruppenzugehörigkeit in Remote-Groups, und Dozzle liest diesen Header nicht standardmäßig. Um Authelia-Gruppen auf Dozzle-Rollen abzubilden, setze DOZZLE_AUTH_HEADER_ROLES: Remote-Groups beim Dozzle-Service und benenne die Gruppen nach den Rollen. Genau dafür gibt es die Aliase mit dem Präfix dozzle_: Eine Gruppe namens dozzle_shell gewährt die Rolle shell, andere Gruppennamen werden ignoriert. Ohne diese Zuordnung bekommt jeder authentifizierte Benutzer alle Rollen.

Dozzle mit Cloudflare Zero Trust einrichten ​

Cloudflare Zero Trust ist ein Dienst für authentifizierten Zugriff auf selbst gehostete Software. Dieser Abschnitt beschreibt, wie du Dozzle für die Authentifizierung über Cloudflare Zero Trust einrichtest.

yaml
services:
  dozzle:
    image: amir20/dozzle:latest
    environment:
      DOZZLE_AUTH_PROVIDER: forward-proxy
      DOZZLE_AUTH_HEADER_USER: Cf-Access-Authenticated-User-Email
      DOZZLE_AUTH_HEADER_EMAIL: Cf-Access-Authenticated-User-Email
      DOZZLE_AUTH_HEADER_NAME: Cf-Access-Authenticated-User-Email
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - dozzle:/data
    expose:
      - 8080
    restart: unless-stopped

volumes:
  dozzle:

expose hält Port 8080 vom Host fern, der einzige Weg hinein führt also über den Tunnel. Wird er mit ports veröffentlicht, könnte jeder auf dem Host Cf-Access-Authenticated-User-Email selbst setzen und Cloudflare komplett umgehen.

Nachdem der Dozzle-Container läuft, konfigurierst du die Anwendung im Cloudflare-Zero-Trust-Dashboard nach dieser Anleitung.

Dozzle mit Pocket ID einrichten ​

TIP

Dozzle spricht inzwischen selbst OpenID Connect, du kannst --auth-oidc-issuer also direkt auf Pocket ID zeigen lassen und oauth2-proxy komplett weglassen. Siehe Mit GitHub & OIDC anmelden. Das Rezept unten bleibt für Setups, die schon oauth2-proxy betreiben oder den Proxy mehr als nur Dozzle absichern lassen wollen.

Du musst zuerst einen Container einrichten, der die OpenID-Connect-Authentifizierung durch deinen Reverse Proxy reicht.

Unten ein Beispiel mit oauth2-proxy.

➡️ Zum Aufklappen des oauth2-proxy-Beispiels klicken
  1. Lege in Pocket ID einen neuen OIDC-Client für Dozzle an:

    • Name: Dozzle
    • Callback-URLs: https://dozzle.example.com/oauth2/callback
    • PKCE: Enabled

    Kopiere die Werte für Client ID und Client Secret für später.

  2. Ergänze deine bestehende Dozzle-Compose-Datei um Folgendes:

    yml
    environment:
      DOZZLE_AUTH_PROVIDER: forward-proxy
      DOZZLE_AUTH_HEADER_USER: X-Forwarded-User
      DOZZLE_AUTH_HEADER_EMAIL: X-Forwarded-Email
      DOZZLE_AUTH_HEADER_NAME: X-Forwarded-Preferred-Username

    Kommentiere die Ports von Dozzle aus, da wir sie über den neuen Authentifizierungscontainer umleiten.

    Diese Methode sollte keine Änderungen an der Konfiguration deines Reverse Proxy erfordern.

    yml
    # ports:
    #   - 8080:8080
  3. Füge deiner bestehenden Dozzle-Compose-Datei einen neuen oauth2-proxy-Service hinzu:

    yml
    services:
      # ...
      oauth2-proxy:
        image: quay.io/oauth2-proxy/oauth2-proxy:latest
        restart: unless-stopped
        container_name: dozzle-oidc
        command: --config /oauth2-proxy.cfg
        volumes:
          - "./oauth2-proxy.cfg:/oauth2-proxy.cfg"
        ports:
          - 8080:4180
  4. Lege die Konfigurationsdatei für oauth2-proxy an.

    Erstelle im Verzeichnis neben deiner Compose-Datei die Datei oauth2-proxy.cfg :

    toml
     client_id = "xxx"                            # aus Pocket ID
     client_secret = "xxx"                        # aus Pocket ID
     cookie_secret = "xxx"                        # mit openssl rand -base64 32 | tr -- '+/' '-_' erzeugen
     upstreams = "http://dozzle:8080"             # Upstream zum internen Port der Dozzle-Container
     code_challenge_method = "S256"               # PKCE-Challenges plain oder S256
     cookie_expire = "0"                          # Sekunden, 0 für Session
     cookie_name = "__Host-oauth2-proxy"          # oder __Secure-oauth2-proxy (weniger sicher)
     cookie_secure = true                         # nutzt das sichere HTTPS-Cookie
     email_domains = ["*"]                        # erlaubt die Anmeldung mit jeder E-Mail-Domain
     http_address = "0.0.0.0:4180"                # Port, auf dem oauth2-proxy lauscht
     oidc_issuer_url = "https://id.example.com"   # deine Pocket-Basis-URL
     provider_display_name = "Pocket ID"          # Anzeigename für den OIDC-Login
     provider = "oidc"                            # OpenID Connect verwenden
     reverse_proxy = true                         # Traffic über den Reverse Proxy leiten
     scope = "openid email profile groups"        # diese OIDC-Scopes durchreichen

    Fülle die Variablen entsprechend den Kommentaren aus.

  5. Zum Schluss: Starte deinen Docker-Compose-Stack neu.

    Dein Reverse Proxy sollte dich jetzt über oauth2-proxy bei Dozzle authentifizieren.

    Bei Problemen hilft ein Blick in die Logs.

Veröffentlicht unter der MIT-Lizenz. Quelloffen und gesponsert von Docker OSS.