Inital commit
This commit is contained in:
@@ -0,0 +1,589 @@
|
||||
# Authelia – SSO mit Passkey-Unterstützung
|
||||
|
||||
**Zusammenfassung**: Authelia als ForwardAuth-Provider für Traefik. Ermöglicht Single Sign-On (SSO) für alle Dienste hinter Traefik – mit Passwort, Passkey (WebAuthn/FIDO2) oder beidem.
|
||||
**Status**: ✅ aktiv – Gitea-Login via OIDC funktioniert, Passkey-Config aktualisiert
|
||||
**Zuletzt aktualisiert**: 2026-06-19 (Live-Daten 21:30)
|
||||
|
||||
---
|
||||
|
||||
## Architektur
|
||||
|
||||
```
|
||||
Browser ──HTTPS──▶ Traefik (:443)
|
||||
│
|
||||
▼ (ForwardAuth-Middleware)
|
||||
Authelia ───▶ Session-Check
|
||||
│
|
||||
┌───────┴──────────┐
|
||||
▼ ▼
|
||||
Unauthenticated Authenticated
|
||||
│ │
|
||||
Login-Seite Weiterleitung zum
|
||||
(auth.*) eigentlichen Dienst
|
||||
```
|
||||
|
||||
- Authelia läuft als **eigener Docker-Container** im `traefik`-Netzwerk
|
||||
- Traefik fragt bei jedem Request via **ForwardAuth-Middleware** bei Authelia an:
|
||||
- „Ist dieser Benutzer eingeloggt und darf auf diese Domain?“
|
||||
- Bei **Nein** → Redirect zu `auth.da.home-webserver.de`
|
||||
- Bei **Ja** → Request geht zum eigentlichen Dienst
|
||||
- **Passkeys (WebAuthn)** werden von Authelia nativ unterstützt – als 2FA oder passwordless
|
||||
|
||||
---
|
||||
|
||||
## Stack: `/opt/compose/authelia/`
|
||||
|
||||
### compose.yml
|
||||
|
||||
```yaml
|
||||
services:
|
||||
authelia:
|
||||
image: authelia/authelia:latest
|
||||
container_name: authelia
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- traefik
|
||||
volumes:
|
||||
- ./config:/config
|
||||
environment:
|
||||
- TZ=Europe/Berlin
|
||||
|
||||
networks:
|
||||
traefik:
|
||||
external: true
|
||||
```
|
||||
|
||||
> **Hinweis**: Authelia wird **ohne** Traefik-Labels betrieben, damit es nicht sich selbst durch die ForwardAuth-Middleware blockiert. Stattdessen bekommt es eine eigene Route im File Provider.
|
||||
|
||||
---
|
||||
|
||||
## Konfiguration
|
||||
|
||||
### `config/configuration.yml`
|
||||
|
||||
```yaml
|
||||
###############################################################
|
||||
# Authelia Konfiguration (v4.39+)
|
||||
###############################################################
|
||||
|
||||
# Server-Adresse (ersetzt host + port)
|
||||
server:
|
||||
address: tcp://0.0.0.0:9091
|
||||
|
||||
# Logging
|
||||
log:
|
||||
level: info
|
||||
|
||||
# Speicher – SQLite mit encryption_key (Pflicht seit v4.38)
|
||||
storage:
|
||||
encryption_key: <openssl rand -hex 32> # 32 Byte Hex für SQLite-Verschlüsselung
|
||||
local:
|
||||
path: /config/db.sqlite3
|
||||
|
||||
# Authentifizierungs-Backend (file-basiert)
|
||||
authentication_backend:
|
||||
file:
|
||||
path: /config/users.yml
|
||||
password:
|
||||
algorithm: argon2id
|
||||
iterations: 3
|
||||
salt_length: 16
|
||||
parallelism: 4
|
||||
memory: 65536 # KiB = 64 MiB (muss mit CLI-Default übereinstimmen)
|
||||
|
||||
# Passkey (WebAuthn) – Hauptfeature
|
||||
# Passwordless-Login ist automatisch aktiv, sobald ein Passkey registriert wurde
|
||||
webauthn:
|
||||
enable_passkey_login: true # Neue v4.39-Option
|
||||
attestation_conveyance_preference: 'direct' # Auf direct geändert (19.06.)
|
||||
filtering:
|
||||
prohibit_backup_eligibility: true
|
||||
metadata:
|
||||
enabled: true # Metadata-Validierung aktiv (19.06.)
|
||||
validate_trust_anchor: true
|
||||
validate_entry: true
|
||||
validate_status: true
|
||||
validate_entry_permit_zero_aaguid: false
|
||||
timeout: 60s
|
||||
display_name: RaspiPI5 Authelia
|
||||
|
||||
# Zugriffsregeln
|
||||
access_control:
|
||||
default_policy: deny
|
||||
|
||||
rules:
|
||||
- domain: "auth.da.home-webserver.de"
|
||||
policy: bypass
|
||||
- domain: "cloud.da.home-webserver.de"
|
||||
policy: bypass
|
||||
- domain: "office.da.home-webserver.de"
|
||||
policy: bypass
|
||||
- domain: "git.da.home-webserver.de"
|
||||
policy: bypass # Gitea: OIDC
|
||||
- domain: "traefik.da.home-webserver.de"
|
||||
policy: two_factor
|
||||
- domain: "prometheus.da.home-webserver.de"
|
||||
policy: two_factor
|
||||
- domain: "*.da.home-webserver.de"
|
||||
policy: one_factor
|
||||
|
||||
# Session-Konfiguration
|
||||
session:
|
||||
name: authelia_session
|
||||
secret: <openssl rand -hex 64>
|
||||
expiration: 8h
|
||||
inactivity: 2h
|
||||
remember_me: 30d
|
||||
cookies:
|
||||
- domain: da.home-webserver.de
|
||||
authelia_url: https://auth.da.home-webserver.de
|
||||
|
||||
# Regulation – Schutz vor Brute-Force
|
||||
regulation:
|
||||
max_retries: 5
|
||||
find_time: 2m
|
||||
ban_time: 5m
|
||||
|
||||
# 2FA (TOTP) – optional
|
||||
totp:
|
||||
issuer: RaspiPI5
|
||||
period: 30
|
||||
skew: 1
|
||||
|
||||
# Notifier (Datei, da kein SMTP)
|
||||
notifier:
|
||||
filesystem:
|
||||
filename: /config/notifications.yml
|
||||
|
||||
# Passwort-Reset
|
||||
identity_validation:
|
||||
reset_password:
|
||||
jwt_secret: <openssl rand -hex 64>
|
||||
```
|
||||
|
||||
### `config/users.yml`
|
||||
|
||||
```yaml
|
||||
users:
|
||||
dial:
|
||||
password: <bcrypt/argon2-hash>
|
||||
displayname: "Dial"
|
||||
email: dial-master@gmx.de
|
||||
groups:
|
||||
- admins
|
||||
```
|
||||
|
||||
Passwort-Hash erzeugen:
|
||||
```bash
|
||||
# Argon2id-Hash generieren (Default-Variante)
|
||||
docker run --rm authelia/authelia:latest authelia crypto hash generate argon2 --password 'DeinPasswort'
|
||||
|
||||
# Mit expliziter Variante (optional):
|
||||
# docker run --rm authelia/authelia:latest authelia crypto hash generate argon2 --variant argon2id --password 'DeinPasswort'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Traefik File Provider: Middleware
|
||||
|
||||
### Neue Datei: `/opt/compose/traefik/conf.d/0020-authelia-middleware.yml`
|
||||
|
||||
```yaml
|
||||
http:
|
||||
middlewares:
|
||||
# Standard-Auth-Middleware für alle Dienste
|
||||
chain-authelia:
|
||||
chain:
|
||||
middlewares:
|
||||
- security-headers
|
||||
- authelia-forwardauth
|
||||
|
||||
authelia-forwardauth:
|
||||
forwardAuth:
|
||||
address: http://authelia:9091/api/verify?rd=https://auth.da.home-webserver.de/
|
||||
trustForwardHeader: true
|
||||
authResponseHeaders:
|
||||
- Remote-User
|
||||
- Remote-Groups
|
||||
- Remote-Name
|
||||
- Remote-Email
|
||||
```
|
||||
|
||||
> Die Datei heißt `0020-` damit sie zwischen den globalen (`0000-`, `0010-`) und den Service-Routen (`0100-` …) einsortiert wird.
|
||||
|
||||
---
|
||||
|
||||
## Authelia-Route: `conf.d/0015-authelia-service.yml`
|
||||
|
||||
Authelia selbst muss erreichbar sein, **ohne** durch ForwardAuth geschützt zu werden:
|
||||
|
||||
```yaml
|
||||
http:
|
||||
routers:
|
||||
authelia:
|
||||
rule: "Host(`auth.da.home-webserver.de`)"
|
||||
entryPoints:
|
||||
- websecure
|
||||
service: authelia
|
||||
tls:
|
||||
certResolver: le
|
||||
|
||||
services:
|
||||
authelia:
|
||||
loadBalancer:
|
||||
servers:
|
||||
- url: "http://authelia:9091"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Bestehende Routen anpassen
|
||||
|
||||
### 1. `0100-traefik-dashboard.yml` – Dashboard & Admin-Dienste
|
||||
|
||||
```yaml
|
||||
# Vorher:
|
||||
middlewares:
|
||||
- chain-secure-admin
|
||||
|
||||
# Nachher:
|
||||
middlewares:
|
||||
- chain-authelia
|
||||
```
|
||||
|
||||
### 2. Standard-App-Routen (`0110-nextcloud.yml`, `0120-paperless.yml`, usw.)
|
||||
|
||||
In jeder Service-Route wird die Middleware ausgetauscht:
|
||||
|
||||
| Route-Datei | Vorher | Nachher | |
|
||||
| ---------------------------- | -------------------- | ------------------------------------------------------- | --- |
|
||||
| `0100-traefik-dashboard.yml` | `chain-secure-admin` | `chain-authelia` | |
|
||||
| `0110-nextcloud.yml` | `chain-app-standard` | `chain-nextcloud` *(bleibt – cloud.* ist auf `bypass`)* | |
|
||||
| `0120-paperless.yml` | `chain-app-standard` | `chain-authelia` | |
|
||||
| `0130-immich.yml` | `chain-app-standard` | `chain-authelia` | |
|
||||
| `0140-wikijs.yml` | `chain-app-standard` | `chain-authelia` | |
|
||||
| `0150-stirling.yml` | `chain-app-standard` | `chain-authelia` | |
|
||||
| `0160-plex.yml` | `chain-app-standard` | `chain-authelia` | |
|
||||
| `0170-nginx.yml` | `chain-app-standard` | `chain-authelia` | |
|
||||
| `0500-jenkins.yml` | `chain-jenkins` | `chain-authelia` | |
|
||||
| `0510-gitea.yml` | – *(gar keine)* | `chain-authelia` | |
|
||||
|
||||
**Beispiel** – vorher in `0120-paperless.yml`:
|
||||
```yaml
|
||||
middlewares:
|
||||
- chain-app-standard
|
||||
```
|
||||
|
||||
**Nachher**:
|
||||
```yaml
|
||||
middlewares:
|
||||
- chain-authelia
|
||||
```
|
||||
|
||||
### Achtung: Nextcloud & Collabora
|
||||
|
||||
Nextcloud (`cloud.*`) und Collabora (`office.*`) sind in der `access_control`-Regel auf `bypass` gesetzt – sie werden von Authelia **übersprungen**, da Nextcloud seinen eigenen Login hat und Collabora nur als iFrame embedded wird.
|
||||
|
||||
Trotzdem sollte die Middleware `chain-authelia` in der Route bleiben – Traefik leitet dann einfach durch, weil Authelia `bypass` zurückgibt.
|
||||
|
||||
---
|
||||
|
||||
## OIDC-Integration (SSO für Apps mit OIDC-Support)
|
||||
|
||||
Authelia kann als **OpenID Connect (OIDC) Provider** dienen. Dienste wie Immich, Gitea und Wiki.js unterstützen OIDC nativ – dann loggst Du Dich direkt über Authelia in der jeweiligen App ein, ohne separates ForwardAuth.
|
||||
|
||||
### Architektur (OIDC vs. ForwardAuth)
|
||||
|
||||
| ForwardAuth (einfach) | OIDC (für Apps mit Support) |
|
||||
|---|---|
|
||||
| Traefik fragt Authelia bei jedem Request | App (z. B. Immich) leitet zur Anmeldung an Authelia weiter |
|
||||
| Für Dienste **ohne** eigenes Login-System | Für Dienste **mit** OIDC-Support |
|
||||
| Plex, Stirling PDF, Nginx | Immich, Gitea, Wiki.js, Grafana |
|
||||
|
||||
### 1. Authelia als OIDC-Provider aktivieren
|
||||
|
||||
In `/opt/compose/authelia/config/configuration.yml` ergänzen:
|
||||
|
||||
```yaml
|
||||
# OIDC-Provider-Konfiguration
|
||||
identity_providers:
|
||||
oidc:
|
||||
hmac_secret: <openssl rand -hex 32>
|
||||
jwks: # ⚠️ In v4.39 heißt der Key `jwks`, NICHT `issuer_private_keys`!
|
||||
- key_id: rpid
|
||||
algorithm: RS256
|
||||
key: |
|
||||
-----BEGIN PRIVATE KEY-----
|
||||
<privater RSA-Key, siehe unten>
|
||||
-----END PRIVATE KEY-----
|
||||
clients:
|
||||
# ---------------------------------------------------------------
|
||||
# Gitea
|
||||
# ---------------------------------------------------------------
|
||||
- id: gitea
|
||||
description: Gitea SSO
|
||||
secret: <openssl rand -hex 32>
|
||||
public: false
|
||||
authorization_policy: one_factor
|
||||
redirect_uris:
|
||||
- https://git.da.home-webserver.de/user/oauth2/authelia/callback
|
||||
- https://git.da.home-webserver.de/user/oauth2/Authelia/callback # Groß-/Kleinschreibung des Gitea-Provider-Namens!
|
||||
scopes:
|
||||
- openid
|
||||
- profile
|
||||
- email
|
||||
consent_mode: pre-configured # Zustimmung vorab erteilt (19.06.)
|
||||
pre_configured_consent_duration: '3 months'
|
||||
|
||||
# ---------------------------------------------------------------
|
||||
# Immich
|
||||
# ---------------------------------------------------------------
|
||||
- id: immich
|
||||
description: Immich SSO
|
||||
secret: <openssl rand -hex 32>
|
||||
public: false
|
||||
authorization_policy: one_factor
|
||||
redirect_uris:
|
||||
- https://photos.da.home-webserver.de/auth/login
|
||||
- https://photos.da.home-webserver.de/oauth2/callback
|
||||
scopes:
|
||||
- openid
|
||||
- profile
|
||||
- email
|
||||
userinfo_signing_algorithm: RS256
|
||||
|
||||
# ---------------------------------------------------------------
|
||||
# Wiki.js
|
||||
# ---------------------------------------------------------------
|
||||
- id: wikijs
|
||||
description: Wiki.js SSO
|
||||
secret: <openssl rand -hex 32>
|
||||
public: false
|
||||
authorization_policy: one_factor
|
||||
redirect_uris:
|
||||
- https://wiki.da.home-webserver.de/login
|
||||
scopes:
|
||||
- openid
|
||||
- profile
|
||||
- email
|
||||
```
|
||||
|
||||
> **RSA-Key erzeugen**:
|
||||
> ```bash
|
||||
> openssl genrsa -out /tmp/private.pem 2048
|
||||
> # Den Inhalt von /tmp/private.pem in die configuration.yml einfügen
|
||||
> # ACHTUNG: Der Footer muss exakt `-----END PRIVATE KEY-----` (5 Striche) sein, nicht `----` (4 Striche)!
|
||||
> # Sonst kann Authelia den PEM-Block nicht parsen ("no PEM block was supplied or it was malformed").
|
||||
> ```
|
||||
|
||||
> **Breaking Change in v4.39**:
|
||||
> - `issuer_private_keys` → `jwks` (wenn der alte Key verwendet wird, startet OIDC nicht)
|
||||
> - `id` → `client_id` (deprecated)
|
||||
> - `secret` → `client_secret` (deprecated)
|
||||
> - `description` → `client_name` (deprecated)
|
||||
> - Die Deprecation-Warnings sind aktuell noch funktional, werden aber in v5.0 entfernt.
|
||||
|
||||
> **redirect_uri – Groß-/Kleinschreibung beachten**:
|
||||
> Gitea verwendet den **Namen der Authentication Source** als Teil des Callback-Pfads:
|
||||
> ```
|
||||
> /user/oauth2/<Provider-Name>/callback
|
||||
> ```
|
||||
> Wenn der Provider z. B. `Authelia` heißt, ist die Callback-URL:
|
||||
> ```
|
||||
> https://git.da.home-webserver.de/user/oauth2/Authelia/callback
|
||||
> ```
|
||||
> → Beide Varianten (`authelia` und `Authelia`) in den `redirect_uris` eintragen!
|
||||
> ✅ **Erledigt** auf dem Pi5 – funktioniert seit 21:10.
|
||||
|
||||
### 2. Access-Rules anpassen
|
||||
|
||||
Dienste mit OIDC brauchen **kein** ForwardAuth mehr – sie werden auf `bypass` gesetzt, weil die Authentifizierung direkt zwischen App und Authelia (OIDC) läuft:
|
||||
|
||||
```yaml
|
||||
access_control:
|
||||
default_policy: deny
|
||||
rules:
|
||||
- domain: "auth.da.home-webserver.de"
|
||||
policy: bypass
|
||||
- domain: "cloud.da.home-webserver.de"
|
||||
policy: bypass # Nextcloud: eigener Login
|
||||
- domain: "office.da.home-webserver.de"
|
||||
policy: bypass # Collabora: iFrame
|
||||
- domain: "git.da.home-webserver.de"
|
||||
policy: bypass # Gitea: OIDC ✅ aktiv
|
||||
- domain: "photos.da.home-webserver.de"
|
||||
policy: bypass # Immich: OIDC (geplant)
|
||||
- domain: "wiki.da.home-webserver.de"
|
||||
policy: bypass # Wiki.js: OIDC (geplant)
|
||||
- domain: "traefik.da.home-webserver.de"
|
||||
policy: two_factor # Admin: ForwardAuth (geplant)
|
||||
- domain: "prometheus.da.home-webserver.de"
|
||||
policy: two_factor # Admin: ForwardAuth (geplant)
|
||||
- domain: "*.da.home-webserver.de"
|
||||
policy: one_factor # Rest: ForwardAuth
|
||||
```
|
||||
|
||||
### 3. App-Seitige Konfiguration
|
||||
|
||||
#### Immich (`.env`)
|
||||
|
||||
```properties
|
||||
# /opt/compose/immich/.env – ergänzen
|
||||
IMMICH_OIDC_ENABLED=true
|
||||
IMMICH_OIDC_ISSUER_URL=https://auth.da.home-webserver.de
|
||||
IMMICH_OIDC_CLIENT_ID=immich
|
||||
IMMICH_OIDC_CLIENT_SECRET=<gleicher secret wie in Authelia>
|
||||
IMMICH_OIDC_SCOPE=openid profile email
|
||||
IMMICH_OIDC_AUTO_REGISTER=true
|
||||
IMMICH_OIDC_SIGNING_ALGORITHM=RS256
|
||||
```
|
||||
|
||||
Danach `docker compose down && docker compose up -d` auf dem Immich-Stack.
|
||||
|
||||
#### Gitea (Web-UI)
|
||||
|
||||
1. Einstellungen → `https://git.da.home-webserver.de/admin/auths`
|
||||
2. **"Add Authentication Source"**
|
||||
- Typ: **OAuth2**
|
||||
- Name: `Authelia`
|
||||
- Provider: **OpenID Connect**
|
||||
- Client ID: `gitea`
|
||||
- Client Secret: `<gleicher secret wie in Authelia>`
|
||||
- OpenID Connect Issuer URL: `https://auth.da.home-webserver.de`
|
||||
3. Speichern
|
||||
|
||||
#### Wiki.js (Web-UI)
|
||||
|
||||
1. Einstellungen → **"Security"** → **"Authentication"**
|
||||
2. **"Add Strategy"** → **"OpenID Connect / OAuth2"**
|
||||
3. Werte:
|
||||
- Client ID: `wikijs`
|
||||
- Client Secret: `<gleicher secret wie in Authelia>`
|
||||
- Authorization URL: `https://auth.da.home-webserver.de/api/oidc/authorization`
|
||||
- Token URL: `https://auth.da.home-webserver.de/api/oidc/token`
|
||||
- User Info URL: `https://auth.da.home-webserver.de/api/oidc/userinfo`
|
||||
- Issuer URL: `https://auth.da.home-webserver.de`
|
||||
|
||||
### 4. Traefik-Middleware bei OIDC-Diensten entfernen
|
||||
|
||||
Dienste, die auf OIDC umgestellt sind, brauchen **keine** `chain-authelia`-Middleware mehr – andernfalls blockiert sich ForwardAuth und OIDC gegenseitig.
|
||||
|
||||
**In den conf.d-Dateien** die Middleware auf `bypass` setzen oder ganz entfernen:
|
||||
|
||||
```yaml
|
||||
# /opt/compose/traefik/conf.d/0130-immich.yml
|
||||
# Vorher:
|
||||
# middlewares:
|
||||
# - chain-authelia
|
||||
|
||||
# Nachher: keine Middleware (Immich macht OIDC)
|
||||
```
|
||||
|
||||
### Übersicht: ForwardAuth vs. OIDC
|
||||
|
||||
| Dienst | Auth-Methode | Middleware in Traefik | policy in Authelia |
|
||||
|---|---|---|---|
|
||||
| Traefik-Dashboard | ForwardAuth | `chain-authelia` | `two_factor` |
|
||||
| Prometheus | ForwardAuth | `chain-authelia` | `two_factor` |
|
||||
| Paperless | ForwardAuth | `chain-authelia` | `one_factor` |
|
||||
| Stirling PDF | ForwardAuth | `chain-authelia` | `one_factor` |
|
||||
| Plex | ForwardAuth | `chain-authelia` | `one_factor` |
|
||||
| Nginx | ForwardAuth | `chain-authelia` | `one_factor` |
|
||||
| Jenkins | ForwardAuth | `chain-authelia` | `one_factor` |
|
||||
| **Immich** | **OIDC** | **keine** | `bypass` |
|
||||
| **Gitea** | **OIDC** | **keine** | `bypass` |
|
||||
| **Wiki.js** | **OIDC** | **keine** | `bypass` |
|
||||
| Nextcloud | eigener Login | `chain-nextcloud` | `bypass` |
|
||||
| Collabora | iFrame-Bypass | `collabora-headers` | `bypass` |
|
||||
|
||||
---
|
||||
|
||||
## Optional: `.htpasswd`-Auth entfernen
|
||||
|
||||
Sobald Authelia läuft, können diese Konfigurationen entfallen:
|
||||
- Admin-Benutzer aus `auth/.htpasswd`
|
||||
- Middleware `auth-admin` (Basic-Auth) in `0010-middlewares.yml`
|
||||
- Middleware-Chain `chain-secure-admin`
|
||||
|
||||
---
|
||||
|
||||
## Passkey-Registrierung (erster Benutzer)
|
||||
|
||||
1. **Authelia starten** → `docker compose up -d`
|
||||
2. **Erstmalig einloggen** unter `auth.da.home-webserver.de`
|
||||
3. Nach Login → **"Security"** → **"Register Security Key"** klicken
|
||||
4. Passkey via Touch ID / Windows Hello / YubiKey registrieren
|
||||
5. Ab sofort reicht beim Login **Benutzername + Passkey** (Passwort optional)
|
||||
|
||||
---
|
||||
|
||||
## Migrationsplan (Fortschritt)
|
||||
|
||||
| Schritt | Aktion | Status |
|
||||
| ------- | -------------------------------------------------------------------- | ------ |
|
||||
| 1 | Compose + Config bereitstellen | ✅ **erledigt** |
|
||||
| 2 | `0020-authelia-middleware.yml` + `0015-authelia-service.yml` anlegen | ✅ **erledigt** |
|
||||
| 3 | OIDC-Provider aktivieren (`jwks` statt `issuer_private_keys`) | ✅ **erledigt** (20:01, 18.06.) |
|
||||
| 4 | Gitea OIDC-Auth-Source einrichten | ✅ **erledigt** (Login funktioniert) |
|
||||
| 5 | Stirling PDF als ersten Dienst via ForwardAuth schützen | ✅ **erledigt** (`chain-authelia` aktiv) |
|
||||
| 6 | WebAuthn-Passkey-Config überarbeitet (direct attestation + metadata) | ✅ **erledigt** (19.06.) |
|
||||
| 7 | OIDC consent_mode auf pre-configured gesetzt | ✅ **erledigt** (19.06.) |
|
||||
| 8 | Immich OIDC konfigurieren | ⏳ geplant |
|
||||
| 9 | Wiki.js OIDC konfigurieren | ⏳ geplant |
|
||||
| 10 | Traefik-Dashboard, Prometheus auf ForwardAuth umstellen | ⏳ geplant |
|
||||
| 11 | Paperless, Plex, Nginx, Jenkins auf ForwardAuth umstellen | ⏳ geplant |
|
||||
| 12 | `.htpasswd` und `auth-admin` entfernen | ⏳ geplant |
|
||||
|
||||
### Aktuelle Routing-Übersicht (Live vom 18.06., 20:00)
|
||||
|
||||
| Dienst | Route | Auth-Methode | Status |
|
||||
|---|---|---|---|
|
||||
| Authelia (Portal) | `auth.*` | keine (bypass) | ✅ |
|
||||
| Nextcloud | `cloud.*` | kein Auth (bypass) | ✅ |
|
||||
| Collabora | `office.*` | kein Auth (bypass) | ✅ |
|
||||
| Gitea | `git.*` | OIDC (ohne Middleware) | 🔄 Gitea-WebUI-Konfiguration ausstehend |
|
||||
| Stirling PDF | `pdf.*` | ForwardAuth (`chain-authelia`) | ✅ |
|
||||
| Immich | `photos.*` | `chain-app-standard` (offen) | ⏳ |
|
||||
| Wiki.js | `wiki.*` | `chain-app-standard` (offen) | ⏳ |
|
||||
| Paperless | `paperless.*` | `chain-app-standard` (offen) | ⏳ |
|
||||
| Plex | `music.*` | `chain-app-standard` (offen) | ⏳ |
|
||||
| Nginx | `web.*` | `chain-app-standard` (offen) | ⏳ |
|
||||
| Jenkins | `jenkins.*` | `chain-jenkins` (offen) | ⏳ |
|
||||
| Traefik Dashboard | `traefik.*` | Basic-Auth | ⏳ |
|
||||
| Prometheus | `prometheus.*` | Basic-Auth | ⏳ |
|
||||
| Grafana | `grafana.*` | Grafana-intern | – |
|
||||
|
||||
---
|
||||
|
||||
## Backup / Wiederherstellung
|
||||
|
||||
Das SQLite-DB enthält alle Benutzer-Sessions und registrierte Passkeys:
|
||||
|
||||
```bash
|
||||
# Sichern
|
||||
cp /opt/compose/authelia/config/db.sqlite3 /backup/authelia-db.sqlite3
|
||||
|
||||
# Wiederherstellen
|
||||
cp /backup/authelia-db.sqlite3 /opt/compose/authelia/config/db.sqlite3
|
||||
```
|
||||
|
||||
Die Users-Datei und Config sind YAML – ideal für Git-Versionierung.
|
||||
|
||||
---
|
||||
|
||||
## Ressourcenverbrauch (geschätzt)
|
||||
|
||||
| Metrik | Wert |
|
||||
|---|---|
|
||||
| RAM | ~50–80 MB |
|
||||
| CPU | vernachlässigbar (Go-Binary) |
|
||||
| Speicher | ~50 MB (SQLite + Config) |
|
||||
| Image-Größe | ~75 MB (linux/arm64) |
|
||||
|
||||
---
|
||||
|
||||
## Verwandte Seiten
|
||||
|
||||
- [traefik](./traefik.md) – Reverse-Proxy-Grundkonfiguration
|
||||
- [docker-services](../docker-services.md) – Alle Dienste im Überblick
|
||||
- [Authelia Dokumentation](https://www.authelia.com/configuration/)
|
||||
@@ -0,0 +1,58 @@
|
||||
# Collabora Online – Office-Dokumente
|
||||
|
||||
**Zusammenfassung**: Collabora Online ermöglicht die Bearbeitung von Office-Dokumenten (Writer, Calc, Impress) im Browser. Eingebunden in Nextcloud via WOPI-Protokoll.
|
||||
**Quellen**: `raw/Systemdaten – Raspberry PI5.md`
|
||||
**Zuletzt aktualisiert**: 2026-06-17
|
||||
|
||||
---
|
||||
|
||||
## Container
|
||||
|
||||
| Feld | Wert |
|
||||
|---|---|
|
||||
| **Image** | `collabora/code:latest-arm64` |
|
||||
| **Container-Name** | `collabora` |
|
||||
| **Restart** | `unless-stopped` |
|
||||
| **Port** | 9980 (intern) |
|
||||
|
||||
## Netzwerk
|
||||
|
||||
- `traefik` – Zugriff über Reverse Proxy
|
||||
|
||||
## Umgebungsvariablen
|
||||
|
||||
| Variable | Wert |
|
||||
|---|---|
|
||||
| `aliasgroup1` | `https://cloud.da.home-webserver.de:443` |
|
||||
| `server_name` | `office.da.home-webserver.de` |
|
||||
| `DONT_GEN_SSL_CERT` | `true` (TLS terminiert an Traefik) |
|
||||
| `frame_ancestors` | `https://cloud.da.home-webserver.de:443` |
|
||||
| `username` | `admin` ⚠️ |
|
||||
| `password` | `admin` ⚠️ |
|
||||
| `extra_params` | `--o:ssl.enable=false --o:ssl.termination=true --o:net.wopi.allowlist=127.0.0.1,172.18.[0-9]+.[0-9]+` |
|
||||
| `OO_NET_POST_ALLOW_HOST` | `127.0.0.1,172.18.[0-9]+.[0-9]+` |
|
||||
| `OO_LOGGING_LEVEL` | `warning` |
|
||||
|
||||
## Sicherheitshinweise
|
||||
|
||||
**⚠️ Das Admin-Passwort steht auf dem Standardwert `admin` – bitte umgehend ändern!**
|
||||
|
||||
## Besonderheiten
|
||||
|
||||
- **extra_hosts**: `cloud.da.home-webserver.de` → `host-gateway` (löst die Nextcloud-Domain zur Host-IP auf)
|
||||
- **security_opt**: `seccomp:unconfined` erforderlich für Collabora
|
||||
- **cap_add**: `MKNOD`
|
||||
- **Healthcheck**: Prüft `/hosting/discovery` auf Port 9980
|
||||
- **Encoded Characters**: Traefik ist für encoded Slashes konfiguriert (siehe [traefik](./traefik.md))
|
||||
|
||||
## Route (Traefik)
|
||||
|
||||
```
|
||||
Host(`office.da.home-webserver.de`) → collabora:9980
|
||||
```
|
||||
|
||||
## Verwandte Seiten
|
||||
|
||||
- [traefik](./traefik.md) – Reverse-Proxy + encoded Characters
|
||||
- [nextcloud](./nextcloud.md) – Integration als WOPI-Client
|
||||
- [docker-services](../docker-services.md)
|
||||
@@ -0,0 +1,67 @@
|
||||
# Gitea – Git-Service
|
||||
|
||||
**Zusammenfassung**: Gitea ist ein selbstgehosteter Git-Service (ähnlich GitHub/GitLab) mit MariaDB-Datenbank. Erreichbar über Traefik und SSH auf Port 2222.
|
||||
**Quellen**: 🖥️ `raw/Systemdaten – Raspberry PI5.md`, 🔌 SSH (`docker inspect gitea`)
|
||||
**Zuletzt aktualisiert**: 2026-06-17
|
||||
|
||||
---
|
||||
|
||||
## Container
|
||||
|
||||
| Container | Image | Funktion |
|
||||
|---|---|---|
|
||||
| `gitea` | `gitea/gitea:latest` | Git-Service (Port 3000 intern, SSH 2222 extern) |
|
||||
| `gitea-db-1` | `mariadb:10.11` | Datenbank |
|
||||
|
||||
## Netzwerk
|
||||
|
||||
- `traefik` – Web-Zugriff
|
||||
- `internal` – Datenbank-Kommunikation
|
||||
|
||||
## Daten-Persistenz
|
||||
|
||||
| Volume | Pfad im Container |
|
||||
|---|---|
|
||||
| `gitea_gitea` | `/data` |
|
||||
| `gitea_mariadb` | `/var/lib/mysql` |
|
||||
|
||||
## Umgebungsvariablen
|
||||
|
||||
| Variable | Wert |
|
||||
|---|---|
|
||||
| `USER_UID` | 1000 |
|
||||
| `USER_GID` | 1000 |
|
||||
| `GITEA__database__DB_TYPE` | mysql |
|
||||
| `GITEA__database__HOST` | db:3306 |
|
||||
| `GITEA__database__NAME` | gitea |
|
||||
| `GITEA__database__USER` | giteaadmin |
|
||||
|
||||
## Status
|
||||
|
||||
| Container | Status | Restart-Policy (compose.yml) |
|
||||
|---|---|---|
|
||||
| `gitea` | **Running** ✅ | `unless-stopped` (seit 17.06. ergänzt) |
|
||||
| `gitea-db-1` | Up | `always` |
|
||||
|
||||
Der Gitea-Container lief 3 Wochen nicht (`restart: no`). Am 17. Juni 2026 wurde `restart: unless-stopped` in der `docker-compose.yml` ergänzt und der Container gestartet.
|
||||
|
||||
**Hinweis**: Die alte Restart-Policy (`no`) gilt noch im laufenden Container. Für die Übernahme der neuen Policy reicht ein:
|
||||
```bash
|
||||
cd /opt/compose/gitea
|
||||
docker compose up -d
|
||||
```
|
||||
(Dadurch wird der Container mit der neuen Policy neu erstellt.)
|
||||
|
||||
## Secrets
|
||||
|
||||
Passwörter liegen in `/opt/compose/gitea/.secrets/db_pw`.
|
||||
|
||||
## SSH-Zugriff
|
||||
|
||||
Gitea ist per SSH auf Port **2222** erreichbar (nicht der Standard-Port 22).
|
||||
|
||||
## Verwandte Seiten
|
||||
|
||||
- [traefik](./traefik.md)
|
||||
- [docker-services](../docker-services.md)
|
||||
- [jenkins](./jenkins.md) – CI/CD für Gitea-Repos
|
||||
@@ -0,0 +1,39 @@
|
||||
# Immich – Foto-Management
|
||||
|
||||
**Zusammenfassung**: Immich dient als Google-Photos-Alternative mit automatischem Backup, Gesichtserkennung und ML-basierter Suche. Läuft intern (Traefik-Labels auskommentiert).
|
||||
**Quellen**: `raw/Systemdaten – Raspberry PI5.md`
|
||||
**Zuletzt aktualisiert**: 2026-06-17
|
||||
|
||||
---
|
||||
|
||||
## Container
|
||||
|
||||
| Container | Image | Funktion |
|
||||
|---|---|---|
|
||||
| `immich_server` | `ghcr.io/immich-app/immich-server:v2` | Haupt-App (REST API + Web) |
|
||||
| `immich_machine_learning` | `ghcr.io/immich-app/immich-machine-learning:v2` | ML-Suche, Gesichtserkennung |
|
||||
| `immich_redis` | `valkey/valkey:8` | Cache/Warteschlange |
|
||||
| `immich_postgres` | `ghcr.io/immich-app/postgres:14-vector` | Datenbank mit pgvector |
|
||||
|
||||
## Netzwerk
|
||||
|
||||
- `traefik` – für Reverse Proxy (Labels derzeit auskommentiert)
|
||||
- `internal` – interne Kommunikation
|
||||
|
||||
## Daten-Persistenz
|
||||
|
||||
| Typ | Pfad |
|
||||
|---|---|
|
||||
| **Upload-Speicher** | via `${UPLOAD_LOCATION}` (im `.env` definiert) |
|
||||
| **Datenbank** | via `${DB_DATA_LOCATION}` (im `.env` definiert) |
|
||||
| **ML-Cache** | Docker-Volume `immich_model-cache` |
|
||||
|
||||
## Status
|
||||
|
||||
- **Traefik-Routing ist auskommentiert** – Immich wird aktuell **nicht über den Reverse Proxy** erreicht, sondern nur intern via Port 2283.
|
||||
- Die ML-Komponente läuft auf CPU (arm64-native).
|
||||
|
||||
## Verwandte Seiten
|
||||
|
||||
- [traefik](./traefik.md)
|
||||
- [docker-services](../docker-services.md)
|
||||
@@ -0,0 +1,54 @@
|
||||
# Jenkins – CI/CD
|
||||
|
||||
**Zusammenfassung**: Jenkins automatisiert Builds und Deployments. Läuft als Root-Container mit Docker-Socket-Zugriff, um Containermanagement und Compose-Deployments zu ermöglichen.
|
||||
**Quellen**: `raw/Systemdaten – Raspberry PI5.md`
|
||||
**Zuletzt aktualisiert**: 2026-06-17
|
||||
|
||||
---
|
||||
|
||||
## Container
|
||||
|
||||
| Feld | Wert |
|
||||
|---|---|
|
||||
| **Image** | `jenkins/jenkins:lts-jdk21` |
|
||||
| **Container-Name** | `jenkins` |
|
||||
| **Restart** | `unless-stopped` |
|
||||
| **User** | `root` (für Docker-Socket-Zugriff) |
|
||||
| **Ports** | 8080 (API/Web), 50000 (Agent) |
|
||||
|
||||
## Netzwerk
|
||||
|
||||
- `traefik` – Zugriff über Reverse Proxy
|
||||
|
||||
## Volumes & Bind Mounts
|
||||
|
||||
| Host | Container | Zweck |
|
||||
|---|---|---|
|
||||
| `./data` | `/var/jenkins_home` | Jenkins-Konfiguration |
|
||||
| `/var/run/docker.sock` | `/var/run/docker.sock` | Docker-Socket (Container-Management) |
|
||||
| `/usr/bin/docker` | `/usr/bin/docker` | Docker-CLI im Container |
|
||||
| `/opt/compose` | `/opt/compose` | Zugriff auf alle Compose-Dateien zur Deployment-Automatisierung |
|
||||
|
||||
## Umgebungsvariablen
|
||||
|
||||
| Variable | Wert |
|
||||
|---|---|
|
||||
| `JENKINS_PREFIX` | `/jenkins` |
|
||||
|
||||
## Route (Traefik)
|
||||
|
||||
```
|
||||
Host(`da.home-webserver.de`) + Path(`/jenkins`) → jenkins:8080
|
||||
```
|
||||
|
||||
## Besonderheiten
|
||||
|
||||
- **Root-Zugriff**: Jenkins läuft als `root`, damit er `docker` und `docker compose` ausführen kann – insbesondere für Deployments aus Pipelines heraus.
|
||||
- **Zugriff auf `/opt/compose`**: Jenkins kann direkt auf alle Compose-Dateien zugreifen und Stacks aktualisieren.
|
||||
- **JAVA_OPTS**: Spezielle Optionen für den Betrieb hinter einem Reverse Proxy.
|
||||
|
||||
## Verwandte Seiten
|
||||
|
||||
- [traefik](./traefik.md)
|
||||
- [gitea](./gitea.md) – Git-Repository-Quelle für Jenkins-Pipelines
|
||||
- [docker-services](../docker-services.md)
|
||||
@@ -0,0 +1,52 @@
|
||||
# Monitoring-Stack
|
||||
|
||||
**Zusammenfassung**: Prometheus/Grafana-Monitoring-Stack mit Prometheus, Grafana, cAdvisor, Node-Exporter und Alertmanager. Läuft mit `restart: unless-stopped` für automatischen Neustart nach Reboot.
|
||||
**Quellen**: 🖥️ `raw/Systemdaten – Raspberry PI5.md`, 🔌 SSH (`/opt/compose/monitoring/docker-compose.yml`)
|
||||
**Zuletzt aktualisiert**: 2026-06-17
|
||||
|
||||
---
|
||||
|
||||
## Container (laufend)
|
||||
|
||||
| Container | Image | Restart-Policy |
|
||||
|---|---|---|
|
||||
| `monitoring-prometheus` | `prom/prometheus:latest` | `unless-stopped` |
|
||||
| `monitoring-grafana` | `grafana/grafana:latest` | `unless-stopped` |
|
||||
| `monitoring-alertmanager` | `prom/alertmanager:latest` | `unless-stopped` |
|
||||
| `monitoring-cadvisor` | `gcr.io/cadvisor/cadvisor:latest` | `unless-stopped` |
|
||||
| `monitoring-node-exporter` | `prom/node-exporter:latest` | `unless-stopped` |
|
||||
|
||||
## Daten-Persistenz
|
||||
|
||||
| Volume | Zweck |
|
||||
|---|---|
|
||||
| `monitoring_grafana_data` | Grafana-Dashboards und -Konfiguration |
|
||||
| `monitoring_prometheus_data` | Prometheus-Zeitreihendaten |
|
||||
|
||||
## Wiederherstellung
|
||||
|
||||
Der Stack war 3 Wochen gestoppt (ab 27. Mai 2026). Am 17. Juni 2026 wurde er wieder gestartet. Die `restart: unless-stopped`-Policy war bereits in der `docker-compose.yml` vorhanden – die Container starteten nur nicht, weil sie vor dem Reboot explizit gestoppt worden waren.
|
||||
|
||||
**Wichtige Erkenntnis**: `restart: unless-stopped` startet Container nach einem Reboot **nur dann**, wenn sie vor dem Herunterfahren nicht explizit gestoppt wurden. War ein Container mit `docker compose stop` angehalten, respektiert Docker das auch nach einem Reboot. Seit dem erneuten Start startet der Stack jetzt automatisch bei jedem Reboot.
|
||||
|
||||
## Compose-Datei
|
||||
|
||||
Die Konfiguration liegt in `/opt/compose/monitoring/docker-compose.yml` (Dateiname `docker-compose.yml`, nicht `compose.yml`).
|
||||
|
||||
## Sicherheitshinweis
|
||||
|
||||
**⚠️ Das Grafana-Admin-Passwort steht im Klartext in der `docker-compose.yml` (Umgebungsvariable `GF_SECURITY_ADMIN_PASSWORD`).** Es sollte baldmöglichst geändert werden.
|
||||
|
||||
## Manueller Start/Stopp
|
||||
|
||||
```bash
|
||||
cd /opt/compose/monitoring
|
||||
docker compose up -d # Starten
|
||||
docker compose stop # Anhalten (danach kein Autostart bei Reboot!)
|
||||
docker compose down # Entfernen (Container + Netzwerk)
|
||||
```
|
||||
|
||||
## Verwandte Seiten
|
||||
|
||||
- [docker-services](../docker-services.md)
|
||||
- [docker-grundlagen](../docker-grundlagen.md)
|
||||
@@ -0,0 +1,61 @@
|
||||
# Nextcloud
|
||||
|
||||
**Zusammenfassung**: Nextcloud läuft als Cloud-Speicher mit MariaDB, Redis-Cache und Docker-Socket-Proxy. Erreichbar unter `cloud.da.home-webserver.de`.
|
||||
**Quellen**: `raw/Systemdaten – Raspberry PI5.md`
|
||||
**Zuletzt aktualisiert**: 2026-06-17
|
||||
|
||||
---
|
||||
|
||||
## Container
|
||||
|
||||
| Container | Image | Funktion |
|
||||
|---|---|---|
|
||||
| `nextcloud` | `nextcloud:latest` | Haupt-App |
|
||||
| `nextcloud-cron` | `nextcloud:latest` | Cron-Jobs für Hintergrundaufgaben |
|
||||
| `nextcloud-db` | `mariadb:11.4` | Datenbank |
|
||||
| `nextcloud-redis` | `redis:7-alpine` | Cache (File Locking, Cache) |
|
||||
| `nextcloud-docker-proxy` | `tecnativa/docker-socket-proxy` | Docker-Socket-Proxy für Nextcloud |
|
||||
|
||||
## Netzwerk
|
||||
|
||||
- `traefik` – für den Reverse-Proxy-Zugriff
|
||||
- `internal` – interne Kommunikation (DB, Redis, Proxy)
|
||||
|
||||
## Daten-Persistenz
|
||||
|
||||
| Host-Pfad | Container-Pfad |
|
||||
|---|---|
|
||||
| `/mnt/data/nextcloud/www` | `/var/www/html` |
|
||||
| `/mnt/data/nextcloud/data` | `/var/www/html/data` |
|
||||
| `/mnt/data/nextcloud/db` | `/var/lib/mysql` |
|
||||
|
||||
## Umgebungsvariablen
|
||||
|
||||
| Variable | Wert |
|
||||
|---|---|
|
||||
| `NEXTCLOUD_TRUSTED_DOMAINS` | `cloud.da.home-webserver.de` |
|
||||
| `OVERWRITEHOST` | `cloud.da.home-webserver.de` |
|
||||
| `OVERWRITEPROTOCOL` | `https` |
|
||||
| `TRUSTED_PROXIES` | `traefik 172.18.0.0/16` |
|
||||
| `PHP_MEMORY_LIMIT` | 1024M |
|
||||
| `UPLOAD_MAX_FILESIZE` | 1024M |
|
||||
| `MYSQL_DATABASE` | `nextcloud` |
|
||||
| `MYSQL_USER` | `nextclouduser` |
|
||||
|
||||
## Routen (Traefik File Provider)
|
||||
|
||||
```
|
||||
Host(`cloud.da.home-webserver.de`) → nextcloud:80
|
||||
```
|
||||
|
||||
## Besonderheiten
|
||||
|
||||
- Die Daten liegen **nicht in Docker-Volumes**, sondern als **Bind Mounts** auf der LUKS-Partition `/mnt/data/`
|
||||
- Der Docker-Socket-Proxy (`tecnativa/docker-socket-proxy`) erlaubt Nextcloud, Container zu verwalten (z. B. für Talk oder Office-Integration)
|
||||
- Secrets (Passwörter) liegen in `/opt/compose/nextcloud/.secrets/`
|
||||
|
||||
## Verwandte Seiten
|
||||
|
||||
- [traefik](./traefik.md) – Reverse-Proxy-Konfiguration
|
||||
- [docker-services](../docker-services.md) – Alle Dienste
|
||||
- [laufwerke-und-speicher](../laufwerke-und-speicher.md) – Daten liegen auf `/mnt/data`
|
||||
@@ -0,0 +1,37 @@
|
||||
# Nginx – Static Webserver
|
||||
|
||||
**Zusammenfassung**: Ein minimalistischer Nginx-Container für statische Webseiten. Läuft mit `nginx:alpine` und wird über Traefik angesteuert.
|
||||
**Quellen**: `raw/Systemdaten – Raspberry PI5.md`
|
||||
**Zuletzt aktualisiert**: 2026-06-17
|
||||
|
||||
---
|
||||
|
||||
## Container
|
||||
|
||||
| Feld | Wert |
|
||||
|---|---|
|
||||
| **Image** | `nginx:alpine` |
|
||||
| **Container-Name** | `nginx_pi5` |
|
||||
| **Restart** | `unless-stopped` |
|
||||
|
||||
## Netzwerk
|
||||
|
||||
- `traefik` – Zugriff über Reverse Proxy
|
||||
|
||||
## Volumes
|
||||
|
||||
| Host | Container | Zweck |
|
||||
|---|---|---|
|
||||
| `./html` | `/usr/share/nginx/html:ro` | Statische HTML-Dateien |
|
||||
| `./config` | `/etc/nginx/conf.d:ro` | Nginx-Konfiguration |
|
||||
| `./logs` | `/var/log/nginx` | Log-Dateien |
|
||||
|
||||
## Besonderheiten
|
||||
|
||||
- Keine direkten Port-Mappings – die Kommunikation läuft **ausschließlich über das Traefik-Netzwerk**.
|
||||
- Port 80 wird nur intern im Docker-Netzwerk bereitgestellt.
|
||||
|
||||
## Verwandte Seiten
|
||||
|
||||
- [traefik](./traefik.md)
|
||||
- [docker-services](../docker-services.md)
|
||||
@@ -0,0 +1,37 @@
|
||||
# Paperless-ngx – Dokumentenmanagement
|
||||
|
||||
**Zusammenfassung**: Paperless-ngx archiviert, verschlagwortet und durchsucht Dokumente automatisch. Inklusive OCR via Tika und Gotenberg für Office-Konvertierung.
|
||||
**Quellen**: `raw/Systemdaten – Raspberry PI5.md`
|
||||
**Zuletzt aktualisiert**: 2026-06-17
|
||||
|
||||
---
|
||||
|
||||
## Container
|
||||
|
||||
| Container | Image | Funktion |
|
||||
| ----------------------- | -------------------------------------------- | --------------------------------- |
|
||||
| `paperless-webserver-1` | `ghcr.io/paperless-ngx/paperless-ngx:latest` | Haupt-App (Port 8000) |
|
||||
| `paperless-db-1` | `postgres:18` | Datenbank |
|
||||
| `paperless-broker-1` | `redis:8` | Nachrichten-Warteschlange |
|
||||
| `paperless-gotenberg-1` | `gotenberg/gotenberg:8.25` | Office-Dokument-Konvertierung |
|
||||
| `paperless-tika-1` | `apache/tika:latest` | Apache Tika (Metadata-Extraktion) |
|
||||
|
||||
## Netzwerk
|
||||
|
||||
- `paperless_default` – Externes Netzwerk (für Traefik)
|
||||
- `paperless_internal` – Interne Kommunikation
|
||||
|
||||
## Daten-Persistenz
|
||||
|
||||
Alle Daten in Docker-Volumes (keine Bind Mounts auf LUKS-Partition).
|
||||
|
||||
## Besonderheiten
|
||||
|
||||
- **Gotenberg** wandelt Office-Dateien (DOCX, XLSX) in PDF um
|
||||
- **Tika** extrahiert Metadaten und Text aus Dokumenten
|
||||
- Alle Dienste mit `restart: unless-stopped` konfiguriert
|
||||
|
||||
## Verwandte Seiten
|
||||
|
||||
- [traefik](./traefik.md)
|
||||
- [docker-services](../docker-services.md)
|
||||
@@ -0,0 +1,40 @@
|
||||
# Plex – Media Server
|
||||
|
||||
**Zusammenfassung**: Plex Media Server streamt Filme, Serien und Musik. Läuft mit LinuxServer.io-Image und direktem Port-Mapping (kein Traefik).
|
||||
**Quellen**: `raw/Systemdaten – Raspberry PI5.md`
|
||||
**Zuletzt aktualisiert**: 2026-06-17
|
||||
|
||||
---
|
||||
|
||||
## Container
|
||||
|
||||
| Feld | Wert |
|
||||
|---|---|
|
||||
| **Image** | `lscr.io/linuxserver/plex:latest` |
|
||||
| **Container-Name** | `plex` |
|
||||
| **Restart** | `unless-stopped` |
|
||||
| **Netzwerk** | Traefik (nicht aktiv genutzt) |
|
||||
|
||||
## Exponierte Ports
|
||||
|
||||
| Port | Protokoll | Zweck |
|
||||
|---|---|---|
|
||||
| 32400 | TCP | Plex Web UI |
|
||||
| 1900 | UDP | DLNA |
|
||||
| 5353 | UDP | MDNS |
|
||||
| 8324 | TCP | Roku-Unterstützung |
|
||||
| 32410-32414 | UDP | DLNA |
|
||||
| 32469 | TCP | DLNA |
|
||||
|
||||
## Daten
|
||||
|
||||
- **Konfiguration**: Docker-Volume `plex_plex_config`
|
||||
|
||||
## Besonderheiten
|
||||
|
||||
- Plex wird **nicht über Traefik** geroutet, sondern direkt über Port 32400 angesprochen.
|
||||
- Läuft stabil seit > 25h (zum Zeitpunkt der Erfassung).
|
||||
|
||||
## Verwandte Seiten
|
||||
|
||||
- [docker-services](../docker-services.md)
|
||||
@@ -0,0 +1,25 @@
|
||||
# Stirling PDF – PDF-Bearbeitung
|
||||
|
||||
**Zusammenfassung**: Stirling PDF ist ein webbasiertes PDF-Werkzeug (Zusammenführen, Teilen, Konvertieren, OCR, Bearbeiten). Läuft als eigenständiger Container.
|
||||
**Quellen**: `raw/Systemdaten – Raspberry PI5.md`
|
||||
**Zuletzt aktualisiert**: 2026-06-17
|
||||
|
||||
---
|
||||
|
||||
## Container
|
||||
|
||||
| Feld | Wert |
|
||||
|---|---|
|
||||
| **Image** | `frooodle/s-pdf:latest` |
|
||||
| **Container-Name** | `stirling-pdf` |
|
||||
| **Restart** | `unless-stopped` |
|
||||
| **Port (intern)** | 8080 |
|
||||
| **Status** | ✅ Up 25h (healthy) |
|
||||
|
||||
## Netzwerk
|
||||
|
||||
- Nicht sichtbar im Traefik-Netzwerk – vermutlich Direktzugriff oder über nginx.
|
||||
|
||||
## Verwandte Seiten
|
||||
|
||||
- [docker-services](../docker-services.md)
|
||||
@@ -0,0 +1,151 @@
|
||||
# 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)
|
||||
@@ -0,0 +1,35 @@
|
||||
# Wiki.js – Wissensdatenbank
|
||||
|
||||
**Zusammenfassung**: Wiki.js ist eine moderne Wiki-Plattform mit PostgreSQL-Datenbank. Bietet Markdown-Editor, Versionierung und Zugriffskontrolle.
|
||||
**Quellen**: `raw/Systemdaten – Raspberry PI5.md`
|
||||
**Zuletzt aktualisiert**: 2026-06-17
|
||||
|
||||
---
|
||||
|
||||
## Container
|
||||
|
||||
| Container | Image | Funktion |
|
||||
|---|---|---|
|
||||
| `wikijs` | `requarks/wiki:2` | Wiki-App (Port 3000, 3443) |
|
||||
| `wikijs-db` | `postgres:16` | Datenbank |
|
||||
|
||||
## Netzwerk
|
||||
|
||||
- `wikijs_default` – Extern (für Traefik)
|
||||
- Kein separates internes Netzwerk sichtbar
|
||||
|
||||
## Daten-Persistenz
|
||||
|
||||
| Volume | Pfad im Container |
|
||||
|---|---|
|
||||
| `wikijs_wikijs_db` | `/var/lib/postgresql/data` |
|
||||
|
||||
## Besonderheiten
|
||||
|
||||
- Läuft stabil seit > 25h (zum Zeitpunkt der Erfassung)
|
||||
- Verwendet das `requarks/wiki:2`-Image (stabile Major-Version 2)
|
||||
|
||||
## Verwandte Seiten
|
||||
|
||||
- [traefik](./traefik.md)
|
||||
- [docker-services](../docker-services.md)
|
||||
Reference in New Issue
Block a user