feat: Sync/Clone-Modus, Rotation, --setup Deployment, Scheduler-Fix, Dashboard-Updates, README

This commit is contained in:
Björn Nehlsen
2026-08-11 22:45:58 +02:00
parent 2eee55384e
commit a495570b20
14 changed files with 3851 additions and 681 deletions
+152 -92
View File
@@ -1,101 +1,161 @@
# StFV Backup
## Modulares Python-Startsystem
Flask-basierte Backup-Verwaltung für SMB, LOCAL, FTP und SFTP – mit Web-UI, Zeitplan-Steuerung und Sync/Clone-Modus.
Das Projekt ist jetzt in moderne, klar getrennte Module aufgeteilt:
---
- app/app_runner.py: Orchestrierung des kompletten Startablaufs
- app/venv_manager.py: .venv-Pruefung, Erstellung und Re-Exec
- app/dependencies.py: requirements-Parsing und Installation fehlender Pakete
- app/config_store.py: SQLite-Schema, Laden und Speichern der Konfiguration
- app/setup_wizard.py: Interaktive Erfassung von Erstkonfiguration
- app/security.py: Passwort-Hashing und Verifikation
- app/ui.py: Frische Konsolen-Ausgabe mit klaren Statusfarben
- app/paths.py: Zentrale Pfadverwaltung
### Startlogik
- Start ausserhalb von .venv: automatische Erstellung und Neustart in .venv
- requirements.txt wird geprueft, fehlende Pakete werden installiert
- SQLite unter data/config.db wird geprueft/erstellt
- Falls Konfiguration fehlt oder unvollstaendig ist, startet das Setup fuer:
- IP
- Port
- Debug (true/false)
- Adminuser
- Adminpassword
### Bedeutung der Felder
- IP, Port, Debug: Laufzeitkonfiguration fuer den Flask-Webserver.
- Adminuser, Adminpassword: Zugangsdaten fuer den Admin-Login im Browser.
Sicherheitsaspekt:
- Das Passwort wird verdeckt eingegeben und ausschliesslich als PBKDF2-SHA256-Hash gespeichert.
- Eine Verifikationsfunktion fuer Login-Checks ist vorbereitet.
### Browserzugriff
- Nach dem Start laeuft Flask auf der konfigurierten Adresse, z. B. http://127.0.0.1:5000
- Der Root-Pfad leitet auf /login um.
- Erfolgreiche Anmeldung fuehrt auf /dashboard.
### Admin-Menue
Nach dem Login stehen folgende Menuepunkte bereit:
- Dashboard: Liste der eingerichteten Backups mit letztem Lauf und Groesse
- Neues Backup: SMB-Quelle/Ziel, Unterpfade, Target-Muster, Kompression und Verschluesselung
- Server Settings: IP, Port und Debug fuer den Flask-Webserver
- Admin Konto: Eigenen Admin-Benutzer und Passwort aendern
- Benutzer: Neue Benutzer anlegen (optional mit Adminrechten)
### Backup-Konfiguration (aktuell)
- Source/Destination starten mit einem Typ-Dropdown: SMB, LOCAL, FTP, SFTP
- Je nach Typ werden nur die passenden Felder eingeblendet
- Source: Verbindungs-Testbutton pro Konfiguration
- Destination: Verbindungs-Testbutton pro Konfiguration
- SMB Browser: Verzeichnisse fuer Source und Destination direkt durchklickbar
- Target: Frei definierbares Muster, z. B. backup_{date}_{time}
- Kompression: zip, tar.gz, tar.bz2, tar.xz, 7z
- Archiv-Passwort: wird verschluesselt gespeichert
- SMB-Passwoerter: werden verschluesselt gespeichert
### Geplante Backup-Module
Das Dashboard ist auf den Ausbau fuer mehrere Zielsysteme vorbereitet:
- Nextcloud
- Unraid
- MS SQL (z. B. auf Win11 VM)
- Transport-Protokolle wie FTP, SFTP, SMB, NFS
### Service fuer direkten Browser-Test
Damit der Server dauerhaft laeuft und du direkt im Browser testen kannst:
```bash
./scripts/service.sh install
./scripts/service.sh start
```
Nutzliche Befehle:
```bash
./scripts/service.sh status
./scripts/service.sh restart
./scripts/service.sh stop
./scripts/service.sh logs
./scripts/service.sh enable
```
Service-Datei im Projekt:
- deploy/systemd/nextcloud-backup.service
### Start
## Schnellstart
```bash
# Einmalig: Venv anlegen, Abhängigkeiten installieren, Ersteinrichtung starten
python3 main.py
# Deployment auf einem Linux-Server (systemd)
python3 main.py --setup
systemctl --user enable nextcloud-backup
systemctl --user start nextcloud-backup
```
Nach dem Start ist die Oberfläche erreichbar unter:
`http://<IP>:<Port>/` (Standard: `http://127.0.0.1:5001/`)
---
## Deployment auf Oracle Linux / RHEL
### Voraussetzungen
```bash
sudo dnf install python3 python3-pip git -y
# Service soll auch ohne aktive Login-Session laufen
sudo loginctl enable-linger $USER
```
### Projekt klonen und einrichten
```bash
git clone https://gitea.example.com/user/stfv-backup.git ~/stfv-backup
cd ~/stfv-backup
python3 main.py --setup
```
`--setup` erledigt automatisch:
1. Virtuelle Umgebung unter `.venv/` anlegen
2. Abhängigkeiten installieren
3. systemd-User-Service unter `~/.config/systemd/user/nextcloud-backup.service` schreiben (mit echten Pfaden)
4. `systemctl --user daemon-reload` ausführen
### Service aktivieren
```bash
systemctl --user enable nextcloud-backup
systemctl --user start nextcloud-backup
systemctl --user status nextcloud-backup
journalctl --user -u nextcloud-backup -f
```
### Beim ersten Start
Beim allerersten Aufruf ohne Konfiguration fragt das System interaktiv ab:
- IP und Port des Flask-Servers
- Admin-Benutzername und Passwort (wird als PBKDF2-SHA256-Hash gespeichert)
---
## Funktionsübersicht
### Backup-Modi
| Modus | Verhalten |
|---|---|
| **Vollständig** | Alle Dateien aus der Quelle werden jedes Mal übertragen |
| **Sync** | Nur neue oder geänderte Dateien (Vergleich per Größe + mtime) |
| **Clone** | Wie Sync, zusätzlich werden Dateien im Ziel gelöscht die in der Quelle nicht mehr existieren |
### Unterstützte Protokolle
- **SMB** – mit integriertem Verzeichnis-Browser und Ordner-Erstellung
- **LOCAL** – lokales Dateisystem mit Browser und Ordner-Erstellung
- **FTP** – mit konfigurierbarem Port (Standard: 21)
- **SFTP** – SSH-basiert (Standard-Port: 22)
### Zeitplan
- CRON-Ausdruck frei definierbar (z. B. `0 2 * * *` für täglich um 02:00 Uhr)
- CRON-Vorschau im Wizard zeigt den nächsten geplanten Zeitpunkt
- Leer lassen = nur manuelles Backup möglich
- „Nächster Lauf" im Dashboard wird nach jedem Backup automatisch aktualisiert
### Rotation
- Anzahl aufzubewahrender Backups konfigurierbar
- `0` = unbegrenzt (keine automatische Löschung)
- Nur bei Modus **Vollständig** verfügbar (Sync/Clone verwalten den Zustand selbst)
### Kompression & Verschlüsselung
| Methode | Unterstützt |
|---|---|
| Keine (1:1 Kopie) | ✅ |
| zip | ✅ |
| tar.gz / tar.bz2 / tar.xz | ✅ |
| 7z | ✅ (py7zr erforderlich) |
| AES-256 Archiv-Passwort | ✅ |
### Sicherheit
- Passwörter werden nie im Klartext gespeichert
- Benutzerpasswörter: PBKDF2-SHA256
- Verbindungspasswörter: AES-verschlüsselt in der Datenbank
- Session-basierter Login mit Rollen (Admin / Benutzer)
---
## Projektstruktur
```
main.py # Einstiegspunkt; --setup für Deployment
app/
app_runner.py # Bootstrap, Setup-Logik, systemd-Installation
web_server.py # Flask-Routen, Backup-Ausführung, Scheduler
config_store.py # SQLite-Schema, Migrationen, CRUD
config_model.py # Dataclasses
remote_targets.py # Verbindungstests, Browser-Helfer
setup_wizard.py # Interaktive Erstkonfiguration (CLI)
venv_manager.py # Venv-Prüfung und Re-Exec
dependencies.py # Paketinstallation
security.py # Passwort-Hashing
paths.py # Zentrale Pfadverwaltung
ui.py # Konsolenausgabe
templates/ # Jinja2-Templates (Dashboard, Wizard, ...)
data/
config.db # SQLite-Datenbank (wird automatisch angelegt)
deploy/
systemd/
nextcloud-backup.service # Vorlage; --setup schreibt echte Pfade
scripts/
service.sh # Manuelle Service-Verwaltung (Alternative zu --setup)
requirements.txt
```
---
## Service manuell verwalten
```bash
./scripts/service.sh install # Service-Datei installieren + daemon-reload
./scripts/service.sh start
./scripts/service.sh stop
./scripts/service.sh restart
./scripts/service.sh status
./scripts/service.sh logs
./scripts/service.sh enable # Autostart aktivieren
./scripts/service.sh disable
```
---
## Anforderungen
- Python 3.10+
- Abhängigkeiten: siehe `requirements.txt` (werden beim Start automatisch installiert)