Debian/Ubuntu Backupskript

Aus Qloc Wiki
Wechseln zu: Navigation, Suche

Mit diesem Backupskript erstellen Sie ein simples Backup wichtiger Daten auf Ihrem Debian/Ubuntu basierten Server und überträgt dieses auf einen anderen Linux Server per SFTP.
Hinweis: Dieses Skript setzt die Verwendung von Debian oder Ubuntu sowie zwei Linux Server voraus!

Vorbereitung

SSH Key generieren und übertragen

Unser Backupskript überträgt die Backups verschlüsselt mit per SFTP (mit Hilfe des SSH Protokolls). Die Authentifizierung erfolgt mit Hilfe eines SSH Keys. Dieser muss auf dem Quellserver generiert und anschließend auf den Zielserver übertragen werden.

Auf dem Zielserver

  • Melden Sie sich per SSH am Zielserver an und erstellen Sie einen Benutzer "backup"
adduser backup
  • Erstellen Sie das Verzeichnis .ssh mit der Datei authorized_keys
cd /home/backup
mkdir .ssh
touch .ssh/authorized_keys
chmod 700 .ssh
chmod 600 .ssh/authorized_keys
chown -R backup:backup .ssh
  • Aktivieren Sie die Authentifizierung via SSH Key.
    Entfernen Sie dazu in der Datei "/etc/ssh/sshd_config" die Raute (#) am Anfang der Zeile "#AuthorizedKeysFile  %h/.ssh/authorized_keys"
...
AuthorizedKeysFile      %h/.ssh/authorized_keys
...

und starten Sie den SSH Server neu:

service ssh restart

Auf dem Quellserver

  • Generieren Sie einen SSH Key:
ssh-keygen
  • Übertragen Sie nun den SSH Public Key vom Ihrem Quellserver auf Ihren Zielserver:
scp -P 22 /root/.ssh/id_rsa.pub backup@123.123.123.123:/home/backup/.ssh/authorized_keys


Konfiguration des Backupskripts

  • Laden Sie das Backupskript auf Ihren Server herunter und machen Sie dieses ausführbar:
wget https://www.qloc.de/tco/wiki/linux_backupskript.sh -O /home/backupskript.sh
chmod +x /home/backupskript.sh
  • Passen Sie die Eigenschaften an:

Allgemeine Eigenschaften

BACKUP_NAME= Name Ihres Backups (Angabe ohne Sonder- und Leerzeichen)
SOURCE= Dateien und Verzeichnisse, welche gesichert werden sollen (Angabe OHNE / am Anfang; Mehrere Angaben durch Leerzeichen trennen)
EXCLUDE= Dateien und Verzeichnisse, welche vom Backup ausgeschlossen werden sollen (Angabe OHNE / am Anfang)
AUTODELETE_IN_DAYS= Gibt an, nach wie vielen Tagen die Backups gelöscht werden sollen (Standard: "7")
GZIP_COMPRESSION= Aktiviert die gzip Kompression (Standard: "yes")

Einstellungen des Backupservers

SFTP_Server= IP oder DNS Ihres Server, auf dem das Backup gespeichert werden soll
SSH_PORT= SSH Port des Zielservers
USERNAME= Benutzername über welchen das Backup übertragen und gespeichert werden soll
DESTINATION_DIR= Verzeichnis auf Zielserver, unter welchem das Backup gespeichert werden soll (Angabe MIT / am Anfang, aber OHNE / am Ende)

Einstellungen für MySQL Backup

MYSQL_ACTIVE= Sicherung von MySQL Datenbanken aktivieren (Aktiviert = "yes", Deaktiviert = "no")
MYSQL_DATABASES= Zu sichernde Datenbanken ("ALL_DATABASES" zum Sichern von allen Datenbanken)


Skript

#!/bin/bash
# Backupskript by https://www.qloc.de/

### Einstellungen ###
BACKUP_NAME="wichtigedaten"
TIMESTAMP="$(date +%Y.%m.%d-%R)"
TMP_BACKUP_DIR="tmp/backup_$BACKUP_NAME"
SOURCE="root home var/www tmp $TMP_BACKUP_DIR/MySQL-database_*.sql"
EXCLUDE="--exclude=*.pid --exclude=*/logs --exclude=*.log"
AUTODELETE_IN_DAYS="7"
GZIP_COMPRESSION="yes"

### Einstellungen des Backupservers ###
SFTP_Server="123.123.123.123"
SSH_PORT="22"
USERNAME="backup"
DESTINATION_DIR="/home/backup"

### Einstellungen für MySQL Backup ###
MYSQL_ACTIVE="no"
MYSQL_DATABASES="ALL_DATABASES"


# Wechsel in root damit die Pfade stimmen
# temp. Verzeichnis erstellen
# Zeitstempel zum Messen der Zeit
cd /
mkdir -p ${TMP_BACKUP_DIR}
STARTTIME=$(date +%s)

# Exportiere MySQL Datenbank(en)
if [ "$MYSQL_ACTIVE" == "yes" ]; then
    if [ "$MYSQL_DATABASES" == "ALL_DATABASES" ]; then
        MYSQL_DATABASES=$(mysql --defaults-file=/etc/mysql/debian.cnf -e "SHOW DATABASES;" | tr -d "| " | grep -v Database)
    fi
    echo -e "\033[1;33mExportiere folgende MySQL Datenbanken: $MYSQL_DATABASES \033[0m"
    for db in $MYSQL_DATABASES; do
        if [[ "$db" != "information_schema" ]] && [[ "$db" != "performance_schema" ]] && [[ "$db" != "mysql" ]] && [[ "$db" != _* ]] ; then
            mysqldump --defaults-file=/etc/mysql/debian.cnf --databases $db > $TMP_BACKUP_DIR/MySQL-database_$db\_$TIMESTAMP.sql
            if [ $? -ne 0 ]; then
                echo -e "\033[0;31mFehler: Bei der Exportierung der MySQL Datenbank $db ist ein Fehler aufgetreten! \033[0m"
            fi
        fi
    done 
    echo -e "\033[0;32mMySQL-Export abgeschlossen\033[0m"
fi
    
# Erstelle Archiv
echo -e "\033[1;33mArchivieren der Dateien und Ordner...\033[0m"

if [ "$TMP_BACKUP_DIR" == "/" ]; then
    echo -e "\033[0;31mFehler: Das temporäre Backupverzeichnis darf NICHT / sein!\033[0m"
    exit 1
fi

if [ "$GZIP_COMPRESSION" == "yes" ]; then
    tar cfz $TMP_BACKUP_DIR/$BACKUP_NAME-$TIMESTAMP.tar.gz $SOURCE $EXCLUDE
else
    tar cf $TMP_BACKUP_DIR/$BACKUP_NAME-$TIMESTAMP.tar $SOURCE $EXCLUDE
fi

if [ $? -ne 0 ]; then
    echo -e "\033[0;31mFehler: Bei der Archivierung ist ein Fehler aufgetreten!\033[0m"
    exit 1
else
    echo -e "\033[0;32mArchivierung abgeschlossen\033[0m"
fi

# Backup auf Zielserver übertragen
echo -e "\033[1;33mÜbertragen des Backups auf den Zielserver..\033[0m"
scp -P $SSH_PORT $TMP_BACKUP_DIR/$BACKUP_NAME-$TIMESTAMP.tar* $USERNAME@$SFTP_Server:$DESTINATION_DIR

if [ $? -ne 0 ]; then
    echo -e "\033[0;31mFehler: Bei der Übertragung ist ein Fehler aufgetreten!\033[0m"
    exit 1
else
    echo -e "\033[0;32mÜbertragung des Backups abgeschlossen\033[0m"
fi

# Alte Backups aufräumen
echo -e "\033[1;33mAufräumen alter Backups...\033[0m"
ssh -p $SSH_PORT $USERNAME@$SFTP_Server "find $DESTINATION_DIR -name '$BACKUP_NAME-*.tar.gz' -mtime +$AUTODELETE_IN_DAYS -exec rm -rf {} \;"

if [ $? -ne 0 ]; then
    echo -e "\033[0;31mFehler: Beim Aufräumen alter Backups ist ein Fehler aufgetreten!\033[0m"
    exit 1
else
    echo -e "\033[0;32mAufräumen alter Backups abgeschlossen\033[0m"
fi

# Temp. Ordner löschen
rm -r $TMP_BACKUP_DIR
echo
echo -e "\033[0;32mBackup in $[$(date +%s)-$STARTTIME] Sekunden erfolgreich ausgeführt\033[0m"