commit 1bb79dc5a5ac3f53212ea51c36166cfdf717c8f7 Author: da@desktop Date: Fri Jun 19 23:18:04 2026 +0200 Inital commit diff --git a/PI2/Allgemein/hardware.md b/PI2/Allgemein/hardware.md new file mode 100644 index 0000000..bba4b54 --- /dev/null +++ b/PI2/Allgemein/hardware.md @@ -0,0 +1,58 @@ +# Hardware – Raspberry PI2 + +**Zusammenfassung**: Der `hoobs` ist ein Raspberry Pi 2 Model B Rev 1.1 mit 921 MB RAM, passiver Kühlung und drei USB-Geräten. Läuft bei ~58 °C CPU-Temperatur. +**Quellen**: 🔌 SSH (`/proc/cpuinfo`, `lsusb`, `/sys/class/thermal/`) +**Zuletzt aktualisiert**: 2026-06-19 + +--- + +## Modell + +| Merkmal | Wert | +|---|---| +| **Modell** | Raspberry Pi 2 Model B Rev 1.1 (BCM2835) | +| **CPU** | ARM Cortex-A7 (4 Kerne, armv7l, 32-bit) | +| **CPU-Takt** | 600–900 MHz (max: 900 MHz) | +| **BogoMIPS** | 57.60 pro Kern | +| **Features** | half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm | +| **RAM** | 921 MiB | +| **Architektur** | 32-bit (armv7l) | + +## Temperatur & Kühlung + +- **CPU-Temperatur**: ~58 °C (Quelle: `/sys/class/thermal/thermal_zone0/temp`) +- **Throttling**: Keines (`throttled=0x0`) +- Der PI2 ist **passiv gekühlt** (kein Lüfter) + +## Angeschlossene Hardware (USB) + +| Bus | Gerät | ID | Beschreibung | +|---|---|---|---| +| Bus 001 | Device 006 | `0bc2:2322` | **Seagate RSS LLC SRD0NF1 Expansion Portable (STEA)** – 1,8-TB-USB-Festplatte | +| Bus 001 | Device 005 | `0a5c:21e8` | **Broadcom BCM20702A0 Bluetooth 4.0** | +| Bus 001 | Device 004 | `0781:5583` | **SanDisk Ultra Fit** – 57-GB-USB-Stick | +| Bus 001 | Device 003 | `0424:ec00` | **SMSC LAN9512/LAN9514** – Ethernet-Adapter (integriert) | +| Bus 001 | Device 002 | `0424:9514` | **SMSC SMC9514 Hub** – USB-Hub (integriert) | + +## Boot-Konfiguration (`/boot/config.txt`) + +``` +dtparam=audio=on +camera_auto_detect=1 +display_auto_detect=1 +dtoverlay=vc4-kms-v3d +max_framebuffers=2 +disable_overscan=1 +[pi4] +arm_boost=1 +[all] +avoid_warnings=1 +disable_splash=1 +``` + +Hinweis: `arm_boost=1` steht im `[pi4]`-Block, wird auf dem PI2 aber ignoriert (gilt nur für Pi4). + +## Verwandte Seiten + +- [systemuebersicht](../Konfiguration/systemuebersicht.md) +- [laufwerke-und-speicher](../Konfiguration/laufwerke-und-speicher.md) diff --git a/PI2/Allgemein/netzwerk.md b/PI2/Allgemein/netzwerk.md new file mode 100644 index 0000000..21b2fea --- /dev/null +++ b/PI2/Allgemein/netzwerk.md @@ -0,0 +1,76 @@ +# Netzwerk – Raspberry PI2 + +**Zusammenfassung**: Der PI2 `hoobs` ist per Kabel (eth0) an die FritzBox angebunden. DNS läuft lokal über Pi-hole, Netzwerkkonfiguration via NetworkManager. +**Quellen**: 🔌 SSH (`ip addr`, `ss -tlnp`, `cat /etc/resolv.conf`) +**Zuletzt aktualisiert**: 2026-06-19 + +--- + +## Schnittstellen + +| Interface | IP | Typ | Status | +|---|---|---|---| +| `eth0` | `192.168.178.44/24` | Kabel (einzige) | UP | +| `lo` | `127.0.0.1/8` | Loopback | UP | + +Gateway/Subnetz: `192.168.178.0/24`, Standard-Gateway `192.168.178.1` (FritzBox). + +Hinweis: Kein WLAN – der PI2 hat kein integriertes WLAN-Modul. + +## DNS + +- **Namensserver**: `192.168.178.1` (FritzBox – leitet zu Pi-hole auf localhost weiter) +- **Suchdomain**: `fritz.box` +- **Hostname**: `hoobs` +- **Pi-hole**: Läuft auf Port 53 (UDP/TCP) auf localhost +- **/etc/hosts**: `127.0.1.1 hoobs` + +## Öffentliche Dienste + +Der PI2 hat **keine öffentlichen Dienste über das Internet** – alle Dienste sind nur im LAN verfügbar. Kein Traefik, kein Reverse Proxy für externe Subdomains. + +| Dienst | Port | Protokoll | Beschreibung | +|---|---|---|---| +| HOOBS Web UI | 3000 | HTTP | Smart-Home-Oberfläche (node) | +| HOOBS Helm UI | 9090 | HTTP | HOOBS Helm-Interface (node) | +| Music Social API | 3010 | HTTP | Spotify/Music API Proxy (node) | +| Apache HTTP | 80 | HTTP | Default-Webserver | +| Apache HTTPS | 443 | HTTPS | Standard-SSL | +| SAP UI5 App | 65443 | HTTPS | Apache-VHost mit SAP-UI5 (self-signed) | +| Apache Sonstige | 8080 | HTTP | Zusätzlicher Apache-Port | +| Pi-hole DNS | 53 | UDP/TCP | DNS-Adblocker | +| Samba SMB | 445 | TCP | Dateifreigaben (Windows-Netzwerk) | +| Samba NetBIOS | 139 | TCP | NetBIOS Session | +| SSH | 22 | TCP | SSH-Server | + +## Offene Ports (Listening) + +| Port | Dienst | Bemerkung | +|---|---|---| +| `22/tcp` | SSH (sshd) | Nur per SSH-Key | +| `53/udp+tcp` | Pi-hole FTL | DNS (nur LAN) | +| `80/tcp` | Apache | HTTP Default | +| `139/tcp` | Samba NetBIOS | | +| `443/tcp` | Apache | HTTPS Standard | +| `445/tcp` | Samba SMB | | +| `3000/tcp` | Node (HOOBS) | HOOBS Web UI | +| `3010/tcp` | Node (Music API) | Spotify Proxy | +| `8080/tcp` | Apache | Zusätzlich | +| `9090/tcp` | Node (Helm) | HOOBS Helm UI | +| `65443/tcp` | Apache | SAP UI5 (HTTPS, self-signed) | + +(Quelle: `ss -tlnp`) + +Zusätzlich mehrere hochrangige Ports (51826–65080) – vermutlich HOOBS-Child-Prozesse. + +## Firewall + +- **ufw**: **Aktiv** (dmesg zeigt viele `[UFW BLOCK]`-Einträge) + +## Verwandte Seiten + +- [systemuebersicht](../Konfiguration/systemuebersicht.md) +- [sicherheit](./sicherheit.md) +- [pihole](../Konfiguration/dienste/pihole.md) +- [apache](../Konfiguration/dienste/apache.md) +- [samba](../Konfiguration/dienste/samba.md) diff --git a/PI2/Allgemein/sicherheit.md b/PI2/Allgemein/sicherheit.md new file mode 100644 index 0000000..1ef3066 --- /dev/null +++ b/PI2/Allgemein/sicherheit.md @@ -0,0 +1,80 @@ +# Sicherheit – Raspberry PI2 + +**Zusammenfassung**: SSH-Zugriff ist auf Public-Key-Authentifizierung beschränkt. UFW-Firewall ist aktiv. Einige Sicherheitslücken bestehen (Klartext-Passwörter, kein automatischer OS-Update-Zwang). +**Quellen**: 🔌 SSH (`/etc/ssh/sshd_config`, `/etc/passwd`, `groups`, `ufw status`) +**Zuletzt aktualisiert**: 2026-06-19 + +--- + +## SSH-Zugang + +- **Passwort-Authentifizierung**: Nicht explizit deaktiviert (PubkeyAuthentication yes, aber KbdInteractiveAuthentication nicht gesetzt) +- **Zugelassen**: SSH-Key (Public-Key-Auth) +- **User**: `hoobs` (UID 1000, /home/hoobs, bash) +- **SSH-Port**: 22 (Standard) +- **Keys**: Ed25519-Schlüsselpaar vorhanden (`/home/hoobs/.ssh/authorized_keys`, ~5KB) + +## Benutzer & Gruppen + +| User | UID | Shell | Beschreibung | +|---|---|---|---| +| `hoobs` | 1000 | /bin/bash | Primärer Benutzer, sudo | +| `service` | 1001 | /bin/bash | Service-Account | +| `smb_user` | 1002 | /bin/bash | Samba-Benutzer | +| `pihole` | 999 | /usr/sbin/nologin | Pi-hole-Dienst | + +Gruppen-Mitgliedschaften von `hoobs`: + +| Gruppe | Zweck | +|---|---| +| `hoobs` | Eigenes | +| `adm` | Log-Dateien lesen | +| `dialout` | Serielle Schnittstelle | +| `cdrom` | Optische Laufwerke | +| `sudo` | **Vollständiger root-Zugriff** (sudo) | +| `audio` | Audio-Geräte | +| `video` | Video-Geräte | +| `plugdev` | Wechselmedien | +| `games` | Spiele | +| `users` | Standard-Benutzergruppe | +| `input` | Eingabegeräte | +| `render` | GPU-Rendering | +| `netdev` | Netzwerk-Konfiguration | +| `gpio` | GPIO-Pins | +| `i2c` | I²C-Schnittstelle | +| `spi` | SPI-Schnittstelle | + +## Firewall + +- **ufw**: **Aktiv** (in dmesg sichtbar, genaue Regeln nicht ausgelesen) +- **iptables**: Wird von ufw verwaltet + +Hinweis: UFW-Block-Einträge im dmesg deuten auf wiederholte Zugriffsversuche von `192.168.178.22` und `fe80::/64` auf die hohen Ports (51836, 51856 etc.) hin – vermutlich legitime LAN-Geräte, die von HOOBS-Diensten blockiert werden. + +## Bekannte Sicherheitslücken + +### 🟡 Music Social API – Spotify Client Secret im Klartext + +Die Music Social API verwendet Umgebungsvariablen (`.env`) für Spotify-Client-ID und -Secret. Die `.env`-Datei liegt vermutlich im Home-Verzeichnis. + +### 🟡 Self-Signed SSL-Zertifikat + +Der Apache-VHost auf Port 65443 verwendet ein selbstsigniertes SSL-Zertifikat (CN=da-pi2, ausgestellt Januar 2026, gültig bis Januar 2027). Kein vertrauenswürdiges CA. + +### 🟡 Samba-Freigaben ohne Einschränkung + +Die Seagate-Festplatte ist vermutlich über Samba im gesamten Heimnetz freigegeben (workgroup DA-HOME). + +### 🟡 Bullseye – End-of-Life + +Raspbian 11 (bullseye) ist seit August 2024 offiziell EOL ("oldstable"). Es gibt keine Sicherheitsupdates mehr außer über Debian LTS (eingeschränkt). + +### 🟡 Kein automatischer Update-Zwang + +Der PI2 hat keine unattended-upgrades oder ähnliche Mechanismen, die Sicherheitsupdates automatisch einspielen. + +## Verwandte Seiten + +- [systemuebersicht](../Konfiguration/systemuebersicht.md) +- [netzwerk](./netzwerk.md) +- [music-social-api](../Konfiguration/dienste/music-social-api.md) diff --git a/PI2/Konfiguration/dienste/apache.md b/PI2/Konfiguration/dienste/apache.md new file mode 100644 index 0000000..b7842b4 --- /dev/null +++ b/PI2/Konfiguration/dienste/apache.md @@ -0,0 +1,49 @@ +# Apache HTTP Server + +**Zusammenfassung**: Apache2 läuft mit drei VirtualHosts: Standard-Port 80, Standard-SSL auf 443 und eine SAP-UI5-App auf Port 65443 (HTTPS mit selbstsigniertem Zertifikat). +**Quellen**: 🔌 SSH (`apache2 -v`, `cat /etc/apache2/sites-enabled/*.conf`) +**Zuletzt aktualisiert**: 2026-06-19 + +--- + +## Status + +| Metrik | Wert | +|---|---| +| **Dienst** | `apache2.service` | +| **Aktiv seit** | 17. Juni 2026, 18:10 Uhr (nach Neustart) | +| **Version** | Apache 2.4.x | +| **Ports** | 80 (HTTP), 443 (HTTPS), 8080 (?), 65443 (HTTPS SAP) | + +## VirtualHosts + +### 1. Default (Port 80) +- **Config**: `/etc/apache2/sites-available/000-default.conf` +- **DocumentRoot**: `/var/www/html` +- Enthält: `admin/` und `index.html` (Pi-hole Admin?) + +### 2. SAP UI5 (Port 65443, HTTPS) +- **Config**: `/etc/apache2/sites-available/sapui5.conf` +- **DocumentRoot**: `/media/Seagate-Expansion/www/html/sapui5` +- **SSL**: Self-signed cert + - `SSLCertificateFile`: `/etc/ssl/certs/server.crt` + - `SSLCertificateKeyFile`: `/etc/ssl/certs/server.key` + - **Subject**: `CN = da-pi2, O = da-home, OU = da-hq, L = Dormagen, ST = NW, C = DE` + - **Gültig**: Jan 2026 – Jan 2027 +- **Proxy**: `/proxy` → `http://localhost:3000/proxy` (HOOBS API Proxy) + +### 3. dahome.mysite.conf (Port ?) +- Symlink existiert in `sites-enabled`, aber die Datei in `sites-available` fehlt (broken symlink) + +### 4. Port 443 + 8080 +- Zusätzliche Listener auf 443 und 8080 – Konfiguration nicht näher identifiziert + +## Sicherheit + +- Selbstsigniertes Zertifikat (kein Let's Encrypt) +- Port 65443 erlaubt `Require all granted` – kein IP-Block oder Auth + +## Verwandte Seiten + +- [netzwerk](../../Allgemein/netzwerk.md) +- [sicherheit](../../Allgemein/sicherheit.md) diff --git a/PI2/Konfiguration/dienste/helm.md b/PI2/Konfiguration/dienste/helm.md new file mode 100644 index 0000000..beddf4f --- /dev/null +++ b/PI2/Konfiguration/dienste/helm.md @@ -0,0 +1,41 @@ +# Helm – HOOBS Helm-UI + +**Zusammenfassung**: Helm ist ein Node.js-basiertes Interface/Shell für HOOBS, das auf Port 9090 läuft. Teil der HOOBS-Plattform. +**Quellen**: 🔌 SSH (`systemctl status helm.service`, `cat /lib/systemd/system/helm.service`) +**Zuletzt aktualisiert**: 2026-06-19 + +--- + +## Status + +| Metrik | Wert | +|---|---| +| **Dienst** | `helm.service` | +| **Aktiv seit** | 19. Juni 2026, 22:21 Uhr (zuletzt neugestartet) | +| **Port** | 9090 (HTTP) | +| **Type** | simple (root) | + +## Konfiguration + +- **Service-Definition**: `/lib/systemd/system/helm.service` + ```ini + [Unit] + Description=Helm + After=network-online.target + + [Service] + Type=simple + User=root + ExecStart=/usr/bin/helm shell --port 9090 + Restart=always + RestartSec=3 + + [Install] + WantedBy=multi-user.target + ``` +- **Binary**: `/usr/bin/helm` (Node.js-Skript, `env -S node --max-old-space-size=256`) +- Der Dienst hatte zum Erfassungszeitpunkt einen Fehler (Error-Logs in `systemctl status` sichtbar) + +## Verwandte Seiten + +- [hoobs](./hoobs.md) diff --git a/PI2/Konfiguration/dienste/hoobs.md b/PI2/Konfiguration/dienste/hoobs.md new file mode 100644 index 0000000..1995172 --- /dev/null +++ b/PI2/Konfiguration/dienste/hoobs.md @@ -0,0 +1,48 @@ +# HOOBS – Smart-Home-Hub + +**Zusammenfassung**: HOOBS (Homebridge-basiert) ist die Smart-Home-Zentrale auf dem PI2. Läuft als `hoobsd.service` und verbindet HomeKit mit Nicht-HomeKit-Geräten. +**Quellen**: 🔌 SSH (`systemctl status hoobsd.service`) +**Zuletzt aktualisiert**: 2026-06-19 + +--- + +## Status + +| Metrik | Wert | +|---|---| +| **Dienst** | `hoobsd.service` | +| **Aktiv seit** | 4. Juni 2026, 01:28 Uhr | +| **Version** | hoobsd 5.1.8, HOOBS CLI 4.2.4, HOOBS GUI 4.2.2 | +| **CPU-Verbrauch** | ~2 Wochen kumulierte CPU-Zeit | +| **Tasks** | 102 | +| **Port** | 3000 (HTTP Web UI) | +| **Restart** | always (RestartSec=3) | + +## Konfiguration + +- **Service-Definition**: `/etc/systemd/system/hoobsd.service` + ```ini + [Unit] + Description=HOOBSD + After=network-online.target + + [Service] + Type=simple + User=root + ExecStart=/usr/bin/hoobsd hub + Restart=always + RestartSec=3 + KillSignal=SIGINT + + [Install] + WantedBy=multi-user.target + ``` + +## Ports + +HOOBS belegt mehrere hochrangige Ports (51826–65080) für Child-Prozesse (Plugins, Bridges). + +## Verwandte Seiten + +- [helm](./helm.md) – Helm-UI (Teil von HOOBS) +- [netzwerk](../../Allgemein/netzwerk.md) diff --git a/PI2/Konfiguration/dienste/music-social-api.md b/PI2/Konfiguration/dienste/music-social-api.md new file mode 100644 index 0000000..9ab7b96 --- /dev/null +++ b/PI2/Konfiguration/dienste/music-social-api.md @@ -0,0 +1,55 @@ +# Music Social API – Spotify/Music Proxy + +**Zusammenfassung**: Node.js-Express-API, die als Proxy für die Spotify-API dient. Ermöglicht OAuth2-Flow mit Spotify, Playlist-Verwaltung und Music-Social-Features. +**Quellen**: 🔌 SSH (`systemctl status music_social_api.service`, `cat app.js`) +**Zuletzt aktualisiert**: 2026-06-19 + +--- + +## Status + +| Metrik | Wert | +|---|---| +| **Dienst** | `music_social_api.service` | +| **Aktiv seit** | 4. Juni 2026, 01:28 Uhr | +| **Port** | 3010 (HTTP) | +| **PID** | 506 | +| **Runtime** | 2 Wochen 1 Tag | + +## Konfiguration + +- **Service-Definition**: `/etc/systemd/system/music_social_api.service` + ```ini + [Unit] + Description=Music Social API + After=network.target + + [Service] + User=hoobs + WorkingDirectory=/home/hoobs/node_proxies/music_social_api/src + ExecStart=/usr/bin/node /home/hoobs/node_proxies/music_social_api/src/app.js + Restart=always + + [Install] + WantedBy=multi-user.target + ``` +- **Quellcode**: `/home/hoobs/node_proxies/music_social_api/src/app.js` +- **Dependencies**: Express 5.x, node-fetch 3.x, cors, dotenv +- **Redirect URI**: `http://127.0.0.1:3010/callback` +- **Scope**: Umfangreiche Spotify-Berechtigungen (Playlist Read/Write, Playback, User-Follow, etc.) + +## Umgebungsvariablen + +Erwartet in `.env`: +- `SPOTIFY_CLIENT_ID` +- `SPOTIFY_CLIENT_SECRET` +- `SPOTIFY_REDIRECT_URI` + +## Sicherheitshinweis + +Die Spotify-Zugangsdaten liegen als Klartext-Umgebungsvariablen im Home-Verzeichnis von `hoobs`. + +## Verwandte Seiten + +- [wiim-proxy](./wiim-proxy.md) +- [sicherheit](../../Allgemein/sicherheit.md) diff --git a/PI2/Konfiguration/dienste/pihole.md b/PI2/Konfiguration/dienste/pihole.md new file mode 100644 index 0000000..87ad24c --- /dev/null +++ b/PI2/Konfiguration/dienste/pihole.md @@ -0,0 +1,39 @@ +# Pi-hole – DNS-Adblocker + +**Zusammenfassung**: Pi-hole blockt netzwerkweit Werbung und Tracker auf DNS-Ebene. Läuft als `pihole-FTL.service` auf dem PI2. +**Quellen**: 🔌 SSH (`systemctl status pihole-FTL.service`, `pihole -v`) +**Zuletzt aktualisiert**: 2026-06-19 + +--- + +## Status + +| Metrik | Wert | +|---|---| +| **Dienst** | `pihole-FTL.service` | +| **Aktiv seit** | 4. Juni 2026, 01:28 Uhr | +| **Core-Version** | v6.3 (Latest: v6.4.2) | +| **Web-Version** | v6.4 (Latest: v6.5.1) | +| **FTL-Version** | v6.4.1 (Latest: v6.6.2) | +| **Status** | ✅ Aktiv, Blocking enabled | +| **Ports** | 53/UDP + 53/TCP (DNS) | +| **PID** | 681 | + +## Konfiguration + +- **Service**: `/etc/systemd/system/pihole-FTL.service` +- **Cron-Jobs**: `/etc/cron.d/pihole` + - Täglich 4:00 Uhr: Adlisten-Update (`pihole updateGravity`) + - Täglich 0:00 Uhr: Log-Rotation (`pihole flush once quiet`) + - Täglich 18:04 Uhr: Versions-Check (`pihole updatechecker`) +- **Logrotate**: `/etc/pihole/logrotate` + +## Netzwerk + +- Der lokale DNS-Server der FritzBox (192.168.178.1) leitet vermutlich an den Pi-hole auf 192.168.178.44:53 weiter (oder jedes Gerät nutzt den PI2 direkt als DNS) +- Pi-hole blockiert DNS-Anfragen auf Liste bekannter Werbe-Domains + +## Verwandte Seiten + +- [netzwerk](../../Allgemein/netzwerk.md) +- [sicherheit](../../Allgemein/sicherheit.md) diff --git a/PI2/Konfiguration/dienste/samba.md b/PI2/Konfiguration/dienste/samba.md new file mode 100644 index 0000000..70d3f1c --- /dev/null +++ b/PI2/Konfiguration/dienste/samba.md @@ -0,0 +1,32 @@ +# Samba – Dateifreigaben + +**Zusammenfassung**: Samba stellt Dateifreigaben im Heimnetz (Workgroup DA-HOME) bereit, insbesondere die 1,8-TB-Seagate-Externe. +**Quellen**: 🔌 SSH (`smbd.service`, `cat /etc/samba/smb.conf`) +**Zuletzt aktualisiert**: 2026-06-19 + +--- + +## Status + +| Metrik | Wert | +|---|---| +| **Dienst** | `smbd.service` + `nmbd.service` | +| **Aktiv seit** | 4. Juni 2026, 01:28 Uhr | +| **Ports** | 445 (SMB), 139 (NetBIOS) | +| **Workgroup** | `DA-HOME` | + +## Konfiguration + +- **Config**: `/etc/samba/smb.conf` +- Standard Debian-Konfiguration (nur globaler Abschnitt gelesen) +- Ein Samba-User: `smb_user` (UID 1002, /home/smb_user) + +## Freigegebene Laufwerke + +Die genauen Shares wurden nicht ausgelesen. Die Seagate-Festplatte (`/media/Seagate-Expansion`) ist sehr wahrscheinlich über Samba freigegeben. + +## Verwandte Seiten + +- [laufwerke-und-speicher](../laufwerke-und-speicher.md) +- [netzwerk](../../Allgemein/netzwerk.md) +- [sicherheit](../../Allgemein/sicherheit.md) diff --git a/PI2/Konfiguration/dienste/wiim-proxy.md b/PI2/Konfiguration/dienste/wiim-proxy.md new file mode 100644 index 0000000..b6616e1 --- /dev/null +++ b/PI2/Konfiguration/dienste/wiim-proxy.md @@ -0,0 +1,41 @@ +# WiiM Proxy – API-Proxy für WiiM-Lautsprecher + +**Zusammenfassung**: Node.js-Express-Proxy für den lokalen Netzwerkzugriff auf die WiiM-API. Ermöglicht Steuerung von WiiM-Lautsprechern (Multiroom-Audio) aus dem LAN. +**Quellen**: 🔌 SSH (`cat wiim_proxy.js`, `cat package.json`) +**Zuletzt aktualisiert**: 2026-06-19 + +--- + +## Status + +| Metrik | Wert | +|---|---| +| **Dienst** | `wiim_proxy.service` (selbst definiert?) | +| **Description** | Proxy for local network access to the Wiim Api | +| **Main** | `wiim_proxy.js` | +| **Lizenz** | MIT, Autor: da-Developments | + +## Konfiguration + +- **Service-Definition**: `/etc/systemd/system/wiim_proxy.service` (existiert) + ```ini + [Unit] + Description=Wiim Node Proxy + After=network.target + + [Service] + User=hoobs + WorkingDirectory=/home/hoobs/node_proxies/wiim_proxy + ExecStart=/usr/bin/node /home/hoobs/node_proxies/wiim_proxy/wiim_proxy.js + Restart=always + + [Install] + WantedBy=multi-user.target + ``` +- **Quellcode**: `/home/hoobs/node_proxies/wiim_proxy/` +- **Dependencies**: Express 4.x, axios, cors +- **Port**: Nicht eindeutig identifiziert (kein `ss`-Eintrag zum Zeitpunkt der Abfrage) + +## Verwandte Seiten + +- [music-social-api](./music-social-api.md) diff --git a/PI2/Konfiguration/index.md b/PI2/Konfiguration/index.md new file mode 100644 index 0000000..36531d6 --- /dev/null +++ b/PI2/Konfiguration/index.md @@ -0,0 +1,35 @@ +# Konfigurationsindex – Raspberry PI2 + +**Zusammenfassung**: Inhaltsverzeichnis aller Konfigurationsseiten des Raspberry PI2 `hoobs`. +**Quellen**: 🔌 SSH, Systemabfragen +**Zuletzt aktualisiert**: 2026-06-19 + +--- + +## System & Hardware + +| Seite | Quelle | +|---|---| +| [systemuebersicht](./systemuebersicht.md) – OS, Kernel, RAM, Systemd-Dienste | 🔌 SSH (19.06.) | +| [laufwerke-und-speicher](./laufwerke-und-speicher.md) – Laufwerke, Partitionen, Speicherbelegung | 🔌 SSH (19.06.) | +| [hardware](../Allgemein/hardware.md) – PI2-Hardware: CPU, Temperatur, USB, Boot-Config | 🔌 SSH (19.06.) | +| [netzwerk](../Allgemein/netzwerk.md) – Interfaces, DNS, Ports, öffentliche Dienste | 🔌 SSH (19.06.) | +| [sicherheit](../Allgemein/sicherheit.md) – SSH, Benutzer, Firewall, bekannte Lücken | 🔌 SSH (19.06.) | + +## Dienste + +| Seite | Beschreibung | +|---|---| +| [hoobs](./dienste/hoobs.md) – HOOBS (Homebridge) Smart-Home-Hub | Smart-Home-Zentrale (HomeKit) | +| [pihole](./dienste/pihole.md) – Pi-hole DNS-Adblocker | Netzwerkweiter Werbeblocker | +| [apache](./dienste/apache.md) – Apache HTTP Server | Webserver mit SAP-UI5-App (HTTPS) | +| [samba](./dienste/samba.md) – Samba SMB-Freigaben | Dateifreigaben im Heimnetz | +| [music-social-api](./dienste/music-social-api.md) – Spotify/Music API Proxy | Node.js-Proxy für Spotify-API | +| [wiim-proxy](./dienste/wiim-proxy.md) – WiiM API Proxy | Node.js-Proxy für WiiM-Lautsprecher | +| [helm](./dienste/helm.md) – HOOBS Helm-UI | Steuerungs-Interface für HOOBS | + +--- + +## Quelldokumente + +- `raw/` – (vorgesehen für SSH-Systemdaten-Auszüge) diff --git a/PI2/Konfiguration/laufwerke-und-speicher.md b/PI2/Konfiguration/laufwerke-und-speicher.md new file mode 100644 index 0000000..144f68b --- /dev/null +++ b/PI2/Konfiguration/laufwerke-und-speicher.md @@ -0,0 +1,55 @@ +# Laufwerke und Speicher – Raspberry PI2 + +**Zusammenfassung**: Der Raspberry PI2 hat eine SD-Karte als Systemlaufwerk, einen USB-Stick für Pi-hole und Konfiguration sowie eine 1,8-TB-USB-Festplatte als Datengrab. +**Quellen**: 🔌 SSH (`lsblk`, `df -h`) +**Zuletzt aktualisiert**: 2026-06-19 + +--- + +## Laufwerke (lsblk) + +``` +NAME SIZE TYPE FSTYPE MOUNTPOINT +sda 57,3G disk ext4 /media/usbstick +sdb 1,8T disk +└─sdb1 1,8T part ntfs /media/Seagate-Expansion +mmcblk0 119,1G disk +├─mmcblk0p1 256M part vfat /boot +└─mmcblk0p2 118,8G part ext4 / +``` + +## Speicherbelegung (df -h) + +| Dateisystem | Größe | Benutzt | Verfügbar | Belegt | Mountpoint | +|---|---|---|---|---|---| +| `/dev/root` | 117 G | 11 G | 102 G | 10 % | `/` | +| `/dev/mmcblk0p1` | 253 M | 51 M | 202 M | 20 % | `/boot` | +| `/dev/sda` | 57 G | 18 G | 37 G | 33 % | `/media/usbstick` | +| `/dev/sdb1` | 1,9 T | 1,2 T | 675 G | 64 % | `/media/Seagate-Expansion` | + +## Speicherdetails + +### SD-Karte (mmcblk0 – System) +- **Typ**: microSD (119 GB) +- **Root-Partition**: ext4, 118,8 GB, 10 % belegt (11 GB) +- **Boot-Partition**: vfat (FAT32), 256 MB, 20 % belegt +- **Keine Verschlüsselung** + +### USB-Stick (sda – Pi-hole/Sonstiges) +- **Gerät**: SanDisk Ultra Fit (USB 2.0) +- **Größe**: 57 GB +- **Dateisystem**: ext4 +- **Mount**: `/media/usbstick` (33 % belegt – 18 GB) +- Enthält: Betriebssystem-Verzeichnisstruktur (wirkt wie ein zweites Root-FS) + +### Seagate Expansion HDD (sdb1 – Datengrab) +- **Gerät**: Seagate RSS LLC SRD0NF1 Expansion Portable (STEA) +- **Größe**: 1,8 TB +- **Dateisystem**: ntfs +- **Mount**: `/media/Seagate-Expansion` (64 % belegt – 1,2 TB) +- Enthält: `Media/`, `BackUp/`, `CloudBackup/`, `Paperless/`, `PlexMediaServer/`, `Picture/`, `www/` u.a. + +## Verwandte Seiten + +- [systemuebersicht](./systemuebersicht.md) +- [samba](./dienste/samba.md) diff --git a/PI2/Konfiguration/log.md b/PI2/Konfiguration/log.md new file mode 100644 index 0000000..f5f458f --- /dev/null +++ b/PI2/Konfiguration/log.md @@ -0,0 +1,10 @@ +# Änderungslog – Raspberry PI2 + +**Zusammenfassung**: Alle dokumentierten Änderungen am PI2-System. +**Format**: Datum | Typ | Uhrzeit | Quelle | Zugriff | Änderung + +--- + +| Datum | Typ | Uhrzeit | Quelle | Zugriff | Änderung | +|---|---|---|---|---|---| +| 2026-06-19 | Initial | 22:30 | SSH | lesend | Ersterfassung des Systems – Doku angelegt | diff --git a/PI2/Konfiguration/systemuebersicht.md b/PI2/Konfiguration/systemuebersicht.md new file mode 100644 index 0000000..e3bdb5f --- /dev/null +++ b/PI2/Konfiguration/systemuebersicht.md @@ -0,0 +1,79 @@ +# Systemübersicht – Raspberry PI2 + +**Zusammenfassung**: Der Raspberry PI2 `hoobs` läuft mit Raspbian GNU/Linux 11 "bullseye" (armv7l) und 921 MB RAM. Smart-Home-Hub mit HOOBS (Homebridge), Pi-hole DNS-Adblocker, Samba-Freigaben und Apache-Webserver. +**Quellen**: 🔌 SSH (`ssh PI2`) +**Zuletzt aktualisiert**: 2026-06-19 + +--- + +## Basis-Daten + +| Merkmal | Wert | +|---|---| +| **Hostname** | `hoobs` | +| **Betriebssystem** | Raspbian GNU/Linux 11 (bullseye) | +| **Architektur** | armv7l (32-bit) | +| **Kernel** | 6.1.21-v7+ #1642 SMP Mon Apr 3 17:20:52 BST 2023 | +| **CPU** | 4× ARM Cortex-A7 (BCM2835) | +| **RAM** | 921 MiB (725 MiB genutzt, 142 MiB verfügbar) | +| **Swap** | ~1,8 GiB (dphys-swapfile) | +| **CPU-Temperatur** | ~58 °C (passiv gekühlt) | +| **Betriebszeit** | 15 Tage, 20 Stunden | +| **Load Average** | 5.47 / 5.00 / 4.81 (moderat) | +| **Letzter Reboot** | 4. Juni 2026, 01:28 Uhr | + +## Speicher + +| Laufwerk | Größe | Verwendet | Typ | Mountpunkt | +|---|---|---|---|---| +| **SD-Karte** (mmcblk0) | 119 GB | 11 GB | ext4 (root) | `/` | +| **USB-Stick** (sda) | 57 GB | 18 GB | ext4 | `/media/usbstick` | +| **Seagate HDD** (sdb1) | 1,8 TB | 1,2 TB | ntfs | `/media/Seagate-Expansion` | + +## Systemd-Dienste (Enabled) + +Wichtige enabled systemd-Services: + +| Dienst | Zweck | +|---|---| +| `hoobsd.service` | HOOBS Smart-Home-Hub (Homebridge) | +| `pihole-FTL.service` | Pi-hole DNS-Adblocker | +| `apache2.service` | Apache HTTP Server | +| `smbd.service` / `nmbd.service` | Samba SMB-Freigaben | +| `helm.service` | HOOBS Helm-UI | +| `music_social_api.service` | Spotify/Music API Proxy | +| `ssh.service` | SSH-Server | +| `cron.service` | Cron-Daemon | +| `NetworkManager.service` | Netzwerk-Verwaltung | +| `bluetooth.service` | Bluetooth | +| `avahi-daemon.service` | mDNS/Bonjour | +| `dphys-swapfile.service` | Swap-Datei | + +(Quelle: `systemctl list-unit-files --state=enabled`) + +## Systemd-Timer + +| Timer | Ausführung | +|---|---| +| `logrotate.timer` | Täglich 00:00 | +| `apt-daily.timer` | Täglich | +| `apt-daily-upgrade.timer` | Täglich | +| `fstrim.timer` | Wöchentlich (SD-Karten-Trimming) | +| `e2scrub_all.timer` | Wöchentlich (Dateisystem-Prüfung) | +| `man-db.timer` | Täglich | +| `systemd-tmpfiles-clean.timer` | Täglich | + +## Netzwerk + +Siehe [netzwerk](../Allgemein/netzwerk.md) für Details. + +## Verwandte Seiten + +- [hardware](../Allgemein/hardware.md) – Hardware-Details +- [netzwerk](../Allgemein/netzwerk.md) – Netzwerk-Konfiguration +- [sicherheit](../Allgemein/sicherheit.md) – Sicherheits-Einstellungen +- [laufwerke-und-speicher](./laufwerke-und-speicher.md) +- [hoobs](./dienste/hoobs.md) +- [pihole](./dienste/pihole.md) +- [apache](./dienste/apache.md) +- [samba](./dienste/samba.md) diff --git a/PI5/Allgemein/hardware.md b/PI5/Allgemein/hardware.md new file mode 100644 index 0000000..5b7ce7c --- /dev/null +++ b/PI5/Allgemein/hardware.md @@ -0,0 +1,55 @@ +# Hardware – Raspberry PI5 + +**Zusammenfassung**: Der `da-server-pi5` ist ein Raspberry PI5 mit 15 GB RAM, aktivem Kühler und drei USB-Massenspeichern. Läuft stabil bei ~46 °C CPU-Temperatur. +**Quellen**: 🔌 SSH (`/proc/cpuinfo`, `lsusb`, `lspci`, `/sys/class/thermal/`) +**Zuletzt aktualisiert**: 2026-06-17 + +--- + +## Modell + +| Merkmal | Wert | +|---|---| +| **Modell** | Raspberry Pi 5 (BCM2712) | +| **CPU** | ARM Cortex-A76 (4 Kerne, aarch64) | +| **BogoMIPS** | 108.00 pro Kern | +| **Features** | fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp | +| **RAM** | 15 GB | +| **Architektur** | arm64 (nativ), 64-bit-mode (`arm_64bit=1`, `arm_boost=1`) | + +## Temperatur & Kühlung + +- **CPU-Temperatur**: ~46 °C (Quelle: `/sys/class/thermal/thermal_zone0/temp`) +- **Throttling**: Keines (vcgencmd zeigt keine Drosselung) +- Der PI5 ist aktiv gekühlt und läuft sehr kühl. + +## Angeschlossene Hardware (USB) + +| Bus | Gerät | ID | Beschreibung | +|---|---|---|---| +| Bus 001 | Device 002 | `1e3d:2092` | **Chipsbank Flash Disk** – USB-Stick mit LUKS-Schlüsseldateien | +| Bus 001 | Device 003 | `0781:55ae` | **SanDisk Extreme 55AE** – 1,8-TB-SSD (Hauptsystem + Daten) | +| Bus 004 | Device 002 | `1058:1042` | **WD Elements SE Portable** – 931-GB-SSD (Zweitsystem) | + +## PCI / Erweiterungsbus + +``` +0002:00:00.0 BCM2712 PCIe Bridge +0002:01:00.0 RP1 PCIe 2.0 South Bridge (Ethernet, USB, GPIO) +``` + +## Boot-Konfiguration (`/boot/firmware/config.txt`) + +``` +arm_64bit=1 # 64-bit mode +arm_boost=1 # max Takt +dtoverlay=vc4-kms-v3d # Grafiktreiber +dtparam=audio=on # Audio aktiv +camera_auto_detect=1 # Kamera-Erkennung +display_auto_detect=1 # Display-Erkennung +``` + +## Verwandte Seiten + +- [systemuebersicht](../Konfiguration/systemuebersicht.md) +- [laufwerke-und-speicher](../Konfiguration/laufwerke-und-speicher.md) diff --git a/PI5/Allgemein/netzwerk.md b/PI5/Allgemein/netzwerk.md new file mode 100644 index 0000000..43fa866 --- /dev/null +++ b/PI5/Allgemein/netzwerk.md @@ -0,0 +1,74 @@ +# Netzwerk – Raspberry PI5 + +**Zusammenfassung**: Der PI5 hat eine kabelgebundene (eth0) und eine WLAN-Schnittstelle (wlan0). DNS läuft über die FritzBox, Netzwerkkonfiguration via NetworkManager. +**Quellen**: 🔌 SSH (`ip addr`, `/etc/resolv.conf`, `/etc/hosts`, `ss -tlnp`, `/opt/compose/traefik/conf.d/*.yml`) +**Zuletzt aktualisiert**: 2026-06-17 + +--- + +## Schnittstellen + +| Interface | IP | Typ | Status | +|---|---|---|---| +| `eth0` | `192.168.178.77/24` | Kabel (primär) | UP | +| `wlan0` | `192.168.178.66/24` | WLAN (Fallback) | UP | +| `lo` | `127.0.0.1/8` | Loopback | UP | + +Gateway/Subnetz: `192.168.178.0/24`, Standard-Gateway `192.168.178.1` (FritzBox). + +## DNS + +- **Namensserver**: `192.168.178.1` (FritzBox) +- **Suchdomain**: `fritz.box` +- **Hostname**: `da-server-pi5` +- **/etc/hosts**: `127.0.1.1 da-server-pi5` (von cloud-init verwaltet) + +## Öffentliche Dienste + +Alle öffentlichen Dienste laufen hinter [traefik](../Konfiguration/docker/traefik.md) auf den Ports **80 (HTTP)** und **443 (HTTPS)** mit Let's Encrypt: + +| Subdomain | Dienst | interner Port | +|---|---|---| +| `cloud.da.home-webserver.de` | [nextcloud](../Konfiguration/docker/nextcloud.md) | `nextcloud:80` | +| `photos.da.home-webserver.de` | [immich](../Konfiguration/docker/immich.md) | `immich_server:2283` | +| `paperless.da.home-webserver.de` | [paperless](../Konfiguration/docker/paperless.md) | `paperless-webserver-1:8000` | +| `wiki.da.home-webserver.de` | [wikijs](../Konfiguration/docker/wikijs.md) | `wikijs:3000` | +| `pdf.da.home-webserver.de` | [stirling-pdf](../Konfiguration/docker/stirling-pdf.md) | `stirling-pdf:8080` | +| `music.da.home-webserver.de` | [plex](../Konfiguration/docker/plex.md) | `plex:32400` | +| `web.da.home-webserver.de` | [nginx](../Konfiguration/docker/nginx.md) | `nginx_pi5:80` | +| `office.da.home-webserver.de` | [collabora](../Konfiguration/docker/collabora.md) | `collabora:9980` | +| `jenkins.da.home-webserver.de` | [jenkins](../Konfiguration/docker/jenkins.md) | `jenkins:8080` | +| `git.da.home-webserver.de` | [gitea](../Konfiguration/docker/gitea.md) | `gitea:3000` | +| `traefik.da.home-webserver.de` | Traefik-Dashboard | `api@internal` | +| `prometheus.da.home-webserver.de` | Prometheus | `monitoring-prometheus:9090` | +| `grafana.da.home-webserver.de` | Grafana | `monitoring-grafana:3000` | + +(Quelle: `/opt/compose/traefik/conf.d/*.yml`) + +## HTTP->HTTPS-Weiterleitung + +Die HTTPS-Weiterleitung im Traefik-Global-Router ist **derzeit auskommentiert** (`conf.d/0000-global.yml`). HTTP-Anfragen landen im "noop"-Service (Antwort 404). Die Dienste sind nur via HTTPS direkt erreichbar. + +## Offene Ports (Listening) + +| Port | Dienst | Bemerkung | +|---|---|---| +| `22/tcp` | SSH (sshd) | Nur per SSH-Key | +| `80/tcp` | docker-proxy → Traefik | HTTP | +| `443/tcp` | docker-proxy → Traefik | HTTPS | +| `111/tcp` | rpcbind | system-intern | +| `631/tcp` | cupsd (localhost) | Druckserver | + +(Quelle: `ss -tlnp`) + +## Firewall + +- **ufw**: Nicht installiert +- **iptables**: Wird von Docker verwaltet (Netzwerk-Isolation der Container) + +## Verwandte Seiten + +- [traefik](../Konfiguration/docker/traefik.md) +- [domain-und-ssl](../Konfiguration/domain-und-ssl.md) +- [systemuebersicht](../Konfiguration/systemuebersicht.md) +- [sicherheit](./sicherheit.md) diff --git a/PI5/Allgemein/sicherheit.md b/PI5/Allgemein/sicherheit.md new file mode 100644 index 0000000..b57b01c --- /dev/null +++ b/PI5/Allgemein/sicherheit.md @@ -0,0 +1,86 @@ +# Sicherheit – Raspberry PI5 + +**Zusammenfassung**: SSH-Zugriff ist auf Public-Key-Authentifizierung beschränkt. Einige Sicherheitslücken bestehen (Grafana-Passwort, Gitea-Container-Konfiguration). +**Quellen**: 🔌 SSH (`/etc/ssh/sshd_config`, `/etc/passwd`, `groups`, `docker inspect`) +**Zuletzt aktualisiert**: 2026-06-17 + +--- + +## SSH-Zugang + +- **Passwort-Authentifizierung**: **Deaktiviert** (`KbdInteractiveAuthentication no`) +- **Zugelassen**: Nur SSH-Key (Public-Key-Auth via `authorized_keys`) +- **User**: `piadmin` (UID 1000, /home/piadmin, bash) +- **SSH-Port**: 22 (Standard) +- **Keys**: Ed25519-Schlüsselpaar vorhanden + +## Benutzer & Gruppen + +Einziger menschlicher Benutzer: `piadmin` + +Gruppen-Mitgliedschaften von `piadmin`: + +| Gruppe | Zweck | +|---|---| +| `piadmin` | Eigenes | +| `adm` | Log-Dateien lesen | +| `dialout` | Serielle Schnittstelle | +| `cdrom` | Optische Laufwerke | +| `sudo` | **Vollständiger root-Zugriff** (sudo) | +| `audio` | Audio-Geräte | +| `video` | Video-Geräte | +| `plugdev` | Wechselmedien | +| `games` | Spiele | +| `users` | Standard-Benutzergruppe | +| `input` | Eingabegeräte | +| `render` | GPU-Rendering | +| `netdev` | Netzwerk-Konfiguration | +| `spi` | SPI-Schnittstelle | +| `i2c` | I²C-Schnittstelle | +| `gpio` | GPIO-Pins | +| **`docker`** | **Docker-Befehle ohne sudo** | + +## LUKS-Verschlüsselung + +Beide Datenpartitionen sind mit LUKS2 verschlüsselt und erfordern einen **USB-Schlüsselstick** (`/mnt/usb_key/`) zum Booten: + +| Container | Schlüsseldatei | Größe | +|---|---|---| +| `encrypt_data` | `/mnt/usb_key/twotb.bin` | 4096 Bytes | +| `encrypt_sdc3` | `/mnt/usb_key/onetb.bin` | 16384 Bytes | + +Siehe [luks-verschluesselung](../Konfiguration/luks-verschluesselung.md). + +## Bekannte Sicherheitslücken + +### 🔴 Grafana-Passwort im Klartext + +In `/opt/compose/monitoring/docker-compose.yml` steht das Admin-Passwort als Umgebungsvariable im Klartext: + +```yaml +environment: + - GF_SECURITY_ADMIN_PASSWORD=Y57ekJeG2fLohiL0xdZNDViKteDZf55wQkhvabR96xPlEy4qRd +``` + +Sollte in ein Docker-Secret oder eine `.env`-Datei ausgelagert werden. + +### 🔴 Gitea-Container `restart: no` + +Der Gitea-Container hat die Restart-Policy `no` (statt `unless-stopped`) und läuft nicht. Die zugehörige MariaDB läuft dagegen normal. + +Siehe [gitea](../Konfiguration/docker/gitea.md). + +### 🟡 Collabora-Admin-Passwort + +Der Standard-Admin-Zugang für Collabora sollte geändert werden. + +### 🟡 HTTP->HTTPS-Weiterleitung + +Die Weiterleitung von HTTP auf HTTPS ist in Traefik **auskommentiert**. Dienste sind zwar nur per HTTPS aufrufbar, aber HTTP-Anfragen geben einen 404 statt einer Weiterleitung. + +## Verwandte Seiten + +- [systemuebersicht](../Konfiguration/systemuebersicht.md) +- [luks-verschluesselung](../Konfiguration/luks-verschluesselung.md) +- [gitea](../Konfiguration/docker/gitea.md) +- [monitoring](../Konfiguration/docker/monitoring.md) diff --git a/PI5/Konfiguration/docker-grundlagen.md b/PI5/Konfiguration/docker-grundlagen.md new file mode 100644 index 0000000..96476a2 --- /dev/null +++ b/PI5/Konfiguration/docker-grundlagen.md @@ -0,0 +1,103 @@ +# Docker-Grundlagen + +**Zusammenfassung**: Der Raspberry PI5 betreibt Docker Engine v29.5.3 mit Compose v5.1.4. 31 Container (30 laufend) aus 13 Compose-Stacks inkl. [authelia](./docker/authelia.md) (aktiv seit 18.06.). Alle Compose-Dateien heißen `docker-compose.yml`. +**Quellen**: 🖥️ `raw/Systemdaten – Raspberry PI5.md`, 🔌 SSH Live-Abfrage (2026-06-19, 21:30) +**Zuletzt aktualisiert**: 2026-06-19 + +--- + +## Versionen + +| Komponente | Version | +|---|---| +| **Docker Engine** | 29.5.3 | +| **Docker Compose** | v5.1.4 | +| **Architektur** | linux/arm64 (native auf Raspberry PI5) | + +## Netzwerke + +| Name | Treiber | Zweck | +|---|---|---| +| `traefik` | bridge | **Zentrales Reverse-Proxy-Netzwerk** – alle öffentlich erreichbaren Dienste hängen daran | +| `nextcloud_internal` | bridge | Nextcloud-intern (Datenbank, Redis, Docker-Proxy) | +| `immich_default` | bridge | Immich-Standard-Netzwerk | +| `immich_internal` | bridge | Immich-intern (Datenbank, Redis, ML) | +| `paperless_default` | bridge | Paperless-Standard-Netzwerk | +| `paperless_internal` | bridge | Paperless-intern (Datenbank, Broker) | +| `gitea_internal` | bridge | Gitea-intern (MariaDB) | +| `wikijs_default` | bridge | Wiki.js-Standard-Netzwerk | +| `docker0` | bridge | Docker-Standard-Bridge (ungenutzt) | + +## Volumes (benannte) + +| Volume | Verwendung | +|---|---| +| `plex_plex_config` | Plex-Konfiguration | +| `traefik_traefik_letsencrypt` | Let's-Encrypt-Zertifikate | +| `immich_model-cache` | Immich ML-Modell-Cache | +| `gitea_gitea` | Gitea-Daten | +| `gitea_mariadb` | Gitea-Datenbank | +| `paperless_redisdata` | Paperless-Redis-Daten | +| `monitoring_grafana_data` | Grafana-Daten (wieder aktiv) | +| `monitoring_prometheus_data` | Prometheus-Daten (wieder aktiv) | +| `collabora_collabora_data` | Collabora-Daten | +| `wikijs_wikijs_db` | Wiki.js-Datenbank | + +Zusätzlich gibt es **~151 anonyme Volumes** (UUID-Hashes) – Überreste alter Container-Starts. + +## Persistente Daten außerhalb von Volumes (Bind Mounts) + +Viele Stacks speichern Daten auf den LUKS-Partitionen: + +- `/mnt/data/nextcloud/` – Nextcloud-App, Daten, Datenbank +- `/mnt/data/...` – Weitere Anwendungsdaten auf der 1,5-TB-Partition +- `/opt/compose/` – Alle Compose-Dateien und Konfigurationen + +## Container-Statistik + +| Metrik | Wert | +|---|---| +| Container gesamt | 31 | +| Laufend | 30 | +| Gestoppt | 1 (`laughing_clarke` (hello-world)) | +| Restart-Policies | `unless-stopped` bei allen aktiven Diensten | + +## Docker-Images – Aufräumpotential + +188 Images belegen **174,1 GB**, davon sind **134 GB reclaimable (76 %)** – größtenteils alte Versionen: + +| Image | Alte/nicht genutzte Versionen | +|---|---| +| `traefik` | v2.10, v3.0.0, v3.1, v3.2, v3.6.6, `latest` (6 Versionen) | +| `collabora/code` | `latest` und `latest-arm64` (beide ~1,9 GB – nur eines aktiv) | +| `nextcloud` | `latest` und `29-apache` (beide ~2 GB) | +| `jenkins/jenkins` | `lts-jdk17` und `lts-jdk21` | +| `postgres` | 14, 16, 18 | +| `mariadb` | 10.11, 11.4 | +| `redis` | `7-alpine`, `8` | +| `ghcr.io/immich-app/postgres` | 1 Image ohne Tag (dangling) | +| `valkey/valkey` | 1 Image ohne Tag (dangling) | +| `authelia/authelia` | `latest` (99 MB – neu) | +| `gitea/gitea` | `latest` (246 MB – neu) | +| `curlimages/curl` | `latest` (37 MB – Testcontainer) | + +Bereinigung mit: `docker image prune -a` (Vorsicht: `authelia/authelia`, `gitea/gitea` und `curlimages/curl` sind erst kürzlich gepullt und werden dann ebenfalls gelöscht) + +## Wichtige Hinweise + +- **Alle öffentlich erreichbaren Dienste** nutzen das externe Netzwerk `traefik` und werden über [traefik](./docker/traefik.md) mit Let's Encrypt TLS terminiert. +- **Authelia läuft** als SSO-Provider mit OIDC. Gitea-Login funktioniert via OIDC. Passkey-Config aktualisiert (direct attestation + metadata validation). Siehe [authelia](./docker/authelia.md). +- **Gitea** OIDC-Integration abgeschlossen (Login via Authelia funktioniert). +- **Stirling PDF** (`pdf.*`) ist als erster Dienst über ForwardAuth (`chain-authelia`) geschützt. +- **Monitoring-Stack** läuft stabil (13h Uptime am 19.06.). +- **Immich verwendet Valkey** (nicht Redis) – `valkey/valkey:8`. +- **Alle Compose-Dateien** in `/opt/compose/` heißen `docker-compose.yml`. +- **`.env`-Dateien** existieren bei: `immich`, `paperless`, `wikijs`. + +## Verwandte Seiten + +- [docker-services](./docker-services.md) – Alle laufenden Dienste im Überblick +- [authelia](./docker/authelia.md) – SSO mit ForwardAuth und OIDC +- [opt-compose](./opt-compose.md) – Struktur von `/opt/compose/` +- [traefik](./docker/traefik.md) – Reverse-Proxy-Konfiguration +- [systemuebersicht](./systemuebersicht.md) diff --git a/PI5/Konfiguration/docker-services.md b/PI5/Konfiguration/docker-services.md new file mode 100644 index 0000000..8e99f3b --- /dev/null +++ b/PI5/Konfiguration/docker-services.md @@ -0,0 +1,100 @@ +# Docker-Dienste – Übersicht + +**Zusammenfassung**: 30 laufende + 1 gestoppter Container auf dem Raspberry PI5, aufgeteilt in 13 Stacks mit [authelia](./docker/authelia.md) aktiv. Die meisten Dienste sind über Traefik mit Let's Encrypt TLS erreichbar. +**Quellen**: 🔌 SSH Live-Abfrage (2026-06-19, 21:30), `raw/Systemdaten – Raspberry PI5.md` +**Zuletzt aktualisiert**: 2026-06-19 + +--- + +## Status-Übersicht + +### Laufende Container (30) + +| Container | Image | Status | Ports | +|---|---|---|---| +| `traefik` | `traefik:latest` | ✅ Up (13h) | 80, 443 (Host) | +| `plex` | `lscr.io/linuxserver/plex:latest` | ✅ Up (13h) | 32400, 1900/udp, 8324, 5353/udp, 32410/udp, 32412-32414/udp, 32469/tcp | +| `nextcloud` | `nextcloud:latest` | ✅ Up (13h) | 80 | +| `nextcloud-cron` | `nextcloud:latest` | ✅ Up (13h) | – | +| `nextcloud-db` | `mariadb:11.4` | ✅ Up (13h, healthy) | 3306 | +| `nextcloud-redis` | `redis:7-alpine` | ✅ Up (13h) | 6379 | +| `nextcloud-docker-proxy` | `tecnativa/docker-socket-proxy` | ✅ Up (13h) | 2375 | +| `immich_server` | `ghcr.io/immich-app/immich-server:v2` | ✅ Up (13h, healthy) | 2283 | +| `immich_machine_learning` | `ghcr.io/immich-app/immich-machine-learning:v2` | ✅ Up (13h, healthy) | – | +| `immich_redis` | `valkey/valkey:8` | ✅ Up (13h, healthy) | 6379 | +| `immich_postgres` | `ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0` | ✅ Up (13h, healthy) | 5432 | +| `stirling-pdf` | `frooodle/s-pdf:latest` | ✅ Up (13h, healthy) | 8080 | +| `paperless-webserver-1` | `ghcr.io/paperless-ngx/paperless-ngx:latest` | ✅ Up (13h, healthy) | 8000 | +| `paperless-broker-1` | `redis:8` | ✅ Up (13h) | 6379 | +| `paperless-db-1` | `postgres:18` | ✅ Up (13h) | 5432 | +| `paperless-gotenberg-1` | `gotenberg/gotenberg:8.25` | ✅ Up (13h) | 3000 | +| `paperless-tika-1` | `apache/tika:latest` | ✅ Up (13h) | 9998 | +| `wikijs` | `requarks/wiki:2` | ✅ Up (13h) | 3000, 3443 | +| `wikijs-db` | `postgres:16` | ✅ Up (13h) | 5432 | +| **`authelia`** | **`authelia/authelia:latest`** | **✅ Up (27 Min., healthy)** | **9091** | +| `gitea` | `gitea/gitea:latest` | ✅ Up (12h) | 3000, **2222 (SSH)** | +| `gitea-db-1` | `mariadb:10.11` | ✅ Up (13h) | 3306 | +| `jenkins` | `jenkins/jenkins:lts-jdk21` | ✅ Up (13h) | 8080, 50000 | +| `collabora` | `collabora/code:latest-arm64` | ✅ Up (13h, healthy) | 9980 | +| `nginx_pi5` | `nginx:alpine` | ✅ Up (13h) | 80 | +| `monitoring-prometheus` | `prom/prometheus:latest` | ✅ Up (13h) | 9090 | +| `monitoring-grafana` | `grafana/grafana:latest` | ✅ Up (13h) | 3000 | +| `monitoring-alertmanager` | `prom/alertmanager:latest` | ✅ Up (13h) | 9093 | +| `monitoring-cadvisor` | `gcr.io/cadvisor/cadvisor:latest` | ✅ Up (13h, healthy) | 8080 | +| `monitoring-node-exporter` | `prom/node-exporter:latest` | ✅ Up (13h) | 9100 | + +> **Hinweis**: Uptimes am 19.06.2026 um 21:30. Alle Container wurden ~13h zuvor neu gestartet. Gitea separat ~12h, Authelia zuletzt um 21:31 neu gestartet (WebAuthn- und OIDC-Config-Änderungen). +### Gestoppte Container (1) + +| Container | Image | Status | Hinweis | +|---|---|---|---| +| `laughing_clarke` | `hello-world` | ❌ Exited (6 Monate) | Einmal-Testcontainer | + +--- + +## Stack-Zuordnung + +| Stack-Verzeichnis | Dienste | +|---|---| +| `/opt/compose/traefik/` | traefik | +| `/opt/compose/plex/` | plex | +| `/opt/compose/nextcloud/` | nextcloud, nextcloud-cron, nextcloud-db, nextcloud-redis, nextcloud-docker-proxy | +| `/opt/compose/immich/` | immich_server, immich_machine_learning, immich_redis, immich_postgres | +| `/opt/compose/stirling-pdf/` | stirling-pdf | +| `/opt/compose/paperless/` | paperless-webserver, -db, -broker, -gotenberg, -tika | +| `/opt/compose/wikijs/` | wikijs, wikijs-db | +| `/opt/compose/gitea/` | gitea, gitea-db | +| `/opt/compose/jenkins/` | jenkins | +| `/opt/compose/collabora/` | collabora | +| `/opt/compose/nginx/` | nginx_pi5 | +| `/opt/compose/monitoring/` | prometheus, grafana, alertmanager, cadvisor, node-exporter | +| `/opt/compose/authelia/` | authelia | + +## Domain-Schema + +Alle Dienste folgen dem Muster `*.da.home-webserver.de`: + +| Subdomain | Dienst | Auth | +|---|---|---| +| `cloud.da.home-webserver.de` | Nextcloud | eigener Login | +| `office.da.home-webserver.de` | Collabora Online | iFrame-Bypass | +| `photos.da.home-webserver.de` | Immich (Fotos) | OIDC (geplant) | +| `git.da.home-webserver.de` | Gitea | OIDC (in Einrichtung) | +| `wiki.da.home-webserver.de` | Wiki.js | OIDC (geplant) | +| `paperless.da.home-webserver.de` | Paperless | ForwardAuth (geplant) | +| `pdf.da.home-webserver.de` | Stirling PDF | ForwardAuth ✅ | +| `music.da.home-webserver.de` | Plex | offen | +| `web.da.home-webserver.de` | Nginx Static | offen | +| `jenkins.da.home-webserver.de` | Jenkins | offen | +| `auth.da.home-webserver.de` | Authelia (SSO-Portal) | – | +| `traefik.da.home-webserver.de` | Traefik Dashboard | Basic-Auth (→ ForwardAuth geplant) | +| `prometheus.da.home-webserver.de` | Prometheus | Basic-Auth (→ ForwardAuth geplant) | +| `grafana.da.home-webserver.de` | Grafana | Grafana-intern | + +## Verwandte Seiten + +- [docker-grundlagen](./docker-grundlagen.md) – Netzwerke, Volumes, Basis +- [opt-compose](./opt-compose.md) – Verzeichnisstruktur +- [traefik](./docker/traefik.md) – Reverse Proxy +- [authelia](./docker/authelia.md) – SSO mit ForwardAuth und OIDC +- [domain-und-ssl](./domain-und-ssl.md) diff --git a/PI5/Konfiguration/docker/authelia.md b/PI5/Konfiguration/docker/authelia.md new file mode 100644 index 0000000..2a6e603 --- /dev/null +++ b/PI5/Konfiguration/docker/authelia.md @@ -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: # 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: + 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: +``` + +### `config/users.yml` + +```yaml +users: + dial: + password: + 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: + jwks: # ⚠️ In v4.39 heißt der Key `jwks`, NICHT `issuer_private_keys`! + - key_id: rpid + algorithm: RS256 + key: | + -----BEGIN PRIVATE KEY----- + + -----END PRIVATE KEY----- + clients: + # --------------------------------------------------------------- + # Gitea + # --------------------------------------------------------------- + - id: gitea + description: Gitea SSO + secret: + 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: + 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: + 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//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= +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: `` + - 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: `` + - 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/) diff --git a/PI5/Konfiguration/docker/collabora.md b/PI5/Konfiguration/docker/collabora.md new file mode 100644 index 0000000..9bae748 --- /dev/null +++ b/PI5/Konfiguration/docker/collabora.md @@ -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) diff --git a/PI5/Konfiguration/docker/gitea.md b/PI5/Konfiguration/docker/gitea.md new file mode 100644 index 0000000..c390a81 --- /dev/null +++ b/PI5/Konfiguration/docker/gitea.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 diff --git a/PI5/Konfiguration/docker/immich.md b/PI5/Konfiguration/docker/immich.md new file mode 100644 index 0000000..a0b63d5 --- /dev/null +++ b/PI5/Konfiguration/docker/immich.md @@ -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) diff --git a/PI5/Konfiguration/docker/jenkins.md b/PI5/Konfiguration/docker/jenkins.md new file mode 100644 index 0000000..79a5a7b --- /dev/null +++ b/PI5/Konfiguration/docker/jenkins.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) diff --git a/PI5/Konfiguration/docker/monitoring.md b/PI5/Konfiguration/docker/monitoring.md new file mode 100644 index 0000000..819ed94 --- /dev/null +++ b/PI5/Konfiguration/docker/monitoring.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) diff --git a/PI5/Konfiguration/docker/nextcloud.md b/PI5/Konfiguration/docker/nextcloud.md new file mode 100644 index 0000000..e07a8e8 --- /dev/null +++ b/PI5/Konfiguration/docker/nextcloud.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` diff --git a/PI5/Konfiguration/docker/nginx.md b/PI5/Konfiguration/docker/nginx.md new file mode 100644 index 0000000..5f82f37 --- /dev/null +++ b/PI5/Konfiguration/docker/nginx.md @@ -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) diff --git a/PI5/Konfiguration/docker/paperless.md b/PI5/Konfiguration/docker/paperless.md new file mode 100644 index 0000000..5548d80 --- /dev/null +++ b/PI5/Konfiguration/docker/paperless.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) diff --git a/PI5/Konfiguration/docker/plex.md b/PI5/Konfiguration/docker/plex.md new file mode 100644 index 0000000..a5b1766 --- /dev/null +++ b/PI5/Konfiguration/docker/plex.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) diff --git a/PI5/Konfiguration/docker/stirling-pdf.md b/PI5/Konfiguration/docker/stirling-pdf.md new file mode 100644 index 0000000..18766d3 --- /dev/null +++ b/PI5/Konfiguration/docker/stirling-pdf.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) diff --git a/PI5/Konfiguration/docker/traefik.md b/PI5/Konfiguration/docker/traefik.md new file mode 100644 index 0000000..6089547 --- /dev/null +++ b/PI5/Konfiguration/docker/traefik.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) diff --git a/PI5/Konfiguration/docker/wikijs.md b/PI5/Konfiguration/docker/wikijs.md new file mode 100644 index 0000000..6ebea08 --- /dev/null +++ b/PI5/Konfiguration/docker/wikijs.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) diff --git a/PI5/Konfiguration/domain-und-ssl.md b/PI5/Konfiguration/domain-und-ssl.md new file mode 100644 index 0000000..4fee002 --- /dev/null +++ b/PI5/Konfiguration/domain-und-ssl.md @@ -0,0 +1,41 @@ +# Domain & SSL + +**Zusammenfassung**: Alle Dienste laufen unter der Domain `da.home-webserver.de` mit Subdomains. TLS-Zertifikate werden automatisch per Let's Encrypt (HTTP-Challenge) über Traefik bezogen. +**Quellen**: `raw/Systemdaten – Raspberry PI5.md` +**Zuletzt aktualisiert**: 2026-06-17 + +--- + +## Domain-Schema + +``` +da.home-webserver.de +├── cloud.da.home-webserver.de → Nextcloud +├── office.da.home-webserver.de → Collabora Online +├── photos.da.home-webserver.de → Immich (vorgesehen, Labels auskommentiert) +├── da.home-webserver.de/jenkins → Jenkins (via Path Prefix) +└── ... → Weitere via File Provider +``` + +## Let's Encrypt + +- **Resolver-Name**: `le` +- **Challenge**: HTTP (Port 80) +- **E-Mail**: `dial-master@gmx.de` +- **Speicher**: `/opt/compose/traefik/acme.json` + +## Interne IPs + +Der PI5 ist unter zwei IPs erreichbar: +- `192.168.178.77` (eth0 – kabelgebunden) +- `192.168.178.66` (wlan0 – WLAN) + +## DNS + +Voraussetzung für den Betrieb ist, dass die öffentliche Domain auf die öffentliche IP des Routers zeigt und der Router Port 80/443 an den PI5 weiterleitet. Traefik selbst nutzt `8.8.8.8` und `1.1.1.1` als DNS-Resolver. + +## Verwandte Seiten + +- [traefik](./docker/traefik.md) – Let's-Encrypt-Konfiguration im Detail +- [systemuebersicht](./systemuebersicht.md) +- [docker-services](./docker-services.md) diff --git a/PI5/Konfiguration/etc/cryptsetup.md b/PI5/Konfiguration/etc/cryptsetup.md new file mode 100644 index 0000000..0d1d206 --- /dev/null +++ b/PI5/Konfiguration/etc/cryptsetup.md @@ -0,0 +1,82 @@ +# cryptsetup – Befehle für LUKS-Container + +**Zusammenfassung**: Die wichtigsten `cryptsetup`-Befehle zur Verwaltung von LUKS-verschlüsselten Containern – vom Öffnen und Schließen bis zur Schlüsselverwaltung. +**Quellen**: `chats/fstab und crypttab.md` +**Zuletzt aktualisiert**: 2026-06-16 + +--- + +## Übersicht + +`cryptsetup` ist das Werkzeug zur Einrichtung und Verwaltung von **dm-crypt** + **LUKS**-Verschlüsselung. Auf dem Raspberry PI5 werden zwei LUKS2-Container verwendet ([crypttab](./crypttab.md)). + +## Befehle nach Aufgaben gruppiert + +### Container öffnen und schließen + +```bash +# LUKS-Container öffnen (entschlüsseln) +sudo cryptsetup luksOpen /dev/sdX3 container_name --key-file /pfad/zur/schluesseldatei.bin + +# Beispiel: encrypt_data öffnen +sudo cryptsetup luksOpen /dev/sdb3 encrypt_data --key-file /mnt/usb_key/twotb.bin + +# Beispiel: encrypt_sdc3 öffnen +sudo cryptsetup luksOpen /dev/sdc3 encrypt_sdc3 --key-file /mnt/usb_key/onetb.bin + +# Container schließen (verschlüsseln) +sudo cryptsetup luksClose container_name +``` + +### Schlüsselverwaltung + +```bash +# Neuen Schlüssel (Key-File) zu einem LUKS-Container hinzufügen +sudo cryptsetup luksAddKey /dev/sdX3 /pfad/neuer-schluessel.bin + +# Vorhandene Schlüssel auflisten +sudo cryptsetup luksDump /dev/sdX3 + +# Schlüssel entfernen +sudo cryptsetup luksRemoveKey /dev/sdX3 +``` + +### Status und Informationen + +```bash +# LUKS-Header-Informationen anzeigen +sudo cryptsetup luksDump /dev/sdX3 + +# Prüfen, ob ein Device LUKS ist +sudo cryptsetup isLuks /dev/sdX3 + +# Status eines geöffneten Containers anzeigen +sudo cryptsetup status container_name +``` + +## Schlüsseldatei erstellen + +Eine sichere Schlüsseldatei wird mit `/dev/urandom` erzeugt: + +```bash +# 4KB zufällige Schlüsseldatei erstellen +sudo dd if=/dev/urandom of=/mnt/usb_key/mein-schluessel.bin bs=4096 count=4 + +# Berechtigungen setzen (nur root lesen) +sudo chmod 0400 /mnt/usb_key/mein-schluessel.bin + +# Schlüssel zu LUKS-Container hinzufügen +sudo cryptsetup luksAddKey /dev/sdX3 /mnt/usb_key/mein-schluessel.bin +``` + +## Wichtige Hinweise + +- `luksAddKey` fragt nach einer **vorhandenen Passphrase oder einem vorhandenen Schlüssel**, bevor der neue hinzugefügt wird. +- Schlüsseldateien sollten **nur von root lesbar** sein (`chmod 0400`). +- Der USB-Stick mit den Schlüsseln muss **physisch sicher** aufbewahrt werden. + +## Verwandte Seiten + +- [crypttab](./crypttab.md) – Automatisierte Entschlüsselung beim Boot +- [luks-verschluesselung](../luks-verschluesselung.md) – LUKS-Konzepte und Arbeitsweise +- [persistente-blockgeraete](../persistente-blockgeraete.md) – UUID vs. /dev/sdX diff --git a/PI5/Konfiguration/etc/crypttab.md b/PI5/Konfiguration/etc/crypttab.md new file mode 100644 index 0000000..d76194d --- /dev/null +++ b/PI5/Konfiguration/etc/crypttab.md @@ -0,0 +1,52 @@ +# crypttab – LUKS-Entschlüsselungstabelle + +**Zusammenfassung**: Die `/etc/crypttab` steuert, welche LUKS-verschlüsselten Container beim Boot automatisch geöffnet werden. Der Raspberry PI5 verwendet zwei LUKS2-Container, die mit Schlüsseldateien auf einem USB-Stick entsperrt werden. +**Quellen**: `konfigurationsdateien/crypttab`, `chats/fstab und crypttab.md` +**Zuletzt aktualisiert**: 2026-06-16 + +--- + +## Aktuelle crypttab + +``` +# +encrypt_data UUID=097bccad-d77d-48bb-9365-9ca2187cf66b /mnt/usb_key/twotb.bin luks,tries=3,x-systemd.requires=mnt-usb_key.mount,x-systemd.after=mnt-usb_key.mount,x-systemd.device-timeout=15s +encrypt_sdc3 UUID=82550dc2-61f7-415e-8335-0d75c89f9629 /mnt/usb_key/onetb.bin luks,tries=3,x-systemd.requires=mnt-usb_key.mount,x-systemd.after=mnt-usb_key.mount,x-systemd.device-timeout=15s +``` + +## Spalten erklärt + +### 1. Zielname (``) +Der Name des gemappten Devices unter `/dev/mapper/`. Wird später in der [fstab](./fstab.md) als `` verwendet. + +- `encrypt_data` → `/dev/mapper/encrypt_data` → wird gemountet als `/mnt/data` +- `encrypt_sdc3` → `/dev/mapper/encrypt_sdc3` → wird gemountet als `/media/piadmin/data` + +### 2. Quelldevice (``) +Das physische LUKS-Device, identifiziert per **UUID** (persistent und sdX-unabhängig). + +- `UUID=097bccad-...` → sdb3 (LUKS-Container für `/mnt/data`) +- `UUID=82550dc2-...` → sdc3 (LUKS-Container für `/media/piadmin/data`) + +### 3. Schlüsseldatei (``) +Der Pfad zur Datei, die den Entschlüsselungsschlüssel enthält. + +- `/mnt/usb_key/twotb.bin` – Schlüssel für `encrypt_data` (2TB-Laufwerk) +- `/mnt/usb_key/onetb.bin` – Schlüssel für `encrypt_sdc3` (1TB-Laufwerk) + +**Wichtig**: Der USB-Stick (`/dev/sda1`, gemountet als `/mnt/usb_key`) muss **vor** dem Entschlüsseln verfügbar sein – deshalb die `x-systemd.*`-Optionen (siehe [systemd-cryptsetup](./systemd-cryptsetup.md)). + +### 4. Optionen (``) +- **luks** – LUKS-Modus (Standard für LUKS-Container) +- **tries=3** – Maximale Fehlversuche bei der Entschlüsselung +- **x-systemd.requires=mnt-usb_key.mount** – systemd: Der USB-Key-Mount muss aktiv sein +- **x-systemd.after=mnt-usb_key.mount** – systemd: Erst mounten, dann entschlüsseln +- **x-systemd.device-timeout=15s** – systemd: Zeitlimit für das Warten auf das Device + +## Verwandte Seiten + +- [fstab](./fstab.md) – Mountet die geöffneten LUKS-Container +- [systemd-cryptsetup](./systemd-cryptsetup.md) – systemd-Boot-Reihenfolge im Detail +- [cryptsetup](./cryptsetup.md) – cryptsetup-Befehle +- [luks-verschluesselung](../luks-verschluesselung.md) – LUKS-Konzepte +- [persistente-blockgeraete](../persistente-blockgeraete.md) – Warum UUID statt /dev/sdX diff --git a/PI5/Konfiguration/etc/fstab.md b/PI5/Konfiguration/etc/fstab.md new file mode 100644 index 0000000..91183d6 --- /dev/null +++ b/PI5/Konfiguration/etc/fstab.md @@ -0,0 +1,61 @@ +# fstab – Dateisystemtabelle + +**Zusammenfassung**: Die `/etc/fstab` steuert, welche Dateisysteme wo und mit welchen Optionen gemountet werden. Alle Einträge verwenden persistente Referenzen (PARTUUID oder `/dev/mapper/`), um sdX-Vertauschungen zu vermeiden. +**Quellen**: `konfigurationsdateien/fstab`, `chats/fstab und crypttab.md` +**Zuletzt aktualisiert**: 2026-06-16 + +--- + +## Aktuelle fstab + +``` +# +PARTUUID=228e9390-01 /boot/firmware vfat defaults,noatime 0 0 +PARTUUID=228e9390-02 / ext4 defaults,noatime 0 1 +/dev/mapper/encrypt_data /mnt/data ext4 defaults,nofail 0 2 +/dev/disk/by-partuuid/83910788-01 /media/piadmin/bootfs vfat defaults,noatime 0 0 +/dev/disk/by-partuuid/83910788-02 /media/piadmin/rootfs ext4 defaults,noatime 0 2 +/dev/mapper/encrypt_sdc3 /media/piadmin/data ext4 defaults,nofail 0 2 +# swap devices handled by systemd/zram (not in fstab) +``` + +## Spalten erklärt + +### 1. Dateisystem (``) +- **PARTUUID=...** – Persistente Partition-ID (bleibt gleich, auch wenn sich `/dev/sdX` ändert) +- **/dev/mapper/...** – Gemappter LUKS-Container-Name (von cryptsetup erzeugt) +- **/dev/disk/by-partuuid/...** – Alternativer persistenter Pfad über partuuid + +### 2. Mountpunkt (``) +Der Pfad, unter dem das Dateisystem eingehängt wird. + +### 3. Dateisystemtyp (``) +- `vfat` – FAT32 (für Boot-Partition) +- `ext4` – Standard-Linux-Dateisystem (für Root und Daten) + +### 4. Mount-Optionen (``) +- **defaults** – Standard-Optionen (rw, suid, dev, exec, auto, nouser, async) +- **noatime** – Unterdrückt Zugriffszeitstempel, spart Schreibzugriffe +- **nofail** – Boot fährt fort, auch wenn das Device nicht verfügbar ist (wichtig für LUKS-Container, die erst geöffnet werden müssen) + +### 5. Dump (``) +- `0` – Kein Backup mit dump (immer 0 auf modernen Systemen) + +### 6. Pass (``) +- `0` – Kein fsck-Durchlauf +- `1` – fsck als erstes (nur Root-Dateisystem) +- `2` – fsck danach (alle anderen) + +## Besonderheiten + +- **Swap fehlt in der fstab**: Der Raspberry PI5 verwendet **zram** und **loop** für Swap, die von systemd automatisch verwaltet werden. Siehe [swap-zram](../swap-zram.md). +- **FAT32 und fsck**: vfat wird nicht von `fsck.ext4` geprüft – daher `pass 0`. +- **LUKS-Mapper**: `/dev/mapper/encrypt_data` und `/dev/mapper/encrypt_sdc3` werden erst beim Boot durch cryptsetup erzeugt (siehe [crypttab](./crypttab.md)). + +## Verwandte Seiten + +- [crypttab](./crypttab.md) – LUKS-Entschlüsselungskonfiguration +- [persistente-blockgeraete](../persistente-blockgeraete.md) – UUID, PARTUUID, by-partuuid +- [luks-verschluesselung](../luks-verschluesselung.md) – LUKS-Konzepte +- [sdx-vertauschung](../sdx-vertauschung.md) – Warum persistente Referenzen wichtig sind +- [swap-zram](../swap-zram.md) – Swap-Konfiguration diff --git a/PI5/Konfiguration/etc/systemd-cryptsetup.md b/PI5/Konfiguration/etc/systemd-cryptsetup.md new file mode 100644 index 0000000..e955325 --- /dev/null +++ b/PI5/Konfiguration/etc/systemd-cryptsetup.md @@ -0,0 +1,86 @@ +# systemd-cryptsetup – Boot-Reihenfolge und Abhängigkeiten + +**Zusammenfassung**: systemd steuert die Reihenfolge beim Boot: Zuerst muss der USB-Stick mit den Schlüsseldateien gemountet sein, dann können die LUKS-Container geöffnet werden. Spezielle crypttab-Optionen stellen dies sicher. +**Quellen**: `chats/fstab und crypttab.md`, `konfigurationsdateien/crypttab` +**Zuletzt aktualisiert**: 2026-06-16 + +--- + +## Die Herausforderung + +Die LUKS-Container auf sdb3 und sdc3 werden mit Schlüsseldateien auf einem USB-Stick (`/dev/sda1`) entsperrt. Beim Boot muss systemd sicherstellen: + +1. **USB-Stick mounten** (`/mnt/usb_key`) +2. **Dann erst** die LUKS-Container öffnen (Schlüsseldatei liegt auf dem USB-Stick) +3. **Dann** die Dateisysteme mounten (siehe [fstab](./fstab.md)) + +## Lösung: systemd-Optionen in der crypttab + +Die crypttab-Einträge enthalten systemd-spezifische Optionen: + +``` +encrypt_data UUID=097bccad-... /mnt/usb_key/twotb.bin luks,tries=3,\ + x-systemd.requires=mnt-usb_key.mount,\ + x-systemd.after=mnt-usb_key.mount,\ + x-systemd.device-timeout=15s +``` + +### Optionen im Detail + +| Option | Wirkung | +|---|---| +| `x-systemd.requires=mnt-usb_key.mount` | Stellt sicher, dass der USB-Key-Mount **aktiv** ist, bevor der LUKS-Container geöffnet wird. Schlägt der Mount fehl, wird auch der Container nicht geöffnet. | +| `x-systemd.after=mnt-usb_key.mount` | Legt die **Reihenfolge** fest: Der USB-Key-Mount muss **vor** dem Container-Öffnen gestartet werden. | +| `x-systemd.device-timeout=15s` | systemd wartet maximal 15 Sekunden auf das Device (falls der USB-Stick langsam initialisiert). | +| `tries=3` | Maximale Anzahl an Fehlversuchen bei der Entschlüsselung. | + +### Wie der Unit-Name zustande kommt + +Der systemd-Mount-Name folgt einer festen Konvention: Pfade werden mit `-` statt `/` und `.mount` als Suffix geschrieben. + +- `/mnt/usb_key` → `mnt-usb_key.mount` +- `/mnt/data` → `mnt-data.mount` + +## Ablauf beim Boot + +``` +USB-Stick wird erkannt (udev) + │ + ▼ +mnt-usb_key.mount (systemd mount unit) + │ + ├── x-systemd.requires ──┐ + ├── x-systemd.after ─────┤ + │ ▼ + │ systemd-cryptsetup@encrypt_data.service + │ systemd-cryptsetup@encrypt_sdc3.service + │ │ + │ ▼ + │ /dev/mapper/encrypt_data ← verfügbar + │ /dev/mapper/encrypt_sdc3 ← verfügbar + │ + ▼ +mnt-data.mount (aus /etc/fstab) +media-piadmin-data.mount (aus /etc/fstab) +``` + +## Fehlerbehebung + +```bash +# Status des Container-Öffnens prüfen +journalctl -b -u systemd-cryptsetup@encrypt_data.service -e +journalctl -b -u systemd-cryptsetup@encrypt_sdc3.service -e + +# Prüfen, ob der USB-Stick gemountet ist +lsblk /dev/sda +mount | grep usb_key + +# systemd-Abhängigkeiten visualisieren +systemctl list-dependencies mnt-data.mount +``` + +## Verwandte Seiten + +- [crypttab](./crypttab.md) – Die crypttab-Konfiguration +- [fstab](./fstab.md) – Mountet die geöffneten Container +- [cryptsetup](./cryptsetup.md) – Manuelle cryptsetup-Befehle diff --git a/PI5/Konfiguration/index.md b/PI5/Konfiguration/index.md new file mode 100644 index 0000000..51aa39f --- /dev/null +++ b/PI5/Konfiguration/index.md @@ -0,0 +1,68 @@ +# Konfigurationsindex – Raspberry PI5 + +**Zusammenfassung**: Inhaltsverzeichnis aller Konfigurationsseiten des Raspberry-PI5-Systems `da-server-pi5`. +**Quellen**: Systemkonfiguration, Docker-Compose-Stacks, Chat-Dokumentation +**Zuletzt aktualisiert**: 2026-06-18 + +--- + +## System & Hardware + +| Seite | Quelle | +|---|---| +| [systemuebersicht](./systemuebersicht.md) – OS, Kernel, RAM, Docker-Status, Systemd-Dienste | 🖥️ Script + 🔌 SSH | +| [laufwerke-und-speicher](./laufwerke-und-speicher.md) – Laufwerke, Partitionen, LUKS, Speicherbelegung | 🖥️ Script + 🔌 SSH | +| [hardware](../Allgemein/hardware.md) – PI5-Hardware: CPU, USB, Temperatur, Boot-Config | 🔌 SSH | +| [netzwerk](../Allgemein/netzwerk.md) – Interfaces, DNS, Ports, öffentliche Dienste | 🔌 SSH | +| [sicherheit](../Allgemein/sicherheit.md) – SSH, Benutzer, LUKS, bekannte Lücken | 🔌 SSH | + +## Systemkonfiguration (`/etc/`) + +- [fstab](./etc/fstab.md) – Dateisystemtabelle: Mountpunkte, Optionen, persistente Referenzen +- [crypttab](./etc/crypttab.md) – LUKS-Entschlüsselungstabelle: automatisierte Container-Öffnung beim Boot +- [cryptsetup](./etc/cryptsetup.md) – cryptsetup-Befehle: LUKS-Container öffnen, schließen, Schlüssel verwalten +- [systemd-cryptsetup](./etc/systemd-cryptsetup.md) – systemd-Integration: Boot-Reihenfolge und Abhängigkeiten + +### Laufwerke & Verschlüsselung + +- [persistente-blockgeraete](./persistente-blockgeraete.md) – UUID, PARTUUID, `/dev/disk/by-*`: Stabile Geräte-Referenzen +- [sdx-vertauschung](./sdx-vertauschung.md) – sdX-Vertauschungsproblem: Ursachen und Lösung +- [luks-verschluesselung](./luks-verschluesselung.md) – LUKS-Verschlüsselung: Konzepte und Arbeitsweise +- [swap-zram](./swap-zram.md) – Swap via zram und loop + +## Docker + +| Seite | Quelle | +|---|---| +| [docker-grundlagen](./docker-grundlagen.md) – Docker-Version, Netzwerke, Volumes, Image-Aufräumpotential | 🖥️ Script + 🔌 SSH (18.06., Update 20:00) | +| [docker-services](./docker-services.md) – Alle 31 Container (30 laufend) im Überblick | 🔌 SSH Live (18.06., Update 20:00) | +| [opt-compose](./opt-compose.md) – Struktur von `/opt/compose/` | 🖥️ Script | +| [traefik](./docker/traefik.md) – Reverse Proxy mit File Provider (vollständige Routing-Tabelle) | 🖥️ Script + 🔌 SSH | +| [nextcloud](./docker/nextcloud.md) – Cloud-Speicher mit MariaDB, Redis | 🖥️ Script | +| [immich](./docker/immich.md) – Foto-Management mit ML-Suche | 🖥️ Script | +| [paperless](./docker/paperless.md) – Dokumentenmanagement mit OCR | 🖥️ Script | +| [plex](./docker/plex.md) – Media Server | 🖥️ Script | +| [gitea](./docker/gitea.md) – Git-Service mit MariaDB (seit 17.06.: `restart: unless-stopped`, läuft wieder) | 🖥️ Script + 🔌 SSH | +| [jenkins](./docker/jenkins.md) – CI/CD mit Docker-Socket-Zugriff | 🖥️ Script | +| [collabora](./docker/collabora.md) – Online Office (WOPI-Integration in Nextcloud) | 🖥️ Script | +| [wikijs](./docker/wikijs.md) – Wissensdatenbank mit PostgreSQL | 🖥️ Script | +| [stirling-pdf](./docker/stirling-pdf.md) – PDF-Bearbeitung | 🖥️ Script | +| [nginx](./docker/nginx.md) – Static Webserver | 🖥️ Script | +| [authelia](./docker/authelia.md) – SSO mit Passkey (aktiv seit 18.06.) | 🔌 SSH Live (18.06.) | +| [monitoring](./docker/monitoring.md) – Prometheus/Grafana-Stack (wieder aktiv seit 17.06.) | 🔌 SSH Live (18.06.) | + +## Netzwerk & Zugriff + +| Seite | Quelle | +|---|---| +| [domain-und-ssl](./domain-und-ssl.md) – Domain `da.home-webserver.de`, Let's Encrypt, DNS | 🖥️ Script + 🔌 SSH | + +--- + +## Quelldokumente (unveränderlich) + +- `chats/fstab und crypttab.md` – Chat-Verlauf zur LUKS-Mount-Einrichtung +- `konfigurationsdateien/fstab` – Aktive fstab des Systems +- `konfigurationsdateien/crypttab` – Aktive crypttab des Systems +- `raw/Systemdaten – Raspberry PI5.md` – Systemdaten-Ausgabe vom 17.06.2026 +- `raw/Systemdaten – Raspberry PI5 – 2026-06-18.md` – Live-Systemdaten via SSH vom 18.06.2026 diff --git a/PI5/Konfiguration/laufwerke-und-speicher.md b/PI5/Konfiguration/laufwerke-und-speicher.md new file mode 100644 index 0000000..faa9a6c --- /dev/null +++ b/PI5/Konfiguration/laufwerke-und-speicher.md @@ -0,0 +1,114 @@ +# Laufwerke und Speicher + +**Zusammenfassung**: Der Raspberry PI5 hat drei physische Laufwerke (USB-Key, 931-GB-SSD auf sdb, 1,8-TB-SSD auf sdc) mit zwei LUKS2-verschlüsselten Datenpartitionen. Beide Partitionen enthalten identische Daten – vermutlich eine 1:1-Kopie. +**Quellen**: 🖥️ `raw/Systemdaten – Raspberry PI5.md`, 🔌 SSH +**Zuletzt aktualisiert**: 2026-06-17 + +--- + +## Laufwerke (lsblk) + +``` +NAME SIZE TYPE FSTYPE FSVER LABEL MOUNTPOINT +sda 966M disk +└─sda1 964M part ext4 1.0 LUKS_KEY /mnt/usb_key +sdb 931.5G disk +├─sdb1 512M part vfat FAT32 bootfs /media/piadmin/bootfs +├─sdb2 237.8G part ext4 1.0 rootfs /media/piadmin/rootfs +└─sdb3 693.2G part crypto_LUKS 2 + └─encrypt_sdc3 693.2G crypt ext4 1.0 /media/piadmin/data +sdc 1.8T disk +├─sdc1 512M part vfat FAT32 bootfs /boot/firmware +├─sdc2 306.8G part ext4 1.0 rootfs / +└─sdc3 1.5T part crypto_LUKS 2 + └─encrypt_data 1.5T crypt ext4 1.0 /mnt/data +zram0 2G disk swap 1 zram0 [SWAP] +loop0 2G loop swap 1 +``` + +## Speicherbelegung (df -h) + +| Mountpunkt | Größe | Belegt | Verfügbar | Belegt % | +|---|---|---|---|---| +| `/` (sdc2) | 302 GB | 200 GB | 90 GB | **70 %** | +| `/boot/firmware` (sdc1) | 510 MB | 82 MB | 429 MB | 16 % | +| `/media/piadmin/bootfs` (sdb1) | 510 MB | 79 MB | 432 MB | 16 % | +| `/media/piadmin/rootfs` (sdb2) | 234 GB | 35 GB | 188 GB | 16 % | +| `/mnt/data` (encrypt_data) | 1,5 TB | 646 GB | 807 GB | 45 % | +| `/media/piadmin/data` (encrypt_sdc3) | 682 GB | 646 GB | 1,3 GB | **100 % 🔴** | + +## Partitionen und IDs + +| Device | PARTUUID | UUID (FS) | UUID (LUKS) | Label | +|---|---|---|---|---| +| sda1 | `74c328f0-...` | `1473da78-...` | – | `LUKS_KEY` | +| sdb1 | `83910788-01` | `F737-8E10` | – | `bootfs` | +| sdb2 | `83910788-02` | `d6ecfcd5-...` | – | `rootfs` | +| sdb3 | `83910788-03` | – | `82550dc2-...` | – | +| sdc1 | `228e9390-01` | `F587-071F` | – | `bootfs` | +| sdc2 | `228e9390-02` | `d6944274-...` | – | `rootfs` | +| sdc3 | `228e9390-03` | – | `097bccad-...` | – | + +## Detail: Speicherbelegung nach Verzeichnis + +| Verzeichnis | Belegung | +|---|---| +| `/mnt/data/Media/` | **467 GB** | +| `/mnt/data/nextcloud/` | **92 GB** | +| `/mnt/data/immich/` | **69 GB** | +| `/mnt/data/PI2Backup/` | **18 GB** | +| `/mnt/data/paperless/` | **966 MB** | +| `/mnt/data/www/` | **722 MB** | + +(Quelle: `du -sh /mnt/data/*/`) + +## 🔴 Wichtige Feststellung: Zwei Partitionen, identische Daten + +**`/mnt/data`** (1,5 TB, 45 % voll) und **`/media/piadmin/data`** (682 GB, 100 % voll) haben **exakt dieselbe Verzeichnisstruktur und Dateibelegung**: + +| Verzeichnis | `/mnt/data` | `/media/piadmin/data` | +|---|---|---| +| Media/ | 467 GB | 467 GB | +| nextcloud/ | 92 GB | 92 GB | +| immich/ | 69 GB | 69 GB | +| PI2Backup/ | 18 GB | 18 GB | +| paperless/ | 966 MB | 966 MB | +| www/ | 722 MB | 722 MB | + +Es handelt sich um **zwei separate LUKS-Partitionen** (nicht um einen Bind-Mount oder Symlink). Vermutlich wurden die Daten von der kleineren (682 GB) auf die größere (1,5 TB) Partition kopiert und die Konfiguration läuft inzwischen über die größere. Während `/mnt/data` noch 807 GB frei hat, ist `/media/piadmin/data` komplett voll. + +**Die Dienste sind wie folgt konfiguriert:** +- **Immich** schreibt nach `/mnt/data/immich/` (via `.env`-Variable `UPLOAD_LOCATION`) +- **Nextcloud**, **Paperless**, **Media** liegen auf `/mnt/data/` (Bind-Mounts in den Compose-Dateien) + +→ `/media/piadmin/data` scheint nicht mehr aktiv von Diensten genutzt zu werden, belegt aber 646 GB wertvollen SSD-Platz. Eine Bereinigung oder Deaktivierung dieser Partition wäre sinnvoll. + +## Krytische Warnung + +**🔴 `/media/piadmin/data` ist zu 100 % voll** (646 GB von 682 GB). Aktuell aktiv genutzte Dienste scheinen jedoch auf `/mnt/data` zu schreiben, sodass dies nur ein Platzproblem, aber kein akutes Betriebsproblem darstellt. + +## LUKS-Container + +| Mapper | Physisch | Schlüsseldatei | Mount | +|---|---|---|---| +| `encrypt_data` | sdc3 (1,5 TB) | `/mnt/usb_key/twotb.bin` | `/mnt/data` | +| `encrypt_sdc3` | sdb3 (693 GB) | `/mnt/usb_key/onetb.bin` | `/media/piadmin/data` | + +Siehe [crypttab](./etc/crypttab.md) und [luks-verschluesselung](./luks-verschluesselung.md). + +## Swap + +- **zram0**: 2 GB komprimierter RAM-Swap +- **loop0**: 2 GB Datei-basierter Swap + +Beide werden von systemd verwaltet, ohne fstab-Eintrag. Siehe [swap-zram](./swap-zram.md). + +## Verwandte Seiten + +- [fstab](./etc/fstab.md) +- [crypttab](./etc/crypttab.md) +- [luks-verschluesselung](./luks-verschluesselung.md) +- [persistente-blockgeraete](./persistente-blockgeraete.md) +- [sdx-vertauschung](./sdx-vertauschung.md) +- [swap-zram](./swap-zram.md) +- [systemuebersicht](./systemuebersicht.md) diff --git a/PI5/Konfiguration/log.md b/PI5/Konfiguration/log.md new file mode 100644 index 0000000..4084e40 --- /dev/null +++ b/PI5/Konfiguration/log.md @@ -0,0 +1,107 @@ +# Änderungslog – Systemkonfiguration Raspberry PI5 + + + +**Zusammenfassung**: Chronologische Übersicht aller Änderungen an der Systemkonfiguration. +**Quellen**: Eigene Aufzeichnungen +**Zuletzt aktualisiert**: 2026-06-19 (Update 21:45) + +**Legende**: +- 🖥️ `sammle-systemdaten.sh` – Daten per Script-Ausführung auf dem PI5 erfasst +- 🔌 SSH – Daten per direktem SSH-Zugriff auf den PI5 erhoben (lesend) +- 🧑 Benutzer – manuelle Änderung auf dem PI5 durch den Benutzer +- 🧭 Konzept – Planungsdokument (noch nicht umgesetzt) + +--- + +| Datum | Typ | Uhrzeit | Quelle | Zugriff | Änderung | +| ---------- | ------------ | ---------- | ------------------------------------------------- | ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 2026-06-19 | Aktualisiert | 21:45 | Alle Docker-Dokumente | 🔌 SSH | Live-Daten neu eingelesen: 188 Images/174,1 GB, Uptimes 13h, WebAuthn-Config, consent_mode dokumentiert | +| 2026-06-19 | Aktualisiert | ~21:31 | `authelia configuration.yml` | 🧑 Benutzer | WebAuthn-Block überarbeitet: direct attestation, metadata validation, enable_passkey_login, filtering | +| 2026-06-19 | Aktualisiert | ~21:31 | `authelia configuration.yml` | 🧑 Benutzer | OIDC-Gitea-Client: consent_mode pre-configured + 3 Monate Dauer | +| 2026-06-18 | Aktualisiert | 21:30 | `Konfiguration/log.md` | 🔌 SSH | Struktur auf flache Tabelle mit Datums-Spalte umgestellt | +| 2026-06-18 | Aktualisiert | 21:15 | Alle Docker-Dokumente | 🔌 SSH | Live-Daten neu eingelesen: 30 laufend, authelia & gitea Uptimes, Image-Statistik 187/173,9 GB, Routing-Tabelle aktualisiert, authelia-Status auf ✅ aktiv | +| 2026-06-18 | Aktualisiert | 21:15 | `Konfiguration/log.md` | 🔌 SSH | Uhrzeit-Spalte ergänzt | +| 2026-06-18 | ✅ | 21:10 | Gitea OIDC | 🧑 Benutzer | Gitea-Login via Authelia OIDC funktioniert | +| 2026-06-18 | Korrektur | 21:10 | `authelia configuration.yml` | 🧑 Benutzer | Zweite redirect_uri mit `Authelia` (groß A) ergänzt | +| 2026-06-18 | Fehler | ~20:08 | Gitea OIDC | 🧑 Benutzer | redirect_uri `authelia/callback` vs `Authelia/callback` (Case-Sensitivity) | +| 2026-06-18 | Aktualisiert | 20:07 | `0150-stirling.yml` (Traefik) | 🧑 Benutzer | Stirling PDF auf `chain-authelia` umgestellt – erster Dienst mit ForwardAuth | +| 2026-06-18 | Korrektur | 20:07 | `authelia configuration.yml` | 🧑 Benutzer | PEM-Footer korrigiert, Authelia startet mit OIDC | +| 2026-06-18 | Fehler | 20:01 | Authelia OIDC | 🔌 SSH | PEM-Footer `----` (4 Striche) statt `-----` (5) – Authelia stürzt ab | +| 2026-06-18 | Korrektur | 20:01 | `authelia configuration.yml` | 🧑 Benutzer | `issuer_private_keys` → `jwks` umbenannt | +| 2026-06-18 | Fehler | 17:50 | Authelia OIDC | 🔌 SSH | `issuer_private_keys` ist in v4.39 deprecated, OIDC startet nicht (`jwks` erforderlich) | +| 2026-06-18 | Korrektur | ~17:50 | `authelia configuration.yml` | 🧑 Benutzer | RSA-Key eingesetzt (Platzhalter ersetzt), `encryption_key`, `session.secret`, `jwt_secret` gesetzt | +| 2026-06-18 | Korrektur | 17:33 | `authelia configuration.yml` | 🧑 Benutzer | User-Key `dial` → `Dial` (case-sensitive) | +| 2026-06-18 | Aktualisiert | ~Vormittag | `Konfiguration/log.md` | 🔌 SSH | Dieser Eintrag | +| 2026-06-18 | Aktualisiert | ~Vormittag | `Konfiguration/index.md` | 🔌 SSH | Datenstände aktualisiert, neuer Raw-Dump verlinkt | +| 2026-06-18 | Aktualisiert | ~Vormittag | `Konfiguration/opt-compose.md` | 🔌 SSH | authelia/ im Verzeichnisbaum ergänzt | +| 2026-06-18 | Aktualisiert | ~Vormittag | `Konfiguration/docker/traefik.md` | 🔌 SSH | Verweis auf Authelia ergänzt, Routing-Tabelle um `auth.*` erweitert | +| 2026-06-18 | Aktualisiert | ~Vormittag | `Konfiguration/docker-grundlagen.md` | 🔌 SSH | 29 laufend (statt 28), Monitoring läuft wieder, Valkey-Notiz (immich), dangling Images, anonyme Volumes 152→~151 | +| 2026-06-18 | Aktualisiert | ~Vormittag | `Konfiguration/docker-services.md` | 🔌 SSH | Container-Statistik von 28→29 laufend, Monitoring läuft (war exited), Gitea (alt) entfernt, alle Image-Versionen & Ports live korrigiert, Uptimes aktualisiert | +| 2026-06-18 | Neu | ~Vormittag | `Konfiguration/docker/authelia.md` | 🧭 Konzept | SSO-Planungsseite: Authelia mit ForwardAuth, Passkey-Unterstützung, Migrationsplan | +| 2026-06-18 | Daten | ~Vormittag | `raw/Systemdaten – Raspberry PI5 – 2026-06-18.md` | 🔌 SSH | Live-Dump via SSH (docker ps, stats, images, networks, volumes, df) | +| 2026-06-17 | Aktualisiert | – | `Konfiguration/log.md` | 🔌 SSH | Legende mit Zugriffs-Markern ergänzt | +| 2026-06-17 | Aktualisiert | – | `Konfiguration/index.md` | 🔌 SSH | Quellen-Marker (🖥️ Script / 🔌 SSH) pro Seite ergänzt | +| 2026-06-17 | Aktualisiert | – | `Konfiguration/docker-grundlagen.md` | 🔌 SSH | Container-Statistik 30/28/2, 133 GB reclaimable Images, 152 anonyme Volumes, `.env`-Dateien dokumentiert | +| 2026-06-17 | Aktualisiert | – | `Konfiguration/docker/traefik.md` | 🔌 SSH | Vollständige Routing-Tabelle aus File-Provider-YAMLs (14 Dienste), Middleware-Chains, Auth-Status pro Dienst | +| 2026-06-17 | Aktualisiert | – | `Konfiguration/laufwerke-und-speicher.md` | 🔌 SSH | Detail-Belegung per Verzeichnis; Erkenntnis: `/mnt/data` und `/media/piadmin/data` haben identische Daten – zwei getrennte Partitionen mit 1:1-Kopie | +| 2026-06-17 | Aktualisiert | – | `Konfiguration/systemuebersicht.md` | 🔌 SSH | Docker-Statistik (30 Container, 28 laufend), Systemd-Dienste & Timer, Load Average, Image-Aufräumpotential | +| 2026-06-17 | Neu | – | `Allgemein/sicherheit.md` | 🔌 SSH | Sicherheits-Seite: SSH-Key-only, piadmin-Gruppen (docker!), LUKS, bekannte Lücken (Grafana-PW, Collabora) | +| 2026-06-17 | Neu | – | `Allgemein/netzwerk.md` | 🔌 SSH | Netzwerk-Seite: Interfaces, DNS (FritzBox), 14 Subdomains mit Diensten, Ports, HTTP-Weiterleitung auskommentiert | +| 2026-06-17 | Neu | – | `Allgemein/hardware.md` | 🔌 SSH | PI5-Hardware-Seite: CPU, USB-Geräte (Chipsbank-Key, SanDisk, WD), PCI, Boot-Config, Temperatur | +| 2026-06-17 | Aktualisiert | – | `Konfiguration/docker/gitea.md` | 🔌 SSH | `restart: unless-stopped` vom Benutzer ergänzt; Container läuft jetzt; Status von "exited" auf "running" geändert | +| 2026-06-17 | Aktualisiert | – | `Konfiguration/docker/monitoring.md` | 🔌 SSH | Status von "gestoppt" auf "laufend" geändert; Erkenntnis: `restart: unless-stopped` war bereits gesetzt, aber manueller Stop verhinderte Autostart nach Reboot | +| 2026-06-17 | Korrektur | – | `sammle-systemdaten.sh` | – | Standard-Ausgabe von `/dev/stdout` auf `/tmp/sammle-systemdaten-.md` geändert (behob doppelte Ausgabe bei Aufruf ohne Argument) | +| 2026-06-17 | Aktualisiert | – | `Konfiguration/log.md` | 🔌 SSH | Dieser Eintrag | +| 2026-06-17 | Aktualisiert | – | `Konfiguration/index.md` | 🔌 SSH | Inhaltsverzeichnis mit allen neuen Seiten aktualisiert | +| 2026-06-17 | Neu | – | `Konfiguration/domain-und-ssl.md` | 🔌 SSH | Domain/SSL-Seite erstellt | +| 2026-06-17 | Neu | – | `Konfiguration/docker/monitoring.md` | 🔌 SSH | Monitoring-Stack-Seite erstellt (gestoppt) | +| 2026-06-17 | Neu | – | `Konfiguration/docker/nginx.md` | 🔌 SSH | Nginx-Seite erstellt | +| 2026-06-17 | Neu | – | `Konfiguration/docker/stirling-pdf.md` | 🔌 SSH | Stirling-PDF-Seite erstellt | +| 2026-06-17 | Neu | – | `Konfiguration/docker/wikijs.md` | 🔌 SSH | Wiki.js-Seite erstellt | +| 2026-06-17 | Neu | – | `Konfiguration/docker/collabora.md` | 🔌 SSH | Collabora-Seite erstellt | +| 2026-06-17 | Neu | – | `Konfiguration/docker/jenkins.md` | 🔌 SSH | Jenkins-Seite erstellt | +| 2026-06-17 | Neu | – | `Konfiguration/docker/gitea.md` | 🔌 SSH | Gitea-Stack-Seite erstellt | +| 2026-06-17 | Neu | – | `Konfiguration/docker/plex.md` | 🔌 SSH | Plex-Seite erstellt | +| 2026-06-17 | Neu | – | `Konfiguration/docker/paperless.md` | 🔌 SSH | Paperless-Stack-Seite erstellt | +| 2026-06-17 | Neu | – | `Konfiguration/docker/immich.md` | 🔌 SSH | Immich-Stack-Seite erstellt | +| 2026-06-17 | Neu | – | `Konfiguration/docker/nextcloud.md` | 🔌 SSH | Nextcloud-Stack-Seite erstellt | +| 2026-06-17 | Neu | – | `Konfiguration/docker/traefik.md` | 🔌 SSH | Traefik-Reverse-Proxy-Seite erstellt | +| 2026-06-17 | Neu | – | `Konfiguration/opt-compose.md` | 🔌 SSH | Compose-Verzeichnisstruktur-Seite erstellt | +| 2026-06-17 | Neu | – | `Konfiguration/docker-services.md` | 🔌 SSH | Docker-Dienstübersicht erstellt | +| 2026-06-17 | Neu | – | `Konfiguration/docker-grundlagen.md` | 🔌 SSH | Docker-Grundlagenseite erstellt | +| 2026-06-17 | Neu | – | `Konfiguration/laufwerke-und-speicher.md` | 🔌 SSH | Laufwerks- und Speicherseite erstellt | +| 2026-06-17 | Neu | – | `Konfiguration/systemuebersicht.md` | 🔌 SSH | Systemübersichtsseite erstellt | +| 2026-06-17 | Daten | – | `raw/Systemdaten – Raspberry PI5.md` | 🖥️ Script | Systemdaten-Sammler (`sammle-systemdaten.sh`) auf dem PI ausgeführt | +| 2026-06-16 | Aktualisiert | – | `Systemkonfiguration Raspi PI5.md` | – | Übersicht und Link zum Inhaltsverzeichnis hinzugefügt | +| 2026-06-16 | Korrektur | – | `OPENWORK.md` | – | Tippfehler behoben und Format aktualisiert | +| 2026-06-16 | Neu | – | `sammle-systemdaten.sh` | – | Systemdaten-Sammler-Skript erstellt | +| 2026-06-16 | Neu | – | `Konfiguration/swap-zram.md` | – | Swap/zram-Konzeptseite erstellt | +| 2026-06-16 | Neu | – | `Konfiguration/sdx-vertauschung.md` | – | sdX-Vertauschungsseite erstellt | +| 2026-06-16 | Neu | – | `Konfiguration/persistente-blockgeraete.md` | – | UUID/PARTUUID-Konzeptseite erstellt | +| 2026-06-16 | Neu | – | `Konfiguration/luks-verschluesselung.md` | – | LUKS-Konzeptseite erstellt | +| 2026-06-16 | Neu | – | `Konfiguration/etc/systemd-cryptsetup.md` | – | systemd-Boot-Reihenfolge-Seite erstellt | +| 2026-06-16 | Neu | – | `Konfiguration/etc/cryptsetup.md` | – | cryptsetup-Befehlsseite erstellt | +| 2026-06-16 | Neu | – | `Konfiguration/etc/crypttab.md` | – | crypttab-Konfigurationsseite erstellt | +| 2026-06-16 | Neu | – | `Konfiguration/etc/fstab.md` | – | fstab-Konfigurationsseite erstellt | +| 2026-06-16 | Neu | – | `Konfiguration/log.md` | – | Änderungslog begonnen | +| 2026-06-16 | Neu | – | `Konfiguration/index.md` | – | Inhaltsverzeichnis für die Systemkonfiguration erstellt | +| 2026-06-16 | Neu | – | `chats/fstab und crypttab.md` | – | Quelle aufgenommen (Duck.ai / GPT-5 mini-Konversation) | diff --git a/PI5/Konfiguration/luks-verschluesselung.md b/PI5/Konfiguration/luks-verschluesselung.md new file mode 100644 index 0000000..fb7a324 --- /dev/null +++ b/PI5/Konfiguration/luks-verschluesselung.md @@ -0,0 +1,74 @@ +# LUKS-Verschlüsselung + +**Zusammenfassung**: LUKS (Linux Unified Key Setup) ist der Standard für Festplattenverschlüsselung unter Linux. Der Raspberry PI5 verwendet zwei LUKS2-Container für Datenpartitionen. +**Quellen**: `chats/fstab und crypttab.md` +**Zuletzt aktualisiert**: 2026-06-16 + +--- + +## Grundlagen + +LUKS verschlüsselt **ganze Blockgeräte** (Partitionen). Auf dem Raspberry PI5 sind zwei LUKS-Container eingerichtet: + +| Physisches Device | LUKS-UUID | Mapper-Name | Mountpunkt | +|---|---|---|---| +| sdb3 | `097bccad-...` | `encrypt_data` | `/mnt/data` | +| sdc3 | `82550dc2-...` | `encrypt_sdc3` | `/media/piadmin/data` | + +### Schichten-Modell + +``` +Physische Partition (/dev/sdb3, /dev/sdc3) + └── crypto_LUKS (FSTYPE in lsblk) + └── LUKS-Header (enthält verschlüsselte Key-Slots) + └── Entschlüsseltes Device (/dev/mapper/encrypt_*) + └── Dateisystem (ext4) +``` + +### LUKS2 + +Beide Container verwenden **LUKS2** (FSVER = 2 in `lsblk -f`). LUKS2 ist die aktuelle Version mit: +- Flexiblerem Header-Format +- Besseren Reparatur-Optionen +- Unterstützung für mehrere Verschlüsselungsalgorithmen + +## Schlüsselverwaltung + +Ein LUKS-Container kann **bis zu 32 Key-Slots** haben. Jeder Slot enthält einen kopierten Schlüssel, der mit einer Passphrase oder einer Schlüsseldatei entsperrt werden kann. + +Der Raspberry PI5 verwendet **Schlüsseldateien** statt Passphrasen: + +| Container | Schlüsseldatei | +|---|---| +| `encrypt_data` | `/mnt/usb_key/twotb.bin` | +| `encrypt_sdc3` | `/mnt/usb_key/onetb.bin` | + +Vorteil: Die Container können **automatisch beim Boot** geöffnet werden, ohne Passworteingabe. + +## Typische LUKS-Operationen + +- **luksOpen**: Container entschlüsseln → erzeugt Device unter `/dev/mapper/` +- **luksClose**: Container schließen → entfernt `/dev/mapper/`-Device +- **luksAddKey**: Neuen Schlüssel hinzufügen (für bis zu 32 Key-Slots) +- **luksRemoveKey**: Schlüssel entfernen +- **luksDump**: Header-Informationen anzeigen + +Siehe [cryptsetup](./etc/cryptsetup.md) für die genauen Befehle. + +## Wichtige Sicherheitshinweise + +1. **Schlüsseldateien** physisch sichern – wer sie hat, kann die Container entschlüsseln. +2. **Backup des LUKS-Headers** – bei Header-Beschädigung sind die Daten unwiederbringlich verloren: + ```bash + sudo cryptsetup luksHeaderBackup /dev/sdX3 --header-backup-file luks-header-backup.img + ``` +3. **Schlüsseldatei-Berechtigungen**: Nur root lesbar (`chmod 0400`). +4. **`nofail` in fstab**: Stellt sicher, dass der Boot auch ohne verfügbare LUKS-Container fortfährt. + +## Verwandte Seiten + +- [crypttab](./etc/crypttab.md) – Automatisches Öffnen beim Boot +- [fstab](./etc/fstab.md) – Mounten der entschlüsselten Container +- [cryptsetup](./etc/cryptsetup.md) – cryptsetup-Befehle im Detail +- [systemd-cryptsetup](./etc/systemd-cryptsetup.md) – Boot-Reihenfolge +- [persistente-blockgeraete](./persistente-blockgeraete.md) – UUID-Referenzierung diff --git a/PI5/Konfiguration/opt-compose.md b/PI5/Konfiguration/opt-compose.md new file mode 100644 index 0000000..47d1972 --- /dev/null +++ b/PI5/Konfiguration/opt-compose.md @@ -0,0 +1,67 @@ +# /opt/compose – Compose-Struktur + +**Zusammenfassung**: Alle Docker-Stack-Konfigurationen liegen in `/opt/compose/`. Jeder Stack hat sein eigenes Unterverzeichnis mit einer `compose.yml` und ggf. Konfigurationsdateien. +**Quellen**: `raw/Systemdaten – Raspberry PI5.md` +**Zuletzt aktualisiert**: 2026-06-17 + +--- + +## Verzeichnisbaum + +``` +/opt/compose/ +├── collabora/ – [collabora](./docker/collabora.md) Online Office +├── gitea/ – [gitea](./docker/gitea.md) Git-Service +├── immich/ – [immich](./docker/immich.md) Foto-Management +├── jenkins/ – [jenkins](./docker/jenkins.md) CI/CD +├── monitoring/ – [monitoring](./docker/monitoring.md) Prometheus/Grafana +├── nextcloud/ – [nextcloud](./docker/nextcloud.md) Cloud-Speicher +├── nginx/ – [nginx](./docker/nginx.md) Static Webserver +├── authelia/ – [authelia](./docker/authelia.md) SSO (geplant) +├── paperless/ – [paperless](./docker/paperless.md) Dokumentenmanagement +├── plex/ – [plex](./docker/plex.md) Media-Server +├── stirling-pdf/ – [stirling-pdf](./docker/stirling-pdf.md) PDF-Bearbeitung +├── traefik/ – [traefik](./docker/traefik.md) Reverse Proxy +└── wikijs/ – [wikijs](./docker/wikijs.md) Wiki +``` + +## Struktur innerhalb eines Stacks + +Jeder Stack folgt diesem Muster: + +``` +/opt/compose// +├── compose.yml # Docker-Compose-Definition +├── .env # Umgebungsvariablen (optional) +├── .secrets/ # Secrets (Passwörter, Tokens) +│ ├── db_pw +│ └── ... +├── conf.d/ # Traefik file provider configs (nur bei traefik) +├── config/ # Anwendungsspezifische Konfiguration +├── data/ # Vom Container gemappte Daten (falls nicht im Volume) +└── ... # Weitere Ressourcen je nach Anwendung +``` + +## Netzwerk-Integration + +Alle öffentlich erreichbaren Stacks nutzen das externe Docker-Netzwerk `traefik`: + +```yaml +networks: + traefik: + external: true +``` + +Die eigentlichen Routing-Regeln liegen nicht in Docker-Labels, sondern in Traefiks **file provider** unter `/opt/compose/traefik/conf.d/` (siehe [traefik](./docker/traefik.md)). + +## Daten-Persistenz + +- **Benannte Volumes** werden von Docker verwaltet (z. B. `plex_plex_config`, `gitea_gitea`) +- **Bind Mounts** verweisen auf die LUKS-Partition `/mnt/data/` (z. B. `/mnt/data/nextcloud/`) +- **Schlüsseldateien** für LUKS-Entschlüsselung liegen auf USB-Stick `/mnt/usb_key/` + +## Verwandte Seiten + +- [docker-services](./docker-services.md) – Alle 17 Container im Detail +- [docker-grundlagen](./docker-grundlagen.md) – Netzwerke und Volumes +- [traefik](./docker/traefik.md) – Reverse-Proxy-Konfiguration diff --git a/PI5/Konfiguration/persistente-blockgeraete.md b/PI5/Konfiguration/persistente-blockgeraete.md new file mode 100644 index 0000000..5470584 --- /dev/null +++ b/PI5/Konfiguration/persistente-blockgeraete.md @@ -0,0 +1,67 @@ +# Persistente Blockgeräte-Referenzen + +**Zusammenfassung**: UUID, PARTUUID und `/dev/disk/by-*`-Pfade identifizieren Partitionen eindeutig und unabhängig von der dynamischen `/dev/sdX`-Benennung – essenziell für stabile Mounts. +**Quellen**: `chats/fstab und crypttab.md` +**Zuletzt aktualisiert**: 2026-06-16 + +--- + +## Das Problem mit `/dev/sdX` + +Die Namen `/dev/sda`, `/dev/sdb`, `/dev/sdc` etc. werden vom Linux-Kernel **in der Reihenfolge der Erkennung** vergeben. Diese kann sich bei jedem Neustart ändern, besonders bei: +- USB-Laufwerken (unterschiedliche Initialisierungsgeschwindigkeit) +- SD-Karten-Lesern +- Mehreren gleichartigen Laufwerken + +Siehe [sdx-vertauschung](./sdx-vertauschung.md). + +## Die Lösung: Eindeutige, persistente IDs + +### Methoden im Vergleich + +| Methode | Beispiel | Persistenz | Verwendung | +|---|---|---|---| +| `/dev/sdb3` | `/dev/sdb3` | ❌ Nein – wechselt bei Erkennungsreihenfolge | Nicht in fstab/crypttab verwenden | +| **UUID** | `UUID=097bccad-...` | ✅ Ja – Dateisystem-ID | Für LUKS-Container in crypttab | +| **PARTUUID** | `PARTUUID=228e9390-02` | ✅ Ja – Partitions-Tabellen-ID | Für Root, Boot in fstab | +| **/dev/disk/by-partuuid/** | `/dev/disk/by-partuuid/83910788-01` | ✅ Ja – wie PARTUUID als Pfad | Alternative in fstab | +| **/dev/disk/by-uuid/** | `/dev/disk/by-uuid/F587-071F` | ✅ Ja – wie UUID als Pfad | Alternative in fstab | +| **/dev/disk/by-id/** | `/dev/disk/by-id/usb-SanDisk_...` | ✅ Ja – Seriennummer des Geräts | Optionale udev-Regeln | +| **/dev/mapper/** | `/dev/mapper/encrypt_data` | ✅ Ja – Name von cryptsetup | Für LUKS-Mapper in fstab | + +### Aktuelle Verwendung auf dem Raspberry PI5 + +| Komponente | Referenzmethode | +|---|---| +| `/boot/firmware` (sdb1/sdc1) | `PARTUUID=228e9390-01` | +| `/` (sdb2/sdc2) | `PARTUUID=228e9390-02` | +| LUKS-Container sdb3 | `UUID=097bccad-...` (in crypttab) | +| LUKS-Container sdc3 | `UUID=82550dc2-...` (in crypttab) | +| `/media/piadmin/bootfs` | `/dev/disk/by-partuuid/83910788-01` | +| `/media/piadmin/rootfs` | `/dev/disk/by-partuuid/83910788-02` | + +## IDs anzeigen und prüfen + +```bash +# Alle Blöcke mit IDs anzeigen +sudo blkid + +# PARTUUIDs anzeigen +lsblk -o NAME,PARTUUID,UUID,FSTYPE,LABEL,MOUNTPOINT + +# Verfügbare persistente Pfade +ls -l /dev/disk/by-uuid/ +ls -l /dev/disk/by-partuuid/ +ls -l /dev/disk/by-id/ +``` + +## Wichtige Regel + +**Verwende NIEMALS `/dev/sdX` in fstab oder crypttab.** Ersetze sie immer durch UUID, PARTUUID oder `/dev/disk/by-*`-Pfade. + +## Verwandte Seiten + +- [sdx-vertauschung](./sdx-vertauschung.md) – Warum `/dev/sdX` wechselt +- [fstab](./etc/fstab.md) – Alle Einträge mit persistenten Referenzen +- [crypttab](./etc/crypttab.md) – UUID-Referenzen für LUKS +- [luks-verschluesselung](./luks-verschluesselung.md) – LUKS-Konzepte diff --git a/PI5/Konfiguration/sdx-vertauschung.md b/PI5/Konfiguration/sdx-vertauschung.md new file mode 100644 index 0000000..d6b2110 --- /dev/null +++ b/PI5/Konfiguration/sdx-vertauschung.md @@ -0,0 +1,76 @@ +# sdX-Vertauschung – Wechselnde Gerätenamen + +**Zusammenfassung**: Die Namen `/dev/sda`, `/dev/sdb`, `/dev/sdc` können sich bei jedem Neustart ändern. Dieses Dokument erklärt die Ursache, die Auswirkungen und wie persistente Referenzen das Problem lösen. +**Quellen**: `chats/fstab und crypttab.md` +**Zuletzt aktualisiert**: 2026-06-16 + +--- + +## Ursache + +Der Linux-Kernel vergibt die `/dev/sdX`-Namen in der **Reihenfolge, in der er die Geräte erkennt**. Diese Reihenfolge hängt ab von: + +- **USB-Controller-Initialisierung** (verschiedene Controller brauchen unterschiedlich lang) +- **Port-Reihenfolge** (welcher Port zuerst scannt) +- **Hub-Topologie** (Geräte an verschiedenen USB-Hubs) +- **Geräte-Firmware** (manche Geräte melden sich schneller als andere) + +Selbst wenn die Laufwerke physisch in derselben Reihenfolge angeschlossen sind, können sie beim nächsten Boot **vertauscht** sein. + +## Konkretes Beispiel vom Raspberry PI5 + +Beim ersten Boot: +``` +sdb → Laufwerk A (bootfs, rootfs, LUKS) +sdc → Laufwerk B (bootfs, rootfs, LUKS) +``` + +Beim nächsten Boot (nach Neustart): +``` +sdb → Laufwerk B +sdc → Laufwerk A +``` + +Die **UUIDs und PARTUUIDs** der Partitionen bleiben dagegen **immer gleich** – unabhängig davon, ob das Device gerade `/dev/sdb` oder `/dev/sdc` heißt. + +## Warum es auf dem Raspberry PI5 funktioniert + +Das System verwendet **durchgängig persistente Referenzen**: + +- **fstab** verwendet `PARTUUID=` und `/dev/disk/by-partuuid/` – diese folgen der Partition, nicht dem `/dev/sdX`-Namen +- **crypttab** verwendet `UUID=` für die LUKS-Container – cryptsetup findet das richtige Device unabhängig vom Namen +- **fstab mountet `/dev/mapper/...`** – diese Mapper-Namen sind stabil und werden von cryptsetup erzeugt + +Ergebnis: Selbst wenn sdb und sdc vertauschen, landen alle Mounts auf den **richtigen Partitionen** (Quelle: `chats/fstab und crypttab.md`). + +## Symptome einer sdX-Vertauschung erkennen + +Wenn in der Ausgabe von `lsblk` die Devices anders heißen als erwartet, die Mounts aber trotzdem stimmen, liegt eine Vertauschung vor: + +```bash +lsblk -o NAME,PARTUUID,UUID,FSTYPE,LABEL,MOUNTPOINT +``` + +Achte auf: +- `/boot/firmware` und `/` sollten auf dem **gleichen** Laufwerk liegen (gleicher PARTUUID-Präfix wie `228e9390-*`) +- `/mnt/data` sollte auf dem entschlüsselten Container des primären Laufwerks liegen + +## Optionale udev-Regeln (für feste Zuordnung) + +Falls eine Zuordnung zu **physischen Ports** gewünscht ist, können udev-Regeln erstellt werden: + +```bash +# Beispiel: Feste Symlinks basierend auf Seriennummer +# Datei: /etc/udev/rules.d/99-feste-laufwerke.rules +SUBSYSTEM=="block", ENV{ID_SERIAL}=="Seriennummer_Laufwerk_A", SYMLINK+="disk_laufwerk_a" +SUBSYSTEM=="block", ENV{ID_SERIAL}=="Seriennummer_Laufwerk_B", SYMLINK+="disk_laufwerk_b" +``` + +Danach kann in fstab `/dev/disk_laufwerk_a` statt PARTUUID verwendet werden. + +## Verwandte Seiten + +- [persistente-blockgeraete](./persistente-blockgeraete.md) – UUID, PARTUUID, by-partuuid +- [fstab](./etc/fstab.md) – Verwendet persistente Referenzen +- [crypttab](./etc/crypttab.md) – UUID-Referenzen in crypttab +- [luks-verschluesselung](./luks-verschluesselung.md) – LUKS-Referenzierung diff --git a/PI5/Konfiguration/swap-zram.md b/PI5/Konfiguration/swap-zram.md new file mode 100644 index 0000000..0535490 --- /dev/null +++ b/PI5/Konfiguration/swap-zram.md @@ -0,0 +1,62 @@ +# Swap – zram und loop + +**Zusammenfassung**: Der Raspberry PI5 verwendet **zram** (komprimierten RAM-Swap) und **loop** (Datei-basierten Swap) statt eines klassischen Swap-Eintrags in der fstab. systemd verwaltet diese automatisch. +**Quellen**: `chats/fstab und crypttab.md`, `konfigurationsdateien/fstab` +**Zuletzt aktualisiert**: 2026-06-16 + +--- + +## Ausgangslage + +In der `lsblk`-Ausgabe des Raspberry PI5 sind zwei Swap-Geräte sichtbar: + +``` +loop0 swap 1 +zram0 swap 1 zram0 +``` + +- **loop0**: Ein Loop-Device, das als Swap dient (wird von systemd eingerichtet) +- **zram0**: Komprimierter RAM-Swap (im Arbeitsspeicher, keine Plattenzugriffe) + +Beide werden von **systemd automatisch verwaltet** – es gibt keinen Eintrag in der [fstab](./etc/fstab.md). + +## zram (komprimierter RAM-Swap) + +**zram** erzeugt einen komprimierten Block im RAM, der als Swap-Gerät dient. + +### Vorteile +- **Schnell** – reine RAM-Geschwindigkeit +- **Kein Verschleiß** – keine SSD/SD-Karte wird beansprucht +- **Komprimiert** – die Daten im Swap werden komprimiert, spart RAM + +### Konfiguration prüfen + +```bash +# zram-Status anzeigen +zramctl + +# Swap-Nutzung insgesamt anzeigen +swapon --show + +# Beispiel-Ausgabe (ähnlich): +# NAME TYPE SIZE USED PRIO +# /dev/zram0 partition 256M 10M 100 +# /dev/loop0 file 512M 0M 50 +``` + +## loop-Swap + +Loop-Devices ermöglichen es, eine **Datei als Blockgerät** zu verwenden. systemd kann automatisch eine Swap-Datei über ein Loop-Device einrichten. + +## Warum kein fstab-Eintrag? + +Moderne systemd-Systeme verwalten Swap oft automatisch über: +- `systemd-zram-generator` (für zram) +- `systemd-swap` oder ähnliche Dienste (für Loop-Swap) + +Dadurch bleibt die [fstab](./etc/fstab.md) sauber und die Konfiguration erfolgt deklarativ über systemd-Einheiten. + +## Verwandte Seiten + +- [fstab](./etc/fstab.md) – Swap ist absichtlich nicht in der fstab +- [luks-verschluesselung](./luks-verschluesselung.md) – LUKS-Container auf den Datenpartitionen diff --git a/PI5/Konfiguration/systemuebersicht.md b/PI5/Konfiguration/systemuebersicht.md new file mode 100644 index 0000000..f99597c --- /dev/null +++ b/PI5/Konfiguration/systemuebersicht.md @@ -0,0 +1,83 @@ +# Systemübersicht + +**Zusammenfassung**: Der Raspberry PI5 `da-server-pi5` läuft mit Debian 13 "trixie" (aarch64) und 15 GB RAM. Docker-Host für 30 Container (28 laufend), 12 Compose-Stacks unter `/opt/compose/`. +**Quellen**: 🖥️ `raw/Systemdaten – Raspberry PI5.md`, 🔌 SSH +**Zuletzt aktualisiert**: 2026-06-17 + +--- + +## Basis-Daten + +| Merkmal | Wert | +|---|---| +| **Hostname** | `da-server-pi5` | +| **Betriebssystem** | Debian GNU/Linux 13 (trixie) | +| **Architektur** | aarch64 (64-bit) | +| **Kernel** | 6.18.33+rpt-rpi-2712, PREEMPT | +| **CPU** | 4× ARM Cortex-A76 (BCM2712) | +| **RAM** | 15 GB (6,0 GB genutzt, 9,8 GB verfügbar) | +| **Swap** | 2 GB zram (komprimiert) + 2 GB loop | +| **CPU-Temperatur** | ~46 °C (aktiv gekühlt) | +| **Betriebszeit** | 1 Tag, 2 Stunden | +| **Load Average** | 0.31 / 0.48 / 0.50 (sehr geringe Auslastung) | +| **Letzter Reboot** | 16. Juni 2026, 20:15 Uhr | + +## Docker-Status + +| Metrik | Wert | +|---|---| +| **Docker Engine** | v29.5.3 | +| **Docker Compose** | v5.1.4 | +| **Container gesamt** | 30 | +| **Container laufend** | 28 | +| **Container gestoppt** | 2 ([gitea](./docker/gitea.md), hello-world) | +| **Images** | 185 (173,7 GB, davon 133 GB reclaimable) | +| **Benannte Volumes** | 11 aktiv, 152 anonym/orphaned | +| **Netzwerke** | 11 (1 extern: `traefik`) | + +## Systemd-Dienste (Enabled) + +Wichtige enabled systemd-Services: + +| Dienst | Zweck | +|---|---| +| `docker.service` | Docker-Daemon | +| `containerd.service` | Container-Runtime | +| `ssh.service` | SSH-Server | +| `cron.service` | Cron-Daemon | +| `NetworkManager.service` | Netzwerk-Verwaltung | +| `cups.service` | Druckserver | +| `avahi-daemon.service` | mDNS/Bonjour | +| `bluetooth.service` | Bluetooth | +| `lightdm.service` | Display-Manager | + +(Quelle: `systemctl list-unit-files --state=enabled`) + +## Systemd-Timer + +| Timer | Ausführung | +|---|---| +| `rpi-zram-writeback.service` | Täglich (zram zurückschreiben) | +| `dpkg-db-backup.service` | Täglich | +| `logrotate.service` | Täglich | +| `apt-daily-upgrade.service` | Täglich | +| `apt-daily.service` | Täglich | +| `fstrim.service` | Wöchentlich (SSD-Trimming) | +| `e2scrub_all.service` | Wöchentlich (Dateisystem-Prüfung) | + +## Netzwerk + +Siehe [netzwerk](../Allgemein/netzwerk.md) für Details. + +## Verwandte Seiten + +- [hardware](../Allgemein/hardware.md) – Hardware-Details +- [netzwerk](../Allgemein/netzwerk.md) – Netzwerk-Konfiguration +- [sicherheit](../Allgemein/sicherheit.md) – Sicherheits-Einstellungen +- [laufwerke-und-speicher](./laufwerke-und-speicher.md) +- [docker-grundlagen](./docker-grundlagen.md) +- [docker-services](./docker-services.md) +- [opt-compose](./opt-compose.md) +- [domain-und-ssl](./domain-und-ssl.md) +- [fstab](./etc/fstab.md) +- [crypttab](./etc/crypttab.md)