Der Backup‑Prozess wird durch zwei Skripte realisiert die im Verzeichnis /usr/local/bin/ liegen. Das Skript run_gitea_backup.sh wird in regelmäßigen Intervallen vom Cron‑Job gestartet. Es ruft anschließend gitea_backup.sh mit den erforderlichen Parametern auf und erhält von diesem eine Rückmeldung über Erfolg oder Fehlschlag des Backups. Diese Statusmeldung wird anschließend per E‑Mail an eugen@hoeglinger.name weitergeleitet.
Das Skript run_gitea_backup.sh, welches vom Cron-Job aufgerufen wird.
#!/bin/bash # ============================================ # Einstellungen # ============================================ MAIL_TO="eugen@hoeglinger.name" MAIL_SUBJECT_SUCCESS="Gitea Backup erfolgreich" MAIL_SUBJECT_FAIL="Gitea Backup FEHLGESCHLAGEN" LOGFILE="/var/log/gitea_backup.log" # ============================================ # Backup-Skript ausführen # ============================================ /usr/local/bin/gitea_backup.sh EXIT_CODE=$? # ============================================ # Ergebnis prüfen und E-Mail senden # ============================================ if [ $EXIT_CODE -eq 0 ]; then MESSAGE="Das Gitea Backup wurde erfolgreich abgeschlossen. Zeit: $(date) Exit-Code: $EXIT_CODE Details siehe Logfile: $LOGFILE " echo "$MESSAGE" | mail -s "$MAIL_SUBJECT_SUCCESS" "$MAIL_TO" echo "$(date) - Backup erfolgreich." >> "$LOGFILE" else MESSAGE="Das Gitea Backup ist FEHLGESCHLAGEN. Zeit: $(date) Exit-Code: $EXIT_CODE Bitte überprüfe das Backup-Skript und die Systemlogs. Details siehe Logfile: $LOGFILE " echo "$MESSAGE" | mail -s "$MAIL_SUBJECT_FAIL" "$MAIL_TO" echo "$(date) - Backup FEHLGESCHLAGEN mit Exit-Code $EXIT_CODE." >> "$LOGFILE" fi exit $EXIT_CODE
Das Skript gitea_backup.sh, welches vom Skript run_gitea_backup.sh aufgerufen wird.
#!/bin/bash # Verzeichnisse und Datenbank-Details CONFIG_DIR="/etc/gitea" DATA_DIR="/mnt/dataSSD//gitea/data" DB_NAME="gitea" DB_USER="gitea" DB_PASS="7vY6qeiN4LF9YN8A4gKA" BACKUP_DIR="/mnt/backupUSB/backup/gitea/" MOUNT_POINT="/mnt/backupUSB" # ============================================ # Schritt 0: Prüfen, ob Backup-Medium gemountet ist # ============================================ if ! mountpoint -q "$MOUNT_POINT"; then echo "FEHLER: Backup-Medium ist NICHT gemountet: $MOUNT_POINT" exit 2 fi # ============================================ # Schritt 1: Prüfen, ob bereits 3 Sicherungen existieren # ============================================ BACKUPS=($(ls -1 "$BACKUP_DIR" | sort)) COUNT=${#BACKUPS[@]} if [ "$COUNT" -ge 3 ]; then OLDEST="${BACKUPS[0]}" echo "Es existieren bereits 3 Sicherungen. Lösche älteste: $OLDEST" rm -rf "$BACKUP_DIR/$OLDEST" fi # ============================================ # Schritt 2: Neue Sicherung erstellen # ============================================ # Datum und Zeit für die Sicherung TIMESTAMP=$(date +"%Y%m%d%H%M%S") # Sicherungsverzeichnisse erstellen mkdir -p "$BACKUP_DIR/$TIMESTAMP" # Konfiguration sichern tar -czf $BACKUP_DIR/$TIMESTAMP/gitea_config_$TIMESTAMP.tar.gz -C $CONFIG_DIR . # Daten sichern tar -czf $BACKUP_DIR/$TIMESTAMP/gitea_data_$TIMESTAMP.tar.gz -C $DATA_DIR . # Datenbank sichern mysqldump -u $DB_USER -p$DB_PASS $DB_NAME > $BACKUP_DIR/$TIMESTAMP/gitea_db_$TIMESTAMP.sql # Sicherung überprüfen if [ -f $BACKUP_DIR/$TIMESTAMP/gitea_config_$TIMESTAMP.tar.gz ] && \ [ -f $BACKUP_DIR/$TIMESTAMP/gitea_data_$TIMESTAMP.tar.gz ] && \ [ -f $BACKUP_DIR/$TIMESTAMP/gitea_db_$TIMESTAMP.sql ]; then echo "Sicherung erfolgreich erstellt." else echo "Sicherung fehlgeschlagen." exit 1 fi # ============================================ # Schritt 3: Integrität der Archive überprüfen # ============================================ # Integrität der Archive überprüfen if tar -tzf $BACKUP_DIR/$TIMESTAMP/gitea_config_$TIMESTAMP.tar.gz >/dev/null && \ tar -tzf $BACKUP_DIR/$TIMESTAMP/gitea_data_$TIMESTAMP.tar.gz >/dev/null; then echo "Archive sind intakt." else echo "Archive sind beschädigt." exit 1 fi # Datenbank-Dump überprüfen if grep -q "Dump completed" $BACKUP_DIR/$TIMESTAMP/gitea_db_$TIMESTAMP.sql; then echo "Datenbank-Dump ist vollständig." else echo "Datenbank-Dump ist unvollständig." exit 1 fi exit 0