Webservices: Unterschied zwischen den Versionen
Admin (Diskussion | Beiträge) |
Gagi (Diskussion | Beiträge) |
||
| (39 dazwischenliegende Versionen von 4 Benutzern werden nicht angezeigt) | |||
| Zeile 1: | Zeile 1: | ||
= | == Emby Dokumentation == | ||
''' | '''Datum:''' 3. September 2025 | ||
'''Status:''' | '''Status:''' Native Installation, produktiv und stabil | ||
== System-Übersicht == | === System-Übersicht === | ||
'''Installation-Typ:''' Native Debian-Installation (kein Docker) | |||
'''Version:''' Emby Server 4.9.1.24 | |||
'''Server-Name:''' STORE2 | |||
'''Zugang:''' <nowiki>http://dergagi.changeip.org:8096</nowiki> | |||
'''Prozess:''' EmbyServer (PID 1684585) | |||
=== Technische Details === | |||
'''Ausführbare Datei:''' <code>/opt/emby-server/system/EmbyServer</code> | |||
'''Programmdaten:''' <code>/var/lib/emby</code> | |||
'''User:''' emby (dedicated service user) | |||
'''FFmpeg-Integration:''' Vollständig konfiguriert mit eigenen Binaries | |||
* FFmpeg: <code>/opt/emby-server/bin/ffmpeg</code> | |||
* FFprobe: <code>/opt/emby-server/bin/ffprobe</code> | |||
* FFdetect: <code>/opt/emby-server/bin/ffdetect</code> | |||
=== Netzwerk-Konfiguration === | |||
'''HTTP-Port:''' 8096 (aktiv, funktional) | |||
'''HTTPS-Port:''' 8920 (nicht konfiguriert) | |||
'''API-Endpoint:''' <code><nowiki>http://127.0.0.1:8096/System/Info/Public</nowiki></code> (funktional) | |||
'''Externe URL:''' <nowiki>http://dergagi.changeip.org:8096</nowiki> | |||
'''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 <code>/var/lib/emby/</code> verwaltet | |||
=== Service-Management === | |||
'''Service-Typ:''' SystemD-managed (automatischer Start) | |||
'''Restart-Policy:''' Exit Code 3 für Updates | |||
'''Update-Methode:''' APT-Package <code>emby-server-deb_{version}_amd64.deb</code> | |||
=== 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): <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 = | |||
'''Stand: 11. Oktober 2025, 14:30 Uhr''' | |||
'''Status: Produktiv, vollständig funktional nach Login-Fix und Cookie-Konfiguration''' | |||
---- | |||
== 🎯 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 19: | Zeile 380: | ||
* '''Admin-User:''' <code>admin</code> | * '''Admin-User:''' <code>admin</code> | ||
* '''Admin-Passwort:''' <code>CleanFinalMW2025!</code> | * '''Admin-Passwort:''' <code>CleanFinalMW2025!</code> | ||
* ''' | * '''Login-URL:''' [[Spezial:Anmelden|https://dergagi.changeip.org/w/index.php?title=Spezial:Anmelden]] | ||
---- | |||
== Docker-Setup == | == 🐳 Docker-Setup == | ||
=== Container-Konfiguration === | === Container-Konfiguration === | ||
| Zeile 33: | 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 | 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 41: | 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 59: | 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 70: | Zeile 443: | ||
php | php | ||
<code>$wgSitename = "Store2 Wiki"; | <code>$wgSitename = "Store2 Wiki"; | ||
$wgServer = "<nowiki> | $wgServer = "<nowiki>https://dergagi.changeip.org</nowiki>"; ''# HTTPS via Reverse Proxy'' | ||
$wgScriptPath = "/w"; | |||
$wgLanguageCode = "de"; | $wgLanguageCode = "de"; | ||
$wgDefaultSkin = "vector"; | $wgDefaultSkin = "vector"; | ||
$wgEnableUploads = true; | $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 );</code> | |||
=== Logo-Integration === | === Logo-Integration === | ||
* '''Logo-Datei:''' <code>/var/www/html/images/logo.png</code> (im Container) | * '''Logo-Datei:''' <code>/var/www/html/images/logo.png</code> (im Container) | ||
* '''Original- | * '''Original-Logo:''' <code>/data/Downloads/Fertig/Mediawiki_Store2_Logo.png</code> | ||
* '''Skalierung:''' 160x160px (optimiert für MediaWiki) | |||
* '''Dateigröße:''' ~10KB (von ursprünglich 1.1MB) | * '''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)''' | |||
= | # 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 | |||
'''Option B: Via Command-Line''' | |||
* ''' | |||
* | bash | ||
* | <code>''# 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!'</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 | * '''Seiten:''' 12+ importiert | ||
* '''Revisionen:''' 1059 (aus 2010er Backup) | * '''Revisionen:''' 1059+ (aus 2010er Backup + neue Inhalte) | ||
* '''Datenquelle:''' XML-Backup von Original-Store2-System | * '''Datenquelle:''' XML-Backup von Original-Store2-System + laufende Updates | ||
== Backup-System == | ---- | ||
== 💾 Backup-System == | |||
=== Aktuelle Backups === | === Aktuelle Backups === | ||
bash | bash | ||
<code>''# | <code>''# Perfektes Aktuell-Backup mit Logo (94MB) - 03.09.2025'' | ||
/root/mediawiki- | /root/mediawiki-perfect-with-logo-20250903-152727/ | ||
├── mw-database.tar.gz | ├── mediawiki-perfect-152727.sql (47MB - SQL mit aktuellen Daten) | ||
├── mw-images.tar.gz | ├── mw-database-perfect.tar.gz (33MB - Docker-Volume) | ||
├── mw-images-with-logo.tar.gz (14MB - Images + Store2-Logo) | |||
├── LocalSettings- | ├── LocalSettings-perfect.php (4.7KB - Konfiguration) | ||
└── mediawiki-setup/ | └── 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''</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 | |||
''# LocalSettings.php'' | |||
docker cp mw-clean-final:/var/www/html/LocalSettings.php /root/mediawiki-backup-$TS/ | |||
''# | ''# Docker-Volumes'' | ||
/root/mediawiki- | 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 === | === Restore-Prozedur === | ||
bash | bash | ||
<code>cd /root/mediawiki- | <code>''# Restore aus Backup'' | ||
docker-compose -f mediawiki- | 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 volume rm mediawiki-clean-final_mw-database mediawiki-clean-final_mw-images | ||
docker-compose -f mediawiki- | 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-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 | gunzip < mw-images.tar.gz | docker run -i --rm -v mediawiki-clean-final_mw-images:/data alpine tar xzf - -C /data | ||
docker cp LocalSettings | |||
''# 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> | |||
---- | |||
== | == 🔧 Wartung & Maintenance == | ||
=== | === 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'' | ||
mediawiki-clean-final_mw-database ''# MariaDB-Daten'' | mediawiki-clean-final_mw-database ''# MariaDB-Daten'' | ||
mediawiki-clean-final_mw-images ''# MediaWiki-Uploads + Logo'' | mediawiki-clean-final_mw-images ''# MediaWiki-Uploads + Store2-Logo'' | ||
''# Volume-Pfade'' | ''# Volume-Pfade'' | ||
/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> | ||
---- | |||
== 📝 Änderungshistorie & Lessons Learned == | |||
=== Container-Wiederherstellung (03.09.2025) === | |||
* '''Problem:''' Versehentliches <code>docker container prune -f</code> 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:''' <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> | |||
---- | |||
=== 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) | |||
---- | |||
=== Apache Reverse Proxy === | |||
'''VirtualHost''': <code>/etc/apache2/sites-enabled/photos-dergagi-443.conf</code> | |||
'''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:''' | |||
bash | |||
<code>''# Thumbnails Größe'' | |||
du -sh /data2/immich/thumbs/ | |||
''# Uploads Größe'' | |||
du -sh /data2/immich/library/ | |||
''# Gesamt'' | |||
du -sh /data2/immich/</code> | |||
'''Logs rotieren:''' | |||
bash | |||
<code>''# Apache Logs'' | |||
logrotate -f /etc/logrotate.d/apache2 | |||
''# Docker Logs (automatisch via Docker-Daemon)''</code> | |||
---- | |||
=== 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''': <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:''' | |||
* Email: <code>daniel.gareis@gmail.com</code> | |||
* Passwort: #s46@jCuFEq5S^ | |||
'''Datenbank:''' | |||
* DB-Root: <code>KoelRootStore2!</code> | |||
* DB-User: <code>koel</code> / <code>KoelStore2Music2025!</code> | |||
---- | |||
=== 🎵 Musik-Archiv === | |||
'''Verzeichnisse:''' | |||
* Hauptordner: <code>/data2/mp3/mp3</code> (92.980 MP3-Dateien) | |||
* Symlinks: 38.046 Links in <code>/data2/mp3/mp3/00_Unique_From_Other_Folders</code> | |||
* 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 | |||
'''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: <code>/var/log/koel-scan.log</code> | |||
---- | |||
=== 🔧 Technische Details === | |||
'''Docker-Setup:''' | |||
* Installation in <code>/srv/koel</code> | |||
* Container: <code>koel</code> (App) + <code>koel-db</code> (MariaDB 10.11) | |||
* 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 | |||
'''Konfigurationsdateien:''' | |||
* 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:''' | |||
* ✅ 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 <code>/00_Unique_From_Other_Folders/</code> 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</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> | |||
---- | |||
=== ⚠️ 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:''' <nowiki>http://localhost:4533</nowiki> | |||
* '''Extern:''' <nowiki>http://dergagi.changeip.org:4533</nowiki> | |||
* '''Protocol:''' HTTP (kein HTTPS - läuft hinter Apache wenn gewünscht) | |||
=== Docker-Container === | |||
bash | |||
<code>Container Name: navidrome | |||
Image: deluan/navidrome:latest | |||
Restart Policy: unless-stopped | |||
Port Mapping: 4533:4533 | |||
Network: Bridge (Standard)</code> | |||
=== Volume-Mounts === | |||
bash | |||
<code>/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)</code> | |||
=== Konfigurationsdatei === | |||
'''Pfad:''' <code>/opt/navidrome/navidrome.toml</code> | |||
toml | |||
<code>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</code> | |||
=== Verwaltungsbefehle === | |||
bash | |||
<code>''# 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</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 | bash | ||
<code>''# | <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 = | |||
'''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:''' <nowiki>http://192.168.1.102:3579</nowiki> | <nowiki>http://dergagi.changeip.org:3579</nowiki> | |||
* '''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:''' <nowiki>http://dergagi.changeip.org:3579</nowiki> | |||
= YT4K System - Zusammenfassung = | = YT4K System - Zusammenfassung = | ||
| Zeile 361: | Zeile 1.815: | ||
bash | bash | ||
< | <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 388: | 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 = | ||
''' | '''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:''' <nowiki>http://dergagi.changeip.org:3000</nowiki> | |||
* '''Login:''' admin / QgdQh9ksJraVHL | |||
== Prometheus-Stack == | |||
'''Prometheus-Container:''' | |||
* '''Name:''' prometheus-system | |||
* '''Netzwerk:''' Host-Netzwerk | |||
* '''Port:''' 9090 (intern) | |||
* '''URL:''' <nowiki>http://localhost:9090</nowiki> | |||
'''Node Exporter:''' | |||
* '''Name:''' node-exporter-system | |||
* '''Port:''' 9100 | |||
* '''Sammelt:''' CPU, RAM, Disk, Network-Metriken | |||
== Datasource-Konfiguration == | |||
'''Prometheus-Datasource:''' | |||
* '''Name:''' Prometheus-System | |||
* '''Type:''' Prometheus | |||
* '''URL:''' <nowiki>http://localhost:9090</nowiki> | |||
* '''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 | |||
<code>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</code> | |||
'''Status-Check:''' | |||
bash | |||
<code>docker ps --format "table <nowiki>{{.Names}}</nowiki>\t<nowiki>{{.Status}}</nowiki>" | grep -E "(grafana|prometheus|node-exporter)"</code> | |||
== Ü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 | ||
<code>curl -s -o /dev/null -w "Status: %{http_code}" <nowiki>http://localhost:3000</nowiki></code> | |||
'''Prometheus-Verbindung:''' | |||
bash | |||
<code>curl -s -o /dev/null -w "Status: %{http_code}" <nowiki>http://localhost:9090/api/v1/query?query=up</nowiki></code> | |||
'''Container-Logs:''' | |||
bash | |||
<code>docker logs grafana-system | |||
docker logs prometheus-system | |||
docker logs node-exporter-system</code> | |||
== Wartung == | |||
'''Automatisierung:''' Vollautomatisch, keine manuelle Wartung | |||
''' | '''Datensammlung:''' Alle 30 Sekunden | ||
'''Retention:''' Standard Prometheus-Einstellungen | |||
''' | '''Backup:''' Container-Volumes bei System-Backup eingeschlossen | ||
= Portainer Konfiguration = | = Portainer Konfiguration = | ||
| Zeile 461: | Zeile 2.236: | ||
'''Letzte Wiederherstellung:''' 03.09.2025, aus /mnt/nvme_backup/daily.0/srv/portainer | '''Letzte Wiederherstellung:''' 03.09.2025, aus /mnt/nvme_backup/daily.0/srv/portainer | ||
= HomeBox | = 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:''' <nowiki>http://192.168.1.102:3001</nowiki> | |||
* '''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 === | |||
# '''Home Assistant''' - <nowiki>http://dergagi.changeip.org:8123</nowiki> | |||
# '''MediaWiki Store2''' - <nowiki>http://dergagi.changeip.org:8088/</nowiki> | |||
# '''Grafana Dashboard''' - <nowiki>http://dergagi.changeip.org:3030</nowiki> | |||
# '''Nextcloud''' - <nowiki>https://nc.dergagi9.duckdns.org:8444</nowiki> | |||
# '''Emby''' - <nowiki>http://dergagi.changeip.org:8096</nowiki> | |||
=== Media Services (3) - Email-Alerts aktiv === | |||
# '''HomeBox''' - <nowiki>http://dergagi.changeip.org:3100</nowiki> | |||
# '''YT4K Upscaler''' - <nowiki>http://dergagi.changeip.org:8443/</nowiki> | |||
# '''Store2 Website''' - <nowiki>https://dergagi.changeip.org/</nowiki> | |||
=== Development Services (3) - Email-Alerts aktiv === | |||
# '''n8n''' - <nowiki>http://dergagi.changeip.org:5678</nowiki> | |||
# '''Portainer''' - <nowiki>http://100.108.194.126:9000</nowiki> (via Tailscale) | |||
# '''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 | Datum: 03. September 2025 | ||
| Zeile 540: | 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/ | /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:
- 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)
=== 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:
- Login auf https://www.gmx.de
- Klicke oben rechts auf Initialen → "Account verwalten" (oder direkt: https://www.gmx.net/mein-account/)
- 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
=== Amazon Kindle Setup ===
Damit Amazon E-Books von GMX akzeptiert:
- Login auf https://www.amazon.de/mycd
- 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
=== 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) ===
- https://dergagi.changeip.org/cwa öffnen
- "Upload" Button → Dateien auswählen
- CWA importiert automatisch
=== Methode 3: Calibre Desktop (für große Mengen >500 Bücher) ===
⚠️ 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
=== 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 ===
- 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 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
- Admin-User:
admin - Admin-Passwort:
CleanFinalMW2025! - Login-URL: https://dergagi.changeip.org/w/index.php?title=Spezial:Anmelden
🐳 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)
- Als Admin einloggen: https://dergagi.changeip.org/w/
- Zu Spezial-Seite: https://dergagi.changeip.org/w/index.php?title=Spezial:CreateAccount
- Benutzername, Passwort, E-Mail eingeben
- "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):
- Browser öffnen
- Zu MediaWiki gehen: https://dergagi.changeip.org/w/
- Cache-Bypass: Strg + F5 (Windows) oder Strg + Shift + R (Linux)
- Login-Seite: https://dergagi.changeip.org/w/index.php?title=Spezial:Anmelden
- 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 -flö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 = truebei 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
- Cookie-Konfiguration bei HTTPS-Proxy:
$wgCookieSecure = falseist 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
# 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
- Haupt-URL: https://dergagi.changeip.org/w/
- Login: https://dergagi.changeip.org/w/index.php?title=Spezial:Anmelden
- User anlegen: https://dergagi.changeip.org/w/index.php?title=Spezial:CreateAccount
- Spezialseiten: https://dergagi.changeip.org/w/index.php?title=Spezial:Spezialseiten
- Direkt-Zugang: http://dergagi.changeip.org:8088/
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.orgphotos.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
- Queue laden aus
download_queue.txt - Skip-Check: Prüfung gegen
skip_artwork.txt - API-Versuch 1: iTunes API Query
- API-Versuch 2: Last.fm API als Fallback
- Alternative Schreibweisen bei Fehlschlag (& → and, Umlaute, etc.)
- Download: Cover als
cover.jpgspeichern - 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
- 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
# 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:
- 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
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 upgradeerforderlich - ❌ 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
- Home Assistant - http://dergagi.changeip.org:8123
- MediaWiki Store2 - http://dergagi.changeip.org:8088/
- Grafana Dashboard - http://dergagi.changeip.org:3030
- Nextcloud - https://nc.dergagi9.duckdns.org:8444
- Emby - http://dergagi.changeip.org:8096
Media Services (3) - Email-Alerts aktiv
- HomeBox - http://dergagi.changeip.org:3100
- YT4K Upscaler - http://dergagi.changeip.org:8443/
- Store2 Website - https://dergagi.changeip.org/
Development Services (3) - Email-Alerts aktiv
- n8n - http://dergagi.changeip.org:5678
- Portainer - http://100.108.194.126:9000 (via Tailscale)
- 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
- Website-Template:
/var/www/html/index.template- HTML mit Platzhaltern (z.B.
) - Responsive Design mit blauem Theme
- HTML mit Platzhaltern (z.B.
- 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)
- Heatmap-Service: Port 8020
- Service:
heatmap8020.service(systemd) - Pfad:
/opt/heatmap8020/ - Hauptdateien:
app.py- FastAPI Web-Interfacestore2_heatmap.py- Rendering-Engine
- Static Files:
/opt/heatmap8020/static/
- Service:
- HDD-Temperatur-Sammler:
/usr/local/bin/dt.sh- Liest Temperaturen von 44 HDDs
- Output-Format:
/dev/sdX -> raid slot serial info temp°C
- Heatmap-Update:
/usr/local/bin/update_heatmap.sh- Führt
dt.shaus und piped zustore2_heatmap.py - Generiert PNG in
/opt/heatmap8020/static/ - Kopiert zu
/var/www/html/heatmap.png
- Führt
- 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)
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
# 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.shScript. 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.shkorrekte Ausgabe liefert - Prüfe ob
heatmap8020.servicelä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