Webservices: Unterschied zwischen den Versionen

Aus Store2 Wiki
Zur Navigation springen Zur Suche springen
Gagi (Diskussion | Beiträge)
 
(31 dazwischenliegende Versionen von 4 Benutzern werden nicht angezeigt)
Zeile 80: Zeile 80:


'''Stabilität:''' Läuft seit Installation ohne größere Probleme
'''Stabilität:''' Läuft seit Installation ohne größere Probleme
= Calibre-Web Automated (CWA) auf STORE2 =
== Übersicht ==
Service: Calibre-Web Automated (CWA)
Container: crocodilestick/calibre-web-automated:latest Version: V3.1.4 (Calibre 8.8.0)
Port: 8084 (extern) → 8083 (intern)
Zugriff (intern): <nowiki>http://192.168.1.102:8084</nowiki>
Zugriff (extern): <nowiki>https://dergagi.changeip.org/cwa</nowiki>
Bücher: 45.233 (Stand: 10.10.2025)
Speicherort: /data/ebooks (52TB RAID6)
Config: /data/ebooks-config
== Docker-Konfiguration ==
=== docker-compose.yml === Pfad: /srv/calibre-web-automated/docker-compose.yml
services: calibre-web-automated: image: crocodilestick/calibre-web-automated:latest container_name: calibre-web-automated restart: unless-stopped environment: - PUID=1000 - PGID=1000 - TZ=Europe/Berlin ports: - "127.0.0.1:8084:8083" volumes: - /data/ebooks:/calibre-library:rw - /data/ebooks-config:/config:rw healthcheck: test: ["CMD-SHELL","python3 -c "import socket; s=socket.socket(); s.settimeout(2); s.connect(('127.0.0.1',8083)); s.close()""] interval: 15s timeout: 5s retries: 10 start_period: 120s stop_grace_period: 30s
<nowiki>=== Container-Verwaltung ===</nowiki>
Container neu starten: cd /srv/calibre-web-automated docker compose restart
Container stoppen: docker compose down
Container starten: docker compose up -d
Logs anzeigen: docker logs -f calibre-web-automated
Status prüfen: docker ps | grep calibre-web
== Wichtige Pfade ==
E-Books: /data/ebooks (257GB, 45k Bücher) Calibre Metadata DB: /data/ebooks/metadata.db (~50MB) CWA Config: /data/ebooks-config (87GB inkl. Caches) CWA App DB: /data/ebooks-config/app.db (~5MB) CWA Main DB: /data/ebooks-config/cwa.db (~15MB) docker-compose.yml: /srv/calibre-web-automated/ Daily DB-Backups: /mnt/nvme_backup/_data_dbs/ (7 Tage Retention) Weekly Archiv-Backups: /data2/db-archive/ (4 Wochen Retention)
== Backup-System (KRITISCH!) ==
<nowiki>=== Layer 1: Daily Safety Backup (NVMe) ===</nowiki>
Zweck: Schnelles Recovery bei CWA-Problemen oder DB-Korruption Service: daily-db-backup.service + daily-db-backup.timer Zeitplan: Täglich um 03:30 Uhr (nach OS-Backup) Ziel: /mnt/nvme_backup/_data_dbs/YYYY-MM-DD/ Retention: 7 Tage Größe: ~70MB pro Backup
Gebackupte Dateien: • calibre_metadata ← /data/ebooks/metadata.db (50MB) • calibre_prefs ← /data/ebooks/metadata_db_prefs_backup.json (16KB) • cwa_app ← /data/ebooks-config/app.db (5MB) • cwa_main ← /data/ebooks-config/cwa.db (15MB)
Backup-Methode: • SQLite-DBs: sqlite3 $src ".backup $dest" + Integrity-Check • JSON: cp -p (Timestamp-Erhalt)
Status prüfen: systemctl status daily-db-backup.timer ls -lth /mnt/nvme_backup/_data_dbs/
Manuell ausführen: systemctl start daily-db-backup.service
Logs anzeigen: cat /mnt/nvme_backup/_data_dbs/_logs/run-$(date +%Y-%m-%d)*.log
<nowiki>=== Layer 2: Weekly Archive Backup (RAID→RAID) ===</nowiki>
Zweck: Langzeit-Absicherung, tiefere Historie Service: weekly-archive-backup.service + weekly-archive-backup.timer Zeitplan: Sonntag 04:00 Uhr Ziel: /data2/db-archive/YYYY-Wxx/ Retention: 4 Wochen Größe: ~103MB pro Archiv
Zusätzlich gebackupte Dateien: • calibre_metadata_backup ← /data/ebooks/metadata.db.backup-* (Wildcard) • cwa_app_backup ← /data/ebooks-config/app.db.backup-* (Wildcard) • cwa_logs ← /data/ebooks-config/calibre-web.log* (Diagnose)
Vorteil: RAID-zu-RAID = besserer Hardware-Schutz als NVMe→HDD
Status prüfen: systemctl status weekly-archive-backup.timer ls -lth /data2/db-archive/
Manuell ausführen: systemctl start weekly-archive-backup.service
Logs anzeigen: ls -lth /data2/db-archive/_logs/ | head -3
<nowiki>=== DB-Restore nach Crash ===</nowiki>
Wenn CWA nicht startet oder DB korrupt ist:
# Container stoppen: docker stop calibre-web-automated
# Neuestes Backup finden: ls -lth /mnt/nvme_backup/_data_dbs/
# Backup wiederherstellen (z.B. von gestern): BACKUP_DATE=$(ls -t /mnt/nvme_backup/_data_dbs/ | grep "2025-10" | head -1) cp /data/ebooks-config/app.db /data/ebooks-config/app.db.broken-$(date +%Y%m%d-%H%M) cp /mnt/nvme_backup/_data_dbs/$BACKUP_DATE/cwa_app /data/ebooks-config/app.db chown gagi:gagi /data/ebooks-config/app.db
# Container starten: docker start calibre-web-automated
# Status prüfen: docker ps | grep calibre-web docker logs --tail 30 calibre-web-automated
Für metadata.db analog: cp /mnt/nvme_backup/_data_dbs/$BACKUP_DATE/calibre_metadata /data/ebooks/metadata.db chown gagi:gagi /data/ebooks/metadata.db
== E-Mail / Send-to-Kindle (GMX) ==
<nowiki>=== SMTP-Konfiguration (Web-UI) ===</nowiki>
Admin → Konfiguration → SMTP-Einstellungen:
SMTP-Hostname: mail.gmx.net Port: 587 Verschlüsselung: STARTTLS SMTP-Login: dergagi@gmx.de SMTP-Passwort: App-Passwort (siehe unten!) Absenderadresse: dergagi@gmx.de
<nowiki>=== GMX App-Passwort erstellen (KRITISCH!) ===</nowiki>
Seit 2024 akzeptiert GMX keine normalen Passwörter mehr für SMTP!
Schritte:
# Login auf <nowiki>https://www.gmx.de</nowiki>
# Klicke oben rechts auf Initialen → "Account verwalten" (oder direkt: <nowiki>https://www.gmx.net/mein-account/</nowiki>)
# Menü links: Sicherheit → Anwendungsspezifische Passwörter
# "Neues Passwort erstellen"
# Name: CWA-STORE2 (oder beliebig)
# Passwort wird angezeigt (Format: xxxx xxxx xxxx xxxx)
# SOFORT NOTIEREN - wird nur 1x angezeigt!
# In CWA eingeben (ohne Leerzeichen: xxxxxxxxxxxxxxxx)
POP3/IMAP Zugriff aktivieren:
# GMX → Einstellungen → E-Mail → POP3 & IMAP
# Haken setzen: "E-Mails über externes Programm senden und empfangen"
# Speichern
Nach Änderungen immer Container neu starten: docker restart calibre-web-automated
<nowiki>=== Amazon Kindle Setup ===</nowiki>
Damit Amazon E-Books von GMX akzeptiert:
# Login auf <nowiki>https://www.amazon.de/mycd</nowiki>
# Einstellungen → Persönliche Dokumente
# "Genehmigte Absender-E-Mail-Adressen" → "E-Mail-Adresse hinzufügen"
# Eintragen: dergagi@gmx.de
# Bestätigen
Send-to-Kindle E-Mail-Adresse ermitteln: • Amazon → Content & Devices → Tab "Geräte" • Gerät auswählen → "E-Mail-Adresse" (z.B. gagi_main@kindle.com)
Unterstützte Formate für Kindle: • .mobi (optimal für ältere Kindles) • .azw3 (moderner, beste Formatierung) • .epub (wird automatisch konvertiert) • .pdf (funktioniert, oft schlechte Lesbarkeit)
Send-to-Kindle in CWA:
# E-Book auswählen
# "Send to Kindle" (oder ✉️ Symbol)
# Kindle-Adresse eingeben (z.B. gagi_main@kindle.com)
# Senden
Troubleshooting: • Test-Mail an eigene Adresse senden (in CWA: Admin → Config → "Test-E-Mail") • GMX App-Passwort-Status prüfen: GMX → Mein Account → Sicherheit → App-Passwörter (zeigt "Letzte Nutzung") • Falls Test-Mail nicht ankommt: Container restart, dann erneut testen
== Automatisierung ==
<nowiki>=== SystemD Timer ===</nowiki>
cwa-health.timer (jede Minute): • Überwacht Container-Status • Startet CWA bei Absturz automatisch neu • Service: /etc/systemd/system/cwa-health.timer • Script: /usr/local/bin/cwa-health.sh
Status prüfen: systemctl status cwa-health.timer
<nowiki>=== Cron-Jobs (root) ===</nowiki>
cwa-smart-import-v2.sh (alle 6 Stunden: 00:15, 06:15, 12:15, 18:15): • Scannt /data/ebooks nach neuen EPUBs • Importiert automatisch via calibredb add • Log: /var/log/cwa-import.log
Befehle: crontab -l | grep cwa tail -f /var/log/cwa-import.log
<nowiki>=== Geplante Aufgaben (CWA Web-UI) ===</nowiki>
Admin → Geplante Aufgaben (täglich 06:00 Uhr): ✓ Buchcover Miniaturansichten erzeugen ✓ Mit Calibre Bibliothek neu verbinden ✓ Metadaten Backup Datei erzeugen
Hinweis: Diese erstellen nur lokale Backups (/data/ebooks/metadata.db.backup-*), NICHT die Off-Site-Backups auf NVMe/RAID2!
== E-Books hinzufügen ==
<nowiki>=== Methode 1: Automatischer Import (empfohlen für <100 Bücher) ===</nowiki>
Neue EPUBs nach /data/ebooks/ kopieren: cp ~/neue-buecher/*.epub /data/ebooks/
Import erfolgt automatisch alle 6h, oder manuell: /usr/local/bin/cwa-smart-import-v2.sh
<nowiki>=== Methode 2: Web-Upload (für einzelne Bücher) ===</nowiki>
# <nowiki>https://dergagi.changeip.org/cwa</nowiki> öffnen
# "Upload" Button → Dateien auswählen
# CWA importiert automatisch
<nowiki>=== Methode 3: Calibre Desktop (für große Mengen >500 Bücher) ===</nowiki>
⚠️ KRITISCH: Container MUSS gestoppt sein!
# Container stoppen: docker stop calibre-web-automated
# Calibre Desktop öffnen (GUI) Bibliothek: /data/ebooks Bücher hinzufügen mit Duplikat-Merge
# Nach Import: Container starten: docker start calibre-web-automated
NIEMALS Container UND Calibre Desktop gleichzeitig laufen lassen! → SQLite-DB kann nur von EINEM Prozess beschrieben werden → Führt zu "Database is locked" Fehlern und DB-Korruption
== Aktive Features ==
=== CWA-Services (Container-intern) === ✓ Auto-Convert (EPUB als Standard) ✓ Automatic Cover & Metadata Enforcement ✓ Kindle EPUB Fixer ✓ Import Auto-Backup
=== Web-UI Einstellungen === ✓ Hochladen aktiviert ✓ Update-Benachrichtigungen ✓ GMX Mail-Server konfiguriert (Send-to-Kindle)
== Wartung ==
<nowiki>=== Buchanzahl prüfen ===</nowiki>
sqlite3 /data/ebooks/metadata.db "SELECT COUNT(*) FROM books;"
<nowiki>=== Logs anzeigen ===</nowiki>
Container-Logs: docker logs -f calibre-web-automated
Import-Logs: tail -f /var/log/cwa-import.log
Health-Check Logs: journalctl -u cwa-health.service -f
DB-Backup Logs: tail -f /mnt/nvme_backup/_data_dbs/_logs/run-''.log tail -f /data2/db-archive/_logs/run-''.log
<nowiki>=== Performance-Monitoring ===</nowiki>
Live-Monitor während Import: watch -n 2 'echo "=== CWA STATUS ===";
echo "Bücher in DB: $(sqlite3 /data/ebooks/metadata.db "SELECT COUNT(*) FROM books;")";
echo "Container: $(docker ps --filter name=calibre-web-automated --format "<nowiki>{{.Status}}</nowiki>")";
echo "Healthcheck: $(docker inspect calibre-web-automated --format="<nowiki>{{.State.Health.Status}}</nowiki>")"'
== Fehlerbehebung ==
<nowiki>=== Container startet nicht ===</nowiki>
Logs prüfen: docker logs calibre-web-automated
Container force-restart: docker stop calibre-web-automated docker rm calibre-web-automated
Neu erstellen: cd /srv/calibre-web-automated docker compose up -d
<nowiki>=== CWA zeigt falsche Buchanzahl ===</nowiki>
Im Browser: Admin → "Mit Calibre Bibliothek neu verbinden"
Oder per CLI: curl -X POST <nowiki>http://127.0.0.1:8084/admin/reconnect</nowiki>
<nowiki>=== "Database is locked" Fehler ===</nowiki>
Ursache: Calibre Desktop läuft parallel zum Container
Container stoppen: docker stop calibre-web-automated
Calibre Desktop schließen: pkill -f calibre
Container neu starten: docker start calibre-web-automated
<nowiki>=== Unvollständige Einträge / Fehlende Cover ===</nowiki>
Admin → Geplante Aufgaben → "Metadaten Backup" manuell starten
<nowiki>=== SMTP/Mail funktioniert nicht ===</nowiki>
# Test-Mail in CWA senden: Admin → Konfiguration → "Test-E-Mail versenden"
# Live-Logs beobachten: docker logs -f calibre-web-automated | grep -iE '(mail|smtp|auth)'
# GMX App-Passwort-Status prüfen: GMX → Mein Account → Sicherheit → App-Passwörter Sollte "Letzte Nutzung: vor X Minuten" zeigen
# Direkt-Test (bypass CWA): echo "Test" | curl --ssl --url "smtp://mail.gmx.net:587"  --user "dergagi@gmx.de:APP_PASSWORT_HIER"  --mail-from "dergagi@gmx.de"  --mail-rcpt "dergagi@gmx.de"  --upload-file - -v
# Container restart: docker restart calibre-web-automated
Häufige Probleme: • Port 465 statt 587: GMX bevorzugt Port 587 mit STARTTLS • Normales Passwort statt App-Passwort: Seit 2024 Pflicht! • POP3/IMAP nicht aktiviert: Muss in GMX-Einstellungen enabled sein • Container nicht neu gestartet: Nach Config-Änderungen immer docker restart
== Apache Reverse Proxy ==
CWA ist über Apache unter /cwa erreichbar:
VirtualHosts: • 000-catchall-443.conf • 000-website-dergagi-443.conf
ProxyPass-Regel: ProxyPass /cwa <nowiki>http://127.0.0.1:8084</nowiki> ProxyPassReverse /cwa <nowiki>http://127.0.0.1:8084</nowiki>
Externe URL: <nowiki>https://dergagi.changeip.org/cwa</nowiki>
Apache neu laden nach Config-Änderungen: apache2ctl configtest && systemctl restart apache2
== Bekannte Einschränkungen ==
=== Format-Duplikate === • CWA zeigt jedes Format (epub/mobi/pdf) als separaten Eintrag • Keine Gruppierungsfunktion verfügbar • Workaround: Nur ein Format pro Buch hochladen (bevorzugt EPUB)
=== Import-Geschwindigkeit === • Auto-Ingest: ~10-15 Bücher/Minute • Calibre Desktop Bulk-Import: ~200-300 Bücher/Minute • Große Imports (>500 Bücher): Besser via Calibre Desktop
=== Tiefe Ordnerstrukturen === • Werden erkannt, aber langsam verarbeitet • Besser: Flache Struktur /Autor/Buchtitel/
== Wichtige Hinweise ==
⚠️ NIE Container UND Calibre Desktop gleichzeitig laufen lassen! → SQLite-DB kann nur von EINEM Prozess beschrieben werden
⚠️ Große Imports immer via Calibre Desktop: → Container stoppen, Import durchführen, Container starten
⚠️ Backups vor großen Änderungen: cp /data/ebooks/metadata.db /data/ebooks/metadata.db.backup-$(date +%Y%m%d) cp /data/ebooks-config/app.db /data/ebooks-config/app.db.backup-$(date +%Y%m%d)
⚠️ System-Backups laufen automatisch: • OS-Backup: Täglich 03:08 Uhr (nvme-backup.timer) • DB-Backup: Täglich 03:30 Uhr (daily-db-backup.timer) • Archiv-Backup: Sonntags 04:00 Uhr (weekly-archive-backup.timer)
== Statistiken ==
Stand: 19. Oktober 2025
Bücher in Bibliothek: 45.233 Speicherplatz /data: 257GB Speicherplatz Config: 87GB (Caches) metadata.db Größe: ~50MB app.db Größe: ~5MB Container Uptime: 8+ Tage Letzter Import: 10.10.2025 (Torboox-Massive)
Letzte Aktualisierung: 19. Oktober 2025 Version: 3.0 (Post-GMX-SMTP-Fix)


= MediaWiki - Aktuelle Konfiguration & Dokumentation =
= MediaWiki - Aktuelle Konfiguration & Dokumentation =
'''Stand:''' 03. September 2025, 15:30 Uhr
'''Stand: 11. Oktober 2025, 14:30 Uhr'''


'''Status:''' Produktiv, vollständig funktional nach Container-Wiederherstellung
'''Status: Produktiv, vollständig funktional nach Login-Fix und Cookie-Konfiguration'''
----


== System-Übersicht ==
== 🎯 System-Übersicht ==


=== Grundkonfiguration ===
=== Grundkonfiguration ===


* '''MediaWiki Version:''' 1.44.0
* '''MediaWiki Version:''' 1.44.0
* '''URL:''' <nowiki>http://dergagi.changeip.org:8088/</nowiki>
* '''Haupt-URL (HTTPS):''' <nowiki>https://dergagi.changeip.org/w/</nowiki>
* '''Direkt-URL (HTTP):''' <nowiki>http://dergagi.changeip.org:8088/</nowiki>
* '''Betriebssystem:''' Debian 13 (STORE2)
* '''Betriebssystem:''' Debian 13 (STORE2)
* '''Container-System:''' Docker + Docker-Compose
* '''Container-System:''' Docker + Docker-Compose
Zeile 100: Zeile 380:
* '''Admin-User:''' <code>admin</code>
* '''Admin-User:''' <code>admin</code>
* '''Admin-Passwort:''' <code>CleanFinalMW2025!</code>
* '''Admin-Passwort:''' <code>CleanFinalMW2025!</code>
* '''Admin-URL:''' [[Spezial:Anmelden|http://dergagi.changeip.org:8088/index.php/Spezial:Anmelden]]
* '''Login-URL:''' [[Spezial:Anmelden|https://dergagi.changeip.org/w/index.php?title=Spezial:Anmelden]]
 
----


== Docker-Setup ==
== 🐳 Docker-Setup ==


=== Container-Konfiguration ===
=== Container-Konfiguration ===
Zeile 114: Zeile 396:
  docker-compose up -d        ''# Start''
  docker-compose up -d        ''# Start''
  docker-compose down        ''# Stop''
  docker-compose down        ''# Stop''
  docker ps | grep mw-clean ''# Status''
docker-compose restart      ''# Neustart''
  docker logs mw-clean-final ''# Logs''</code>
  docker ps | grep mw-clean   ''# Status''
  docker logs mw-clean-final ''# Logs''</code>


=== Port-Mapping ===
=== Port-Mapping ===
Zeile 122: Zeile 405:
* '''Datenbank:''' Container:3306 (intern, nicht exposed)
* '''Datenbank:''' Container:3306 (intern, nicht exposed)


== Datenbank-Konfiguration ==
=== Netzwerk-Architektur ===
 
* '''HTTPS (Port 443):''' Apache Reverse Proxy → <code><nowiki>https://dergagi.changeip.org/w/</nowiki></code>
* '''HTTP (Port 8088):''' Direkter Container-Zugang → <code><nowiki>http://dergagi.changeip.org:8088/</nowiki></code>
* '''Apache ProxyPass:''' <code>/w/ → <nowiki>http://127.0.0.1:8088/</nowiki></code>
 
----
 
== 💾 Datenbank-Konfiguration ==


=== MariaDB-Credentials ===
=== MariaDB-Credentials ===
Zeile 140: Zeile 431:
  ''# Root-Zugriff''
  ''# Root-Zugriff''
  docker exec -it mw-clean-final-db mysql -u root -p'CleanFinalRoot2025!' mediawiki</code>
  docker exec -it mw-clean-final-db mysql -u root -p'CleanFinalRoot2025!' mediawiki</code>
----


== MediaWiki-Konfiguration ==
== ⚙️ MediaWiki-Konfiguration ==


=== LocalSettings.php (Zentrale Einstellungen) ===
=== LocalSettings.php (Zentrale Einstellungen) ===
Zeile 151: Zeile 443:
php
php
  <code>$wgSitename = "Store2 Wiki";
  <code>$wgSitename = "Store2 Wiki";
  $wgServer = "<nowiki>http://dergagi.changeip.org:8088</nowiki>";
  $wgServer = "<nowiki>https://dergagi.changeip.org</nowiki>";  ''# HTTPS via Reverse Proxy''
$wgScriptPath = "/w";
  $wgLanguageCode = "de";
  $wgLanguageCode = "de";
  $wgDefaultSkin = "vector";
  $wgDefaultSkin = "vector";
Zeile 159: Zeile 452:
     'icon' => "$wgResourceBasePath/images/logo.png",
     'icon' => "$wgResourceBasePath/images/logo.png",
  ];
  ];
''# === KRITISCHE COOKIE-KONFIGURATION (11.10.2025) ===''
$wgCookieSecure = false;        ''# MUSS false sein bei HTTPS-Proxy!''
$wgForceHTTPS = false;
$wgCookieHttpOnly = true;
$wgCookiePath = "/w/";
$wgCookieDomain = "";          ''# Leer = Same-Domain''
$wgCookieSameSite = false;
''# === SESSION-KONFIGURATION ===''
$wgSessionCacheType = CACHE_DB;
$wgSessionsInObjectCache = true;
$wgObjectCacheSessionExpiry = 86400;
''# === CACHE-DEAKTIVIERUNG (für stabiles Editieren) ===''
$wgEnableParserCache = false;  ''# Verhindert "Versions-ID"-Fehler''
$wgCachePages = false;
''# === USER PERMISSIONS ===''
''# Nur registrierte User können editieren''
$wgGroupPermissions['*']['edit'] = false;
$wgGroupPermissions['*']['createpage'] = false;
$wgGroupPermissions['*']['createaccount'] = false;  ''# Nur Admin kann Accounts erstellen''
   
   
  ''# Suppress MediaWiki 1.44 core deprecation warnings''
  ''# Suppress MediaWiki 1.44 core deprecation warnings''
Zeile 171: Zeile 487:
* '''Status:''' Store2-Logo mit rotem Rahmen und Stern sichtbar
* '''Status:''' Store2-Logo mit rotem Rahmen und Stern sichtbar


== Daten-Inhalt ==
----
 
== 🔐 Sicherheit & Benutzerrechte ==
 
=== Berechtigungsmodell ===
 
* ✅ '''Jeder kann lesen''' (keine Authentifizierung erforderlich)
* ✅ '''Nur registrierte User können editieren'''
* ✅ '''Nur Admin kann neue Accounts erstellen'''
* ✅ '''Login funktioniert''' (Cookie-Problem gelöst am 11.10.2025)
 
=== Neue User anlegen ===
'''Option A: Über Web-UI (EMPFOHLEN)'''


=== Wiki-Seiten (12 Hauptseiten + aktuelle Ergänzungen) ===
# Als Admin einloggen: <nowiki>https://dergagi.changeip.org/w/</nowiki>
# Zu Spezial-Seite: [[Spezial:CreateAccount|https://dergagi.changeip.org/w/index.php?title=Spezial:CreateAccount]]
# Benutzername, Passwort, E-Mail eingeben
# "Benutzerkonto erstellen" klicken


* '''Hauptseite''' (mit Kachel-Layout)
'''Option B: Via Command-Line'''
* '''Store_2.0''' (umfangreiche System-Dokumentation)
 
* '''RAID-Systeme''' (Raid, Raid-Layout)
bash
* '''Linux-Verwendung''' (Linux-use)
<code>''# Normaler User''
* '''Change-Routen''' (System-Migration)
docker exec mw-clean-final php /var/www/html/maintenance/createAndPromote.php \
* '''Webservices''' & '''Subversion'''
  --force \
* '''Wiki-Bearbeitung''' (Wiki-Edit)
  username \
* '''Aktuelle Ergänzungen:''' Container-Wiederherstellung-Dokumentation (03.09.2025)
  'Password123!'
''# Admin-User (mit Sysop + Bureaucrat Rechten)''
docker exec mw-clean-final php /var/www/html/maintenance/createAndPromote.php \
  --force \
  --bureaucrat \
  --sysop \
  adminuser \
  'AdminPass123!'</code>
----
 
== 🌐 Browser-Zugang & Troubleshooting ==
 
=== Zugang in neuen Browsern einrichten ===
'''Für JEDEN neuen Browser (Chrome, Opera, Firefox auf anderem PC):'''
 
# Browser öffnen
# Zu MediaWiki gehen: <nowiki>https://dergagi.changeip.org/w/</nowiki>
# '''Cache-Bypass:''' Strg + F5 (Windows) oder Strg + Shift + R (Linux)
# Login-Seite: [[Spezial:Anmelden|https://dergagi.changeip.org/w/index.php?title=Spezial:Anmelden]]
# Login: <code>admin</code> / <code>CleanFinalMW2025!</code>
 
=== Login funktioniert nicht? ===
'''Cookies löschen:'''
 
* '''Chrome/Opera:''' F12 → Tab "Application" → Links "Cookies" → <nowiki>https://dergagi.changeip.org</nowiki> → Alle löschen
* '''Firefox:''' F12 → Tab "Speicher" → "Cookies" → <nowiki>https://dergagi.changeip.org</nowiki> → Rechtsklick "Alle löschen"
* '''Inkognito-Fenster verwenden''' (sauberster Test)
 
=== "Versions-ID stimmen nicht überein" Fehler ===
'''Bereits behoben durch:'''
 
php
<code>$wgEnableParserCache = false;
$wgCachePages = false;</code>
Falls der Fehler dennoch auftritt:
 
bash
<code>''# Cache-Rebuild''
docker exec mw-clean-final php /var/www/html/maintenance/rebuildrecentchanges.php</code>
----
 
== 📊 Daten-Inhalt ==
 
=== Wiki-Seiten (12+ Hauptseiten) ===
 
* Hauptseite (mit Kachel-Layout)
* Store_2.0 (umfangreiche System-Dokumentation)
* RAID-Systeme (Raid, Raid-Layout)
* Linux-Verwendung (Linux-use)
* Change-Routen (System-Migration)
* Webservices & Subversion
* Wiki-Bearbeitung (Wiki-Edit)
* Container-Wiederherstellung-Dokumentation


=== Statistik ===
=== Statistik ===


* '''Seiten:''' 12+ importiert (erweitert um aktuelle Dokumentation)
* '''Seiten:''' 12+ importiert
* '''Revisionen:''' 1059+ (aus 2010er Backup + neue Inhalte)
* '''Revisionen:''' 1059+ (aus 2010er Backup + neue Inhalte)
* '''Datenquelle:''' XML-Backup von Original-Store2-System + laufende Updates
* '''Datenquelle:''' XML-Backup von Original-Store2-System + laufende Updates


== Backup-System ==
----
 
== 💾 Backup-System ==


=== Aktuelle Backups ===
=== Aktuelle Backups ===
Zeile 202: Zeile 588:
  └── mediawiki-setup/              (Docker-Compose)
  └── mediawiki-setup/              (Docker-Compose)
   
   
  ''# Notfall-Backups (während Wiederherstellung erstellt)''
  ''# Cookie-Fix-Backups (11.10.2025)''
  /root/mediawiki-emergency-backup-20250903-151021/ ''# Sichere aktuelle Daten''
  /var/www/html/LocalSettings.php.BEFORE-FINAL-FIX  ''# Vor Cookie-Fix''
  /root/mediawiki-before-logo-fix-*/                ''# Pre-Logo-Fix Backups''
/var/www/html/LocalSettings.php.backup-*          ''# Verschiedene Versionen''</code>
 
=== Backup-Kommando (Aktuell) ===
bash
  <code>''# Manuelles Backup erstellen''
  TS=$(date +%Y%m%d-%H%M%S)
mkdir -p /root/mediawiki-backup-$TS
''# SQL-Dump''
docker exec mw-clean-final-db mysqldump -u mwuser -pCleanFinalMW2025! mediawiki > /root/mediawiki-backup-$TS/mediawiki-$TS.sql
   
   
  ''# Original-Backups (Fallback)''
  ''# LocalSettings.php''
  /root/mediawiki-working-backup.20250831-123906/   ''# Funktionierendes Backup''
  docker cp mw-clean-final:/var/www/html/LocalSettings.php /root/mediawiki-backup-$TS/
  /root/STORE2-XML-BACKUP-SAFE-20250831-112526.xml.gz  ''# XML-Original''</code>
''# Docker-Volumes''
  docker run --rm -v mediawiki-clean-final_mw-database:/data alpine tar czf - -C /data . > /root/mediawiki-backup-$TS/mw-database.tar.gz
docker run --rm -v mediawiki-clean-final_mw-images:/data alpine tar czf - -C /data . > /root/mediawiki-backup-$TS/mw-images.tar.gz
   
echo "Backup erstellt in: /root/mediawiki-backup-$TS"</code>


=== Restore-Prozedur (Aktualisiert) ===
=== Restore-Prozedur ===
bash
bash
  <code>''# Restore aus perfektem Backup (mit Store2-Logo)''
  <code>''# Restore aus Backup''
  cd /root/mediawiki-perfect-with-logo-20250903-152727/
  cd /root/mediawiki-backup-TIMESTAMP/
  docker-compose -f mediawiki-setup/docker-compose.yml down
  docker-compose -f /srv/mediawiki-clean-final/docker-compose.yml down
  docker volume rm mediawiki-clean-final_mw-database mediawiki-clean-final_mw-images
  docker volume rm mediawiki-clean-final_mw-database mediawiki-clean-final_mw-images
  docker-compose -f mediawiki-setup/docker-compose.yml up -d
  docker-compose -f /srv/mediawiki-clean-final/docker-compose.yml up -d
  gunzip < mw-database-perfect.tar.gz | docker run -i --rm -v mediawiki-clean-final_mw-database:/data alpine tar xzf - -C /data
  gunzip < mw-images-with-logo.tar.gz | docker run -i --rm -v mediawiki-clean-final_mw-images:/data alpine tar xzf - -C /data
''# Volumes wiederherstellen''
  docker cp LocalSettings-perfect.php mw-clean-final:/var/www/html/LocalSettings.php</code>
  gunzip < mw-database.tar.gz | docker run -i --rm -v mediawiki-clean-final_mw-database:/data alpine tar xzf - -C /data
  gunzip < mw-images.tar.gz | docker run -i --rm -v mediawiki-clean-final_mw-images:/data alpine tar xzf - -C /data
''# LocalSettings.php''
  docker cp LocalSettings.php mw-clean-final:/var/www/html/LocalSettings.php
''# Container neustarten''
docker-compose -f /srv/mediawiki-clean-final/docker-compose.yml restart</code>
----


== Docker-Volumes ==
== 🔧 Wartung & Maintenance ==


=== Volume-Management ===
=== MediaWiki-Maintenance-Scripts ===
bash
<code>''# Update-Script (nach MediaWiki-Upgrade)''
docker exec mw-clean-final php /var/www/html/maintenance/update.php
''# Cache-Rebuild''
docker exec mw-clean-final php /var/www/html/maintenance/rebuildrecentchanges.php
''# Site-Statistiken aktualisieren''
docker exec mw-clean-final php /var/www/html/maintenance/initSiteStats.php
''# Admin-Passwort ändern''
docker exec mw-clean-final php /var/www/html/maintenance/changePassword.php \
  --user=admin \
  --password='NeuesPasswort123!'</code>
 
=== Monitoring ===
bash
<code>''# Container-Status''
docker ps | grep mw-clean
''# Logs live verfolgen''
docker logs -f mw-clean-final
''# Apache-Logs (im Container)''
docker exec mw-clean-final tail -f /var/log/apache2/error.log
''# Port-Check''
ss -tlnp | grep :8088</code>
----
 
== 🔍 Integration in STORE2-System ==
 
=== Apache Reverse Proxy Konfiguration ===
'''VirtualHost-Dateien:'''
 
* <code>/etc/apache2/sites-enabled/000-catchall-443.conf</code>
* <code>/etc/apache2/sites-enabled/000-website-dergagi-443.conf</code>
 
'''ProxyPass-Regel (in beiden VirtualHosts):'''
 
apache
<code><Location /w/>
  ProxyPass <nowiki>http://127.0.0.1:8088/</nowiki>
  ProxyPassReverse <nowiki>http://127.0.0.1:8088/</nowiki>
  RequestHeader set X-Forwarded-Proto "https"
  RequestHeader set X-Forwarded-Host "dergagi.changeip.org"
  RequestHeader set X-Forwarded-Port "443"
</Location></code>
 
=== Netzwerk-Architektur ===
 
* Läuft parallel zu Apache (Port 443)
* Keine BasicAuth-Konflikte
* Direkter Port-Zugang (8088) UND Proxy-Zugang (443) verfügbar
* Unabhängig von /data2-Mount (läuft auf Haupt-Partition)
 
=== Docker-Volumes ===
bash
bash
  <code>''# Volume-Namen''
  <code>''# Volume-Namen''
Zeile 232: Zeile 697:
  /var/lib/docker/volumes/mediawiki-clean-final_mw-database/_data
  /var/lib/docker/volumes/mediawiki-clean-final_mw-database/_data
  /var/lib/docker/volumes/mediawiki-clean-final_mw-images/_data</code>
  /var/lib/docker/volumes/mediawiki-clean-final_mw-images/_data</code>
----


== Container-Wiederherstellung (03.09.2025) ==
== 📝 Änderungshistorie & Lessons Learned ==


=== Durchgeführte Reparaturen ===
=== Container-Wiederherstellung (03.09.2025) ===


* '''Problem:''' Versehentliches <code>docker container prune -f</code> löschte alle Container
* '''Problem:''' Versehentliches <code>docker container prune -f</code> löschte alle Container
* '''Lösung:''' Vollständige Wiederherstellung aus nvme-Backup
* '''Lösung:''' Vollständige Wiederherstellung aus nvme-Backup
* '''Status:''' Erfolgreich wiederhergestellt mit allen Daten
* '''Status:''' Erfolgreich mit allen Daten wiederhergestellt
* '''Logo-Fix:''' Store2-Logo neu installiert und auf MediaWiki-Standard skaliert
 
* '''Deprecation-Warning:''' Über PHP error_reporting unterdrückt
=== Login-Problem gelöst (11.10.2025) ===
 
* '''Problem:''' Login funktionierte nicht (Cookie wurde nicht erkannt)
* '''Root Cause:''' <code>$wgCookieSecure = true</code> bei HTTPS-Proxy-Setup
* '''Lösung:''' <code>$wgCookieSecure = false</code> + <code>$wgForceHTTPS = false</code>
* '''Status:''' ✅ Login funktioniert jetzt in allen Browsern
 
=== Edit-Token-Problem gelöst (11.10.2025) ===
 
* '''Problem:''' "Versions-IDs stimmen nicht überein" bei wiederholtem Editieren
* '''Root Cause:''' Parser-Cache verursachte Token-Mismatch
* '''Lösung:''' <code>$wgEnableParserCache = false</code> + <code>$wgCachePages = false</code>
* '''Status:''' ✅ Mehrfaches Editieren ohne Fehler möglich
 
=== Wichtige Erkenntnisse ===
 
# '''Cookie-Konfiguration bei HTTPS-Proxy:''' <code>$wgCookieSecure = false</code> ist KRITISCH
# '''Cache-Probleme:''' Bei Edit-Token-Problemen Cache deaktivieren
# '''Browser-Cache:''' Neue Browser benötigen Cache-Bypass (Strg+F5)
# '''Backup-Kritikalität:''' nvme-Backup war entscheidend für Wiederherstellung
# '''Systematische Reparatur:''' Immer Backup vor Systemänderungen
 
----
 
== 🎯 Quick Reference ==
 
=== Häufige Aufgaben ===
bash
<code>''# Container neu starten''
cd /srv/mediawiki-clean-final/ && docker-compose restart
''# LocalSettings.php bearbeiten''
docker exec -it mw-clean-final nano /var/www/html/LocalSettings.php
''# Logs live anzeigen''
docker logs -f mw-clean-final
''# Backup erstellen (siehe Backup-Kommando oben)''
''# User anlegen''
docker exec mw-clean-final php /var/www/html/maintenance/createAndPromote.php --force username 'password'</code>
 
=== Wichtige URLs ===
 
* '''Haupt-URL:''' <nowiki>https://dergagi.changeip.org/w/</nowiki>
* '''Login:''' [[Spezial:Anmelden|https://dergagi.changeip.org/w/index.php?title=Spezial:Anmelden]]
* '''User anlegen:''' [[Spezial:CreateAccount|https://dergagi.changeip.org/w/index.php?title=Spezial:CreateAccount]]
* '''Spezialseiten:''' [[Spezial:Spezialseiten|https://dergagi.changeip.org/w/index.php?title=Spezial:Spezialseiten]]
* '''Direkt-Zugang:''' <nowiki>http://dergagi.changeip.org:8088/</nowiki>
 
----'''MediaWiki Store2 ist vollständig eingerichtet, produktiv, backup-gesichert und mit funktionierendem Login.'''
 
= IMMICH PHOTO MANAGEMENT - KOMPLETTE DOKUMENTATION =
 
=== Übersicht ===
Immich ist eine selbst-gehostete Photo Management Lösung für STORE2. Läuft als Docker-Stack mit eigenem PostgreSQL und Redis.
----
 
=== Zugriff ===
 
* '''Web-UI''': <nowiki>https://photos.dergagi.changeip.org</nowiki>
* '''Mobil-Apps''':
** iOS: <nowiki>https://apps.apple.com/app/immich/id1613945652</nowiki>
** Android: <nowiki>https://play.google.com/store/apps/details?id=app.alextran.immich</nowiki>
* '''Admin-Login''': Dein registrierter Account
* '''Version''': v2.0.1 (Docker release tag)
 
----
 
=== Docker-Stack ===
'''Pfad''': <code>/srv/immich/</code>
 
'''Container:'''
<code>immich-server    → Port 127.0.0.1:3002 (nur lokal)
immich-ml        → Machine Learning (Gesichtserkennung)
immich-postgres  → PostgreSQL mit pgvecto-rs
immich-redis      → Cache</code>
'''docker-compose.yml''': <code>/srv/immich/docker-compose.yml</code>
 
'''Wichtige Befehle:'''
 
bash
<code>cd /srv/immich
''# Status''
docker compose ps
''# Logs''
docker compose logs -f immich-server
''# Neustart''
docker compose restart
''# Update (neue Version)''
docker compose pull
docker compose up -d</code>
----
 
=== Datenbank ===
 
* '''Engine''': PostgreSQL 16 mit pgvecto-rs Extension
* '''User''': <code>immich</code>
* '''Passwort''': <code>YVQkopY9HH4immich2025secure</code>
* '''Datenbank''': <code>immich</code>
* '''Data Directory''': <code>/srv/immich/pgdata/</code>
 
'''Backup erstellen:'''
 
bash
<code>docker compose exec immich-postgres pg_dump -U immich immich > /root/immich-backup-$(date +%Y%m%d).sql</code>
----


=== Lessons Learned ===
=== Storage-Struktur ===
'''Immich-eigene Daten''' (<code>/data2/immich/</code>):
<code>/data2/immich/library/        → Hochgeladene Fotos (via App/WebUI)
/data2/immich/upload/          → Temp-Uploads
/data2/immich/thumbs/          → Miniaturansichten (generiert)
/data2/immich/profile/        → Profilbilder
/data2/immich/encoded-video/  → Transkodierte Videos
/data2/immich/backups/        → Datenbank-Backups
/data2/immich/model-cache/    → ML-Modelle</code>
'''Read-Only External Libraries''' (bestehende Daten):
<code>/data2/Daniel/Fotos                    → gemountet als /mnt/media/fotos
/data2/Save/00 - Race Drone/Videos    → gemountet als /mnt/media/fpv-videos</code>
'''Marker-Files''': Alle Verzeichnisse enthalten <code>.immich</code> Marker-Dateien (sonst crasht Container)
----


* '''Backup-Kritikalität:''' nvme-Backup war entscheidend für Wiederherstellung
=== Apache Reverse Proxy ===
* '''Vorsichtige Vorgehensweise:''' Immer Backup vor Systemänderungen
'''VirtualHost''': <code>/etc/apache2/sites-enabled/photos-dergagi-443.conf</code>
* '''Systematische Reparatur:''' Erst Daten sichern, dann reparieren


== Wartung & Maintenance ==
'''Konfiguration:'''
 
apache
<code><VirtualHost *:443>
  ServerName photos.dergagi.changeip.org
 
  # KRITISCH: Expliziter DocumentRoot (sonst wird /var/www/html vererbt!)
  DocumentRoot /var/www/photos-immich-empty
  <Directory /var/www/photos-immich-empty>
    Require all denied
  </Directory>
  # SSL
  SSLEngine on
  SSLCertificateFile /etc/letsencrypt/live/dergagi.changeip.org/fullchain.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/dergagi.changeip.org/privkey.pem
  # Reverse Proxy
  ProxyRequests Off
  ProxyPreserveHost On
  RequestHeader set X-Real-IP %{REMOTE_ADDR}s
  RequestHeader set X-Forwarded-For %{REMOTE_ADDR}s
  RequestHeader set X-Forwarded-Proto https
  # WebSocket + Proxy
  ProxyPass / <nowiki>http://127.0.0.1:3002/</nowiki> timeout=600 upgrade=websocket
  ProxyPassReverse / <nowiki>http://127.0.0.1:3002/</nowiki>
  # Large File Uploads
  LimitRequestBody 0
  # Logs
  ErrorLog ${APACHE_LOG_DIR}/immich-error.log
  CustomLog ${APACHE_LOG_DIR}/immich-access.log combined
</VirtualHost></code>
'''Logs:'''
 
* Error: <code>/var/log/apache2/immich-error.log</code>
* Access: <code>/var/log/apache2/immich-access.log</code>
 
----
 
=== SSL-Zertifikat ===
'''Shared Zertifikat''': <code>/etc/letsencrypt/live/dergagi.changeip.org/</code>
 
'''Domains im Zertifikat:'''
 
* <code>dergagi.changeip.org</code>
* <code>photos.dergagi.changeip.org</code>
 
'''Gültig bis''': 09.01.2026
 
'''Renewal:'''
 
bash
<code>certbot renew --dry-run  ''# Test''
certbot renew            ''# Echt''</code>
----
 
=== External Libraries (Read-Only) ===
'''Fotos Daniel:'''
 
* Immich-Name: <code>Fotos Daniel</code>
* Mount: <code>/mnt/media/fotos</code>
* Host-Pfad: <code>/data2/Daniel/Fotos</code>
* Scan: Manuell via WebUI (Administration → External Libraries → Scan)
 
'''FPV Videos:'''
 
* Immich-Name: <code>FPV Videos</code>
* Mount: <code>/mnt/media/fpv-videos</code>
* Host-Pfad: <code>/data2/Save/00 - Race Drone/Videos</code>
* Scan: Manuell via WebUI
 
'''WICHTIG''': Video Transcoding ist '''deaktiviert''' (wegen Read-Only!)
----
 
=== Wichtige Einstellungen ===
'''Video Transcoding:'''
 
* Status: '''DEAKTIVIERT'''
* Grund: Read-Only Volumes können nicht transkodiert werden
* Einstellung: Administration → Video Transcoding → "Videos nicht transkodieren"
* Akzeptierte Codecs: Nur H.264
 
'''Machine Learning:'''
 
* Gesichtserkennung: Optional aktivierbar
* Objekterkennung: Läuft automatisch
* Models: In <code>/data2/immich/model-cache/</code>
 
----
 
=== Backup & Restore ===
'''Backup erstellen:'''
 
bash
<code>''# Datenbank''
cd /srv/immich
docker compose exec immich-postgres pg_dump -U immich immich > /root/immich-db-backup-$(date +%Y%m%d).sql
''# Docker Compose Config''
cp docker-compose.yml /root/immich-compose-backup-$(date +%Y%m%d).yml
''# Upload-Daten (optional, große Datenmenge!)''
tar -czf /root/immich-uploads-backup-$(date +%Y%m%d).tar.gz /data2/immich/library/</code>
'''Restore:'''
 
bash
<code>cd /srv/immich
''# 1. Container stoppen''
docker compose down
''# 2. DB wiederherstellen''
docker compose up -d immich-postgres
docker compose exec -T immich-postgres psql -U immich immich < /root/immich-db-backup-DATUM.sql
''# 3. Alle Container starten''
docker compose up -d</code>
----
 
=== Troubleshooting ===
'''Container crasht:'''
 
bash
<code>''# Logs prüfen''
docker compose logs immich-server
''# Häufige Ursachen:''
''# - Fehlende .immich Marker-Files''
''# - Falsche DB-Credentials''
''# - Port 3002 bereits belegt''</code>
'''API liefert HTML statt JSON:'''
 
bash
<code>''# Backend direkt testen''
curl <nowiki>http://127.0.0.1:3002/api/server/config</nowiki>
''# Apache Proxy testen''
curl -k <nowiki>https://photos.dergagi.changeip.org/api/server/config</nowiki>
''# Ursache: Globale conf-enabled Regeln (z.B. ProxyPass /api)''
''# Lösung: conf-enabled Dateien deaktivieren, ProxyPass nur in VHost''</code>
'''502 Bad Gateway:'''
 
bash
<code>''# Container läuft?''
docker compose ps
''# Backend erreichbar?''
ss -tlnp | grep 3002
''# Apache Logs''
tail -f /var/log/apache2/immich-error.log</code>
----
 
=== KRITISCHE ERKENNTNISSE (Lessons Learned) ===
 
==== 1. Immich benötigt SUBDOMAIN (keine Subpaths) ====
❌ '''FALSCH''': <code><nowiki>https://dergagi.changeip.org/immich/</nowiki></code>
 
✅ '''RICHTIG''': <code><nowiki>https://photos.dergagi.changeip.org/</nowiki></code>
 
Immich ist eine SPA (Single Page Application) und unterstützt keine Subpaths.
 
==== 2. VirtualHost braucht expliziten DocumentRoot ====
Ohne expliziten <code>DocumentRoot</code> erbt der VHost <code>/var/www/html</code> und liefert die STORE2 <code>index.html</code> statt zu proxyen.
 
'''Lösung:'''
 
apache
<code>DocumentRoot /var/www/photos-immich-empty
<Directory /var/www/photos-immich-empty>
  Require all denied
</Directory></code>
 
==== 3. NIEMALS globale ProxyPass /api in conf-enabled ====
Die globale <code>/etc/apache2/conf-enabled/homebox-proxy-clean.conf</code> hatte:
 
apache
<code>ProxyPass /api <nowiki>http://127.0.0.1:3100/api</nowiki></code>
Diese Regel gilt für '''ALLE VirtualHosts''' und fing alle Immich <code>/api</code> Requests ab!
 
'''Regel''': ProxyPass IMMER in VirtualHost-Blöcken definieren, NIE in conf-enabled (außer wirklich global gewollt).
 
==== 4. Container brauchen .immich Marker-Files ====
Immich prüft beim Start, ob in allen Volume-Verzeichnissen <code>.immich</code> Dateien existieren. Ohne diese crasht der Container.
 
'''Fix:'''
 
bash
<code>touch /data2/immich/library/.immich
touch /data2/immich/upload/.immich
''# ... etc für alle Verzeichnisse''</code>
 
==== 5. DB-Passwörter: Keine Sonderzeichen in Docker ====
Docker Compose hat Probleme mit Sonderzeichen (<code>$</code>, <code>!</code>, etc.) in Passwörtern.
 
'''Empfehlung''': Nur <code>A-Za-z0-9</code> verwenden (laut Immich-Doku).
----
 
=== Maintenance ===
'''Updates:'''
 
bash
<code>cd /srv/immich
docker compose pull
docker compose up -d</code>
'''Speicherplatz prüfen:'''


=== MediaWiki-Maintenance-Scripts ===
bash
bash
  <code>''# Update-Script''
  <code>''# Thumbnails Größe''
  docker exec mw-clean-final php /var/www/html/maintenance/update.php
du -sh /data2/immich/thumbs/
''# Uploads Größe''
  du -sh /data2/immich/library/
   
   
  ''# Cache-Rebuild''
  ''# Gesamt''
  docker exec mw-clean-final php /var/www/html/maintenance/rebuildrecentchanges.php
  du -sh /data2/immich/</code>
'''Logs rotieren:'''
 
bash
<code>''# Apache Logs''
logrotate -f /etc/logrotate.d/apache2
   
   
  ''# Site-Statistiken''
  ''# Docker Logs (automatisch via Docker-Daemon)''</code>
docker exec mw-clean-final php /var/www/html/maintenance/initSiteStats.php</code>
----
 
=== Performance ===
'''Aktueller Status:'''


=== Monitoring ===
* CPU: 12 Cores (Auto-detected)
* RAM: ~2-4 GB (Docker Container)
* Storage: 53.5 TiB verwendet von 57.1 TiB (93%)
 
'''Optimierungen:'''
 
* Machine Learning kann CPU-lastig sein
* Hardware-Beschleunigung möglich (siehe hwaccel.yml)
* Thumbnails werden on-demand generiert
 
----
 
=== Security Checklist ===
 
* ✅ SSL/TLS aktiviert (Let's Encrypt)
* ✅ Port 3002 nur lokal (127.0.0.1)
* ✅ DB-Passwort geändert (nicht mehr Default)
* ✅ Read-Only Mounts für bestehende Daten
* ✅ Apache Header (X-Real-IP, X-Forwarded-Proto)
* ⚠️ BasicAuth möglich (optional für zusätzliche Sicherheit)
 
----
 
=== Support & Dokumentation ===
 
* '''Offizielle Docs''': <nowiki>https://immich.app/docs/</nowiki>
* '''GitHub''': <nowiki>https://github.com/immich-app/immich</nowiki>
* '''Discord''': <nowiki>https://discord.gg/immich</nowiki>
* '''Environment Variables''': <nowiki>https://immich.app/docs/install/environment-variables/</nowiki>
 
----'''Status''': ✅ '''PRODUKTIV SEIT 12.10.2025'''
 
'''Nächster Check''': Speicherplatz-Monitor bei ~95% (ca. 1 TiB frei)
 
= Koel Musikstreaming-Server =
 
=== 📍 Installation erfolgreich abgeschlossen ===
'''Server:''' STORE2
 
'''URL:''' <nowiki>http://dergagi.changeip.org:6680</nowiki>
 
'''Status:''' ✅ Voll funktionsfähig
----
 
=== 🔑 Zugangsdaten ===
'''Admin-Account:'''


* '''Port-Check:''' <code>netstat -tlnp | grep :8088</code>
* Email: <code>daniel.gareis@gmail.com</code>
* '''Container-Status:''' <code>docker ps | grep mw-clean</code>
* Passwort: #s46@jCuFEq5S^
* '''Logs:''' <code>docker logs mw-clean-final</code>


== Integration in STORE2-System ==
'''Datenbank:'''


=== Netzwerk-Konfiguration ===
* DB-Root: <code>KoelRootStore2!</code>
* DB-User: <code>koel</code> / <code>KoelStore2Music2025!</code>


* Läuft parallel zu Apache (Port 443)
----
* Keine BasicAuth-Konflikte
* Direkter Port-Zugang ohne Proxy
* Unabhängig von /data2-Mount (läuft auf Haupt-Partition)


=== Dienste-Integration ===
=== 🎵 Musik-Archiv ===
'''Verzeichnisse:'''


* Läuft eigenständig ohne Abhängigkeiten zu anderen Store2-Services
* Hauptordner: <code>/data2/mp3/mp3</code> (92.980 MP3-Dateien)
* Keine Apache-Proxy-Konfiguration erforderlich
* Symlinks: 38.046 Links in <code>/data2/mp3/mp3/00_Unique_From_Other_Folders</code>
* Automatischer Docker-Start mit System
* Weitere: 7.778 MP3s in <code>/data2/mp3/mp3s von MB/</code>
* Cover: 7.015 Cover-Dateien im Archiv, werden bei Koel aber nicht genutzt, sondern on-the-fly online hergeholt und auch nicht lokal gespeichert


== Sicherheit & Zugänge ==
'''Scan-Status:'''


=== Authentifizierung ===
* Läuft gerade im Hintergrund (2-3 Stunden für alle Dateien)
* Songs erscheinen live im Web-Interface während des Scans
* Log: <code>/var/log/koel-scan.log</code>


* Keine Apache-BasicAuth (direkter Port-Zugang)
----
* MediaWiki-eigene Benutzerkonten
* Admin-Account für Vollzugriff


=== Netzwerk-Sicherheit ===
=== 🔧 Technische Details ===
'''Docker-Setup:'''


* Port 8088 HTTP-only (kein HTTPS konfiguriert)
* Installation in <code>/srv/koel</code>
* Datenbank nicht extern exposed
* Container: <code>koel</code> (App) + <code>koel-db</code> (MariaDB 10.11)
* Container-zu-Container Kommunikation über Docker-Netzwerk
* Port: 6680 (extern) → 80 (intern)
* Images: <code>phanan/koel:latest</code> + <code>mariadb:10.11</code>
* Memory Limit: 2GB für Koel, 512MB für DB


----'''MediaWiki Store2 ist vollständig eingerichtet, produktiv und backup-gesichert.'''
'''Konfigurationsdateien:'''


'''Status nach Container-Wiederherstellung:''' Alle ursprünglichen Inhalte aus dem 2010er System erfolgreich migriert, erweitert um aktuelle Dokumentation, mit professionellem Store2-Logo und ohne störende Deprecation-Warnings.
* Docker Compose: <code>/srv/koel/docker-compose.yml</code>
* Environment: <code>/srv/koel/koel.env</code>
* APP_KEY: Automatisch generiert und in koel.env gespeichert
'''Features:'''


= Kavita E-Book Server - Konfigurationsdokumentation =
* ✅ Web-basiertes Streaming
* ✅ Playlist-Verwaltung
* ✅ Last.fm/Spotify/iTunes Metadaten
* ✅ Cover-Art (dynamisch geladen)
* ✅ Suche und Filter
* ⚠️ 100.686/137.074 Songs verfügbar


=== Service-Übersicht ===
'''Bekannte Probleme:'''


* '''Dienst:''' Kavita E-Book/PDF Library Server
* Unterordner in <code>/00_Unique_From_Other_Folders/</code> werden nicht gescannt
* '''Version:''' v0.8.7.0 (jvmilazz0/kavita:latest)
* UTF-8 Encoding-Fehler bei Sonderzeichen
* '''Port:''' 5000 (HTTP)
* Keine lokale Cover-Speicherung
* '''URL:''' <nowiki>http://dergagi.changeip.org:5000</nowiki>
* '''Installation:''' /srv/kavita/
* '''Daten:''' /data/ebooks/ (107,9 GB, 41.681 Objekte)


=== Docker-Konfiguration ===
----
yaml
<code>''# /srv/kavita/docker-compose.yml''
services:
  kavita:
    image: jvmilazz0/kavita:latest
    container_name: kavita-ebooks
    restart: unless-stopped
    ports:
      - "5000:5000"
    volumes:
      - ./config:/kavita/config
      - /data/ebooks:/books
      - ./data:/kavita/data
    environment:
      - TZ=Europe/Berlin
    user: 1000:1000</code>


=== Verzeichnisstruktur ===
=== 📝 Wichtige Wartungsbefehle ===
  <code>/srv/kavita/
bash
  ├── docker-compose.yml
  <''# Musik-Scan manuell starten''
  ├── config/          (Kavita Konfiguration)
docker exec --user www-data koel php artisan koel:scan
  └── data/           (Kavita Datenbank)
''# Scan-Progress verfolgen''
tail -f /var/log/koel-scan.log
''# Container-Status prüfen''
  docker ps | grep koel
''# Container neu starten''
cd /srv/koel && docker-compose restart
  ''# Laravel-Logs bei Problemen''
  docker exec koel tail -50 /var/www/html/storage/logs/laravel.log
   
   
  /data/ebooks/       (E-Book Sammlung)
  ''# Cache leeren''
├── E-Books Sebastian/     (47,6 GB)
docker exec koel php artisan cache:clear
├── 00 - Hörbücher/       (35,6 GB)
docker exec koel php artisan config:clear</code>
├── Programming/         (9,4 GB)
----
├── Original/             (3,1 GB)
 
└── [weitere Kategorien...]</code>
=== 💾 Backup-Information ===
 
* Navidrome-Backup vorhanden: <code>/root/backup-navidrome-*.tar.gz</code>
* Koel-Daten: <code>/srv/koel/</code> (Docker Volumes)
* Musik unverändert in: <code>/data2/mp3/</code>


=== Benutzer & Berechtigungen ===
----


* '''Container-User:''' 1000:1000 (gagi)
=== ⚠️ Bekannte Einschränkungen ===
* '''Dateiberechtigungen:''' gagi:gagi auf alle E-Book-Verzeichnisse
* '''Multi-User fähig:''' Ja, über Web-UI administrierbar


=== Besonderheiten ===
* Läuft nur über HTTP (kein HTTPS aktiv)
* Mobile Apps sind kostenpflichtig
* Keine automatischen Metadaten-Downloads konfiguriert


* '''Repository-Migration:''' Von kizaing/kavita zu jvmilazz0/kavita
'''System läuft stabil!''' Container sind healthy, Web-Interface funktioniert
* '''Automatische Indizierung:''' Läuft bei Container-Start
* '''PDF-Warnings:''' Normal bei verschlüsselten/beschädigten PDFs
* '''Backup:''' /root/kavita-backup-* bei Migration erstellt


= Navidrome Konfiguration =
= Navidrome (läuft nicht mehr, nur historisch, wurde durch Koel ersetzt) =


== 📋 Service-Übersicht ==
== 📋 Service-Übersicht ==
Zeile 428: Zeile 1.283:
  ''# Container entfernen (Notfall)''
  ''# Container entfernen (Notfall)''
  docker stop navidrome && docker rm navidrome</code>
  docker stop navidrome && docker rm navidrome</code>
= iTunes/Last.fm Cover Downloader Service =
'''System:''' STORE2 (Debian 13)
'''Stand:''' 2025-09-14
'''Status:''' ✅ AKTIV UND FUNKTIONSFÄHIG
----
== 1. SYSTEM-ÜBERSICHT ==
=== Zweck ===
Automatisches Herunterladen fehlender Album-Cover für die MP3-Sammlung unter <code>/data2/mp3/mp3/</code> mittels iTunes und Last.fm APIs.
=== Aktuelle Statistik ===
* '''Service läuft seit:''' 14.09.2025 08:15 Uhr
* '''Erfolgsrate:''' ~11-15% (normal für diese Sammlung mit vielen Bootlegs)
* '''Bisher heruntergeladen:''' 380+ Cover erfolgreich, 2187 neue Cover in 24h
* '''Verbleibende Queue:''' 2901 Alben ohne Cover
* '''Geschätzte Restzeit:''' ~2-3 Stunden bei 3 Sek/Album
----
== 2. TECHNISCHE ARCHITEKTUR ==
=== Verzeichnisstruktur ===
<code>/opt/itunes-persistent/
├── downloader_robust_v3.sh      # Hauptscript (Bash)
├── download_queue.txt          # Queue (TAB-getrennt: Pfad<TAB>Artist<TAB>Album)
├── skip_artwork.txt            # Skip-Cache für bereits versuchte Alben
├── make_queue.py                # Python-Script zur Queue-Generierung
├── logs/
│  ├── downloader-YYYY-MM-DD.log  # Tägliche Log-Dateien
│  └── session_stats.log          # Statistik-Übersicht
└── backup-*/                    # Backup-Verzeichnisse</code>
=== SystemD Service Configuration ===
'''Datei:''' <code>/etc/systemd/system/itunes-downloader.service</code>
ini
<code>[Unit]
Description=Hybrid iTunes + Last.fm Cover Downloader
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/opt/itunes-persistent
ExecStart=/opt/itunes-persistent/downloader_robust_v3.sh
Restart=always
RestartSec=60
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target</code>
----
== 3. API KONFIGURATION ==
=== Last.fm API ===
* '''API Key:''' 7c327a65fcfcec095b42e9df6b3b46b4
* '''Secret:''' 4765b081824d0dfc5a6174fd457b6a9b
* '''User:''' dergagi33
* '''App Name:''' Store2
* '''Rate Limit:''' 300 requests/minute
* '''Erfolgsrate:''' ~60% für offizielle Releases
=== iTunes API ===
* '''Endpoint:''' <nowiki>https://itunes.apple.com/search</nowiki>
* '''Rate Limit:''' 20 requests/minute
* '''Auth:''' Keine erforderlich
* '''Erfolgsrate:''' ~30% für offizielle Releases
----
== 4. WORKFLOW & LOGIK ==
=== Download-Prozess ===
# '''Queue laden''' aus <code>download_queue.txt</code>
# '''Skip-Check:''' Prüfung gegen <code>skip_artwork.txt</code>
# '''API-Versuch 1:''' iTunes API Query
# '''API-Versuch 2:''' Last.fm API als Fallback
# '''Alternative Schreibweisen''' bei Fehlschlag (& → and, Umlaute, etc.)
# '''Download:''' Cover als <code>cover.jpg</code> speichern
# '''Cache-Update:''' Erfolg/Misserfolg in Skip-Cache
=== Queue-Generierung (<code>make_queue.py</code>) ===
python
<code>''#!/usr/bin/env python3''
import os
base_dir = '/data2/mp3/mp3'
output_file = '/opt/itunes-persistent/download_queue.txt'
with open(output_file, 'w') as f:
    for root, dirs, files in os.walk(base_dir):
        ''# Skip Sampler/Collections''
        if any(part.startswith('00') for part in root.split('/')):
            continue
        ''# Check for missing cover''
        if 'cover.jpg' not in files:
            ''# Extract artist and album from path''
            ''# Write TAB-separated: path<TAB>artist<TAB>album''</code>
----
== 5. WICHTIGE BEFEHLE ==
=== Service Management ===
bash
<code>''# Status prüfen''
systemctl status itunes-downloader
''# Service stoppen''
systemctl stop itunes-downloader
''# Service starten''
systemctl start itunes-downloader
''# Service neustarten''
systemctl restart itunes-downloader
''# Logs anzeigen (live)''
journalctl -u itunes-downloader -f
''# Auto-Start aktivieren/deaktivieren''
systemctl enable itunes-downloader
systemctl disable itunes-downloader</code>
=== Monitoring & Statistik ===
bash
<code>''# Live-Log verfolgen''
tail -f /opt/itunes-persistent/logs/downloader-$(date +%F).log
''# Erfolgsstatistik''
grep -c "SUCCESS:" /opt/itunes-persistent/logs/downloader-$(date +%F).log
''# Queue-Status''
wc -l < /opt/itunes-persistent/download_queue.txt
''# Neue Cover der letzten Stunde''
find /data2/mp3/mp3 -name "cover.jpg" -mmin -60 | wc -l
''# Erfolgsrate berechnen''
awk '/Processing:/ {total++} /SUCCESS:/ {success++} END {
    print "Erfolge: " success "/" total " = " int(success*100/total) "%"
}' /opt/itunes-persistent/logs/downloader-$(date +%F).log</code>
=== Queue Management ===
bash
<code>''# Queue neu generieren''
systemctl stop itunes-downloader
cd /opt/itunes-persistent
python3 make_queue.py
systemctl start itunes-downloader
''# Skip-Cache leeren (für neue Versuche)''
> /opt/itunes-persistent/skip_artwork.txt
''# Backup erstellen''
cp download_queue.txt download_queue.backup
cp skip_artwork.txt skip_artwork.backup</code>
----
== 6. TROUBLESHOOTING ==
=== Problem: Service läuft in Endlos-Schleife ===
'''Symptom:''' Service startet alle 60 Sekunden neu
'''Ursache:''' Alle Queue-Einträge im Skip-Cache
'''Lösung:'''
bash
<code>systemctl stop itunes-downloader
> /opt/itunes-persistent/skip_artwork.txt  ''# Skip-Cache leeren''
python3 /opt/itunes-persistent/make_queue.py  ''# Neue Queue''
systemctl start itunes-downloader</code>
=== Problem: Keine neuen Downloads ===
'''Mögliche Ursachen:'''
* API-Rate-Limits erreicht
* Alle verbleibenden Alben nicht in APIs verfügbar
* Queue leer
'''Diagnose:'''
bash
<code>''# Prüfe ob Queue leer''
wc -l < /opt/itunes-persistent/download_queue.txt
''# Prüfe letzte Aktivität''
tail -20 /opt/itunes-persistent/logs/downloader-$(date +%F).log
''# Prüfe ob Prozess läuft''
pgrep -f downloader_robust_v3.sh</code>
=== Problem: Zu viele API-Fehler ===
'''Lösung:''' Rate-Limit in Script anpassen
bash
<code>''# In downloader_robust_v3.sh:''
''# RATE_LIMIT variable von 2 auf 3-4 Sekunden erhöhen''</code>
----
== 7. MUSIK-SAMMLUNG STRUKTUR ==
=== Gesamt-Statistik ===
* '''Basis-Verzeichnis:''' <code>/data2/mp3/mp3/</code>
* '''Künstler-Verzeichnisse:''' 1372
* '''Gesamt-Alben:''' 6642
* '''Mit Cover:''' 3741 (nach Downloads)
* '''Ohne Cover:''' 2901 (hauptsächlich Bootlegs/VA)
=== Kategorien ohne Cover ===
# '''VA-Compilations:''' ~540 Einträge
#* Schwer zu finden, oft lokale Zusammenstellungen
# '''Bootlegs/Underground:''' ~800 Einträge
#* Release-Groups (-uC, -RpM, -WHOA, -XXL)
#* Niemals in offiziellen APIs
# '''Fehlende Metadaten:''' ~550 Einträge
#* Verzeichnisname = Artist = Album
#* Parser konnte nicht trennen
# '''Reggae-Sammlung:''' ~200 Einträge
#* Spezielle Struktur unter REGGAE/REGGEA
# '''Normale Alben:''' ~800 Einträge
#* Ältere/unbekannte Releases
#* Falsche Schreibweise
----
== 8. PERFORMANCE & OPTIMIERUNG ==
=== Aktuelle Performance ===
* '''Durchsatz:''' ~20-30 Alben/Minute
* '''Pause zwischen Downloads:''' 2 Sekunden
* '''Erfolgsrate:''' 11-15% (systembedingt niedrig)
=== Optimierungsmöglichkeiten ===
# '''Parallel-Processing:''' Mehrere Worker-Threads
# '''Bessere APIs:''' MusicBrainz, Discogs
# '''Lokale Datenbank:''' Cache erfolgreicher Matches
# '''Fuzzy-Matching:''' Bessere Schreibweisen-Toleranz
----
== 9. BACKUP & RECOVERY ==
=== Wichtige Dateien sichern ===
bash
<code>''# Vollbackup''
tar -czf itunes-backup-$(date +%F).tar.gz \
    /opt/itunes-persistent/ \
    /etc/systemd/system/itunes-downloader.service
''# Queue & Skip-Cache Backup''
cp /opt/itunes-persistent/download_queue.txt ~/backup/
cp /opt/itunes-persistent/skip_artwork.txt ~/backup/</code>
=== Wiederherstellung ===
bash
<code>''# Service stoppen''
systemctl stop itunes-downloader
''# Backup einspielen''
tar -xzf itunes-backup-DATUM.tar.gz -C /
''# Service neu laden und starten''
systemctl daemon-reload
systemctl start itunes-downloader</code>
----
== 10. ZUSAMMENFASSUNG ==
Der iTunes/Last.fm Cover Downloader läuft '''stabil und zuverlässig'''. Die niedrige Erfolgsrate von 11-15% ist '''normal und erwartbar''' für diese Musik-Sammlung, da:
* Viele Bootlegs und Underground-Releases vorhanden sind
* VA-Compilations selten in APIs verfügbar sind
* Verzeichnisstrukturen teilweise problematisch sind
Der Service hat bereits '''2187 Cover in 24 Stunden''' erfolgreich heruntergeladen und wird die verbleibenden 2901 Einträge durcharbeiten. Danach kann er gestoppt oder für neue Alben reaktiviert werden.
'''Nächste Schritte nach Abschluss:'''
# Service stoppen wenn Queue leer
# Periodisch neue Queue generieren für neue Alben
# Ggf. manuelle Cover für wichtige Alben ergänzen


= Ombi Media Request System - Konfigurationsdokumentation =
= Ombi Media Request System - Konfigurationsdokumentation =
Zeile 665: Zeile 1.815:


bash
bash
  <code>cd /srv/traefik && docker compose restart traefik-nc
  <cd /srv/traefik && docker compose restart
  cd /srv/nextcloud && docker compose restart</code>
  cd /srv/nextcloud && docker compose restart</code>
'''Zertifikat erneuern (vor Oktober 2025):'''
'''Zertifikat erneuern (vor Oktober 2025):'''
Zeile 692: Zeile 1.842:
* Rate Limit-Problem durch Wildcard-Zertifikat umgangen
* Rate Limit-Problem durch Wildcard-Zertifikat umgangen
* Automatische DNS-Updates durch DuckDNS
* Automatische DNS-Updates durch DuckDNS
== '''Nextcloud Docker Update''' ==
'''Voraussetzungen'''
* Nextcloud läuft via Docker Compose unter <code>/srv/nextcloud</code>
* Traefik als Reverse Proxy unter <code>/srv/traefik</code>
* Zugriff: <nowiki>https://nc.dergagi9.duckdns.org:8444</nowiki>
'''Update-Prozedur (Beispiel: 31.0.8 → 31.0.9)'''
'''1. Version in docker-compose.yml ändern'''
<code>cd /srv/nextcloud
nano docker-compose.yml</code>
Ändere die Image-Zeile von:
<code>services:
  app:
    image: nextcloud:31</code>
auf die gewünschte Version:
<code>services:
  app:
    image: nextcloud:31.0.9</code>
'''Wichtig:'''
* Bei Minor-Updates (31.0.8 → 31.0.9): Direkt möglich
* Bei Major-Updates (30.x → 31.x): Nur ein Major-Schritt gleichzeitig!
* Nie überspringen (29.x → 31.x geht NICHT)
'''2. Optional: Datenbank-Backup'''
<code>docker exec nextcloud-db mariadb-dump -u nextcloud -p'Store2@NC#2025' nextcloud > /root/nextcloud-backup-$(date +%F).sql</code>
'''3. Update durchführen'''
<code># Neues Docker Image herunterladen
docker compose pull
# Container mit neuem Image neu starten
docker compose up -d</code>
'''4. Automatisches Upgrade abwarten''' Der Container erkennt die Versionsdifferenz automatisch und führt das Upgrade durch. Dies dauert 30-60 Sekunden. Logs beobachten mit:
<code>docker compose logs -f</code>
Warten auf die Meldung:
<code>Initializing nextcloud 31.0.9...
Upgrading nextcloud from 31.0.8...
Upgrade successful</code>
'''5. Verifikation'''
<code># Version prüfen
docker exec nextcloud-app php occ -V
# Container-Status
docker compose ps
# Web-Interface testen
curl -I <nowiki>https://nc.dergagi9.duckdns.org:8444</nowiki></code>
'''Besonderheiten der Installation'''
'''Docker-Struktur:'''
* Nextcloud App: Container <code>nextcloud-app</code>, Port 8086 intern
* Datenbank: Container <code>nextcloud-db</code> (MariaDB 10.11)
* Reverse Proxy: Traefik v3.5 auf Port 8444 (HTTPS)
* Volumes: Daten bleiben in Docker Volumes erhalten
'''Keine manuellen Schritte nötig:'''
* ❌ Kein <code>occ upgrade</code> erforderlich
* ❌ Kein Maintenance Mode nötig
* ❌ Kein Web-Updater (bei Docker deaktiviert)
* ✅ Alles läuft automatisch beim Container-Start
'''Rollback bei Problemen'''
<code># Alte Version wiederherstellen
cd /srv/nextcloud
docker compose down
# docker-compose.yml auf alte Version zurücksetzen
nano docker-compose.yml  # Version wieder auf z.B. nextcloud:31.0.8 ändern
# Container neu starten
docker compose up -d
# Optional: Datenbank aus Backup wiederherstellen
docker exec -i nextcloud-db mariadb -u nextcloud -p'Store2@NC#2025' nextcloud < /root/nextcloud-backup-DATUM.sql</code>
'''Update-Pfad für größere Sprünge''' Beispiel von Version 29 auf 31:
= Speedtest Tracker =
'''Setup-Datum:''' 04.09.2025
'''Version:''' LinuxServer.io Image
'''Status:''' Vollautomatisch, produktiv
== Installation & Zugriff ==
'''Container-Details:'''
* '''Container-Name:''' speedtest-tracker-new
* '''Image:''' lscr.io/linuxserver/speedtest-tracker:latest
* '''Port:''' 8092 (HTTP)
* '''URL:''' <nowiki>http://dergagi.changeip.org:8092</nowiki>
* '''Login:''' daniel.gareis@gmail.com / 9@8Cq%UhhWYFs%
== Konfiguration ==
'''Docker-Compose-Pfad:''' /opt/speedtest-tracker-new/docker-compose.yml
'''Finale Environment-Variablen:'''
<code>SPEEDTEST_SCHEDULE="*/10 * * * *"  # Alle 10 Minuten (Cron-Format)
SPEEDTEST_SERVERS=52770          # Verizon.com Server (944+ Mbps)
TZ=Europe/Berlin
APP_URL=<nowiki>http://dergagi.changeip.org:8092</nowiki>
DB_CONNECTION=sqlite
DISPLAY_TIMEZONE=Europe/Berlin</code>
'''Abhängige Services:'''
* '''InfluxDB:''' speedtest-influxdb-v2 (Port 8087)
* '''Datenbank:''' SQLite (primär) + InfluxDB (optional)
== Datenbank & Speicherung ==
'''SQLite-Datenbank:'''
* '''Container-Pfad:''' /config/database.sqlite
* '''Docker-Volume:''' speedtest-app-data
* '''Backup-relevant:''' Ja
'''InfluxDB (optional):'''
* '''Container:''' speedtest-influxdb-v2
* '''Port:''' 8087
* '''Login:''' admin / SpeedTest2025!
== Automatisierung ==
'''Test-Schedule:'''
* '''Intervall:''' Alle 10 Minuten
* '''Server:''' Verizon.com (ID: 52770)
* '''Geschwindigkeit:''' 944+ Mbps (typisch)
* '''Wartung:''' Keine manuelle Wartung erforderlich
'''Cron-Format Erklärung:'''
<code>*/10 * * * *
│    │ │ │ │
│    │ │ │ └── Wochentag (0-7, Sonntag = 0 oder 7)
│    │ │ └──── Monat (1-12)
│    │ └────── Tag (1-31)
│    └──────── Stunde (0-23)
└────────────── Minute (0-59, */10 = alle 10 Minuten)</code>
== Container-Management ==
'''Neustart:'''
bash
<code>cd /opt/speedtest-tracker-new
docker-compose restart speedtest-tracker</code>
'''Komplett-Neustart:'''
bash
<code>cd /opt/speedtest-tracker-new
docker-compose down
docker-compose up -d</code>
'''Status prüfen:'''
bash
<code>docker ps | grep speedtest-tracker-new</code>
'''Logs anzeigen:'''
bash
<code>docker logs speedtest-tracker-new
docker logs speedtest-tracker-new --tail 50</code>
== Konfigurationsprüfung ==
'''Environment-Variablen checken:'''
bash
<code>docker exec speedtest-tracker-new env | grep SPEEDTEST</code>
'''Container-Config anzeigen:'''
bash
<code>docker inspect speedtest-tracker-new | grep -A10 -B10 SPEEDTEST</code>
'''Service-Erreichbarkeit:'''
bash
<code>curl -s -o /dev/null -w "Status: %{http_code}" <nowiki>http://localhost:8092</nowiki></code>
== Web-Interface Funktionen ==
'''Hauptfunktionen:'''
* Automatische Tests alle 10 Minuten
* Historische Datenansicht
* Server-Auswahl und -Konfiguration
* Statistiken und Trends
* Export-Funktionen
'''Wichtige Settings:'''
* '''Default Server:''' Verizon.com (52770)
* '''Schedule:''' */10 * * * * (alle 10 Minuten)
* '''Timezone:''' Europe/Berlin
== Troubleshooting ==
'''Häufige Probleme:'''
'''1. Container startet nicht:'''
bash
<code>docker logs speedtest-tracker-new
''# Prüfe Environment-Variablen und Dependencies''</code>
'''2. Tests laufen nicht automatisch:'''
bash
<code>docker exec speedtest-tracker-new env | grep SPEEDTEST_SCHEDULE
''# Sollte zeigen: SPEEDTEST_SCHEDULE="*/10 * * * *"''</code>
'''3. Falscher Server wird verwendet:'''
bash
<code>docker exec speedtest-tracker-new env | grep SPEEDTEST_SERVERS
''# Sollte zeigen: SPEEDTEST_SERVERS=52770''</code>
'''4. Web-Interface nicht erreichbar:'''
bash
<code>curl -v <nowiki>http://localhost:8092</nowiki>
''# Prüfe Port-Mapping und Container-Status''</code>
== Backup & Wiederherstellung ==
'''Wichtige Backup-Pfade:'''
* '''Docker-Compose:''' /opt/speedtest-tracker-new/docker-compose.yml
* '''Daten-Volume:''' speedtest-app-data
* '''InfluxDB-Volume:''' influxdb-data (falls verwendet)
'''Backup erstellen:'''
bash
<code>cd /opt/speedtest-tracker-new
cp docker-compose.yml docker-compose.yml.backup-$(date +%Y%m%d-%H%M%S)
docker run --rm -v speedtest-app-data:/data -v $(pwd):/backup alpine tar czf /backup/speedtest-data-backup-$(date +%Y%m%d).tar.gz -C /data .</code>
== Server-Informationen ==
'''Verizon.com Server (52770):'''
* '''Standort:''' USA
* '''Typische Geschwindigkeit:''' 944+ Mbps Download
* '''Latenz:''' ~26ms
* '''Zuverlässigkeit:''' Hoch
* '''Grund der Auswahl:''' Beste Geschwindigkeit in Tests
== Wartung ==
'''Regelmäßige Checks:''' Keine erforderlich
'''Log-Rotation:''' Automatisch durch Docker
'''Updates:''' Bei Bedarf über docker-compose pull
'''Überwachung:''' Über Uptime Kuma integriert


= Grafana Konfiguration =
= Grafana Konfiguration =
Zeile 967: Zeile 2.365:


  /usr/local/bin/update_http.sh
  /usr/local/bin/update_http.sh
= Store2-Website Dokumentation =
== Übersicht ==
Die STORE2 Website zeigt System-Monitoring-Daten auf <nowiki>https://dergagi.changeip.org/</nowiki>
* '''Automatisches Update''': Alle 5 Stunden via Cronjob
* '''Manuelle Updates''': <code>/usr/local/bin/update_store2_website.sh</code>
== Architektur ==
=== Hauptkomponenten ===
# '''Website-Template''': <code>/var/www/html/index.template</code>
#* HTML mit Platzhaltern (z.B. <code><!--Core0_Temp--></code>)
#* Responsive Design mit blauem Theme
# '''Update-Script''': <code>/usr/local/bin/update_http.sh</code>
#* Sammelt CPU-Temps, System-Info, RAID-Status
#* Ersetzt Platzhalter im Template
#* Generiert <code>/var/www/html/index.html</code>
#* '''WICHTIG''': Keine HDD-Temperatur-Abfragen mehr (entfernt für Performance)
# '''Heatmap-Service''': Port 8020
#* '''Service''': <code>heatmap8020.service</code> (systemd)
#* '''Pfad''': <code>/opt/heatmap8020/</code>
#* '''Hauptdateien''':
#** <code>app.py</code> - FastAPI Web-Interface
#** <code>store2_heatmap.py</code> - Rendering-Engine
#* '''Static Files''': <code>/opt/heatmap8020/static/</code>
# '''HDD-Temperatur-Sammler''': <code>/usr/local/bin/dt.sh</code>
#* Liest Temperaturen von 44 HDDs
#* Output-Format: <code>/dev/sdX -> raid slot serial info temp°C</code>
# '''Heatmap-Update''': <code>/usr/local/bin/update_heatmap.sh</code>
#* Führt <code>dt.sh</code> aus und piped zu <code>store2_heatmap.py</code>
#* Generiert PNG in <code>/opt/heatmap8020/static/</code>
#* Kopiert zu <code>/var/www/html/heatmap.png</code>
# '''Master-Update-Script''': <code>/usr/local/bin/update_store2_website.sh</code>
#* Kombiniert Heatmap- und Website-Updates
#* Wird vom Cronjob aufgerufen
== Datenquellen ==
=== CPU-Temperaturen ===
* Tool: <code>sensors</code> (lm-sensors)
* 6 Kerne (Core 0-5)
* Anzeige in °C
=== System-Speicher ===
* Quelle: <code>/dev/nvme0n1p1</code>
* Anzeige: Frei/Total in GB
=== Swap ===
* Quelle: <code>free -h</code>
* Anzeige: Frei/Total in GB
=== RAID-Arrays ===
* '''Data''' (kleineres RAID): <code>/data</code> (~50TB)
* '''Data2''' (größeres RAID): <code>/data2</code> (~58TB)
* Status: clean/degraded
* Mountpoint-basierte Erkennung (reboot-sicher)
=== HDD-Temperaturen ===
* 44 Festplatten total
* Heatmap zeigt:
** Slot-Position (#01-#45)
** Temperatur mit Farbcodierung (35°C grün bis 55°C rot)
** Seriennummer, Kapazität, Hersteller
** RAID-Zugehörigkeit (data/data2)
== Service-Links ==
Die Website verlinkt auf folgende Dienste:
* '''Emby''' 🎬: Port 8096
* '''Ombi''' 📋: Port 3579
* '''Navidrome''' 🎵: Port 4533
* '''HomeBox''' 📦: Port 3100
* '''CWA''' 📚: Port 8084 (Calibre)
* '''TV''' 📺: Port 8089
* '''Wiki''' 📖: Port 8088 (MediaWiki)
== Cronjob-Konfiguration ==
bash
<code>''# Aktiver Cronjob (alle 5 Stunden zur vollen Stunde)''
0 */5 * * * /usr/local/bin/update_store2_website.sh >/dev/null 2>&1</code>
== Backup-Locations ==
* '''Vollbackup vom 17.09.2025''': <code>/root/STORE2-VOLLBACKUP-FUNKTIONIERT-20250917-195253/</code>
* '''Script-Backups''':
** <code>/usr/local/bin/update_http.sh.bak*</code>
** <code>/usr/local/bin/update_http.sh.before-hdd-removal</code>
** <code>/usr/local/bin/update_http.sh.with-all-hdds</code>
== Wichtige Pfade ==
<code>/var/www/html/index.template    # HTML-Template mit Platzhaltern
/var/www/html/index.html        # Generierte Website
/var/www/html/heatmap.png        # Aktuelle HDD-Heatmap
/usr/local/bin/update_http.sh    # Website-Update-Script
/usr/local/bin/update_heatmap.sh # Heatmap-Generator
/usr/local/bin/update_store2_website.sh # Master-Update-Script
/usr/local/bin/dt.sh            # HDD-Temperatur-Sammler
/opt/heatmap8020/                # Heatmap-Service-Verzeichnis</code>
== Manuelle Operationen ==
=== Website sofort aktualisieren ===
bash
<code>/usr/local/bin/update_store2_website.sh</code>
=== Nur Heatmap generieren ===
bash
<code>/usr/local/bin/update_heatmap.sh</code>
=== Nur Website-Daten aktualisieren (ohne Heatmap) ===
bash
<code>/usr/local/bin/update_http.sh</code>
=== Heatmap-Service neustarten ===
bash
<code>systemctl restart heatmap8020
systemctl status heatmap8020</code>
=== HDD-Temperaturen manuell prüfen ===
bash
<code>/usr/local/bin/dt.sh</code>
== Performance-Optimierungen ==
* '''Entfernte HDD-Abfragen''': Ursprünglich waren 40+ einzelne HDD-Temp-Abfragen im <code>update_http.sh</code> Script. Diese wurden komplett entfernt.
* '''Einmalige HDD-Abfrage''': HDDs werden nur noch 1x für die Heatmap abgefragt (via <code>dt.sh</code>)
* '''Update-Zeit''': Von mehreren Minuten auf ~10 Sekunden reduziert
== Fehlerbehebung ==
=== Heatmap zeigt keine Daten ===
* Prüfe ob <code>dt.sh</code> korrekte Ausgabe liefert
* Prüfe ob <code>heatmap8020.service</code> läuft
* Schaue in <code>/opt/heatmap8020/static/</code> nach generierten PNGs
=== Website zeigt alte Daten ===
* Manuell updaten: <code>/usr/local/bin/update_store2_website.sh</code>
* Browser-Cache leeren (Strg+F5)
=== Service nicht erreichbar ===
* Apache-Status prüfen: <code>systemctl status apache2</code>
* SSL-Zertifikat prüfen
* Port 443 muss offen sein
== Änderungshistorie ==
* '''17.09.2025''': Große Überarbeitung
** HDD-Temp-Abfragen aus update_http.sh entfernt
** Heatmap-Integration implementiert
** Performance drastisch verbessert
** Cronjob auf neues Master-Script umgestellt


= Store-Webseite ändern =
= Store-Webseite ändern =


Script unter
Script unter
  /usr/local/bin/update_http.sh
  /usr/local/bin/update_store2_website.sh
Definierte Inhalte unter
Definierte Inhalte unter
  /var/www/html/index.template
  /var/www/html/index.template

Aktuelle Version vom 19. Oktober 2025, 11:31 Uhr

Emby Dokumentation

Datum: 3. September 2025

Status: Native Installation, produktiv und stabil

System-Übersicht

Installation-Typ: Native Debian-Installation (kein Docker)

Version: Emby Server 4.9.1.24

Server-Name: STORE2

Zugang: http://dergagi.changeip.org:8096

Prozess: EmbyServer (PID 1684585)

Technische Details

Ausführbare Datei: /opt/emby-server/system/EmbyServer

Programmdaten: /var/lib/emby

User: emby (dedicated service user)

FFmpeg-Integration: Vollständig konfiguriert mit eigenen Binaries

  • FFmpeg: /opt/emby-server/bin/ffmpeg
  • FFprobe: /opt/emby-server/bin/ffprobe
  • FFdetect: /opt/emby-server/bin/ffdetect

Netzwerk-Konfiguration

HTTP-Port: 8096 (aktiv, funktional)

HTTPS-Port: 8920 (nicht konfiguriert)

API-Endpoint: http://127.0.0.1:8096/System/Info/Public (funktional)

Externe URL: http://dergagi.changeip.org:8096

Router-Portweiterleitung: Port 8096 → 192.168.1.102:8096

Datenbank-System

MariaDB-Instanzen: 2 aktive Prozesse

  • PID 216805: mariadbd (emby user)
  • PID 2005213: mariadbd (emby user) Datenbank-Pfad: Unter /var/lib/emby/ verwaltet

Service-Management

Service-Typ: SystemD-managed (automatischer Start)

Restart-Policy: Exit Code 3 für Updates

Update-Methode: APT-Package emby-server-deb_{version}_amd64.deb

Benutzer-Zugang

Aktive externe User: ~5 Freunde mit Remote-Zugang

Funktionalität: Streaming funktioniert stabil über Internet

Performance: Response Time <1ms lokal, stabile Verbindungen

Integration mit STORE2-Ecosystem

Monitoring: Überwacht von Uptime Kuma (Port 8096, Tag: Critical)

Backup: Enthalten in nvme-Backup-System

Netzwerk: Läuft parallel zu Apache (Port 443), keine Konflikte

Medien-Bibliothek

Content-Status: Etablierte Sammlung für 5+ aktive Remote-User

Request-System: Aktuell manuell über persönliche Nachrichten

Geplante Erweiterung: Ombi Request-System für strukturierte User-Requests

Wartung & Updates

Update-Methode: APT-basiert über offizielle Emby-Repository

Backup-Status: Vollständig in nvme-incrementelle Backups enthalten

Stabilität: Läuft seit Installation ohne größere Probleme

Calibre-Web Automated (CWA) auf STORE2

Übersicht

Service: Calibre-Web Automated (CWA)

Container: crocodilestick/calibre-web-automated:latest Version: V3.1.4 (Calibre 8.8.0)

Port: 8084 (extern) → 8083 (intern)

Zugriff (intern): http://192.168.1.102:8084

Zugriff (extern): https://dergagi.changeip.org/cwa

Bücher: 45.233 (Stand: 10.10.2025)

Speicherort: /data/ebooks (52TB RAID6)

Config: /data/ebooks-config

Docker-Konfiguration

=== docker-compose.yml === Pfad: /srv/calibre-web-automated/docker-compose.yml

services: calibre-web-automated: image: crocodilestick/calibre-web-automated:latest container_name: calibre-web-automated restart: unless-stopped environment: - PUID=1000 - PGID=1000 - TZ=Europe/Berlin ports: - "127.0.0.1:8084:8083" volumes: - /data/ebooks:/calibre-library:rw - /data/ebooks-config:/config:rw healthcheck: test: ["CMD-SHELL","python3 -c "import socket; s=socket.socket(); s.settimeout(2); s.connect(('127.0.0.1',8083)); s.close()""] interval: 15s timeout: 5s retries: 10 start_period: 120s stop_grace_period: 30s

=== Container-Verwaltung ===

Container neu starten: cd /srv/calibre-web-automated docker compose restart

Container stoppen: docker compose down

Container starten: docker compose up -d

Logs anzeigen: docker logs -f calibre-web-automated

Status prüfen: docker ps | grep calibre-web

Wichtige Pfade

E-Books: /data/ebooks (257GB, 45k Bücher) Calibre Metadata DB: /data/ebooks/metadata.db (~50MB) CWA Config: /data/ebooks-config (87GB inkl. Caches) CWA App DB: /data/ebooks-config/app.db (~5MB) CWA Main DB: /data/ebooks-config/cwa.db (~15MB) docker-compose.yml: /srv/calibre-web-automated/ Daily DB-Backups: /mnt/nvme_backup/_data_dbs/ (7 Tage Retention) Weekly Archiv-Backups: /data2/db-archive/ (4 Wochen Retention)

Backup-System (KRITISCH!)

=== Layer 1: Daily Safety Backup (NVMe) ===

Zweck: Schnelles Recovery bei CWA-Problemen oder DB-Korruption Service: daily-db-backup.service + daily-db-backup.timer Zeitplan: Täglich um 03:30 Uhr (nach OS-Backup) Ziel: /mnt/nvme_backup/_data_dbs/YYYY-MM-DD/ Retention: 7 Tage Größe: ~70MB pro Backup

Gebackupte Dateien: • calibre_metadata ← /data/ebooks/metadata.db (50MB) • calibre_prefs ← /data/ebooks/metadata_db_prefs_backup.json (16KB) • cwa_app ← /data/ebooks-config/app.db (5MB) • cwa_main ← /data/ebooks-config/cwa.db (15MB)

Backup-Methode: • SQLite-DBs: sqlite3 $src ".backup $dest" + Integrity-Check • JSON: cp -p (Timestamp-Erhalt)

Status prüfen: systemctl status daily-db-backup.timer ls -lth /mnt/nvme_backup/_data_dbs/

Manuell ausführen: systemctl start daily-db-backup.service

Logs anzeigen: cat /mnt/nvme_backup/_data_dbs/_logs/run-$(date +%Y-%m-%d)*.log

=== Layer 2: Weekly Archive Backup (RAID→RAID) ===

Zweck: Langzeit-Absicherung, tiefere Historie Service: weekly-archive-backup.service + weekly-archive-backup.timer Zeitplan: Sonntag 04:00 Uhr Ziel: /data2/db-archive/YYYY-Wxx/ Retention: 4 Wochen Größe: ~103MB pro Archiv

Zusätzlich gebackupte Dateien: • calibre_metadata_backup ← /data/ebooks/metadata.db.backup-* (Wildcard) • cwa_app_backup ← /data/ebooks-config/app.db.backup-* (Wildcard) • cwa_logs ← /data/ebooks-config/calibre-web.log* (Diagnose)

Vorteil: RAID-zu-RAID = besserer Hardware-Schutz als NVMe→HDD

Status prüfen: systemctl status weekly-archive-backup.timer ls -lth /data2/db-archive/

Manuell ausführen: systemctl start weekly-archive-backup.service

Logs anzeigen: ls -lth /data2/db-archive/_logs/ | head -3

=== DB-Restore nach Crash ===

Wenn CWA nicht startet oder DB korrupt ist:

  1. Container stoppen: docker stop calibre-web-automated
  2. Neuestes Backup finden: ls -lth /mnt/nvme_backup/_data_dbs/
  3. Backup wiederherstellen (z.B. von gestern): BACKUP_DATE=$(ls -t /mnt/nvme_backup/_data_dbs/ | grep "2025-10" | head -1) cp /data/ebooks-config/app.db /data/ebooks-config/app.db.broken-$(date +%Y%m%d-%H%M) cp /mnt/nvme_backup/_data_dbs/$BACKUP_DATE/cwa_app /data/ebooks-config/app.db chown gagi:gagi /data/ebooks-config/app.db
  4. Container starten: docker start calibre-web-automated
  5. Status prüfen: docker ps | grep calibre-web docker logs --tail 30 calibre-web-automated

Für metadata.db analog: cp /mnt/nvme_backup/_data_dbs/$BACKUP_DATE/calibre_metadata /data/ebooks/metadata.db chown gagi:gagi /data/ebooks/metadata.db

E-Mail / Send-to-Kindle (GMX)

=== SMTP-Konfiguration (Web-UI) ===

Admin → Konfiguration → SMTP-Einstellungen:

SMTP-Hostname: mail.gmx.net Port: 587 Verschlüsselung: STARTTLS SMTP-Login: dergagi@gmx.de SMTP-Passwort: App-Passwort (siehe unten!) Absenderadresse: dergagi@gmx.de

=== GMX App-Passwort erstellen (KRITISCH!) ===

Seit 2024 akzeptiert GMX keine normalen Passwörter mehr für SMTP!

Schritte:

  1. Login auf https://www.gmx.de
  2. Klicke oben rechts auf Initialen → "Account verwalten" (oder direkt: https://www.gmx.net/mein-account/)
  3. Menü links: Sicherheit → Anwendungsspezifische Passwörter
  4. "Neues Passwort erstellen"
  5. Name: CWA-STORE2 (oder beliebig)
  6. Passwort wird angezeigt (Format: xxxx xxxx xxxx xxxx)
  7. SOFORT NOTIEREN - wird nur 1x angezeigt!
  8. In CWA eingeben (ohne Leerzeichen: xxxxxxxxxxxxxxxx)

POP3/IMAP Zugriff aktivieren:

  1. GMX → Einstellungen → E-Mail → POP3 & IMAP
  2. Haken setzen: "E-Mails über externes Programm senden und empfangen"
  3. Speichern

Nach Änderungen immer Container neu starten: docker restart calibre-web-automated

=== Amazon Kindle Setup ===

Damit Amazon E-Books von GMX akzeptiert:

  1. Login auf https://www.amazon.de/mycd
  2. Einstellungen → Persönliche Dokumente
  3. "Genehmigte Absender-E-Mail-Adressen" → "E-Mail-Adresse hinzufügen"
  4. Eintragen: dergagi@gmx.de
  5. Bestätigen

Send-to-Kindle E-Mail-Adresse ermitteln: • Amazon → Content & Devices → Tab "Geräte" • Gerät auswählen → "E-Mail-Adresse" (z.B. gagi_main@kindle.com)

Unterstützte Formate für Kindle: • .mobi (optimal für ältere Kindles) • .azw3 (moderner, beste Formatierung) • .epub (wird automatisch konvertiert) • .pdf (funktioniert, oft schlechte Lesbarkeit)

Send-to-Kindle in CWA:

  1. E-Book auswählen
  2. "Send to Kindle" (oder ✉️ Symbol)
  3. Kindle-Adresse eingeben (z.B. gagi_main@kindle.com)
  4. Senden

Troubleshooting: • Test-Mail an eigene Adresse senden (in CWA: Admin → Config → "Test-E-Mail") • GMX App-Passwort-Status prüfen: GMX → Mein Account → Sicherheit → App-Passwörter (zeigt "Letzte Nutzung") • Falls Test-Mail nicht ankommt: Container restart, dann erneut testen

Automatisierung

=== SystemD Timer ===

cwa-health.timer (jede Minute): • Überwacht Container-Status • Startet CWA bei Absturz automatisch neu • Service: /etc/systemd/system/cwa-health.timer • Script: /usr/local/bin/cwa-health.sh

Status prüfen: systemctl status cwa-health.timer

=== Cron-Jobs (root) ===

cwa-smart-import-v2.sh (alle 6 Stunden: 00:15, 06:15, 12:15, 18:15): • Scannt /data/ebooks nach neuen EPUBs • Importiert automatisch via calibredb add • Log: /var/log/cwa-import.log

Befehle: crontab -l | grep cwa tail -f /var/log/cwa-import.log

=== Geplante Aufgaben (CWA Web-UI) ===

Admin → Geplante Aufgaben (täglich 06:00 Uhr): ✓ Buchcover Miniaturansichten erzeugen ✓ Mit Calibre Bibliothek neu verbinden ✓ Metadaten Backup Datei erzeugen

Hinweis: Diese erstellen nur lokale Backups (/data/ebooks/metadata.db.backup-*), NICHT die Off-Site-Backups auf NVMe/RAID2!

E-Books hinzufügen

=== Methode 1: Automatischer Import (empfohlen für <100 Bücher) ===

Neue EPUBs nach /data/ebooks/ kopieren: cp ~/neue-buecher/*.epub /data/ebooks/

Import erfolgt automatisch alle 6h, oder manuell: /usr/local/bin/cwa-smart-import-v2.sh

=== Methode 2: Web-Upload (für einzelne Bücher) ===

  1. https://dergagi.changeip.org/cwa öffnen
  2. "Upload" Button → Dateien auswählen
  3. CWA importiert automatisch

=== Methode 3: Calibre Desktop (für große Mengen >500 Bücher) ===

⚠️ KRITISCH: Container MUSS gestoppt sein!

  1. Container stoppen: docker stop calibre-web-automated
  2. Calibre Desktop öffnen (GUI) Bibliothek: /data/ebooks Bücher hinzufügen mit Duplikat-Merge
  3. Nach Import: Container starten: docker start calibre-web-automated

NIEMALS Container UND Calibre Desktop gleichzeitig laufen lassen! → SQLite-DB kann nur von EINEM Prozess beschrieben werden → Führt zu "Database is locked" Fehlern und DB-Korruption

Aktive Features

=== CWA-Services (Container-intern) === ✓ Auto-Convert (EPUB als Standard) ✓ Automatic Cover & Metadata Enforcement ✓ Kindle EPUB Fixer ✓ Import Auto-Backup

=== Web-UI Einstellungen === ✓ Hochladen aktiviert ✓ Update-Benachrichtigungen ✓ GMX Mail-Server konfiguriert (Send-to-Kindle)

Wartung

=== Buchanzahl prüfen ===

sqlite3 /data/ebooks/metadata.db "SELECT COUNT(*) FROM books;"

=== Logs anzeigen ===

Container-Logs: docker logs -f calibre-web-automated

Import-Logs: tail -f /var/log/cwa-import.log

Health-Check Logs: journalctl -u cwa-health.service -f

DB-Backup Logs: tail -f /mnt/nvme_backup/_data_dbs/_logs/run-.log tail -f /data2/db-archive/_logs/run-.log

=== Performance-Monitoring ===

Live-Monitor während Import: watch -n 2 'echo "=== CWA STATUS ===";

echo "Bücher in DB: $(sqlite3 /data/ebooks/metadata.db "SELECT COUNT(*) FROM books;")";

echo "Container: $(docker ps --filter name=calibre-web-automated --format "{{.Status}}")"; 
echo "Healthcheck: $(docker inspect calibre-web-automated --format="{{.State.Health.Status}}")"'

Fehlerbehebung

=== Container startet nicht ===

Logs prüfen: docker logs calibre-web-automated

Container force-restart: docker stop calibre-web-automated docker rm calibre-web-automated

Neu erstellen: cd /srv/calibre-web-automated docker compose up -d

=== CWA zeigt falsche Buchanzahl ===

Im Browser: Admin → "Mit Calibre Bibliothek neu verbinden"

Oder per CLI: curl -X POST http://127.0.0.1:8084/admin/reconnect

=== "Database is locked" Fehler ===

Ursache: Calibre Desktop läuft parallel zum Container

Container stoppen: docker stop calibre-web-automated

Calibre Desktop schließen: pkill -f calibre

Container neu starten: docker start calibre-web-automated

=== Unvollständige Einträge / Fehlende Cover ===

Admin → Geplante Aufgaben → "Metadaten Backup" manuell starten

=== SMTP/Mail funktioniert nicht ===

  1. Test-Mail in CWA senden: Admin → Konfiguration → "Test-E-Mail versenden"
  2. Live-Logs beobachten: docker logs -f calibre-web-automated | grep -iE '(mail|smtp|auth)'
  3. GMX App-Passwort-Status prüfen: GMX → Mein Account → Sicherheit → App-Passwörter Sollte "Letzte Nutzung: vor X Minuten" zeigen
  4. Direkt-Test (bypass CWA): echo "Test" | curl --ssl --url "smtp://mail.gmx.net:587" --user "dergagi@gmx.de:APP_PASSWORT_HIER" --mail-from "dergagi@gmx.de" --mail-rcpt "dergagi@gmx.de" --upload-file - -v
  5. Container restart: docker restart calibre-web-automated

Häufige Probleme: • Port 465 statt 587: GMX bevorzugt Port 587 mit STARTTLS • Normales Passwort statt App-Passwort: Seit 2024 Pflicht! • POP3/IMAP nicht aktiviert: Muss in GMX-Einstellungen enabled sein • Container nicht neu gestartet: Nach Config-Änderungen immer docker restart

Apache Reverse Proxy

CWA ist über Apache unter /cwa erreichbar:

VirtualHosts: • 000-catchall-443.conf • 000-website-dergagi-443.conf

ProxyPass-Regel: ProxyPass /cwa http://127.0.0.1:8084 ProxyPassReverse /cwa http://127.0.0.1:8084

Externe URL: https://dergagi.changeip.org/cwa

Apache neu laden nach Config-Änderungen: apache2ctl configtest && systemctl restart apache2

Bekannte Einschränkungen

=== Format-Duplikate === • CWA zeigt jedes Format (epub/mobi/pdf) als separaten Eintrag • Keine Gruppierungsfunktion verfügbar • Workaround: Nur ein Format pro Buch hochladen (bevorzugt EPUB)

=== Import-Geschwindigkeit === • Auto-Ingest: ~10-15 Bücher/Minute • Calibre Desktop Bulk-Import: ~200-300 Bücher/Minute • Große Imports (>500 Bücher): Besser via Calibre Desktop

=== Tiefe Ordnerstrukturen === • Werden erkannt, aber langsam verarbeitet • Besser: Flache Struktur /Autor/Buchtitel/

Wichtige Hinweise

⚠️ NIE Container UND Calibre Desktop gleichzeitig laufen lassen! → SQLite-DB kann nur von EINEM Prozess beschrieben werden

⚠️ Große Imports immer via Calibre Desktop: → Container stoppen, Import durchführen, Container starten

⚠️ Backups vor großen Änderungen: cp /data/ebooks/metadata.db /data/ebooks/metadata.db.backup-$(date +%Y%m%d) cp /data/ebooks-config/app.db /data/ebooks-config/app.db.backup-$(date +%Y%m%d)

⚠️ System-Backups laufen automatisch: • OS-Backup: Täglich 03:08 Uhr (nvme-backup.timer) • DB-Backup: Täglich 03:30 Uhr (daily-db-backup.timer) • Archiv-Backup: Sonntags 04:00 Uhr (weekly-archive-backup.timer)

Statistiken

Stand: 19. Oktober 2025

Bücher in Bibliothek: 45.233 Speicherplatz /data: 257GB Speicherplatz Config: 87GB (Caches) metadata.db Größe: ~50MB app.db Größe: ~5MB Container Uptime: 8+ Tage Letzter Import: 10.10.2025 (Torboox-Massive)

Letzte Aktualisierung: 19. Oktober 2025 Version: 3.0 (Post-GMX-SMTP-Fix)

MediaWiki - Aktuelle Konfiguration & Dokumentation

Stand: 11. Oktober 2025, 14:30 Uhr

Status: Produktiv, vollständig funktional nach Login-Fix und Cookie-Konfiguration


🎯 System-Übersicht

Grundkonfiguration

  • MediaWiki Version: 1.44.0
  • Haupt-URL (HTTPS): https://dergagi.changeip.org/w/
  • Direkt-URL (HTTP): http://dergagi.changeip.org:8088/
  • Betriebssystem: Debian 13 (STORE2)
  • Container-System: Docker + Docker-Compose
  • Installation-Pfad: /srv/mediawiki-clean-final/

Admin-Zugang


🐳 Docker-Setup

Container-Konfiguration

bash

# Container-Namen
mw-clean-final        # MediaWiki-Anwendung
mw-clean-final-db     # MariaDB-Datenbank

# Management-Befehle
cd /srv/mediawiki-clean-final/
docker-compose up -d        # Start
docker-compose down         # Stop
docker-compose restart      # Neustart
docker ps | grep mw-clean   # Status
docker logs mw-clean-final  # Logs

Port-Mapping

  • MediaWiki: Container:80 → Host:8088
  • Datenbank: Container:3306 (intern, nicht exposed)

Netzwerk-Architektur

  • HTTPS (Port 443): Apache Reverse Proxy → https://dergagi.changeip.org/w/
  • HTTP (Port 8088): Direkter Container-Zugang → http://dergagi.changeip.org:8088/
  • Apache ProxyPass: /w/ → http://127.0.0.1:8088/

💾 Datenbank-Konfiguration

MariaDB-Credentials

  • DB-Host: database (Container-Name)
  • DB-Name: mediawiki
  • DB-User: mwuser
  • DB-Passwort: CleanFinalMW2025!
  • DB-Root-User: root
  • DB-Root-Passwort: CleanFinalRoot2025!

Datenbank-Zugriff

bash

# Direkte Datenbank-Verbindung
docker exec -it mw-clean-final-db mysql -u mwuser -p'CleanFinalMW2025!' mediawiki

# Root-Zugriff
docker exec -it mw-clean-final-db mysql -u root -p'CleanFinalRoot2025!' mediawiki

⚙️ MediaWiki-Konfiguration

LocalSettings.php (Zentrale Einstellungen)

  • Container-Pfad: /var/www/html/LocalSettings.php
  • Host-Backup: /srv/mediawiki-clean-final/LocalSettings.php

Wichtige Konfigurationswerte

php

$wgSitename = "Store2 Wiki";
$wgServer = "https://dergagi.changeip.org";  # HTTPS via Reverse Proxy
$wgScriptPath = "/w";
$wgLanguageCode = "de";
$wgDefaultSkin = "vector";
$wgEnableUploads = true;
$wgLogos = [
    '1x' => "$wgResourceBasePath/images/logo.png",
    'icon' => "$wgResourceBasePath/images/logo.png",
];

# === KRITISCHE COOKIE-KONFIGURATION (11.10.2025) ===
$wgCookieSecure = false;        # MUSS false sein bei HTTPS-Proxy!
$wgForceHTTPS = false;
$wgCookieHttpOnly = true;
$wgCookiePath = "/w/";
$wgCookieDomain = "";           # Leer = Same-Domain
$wgCookieSameSite = false;

# === SESSION-KONFIGURATION ===
$wgSessionCacheType = CACHE_DB;
$wgSessionsInObjectCache = true;
$wgObjectCacheSessionExpiry = 86400;

# === CACHE-DEAKTIVIERUNG (für stabiles Editieren) ===
$wgEnableParserCache = false;   # Verhindert "Versions-ID"-Fehler
$wgCachePages = false;

# === USER PERMISSIONS ===
# Nur registrierte User können editieren
$wgGroupPermissions['*']['edit'] = false;
$wgGroupPermissions['*']['createpage'] = false;
$wgGroupPermissions['*']['createaccount'] = false;  # Nur Admin kann Accounts erstellen

# Suppress MediaWiki 1.44 core deprecation warnings
error_reporting( E_ALL & ~E_USER_DEPRECATED & ~E_DEPRECATED );

Logo-Integration

  • Logo-Datei: /var/www/html/images/logo.png (im Container)
  • Original-Logo: /data/Downloads/Fertig/Mediawiki_Store2_Logo.png
  • Skalierung: 160x160px (optimiert für MediaWiki)
  • Dateigröße: ~10KB (von ursprünglich 1.1MB)
  • Status: Store2-Logo mit rotem Rahmen und Stern sichtbar

🔐 Sicherheit & Benutzerrechte

Berechtigungsmodell

  • Jeder kann lesen (keine Authentifizierung erforderlich)
  • Nur registrierte User können editieren
  • Nur Admin kann neue Accounts erstellen
  • Login funktioniert (Cookie-Problem gelöst am 11.10.2025)

Neue User anlegen

Option A: Über Web-UI (EMPFOHLEN)

  1. Als Admin einloggen: https://dergagi.changeip.org/w/
  2. Zu Spezial-Seite: https://dergagi.changeip.org/w/index.php?title=Spezial:CreateAccount
  3. Benutzername, Passwort, E-Mail eingeben
  4. "Benutzerkonto erstellen" klicken

Option B: Via Command-Line

bash

# Normaler User
docker exec mw-clean-final php /var/www/html/maintenance/createAndPromote.php \
  --force \
  username \
  'Password123!'

# Admin-User (mit Sysop + Bureaucrat Rechten)
docker exec mw-clean-final php /var/www/html/maintenance/createAndPromote.php \
  --force \
  --bureaucrat \
  --sysop \
  adminuser \
  'AdminPass123!'

🌐 Browser-Zugang & Troubleshooting

Zugang in neuen Browsern einrichten

Für JEDEN neuen Browser (Chrome, Opera, Firefox auf anderem PC):

  1. Browser öffnen
  2. Zu MediaWiki gehen: https://dergagi.changeip.org/w/
  3. Cache-Bypass: Strg + F5 (Windows) oder Strg + Shift + R (Linux)
  4. Login-Seite: https://dergagi.changeip.org/w/index.php?title=Spezial:Anmelden
  5. Login: admin / CleanFinalMW2025!

Login funktioniert nicht?

Cookies löschen:

  • Chrome/Opera: F12 → Tab "Application" → Links "Cookies" → https://dergagi.changeip.org → Alle löschen
  • Firefox: F12 → Tab "Speicher" → "Cookies" → https://dergagi.changeip.org → Rechtsklick "Alle löschen"
  • Inkognito-Fenster verwenden (sauberster Test)

"Versions-ID stimmen nicht überein" Fehler

Bereits behoben durch:

php

$wgEnableParserCache = false;
$wgCachePages = false;

Falls der Fehler dennoch auftritt:

bash

# Cache-Rebuild
docker exec mw-clean-final php /var/www/html/maintenance/rebuildrecentchanges.php

📊 Daten-Inhalt

Wiki-Seiten (12+ Hauptseiten)

  • Hauptseite (mit Kachel-Layout)
  • Store_2.0 (umfangreiche System-Dokumentation)
  • RAID-Systeme (Raid, Raid-Layout)
  • Linux-Verwendung (Linux-use)
  • Change-Routen (System-Migration)
  • Webservices & Subversion
  • Wiki-Bearbeitung (Wiki-Edit)
  • Container-Wiederherstellung-Dokumentation

Statistik

  • Seiten: 12+ importiert
  • Revisionen: 1059+ (aus 2010er Backup + neue Inhalte)
  • Datenquelle: XML-Backup von Original-Store2-System + laufende Updates

💾 Backup-System

Aktuelle Backups

bash

# Perfektes Aktuell-Backup mit Logo (94MB) - 03.09.2025
/root/mediawiki-perfect-with-logo-20250903-152727/
├── mediawiki-perfect-152727.sql  (47MB - SQL mit aktuellen Daten)
├── mw-database-perfect.tar.gz    (33MB - Docker-Volume)
├── mw-images-with-logo.tar.gz    (14MB - Images + Store2-Logo)
├── LocalSettings-perfect.php     (4.7KB - Konfiguration)
└── mediawiki-setup/              (Docker-Compose)

# Cookie-Fix-Backups (11.10.2025)
/var/www/html/LocalSettings.php.BEFORE-FINAL-FIX  # Vor Cookie-Fix
/var/www/html/LocalSettings.php.backup-*          # Verschiedene Versionen

Backup-Kommando (Aktuell)

bash

# Manuelles Backup erstellen
TS=$(date +%Y%m%d-%H%M%S)
mkdir -p /root/mediawiki-backup-$TS

# SQL-Dump
docker exec mw-clean-final-db mysqldump -u mwuser -pCleanFinalMW2025! mediawiki > /root/mediawiki-backup-$TS/mediawiki-$TS.sql

# LocalSettings.php
docker cp mw-clean-final:/var/www/html/LocalSettings.php /root/mediawiki-backup-$TS/

# Docker-Volumes
docker run --rm -v mediawiki-clean-final_mw-database:/data alpine tar czf - -C /data . > /root/mediawiki-backup-$TS/mw-database.tar.gz
docker run --rm -v mediawiki-clean-final_mw-images:/data alpine tar czf - -C /data . > /root/mediawiki-backup-$TS/mw-images.tar.gz

echo "Backup erstellt in: /root/mediawiki-backup-$TS"

Restore-Prozedur

bash

# Restore aus Backup
cd /root/mediawiki-backup-TIMESTAMP/
docker-compose -f /srv/mediawiki-clean-final/docker-compose.yml down
docker volume rm mediawiki-clean-final_mw-database mediawiki-clean-final_mw-images
docker-compose -f /srv/mediawiki-clean-final/docker-compose.yml up -d

# Volumes wiederherstellen
gunzip < mw-database.tar.gz | docker run -i --rm -v mediawiki-clean-final_mw-database:/data alpine tar xzf - -C /data
gunzip < mw-images.tar.gz | docker run -i --rm -v mediawiki-clean-final_mw-images:/data alpine tar xzf - -C /data

# LocalSettings.php
docker cp LocalSettings.php mw-clean-final:/var/www/html/LocalSettings.php

# Container neustarten
docker-compose -f /srv/mediawiki-clean-final/docker-compose.yml restart

🔧 Wartung & Maintenance

MediaWiki-Maintenance-Scripts

bash

# Update-Script (nach MediaWiki-Upgrade)
docker exec mw-clean-final php /var/www/html/maintenance/update.php

# Cache-Rebuild
docker exec mw-clean-final php /var/www/html/maintenance/rebuildrecentchanges.php

# Site-Statistiken aktualisieren
docker exec mw-clean-final php /var/www/html/maintenance/initSiteStats.php

# Admin-Passwort ändern
docker exec mw-clean-final php /var/www/html/maintenance/changePassword.php \
  --user=admin \
  --password='NeuesPasswort123!'

Monitoring

bash

# Container-Status
docker ps | grep mw-clean

# Logs live verfolgen
docker logs -f mw-clean-final

# Apache-Logs (im Container)
docker exec mw-clean-final tail -f /var/log/apache2/error.log

# Port-Check
ss -tlnp | grep :8088

🔍 Integration in STORE2-System

Apache Reverse Proxy Konfiguration

VirtualHost-Dateien:

  • /etc/apache2/sites-enabled/000-catchall-443.conf
  • /etc/apache2/sites-enabled/000-website-dergagi-443.conf

ProxyPass-Regel (in beiden VirtualHosts):

apache

<Location /w/>
  ProxyPass http://127.0.0.1:8088/
  ProxyPassReverse http://127.0.0.1:8088/
  RequestHeader set X-Forwarded-Proto "https"
  RequestHeader set X-Forwarded-Host "dergagi.changeip.org"
  RequestHeader set X-Forwarded-Port "443"
</Location>

Netzwerk-Architektur

  • Läuft parallel zu Apache (Port 443)
  • Keine BasicAuth-Konflikte
  • Direkter Port-Zugang (8088) UND Proxy-Zugang (443) verfügbar
  • Unabhängig von /data2-Mount (läuft auf Haupt-Partition)

Docker-Volumes

bash

# Volume-Namen
mediawiki-clean-final_mw-database  # MariaDB-Daten
mediawiki-clean-final_mw-images    # MediaWiki-Uploads + Store2-Logo

# Volume-Pfade
/var/lib/docker/volumes/mediawiki-clean-final_mw-database/_data
/var/lib/docker/volumes/mediawiki-clean-final_mw-images/_data

📝 Änderungshistorie & Lessons Learned

Container-Wiederherstellung (03.09.2025)

  • Problem: Versehentliches docker container prune -f löschte alle Container
  • Lösung: Vollständige Wiederherstellung aus nvme-Backup
  • Status: Erfolgreich mit allen Daten wiederhergestellt

Login-Problem gelöst (11.10.2025)

  • Problem: Login funktionierte nicht (Cookie wurde nicht erkannt)
  • Root Cause: $wgCookieSecure = true bei HTTPS-Proxy-Setup
  • Lösung: $wgCookieSecure = false + $wgForceHTTPS = false
  • Status: ✅ Login funktioniert jetzt in allen Browsern

Edit-Token-Problem gelöst (11.10.2025)

  • Problem: "Versions-IDs stimmen nicht überein" bei wiederholtem Editieren
  • Root Cause: Parser-Cache verursachte Token-Mismatch
  • Lösung: $wgEnableParserCache = false + $wgCachePages = false
  • Status: ✅ Mehrfaches Editieren ohne Fehler möglich

Wichtige Erkenntnisse

  1. Cookie-Konfiguration bei HTTPS-Proxy: $wgCookieSecure = false ist KRITISCH
  2. Cache-Probleme: Bei Edit-Token-Problemen Cache deaktivieren
  3. Browser-Cache: Neue Browser benötigen Cache-Bypass (Strg+F5)
  4. Backup-Kritikalität: nvme-Backup war entscheidend für Wiederherstellung
  5. Systematische Reparatur: Immer Backup vor Systemänderungen

🎯 Quick Reference

Häufige Aufgaben

bash

# Container neu starten
cd /srv/mediawiki-clean-final/ && docker-compose restart

# LocalSettings.php bearbeiten
docker exec -it mw-clean-final nano /var/www/html/LocalSettings.php

# Logs live anzeigen
docker logs -f mw-clean-final

# Backup erstellen (siehe Backup-Kommando oben)

# User anlegen
docker exec mw-clean-final php /var/www/html/maintenance/createAndPromote.php --force username 'password'

Wichtige URLs


MediaWiki Store2 ist vollständig eingerichtet, produktiv, backup-gesichert und mit funktionierendem Login.

IMMICH PHOTO MANAGEMENT - KOMPLETTE DOKUMENTATION

Übersicht

Immich ist eine selbst-gehostete Photo Management Lösung für STORE2. Läuft als Docker-Stack mit eigenem PostgreSQL und Redis.


Zugriff

  • Web-UI: https://photos.dergagi.changeip.org
  • Mobil-Apps:
    • iOS: https://apps.apple.com/app/immich/id1613945652
    • Android: https://play.google.com/store/apps/details?id=app.alextran.immich
  • Admin-Login: Dein registrierter Account
  • Version: v2.0.1 (Docker release tag)

Docker-Stack

Pfad: /srv/immich/

Container:

immich-server     → Port 127.0.0.1:3002 (nur lokal)
immich-ml         → Machine Learning (Gesichtserkennung)
immich-postgres   → PostgreSQL mit pgvecto-rs
immich-redis      → Cache

docker-compose.yml: /srv/immich/docker-compose.yml

Wichtige Befehle:

bash

cd /srv/immich

# Status
docker compose ps

# Logs
docker compose logs -f immich-server

# Neustart
docker compose restart

# Update (neue Version)
docker compose pull
docker compose up -d

Datenbank

  • Engine: PostgreSQL 16 mit pgvecto-rs Extension
  • User: immich
  • Passwort: YVQkopY9HH4immich2025secure
  • Datenbank: immich
  • Data Directory: /srv/immich/pgdata/

Backup erstellen:

bash

docker compose exec immich-postgres pg_dump -U immich immich > /root/immich-backup-$(date +%Y%m%d).sql

Storage-Struktur

Immich-eigene Daten (/data2/immich/):

/data2/immich/library/         → Hochgeladene Fotos (via App/WebUI)
/data2/immich/upload/          → Temp-Uploads
/data2/immich/thumbs/          → Miniaturansichten (generiert)
/data2/immich/profile/         → Profilbilder
/data2/immich/encoded-video/   → Transkodierte Videos
/data2/immich/backups/         → Datenbank-Backups
/data2/immich/model-cache/     → ML-Modelle

Read-Only External Libraries (bestehende Daten):

/data2/Daniel/Fotos                    → gemountet als /mnt/media/fotos
/data2/Save/00 - Race Drone/Videos     → gemountet als /mnt/media/fpv-videos

Marker-Files: Alle Verzeichnisse enthalten .immich Marker-Dateien (sonst crasht Container)


Apache Reverse Proxy

VirtualHost: /etc/apache2/sites-enabled/photos-dergagi-443.conf

Konfiguration:

apache

<VirtualHost *:443>
  ServerName photos.dergagi.changeip.org
  
  # KRITISCH: Expliziter DocumentRoot (sonst wird /var/www/html vererbt!)
  DocumentRoot /var/www/photos-immich-empty
  <Directory /var/www/photos-immich-empty>
    Require all denied
  </Directory>

  # SSL
  SSLEngine on
  SSLCertificateFile /etc/letsencrypt/live/dergagi.changeip.org/fullchain.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/dergagi.changeip.org/privkey.pem

  # Reverse Proxy
  ProxyRequests Off
  ProxyPreserveHost On
  RequestHeader set X-Real-IP %{REMOTE_ADDR}s
  RequestHeader set X-Forwarded-For %{REMOTE_ADDR}s
  RequestHeader set X-Forwarded-Proto https

  # WebSocket + Proxy
  ProxyPass / http://127.0.0.1:3002/ timeout=600 upgrade=websocket
  ProxyPassReverse / http://127.0.0.1:3002/

  # Large File Uploads
  LimitRequestBody 0

  # Logs
  ErrorLog ${APACHE_LOG_DIR}/immich-error.log
  CustomLog ${APACHE_LOG_DIR}/immich-access.log combined
</VirtualHost>

Logs:

  • Error: /var/log/apache2/immich-error.log
  • Access: /var/log/apache2/immich-access.log

SSL-Zertifikat

Shared Zertifikat: /etc/letsencrypt/live/dergagi.changeip.org/

Domains im Zertifikat:

  • dergagi.changeip.org
  • photos.dergagi.changeip.org

Gültig bis: 09.01.2026

Renewal:

bash

certbot renew --dry-run  # Test
certbot renew            # Echt

External Libraries (Read-Only)

Fotos Daniel:

  • Immich-Name: Fotos Daniel
  • Mount: /mnt/media/fotos
  • Host-Pfad: /data2/Daniel/Fotos
  • Scan: Manuell via WebUI (Administration → External Libraries → Scan)

FPV Videos:

  • Immich-Name: FPV Videos
  • Mount: /mnt/media/fpv-videos
  • Host-Pfad: /data2/Save/00 - Race Drone/Videos
  • Scan: Manuell via WebUI

WICHTIG: Video Transcoding ist deaktiviert (wegen Read-Only!)


Wichtige Einstellungen

Video Transcoding:

  • Status: DEAKTIVIERT
  • Grund: Read-Only Volumes können nicht transkodiert werden
  • Einstellung: Administration → Video Transcoding → "Videos nicht transkodieren"
  • Akzeptierte Codecs: Nur H.264

Machine Learning:

  • Gesichtserkennung: Optional aktivierbar
  • Objekterkennung: Läuft automatisch
  • Models: In /data2/immich/model-cache/

Backup & Restore

Backup erstellen:

bash

# Datenbank
cd /srv/immich
docker compose exec immich-postgres pg_dump -U immich immich > /root/immich-db-backup-$(date +%Y%m%d).sql

# Docker Compose Config
cp docker-compose.yml /root/immich-compose-backup-$(date +%Y%m%d).yml

# Upload-Daten (optional, große Datenmenge!)
tar -czf /root/immich-uploads-backup-$(date +%Y%m%d).tar.gz /data2/immich/library/

Restore:

bash

cd /srv/immich

# 1. Container stoppen
docker compose down

# 2. DB wiederherstellen
docker compose up -d immich-postgres
docker compose exec -T immich-postgres psql -U immich immich < /root/immich-db-backup-DATUM.sql

# 3. Alle Container starten
docker compose up -d

Troubleshooting

Container crasht:

bash

# Logs prüfen
docker compose logs immich-server

# Häufige Ursachen:
# - Fehlende .immich Marker-Files
# - Falsche DB-Credentials
# - Port 3002 bereits belegt

API liefert HTML statt JSON:

bash

# Backend direkt testen
curl http://127.0.0.1:3002/api/server/config

# Apache Proxy testen
curl -k https://photos.dergagi.changeip.org/api/server/config

# Ursache: Globale conf-enabled Regeln (z.B. ProxyPass /api)
# Lösung: conf-enabled Dateien deaktivieren, ProxyPass nur in VHost

502 Bad Gateway:

bash

# Container läuft?
docker compose ps

# Backend erreichbar?
ss -tlnp | grep 3002

# Apache Logs
tail -f /var/log/apache2/immich-error.log

KRITISCHE ERKENNTNISSE (Lessons Learned)

1. Immich benötigt SUBDOMAIN (keine Subpaths)

FALSCH: https://dergagi.changeip.org/immich/

RICHTIG: https://photos.dergagi.changeip.org/

Immich ist eine SPA (Single Page Application) und unterstützt keine Subpaths.

2. VirtualHost braucht expliziten DocumentRoot

Ohne expliziten DocumentRoot erbt der VHost /var/www/html und liefert die STORE2 index.html statt zu proxyen.

Lösung:

apache

DocumentRoot /var/www/photos-immich-empty
<Directory /var/www/photos-immich-empty>
  Require all denied
</Directory>

3. NIEMALS globale ProxyPass /api in conf-enabled

Die globale /etc/apache2/conf-enabled/homebox-proxy-clean.conf hatte:

apache

ProxyPass /api http://127.0.0.1:3100/api

Diese Regel gilt für ALLE VirtualHosts und fing alle Immich /api Requests ab!

Regel: ProxyPass IMMER in VirtualHost-Blöcken definieren, NIE in conf-enabled (außer wirklich global gewollt).

4. Container brauchen .immich Marker-Files

Immich prüft beim Start, ob in allen Volume-Verzeichnissen .immich Dateien existieren. Ohne diese crasht der Container.

Fix:

bash

touch /data2/immich/library/.immich
touch /data2/immich/upload/.immich
# ... etc für alle Verzeichnisse

5. DB-Passwörter: Keine Sonderzeichen in Docker

Docker Compose hat Probleme mit Sonderzeichen ($, !, etc.) in Passwörtern.

Empfehlung: Nur A-Za-z0-9 verwenden (laut Immich-Doku).


Maintenance

Updates:

bash

cd /srv/immich
docker compose pull
docker compose up -d

Speicherplatz prüfen:

bash

# Thumbnails Größe
du -sh /data2/immich/thumbs/

# Uploads Größe
du -sh /data2/immich/library/

# Gesamt
du -sh /data2/immich/

Logs rotieren:

bash

# Apache Logs
logrotate -f /etc/logrotate.d/apache2

# Docker Logs (automatisch via Docker-Daemon)

Performance

Aktueller Status:

  • CPU: 12 Cores (Auto-detected)
  • RAM: ~2-4 GB (Docker Container)
  • Storage: 53.5 TiB verwendet von 57.1 TiB (93%)

Optimierungen:

  • Machine Learning kann CPU-lastig sein
  • Hardware-Beschleunigung möglich (siehe hwaccel.yml)
  • Thumbnails werden on-demand generiert

Security Checklist

  • ✅ SSL/TLS aktiviert (Let's Encrypt)
  • ✅ Port 3002 nur lokal (127.0.0.1)
  • ✅ DB-Passwort geändert (nicht mehr Default)
  • ✅ Read-Only Mounts für bestehende Daten
  • ✅ Apache Header (X-Real-IP, X-Forwarded-Proto)
  • ⚠️ BasicAuth möglich (optional für zusätzliche Sicherheit)

Support & Dokumentation

  • Offizielle Docs: https://immich.app/docs/
  • GitHub: https://github.com/immich-app/immich
  • Discord: https://discord.gg/immich
  • Environment Variables: https://immich.app/docs/install/environment-variables/

Status: ✅ PRODUKTIV SEIT 12.10.2025

Nächster Check: Speicherplatz-Monitor bei ~95% (ca. 1 TiB frei)

Koel Musikstreaming-Server

📍 Installation erfolgreich abgeschlossen

Server: STORE2

URL: http://dergagi.changeip.org:6680

Status: ✅ Voll funktionsfähig


🔑 Zugangsdaten

Admin-Account:

  • Email: daniel.gareis@gmail.com
  • Passwort: #s46@jCuFEq5S^

Datenbank:

  • DB-Root: KoelRootStore2!
  • DB-User: koel / KoelStore2Music2025!

🎵 Musik-Archiv

Verzeichnisse:

  • Hauptordner: /data2/mp3/mp3 (92.980 MP3-Dateien)
  • Symlinks: 38.046 Links in /data2/mp3/mp3/00_Unique_From_Other_Folders
  • Weitere: 7.778 MP3s in /data2/mp3/mp3s von MB/
  • Cover: 7.015 Cover-Dateien im Archiv, werden bei Koel aber nicht genutzt, sondern on-the-fly online hergeholt und auch nicht lokal gespeichert

Scan-Status:

  • Läuft gerade im Hintergrund (2-3 Stunden für alle Dateien)
  • Songs erscheinen live im Web-Interface während des Scans
  • Log: /var/log/koel-scan.log

🔧 Technische Details

Docker-Setup:

  • Installation in /srv/koel
  • Container: koel (App) + koel-db (MariaDB 10.11)
  • Port: 6680 (extern) → 80 (intern)
  • Images: phanan/koel:latest + mariadb:10.11
  • Memory Limit: 2GB für Koel, 512MB für DB

Konfigurationsdateien:

  • Docker Compose: /srv/koel/docker-compose.yml
  • Environment: /srv/koel/koel.env
  • APP_KEY: Automatisch generiert und in koel.env gespeichert

Features:

  • ✅ Web-basiertes Streaming
  • ✅ Playlist-Verwaltung
  • ✅ Last.fm/Spotify/iTunes Metadaten
  • ✅ Cover-Art (dynamisch geladen)
  • ✅ Suche und Filter
  • ⚠️ 100.686/137.074 Songs verfügbar

Bekannte Probleme:

  • Unterordner in /00_Unique_From_Other_Folders/ werden nicht gescannt
  • UTF-8 Encoding-Fehler bei Sonderzeichen
  • Keine lokale Cover-Speicherung

📝 Wichtige Wartungsbefehle

bash

<# Musik-Scan manuell starten
docker exec --user www-data koel php artisan koel:scan

# Scan-Progress verfolgen
tail -f /var/log/koel-scan.log

# Container-Status prüfen
docker ps | grep koel

# Container neu starten
cd /srv/koel && docker-compose restart

# Laravel-Logs bei Problemen
docker exec koel tail -50 /var/www/html/storage/logs/laravel.log

# Cache leeren
docker exec koel php artisan cache:clear
docker exec koel php artisan config:clear

💾 Backup-Information

  • Navidrome-Backup vorhanden: /root/backup-navidrome-*.tar.gz
  • Koel-Daten: /srv/koel/ (Docker Volumes)
  • Musik unverändert in: /data2/mp3/

⚠️ Bekannte Einschränkungen

  • Läuft nur über HTTP (kein HTTPS aktiv)
  • Mobile Apps sind kostenpflichtig
  • Keine automatischen Metadaten-Downloads konfiguriert

System läuft stabil! Container sind healthy, Web-Interface funktioniert

Navidrome (läuft nicht mehr, nur historisch, wurde durch Koel ersetzt)

📋 Service-Übersicht

Service: Navidrome Music Streaming Server

Status: Produktiv

Installation: 2025-09-03

Container-ID: navidrome

🔧 Technische Konfiguration

Netzwerk & Ports

  • Port: 4533 (HTTP)
  • Lokal: http://localhost:4533
  • Extern: http://dergagi.changeip.org:4533
  • Protocol: HTTP (kein HTTPS - läuft hinter Apache wenn gewünscht)

Docker-Container

bash

Container Name: navidrome
Image: deluan/navidrome:latest
Restart Policy: unless-stopped
Port Mapping: 4533:4533
Network: Bridge (Standard)

Volume-Mounts

bash

/data2/mp3 → /music (read-only)           # Musik-Archiv (138.192 MP3s)
/opt/navidrome/data → /data               # SQLite-DB & Metadaten
/opt/navidrome/cache → /cache             # Thumbnails & Cache
/opt/navidrome/navidrome.toml → /opt/navidrome/navidrome.toml (ro)

Konfigurationsdatei

Pfad: /opt/navidrome/navidrome.toml

toml

MusicFolder = "/music"
DataFolder = "/data"
CacheFolder = "/cache"
Address = "0.0.0.0"
Port = 4533
LogLevel = "info"
ScanSchedule = "@every 1h"
SessionTimeout = "24h"
UIWelcomeMessage = "Willkommen zu STORE2 Music Center"
EnableTranscodingConfig = true
TranscodingCacheSize = "1GB"
EnableSharing = true
EnableStarRating = true
EnableUserEditing = true
MaxSidebarPlaylists = 100

Verwaltungsbefehle

bash

# Status prüfen
docker ps | grep navidrome

# Logs ansehen
docker logs navidrome

# Container stoppen/starten
docker stop navidrome
docker start navidrome

# Container neu starten
docker restart navidrome

# Container entfernen (Notfall)
docker stop navidrome && docker rm navidrome

iTunes/Last.fm Cover Downloader Service

System: STORE2 (Debian 13)

Stand: 2025-09-14

Status: ✅ AKTIV UND FUNKTIONSFÄHIG


1. SYSTEM-ÜBERSICHT

Zweck

Automatisches Herunterladen fehlender Album-Cover für die MP3-Sammlung unter /data2/mp3/mp3/ mittels iTunes und Last.fm APIs.

Aktuelle Statistik

  • Service läuft seit: 14.09.2025 08:15 Uhr
  • Erfolgsrate: ~11-15% (normal für diese Sammlung mit vielen Bootlegs)
  • Bisher heruntergeladen: 380+ Cover erfolgreich, 2187 neue Cover in 24h
  • Verbleibende Queue: 2901 Alben ohne Cover
  • Geschätzte Restzeit: ~2-3 Stunden bei 3 Sek/Album

2. TECHNISCHE ARCHITEKTUR

Verzeichnisstruktur

/opt/itunes-persistent/
├── downloader_robust_v3.sh      # Hauptscript (Bash)
├── download_queue.txt           # Queue (TAB-getrennt: Pfad<TAB>Artist<TAB>Album)
├── skip_artwork.txt             # Skip-Cache für bereits versuchte Alben
├── make_queue.py                # Python-Script zur Queue-Generierung
├── logs/
│   ├── downloader-YYYY-MM-DD.log  # Tägliche Log-Dateien
│   └── session_stats.log          # Statistik-Übersicht
└── backup-*/                    # Backup-Verzeichnisse

SystemD Service Configuration

Datei: /etc/systemd/system/itunes-downloader.service

ini

[Unit]
Description=Hybrid iTunes + Last.fm Cover Downloader
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/opt/itunes-persistent
ExecStart=/opt/itunes-persistent/downloader_robust_v3.sh
Restart=always
RestartSec=60
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

3. API KONFIGURATION

Last.fm API

  • API Key: 7c327a65fcfcec095b42e9df6b3b46b4
  • Secret: 4765b081824d0dfc5a6174fd457b6a9b
  • User: dergagi33
  • App Name: Store2
  • Rate Limit: 300 requests/minute
  • Erfolgsrate: ~60% für offizielle Releases

iTunes API

  • Endpoint: https://itunes.apple.com/search
  • Rate Limit: 20 requests/minute
  • Auth: Keine erforderlich
  • Erfolgsrate: ~30% für offizielle Releases

4. WORKFLOW & LOGIK

Download-Prozess

  1. Queue laden aus download_queue.txt
  2. Skip-Check: Prüfung gegen skip_artwork.txt
  3. API-Versuch 1: iTunes API Query
  4. API-Versuch 2: Last.fm API als Fallback
  5. Alternative Schreibweisen bei Fehlschlag (& → and, Umlaute, etc.)
  6. Download: Cover als cover.jpg speichern
  7. Cache-Update: Erfolg/Misserfolg in Skip-Cache

Queue-Generierung (make_queue.py)

python

#!/usr/bin/env python3
import os

base_dir = '/data2/mp3/mp3'
output_file = '/opt/itunes-persistent/download_queue.txt'

with open(output_file, 'w') as f:
    for root, dirs, files in os.walk(base_dir):
        # Skip Sampler/Collections
        if any(part.startswith('00') for part in root.split('/')):
            continue
        # Check for missing cover
        if 'cover.jpg' not in files:
            # Extract artist and album from path
            # Write TAB-separated: path<TAB>artist<TAB>album

5. WICHTIGE BEFEHLE

Service Management

bash

# Status prüfen
systemctl status itunes-downloader

# Service stoppen
systemctl stop itunes-downloader

# Service starten
systemctl start itunes-downloader

# Service neustarten
systemctl restart itunes-downloader

# Logs anzeigen (live)
journalctl -u itunes-downloader -f

# Auto-Start aktivieren/deaktivieren
systemctl enable itunes-downloader
systemctl disable itunes-downloader

Monitoring & Statistik

bash

# Live-Log verfolgen
tail -f /opt/itunes-persistent/logs/downloader-$(date +%F).log

# Erfolgsstatistik
grep -c "SUCCESS:" /opt/itunes-persistent/logs/downloader-$(date +%F).log

# Queue-Status
wc -l < /opt/itunes-persistent/download_queue.txt

# Neue Cover der letzten Stunde
find /data2/mp3/mp3 -name "cover.jpg" -mmin -60 | wc -l

# Erfolgsrate berechnen
awk '/Processing:/ {total++} /SUCCESS:/ {success++} END {
    print "Erfolge: " success "/" total " = " int(success*100/total) "%"
}' /opt/itunes-persistent/logs/downloader-$(date +%F).log

Queue Management

bash

# Queue neu generieren
systemctl stop itunes-downloader
cd /opt/itunes-persistent
python3 make_queue.py
systemctl start itunes-downloader

# Skip-Cache leeren (für neue Versuche)
> /opt/itunes-persistent/skip_artwork.txt

# Backup erstellen
cp download_queue.txt download_queue.backup
cp skip_artwork.txt skip_artwork.backup

6. TROUBLESHOOTING

Problem: Service läuft in Endlos-Schleife

Symptom: Service startet alle 60 Sekunden neu

Ursache: Alle Queue-Einträge im Skip-Cache

Lösung:

bash

systemctl stop itunes-downloader
> /opt/itunes-persistent/skip_artwork.txt  # Skip-Cache leeren
python3 /opt/itunes-persistent/make_queue.py  # Neue Queue
systemctl start itunes-downloader

Problem: Keine neuen Downloads

Mögliche Ursachen:

  • API-Rate-Limits erreicht
  • Alle verbleibenden Alben nicht in APIs verfügbar
  • Queue leer

Diagnose:

bash

# Prüfe ob Queue leer
wc -l < /opt/itunes-persistent/download_queue.txt

# Prüfe letzte Aktivität
tail -20 /opt/itunes-persistent/logs/downloader-$(date +%F).log

# Prüfe ob Prozess läuft
pgrep -f downloader_robust_v3.sh

Problem: Zu viele API-Fehler

Lösung: Rate-Limit in Script anpassen

bash

# In downloader_robust_v3.sh:
# RATE_LIMIT variable von 2 auf 3-4 Sekunden erhöhen

7. MUSIK-SAMMLUNG STRUKTUR

Gesamt-Statistik

  • Basis-Verzeichnis: /data2/mp3/mp3/
  • Künstler-Verzeichnisse: 1372
  • Gesamt-Alben: 6642
  • Mit Cover: 3741 (nach Downloads)
  • Ohne Cover: 2901 (hauptsächlich Bootlegs/VA)

Kategorien ohne Cover

  1. VA-Compilations: ~540 Einträge
    • Schwer zu finden, oft lokale Zusammenstellungen
  2. Bootlegs/Underground: ~800 Einträge
    • Release-Groups (-uC, -RpM, -WHOA, -XXL)
    • Niemals in offiziellen APIs
  3. Fehlende Metadaten: ~550 Einträge
    • Verzeichnisname = Artist = Album
    • Parser konnte nicht trennen
  4. Reggae-Sammlung: ~200 Einträge
    • Spezielle Struktur unter REGGAE/REGGEA
  5. Normale Alben: ~800 Einträge
    • Ältere/unbekannte Releases
    • Falsche Schreibweise

8. PERFORMANCE & OPTIMIERUNG

Aktuelle Performance

  • Durchsatz: ~20-30 Alben/Minute
  • Pause zwischen Downloads: 2 Sekunden
  • Erfolgsrate: 11-15% (systembedingt niedrig)

Optimierungsmöglichkeiten

  1. Parallel-Processing: Mehrere Worker-Threads
  2. Bessere APIs: MusicBrainz, Discogs
  3. Lokale Datenbank: Cache erfolgreicher Matches
  4. Fuzzy-Matching: Bessere Schreibweisen-Toleranz

9. BACKUP & RECOVERY

Wichtige Dateien sichern

bash

# Vollbackup
tar -czf itunes-backup-$(date +%F).tar.gz \
    /opt/itunes-persistent/ \
    /etc/systemd/system/itunes-downloader.service

# Queue & Skip-Cache Backup
cp /opt/itunes-persistent/download_queue.txt ~/backup/
cp /opt/itunes-persistent/skip_artwork.txt ~/backup/

Wiederherstellung

bash

# Service stoppen
systemctl stop itunes-downloader

# Backup einspielen
tar -xzf itunes-backup-DATUM.tar.gz -C /

# Service neu laden und starten
systemctl daemon-reload
systemctl start itunes-downloader

10. ZUSAMMENFASSUNG

Der iTunes/Last.fm Cover Downloader läuft stabil und zuverlässig. Die niedrige Erfolgsrate von 11-15% ist normal und erwartbar für diese Musik-Sammlung, da:

  • Viele Bootlegs und Underground-Releases vorhanden sind
  • VA-Compilations selten in APIs verfügbar sind
  • Verzeichnisstrukturen teilweise problematisch sind

Der Service hat bereits 2187 Cover in 24 Stunden erfolgreich heruntergeladen und wird die verbleibenden 2901 Einträge durcharbeiten. Danach kann er gestoppt oder für neue Alben reaktiviert werden.

Nächste Schritte nach Abschluss:

  1. Service stoppen wenn Queue leer
  2. Periodisch neue Queue generieren für neue Alben
  3. Ggf. manuelle Cover für wichtige Alben ergänzen

Ombi Media Request System - Konfigurationsdokumentation

Datum: 3. September 2025

Status: Vollständig konfiguriert und produktiv

System-Übersicht

Installation:

  • Version: LinuxServer Ombi (latest)
  • Container: ombi (/srv/ombi/)
  • Port: 3579 (HTTP)
  • Zugang: http://192.168.1.102:3579 | http://dergagi.changeip.org:3579
  • Database: SQLite (Standard)
  • Admin-User: dergagi

Emby-Server-Integration

Server-Konfiguration:

  • Server Name: STORE2 Emby
  • Hostname: dergagi.changeip.org
  • Port: 8920 (HTTPS)
  • SSL: Aktiviert
  • API Key: d740243a61584180af06df568d56dd23
  • Server ID: 5a6aa876ff544473bd36e7ccd9742a8b

Überwachte Bibliotheken:

  • Movies ✓
  • Serien ✓
  • FPV Videos ✓
  • Andere deaktiviert

Benutzer-Verwaltung

Importierte Emby-User (9 Personen):

  • Benny, Bianka, Chris, Ogi, Hollis, Michi, Flippo, Pitri, Instalazer

Standard-Benutzerrollen:

  • Request Movie: Aktiviert
  • Request TV: Aktiviert
  • Request Music: Aktiviert
  • Auto-Approve: Deaktiviert (manuelle Genehmigung)
  • Admin: Nur dergagi

Request-Limits:

  • Movie Requests: 10/Woche
  • Episode Requests: 20/Woche
  • Music Requests: Unbegrenzt

Email-Benachrichtigungen

SMTP-Konfiguration:

  • Server: mail.gmx.net:587 (STARTTLS)
  • Absender: dergagi@gmx.de
  • Username: dergagi@gmx.de
  • Sender Name: Emby Request
  • Admin Email: daniel.gareis@gmail.com

Aktive Benachrichtigungen:

  • New Request, Request Approved, Request Available, Request Declined, Welcome Email

User-Login-Verfahren

Authentifizierung: Emby-User-Integration (keine OAuth) Login-Prozess: Username/Password wie bei Emby URL für Freunde: http://dergagi.changeip.org:3579

YT4K System - Zusammenfassung

Server: STORE2 (Debian 13)

URL: http://dergagi.changeip.org:8443/

Status: Voll funktionsfähig

Aktuelle Konfiguration

Service: SystemD-managed yt4k.service

User: www-data:www-data

Port: 8443 (HTTP, Router-forwarded)

Processing: FFmpeg-basiert (3-8 Min pro Video)

Verzeichnisse:

  • Anwendung: /srv/yt4k/
  • Output: /data/Downloads/YT4K/ (gagi:www-data 775)
  • Temp: /tmp/yt4k/

Python-Umgebung

Virtual Env: /srv/yt4k/.venv

Python: 3.13.5

Packages: fastapi, uvicorn, yt-dlp, opencv, numpy

Processing-Pipeline

Aktiv: FFmpeg-basierte AI-Simulation

  • Lanczos-Interpolation
  • Noise Reduction
  • Color Enhancement
  • Unsharp Masking
  • H.264 Encoding (CRF 16-18)

Deaktiviert: Real-ESRGAN (zu langsam - Stunden pro Video)

API-Endpunkte

  • / - Web-Interface
  • /upload - Video-Processing
  • /status/{job_id} - Progress
  • /download/{filename} - Download
  • /health - System-Status

Service-Management

bash

systemctl start/stop/restart yt4k.service
journalctl -u yt4k.service -f
curl http://127.0.0.1:8443/health

Performance

Processing-Zeiten:

  • 480p→4K: 3-5 Min
  • 720p→4K: 5-8 Min
  • 1080p→4K: 8-12 Min

Output-Qualität: Hochwertige 4K-Videos (20-50MB typisch)

Troubleshooting

Emergency-Restart:

bash

systemctl restart yt4k.service
rm -rf /tmp/yt4k*

Häufige Probleme:

  • Job-Status hängt → Service restart
  • Permissions → chown www-data:www-data
  • Port nicht erreichbar → Router-Check

Das System ist stabil, produktionsbereit und nutzt bewährte FFmpeg-Technologie für schnelle, zuverlässige Video-Upscaling.

Nextcloud Konfiguration - STORE2

Datum: 01. September 2025

Status: Produktiv, vollständig funktionsfähig

System-Übersicht

Server: STORE2 (192.168.1.102)

OS: Debian 13

Container-System: Docker Compose

Reverse-Proxy: Traefik v3.5

Öffentliche URLs

  • Nextcloud (HTTPS): https://nc.dergagi9.duckdns.org:8444
  • Nextcloud (HTTP intern): http://192.168.1.102:8086
  • Traefik Dashboard: http://192.168.1.102:8082

Authentifizierung

Nextcloud Admin:

  • Benutzer: dergagi
  • Passwort: Store2@NC#2025

Datenbank (MariaDB):

  • Host: db (Docker-intern)
  • Datenbank: nextcloud
  • Benutzer: nextcloud
  • Passwort: Store2@NC#2025

SSL/TLS-Zertifikat

Typ: Let's Encrypt Wildcard-Zertifikat

Domain: *.dergagi9.duckdns.org

Gültigkeitsdauer: Bis 10. Oktober 2025

Issuer: Let's Encrypt (R11)

Speicherort: /srv/traefik/certificates/

Docker-Konfiguration

Traefik (Reverse Proxy)

  • Container: traefik-nc
  • Image: traefik:v3.5
  • Ports: 81→80, 8444→443, 8082→8080
  • Config: /srv/traefik/docker-compose.yml
  • Zertifikate: /srv/traefik/certificates/dynamic.yml

Nextcloud

  • Container: nextcloud-app
  • Image: nextcloud:31
  • Port: 8086→80 (HTTP intern)
  • Config: /srv/nextcloud/docker-compose.yml
  • Trusted Domains: nc.dergagi9.duckdns.org:8444

Datenbank

  • Container: nextcloud-db
  • Image: mariadb:10.11
  • Port: 3306 (nur intern)
  • Volume: nextcloud_db-data

Netzwerk-Konfiguration

Router-Portweiterleitung:

  • Port 81 → 192.168.1.102:81 (HTTP Challenge)
  • Port 8444 → 192.168.1.102:8444 (HTTPS Nextcloud)

DNS:

  • Provider: DuckDNS
  • Domain: nc.dergagi9.duckdns.org
  • IP: 91.65.237.120 (automatisches Update aktiv)

Sicherheit

  • HTTPS-Only (Port 8444)
  • Let's Encrypt-Zertifikat (vertrauenswürdig)
  • Apache Store2-Website unberührt (Port 443)
  • Alle anderen Dienste isoliert

Wartung

Container neustarten:

bash

<cd /srv/traefik && docker compose restart
cd /srv/nextcloud && docker compose restart

Zertifikat erneuern (vor Oktober 2025):

  • Neues Zertifikat von Let's Encrypt holen
  • In /srv/traefik/certificates/ ersetzen
  • Traefik neustarten

Datensicherung:

  • Volume: nextcloud_db-data (Datenbank)
  • Volume: nextcloud_nextcloud-data (Dateien)

Integration

Unberührte Dienste:

  • Store2-Website (Apache Port 443)
  • MediaWiki (Port 8088)
  • YT4K (Port 8443)
  • HomeBox (Port 3100)
  • Alle anderen bestehenden Dienste

Besonderheiten:

  • Kein Konflikt mit Apache
  • Rate Limit-Problem durch Wildcard-Zertifikat umgangen
  • Automatische DNS-Updates durch DuckDNS

Nextcloud Docker Update

Voraussetzungen

  • Nextcloud läuft via Docker Compose unter /srv/nextcloud
  • Traefik als Reverse Proxy unter /srv/traefik
  • Zugriff: https://nc.dergagi9.duckdns.org:8444

Update-Prozedur (Beispiel: 31.0.8 → 31.0.9)

1. Version in docker-compose.yml ändern

cd /srv/nextcloud
nano docker-compose.yml

Ändere die Image-Zeile von:

services:
  app:
    image: nextcloud:31

auf die gewünschte Version:

services:
  app:
    image: nextcloud:31.0.9

Wichtig:

  • Bei Minor-Updates (31.0.8 → 31.0.9): Direkt möglich
  • Bei Major-Updates (30.x → 31.x): Nur ein Major-Schritt gleichzeitig!
  • Nie überspringen (29.x → 31.x geht NICHT)

2. Optional: Datenbank-Backup

docker exec nextcloud-db mariadb-dump -u nextcloud -p'Store2@NC#2025' nextcloud > /root/nextcloud-backup-$(date +%F).sql

3. Update durchführen

# Neues Docker Image herunterladen
docker compose pull

# Container mit neuem Image neu starten
docker compose up -d

4. Automatisches Upgrade abwarten Der Container erkennt die Versionsdifferenz automatisch und führt das Upgrade durch. Dies dauert 30-60 Sekunden. Logs beobachten mit:

docker compose logs -f

Warten auf die Meldung:

Initializing nextcloud 31.0.9...
Upgrading nextcloud from 31.0.8...
Upgrade successful

5. Verifikation

# Version prüfen
docker exec nextcloud-app php occ -V

# Container-Status
docker compose ps

# Web-Interface testen
curl -I https://nc.dergagi9.duckdns.org:8444

Besonderheiten der Installation

Docker-Struktur:

  • Nextcloud App: Container nextcloud-app, Port 8086 intern
  • Datenbank: Container nextcloud-db (MariaDB 10.11)
  • Reverse Proxy: Traefik v3.5 auf Port 8444 (HTTPS)
  • Volumes: Daten bleiben in Docker Volumes erhalten

Keine manuellen Schritte nötig:

  • ❌ Kein occ upgrade erforderlich
  • ❌ Kein Maintenance Mode nötig
  • ❌ Kein Web-Updater (bei Docker deaktiviert)
  • ✅ Alles läuft automatisch beim Container-Start

Rollback bei Problemen

# Alte Version wiederherstellen
cd /srv/nextcloud
docker compose down

# docker-compose.yml auf alte Version zurücksetzen
nano docker-compose.yml  # Version wieder auf z.B. nextcloud:31.0.8 ändern

# Container neu starten
docker compose up -d

# Optional: Datenbank aus Backup wiederherstellen
docker exec -i nextcloud-db mariadb -u nextcloud -p'Store2@NC#2025' nextcloud < /root/nextcloud-backup-DATUM.sql

Update-Pfad für größere Sprünge Beispiel von Version 29 auf 31:

Speedtest Tracker

Setup-Datum: 04.09.2025

Version: LinuxServer.io Image

Status: Vollautomatisch, produktiv

Installation & Zugriff

Container-Details:

  • Container-Name: speedtest-tracker-new
  • Image: lscr.io/linuxserver/speedtest-tracker:latest
  • Port: 8092 (HTTP)
  • URL: http://dergagi.changeip.org:8092
  • Login: daniel.gareis@gmail.com / 9@8Cq%UhhWYFs%

Konfiguration

Docker-Compose-Pfad: /opt/speedtest-tracker-new/docker-compose.yml

Finale Environment-Variablen:

SPEEDTEST_SCHEDULE="*/10 * * * *"  # Alle 10 Minuten (Cron-Format)
SPEEDTEST_SERVERS=52770           # Verizon.com Server (944+ Mbps)
TZ=Europe/Berlin
APP_URL=http://dergagi.changeip.org:8092
DB_CONNECTION=sqlite
DISPLAY_TIMEZONE=Europe/Berlin

Abhängige Services:

  • InfluxDB: speedtest-influxdb-v2 (Port 8087)
  • Datenbank: SQLite (primär) + InfluxDB (optional)

Datenbank & Speicherung

SQLite-Datenbank:

  • Container-Pfad: /config/database.sqlite
  • Docker-Volume: speedtest-app-data
  • Backup-relevant: Ja

InfluxDB (optional):

  • Container: speedtest-influxdb-v2
  • Port: 8087
  • Login: admin / SpeedTest2025!

Automatisierung

Test-Schedule:

  • Intervall: Alle 10 Minuten
  • Server: Verizon.com (ID: 52770)
  • Geschwindigkeit: 944+ Mbps (typisch)
  • Wartung: Keine manuelle Wartung erforderlich

Cron-Format Erklärung:

*/10 * * * *
│    │ │ │ │
│    │ │ │ └── Wochentag (0-7, Sonntag = 0 oder 7)
│    │ │ └──── Monat (1-12)
│    │ └────── Tag (1-31)
│    └──────── Stunde (0-23)
└────────────── Minute (0-59, */10 = alle 10 Minuten)

Container-Management

Neustart:

bash

cd /opt/speedtest-tracker-new
docker-compose restart speedtest-tracker

Komplett-Neustart:

bash

cd /opt/speedtest-tracker-new
docker-compose down
docker-compose up -d

Status prüfen:

bash

docker ps | grep speedtest-tracker-new

Logs anzeigen:

bash

docker logs speedtest-tracker-new
docker logs speedtest-tracker-new --tail 50

Konfigurationsprüfung

Environment-Variablen checken:

bash

docker exec speedtest-tracker-new env | grep SPEEDTEST

Container-Config anzeigen:

bash

docker inspect speedtest-tracker-new | grep -A10 -B10 SPEEDTEST

Service-Erreichbarkeit:

bash

curl -s -o /dev/null -w "Status: %{http_code}" http://localhost:8092

Web-Interface Funktionen

Hauptfunktionen:

  • Automatische Tests alle 10 Minuten
  • Historische Datenansicht
  • Server-Auswahl und -Konfiguration
  • Statistiken und Trends
  • Export-Funktionen

Wichtige Settings:

  • Default Server: Verizon.com (52770)
  • Schedule: */10 * * * * (alle 10 Minuten)
  • Timezone: Europe/Berlin

Troubleshooting

Häufige Probleme:

1. Container startet nicht:

bash

docker logs speedtest-tracker-new
# Prüfe Environment-Variablen und Dependencies

2. Tests laufen nicht automatisch:

bash

docker exec speedtest-tracker-new env | grep SPEEDTEST_SCHEDULE
# Sollte zeigen: SPEEDTEST_SCHEDULE="*/10 * * * *"

3. Falscher Server wird verwendet:

bash

docker exec speedtest-tracker-new env | grep SPEEDTEST_SERVERS
# Sollte zeigen: SPEEDTEST_SERVERS=52770

4. Web-Interface nicht erreichbar:

bash

curl -v http://localhost:8092
# Prüfe Port-Mapping und Container-Status

Backup & Wiederherstellung

Wichtige Backup-Pfade:

  • Docker-Compose: /opt/speedtest-tracker-new/docker-compose.yml
  • Daten-Volume: speedtest-app-data
  • InfluxDB-Volume: influxdb-data (falls verwendet)

Backup erstellen:

bash

cd /opt/speedtest-tracker-new
cp docker-compose.yml docker-compose.yml.backup-$(date +%Y%m%d-%H%M%S)
docker run --rm -v speedtest-app-data:/data -v $(pwd):/backup alpine tar czf /backup/speedtest-data-backup-$(date +%Y%m%d).tar.gz -C /data .

Server-Informationen

Verizon.com Server (52770):

  • Standort: USA
  • Typische Geschwindigkeit: 944+ Mbps Download
  • Latenz: ~26ms
  • Zuverlässigkeit: Hoch
  • Grund der Auswahl: Beste Geschwindigkeit in Tests

Wartung

Regelmäßige Checks: Keine erforderlich

Log-Rotation: Automatisch durch Docker

Updates: Bei Bedarf über docker-compose pull

Überwachung: Über Uptime Kuma integriert

Grafana Konfiguration

Setup-Datum: 04.09.2025

System: Grafana + Prometheus + Node Exporter

Status: Real-time Monitoring aktiv

Installation & Zugriff

Container-Details:

  • Container-Name: grafana-system
  • Netzwerk: Host-Netzwerk
  • URL: http://dergagi.changeip.org:3000
  • Login: admin / QgdQh9ksJraVHL

Prometheus-Stack

Prometheus-Container:

  • Name: prometheus-system
  • Netzwerk: Host-Netzwerk
  • Port: 9090 (intern)
  • URL: http://localhost:9090

Node Exporter:

  • Name: node-exporter-system
  • Port: 9100
  • Sammelt: CPU, RAM, Disk, Network-Metriken

Datasource-Konfiguration

Prometheus-Datasource:

  • Name: Prometheus-System
  • Type: Prometheus
  • URL: http://localhost:9090
  • Access: Proxy
  • Default: Yes
  • UID: eex39fbvthon4f

Dashboard

Node Exporter Full Dashboard:

  • Metriken: CPU-Auslastung, RAM-Verbrauch, System-Load, Disk-Space, Network-Traffic
  • Refresh: 30 Sekunden
  • Zeitbereich: Konfigurierbar (Standard: letzte Stunde)

Container-Management

Grafana-Neustart:

bash

docker stop grafana-system
docker rm grafana-system
docker run -d --name grafana-system --network host --restart=unless-stopped \
  -e GF_SECURITY_ADMIN_USER=admin \
  -e GF_SECURITY_ADMIN_PASSWORD=QgdQh9ksJraVHL \
  grafana/grafana:latest

Status-Check:

bash

docker ps --format "table {{.Names}}\t{{.Status}}" | grep -E "(grafana|prometheus|node-exporter)"

Überwachte Metriken

CPU:

  • Auslastung in Prozent
  • System vs. User vs. Idle
  • Load Average (1m, 5m, 15m)

Memory:

  • RAM-Verbrauch absolut und prozentual
  • SWAP-Nutzung
  • Cache + Buffer

Disk:

  • Speicherplatz aller Partitionen
  • I/O-Statistiken
  • Disk-Usage-Trends

Network:

  • Ein-/Ausgehender Traffic
  • Bytes pro Sekunde
  • Interface-Status

Troubleshooting

Grafana-Erreichbarkeit:

bash

curl -s -o /dev/null -w "Status: %{http_code}" http://localhost:3000

Prometheus-Verbindung:

bash

curl -s -o /dev/null -w "Status: %{http_code}" http://localhost:9090/api/v1/query?query=up

Container-Logs:

bash

docker logs grafana-system
docker logs prometheus-system
docker logs node-exporter-system

Wartung

Automatisierung: Vollautomatisch, keine manuelle Wartung

Datensammlung: Alle 30 Sekunden

Retention: Standard Prometheus-Einstellungen

Backup: Container-Volumes bei System-Backup eingeschlossen

Portainer Konfiguration

Zugang:

  • URL: http://100.108.194.126:9000 (über Tailscale)
  • Lokaler Zugang: http://localhost:9000
  • Status: Vollständig funktional

Container-Setup:

  • Container: portainer
  • Image: portainer/portainer-ce:latest
  • Port-Binding: 100.108.194.126:9000→9000/tcp, 127.0.0.1:9000→9000/tcp
  • Docker-Compose: /srv/portainer/docker-compose.yml

Daten-Persistierung:

  • Datenbank: /srv/portainer/data/portainer.db (524KB)
  • Zertifikate: /srv/portainer/data/certs/ (SSL-Certs)
  • Konfiguration: /srv/portainer/data/docker_config/

Tailscale-Integration:

  • Tailscale-IP: 100.108.194.126
  • Interface: tailscale0 (aktiv)
  • Netzwerk: hassio Docker-Netzwerk verfügbar

Funktionsumfang:

  • Vollständige Docker-Container-Verwaltung
  • Monitoring aller STORE2-Services
  • Image-Management und Container-Logs
  • Network- und Volume-Verwaltung

Letzte Wiederherstellung: 03.09.2025, aus /mnt/nvme_backup/daily.0/srv/portainer

Uptime Kuma Monitoring - Setup-Dokumentation

Datum: 3. September 2025

Status: Vollständig konfiguriert und produktiv

System-Übersicht

Uptime Kuma Installation:

  • Version: 1.23.13-alpine (stabile Produktionsversion)
  • Zugang: http://192.168.1.102:3001
  • Admin-User: dergagi
  • Container: uptime-kuma (Docker)
  • Daten: /opt/uptime-kuma/data (Bind-Mount)

Überwachte Services (11 aktive Monitore)

Critical Services (5) - Email-Alerts aktiv

  1. Home Assistant - http://dergagi.changeip.org:8123
  2. MediaWiki Store2 - http://dergagi.changeip.org:8088/
  3. Grafana Dashboard - http://dergagi.changeip.org:3030
  4. Nextcloud - https://nc.dergagi9.duckdns.org:8444
  5. Emby - http://dergagi.changeip.org:8096

Media Services (3) - Email-Alerts aktiv

  1. HomeBox - http://dergagi.changeip.org:3100
  2. YT4K Upscaler - http://dergagi.changeip.org:8443/
  3. Store2 Website - https://dergagi.changeip.org/

Development Services (3) - Email-Alerts aktiv

  1. n8n - http://dergagi.changeip.org:5678
  2. Portainer - http://100.108.194.126:9000 (via Tailscale)
  3. Tailscale - 100.108.194.126 (Ping-Monitor)

Email-Benachrichtigungen

  • SMTP: mail.gmx.net:587 (dergagi@gmx.de → daniel.gareis@gmail.com)
  • Status: Aktiv für alle 11 Services
  • Test: Erfolgreich

Systemstatus

  • 11 aktive Monitore: Alle Services grün und stabil
  • Response Times: 200-300ms (optimal)
  • Nextcloud: Stabilisiert nach Timeout-Optimierung
  • Email-System: Vollständig funktional

Das Monitoring-System überwacht erfolgreich die gesamte STORE2-Infrastruktur.

HomeBox Konfiguration

Datum: 03. September 2025

Status: Produktiv, vollständig funktionsfähig

System-Übersicht

  • Server: STORE2 (192.168.1.102)
  • OS: Debian 13
  • Container-System: Docker (Standalone)
  • Öffentliche URL: http://dergagi.changeip.org:3100

Authentifizierung

  • Benutzer: daniel.gareis@gmail.com
  • Passwort: Q6Zv&*YsmDBN3e
  • Login-URL: http://dergagi.changeip.org:3100/login

Docker-Konfiguration

  • Container-Name: homebox
  • Image: ghcr.io/hay-kot/homebox:latest
  • Port-Mapping: 3100:7745
  • Volume: /srv/homebox:/data
  • Restart-Policy: unless-stopped

Container-Management

bash

docker ps | grep homebox
docker stop/start homebox
docker logs homebox --tail 20

Datenbank

  • Hauptdatenbank: /srv/homebox/homebox.db (192KB)
  • WAL-File: /srv/homebox/homebox.db-wal (424KB)
  • Letztes Update: 31. August 2025

Backup & Restore

bash

# Backup
cp -r /srv/homebox /root/homebox-backup-$(date +%Y%m%d-%H%M%S)

# Restore (bei Problemen)
docker stop homebox
rsync -av /mnt/nvme_backup/daily.0/opt/homebox/data/ /srv/homebox/
docker start homebox

Runterfahren über Konsole

umount /data
umount /data2

Falls blockiert, nachschauen wer darauf zugreift mittels

lsof /data 
kill "processid"
shutdown -h now

Webzugang von Außen

in /srv/www/htdocs .htaccess

darin nur den genutzten IPs Zugang erlauben.

Neuer Webuser

htdigest2 /srv/www/.htdigest Store gagihawaii

Webseite verändern

in /srv/www/htdocs/index.template verändern/anpassen

bzw. in /usr/local/bin/update_http.sh Parameter optimieren

dann

/usr/local/bin/update_http.sh

Store2-Website Dokumentation

Übersicht

Die STORE2 Website zeigt System-Monitoring-Daten auf https://dergagi.changeip.org/

  • Automatisches Update: Alle 5 Stunden via Cronjob
  • Manuelle Updates: /usr/local/bin/update_store2_website.sh

Architektur

Hauptkomponenten

  1. Website-Template: /var/www/html/index.template
    • HTML mit Platzhaltern (z.B. )
    • Responsive Design mit blauem Theme
  2. Update-Script: /usr/local/bin/update_http.sh
    • Sammelt CPU-Temps, System-Info, RAID-Status
    • Ersetzt Platzhalter im Template
    • Generiert /var/www/html/index.html
    • WICHTIG: Keine HDD-Temperatur-Abfragen mehr (entfernt für Performance)
  3. Heatmap-Service: Port 8020
    • Service: heatmap8020.service (systemd)
    • Pfad: /opt/heatmap8020/
    • Hauptdateien:
      • app.py - FastAPI Web-Interface
      • store2_heatmap.py - Rendering-Engine
    • Static Files: /opt/heatmap8020/static/
  4. HDD-Temperatur-Sammler: /usr/local/bin/dt.sh
    • Liest Temperaturen von 44 HDDs
    • Output-Format: /dev/sdX -> raid slot serial info temp°C
  5. Heatmap-Update: /usr/local/bin/update_heatmap.sh
    • Führt dt.sh aus und piped zu store2_heatmap.py
    • Generiert PNG in /opt/heatmap8020/static/
    • Kopiert zu /var/www/html/heatmap.png
  6. Master-Update-Script: /usr/local/bin/update_store2_website.sh
    • Kombiniert Heatmap- und Website-Updates
    • Wird vom Cronjob aufgerufen

Datenquellen

CPU-Temperaturen

  • Tool: sensors (lm-sensors)
  • 6 Kerne (Core 0-5)
  • Anzeige in °C

System-Speicher

  • Quelle: /dev/nvme0n1p1
  • Anzeige: Frei/Total in GB

Swap

  • Quelle: free -h
  • Anzeige: Frei/Total in GB

RAID-Arrays

  • Data (kleineres RAID): /data (~50TB)
  • Data2 (größeres RAID): /data2 (~58TB)
  • Status: clean/degraded
  • Mountpoint-basierte Erkennung (reboot-sicher)

HDD-Temperaturen

  • 44 Festplatten total
  • Heatmap zeigt:
    • Slot-Position (#01-#45)
    • Temperatur mit Farbcodierung (35°C grün bis 55°C rot)
    • Seriennummer, Kapazität, Hersteller
    • RAID-Zugehörigkeit (data/data2)

Die Website verlinkt auf folgende Dienste:

  • Emby 🎬: Port 8096
  • Ombi 📋: Port 3579
  • Navidrome 🎵: Port 4533
  • HomeBox 📦: Port 3100
  • CWA 📚: Port 8084 (Calibre)
  • TV 📺: Port 8089
  • Wiki 📖: Port 8088 (MediaWiki)

Cronjob-Konfiguration

bash

# Aktiver Cronjob (alle 5 Stunden zur vollen Stunde)
0 */5 * * * /usr/local/bin/update_store2_website.sh >/dev/null 2>&1

Backup-Locations

  • Vollbackup vom 17.09.2025: /root/STORE2-VOLLBACKUP-FUNKTIONIERT-20250917-195253/
  • Script-Backups:
    • /usr/local/bin/update_http.sh.bak*
    • /usr/local/bin/update_http.sh.before-hdd-removal
    • /usr/local/bin/update_http.sh.with-all-hdds

Wichtige Pfade

/var/www/html/index.template     # HTML-Template mit Platzhaltern
/var/www/html/index.html         # Generierte Website
/var/www/html/heatmap.png        # Aktuelle HDD-Heatmap
/usr/local/bin/update_http.sh    # Website-Update-Script
/usr/local/bin/update_heatmap.sh # Heatmap-Generator
/usr/local/bin/update_store2_website.sh # Master-Update-Script
/usr/local/bin/dt.sh             # HDD-Temperatur-Sammler
/opt/heatmap8020/                # Heatmap-Service-Verzeichnis

Manuelle Operationen

Website sofort aktualisieren

bash

/usr/local/bin/update_store2_website.sh

Nur Heatmap generieren

bash

/usr/local/bin/update_heatmap.sh

Nur Website-Daten aktualisieren (ohne Heatmap)

bash

/usr/local/bin/update_http.sh

Heatmap-Service neustarten

bash

systemctl restart heatmap8020
systemctl status heatmap8020

HDD-Temperaturen manuell prüfen

bash

/usr/local/bin/dt.sh

Performance-Optimierungen

  • Entfernte HDD-Abfragen: Ursprünglich waren 40+ einzelne HDD-Temp-Abfragen im update_http.sh Script. Diese wurden komplett entfernt.
  • Einmalige HDD-Abfrage: HDDs werden nur noch 1x für die Heatmap abgefragt (via dt.sh)
  • Update-Zeit: Von mehreren Minuten auf ~10 Sekunden reduziert

Fehlerbehebung

Heatmap zeigt keine Daten

  • Prüfe ob dt.sh korrekte Ausgabe liefert
  • Prüfe ob heatmap8020.service läuft
  • Schaue in /opt/heatmap8020/static/ nach generierten PNGs

Website zeigt alte Daten

  • Manuell updaten: /usr/local/bin/update_store2_website.sh
  • Browser-Cache leeren (Strg+F5)

Service nicht erreichbar

  • Apache-Status prüfen: systemctl status apache2
  • SSL-Zertifikat prüfen
  • Port 443 muss offen sein

Änderungshistorie

  • 17.09.2025: Große Überarbeitung
    • HDD-Temp-Abfragen aus update_http.sh entfernt
    • Heatmap-Integration implementiert
    • Performance drastisch verbessert
    • Cronjob auf neues Master-Script umgestellt

Store-Webseite ändern

Script unter

/usr/local/bin/update_store2_website.sh

Definierte Inhalte unter

/var/www/html/index.template

Generierte Website selbst unter

/var/www/html/index.html

Router

Fritzbox (als Modem)

192.168.178.1

Hitron Kabelmodem (als Modem im Bridge-Mode)

192.168.100.1

TP-Link TL-WR1043ND (als Router und WLAN-AP) und alle späteren Router

192.168.1.1