From fef90fc0595514b5093b796e89037e78c08f9532 Mon Sep 17 00:00:00 2001 From: Florian Wilde Date: Sat, 10 Oct 2026 23:43:40 +0200 Subject: [PATCH] chore(release): 0.2.0 Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 22 +++++++++++++++--- README.md | 50 +++++++++++++++++++++++++++++++--------- compose.yml | 2 +- src/netmover/__init__.py | 2 +- 4 files changed, 60 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b6dc04..4867a89 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,11 +8,26 @@ Die Version steht an genau einer Stelle: `src/netmover/__init__.py`. ## [Unreleased] +## [0.2.0] – 2026-10-11 + +### Hinzugefügt +- **Schlüsselverwaltung** (Seite „Schlüssel“): SSH-Schlüssel erzeugen (Ed25519) oder + importieren (Ed25519, ECDSA, RSA ≥ 2048 Bit; OpenSSH/PEM, auch mit Passphrase), + Fingerabdruck und `authorized_keys`-Zeile mit SFTP-Beschränkung zum Kopieren, + Umbenennen, Löschen nur wenn unbenutzt. Private Schlüssel werden nie angezeigt. +- SFTP-Anbindungen können einen gespeicherten Schlüssel auswählen; der Benutzername + gehört zur Anbindung (Migration 0002: `credentials.managed`, `mounts.username`). +- **`netmover-update`**: Update aus dem Git-Repo mit Sicherung von Datenbank, + Schlüsseln und Einstellungen, Changelog-Auszug, Neustart und Healthcheck; + Versionswahl, Warnung beim Zurückstufen. +- Installation als Git-Klon unter `/opt/netmover/src`; `install.sh` installiert + `git` und das Update-Skript. + ### Geändert -- SFTP-Anbindungen gelten nach erfolgreichem Test als „erreichbar“ (vorher bis - zum ersten Regellauf „nicht geprüft“). - Klartext-Hinweis bei `mount error(95)` (keine gemeinsame SMB-Version) mit Synology-Einstellung; aufgefallen bei der Anbindung des echten NAS. +- SFTP-Anbindungen gelten nach erfolgreichem Test als „erreichbar“ (vorher bis + zum ersten Regellauf „nicht geprüft“). ## [0.1.1] – 2026-10-10 @@ -134,6 +149,7 @@ 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.1...HEAD +[Unreleased]: https://git.wilde-server.de/florian.wilde/netmover/compare/v0.2.0...HEAD +[0.2.0]: https://git.wilde-server.de/florian.wilde/netmover/compare/v0.1.1...v0.2.0 [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/README.md b/README.md index ea945b4..12913b0 100644 --- a/README.md +++ b/README.md @@ -47,15 +47,36 @@ heißt deshalb immer **kopieren, prüfen, dann erst die Quelle löschen**: ```bash apt install -y git -git clone https://git.wilde-server.de/florian.wilde/netmover.git -cd netmover -sudo ./deploy/install.sh +git clone https://git.wilde-server.de/florian.wilde/netmover.git /opt/netmover/src +cd /opt/netmover/src && git checkout "$(git tag -l 'v*' --sort=-v:refname | head -n 1)" +./deploy/install.sh ``` -Das Skript installiert `python3-venv`, `cifs-utils` und `nfs-common` und richtet -NetMover in `/opt/netmover/venv` ein. Danach installiert es -[`deploy/netmover.service`](deploy/netmover.service) und startet den Dienst. -Ein Update ist derselbe Aufruf nach einem `git pull`. +Das Skript installiert `python3-venv`, `cifs-utils`, `nfs-common` und `git`. Es +richtet NetMover in `/opt/netmover/venv` ein, installiert +[`deploy/netmover.service`](deploy/netmover.service) und das Update-Skript +`netmover-update` und startet den Dienst. + +### Update + +```bash +netmover-update # auf die neueste Version +netmover-update --list # verfügbare Versionen +netmover-update v0.2.0 # bestimmte Version +``` + +`netmover-update` geht so vor: +1. Neue Versions-Tags aus Gitea holen und die Änderungen laut Changelog anzeigen. +2. **Datenbank, `secret.key` und Einstellungen nach `/var/backups/netmover/` sichern** + (die letzten 10 bleiben). +3. Die Version auschecken, installieren und den Dienst neu starten. Neue + Datenbank-Migrationen laufen dabei automatisch. +4. `/healthz` prüfen. + +Die Mounts bleiben die ganze Zeit eingehängt. Geht etwas schief, nennt das Skript +die Befehle, um die Sicherung zurückzuspielen und zur vorherigen Version zu wechseln. +**Zurückstufen** auf eine ältere Version geht nur mit der Datenbank-Sicherung von +vor dem Update, wenn das Update eine Migration enthielt; das Skript fragt deshalb nach. Was wo liegt: @@ -149,11 +170,18 @@ Lege in NetMover die *Anbindung → Neue Anbindung* an: | Typ | SFTP (nur Ziel) | | Server / SSH-Port | IP des LXC / `22` | | Freigabe / Pfad | `/opt/paperless_data/consume` | -| Anmeldeart | SSH-Schlüssel (NetMover erzeugt ihn) | +| Anmeldeart | SSH-Schlüssel | +| Schlüssel | einen gespeicherten Schlüssel wählen (siehe unten) oder „neuer Schlüssel nur für diese Anbindung“ | | Benutzername | `paperless` (der Benutzer, unter dem Paperless läuft) | -Nach dem Speichern zeigt NetMover den **öffentlichen Schlüssel**. Trage ihn im LXC -ein, und zwar so, dass der Schlüssel **nur SFTP** darf: +**Schlüsselverwaltung:** Unter *Schlüssel* erzeugst du Ed25519-Schlüssel oder +importierst vorhandene (Ed25519, ECDSA, RSA ≥ 2048 Bit; OpenSSH- oder PEM-Format, +auch mit Passphrase). Ein Schlüssel kann von mehreren Anbindungen genutzt werden; den +Benutzernamen legt jede Anbindung selbst fest. Private Schlüssel liegen verschlüsselt +in der Datenbank und werden nie angezeigt. Die Seite zeigt den Fingerabdruck und eine +fertige `authorized_keys`-Zeile zum Kopieren. + +Trage den öffentlichen Schlüssel im LXC so ein, dass er **nur SFTP** darf: ```bash # im Paperless-LXC als root @@ -389,7 +417,7 @@ Aufbau: | `mounting/` | `MountBackend` (Linux/Fake), Mount-Verwaltung, Test, Wiederherstellung, SFTP | | `mover/` | Scan, Stabilität, atomares Schreiben, Kollisionen, Buchführung, Regellauf | | `runs.py`, `scheduler.py`, `health.py`, `notify.py` | Protokoll, Zeitsteuerung, Gesundheit, Webhook | -| `admin.py`, `transfer.py`, `web/` | Formulare, Export/Import, Oberfläche | +| `admin.py`, `keys.py`, `transfer.py`, `web/` | Formulare, Schlüsselverwaltung, Export/Import, Oberfläche | Die gesamte Mover-Logik ist mit dem `FakeMountBackend` ohne root testbar. SFTP wird gegen einen echten SFTP-Server im Testprozess getestet. diff --git a/compose.yml b/compose.yml index c1a383d..a09fbeb 100644 --- a/compose.yml +++ b/compose.yml @@ -4,7 +4,7 @@ services: netmover: build: . - image: netmover:0.1.1 + image: netmover:0.2.0 container_name: netmover restart: unless-stopped cap_add: diff --git a/src/netmover/__init__.py b/src/netmover/__init__.py index 4ea7b65..1e0ec26 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.1" +__version__ = "0.2.0"