162 lines
7.0 KiB
Markdown
162 lines
7.0 KiB
Markdown
---
|
||
title: traefik
|
||
description:
|
||
published: true
|
||
date: 2026-06-28T14:31:17.139Z
|
||
tags:
|
||
editor: markdown
|
||
dateCreated: 2026-06-28T14:31:15.285Z
|
||
---
|
||
|
||
# Traefik – Reverse Proxy
|
||
|
||
**Zusammenfassung**: Traefik läuft als zentraler Reverse Proxy mit Let's Encrypt TLS-Terminierung. Alle öffentlichen Dienste hängen am selben Docker-Netzwerk `traefik`. Die Routing-Konfiguration erfolgt per **File Provider** (YAML-Dateien in `/conf.d/`), nicht per Docker-Labels.
|
||
**Quellen**: 🖥️ `raw/Systemdaten – Raspberry PI5.md`, 🔌 SSH (`/opt/compose/traefik/conf.d/*.yml`, 18.06. 20:00)
|
||
**Zuletzt aktualisiert**: 2026-06-18 (Update 20:00)
|
||
|
||
---
|
||
|
||
## Container
|
||
|
||
| Feld | Wert |
|
||
|---|---|
|
||
| **Image** | `traefik:latest` |
|
||
| **Container-Name** | `traefik` |
|
||
| **Restart** | `unless-stopped` |
|
||
| **Netzwerk** | `traefik` (extern) |
|
||
| **Ports (Host)** | `80:80`, `443:443` |
|
||
|
||
## Static Configuration (compose.yml – `command:`)
|
||
|
||
```yaml
|
||
command:
|
||
- "--api.dashboard=true"
|
||
- "--log.level=INFO"
|
||
|
||
# File Provider (statt Docker Labels)
|
||
- "--providers.file.directory=/conf.d"
|
||
- "--providers.file.watch=true"
|
||
- "--providers.file=true"
|
||
|
||
# Entrypoints
|
||
- "--entrypoints.web.address=:80"
|
||
- "--entrypoints.websecure.address=:443"
|
||
- "--entrypoints.websecure.http.tls=true"
|
||
- "--entrypoints.web.http.sanitizePath=false"
|
||
- "--entrypoints.websecure.http.sanitizePath=false"
|
||
- "--entrypoints.websecure.http.encodedCharacters.allowEncodedSlash=true"
|
||
- "--entrypoints.websecure.http.encodedCharacters.allowEncodedBackSlash=true"
|
||
- "--entrypoints.websecure.http.encodedCharacters.allowEncodedSemicolon=true"
|
||
- "--entrypoints.websecure.http.encodedCharacters.allowEncodedPercent=true"
|
||
- "--entrypoints.websecure.http.encodedCharacters.allowEncodedQuestionMark=true"
|
||
- "--entrypoints.websecure.http.encodedCharacters.allowEncodedHash=true"
|
||
|
||
# Let's Encrypt
|
||
- "--certificatesresolvers.le.acme.email=dial-master@gmx.de"
|
||
- "--certificatesresolvers.le.acme.storage=/acme.json"
|
||
- "--certificatesresolvers.le.acme.httpchallenge.entrypoint=web"
|
||
```
|
||
|
||
## Volumes
|
||
|
||
| Host-Pfad | Container-Pfad | Zweck |
|
||
|---|---|---|
|
||
| `./conf.d` | `/conf.d` | File-Provider-Konfigurationen (dynamische Routen) |
|
||
| `./acme.json` | `/acme.json` | Let's-Encrypt-Zertifikatspeicher |
|
||
| `./auth/.htpasswd` | `/.htpasswd` | Basis-Auth für das Dashboard |
|
||
| `/etc/localtime` | `/etc/localtime:ro` | Zeitzone |
|
||
|
||
## Dynamic Configuration (File Provider)
|
||
|
||
Die eigentlichen Routen-Regeln liegen als YAML-Dateien in `/opt/compose/traefik/conf.d/`. Alle Dateien (Stand: 17.06.2026):
|
||
|
||
| Datei | Zweck |
|
||
|---|---|---|
|
||
| `0000-global.yml` | HTTP-Catchall-Router (fängt HTTP ab; HTTPS-Redirect **auskommentiert**) |
|
||
| `0010-middlewares.yml` | Middleware-Chains (auth, security, rate-limit, nextcloud-dav, etc., **+ chain-authelia**) |
|
||
| `0015-authelia-service.yml` | ✅ [authelia](./authelia.md) Route (ohne Auth) |
|
||
| `0020-authelia-middleware.yml` | ✅ ForwardAuth-Middleware (chain-authelia + authelia-forwardauth) |
|
||
| `0020-prometheus.yml` | Prometheus-Route (mit Basic-Auth) |
|
||
| `0030-grafana.yml` | Grafana-Route (ohne Auth-Middleware) |
|
||
| `0100-traefik-dashboard.yml` | Traefik-Dashboard (mit Basic-Auth) |
|
||
| `0105-collabora.yml` | Collabora (iFrame-freundliche Header, WebSocket-Support) |
|
||
| `0110-nextcloud.yml` | Nextcloud (mit chain-nextcloud-Middleware) |
|
||
| `0120-paperless.yml` | Paperless |
|
||
| `0130-immich.yml` | Immich |
|
||
| `0140-wikijs.yml` | Wiki.js |
|
||
| `0150-stirling.yml` | ✅ Stirling PDF (mit `chain-authelia`) |
|
||
| `0160-plex.yml` | Plex |
|
||
| `0170-nginx.yml` | Nginx Static Webserver |
|
||
| `0500-jenkins.yml` | Jenkins (mit Jenkins-Headern) |
|
||
| `0510-gitea.yml` | Gitea (ohne Middleware – OIDC) |
|
||
|
||
### Vollständige Routing-Übersicht
|
||
|
||
| Subdomain | interner Dienst | Middleware | Auth |
|
||
|---|---|---|---|---|
|
||
| `cloud.*` | `http://nextcloud` | `chain-nextcloud` | – |
|
||
| `photos.*` | `http://immich_server:2283` | `chain-immich` | – |
|
||
| `paperless.*` | `http://paperless-webserver-1:8000` | `chain-app-standard` | – |
|
||
| `wiki.*` | `http://wikijs:3000` | `chain-app-standard` | – |
|
||
| **`pdf.*`** | **`http://stirling-pdf:8080`** | **`chain-authelia`** | **✅ ForwardAuth** |
|
||
| `music.*` | `http://plex:32400` | `chain-app-standard` | – |
|
||
| `web.*` | `http://nginx_pi5:80` | `chain-app-standard` | – |
|
||
| `office.*` | `http://collabora:9980` | `collabora-headers` | – |
|
||
| `jenkins.*` | `http://jenkins:8080` | `chain-jenkins` | – |
|
||
| `git.*` | `http://gitea:3000` | – | **🔄 OIDC (in Einrichtung)** |
|
||
| `auth.*` | `http://authelia:9091` | – | ✅ SSO-Portal + OIDC |
|
||
| `traefik.*` | `api@internal` | `chain-secure-admin` | **Basic-Auth** *(→ chain-authelia)* |
|
||
| `prometheus.*` | `http://monitoring-prometheus:9090` | `chain-secure-admin` | **Basic-Auth** *(→ chain-authelia)* |
|
||
| `grafana.*` | `http://monitoring-grafana:3000` | – | – |
|
||
|
||
Die Domain-Platzhalter `{{ env "HOSTNAME_BASE" }}` werden durch `da.home-webserver.de` ersetzt. Nur `office.da.home-webserver.de` ist hardcodiert.
|
||
|
||
### Middleware-Chains
|
||
|
||
Die wichtigsten Middleware-Ketten:
|
||
|
||
| Chain | Enthält |
|
||
|---|---|---|
|
||
| `chain-secure-admin` | `security-headers` + `auth-admin` (Basic-Auth via `.htpasswd`) |
|
||
| `chain-app-standard` | `security-headers` + `upload-limit` + `rate-limit` |
|
||
| `chain-immich` | `security-headers` + `rate-limit` |
|
||
| `chain-nextcloud` | `security-headers` + `nextcloud-dav` (CalDAV/CardDAV-Redirect) + `compress` + `upload-limit` |
|
||
| `chain-jenkins` | `jenkins-headers` (X-Forwarded-Proto/Port) + `rate-limit` |
|
||
| **`chain-authelia`** | **`security-headers` + `authelia-forwardauth`** (ForwardAuth) |
|
||
|
||
### Hinweise
|
||
|
||
- **Stirling PDF** (`pdf.*`) ist als erster Dienst auf `chain-authelia` umgestellt – ForwardAuth aktiv.
|
||
- **Gitea** (`git.*`) hat **keine Middleware** – Authentifizierung läuft per OIDC direkt zwischen Gitea und Authelia.
|
||
- **Prometheus** und **Traefik-Dashboard** sind noch per Basic-Auth geschützt (`auth-admin`-Middleware mit `.htpasswd`-Datei). Geplant: Umstellung auf [authelia](./authelia.md).
|
||
- **Grafana hat KEIN Auth in Traefik** – der Schutz liegt ausschließlich bei Grafana selbst.
|
||
- Die Collabora-Konfiguration erlaubt **iFrame-Einbettung** für Nextcloud-Integration.
|
||
- Siehe [authelia](./authelia.md) für die vollständige SSO-Dokumentation.
|
||
|
||
## Let's Encrypt
|
||
|
||
- **E-Mail**: `dial-master@gmx.de`
|
||
- **Challenge**: HTTP (Port 80)
|
||
- **Speicher**: `/acme.json` (gemapptes Host-Volume)
|
||
- **Resolver-Name**: `le`
|
||
|
||
## DNS
|
||
|
||
Traefik nutzt `8.8.8.8` und `1.1.1.1` als upstream DNS.
|
||
|
||
## Wichtige Hinweise
|
||
|
||
- Die **encodedCharacters-Optionen** sind für [collabora](./collabora.md) wichtig (WebSockets, encoded Slashes).
|
||
- Das **Dashboard** ist per API aktiviert, aber durch `.htpasswd` geschützt.
|
||
- Der File Provider wird **live überwacht** (`watch=true`) – Änderungen an YAML-Dateien werden ohne Neustart übernommen.
|
||
|
||
## Verwandte Seiten
|
||
|
||
- [docker-services](../docker-services.md) – Alle Dienste, die Traefik nutzen
|
||
- [authelia](./authelia.md) – SSO mit ForwardAuth und Passkey
|
||
- [nextcloud](./nextcloud.md)
|
||
- [collabora](./collabora.md)
|
||
- [gitea](./gitea.md)
|
||
- [jenkins](./jenkins.md)
|
||
- [domain-und-ssl](../domain-und-ssl.md)
|