diff --git a/config/scripts/backup.sh b/config/scripts/backup.sh new file mode 100644 index 00000000..6e5e552b --- /dev/null +++ b/config/scripts/backup.sh @@ -0,0 +1,42 @@ +#!/bin/bash +# ========================================== +# Meldestelle Backup Script +# Sichert Datenbanken und Konfigurationen +# ========================================== + +# Konfiguration +BACKUP_DIR="/home/grandmo/backups/meldestelle" +DATE=$(date +%Y-%m-%d_%H-%M-%S) +RETENTION_DAYS=7 +PROJECT_NAME="meldestelle" + +# Container Namen (müssen mit docker-compose übereinstimmen) +DB_CONTAINER="${PROJECT_NAME}-postgres" +DB_USER="meldestelle" # Oder aus .env lesen + +# Verzeichnisse erstellen +mkdir -p "$BACKUP_DIR" + +echo "🚀 Starte Backup: $DATE" + +# 1. PostgreSQL Dump +echo " -> Erstelle Datenbank-Dump..." +if docker exec "$DB_CONTAINER" pg_dumpall -U "$DB_USER" > "$BACKUP_DIR/db_dump_$DATE.sql"; then + echo " ✅ DB Dump erfolgreich." + gzip "$BACKUP_DIR/db_dump_$DATE.sql" +else + echo " ❌ FEHLER beim DB Dump!" + # Optional: Mail senden oder Exit Code setzen +fi + +# 2. Konfigurations-Dateien sichern (.env ist kritisch!) +echo " -> Sichere Konfigurationen..." +tar -czf "$BACKUP_DIR/config_$DATE.tar.gz" .env docker-compose.yaml dc-*.yaml config/ + +# 3. Alte Backups löschen (Rotation) +echo " -> Lösche Backups älter als $RETENTION_DAYS Tage..." +find "$BACKUP_DIR" -name "db_dump_*.sql.gz" -mtime +$RETENTION_DAYS -delete +find "$BACKUP_DIR" -name "config_*.tar.gz" -mtime +$RETENTION_DAYS -delete + +echo "✅ Backup abgeschlossen: $BACKUP_DIR" +ls -lh "$BACKUP_DIR" | grep "$DATE" diff --git a/docs/07_Infrastructure/Guides/Setup_Backup_Zora.md b/docs/07_Infrastructure/Guides/Setup_Backup_Zora.md new file mode 100644 index 00000000..8a1b6e47 --- /dev/null +++ b/docs/07_Infrastructure/Guides/Setup_Backup_Zora.md @@ -0,0 +1,103 @@ +--- +type: Guide +status: ACTIVE +owner: DevOps Engineer +last_update: 2026-03-05 +tags: [backup, postgres, zora, cron] +--- + +# 🛡️ Guide: Automatisierte Backups auf Zora + +Dieser Guide beschreibt, wie du regelmäßige Backups der Meldestelle-Datenbank und Konfigurationen auf Zora einrichtest. + +## 📋 Voraussetzungen + +* SSH-Zugriff auf Zora (`ssh user@10.0.0.xx`). +* Docker-Container `meldestelle-postgres` läuft. +* Das Skript `config/scripts/backup.sh` liegt im Repo. + +--- + +## 🛠️ Schritt-für-Schritt Anleitung + +### 1. Backup-Skript vorbereiten + +Das Skript liegt bereits im Repo unter `config/scripts/backup.sh`. +Du musst es auf Zora ausführbar machen und ggf. anpassen. + +1. Verbinde dich mit Zora: + ```bash + ssh user@zora-ip + cd ~/meldestelle + ``` + +2. Mache das Skript ausführbar: + ```bash + chmod +x config/scripts/backup.sh + ``` + +3. **WICHTIG:** Prüfe die Variablen im Skript (`nano config/scripts/backup.sh`): + * `BACKUP_DIR`: Wohin sollen die Backups? (Standard: `/home/grandmo/backups/meldestelle`) + * `DB_CONTAINER`: Name des Postgres-Containers (Standard: `meldestelle-postgres`). + * `DB_USER`: Datenbank-User (Standard: `meldestelle`). + +### 2. Cronjob einrichten (Automatische Ausführung) + +Wir wollen das Backup jede Nacht um 03:00 Uhr laufen lassen. + +1. Öffne die Crontab des Users: + ```bash + crontab -e + ``` + +2. Füge folgende Zeile am Ende hinzu: + ```cron + # Meldestelle Backup: Täglich um 03:00 Uhr + 0 3 * * * /home/grandmo/meldestelle/config/scripts/backup.sh >> /home/grandmo/meldestelle/logs/backup.log 2>&1 + ``` + +3. Speichern und schließen (`Ctrl+O`, `Enter`, `Ctrl+X`). + +### 3. Testen + +Führe das Skript einmal manuell aus, um sicherzustellen, dass alles klappt: + +```bash +./config/scripts/backup.sh +``` + +* Prüfe den Output: "✅ Backup abgeschlossen". +* Prüfe das Backup-Verzeichnis: `ls -lh /home/grandmo/backups/meldestelle`. + +--- + +## 🔄 Wiederherstellung (Restore) + +Falls der Ernstfall eintritt (Datenbank korrupt oder gelöscht): + +1. Stoppe die App-Container (aber lasse die DB laufen): + ```bash + docker compose stop api-gateway ping-service keycloak + ``` + +2. Entpacke das Backup: + ```bash + gunzip /home/grandmo/backups/meldestelle/db_dump_YYYY-MM-DD.sql.gz + ``` + +3. Spiele den Dump ein: + ```bash + cat db_dump_YYYY-MM-DD.sql | docker exec -i meldestelle-postgres psql -U meldestelle + ``` + +4. Starte die App wieder: + ```bash + docker compose up -d + ``` + +--- + +## 💡 Tipps + +* **Offsite-Backup:** Kopiere die Backups regelmäßig auf einen externen Speicher (z.B. NAS oder Cloud), falls die Festplatte von Zora ausfällt. `rsync` ist dein Freund! +* **Monitoring:** Prüfe regelmäßig die Log-Datei `logs/backup.log`, ob Fehler auftreten.