diff --git a/CHANGELOG.md b/CHANGELOG.md index 3cdaf79..78b98bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,10 @@ Die Version steht an genau einer Stelle: `src/netmover/__init__.py`. ## [Unreleased] +## [0.1.0] – 2026-10-10 + +Erste Version. + ### Hinzugefügt - Projektgerüst (Python ≥ 3.12, FastAPI-Stack, src-Layout, ruff, mypy strict, pytest). - Datenmodell mit SQLAlchemy 2.x: `credentials`, `mounts`, `rules`, `runs`, @@ -67,6 +71,13 @@ Die Version steht an genau einer Stelle: `src/netmover/__init__.py`. auch für Anbindungen, deren Wiederherstellung scheitert. - Dienststart: Migration → Schlüssel → Anbindungen wiederherstellen → Scheduler; beim Beenden werden Mounts nicht ausgehängt. +- Endname lokal per `renameat2(RENAME_NOREPLACE)`: echtes `rename` (Watcher sehen + `IN_MOVED_TO`), trotzdem nie überschreibend; Rückfall auf `link` + `unlink`. +- Deployment: systemd-Unit (`ProtectSystem=full`, `MountFlags=shared`), + Installationsskript für Debian 13, `Dockerfile` und `compose.yml` mit + `rshared`-Propagation. +- README mit Installation, Synology→Paperless-Beispiel (SMB-Quelle, SFTP-Ziel), + Docker, Reverse Proxy, Konfiguration, Fehlersuche und Sicherheitshinweisen. - Weboberfläche (FastAPI, Jinja2, HTMX ohne Build-Schritt, handyfähig, Hell/Dunkel): Status, Anbindungen, Regeln, Protokoll, Einstellungen. - Ersteinrichtung mit Pflicht-Passwort (≥ 10 Zeichen) und einmaligem @@ -87,3 +98,6 @@ Die Version steht an genau einer Stelle: `src/netmover/__init__.py`. Session stand (Session erkennt nur Neuzuweisungen als Änderung). - 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 +[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 70c9236..55e7e89 100644 --- a/DEVLOG.md +++ b/DEVLOG.md @@ -12,10 +12,42 @@ Zeiten in Ortszeit (Europe/Berlin). | 2026-10-10 | 18:53 | 19:07 | 0:14 | 3 | Mover-Logik | | 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 | -| **Summe** | | | **0:56** | | | +| 2026-10-10 | 19:40 | 19:50 | 0:10 | 6 | Deployment, README, Release 0.1.0 | +| **Summe** | | | **1:06** | | | --- +## 2026-10-10 · 19:40–19:50 · Schritt 6: Deployment, README, Release 0.1.0 + +**Erledigt** +- `deploy/netmover.service`, `deploy/netmover.env`, `deploy/install.sh`, + `Dockerfile` (python:3.12-slim-trixie, mehrstufig), `compose.yml`, `.dockerignore`. +- README vollständig; `LICENSE` (MIT, wie seit Schritt 1 in `pyproject.toml`). +- Version 0.1.0, Changelog-Abschnitt, Tag `v0.1.0`. + +**Geprüft** +- Wheel enthält Templates, statische Dateien und Migrationen. +- Docker-Image gebaut; Container startet, `/healthz` = 200, `mount.cifs` 7.4 und + `mount.nfs` vorhanden. **Propagation getestet:** tmpfs im Container unter + `/mnt/netmover` eingehängt → mit `rshared` auf dem Host sichtbar, ohne nicht. +- `systemd-analyze verify` der Unit ohne Beanstandung. Ein echter Start der Unit + als root (insb. `MountFlags=shared` mit `ProtectSystem`) war hier nicht möglich → + beim ersten Einsatz mit `findmnt -R /mnt/netmover` prüfen. + +**Entscheidungen** +- Paperless-ngx-Consumer geprüft: nutzt `watchfiles` (`Change.added`) plus + 5-Minuten-Rescan – erkennt also auch per `link()` erzeugte Dateien. Für Watcher, + die nur `IN_MOVED_TO`/`IN_CLOSE_WRITE` kennen, trotzdem auf + `renameat2(RENAME_NOREPLACE)` umgestellt (entspricht der Vorgabe `os.replace`, + ohne die Garantie „nie überschreiben“ aufzugeben). +- Härtung der Unit bewusst zurückhaltend (keine `CapabilityBoundingSet`, kein + `ProtectKernelModules`): ungetestete Einschränkungen könnten Mounten brechen + (z. B. NFS mit privilegiertem Quellport, Modul-Autoload für cifs). +- SFTP-Schlüssel im README per `restrict,command="…/sftp-server"` auf SFTP beschränkt. + +**Offen für später** +- Erster Praxistest auf der Ziel-VM mit echtem Synology-NAS und Paperless-LXC. + ## 2026-10-10 · 19:18–19:34 · Schritt 5: Weboberfläche und Anmeldung **Erledigt** diff --git a/src/netmover/__init__.py b/src/netmover/__init__.py index 1187258..eaec080 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.dev0" +__version__ = "0.1.0"