Pterodactyl Backup via Synology

In diesem Abschnitt geht es darum, unsere Pterodactyl Docker-Server auf unserem NAS als Backup zu speichern. Pterodactyl verfügt über eine großartige Funktion, mit der Crontabs Backups der einzelnen Server erstellt werden können. Wir nutzen diese Funktion, um die Backups regelmäßig automatisch auf unser NAS zu Hause zu speichern, falls unser "Pterodactyl Server" ausfällt oder beschädigt wird.

Der gesamte Vorgang wird mit zwei Skripten durchgeführt.


Zuallererst wird um 0 Uhr über Pterodactyl für jeden Server ein automatisches Backup erstellt.

Etwa 5-10 Minuten später verbindet sich unsere Synology NAS über SSH-Key mit unserem Server und startet dort ein Skript.

Dieses Skript fasst die erstellten Backups zu einer einzigen ZIP-Datei zusammen, legt sie in unser Verzeichnis und gewährt uns entsprechende Rechte.

Anschließend lädt unser NAS diese ZIP-Datei über SCP (SFTP) herunter.

Lokal wird ein neuer Ordner mit dem aktuellen Datum erstellt, in dem diese ZIP-Datei gespeichert wird.

Sobald der Download abgeschlossen ist, wird die temporäre ZIP-Datei auf dem Server gelöscht.

Anschließend sucht das Skript lokal nach Backups, die älter als 30 Tage sind, und löscht sie.


Damit das ganze nun realisieren können, müssen wir einiges einstellen

SSH-Login & Schlüssel Erstellen

Wir verbinden uns via Putty zu unserem „Pterodactyl“ Server, dann erstellen wir uns einen neuen User mit SSH Recht & SSH-Key, sowie einem einzigen Sudo Recht, um das Script zu starten, was wir dann auch gleich erstellen.
[username= beliebiger Name für den User. z.b. synology]

adduser --shell /bin/bash --ingroup 'ssh' username

nano /etc/ssh/sshd_config

AllowUsers username


Wir wechseln zu unserem neuen erstellten Benutzer und generieren uns einen 4096Bit RSA Schlüssel, ohne Passwort und erhalten somit eine verbesserte Authentifizierung auf kryptografischer Technik für den SSH-Login.
(Wir müssen hier ohne Passwort arbeiten, da die Passworteingabe nur mit Benutzerinteraktion funktioniert, und das Script aber automatisch ablaufen soll.)

su username

ssh-keygen -t rsa -b 4096

Bestätigt den Namen: "~/.ssh/id_rsa" mit Enter und lasst die Passphrase (Passwort) leer.


Wir müssen den SSH-Schlüssel jetzt in die Kategorie der autorisierten Schlüssel einfügen und entsprechende Rechte vergeben, damit der Benutzter mit dem Schlüssel arbeiten kann.

(Bitte achtet darauf, dass ihr statt (/username/) euren Benutzernamen nutzt!

mv /home/username/.ssh/id_rsa.pub /home/username/.ssh/authorized_keys

chmod 700 /home/username/.ssh

chmod 600 /home/username/.ssh/authorized_keys

cat /home/username/.ssh/id_rsa

Markiert die komplette Ausgabe, 

Von

[ -----BEGIN OPENSSH PRIVATE KEY----- ]

Bis

[ -----END OPENSSH PRIVATE KEY----- ]


(Damit wird der Key kopiert, erstellt euch eine Textdatei auf dem Desktop und benennt diese in “Syno-ServerKey” (ohne .txt am Ende!) fügt nun den kopierten Schlüssel ein und speichert diese Datei.

SSH-Key umwandeln

Wir benötigen zunächst das Programm "PuTTYgen", das zusammen mit PuTTY geliefert wird.

Öffnen Sie PuTTYgen und klicken Sie auf "Load". Wählen Sie unter der Kategorie "Alle Dateien (*.*)" unsere gespeicherten Syno-ServerKey aus.


Dann müssen wir auf Conversions und müssen den Schlüssel als OpenSSH key exportieren.


Vergeben Sie einen Namen für den Schlüssel, z. B. "Syno-ServerKey.pem".

Pterodactyl Server / Script vorbereitung

Wir erstellen nun einen Ordner, in dem wir auch gleich unser Script ablegen werden.
Und dieses entsprechend vorbereiten werden. (usernamen anpassen!)

mkdir /home/username/scripts

nano /home/username/scripts/backup.sh


Dort tragen wir nun folgendes ein (Bitte alles genau kopieren!)
Es wird nur der username angepasst!!

#!/bin/bash

#Normal Filesystem Backup
#You can Change the variable of "SERVERUSER"
SERVERUSER="username"

#DONT EDIT HERE!
d=`date +%d-%m-%Y`
h=$(hostname -s)

#Change to directory of the backup folder from Pterodactyl
cd /var/lib/pterodactyl/backups/

#Pack all created backups as one ZIP with server name and date.
zip -r "$h$d".zip *

#Move the created .ZIP file to the home backup folder of the NAS-Users
if  [[ ! -e "/home/$SERVERUSER/backups" ]]; then
            mkdir -p /home/$SERVERUSER/backups
fi
mv /var/lib/pterodactyl/backups/*.zip /home/$SERVERUSER/backups/

#Assign permissions to SERVERUSER for the download
chown -R $SERVERUSER /home/$SERVERUSER/backups
chmod 700 /home/$SERVERUSER/backups
echo "ZIP Done";


Wir brauchen noch Rechte, damit der NAS-Benutzer das Script ausführen und lesen kann.

chmod 700 /home/username/scripts/backup.sh

SSH - Sudo Konfiguration

Wir wechseln zunächst erstmal wieder zum Root-User und öffnen die "Sudoers" Konfigurations-Datei.


Jetzt geben wir unserem User, das Recht nur für dieses eine Script Sudo zu verwenden.

Anchorzuerst müssen wir wieder root-user werden

su -

visudo


Wir müssen in der Datei nun einen Eintrag setzte, das der NAS-Benutzer entsprechend das backup.sh Script startet darf
[username anpassen!]

# User alias specification

username ALL=NOPASSWD:/home/username/scripts/backup.sh

Wir speichern mit STRG + O [Enter zum Bestätigen] und mit STRG + X die Konfiguration schließen.


Jetzt müssen wir den SSH Dienst noch neu starten, um die Änderungen wirksam zu machen.

service sshd restart

Pterodactyl Server Backups einstellen

Wir brauchen aber noch Vorbereitungen über das Webinterface von Pterodactyl.

Wichtig ist, dass ihr für jeden Server den ihr im Webinterface erstellt, auch das Backup Limit auf 1 stehen habt!


(Wie ihr das einstellt, seht ihr im Abschnitt der Pterodactyl Gameserver Installation.

Um nun ein automatisches Backup von Pterodactyl einzurichten, müssen wir auf unserem Game / Voice – Server Panel zugreifen. 

Im dortigen Abschnitt „Schedules“ (Cronjob) einen neues einrichten.

Optimaler Weise nennen wir es auch direkt „Auto-Backup“

Wir möchten jeden Sonntag um 0 Uhr ein Backup erstellen lassen.
Dies wäre wie folgt : 0 0 * * 7

Möchtet ihr an anderen Zeitpunkten oder täglich so ein Backup ziehen, müsst ihr das entsprechend anpassen. 

Ihr könnt euch https://crontab.guru/ zur Hilfe nehmen.


Nachdem wir nun die Zeit eingestellt habt, klicken wir auf das eben erstelle Auto-Backup
Dort können wir nun eine entsprechende Aufgabe zuteilen.

„New Task“ unter „Action“ stellen wir „Create Backup“ ein und fertig.
Wünscht ihr, dass bestimmte Ordner oder Dateien nicht mitgesichert werden sollen.
Müsst ihr diese unter „Ignored files“ eintragen.

Ihr müsst also immer mit einem Slash / zeichen beginnen, dann den Ordner bzw. Dateiname.

Pterodactyl Server Backups einstellen

Wir nutzen in unserem Beispiel eine Synology NAS, aber dies dürfte für alle arten von NAS´s systeme funktionieren.

Idealerweise habt ihr eure Synology bereits seit längeren eingerichtet.


Bevor du loslegen kannst, musst du zuerst SSH auf deiner DiskStation aktivieren. Öffne die Systemsteuerung, wechselt in den erweiterten Modus und öffne im Bereich „Anwendungen“ den Punkt „Terminal & SNMP“.


Setze einen hacken bei „SSH-Dienst aktivieren“

Ändere den Standard SSH-Port für deine eigene Sicherheit z.b. (40722)


Wir benötigen auf der Synology auch den „Benutzer Home Dienst“
Systemsteuerung > Benutzer & Gruppe > Erweitert  

(Ganz unten Benutzer-Home-Dienst aktivieren)


Damit das Ganze vorgehen dann auch funktioniert, müssen wir das Script später mit einem Admin Account ausführen können!


Damit unser NAS sich später mit unserem Pterodactyl-Server verbinden kann, müssen wir unseren erstellten SSH.pem key auf unseren NAS verschieben.

Ihr solltet in eurem Hauptordner des Adminbenutzers des NAS einen [.ssh] Ordner vorfinden, dort müssen wir unseren .pem Key einfügen.


Damit unser benutzter diesen SSH-Schlüssel auch benutzen kann, müssen wir via Putty uns auf das NAS-System verbinden.

Und folgenden Befehl ausführen.

chmod 700 /var/services/homes/NameDesAdmin/.ssh/NameVonSSHKey.pem


Damit das Script am ende funktioniert, müssen wir uns einmalig via NAS-SSH auf unseren Server, von dem wir die Daten später Herunterladen wollen, manuell Verbinden.

ssh -i /var/services/homes/NameDesAdmin/.ssh/NameVonSSHKey.pem -psshPortVomServer username@IPvomServer

den Fingerprint bestätigen. Wenn ihr nun euch nun erfolgreich verbinden konntet, könnt ihr Putty nun wieder schließen.


Jetzt müssen wir wieder in die Systemsteuerung → Aufgabenplaner und dort erstellen wir ein Geplante Aufgabe → Benutzter Definitiertes Script.


Wir nennen die Aufgabe „Server-Backups“

der Benutzer, sollte der entsprechende Adminuser sein!. (Ansonsten funktioniert es nicht und schlägt fehl.)


unter „Zeitplan“ stellen wir für unser beispiel jeden Sonntag um 00:10Uhr ein.
Damit hat der Ptero-Server selbst um 0Uhr genug zeit die Backupfiles vorzubereiten.


Unter Aufgabeneinstellungen fügt ihr nun folgendes ein.

#!bin/sh

#You can Change the variable of ""
NASUSER=""
VOLUME=""
SSHKEY=""
SERVERIP=""
SSHPORT=""
SERVERUSER=""

#-------------------------------------------------------------

#DONT EDIT HERE!
echo "connect to external server..";
ssh -i /"$VOLUME"/homes/"$NASUSER"/.ssh/"$SSHKEY" -p"$SSHPORT" "$SERVERUSER"@"$SERVERIP" "sudo ./scripts/backup.sh"
echo "waiting for zipping script on external server...";
wait


#Create a folder with the date of today
TODAY="$(date +'%d-%m-%Y')"
mkdir -p /"$VOLUME"/homes/"$NASUSER"/ServerBackups/"$TODAY"/


#Download the ZIP file via SCP (SFTP)
echo "Download Files...";
scp -i /"$VOLUME"/homes/"$NASUSER"/.ssh/"$SSHKEY" -P"$SSHPORT" "$SERVERUSER"@"$SERVERIP":/home/"$SERVERUSER"/backups/*.zip /"$VOLUME"/homes/"$USERNAME"/ServerBackups/"$TODAY"/
echo "Download done";

#Waiting for download to finish
wait


#Delete ZIP file on server
echo "Remove temporary zip...";
ssh -i /"$VOLUME"/homes/"$NASUSER"/.ssh/"$SSHKEY" -p"$SSHPORT" "$SERVERUSER"@"$SERVERIP" "rm backups/*.zip"


#Find and delete backups that are older than 30 days locally
echo "Remove files older than 30 days";
find /"$VOLUME"/homes/"$NASUSER"/ServerBackups/ -mtime +30 -delete
echo "BACKUP FINISH!";

Nun tragt ihr im oberen Abschnitt des Scripts (unter #User editable Variable) in die Anführungsstriche die entsprechenden Werte ein.


Beispiel:

NASUSER = "Admin" (der Adminuser der Synology)

VOLUME = "volume1" (Volume der NAS)
SSHKEY = "Syno-ServerKey.pem"  (Name des SSHKeys (.pem)

SERVERIP = "192.168.0.555" (IP des zu Backupenden Servers)

SSHPORT = "40822" (Der SSH Port vom zu backupenden Servers)

SERVERUSER = "synology" (User des vom zu backupenden Servers)



Nachdem ihr jetzt alles eingetragen habt, übernehmen und mit Rechtsklick einen Testlauf starten.

Um zu sehen, ob es funktioniert, oder welche Fehler passieren.
Könnt ihr im Aufgabenplaner unter Einstellungen, Ausgabeergebnisse speichern.



Jetzt sollte ihr jeden Sonntag ein neues Backup bekommen auf euer NAS.
Solltet ihr inzwischen weitere Fragen haben, so schreibt mir doch gerne auf YouTube bzw. Instagram.