Automatisierte Jobs auf dem Proxmox-Host (192.168.178.46), die selbsttaetig Dateirechte/DNS anpassen. Hier dokumentiert, damit im Stoerungsfall klar ist, was sie tun und wie man sie abschaltet.
Alle Befehle als root direkt auf dem Proxmox-Host ausfuehren (nicht im Container).
Zweck: FileBrowser (CT 103) legt Uploads im Webspace mit Modus 640 ab → nginx (CT 111) darf sie nicht lesen → 403 Forbidden. Dieser Watcher zieht neue Dateien automatisch auf 644 (Ordner 755), ~1–2 s nach dem Upload.
| Ueberwacht | /mnt/storage/fileserver/webspace (nur Top-Ordner) |
| Units | /etc/systemd/system/webspace-perms.path + webspace-perms.service |
| Wirkung | chmod o+r auf Files, chmod o+rx auf Dirs |
Status pruefen:
systemctl status webspace-perms.path
Voruebergehend deaktivieren:
systemctl disable --now webspace-perms.path
Komplett loeschen:
systemctl disable --now webspace-perms.path
rm /etc/systemd/system/webspace-perms.path /etc/systemd/system/webspace-perms.service
systemctl daemon-reload
⚠️ Nach Abschaltung sind neue Webspace-Uploads wieder 403, bis man manuell chmod 644 /mnt/storage/fileserver/webspace/<datei> auf dem Host ausfuehrt (im Container geht es nicht — unprivilegiertes LXC, Datei gehoert nobody).
Zweck: aktualisiert alle 5 Min die A-Records (ls-cloud.biz, sh0rt.biz, ls-x.cloud) auf die aktuelle Public-IP.
| Units | /etc/systemd/system/cf-ddns.timer + cf-ddns.service |
| Script | /usr/local/bin/cf-ddns.sh |
Deaktivieren:
systemctl disable --now cf-ddns.timer
⚠️ Bei Abschaltung zeigen nach einem IP-Wechsel alle Domains ins Leere → saemtliche externen Dienste nicht mehr erreichbar.
Zweck: setzt ACL-Maske rwx auf neue Media-/Download-Ordner, sonst koennen Sonarr/Radarr/Lidarr/Jellyfin Dateien nicht verschieben/loeschen. Seit 2026-07-14 nur noch Fallback — der eigentliche Echtzeit-Fix läuft über media-acl-watch (Punkt 7).
| Eintrag | root-crontab: */5 * * * * /usr/local/bin/fix_media_acl.sh |
Deaktivieren: crontab -e → Zeile mit # auskommentieren oder loeschen.
Zweck: korrigiert die Serien-Ordnerstruktur. Log: /var/log/fix_series_structure.log
| Eintrag | root-crontab: */30 * * * * python3 /usr/local/bin/fix_series_structure.py |
Deaktivieren: crontab -e → Zeile auskommentieren/loeschen.
Zweck: chmod 644 auf EmulatorJS-ROMs (CT 114 Games), damit der Webserver sie ausliefern kann.
| Datei | /etc/cron.d/rom-chmod |
| Inhalt | */2 * * * * root find /mnt/storage/fileserver/data/roms -type f ! -perm 644 -exec chmod 644 {} \; |
Deaktivieren: rm /etc/cron.d/rom-chmod (oder Zeile auskommentieren).
Zweck: Schwere Hintergrund-Jobs in den Wochenend-Nächten ruhig stellen (Lärm/Hitze/Last). Friert per docker pause ein: Tdarr (CT126) + qBittorrent & SABnzbd (CT105).
| Skripte | /usr/local/bin/weekend-night-pause.sh + weekend-night-resume.sh |
| Cron | /etc/cron.d/weekend-night-pause |
| Zeitplan | Pause 00:00, Resume 08:00, an Sa/So/Mo (= Nächte von Fr/Sa/So), Europe/Berlin |
Jellyfin/Streaming + Auto-Updates (4 Uhr) sind NICHT betroffen. Deaktivieren: rm /etc/cron.d/weekend-night-pause. Manuell: /usr/local/bin/weekend-night-resume.sh (falls mal was pausiert hängt).
Zweck: Ersetzt den 5-Minuten-Cron (Punkt 3) für den echten Root-Cause wiederkehrender ACL-Probleme bei Sonarr/Radarr/Lidarr/Jellyfin: Diese Apps legen einen neuen Ordner an und rufen danach chmod darauf auf. Der chmod-Aufruf (nicht das Anlegen selbst!) löst ein attrib-Inotify-Event aus und kappt dabei die ACL-Maske auf r-x — Schreibzugriff ist dann faktisch weg, bis die Maske repariert wird. Vorher passierte das nur alle 5 Minuten per Cron, jetzt reagiert ein Watcher in unter 1 Sekunde.
| Script | /usr/local/bin/watch_media_acl.sh |
| Unit | /etc/systemd/system/media-acl-watch.service |
| Mechanismus | inotifywait -m -e create -e moved_to -e attrib auf allen Medien-/Download-Ordnern (nicht rekursiv, nur direkte Kinder) |
| Ueberwacht | demovies, rumovies, deseries, ruseries, kids, music, downloads/usenet, downloads/torrents |
| Endlosschleifen-Schutz | Vor jedem setfacl wird per getfacl -p \| grep '#effective:' geprüft, ob die Maske überhaupt gekappt ist — nur dann greift der Fix, sonst continue (verhindert, dass der eigene setfacl-Aufruf sich selbst per neuem attrib-Event retriggert) |
Betroffene UIDs (fest im Script kodiert): u:995 (Radarr), u:996 (Sonarr), u:994 (Lidarr), u:100110 (Jellyfin).
[!WARNING]
UID-Falle, live gefunden 2026-07-16: Jellyfin (CT101) ist ein unprivilegierter LXC-Container — dessen interne UID 110 läuft auf dem Host real als UID 100110 (Proxmox verschiebt bei unprivilegierten Containern automatisch um +100000). Das Script trug ursprünglich fälschlichu:110ein (die unverschobene UID) → Jellyfin hatte dadurch nie echte Schreib-/Löschrechte auf Filme/Serien, nur Lesezugriff über die allgemeine „other"-Berechtigung. Fix:u:110→u:100110infix_media_acl.shUNDwatch_media_acl.sh, einmaligfix_media_acl.shmanuell laufen lassen (korrigiert auch bestehende Dateien rekursiv), danachsystemctl restart media-acl-watch(der Service liest die ACL-Zeichenkette nur einmal beim Start ins RAM — reines Datei-Edit reicht nicht).Lesson für ähnliche Fälle: Bei ACL-Fixes für Dienste in unprivilegierten Containern immer die reale Host-UID prüfen (
ps aux \| grep <dienst>auf dem Host, nichtid <user>im Container!), nicht die interne Container-UID 1:1 übernehmen. Bei privilegierten Containern (z. B. CT105) gilt dagegen 1:1 (kein Shift) — genau umgekehrt, leicht zu verwechseln.
Status pruefen:
systemctl status media-acl-watch
journalctl -u media-acl-watch -f
Deaktivieren:
systemctl disable --now media-acl-watch
⚠️ Der 5-Minuten-Cron (Punkt 3) bleibt danach als einziger Fallback — Reparaturzeit steigt von <1s auf bis zu 5 Min.
systemctl list-units --type=path # Path-Watcher
systemctl list-timers # Timer (cf-ddns ...)
systemctl status media-acl-watch # Echtzeit-ACL-Watcher
crontab -l # root-Crons
ls /etc/cron.d/ # System-Crons (rom-chmod, weekend-night-pause ...)
Stand: 2026-07-16