backup-automation/README.md

9.7 KiB

Backup-Automation für MBO-Tech-IT

Integriertes Backup-System basierend auf Netbox-Inventar, Kestra-Automation, Borg Backup und Hetzner S3.

📋 Architektur-Übersicht

┌─────────────────────────────────────────────────────────────┐
│ Kestra (kestra.pve.mbo-tech-it.de)                         │
│ • Tägliche Abfrage von Netbox (TAG: backup=true)          │
│ • Trigger Ansible auf allen markierten Hosts              │
└─────────────────────────────────────────────────────────────┘
                            ↓
┌─────────────────────────────────────────────────────────────┐
│ Ansible Playbook (install-borg-client.yaml)               │
│ • Install Borg, SSH-Keys, Backup-Scripts                  │
│ • Systemd Timer für regelmäßige Backups (03:00 Uhr)       │
└─────────────────────────────────────────────────────────────┘
                            ↓
┌─────────────────────────────────────────────────────────────┐
│ Backup-Clients (alle gekennzeichneten Systeme)            │
│ • Borg Backup-Script läuft täglich um 03:00               │
│ • Docker Pre-Backup Hooks (MySQL, PostgreSQL, Volumes)    │
│ • SSH zu Backup-Server: backup@{BACKUP_SERVER_HOSTNAME} │
└─────────────────────────────────────────────────────────────┘
                            ↓
┌─────────────────────────────────────────────────────────────┐
│ Backup-Server ({BACKUP_SERVER_HOSTNAME})                 │
│ Struktur: /backup/repos/{hostname}/                        │
│ • Zentrale Borg-Repositories pro Host                      │
│ • SSH-Zugang nur für borg serve (restricted)              │
└─────────────────────────────────────────────────────────────┘
                            ↓
┌─────────────────────────────────────────────────────────────┐
│ Rclone Sync (täglich 04:00)                                │
│ Struktur: s3://mbo-backups/production/repos/{hostname}/    │
└─────────────────────────────────────────────────────────────┘
                            ↓
┌─────────────────────────────────────────────────────────────┐
│ Hetzner S3 Storage                                         │
│ Offsite-Backup mit Versionierung & Redundanz              │
└─────────────────────────────────────────────────────────────┘

🚀 Quick Start

1. Netbox vorbereiten

Füge das TAG backup mit Wert true zu allen Systemen hinzu, die gebackuped werden sollen:

# Via Netbox UI oder API:
curl -X POST https://netbox.mbo-tech-it.de/api/extras/tags/ \
  -H "Authorization: Token YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "backup",
    "slug": "backup",
    "description": "System sollte gebackuped werden"
  }'

2. Git-Repository clonen

git clone https://gitea.mbo-tech-it.de/jonny/backup-automation.git
cd backup-automation

3. Backup-Server vorbereiten

# SSH auf Backup-Server
ssh root@{BACKUP_SERVER_HOSTNAME}

# Ansible Playbook ausführen
ansible-playbook -i localhost, \
  ansible/playbooks/configure-backup-server.yaml \
  -e "hetzner_s3_access_key=YOUR_KEY" \
  -e "hetzner_s3_secret_key=YOUR_SECRET"

4. Kestra-Workflow hochladen

# Workflow in Kestra hochladen
curl -X POST https://kestra.pve.mbo-tech-it.de/api/v1/flows \
  -H "Content-Type: application/yaml" \
  -d @kestra/workflows/backup-provision.yaml

5. Secrets in Kestra setzen

Settings → Secrets:
- NETBOX_TOKEN: (dein Netbox API Token)
- NETBOX_URL: https://netbox.mbo-tech-it.de

📖 Dateien & Funktionen

Datei Beschreibung
kestra/workflows/backup-provision.yaml Hauptworkflow: Netbox→Ansible
ansible/playbooks/install-borg-client.yaml Installation auf Clients
ansible/playbooks/configure-backup-server.yaml Backup-Server Setup
scripts/borg-backup.sh Backup-Ausführung pro Host
scripts/pre-backup-docker.sh Docker-spezifische Dumps
rclone-sync.service S3-Synchronisierung

🔒 Security Considerations

  1. SSH-Keys: Ed25519-Keys für Borg-Zugriff

    • Private Keys: /root/.ssh/mbo-backup-key.ed25519 (auf Clients)
    • Public Keys: authorized_keys auf Backup-Server mit restrict,command=...
  2. Borg Encryption: AES256-CTR mit Passphrases

    • Passphrase sollte in Ansible Vault gespeichert sein
  3. Netbox API Token: Via Kestra Secrets (nicht im Git!)

  4. Hetzner S3 Credentials: Via Ansible Vault oder Umgebungsvariablen


📊 Monitoring & Status

Backup-Status anzeigen

# Auf jedem Client:
systemctl status mbo-backup.timer
systemctl list-timers mbo-backup.timer

# Logs:
journalctl -u mbo-backup -f
tail -f /var/log/mbo-backup/*.log

Rclone Sync-Status

# Auf Backup-Server:
systemctl status mbo-rclone-sync.timer
journalctl -u mbo-rclone-sync -f

# Manuelle Sync:
sudo -u backup rclone sync --progress /backup/repos hetzner:mbo-backups/production/repos

Borg Repository Status

ssh backup@{BACKUP_SERVER_HOSTNAME}
borg list /backup/repos/SERVER_NAME
borg info /backup/repos/SERVER_NAME::(latest-backup)

🔄 Restore-Prozeduren

Komplettes Restore eines Servers

# 1. SSH zum Server
ssh root@SERVER_NAME

# 2. Hole aktuelles Backup vom Backup-Server
borg extract --progress \
  backup@{BACKUP_SERVER_HOSTNAME}:/backup/repos/SERVER_NAME::(latest) \
  /etc

# 3. Oder aus S3 (falls lokal nicht verfügbar)
rclone ls hetzner:mbo-backups/production/repos/SERVER_NAME/

Einzelne Datei restoren

# Liste Backup-Archive
borg list backup@{BACKUP_SERVER_HOSTNAME}:/backup/repos/SERVER_NAME

# Extrahiere einzelne Datei
borg extract \
  backup@{BACKUP_SERVER_HOSTNAME}:/backup/repos/SERVER_NAME::archive-name \
  path/to/file

Docker Volume restoren

# Auf Backup-Server:
ssh backup@{BACKUP_SERVER_HOSTNAME}

# Finde den Export
ls -la /var/backups/docker/*/

# Entpacke und restore zum Container
docker run --rm \
  -v myvolume:/data \
  -v /var/backups/docker/DUMP:/backup \
  alpine tar xzf /backup/volume-myvolume.tar.gz -C /data

🐛 Troubleshooting

SSH-Fehler beim Backup

# Test SSH-Connection:
ssh -i /root/.ssh/mbo-backup-key.ed25519 \
  backup@{BACKUP_SERVER_HOSTNAME} "echo OK"

# SSH-Keys neu generieren (falls nötig):
ssh-keygen -t ed25519 -N '' -f /root/.ssh/mbo-backup-key.ed25519

Borg Repository korrupt

# Backup-Server:
ssh backup@{BACKUP_SERVER_HOSTNAME}
borg check -v /backup/repos/SERVER_NAME
borg repair /backup/repos/SERVER_NAME

Rclone S3 Sync läuft nicht

# Teste Rclone Connection:
sudo -u backup rclone listremotes
sudo -u backup rclone ls hetzner:

# Überprüfe Config:
sudo -u backup rclone config show hetzner

# Debugging:
sudo -u backup rclone sync --progress --log-level DEBUG \
  /backup/repos hetzner:mbo-backups/production/repos

Kestra Workflow fehlt

# Logs in Kestra:
Settings → Logs → backup-provision

# Manuelle Test:
curl -X GET https://kestra.pve.mbo-tech-it.de/api/v1/namespaces/automation/flows

📈 Performance Tuning

Borg-Kompression

# Schneller (weniger CPU): lz4
# Besser (mehr Dedupe): zstd
# Im Script anpassen: --compression zstd,10

Rclone Sync Parallel

# In rclone-sync.service:
rclone sync --progress --transfers 4 --checkers 8 \
  /backup/repos hetzner:mbo-backups/production/repos

Backup-Größe reduzieren

# Exclude-List in borg-backup.sh erweitern:
--exclude '*.log'
--exclude '.cache'
--exclude 'node_modules'

📝 Wartung & Cleanup

Alte Backups prünen

Der borg prune läuft automatisch:

  • Tägliche: 7 Tage
  • Wöchentliche: 4 Wochen
  • Monatliche: 12 Monate

Zu ändern in borg-backup.sh:

borg prune "$REPO_PATH" \
  --keep-daily=7 \
  --keep-weekly=4 \
  --keep-monthly=12

Docker-Dumps aufräumen

# Manuell (normalerweise automatisch):
find /var/backups/docker -type d -mtime +7 -exec rm -rf {} \;

📞 Support & Fragen


Version: 1.0
Letzte Aktualisierung: 2026-09-09
Maintainer: Jonny (MBO-Tech-IT)