209 lines
5.6 KiB
Markdown
209 lines
5.6 KiB
Markdown
# Setup-Checkliste für Backup-Automation
|
|
|
|
## Phase 1: Vorbereitung (einmalig)
|
|
|
|
- [ ] Backup-Server VM unter Proxmox erstellen
|
|
- [ ] 2+ CPUs
|
|
- [ ] 4+ GB RAM
|
|
- [ ] Großes Datenvolume (/backup mit genug Platz)
|
|
- [ ] Hostname: `backup01.mbotechit.de`
|
|
|
|
- [ ] Hetzner S3 Credentials besorgen
|
|
- [ ] Access Key ID
|
|
- [ ] Secret Access Key
|
|
- [ ] Endpoint
|
|
- [ ] Bucket Name: `mbo-backups`
|
|
|
|
- [ ] Netbox API Token generieren
|
|
- [ ] Admin → Users → Create Token
|
|
- [ ] Token kopieren und sicher speichern
|
|
|
|
- [ ] Git-Repository erstellen in Gitea
|
|
- [ ] Name: `backup-automation`
|
|
- [ ] Description: "Netbox-integrated Borg backup automation"
|
|
- [ ] Visibility: Private
|
|
|
|
## Phase 2: Git-Repository Setup
|
|
|
|
- [ ] Repository lokal clonen
|
|
- [ ] Verzeichnisstruktur erstellen:
|
|
```
|
|
backup-automation/
|
|
├── kestra/
|
|
│ └── workflows/
|
|
├── ansible/
|
|
│ ├── playbooks/
|
|
│ ├── roles/
|
|
│ └── group_vars/
|
|
├── scripts/
|
|
├── docs/
|
|
└── README.md
|
|
```
|
|
- [ ] Alle Dateien ins Repo pushen
|
|
- [ ] `.gitignore` hinzufügen:
|
|
```
|
|
.ansible-vault-pass
|
|
*.key
|
|
*.pem
|
|
~/.ssh/
|
|
vault.yml
|
|
inventory/dynamic
|
|
.env
|
|
```
|
|
|
|
## Phase 3: Backup-Server einrichten
|
|
|
|
- [ ] Server online bringen & SSH-Zugang testen
|
|
- [ ] Ansible auf Server installieren: `apt install ansible`
|
|
- [ ] SSH-Keys generieren:
|
|
```bash
|
|
ssh-keygen -t ed25519 -N '' -f /root/.ssh/mbo-backup-key.ed25519
|
|
```
|
|
- [ ] Ansible Playbook ausführen:
|
|
```bash
|
|
ansible-playbook ansible/playbooks/configure-backup-server.yaml \
|
|
-e "hetzner_s3_access_key=YOUR_KEY" \
|
|
-e "hetzner_s3_secret_key=YOUR_SECRET"
|
|
```
|
|
- [ ] Borg Repositories initialisieren pro Server
|
|
- [ ] Rclone S3-Verbindung testen:
|
|
```bash
|
|
sudo -u backup rclone ls hetzner:mbo-backups/
|
|
```
|
|
- [ ] Systemd Timers aktivieren:
|
|
```bash
|
|
systemctl status mbo-rclone-sync.timer
|
|
```
|
|
|
|
## Phase 4: Netbox Tags setzen
|
|
|
|
- [ ] In Netbox Admin: Tag `backup=true` erstellen
|
|
- [ ] Tag zu allen zu backupenden Systemen hinzufügen
|
|
- [ ] Mindestens 2-3 Test-Systeme markieren
|
|
|
|
## Phase 5: Kestra Workflow
|
|
|
|
- [ ] Kestra-Workflow YAML ins System laden:
|
|
```bash
|
|
curl -X POST https://kestra.pve.mbo-tech-it.de/api/v1/flows \
|
|
-H "Content-Type: application/yaml" \
|
|
-d @kestra/workflows/backup-provision.yaml
|
|
```
|
|
- [ ] Secrets in Kestra setzen:
|
|
- [ ] `NETBOX_TOKEN` = dein API Token
|
|
- [ ] `NETBOX_URL` = https://netbox.mbo-tech-it.de
|
|
- [ ] `HETZNER_S3_KEY` = S3 Access Key
|
|
- [ ] `HETZNER_S3_SECRET` = S3 Secret Key
|
|
|
|
- [ ] Workflow manuell triggern & testen:
|
|
```
|
|
Kestra UI → automation → backup-provision → Execute
|
|
```
|
|
|
|
## Phase 6: Client Setup (pro Host)
|
|
|
|
- [ ] Auf jedem Client (manuell oder via Kestra):
|
|
```bash
|
|
# Ansible ausführen
|
|
ansible-playbook -i inventory.ini \
|
|
ansible/playbooks/install-borg-client.yaml
|
|
```
|
|
|
|
- [ ] Pro Host Überprüfung:
|
|
- [ ] Borg installiert? `borg --version`
|
|
- [ ] SSH-Key kopiert? `ls -la ~/.ssh/mbo-backup-key.ed25519`
|
|
- [ ] Systemd Timer aktiv? `systemctl status mbo-backup.timer`
|
|
- [ ] Script vorhanden? `ls -la /usr/local/bin/mbo-backup/`
|
|
|
|
## Phase 7: Erste Test-Backups
|
|
|
|
- [ ] Auf Test-Server manuell Backup starten:
|
|
```bash
|
|
systemctl start mbo-backup.service
|
|
```
|
|
|
|
- [ ] Logs überprüfen:
|
|
```bash
|
|
journalctl -u mbo-backup -f
|
|
tail -f /var/log/mbo-backup/backup-*.log
|
|
```
|
|
|
|
- [ ] Auf Backup-Server Repository prüfen:
|
|
```bash
|
|
ssh backup@backup01.mbotechit.de
|
|
borg list /backup/repos/TEST_SERVER
|
|
borg info /backup/repos/TEST_SERVER
|
|
```
|
|
|
|
- [ ] S3-Sync überprüfen:
|
|
```bash
|
|
# Nach Rclone-Timer (04:00)
|
|
rclone ls hetzner:mbo-backups/production/repos/
|
|
```
|
|
|
|
## Phase 8: Automatisierung aktivieren
|
|
|
|
- [ ] In Kestra: Timer aktivieren (täglich 02:00 Uhr)
|
|
- [ ] Kestra-UI überwachen:
|
|
- [ ] Erste Nacht Log-Ausgaben prüfen
|
|
- [ ] Fehler oder Warnings?
|
|
|
|
- [ ] SSH-Key Restrictions konfigurieren (Security-Hardening):
|
|
```bash
|
|
# Auf Backup-Server authorized_keys anpassen:
|
|
restrict,command="/usr/bin/borg serve --restrict-to-paths /backup/repos" ssh-ed25519 AAAA...
|
|
```
|
|
|
|
## Phase 9: Monitoring & Alerting (optional)
|
|
|
|
- [ ] Prometheus für Backup-Metriken (optional)
|
|
- [ ] Alerting via Alertmanager (optional)
|
|
- [ ] Webhook zu MatterMost/Slack (optional)
|
|
|
|
## Phase 10: Dokumentation & Schulung
|
|
|
|
- [ ] README aktualisieren mit eigenen Pfaden
|
|
- [ ] Team-Training: Restore-Proceduren
|
|
- [ ] Runbook für emergencies
|
|
- [ ] Disaster Recovery Test planen
|
|
|
|
---
|
|
|
|
## 🔍 Häufige Probleme
|
|
|
|
### "SSH connection refused"
|
|
- SSH-Key nicht auf Backup-Server? `ssh-copy-id` nutzen
|
|
- Firewall blockiert? Port 22 open?
|
|
- SSH-Service läuft? `systemctl status ssh`
|
|
|
|
### "Borg: Repository not found"
|
|
- Repository nicht initialisiert? Manually: `borg init /backup/repos/HOSTNAME`
|
|
- Pfad falsch? Check: `ansible_hostname` muss mit Verzeichnis passen
|
|
|
|
### "Rclone: Access Denied to S3"
|
|
- Credentials falsch? `rclone config show hetzner`
|
|
- S3-Bucket nicht existent? `rclone mkdir hetzner:mbo-backups`
|
|
- Region falsch? Hetzner FSN1 vs NBG1 unterschied?
|
|
|
|
### "Docker dumps failing"
|
|
- Docker nicht installiert? Script skipped automatisch
|
|
- Container nicht gelabelt? Label setzen: `docker label backup.mysql=true`
|
|
- DB-Dumps zu groß? Kompression anpassen
|
|
|
|
---
|
|
|
|
## ✅ Erfolgs-Indikatoren
|
|
|
|
- ✅ Kestra Workflow läuft täglich
|
|
- ✅ Systemd Timers alle `enabled`
|
|
- ✅ Logs zeigen "Backup completed successfully"
|
|
- ✅ Rclone syncronisiert zu S3
|
|
- ✅ S3 zeigt Daten: `rclone ls hetzner:mbo-backups/production/repos/`
|
|
- ✅ Restore-Test erfolgreich durchgeführt
|
|
|
|
---
|
|
|
|
**Status**: Initial Setup
|
|
**Letzte Überprüfung**: --
|
|
**Nächster Review**: Nach 2 Wochen automatischer Operation
|