backup-automation/README.md

329 lines
9.6 KiB
Markdown

# 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@backup01.mbotechit.de │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ Backup-Server (backup01.mbotechit.de) │
│ 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:
```bash
# 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
```bash
git clone https://gitea.mbo-tech-it.de/jonny/backup-automation.git
cd backup-automation
```
### 3. Backup-Server vorbereiten
```bash
# SSH auf Backup-Server
ssh root@backup01.mbotechit.de
# 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
```bash
# 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
```bash
# 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
```bash
# 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
```bash
ssh backup@backup01.mbotechit.de
borg list /backup/repos/SERVER_NAME
borg info /backup/repos/SERVER_NAME::(latest-backup)
```
---
## 🔄 Restore-Prozeduren
### Komplettes Restore eines Servers
```bash
# 1. SSH zum Server
ssh root@SERVER_NAME
# 2. Hole aktuelles Backup vom Backup-Server
borg extract --progress \
backup@backup01.mbotechit.de:/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
```bash
# Liste Backup-Archive
borg list backup@backup01.mbotechit.de:/backup/repos/SERVER_NAME
# Extrahiere einzelne Datei
borg extract \
backup@backup01.mbotechit.de:/backup/repos/SERVER_NAME::archive-name \
path/to/file
```
### Docker Volume restoren
```bash
# Auf Backup-Server:
ssh backup@backup01.mbotechit.de
# 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
```bash
# Test SSH-Connection:
ssh -i /root/.ssh/mbo-backup-key.ed25519 \
backup@backup01.mbotechit.de "echo OK"
# SSH-Keys neu generieren (falls nötig):
ssh-keygen -t ed25519 -N '' -f /root/.ssh/mbo-backup-key.ed25519
```
### Borg Repository korrupt
```bash
# Backup-Server:
ssh backup@backup01.mbotechit.de
borg check -v /backup/repos/SERVER_NAME
borg repair /backup/repos/SERVER_NAME
```
### Rclone S3 Sync läuft nicht
```bash
# 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
```bash
# 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
```bash
# Schneller (weniger CPU): lz4
# Besser (mehr Dedupe): zstd
# Im Script anpassen: --compression zstd,10
```
### Rclone Sync Parallel
```bash
# In rclone-sync.service:
rclone sync --progress --transfers 4 --checkers 8 \
/backup/repos hetzner:mbo-backups/production/repos
```
### Backup-Größe reduzieren
```bash
# 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`:
```bash
borg prune "$REPO_PATH" \
--keep-daily=7 \
--keep-weekly=4 \
--keep-monthly=12
```
### Docker-Dumps aufräumen
```bash
# Manuell (normalerweise automatisch):
find /var/backups/docker -type d -mtime +7 -exec rm -rf {} \;
```
---
## 📞 Support & Fragen
- Kestra Docs: https://kestra.io/docs
- Borg Backup Docs: https://borgbackup.readthedocs.io
- Rclone S3: https://rclone.org/s3/
- Netbox API: https://netbox.mbo-tech-it.de/api/docs/
---
**Version**: 1.0
**Letzte Aktualisierung**: 2026-09-09
**Maintainer**: Jonny (MBO-Tech-IT)