diff --git a/CHANGELOG.md b/CHANGELOG.md index 78b98bd..94745f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,35 @@ Die Version steht an genau einer Stelle: `src/netmover/__init__.py`. ## [Unreleased] +## [0.1.1] – 2026-10-10 + +Korrekturen aus dem ersten Praxistest auf einer Debian-13-VM mit echten +SMB-, NFS- und SFTP-Servern. + +### Behoben +- **systemd-Unit:** `ProtectSystem`, `PrivateTmp` und `ProtectControlGroups` + gaben dem Dienst einen eigenen Mount-Namespace. Die Mounts waren für das System + und andere Programme unsichtbar und verschwanden bei jedem Neustart des Dienstes + (`MountFlags=shared` half nicht). Jetzt nur noch Härtungen ohne Namespace. +- **Stabilitätsprüfung:** CIFS lieferte per `stat()` sekundenlang eine veraltete + Größe einer noch wachsenden Datei. Gemessen wird jetzt per `open()` + `fstat()`, + das erzwingt frische Attribute. Gesperrte Dateien gelten als „in Benutzung“. + (Die zweite Sicherung, die Byte-Zählung beim Kopieren, hatte den Fall bereits + abgefangen; es kam keine unvollständige Datei an.) +- **Ausfall länger als die Wiederherstellung (z. B. NAS-Neustart, Stromausfall):** + Von NetMover selbst ausgehängte Anbindungen mit „automatisch einhängen“ werden + jetzt jede Minute erneut eingehängt, auch wenn das Einhängen schon beim + Dienststart scheiterte. Entwarnung per Webhook. Von außen ausgehängte Anbindungen + bleiben weiterhin unangetastet. +- Bei einer Zeitüberschreitung von `mount` wird die ganze Prozessgruppe beendet, damit + `mount.nfs` nicht später doch noch einhängt. +- Hinweistexte zu `mount`-Fehlern werden nicht mehr mitgeschwärzt. +- `install.sh` ohne `debconf`-Warnungen, wenn kein Terminal angeschlossen ist. + +### Dokumentation +- Fehlersuche: verzögert sichtbare Dateien auf CIFS → `nohandlecache`. +- README erklärt, warum die Unit keine Namespace-Härtung nutzt. + ## [0.1.0] – 2026-10-10 Erste Version. @@ -99,5 +128,6 @@ Erste Version. - Löschen von Zugangsdaten, die noch von einem Mount benutzt werden, trennt den Mount nicht mehr stillschweigend ab, sondern wird von der Datenbank abgelehnt. -[Unreleased]: https://git.wilde-server.de/florian.wilde/netmover/compare/v0.1.0...HEAD +[Unreleased]: https://git.wilde-server.de/florian.wilde/netmover/compare/v0.1.1...HEAD +[0.1.1]: https://git.wilde-server.de/florian.wilde/netmover/compare/v0.1.0...v0.1.1 [0.1.0]: https://git.wilde-server.de/florian.wilde/netmover/releases/tag/v0.1.0 diff --git a/DEVLOG.md b/DEVLOG.md index 55e7e89..78398d8 100644 --- a/DEVLOG.md +++ b/DEVLOG.md @@ -13,10 +13,55 @@ Zeiten in Ortszeit (Europe/Berlin). | 2026-10-10 | 19:10 | 19:17 | 0:07 | 4 | Scheduler, Protokoll, Benachrichtigung | | 2026-10-10 | 19:18 | 19:34 | 0:16 | 5 | Weboberfläche und Anmeldung | | 2026-10-10 | 19:40 | 19:50 | 0:10 | 6 | Deployment, README, Release 0.1.0 | -| **Summe** | | | **1:06** | | | +| 2026-10-10 | 21:36 | 22:05 | 0:29 | – | Praxistest auf VM, Release 0.1.1 | +| **Summe** | | | **1:35** | | | --- +## 2026-10-10 · 21:36–22:05 · Praxistest auf der Debian-13-VM, Release 0.1.1 + +**Umgebung** +- KVM-VM `srv-rz-netmover` (10.0.10.223), Debian 13, Python 3.13, 2 GB RAM. +- Installation per `deploy/install.sh` aus einem `git archive` (VM ohne Gitea-Zugang). +- Vorübergehende Testserver auf der VM: Samba (nur `lo`), NFS-Exporte für + `127.0.0.1` (mit/ohne Root-Squash), SFTP-Benutzer `paperless` mit Schlüssel + `restrict,command="/usr/lib/openssh/sftp-server"`. +- Auf Wunsch `NETMOVER_HOST=0.0.0.0`, damit die Oberfläche im LAN erreichbar ist. + +**Bestanden** +- Ersteinrichtung mit Code aus dem Log, Cookie-Flags. +- CIFS (Passwort mit Komma/Ausrufezeichen, Credentials-Datei danach weg), NFS 4, + NFS 3, Root-Squash-Erkennung mit Synology-Hinweis, SFTP mit TOFU (Fingerabdruck + = `ssh-keygen -lf`), echtes OpenSSH liefert `statvfs`. +- Probelauf, Kollision `scan001-1.pdf`, `.txt`/`.part` ignoriert, keine `.part`-Reste, + Eigentümer `paperless` im SFTP-Ziel. +- Langsam wachsende Datei (20 × 50 KB/s): erst nach Ende verschoben, Prüfsumme gleich. +- Kopiermodus rekursiv mit Eigentümer/Modus; zweiter Lauf „2 bereits übertragen“. +- Samba gestoppt: Lebenszeichen 15 s → gestört → 3 Versuche → Fehler, `/healthz` 503, + nichts angefasst. NFS-Server gestoppt (hängender `hard`-Mount): Oberfläche und + andere Regel liefen weiter, Rückkehr automatisch. +- Mounts überstehen Stopp/Start des Dienstes (gleiche Mount-IDs). +- Neustart der VM: NFS sofort, SMB per Neuversuch nach ~1 min, Regel läuft weiter. + +**Gefunden und behoben (v0.1.1)** +1. **systemd-Unit mit eigenem Mount-Namespace** (ProtectSystem/PrivateTmp/…): + Mounts nur im Dienst sichtbar, `shared,slave`. Härtung ohne Namespace. +2. **CIFS-Attribut-Cache**: `stat()` meldete 3 s lang eine veraltete Größe einer + wachsenden Datei; die Byte-Zählung beim Kopieren fing das ab. Jetzt + `open()` + `fstat()` für beide Messungen. +3. **Nach drei gescheiterten Versuchen endgültig aufgegeben** – zu kurz für einen + NAS-Neustart, und beim Booten vor dem NAS kam die Freigabe nie zurück. + Jetzt minütlicher Neuversuch (nur für von NetMover selbst ausgehängte + Anbindungen mit `auto_mount`) plus Scheduler-Job. +4. `mount`-Zeitlimit beendete nur `mount`, nicht `mount.nfs` → später doch + eingehängt. Jetzt ganze Prozessgruppe. +5. Hinweistext wurde mitgeschwärzt; `debconf`-Warnungen in `install.sh`. + +**Nicht nachstellbar** +- Einmalig 46 s Verzögerung direkt nach dem Booten (CIFS-Verzeichnis-Cache bei + lokal statt per SMB angelegter Datei). Messungen danach 9–11 s, mit und ohne + `nohandlecache`. Als Hinweis in die Fehlersuche aufgenommen. + ## 2026-10-10 · 19:40–19:50 · Schritt 6: Deployment, README, Release 0.1.0 **Erledigt** diff --git a/README.md b/README.md index cf5f74d..a89631e 100644 --- a/README.md +++ b/README.md @@ -340,6 +340,7 @@ findmnt -R /mnt/netmover # was ist wirklich eingehängt? | „Hostschlüssel … hat sich geändert“ (SFTP) | Wurde der Zielserver neu aufgesetzt? Dann bei der Anbindung „Hostschlüssel zurücksetzen“ und neu testen. Sonst **nicht** verbinden. | | SFTP: „Anmeldung abgelehnt“ | Öffentlicher Schlüssel fehlt in `authorized_keys`, oder Rechte von `~/.ssh` stimmen nicht (700/600, Eigentümer). | | Paperless bemerkt neue Dateien nicht | Ältere Paperless-Versionen: `PAPERLESS_CONSUMER_POLLING=10` setzen. | +| Neue Dateien erscheinen erst nach bis zu 30 s | Der CIFS-Client speichert Verzeichnislisten zwischen. Gelangen Dateien nicht per SMB aufs NAS (z. B. per FTP vom Scanner), erfährt er nichts davon. Abhilfe: Zusatzoption `nohandlecache`. | | Regel gelb „länger als 3 × Intervall“ | Seit dem Dreifachen des Intervalls kein erfolgreicher Lauf; Protokoll der Regel ansehen. | | Einrichtungscode verloren | `systemctl restart netmover` erzeugt einen neuen. | diff --git a/compose.yml b/compose.yml index 167a313..c1a383d 100644 --- a/compose.yml +++ b/compose.yml @@ -4,7 +4,7 @@ services: netmover: build: . - image: netmover:0.1.0 + image: netmover:0.1.1 container_name: netmover restart: unless-stopped cap_add: diff --git a/src/netmover/__init__.py b/src/netmover/__init__.py index eaec080..4ea7b65 100644 --- a/src/netmover/__init__.py +++ b/src/netmover/__init__.py @@ -1,3 +1,3 @@ """NetMover – NFS/SMB-Mounts verwalten und Dateien zeitgesteuert verschieben.""" -__version__ = "0.1.0" +__version__ = "0.1.1"