feat: Sync/Clone-Modus, Rotation, --setup Deployment, Scheduler-Fix, Dashboard-Updates, README
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user