Docs: translate README and guides to German
README and all guides under docs/ are now in German, with German anchors for the cross references. Code and configuration blocks are unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
2e3f79236c
commit
019c74a418
8 files changed
+469
-463
No files matched your search
+77
-77
@@ -1,12 +1,12 @@
|
||||
# Configuration
|
||||
# Konfiguration
|
||||
|
||||
The web UI is configured with environment variables (`.env`, loaded via `env_file:`) and
|
||||
the host list `config/hosts.yaml`. A complete, commented template is
|
||||
[`examples/.env.example`](../examples/.env.example). Changes need
|
||||
`docker compose up -d` (which recreates the container).
|
||||
Die Weboberfläche wird über Umgebungsvariablen (`.env`, geladen per `env_file:`) und die
|
||||
Hostliste `config/hosts.yaml` konfiguriert. Eine vollständige, kommentierte Vorlage ist
|
||||
[`examples/.env.example`](../examples/.env.example). Änderungen brauchen
|
||||
`docker compose up -d` (das legt den Container neu an).
|
||||
|
||||
Values containing `$` (password hashes, some secrets) must be wrapped in **single quotes**
|
||||
in `.env`, otherwise Docker Compose expands them.
|
||||
Werte mit `$` (Passwort-Hashes, manche Secrets) müssen in der `.env` in **einfachen
|
||||
Anführungszeichen** stehen, sonst wertet Docker Compose sie als Variablen aus.
|
||||
|
||||
## Hosts – config/hosts.yaml
|
||||
|
||||
@@ -18,7 +18,7 @@ hosts:
|
||||
user: f2bweb # optional, default SSH_USER
|
||||
```
|
||||
|
||||
After adding a host run `keyscan` again, then restart:
|
||||
Nach dem Hinzufügen eines Hosts `keyscan` erneut ausführen, dann neu starten:
|
||||
|
||||
```bash
|
||||
docker compose run --rm -it fail2ban-webui keyscan
|
||||
@@ -26,99 +26,99 @@ docker compose run --rm fail2ban-webui check
|
||||
docker compose up -d --force-recreate
|
||||
```
|
||||
|
||||
`F2B_HOSTS=name=address,name2=address2` (port 22, user `SSH_USER`) is still accepted for
|
||||
compatibility; entries from both are combined.
|
||||
`F2B_HOSTS=name=adresse,name2=adresse2` (Port 22, Benutzer `SSH_USER`) wird aus
|
||||
Kompatibilitätsgründen weiter akzeptiert; Einträge aus beiden Quellen werden zusammengeführt.
|
||||
|
||||
## General
|
||||
## Allgemein
|
||||
|
||||
| Variable | Default | Meaning |
|
||||
| Variable | Standard | Bedeutung |
|
||||
|---|---|---|
|
||||
| `PUBLIC_URL` | – | external URL, e.g. `https://fail2ban.example.org`. Required for OIDC; with `https://` session cookies get the `Secure` flag |
|
||||
| `DEFAULT_LANG` | `en` | language until a user picks one in the dropdown (`en`, `de`, …) |
|
||||
| `TRUSTED_PROXY_HOPS` | `0` | number of reverse proxies whose `X-Forwarded-For`/`-Proto` headers are trusted. Behind one proxy: `1`. Wrong values make the audit log and the login lockout use the wrong client IP |
|
||||
| `SESSION_HOURS` | `12` | session lifetime |
|
||||
| `SESSION_COOKIE_SECURE` | from `PUBLIC_URL` | force the `Secure` cookie flag on/off |
|
||||
| `SECRET_KEY` | generated | key that signs session cookies; by default created once in `data/secret_key` |
|
||||
| `TZ` | `Europe/Vienna` (compose) | time zone of the log and audit timestamps |
|
||||
| `CONFIG_FILE` | `/config/hosts.yaml` | path of the host list inside the container |
|
||||
| `DATA_DIR` | `/data` | data directory inside the container |
|
||||
| `PUBLIC_URL` | – | externe URL, z. B. `https://fail2ban.example.org`. Pflicht für OIDC; mit `https://` bekommen Sitzungs-Cookies das `Secure`-Flag |
|
||||
| `DEFAULT_LANG` | `en` | Sprache, solange ein Benutzer im Dropdown keine gewählt hat (`en`, `de`, …) |
|
||||
| `TRUSTED_PROXY_HOPS` | `0` | Anzahl der Reverse Proxys, deren `X-Forwarded-For`/`-Proto`-Header vertraut wird. Hinter einem Proxy: `1`. Falsche Werte führen dazu, dass Protokoll und Login-Sperre die falsche Client-IP verwenden |
|
||||
| `SESSION_HOURS` | `12` | Gültigkeit einer Sitzung |
|
||||
| `SESSION_COOKIE_SECURE` | aus `PUBLIC_URL` | `Secure`-Flag des Cookies erzwingen oder abschalten |
|
||||
| `SECRET_KEY` | wird erzeugt | Schlüssel zum Signieren der Sitzungs-Cookies; standardmäßig einmalig in `data/secret_key` angelegt |
|
||||
| `TZ` | `Europe/Vienna` (Compose) | Zeitzone für Log- und Protokoll-Zeitstempel |
|
||||
| `CONFIG_FILE` | `/config/hosts.yaml` | Pfad der Hostliste im Container |
|
||||
| `DATA_DIR` | `/data` | Datenverzeichnis im Container |
|
||||
|
||||
## Authentication
|
||||
## Anmeldung
|
||||
|
||||
See [authentication.md](authentication.md) for the complete setup.
|
||||
Die vollständige Einrichtung steht in [authentication.md](authentication.md).
|
||||
|
||||
| Variable | Default | Meaning |
|
||||
| Variable | Standard | Bedeutung |
|
||||
|---|---|---|
|
||||
| `AUTH_MODE` | `local` | `local`, `oidc`, `local,oidc` or `proxy` |
|
||||
| `AUTH_USER` | `admin` | local user name |
|
||||
| `AUTH_PASSWORD_HASH` | – | scrypt hash from `hash-password` (single quotes!) |
|
||||
| `AUTH_PASSWORD_HASH_FILE` | – | alternative: file containing the hash (e.g. a Docker secret) |
|
||||
| `LOGIN_MAX_ATTEMPTS` | `5` | failed logins per client IP before the lockout |
|
||||
| `LOGIN_LOCK_MINUTES` | `15` | duration of the lockout window |
|
||||
| `OIDC_ISSUER` | – | issuer URL; the discovery document is read from `<issuer>/.well-known/openid-configuration` |
|
||||
| `OIDC_DISCOVERY_URL` | – | full discovery URL instead of `OIDC_ISSUER` |
|
||||
| `OIDC_CLIENT_ID` / `OIDC_CLIENT_SECRET` | – | client credentials |
|
||||
| `OIDC_SCOPES` | `openid email profile` | requested scopes |
|
||||
| `OIDC_USERNAME_CLAIM` | `preferred_username` | claim shown as user name (falls back to `email`, then `sub`) |
|
||||
| `OIDC_GROUPS_CLAIM` | `groups` | claim with the group list |
|
||||
| `OIDC_ALLOWED_GROUPS` | – | only members of these groups may sign in (comma separated) |
|
||||
| `OIDC_ALLOWED_USERS` | – | only these user names may sign in |
|
||||
| `OIDC_BUTTON_LABEL` | `SSO` | text on the login button ("Sign in with …") |
|
||||
| `AUTH_PROXY_ALLOWED_IPS` | – | proxy mode: only accept requests from these addresses/networks |
|
||||
| `AUTH_PROXY_HEADER` | – | proxy mode: header with the user name, e.g. `X-authentik-username` |
|
||||
| `AUTH_PROXY_LOGOUT_URL` | – | proxy mode: target of the "Sign out" button |
|
||||
| `AUTH_MODE` | `local` | `local`, `oidc`, `local,oidc` oder `proxy` |
|
||||
| `AUTH_USER` | `admin` | lokaler Benutzername |
|
||||
| `AUTH_PASSWORD_HASH` | – | scrypt-Hash aus `hash-password` (einfache Anführungszeichen!) |
|
||||
| `AUTH_PASSWORD_HASH_FILE` | – | Alternative: Datei mit dem Hash (z. B. ein Docker-Secret) |
|
||||
| `LOGIN_MAX_ATTEMPTS` | `5` | Fehlversuche pro Client-IP bis zur Sperre |
|
||||
| `LOGIN_LOCK_MINUTES` | `15` | Dauer des Sperrfensters |
|
||||
| `OIDC_ISSUER` | – | Issuer-URL; das Discovery-Dokument wird von `<issuer>/.well-known/openid-configuration` gelesen |
|
||||
| `OIDC_DISCOVERY_URL` | – | vollständige Discovery-URL statt `OIDC_ISSUER` |
|
||||
| `OIDC_CLIENT_ID` / `OIDC_CLIENT_SECRET` | – | Client-Zugangsdaten |
|
||||
| `OIDC_SCOPES` | `openid email profile` | angeforderte Scopes |
|
||||
| `OIDC_USERNAME_CLAIM` | `preferred_username` | Claim, der als Benutzername angezeigt wird (Rückfall auf `email`, dann `sub`) |
|
||||
| `OIDC_GROUPS_CLAIM` | `groups` | Claim mit der Gruppenliste |
|
||||
| `OIDC_ALLOWED_GROUPS` | – | nur Mitglieder dieser Gruppen dürfen sich anmelden (durch Komma getrennt) |
|
||||
| `OIDC_ALLOWED_USERS` | – | nur diese Benutzernamen dürfen sich anmelden |
|
||||
| `OIDC_BUTTON_LABEL` | `SSO` | Text auf dem Anmeldeknopf („Anmelden mit …") |
|
||||
| `AUTH_PROXY_ALLOWED_IPS` | – | Proxy-Modus: nur Anfragen von diesen Adressen/Netzen annehmen |
|
||||
| `AUTH_PROXY_HEADER` | – | Proxy-Modus: Header mit dem Benutzernamen, z. B. `X-authentik-username` |
|
||||
| `AUTH_PROXY_LOGOUT_URL` | – | Proxy-Modus: Ziel des „Abmelden"-Knopfs |
|
||||
|
||||
## Agents (SSH)
|
||||
## Agenten (SSH)
|
||||
|
||||
| Variable | Default | Meaning |
|
||||
| Variable | Standard | Bedeutung |
|
||||
|---|---|---|
|
||||
| `SSH_USER` | `f2bweb` | default user for hosts without `user:` |
|
||||
| `SSH_KEY` | `/data/ssh/id_ed25519` | private key |
|
||||
| `KNOWN_HOSTS` | `/data/ssh/known_hosts` | pinned host keys (written by `keyscan`) |
|
||||
| `SSH_TIMEOUT` | `40` | seconds per agent call |
|
||||
| `CACHE_SECONDS` | `15` | how long the ban list is cached between page refreshes |
|
||||
| `MANUAL_JAIL` | `manual-block` | jail name shown in the UI hint – the agent decides the real jail (`/etc/f2b-webctl.conf`) |
|
||||
| `AUDIT_LOG` | `/data/audit.log` | audit log (JSON lines) |
|
||||
| `SSH_USER` | `f2bweb` | Standardbenutzer für Hosts ohne `user:` |
|
||||
| `SSH_KEY` | `/data/ssh/id_ed25519` | privater Schlüssel |
|
||||
| `KNOWN_HOSTS` | `/data/ssh/known_hosts` | festgelegte Host-Schlüssel (geschrieben von `keyscan`) |
|
||||
| `SSH_TIMEOUT` | `40` | Sekunden pro Agent-Aufruf |
|
||||
| `CACHE_SECONDS` | `15` | wie lange die Sperrliste zwischen zwei Seitenaufrufen zwischengespeichert wird |
|
||||
| `MANUAL_JAIL` | `manual-block` | Jail-Name im Hinweis der Oberfläche – das tatsächliche Jail bestimmt der Agent (`/etc/f2b-webctl.conf`) |
|
||||
| `AUDIT_LOG` | `/data/audit.log` | Protokoll (JSON-Zeilen) |
|
||||
|
||||
The SSH client ignores the system `ssh_config`, uses only the configured key, never
|
||||
asks questions and refuses unknown host keys.
|
||||
Der SSH-Client ignoriert die System-`ssh_config`, verwendet nur den konfigurierten
|
||||
Schlüssel, stellt nie Rückfragen und lehnt unbekannte Host-Schlüssel ab.
|
||||
|
||||
## GeoIP
|
||||
|
||||
| Variable | Default | Meaning |
|
||||
| Variable | Standard | Bedeutung |
|
||||
|---|---|---|
|
||||
| `GEOIP_AUTO_DOWNLOAD` | `0` | `1`: download the free [DB-IP Lite](https://db-ip.com/db/lite.php) city database (CC BY 4.0) and refresh it monthly |
|
||||
| `GEOIP_DB` | `/data/geoip/dbip-city-lite.mmdb` | path of the database – any MaxMind-format city database works (e.g. GeoLite2 City) |
|
||||
| `GEOIP_AUTO_DOWNLOAD` | `0` | `1`: die freie Städte-Datenbank [DB-IP Lite](https://db-ip.com/db/lite.php) (CC BY 4.0) herunterladen und monatlich erneuern |
|
||||
| `GEOIP_DB` | `/data/geoip/dbip-city-lite.mmdb` | Pfad der Datenbank – jede Städte-Datenbank im MaxMind-Format funktioniert (z. B. GeoLite2 City) |
|
||||
|
||||
With a city database the UI also shows the **origin map** (country-only databases have no
|
||||
coordinates). The map is bundled with the app (Natural Earth, public domain) – no external
|
||||
tile server is contacted. Without a database the "Origin" column stays empty and the map
|
||||
is hidden.
|
||||
Mit einer Städte-Datenbank zeigt die Oberfläche auch die **Herkunftskarte** (Datenbanken
|
||||
nur mit Ländern haben keine Koordinaten). Die Karte ist Teil der App (Natural Earth, Public
|
||||
Domain) – es wird kein externer Kartendienst abgefragt. Ohne Datenbank bleibt die Spalte
|
||||
„Herkunft" leer und die Karte ausgeblendet.
|
||||
|
||||
## Loki and Grafana
|
||||
## Loki und Grafana
|
||||
|
||||
With Loki the UI gets a **History** button per IP showing the matching log lines of the
|
||||
last days; with Grafana every ban gets a link to Explore.
|
||||
Mit Loki bekommt die Oberfläche pro IP einen **Verlauf**-Knopf mit den passenden Logzeilen
|
||||
der letzten Tage; mit Grafana bekommt jede Sperre einen Link nach Explore.
|
||||
|
||||
| Variable | Default | Meaning |
|
||||
| Variable | Standard | Bedeutung |
|
||||
|---|---|---|
|
||||
| `LOKI_URL` | – | e.g. `http://loki:3100`; empty = history disabled |
|
||||
| `LOKI_SELECTOR` | `{job=~".+"}` | LogQL stream selector for the search, e.g. `{job=~"fail2ban\|sshd\|nginx"}` |
|
||||
| `LOKI_DAYS` | `7` | how far back to search |
|
||||
| `LOKI_LIMIT` | `50` | maximum lines |
|
||||
| `LOKI_USER` / `LOKI_PASSWORD` | – | basic auth |
|
||||
| `LOKI_TENANT` | – | `X-Scope-OrgID` for multi-tenant Loki |
|
||||
| `GRAFANA_URL` | – | e.g. `https://grafana.example.org` |
|
||||
| `GRAFANA_DASHBOARD` | – | path of a dashboard for the header link, e.g. `/d/abc123/security` |
|
||||
| `GRAFANA_LOKI_UID` | `loki` | UID of the Loki data source in Grafana (for Explore links) |
|
||||
| `LOKI_URL` | – | z. B. `http://loki:3100`; leer = Verlauf ausgeschaltet |
|
||||
| `LOKI_SELECTOR` | `{job=~".+"}` | LogQL-Stream-Selektor für die Suche, z. B. `{job=~"fail2ban\|sshd\|nginx"}` |
|
||||
| `LOKI_DAYS` | `7` | wie weit zurück gesucht wird |
|
||||
| `LOKI_LIMIT` | `50` | maximale Anzahl Zeilen |
|
||||
| `LOKI_USER` / `LOKI_PASSWORD` | – | Basic Auth |
|
||||
| `LOKI_TENANT` | – | `X-Scope-OrgID` für mandantenfähiges Loki |
|
||||
| `GRAFANA_URL` | – | z. B. `https://grafana.example.org` |
|
||||
| `GRAFANA_DASHBOARD` | – | Pfad eines Dashboards für den Link in der Kopfzeile, z. B. `/d/abc123/security` |
|
||||
| `GRAFANA_LOKI_UID` | `loki` | UID der Loki-Datenquelle in Grafana (für Explore-Links) |
|
||||
|
||||
Example – exclude the UI's own access log from the search:
|
||||
Beispiel – das eigene Zugriffslog der Oberfläche von der Suche ausnehmen:
|
||||
|
||||
```ini
|
||||
LOKI_SELECTOR={job=~"fail2ban|ufw|nginx|sshd", domain!="fail2ban.example.org"}
|
||||
```
|
||||
|
||||
## Agent settings
|
||||
## Agent-Einstellungen
|
||||
|
||||
Protected addresses and the manual jail are configured **on each host** in
|
||||
`/etc/f2b-webctl.conf` – see [agent.md](agent.md#configuration--etcf2b-webctlconf).
|
||||
Geschützte Adressen und das manuelle Jail werden **auf jedem Host** in
|
||||
`/etc/f2b-webctl.conf` eingestellt – siehe [agent.md](agent.md#konfiguration--etcf2b-webctlconf).
|
||||
Reference in new issue
Block a user