diff --git a/%DATEI% b/%DATEI% new file mode 100644 index 0000000..17d71c7 --- /dev/null +++ b/%DATEI% @@ -0,0 +1 @@ +x diff --git a/backup/vps-db-backup.cmd b/backup/vps-db-backup.cmd new file mode 100644 index 0000000..ee3ad59 --- /dev/null +++ b/backup/vps-db-backup.cmd @@ -0,0 +1,49 @@ +@echo off +rem ============================================================ +rem Hinterstein Mieterportal - Datenbank-Backup auf D:\VPS_Backup +rem Holt ein pg_dump vom VPS (Container mp-db) und legt es lokal +rem als gzip ab. Aufbewahrung: 14 Tage (forfiles). +rem Laeuft ueber Aufgabenplanung (taeglich 03:17 Uhr, Benutzer ah, +rem nur bei angemeldetem Benutzer - Z:-Laufwerk mit SSH-Key noetig). +rem Achtung: Keine Klammern in Echo-Texten innerhalb von IF-Bloecken +rem (wuerden den Block vorzeitig schliessen) - daher Labels statt Blöcke. +rem ============================================================ +setlocal +set ZIEL=D:\VPS_Backup\mieterportal +set PLINK=C:\Program Files\PuTTY\plink.exe +set HOSTKEY=SHA256:4G3UxsugNkHH6BrPXScLXh+vX8P1sLgWKn8cZBKSRxw +set KEY=Z:\Devel\ssh\priv_ionos_hocks_vps.ppk +set PORT=38592 +set SERVER=root@hocks.eu +set LOG=%ZIEL%\backup.log + +if not exist "%ZIEL%" mkdir "%ZIEL%" + +for /f %%d in ('powershell -NoProfile -Command "Get-Date -Format yyyy-MM-dd"') do set DATUM=%%d +set DATEI=%ZIEL%\mieterportal-db-%DATUM%.sql.gz + +echo [%DATE% %TIME%] Backup startet nach %DATEI% >> "%LOG%" +"%PLINK%" -batch -hostkey "%HOSTKEY%" -i "%KEY%" -P %PORT% %SERVER% "docker exec mp-db sh -c 'pg_dump -U mp -d mieterportal | gzip -9'" > "%DATEI%" +if errorlevel 1 goto :fehler_plink + +for %%S in ("%DATEI%") do set GROESSE=%%~zS +if %GROESSE% LSS 10000 goto :fehler_klein + +rem Aufbewahrung: Dateien aelter als 14 Tage loeschen +forfiles /p "%ZIEL%" /m mieterportal-db-*.sql.gz /d -14 /c "cmd /c del @path" 2>nul + +echo [%DATE% %TIME%] OK: %GROESSE% Bytes, Aufraeumen abgeschlossen >> "%LOG%" +endlocal +exit /b 0 + +:fehler_plink +echo [%DATE% %TIME%] FEHLER: plink oder pg_dump lieferte Exitcode 1 oder hoeher >> "%LOG%" +if exist "%DATEI%" del "%DATEI%" +endlocal +exit /b 1 + +:fehler_klein +echo [%DATE% %TIME%] FEHLER: Dump zu klein ^(%GROESSE% Bytes^) - vermutlich Fehlerausgabe statt Dump >> "%LOG%" +del "%DATEI%" +endlocal +exit /b 1 diff --git a/kimi.md b/kimi.md index be4b867..5b8cbcd 100644 --- a/kimi.md +++ b/kimi.md @@ -189,6 +189,14 @@ tar -czf mp-dist.tar.gz -C dist . ## 8. Verlauf / offene Punkte +**Erledigt 02.10. (v1.5):** Lokales Datenbank-Backup: `backup/vps-db-backup.cmd` +holt nächtlich (Aufgabenplanung „Mieterportal DB-Backup", täglich 03:17 Uhr, +Benutzer ah, interaktiv) per plink ein `pg_dump | gzip` vom Container mp-db und +legt es nach `D:\VPS_Backup\mieterportal\mieterportal-db-YYYY-MM-DD.sql.gz` +(14-tägige Aufbewahrung via forfiles, Log: `backup.log`). Probelauf OK +(11 KB, Dump-Format geprüft). Einschränkung: läuft nur, wenn der Rechner an +und Benutzer ah angemeldet ist (Z:-Laufwerk mit dem SSH-Key, Pageant). + **Erledigt 02.10. (v1.0):** Portal komplett neu aufgesetzt (5 Module, Mieter-/Verwaltungsansicht, KI-Branding: Logo/Hero/Illustration), Docker-Setup (Dockerfile, nginx, compose), Repo in git.hocks.eu angelegt, Deploy-Workflow + Dark Mode + beispieldaten.py aus dem @@ -244,10 +252,12 @@ Zustellung an axel@hocks.eu status=sent, Test-Ticket bereinigt. - Zertifikatserneuerung prüfen (per 01.12.2026): NPM-Renewer sollte cert 9 über HTTP-Challenge erneuern; sonst certbot/webroot + Kopie nach npm-9 wiederholen. - Demo-Empfängeradressen der Mieter (example.de) durch echte ersetzen, sobald bekannt. +- Backup ggf. serverseitig ergänzen (zweite Sicherungslinie, falls lokaler Rechner + nachts aus ist), Backup-Wiederherstellung einmal testen. - Sicherheit für Produktion: Passwort-Hash serverseitig salten (bcrypt/argon2), CSRF-Token, Rate-Limiting auf /api/auth/login. -- Mögliche nächste Schritte: Datenbank-Backup-Job (nächtlicher pg_dump), E-Mail-Verifizierung - bei Registrierung, dokumenten-Download mit echten Dateien. +- Mögliche nächste Schritte: E-Mail-Verifizierung bei Registrierung, Dokumenten-Download + mit echten Dateien. ## 9. Sonstiges