Die VPS-Backups verwalten wir, und im Kundenbereich können Sie daraus die gesamte Festplatte wiederherstellen. Für einzelne Dateien, Datenbanken und eine Kopie außerhalb unserer Infrastruktur richten Sie eigene Backups ein. Wir zeigen beides.
Was Sie brauchen
- Ein StormHost-VPS mit Ubuntu 24.04 oder Debian 13
- Eine SSH-Verbindung als root (Anleitung)
- Für Backups außerhalb des VPS ein zweiter Computer oder Server mit SSH-Zugang
- Etwa 25 Minuten
Automatische StormHost-Backups#
Wir erstellen VPS-Backups automatisch. Sie finden sie im Kundenbereich: Meine Dienste › Ihr VPS › Registerkarte Backups.
- Für jedes Backup zeigt die Liste Erstellt (Datum und Uhrzeit), Größe und den Speicher, auf dem es liegt.
- Ein Backup können Sie aus dem Kundenbereich nicht manuell erstellen. Erstellen Sie vor einer riskanten Änderung (System-Upgrade, große Konfigurationsänderung) ein eigenes Backup, wie im Rest dieser Anleitung beschrieben.
- Wenn Sie „Einer der Backup-Speicher antwortet gerade nicht — die Liste ist möglicherweise unvollständig“ sehen, sind manche Backups vorübergehend nicht verfügbar. Versuchen Sie es später erneut oder kontaktieren Sie uns.
- Ein Mitglied eines geteilten Dienstes sieht Backups nur mit der Berechtigung Backups und Wiederherstellung.
Den gesamten VPS wiederherstellen#
Die Wiederherstellung überschreibt die gesamte Festplatte
„Die Festplattendaten werden unwiderruflich durch das Backup überschrieben. Der VPS fährt während der Wiederherstellung herunter.“ Alles, was nach der Erstellung des Backups auf dem VPS entstanden ist (neue Bestellungen auf Ihrer Website, Spielstände, Datenbanken, Logs), geht verloren. Liegt so etwas auf dem VPS, laden Sie es zuerst herunter (SFTP, mariadb-dump).
- Suchen Sie in der Registerkarte Backups das Backup anhand seines Datums in der Spalte Erstellt.
- Klicken Sie auf Wiederherstellen.
- Lesen Sie die Warnung und bestätigen Sie sie durch Verschieben des Schiebereglers („Zum Wiederherstellen schieben“).
- Warten Sie, bis es abgeschlossen ist. Während der Wiederherstellung ist der VPS heruntergefahren und gesperrt, und die Konsole verbindet sich nicht.
- Starten Sie den VPS nach der Wiederherstellung (falls er nicht von selbst startet) und prüfen Sie Ihre Dienste.
Vollständige Wiederherstellung oder einzelne Dateien?#
| Situation | Was verwenden |
|---|---|
| Kaputtes System, kompromittierter VPS, fehlgeschlagenes Update | Den gesamten VPS in der Registerkarte Backups wiederherstellen. |
| Eine gelöschte oder überschriebene Datei, eine missglückte Konfigurationsänderung | Ihr eigenes Datei-Backup (unten). Die Wiederherstellung der gesamten Festplatte würde auch alles andere zurücksetzen. |
| Beschädigte oder gelöschte Daten in einer Datenbank | Ihr eigenes Datenbank-Backup (ein mariadb-dump-Export). |
| Umzug auf einen anderen VPS oder zu einem anderen Anbieter | Ihre eigenen Backups, idealerweise außerhalb des VPS gespeichert. |
Die 3-2-1-Regel#
Eine bewährte Regel für Backups: 3 Kopien Ihrer Daten, an 2 verschiedenen Orten oder Speicherarten, davon 1 außerhalb der Hauptinfrastruktur.
Für einen VPS bedeutet das:
- Die Daten auf dem VPS (die Originalkopie).
- Unsere automatischen Backups (die zweite Kopie, außerhalb Ihres VPS).
- Ihr eigenes Backup woanders: ein NAS zu Hause, ein anderer Server, Cloud-Speicher (die dritte Kopie, außerhalb unserer Infrastruktur).
Die dritte Kopie schützt Sie auch dann, wenn eine Wiederherstellung im Kundenbereich nicht hilft: Sie brauchen einen älteren Stand, eine einzelne Datei, oder Sie möchten umziehen.
Was sichern#
| Pfad / Daten | Was er enthält | Hinweis |
|---|---|---|
/etc | System- und Dienstkonfiguration (Nginx, SSH, cron, Firewall). | Klein; immer sichern. |
/home, /root | Home-Verzeichnisse der Benutzer, Skripte, SSH-Schlüssel. | /root/.ssh enthält private Schlüssel, verschlüsseln Sie das Backup also. |
/var/www | Websites. | |
/opt, /srv | Apps und Daten, die Sie dort installieren (zum Beispiel Docker-Compose-Projekte). | |
| Datenbanken | MariaDB/MySQL-Daten. | Immer als Export (mariadb-dump), nie durch Kopieren des Verzeichnisses /var/lib/mysql im laufenden Betrieb; diese Kopie wäre inkonsistent. |
| Docker-Volumes | Container-Daten (/var/lib/docker/volumes). | Exportieren Sie in Containern laufende Datenbanken; siehe Docker und Docker Compose. |
| Gameserver-Daten | Welten, Konfiguration, Plugins. | Das Verzeichnis hängt von Ihrer Installation ab. Speichern Sie den Server idealerweise vor dem Sichern der Welt (save-all in Minecraft). |
| Crontab | Geplante Aufgaben. | crontab -l > /root/crontab-zaloha.txt |
Backup-Skript#
Jeden Tag exportiert das Skript alle Datenbanken, archiviert die wichtigen Verzeichnisse und löscht Backups, die älter als 7 Tage sind.
Erstellen Sie die Skriptdatei:
bash nano /usr/local/sbin/zaloha.shFügen Sie den Inhalt ein:
/usr/ local/ bashsbin/ zaloha.sh #!/bin/bash set -euo pipefail umask 077 CIL=/var/backups/vps DNES=$(date +%F) UCHOVAT_DNI=7 mkdir -p "$CIL" # 1) Datenbanken (nur wenn MariaDB/MySQL installiert ist) if command -v mariadb-dump >/dev/null 2>&1; then mariadb-dump --single-transaction --routines --events --all-databases | gzip > "$CIL/db-$DNES.sql.gz" fi # 2) Dateien tar -czf "$CIL/soubory-$DNES.tar.gz" --ignore-failed-read /etc /home /root /var/www /opt /srv || [ $? -eq 1 ] # 3) alte Backups loeschen find "$CIL" -type f -name '*.gz' -mtime +"$UCHOVAT_DNI" -delete echo "$(date '+%F %T') Backup fertig"Speichern Sie (Strg+O, Eingabe), schließen Sie (Strg+X) und machen Sie es ausführbar:
bash chmod 700 /usr/local/sbin/zaloha.shchmod 700– nur root kann das Skript lesen und ausführen.
Was das Skript tut:
| Zeile | Bedeutung |
|---|---|
#!/bin/bash | Das Skript läuft mit dem Interpreter bash. |
set -euo pipefail | Das Skript stoppt beim ersten Fehler (-e), bei Verwendung einer nicht gesetzten Variable (-u) und wenn ein Befehl in einer |-Pipeline fehlschlägt (pipefail). So erhalten Sie nicht stillschweigend ein kaputtes Backup. |
umask 077 | Neue Dateien sind nur für root lesbar. Backups enthalten Passwörter und Schlüssel. |
CIL=/var/backups/vps | Das Backup-Verzeichnis auf dem VPS (CIL = „Ziel“). |
DNES=$(date +%F) | Das heutige Datum in der Form 2026-10-01 (DNES = „heute“), verwendet in Dateinamen (soubory = „Dateien“). |
UCHOVAT_DNI=7 | Wie viele Tage Backups aufbewahrt werden (UCHOVAT_DNI = „Tage aufbewahren“). Mehr Tage = mehr Speicherplatz. |
command -v mariadb-dump | Prüft, ob die Datenbank installiert ist; wenn nicht, wird der Export übersprungen. |
mariadb-dump … | gzip > … | Exportiert alle Datenbanken ohne Tabellensperren, direkt komprimiert. Root meldet sich über Unix-Socket ohne Passwort an der Datenbank an. |
tar -czf … /etc /home … | Packt und komprimiert die aufgeführten Verzeichnisse in ein Archiv. |
--ignore-failed-read | Scheitert nicht, wenn ein Verzeichnis nicht existiert oder nicht lesbar ist. |
|| [ $? -eq 1 ] | tar gibt Code 1 zurück, wenn sich eine Datei während des Lesens geändert hat (zum Beispiel ein Log). Das ist in Ordnung; ein echter Fehler (Code 2) stoppt das Skript. |
find … -mtime +7 -delete | Löscht Archive, die älter als 7 Tage sind. |
Probieren Sie das Skript von Hand:
bash /usr/local/sbin/zaloha.sh ls -lh /var/backups/vpsSie sehen
Backup fertigund die Dateiendb-….sql.gzundsoubory-….tar.gz. Die Meldungtar: Removing leading '/' from member namesist normal: Pfade werden im Archiv ohne den führenden Schrägstrich gespeichert.
Speicherplatz
Das Backup liegt auf derselben Festplatte wie die Daten. Es belegt Platz, und wenn die Festplatte ausfällt oder der VPS kompromittiert wird, verschwindet es zusammen mit den Daten. Behalten Sie den freien Platz im Auge (df -h) und kopieren Sie Backups vom VPS weg (siehe Kopieren vom VPS weg).
Automatische Ausführung mit cron#
Stellen Sie sicher, dass cron installiert ist (ist es das bereits, passiert nichts):
bash apt -y install cronÖffnen Sie die Crontab von root:
bash crontab -eWählen Sie beim ersten Lauf den Editor
nano.Fügen Sie am Ende diese Zeile hinzu:
text 30 3 * * * /usr/local/sbin/zaloha.sh >> /var/log/zaloha.log 2>&1Speichern und schließen Sie den Editor. Sie sehen
crontab: installing new crontab.
Eine Crontab-Zeile hat fünf Zeitfelder und einen Befehl:
| Feld | Erlaubte Werte | Im Beispiel | Bedeutung |
|---|---|---|---|
| Minute | 0–59 | 30 | zur Minute 30 |
| Stunde | 0–23 | 3 | um 3 Uhr morgens |
| Tag des Monats | 1–31 | * | jeden Tag |
| Monat | 1–12 | * | jeden Monat |
| Wochentag | 0–7 (0 und 7 = Sonntag) | * | jeden Wochentag |
| Befehl | /usr/ | was ausgeführt wird (immer mit vollständigem Pfad) | |
| Umleitung | >> /var/log/zaloha.log 2>&1 | Ausgabe und Fehler an das Log anhängen |
Weitere Zeitbeispiele:
| Eintrag | Wann er läuft |
|---|---|
0 */6 * * * | alle 6 Stunden (0:00, 6:00, 12:00, 18:00) |
15 2 * * 0 | jeden Sonntag um 2:15 |
0 4 1 * * | am ersten Tag des Monats um 4:00 |
Die Zeiten richten sich nach der Zeitzone des VPS (timedatectl). Planen Sie Backups für die Zeit, in der der Server am wenigsten Verkehr hat.
Kopieren vom VPS weg#
SSH-Zugang zum Zielserver einrichten#
Senden Sie die Backups an einen anderen Server (ein NAS zu Hause mit SSH, einen anderen VPS). In den Beispielen hat der Zielserver die IP-Adresse 198.51.100.25; verwenden Sie stattdessen die Adresse Ihres eigenen Servers.
Legen Sie auf dem Zielserver (Ubuntu oder Debian, als root angemeldet) einen Benutzer und ein Verzeichnis an, in das er schreiben kann:
adduser zaloha
mkdir -p /srv/zalohy
chown zaloha:zaloha /srv/zalohy
chmod 700 /srv/zalohyadduser zaloha– legt den Benutzerzalohaan. Er fragt nach einem Passwort (Sie brauchen es in Schritt 2 unten) und nach optionalen Angaben, die Sie mit Eingabe überspringen können.mkdir -p /srv/zalohy– das Backup-Verzeichnis.chown zaloha:zaloha– das Verzeichnis gehört dem Benutzerzaloha, damit er hineinschreiben kann. Ohne dies scheitern sowohl rsync als auch restic mitPermission denied.chmod 700– niemand sonst kann auf das Verzeichnis zugreifen.
Auf dem Zielserver muss die Passwortanmeldung mindestens erlaubt sein, bis Sie den Schlüssel hochgeladen haben (Schritt 2). Bei einem NAS folgen Sie dessen eigener Anleitung (Benutzer, freigegebener Ordner, SSH aktiviert).
Dann auf dem zu sichernden VPS:
Erstellen Sie einen SSH-Schlüssel ohne Passwort, der nur für Backups verwendet wird:
bash ssh-keygen -t ed25519 -f /root/.ssh/zaloha -N "" -C "zaloha-vps"-t ed25519– ein moderner Schlüsseltyp.-f /root/.ssh/zaloha– wo der Schlüssel gespeichert wird (erstelltzalohaundzaloha.pub).-N ""– keine Schlüssel-Passphrase, damit cron ihn ohne Sie verwenden kann.-C "zaloha-vps"– eine Schlüsselkennung.
Laden Sie den öffentlichen Schlüssel auf den Zielserver hoch (Sie geben das Passwort des Benutzers
zalohaauf dem Zielserver ein):bash ssh-copy-id -i /root/.ssh/zaloha.pub [email protected]Bei der ersten Verbindung fragt SSH
Are you sure you want to continue connecting (yes/no/[fingerprint])?. Tippen Sieyes: Der Fingerabdruck des Zielservers wird in/root/.ssh/known_hostsgespeichert, und cron wird nicht erneut gefragt.Erstellen Sie ein Verbindungskürzel. Öffnen Sie
nano /root/.ssh/configund fügen Sie hinzu:/root/ .ssh/ textconfig Host zalohy HostName 198.51.100.25 User zaloha IdentityFile /root/.ssh/zalohaHost zalohy– das Kürzel, das Sie statt der Adresse verwenden.HostName– die IP-Adresse oder Domain des Zielservers.User– der Benutzer auf dem Zielserver.IdentityFile– der Schlüssel für die Anmeldung.
Testen Sie die Verbindung:
ssh zalohymuss ohne Passwort anmelden. Melden Sie sich mitexitab.
Die Arbeit mit Schlüsseln im Detail: SSH-Schlüssel.
rsync#
rsync kopiert nur geänderte Dateien und ist daher auch bei großen Backups schnell. Es muss auf beiden Seiten installiert sein (apt -y install rsync).
rsync -az /var/backups/vps/ zalohy:/srv/zalohy/vps1/-a– Archivmodus: kopiert rekursiv und erhält Berechtigungen, Zeiten und Links.-z– komprimiert die Daten während der Übertragung./var/backups/vps/– was kopiert wird. Der Schrägstrich am Ende bedeutet „den Inhalt des Verzeichnisses“, nicht das Verzeichnis selbst.zalohy:/srv/zalohy/vps1/– das Ziel: das Kürzel aus~/.ssh/configund das Verzeichnis auf dem Zielserver.
Fügen Sie die Übertragung als letzte Zeile von zaloha.sh hinzu oder in die Crontab eine Stunde nach dem Backup:
30 4 * * * rsync -az /var/backups/vps/ zalohy:/srv/zalohy/vps1/ >> /var/log/zaloha.log 2>&1Warum ohne --delete
Das Flag --delete würde auf dem Ziel alles löschen, was auf dem VPS fehlt. Löscht ein Angreifer oder ein Fehler die Backups auf dem VPS, würde der nächste Lauf sie auch auf dem Ziel löschen. Löschen Sie alte Backups auf dem Zielserver stattdessen dort, zum Beispiel mit einem eigenen Cron-Job mit find … -mtime +30 -delete.
Bedenken Sie, dass ein Angreifer, der den VPS übernimmt, auch den Schlüssel zaloha direkt verwenden und die Backups auf dem Ziel löschen kann. Davor schützt nur eine Kopie, die vom VPS aus nicht erreichbar ist: zum Beispiel ein Zielserver, der die Backups selbst abholt (rsync auf dem Ziel ausgeführt), oder Speicher mit Versionsverlauf.
restic (fortgeschritten)#
restic speichert Backups verschlüsselt und mit Deduplizierung: Wiederholte Daten werden nur einmal gespeichert, sodass Sie Dutzende Tagesversionen mit wenig Platz behalten können. Es kann sowohl auf einen SFTP-Server als auch in Cloud-Speicher sichern.
Installieren Sie restic:
apt -y install restic.Erstellen Sie eine Datei mit dem Repository-Passwort und beschränken Sie ihre Berechtigungen:
bash nano /root/.restic-heslo chmod 600 /root/.restic-hesloLegen Sie ein langes zufälliges Passwort in die Datei (Passwortgenerator).
Ohne das Passwort können Sie nicht wiederherstellen
restic verschlüsselt die Daten. Verlieren Sie das Passwort, kann niemand die Backups entschlüsseln, auch Sie nicht. Bewahren Sie es auch außerhalb des VPS auf (in einem Passwort-Manager).
Erstellen Sie ein Repository auf dem Zielserver:
bash restic -r sftp:zalohy:/srv/zalohy/restic-vps1 --password-file /root/.restic-heslo init-r sftp:– ein Repository über SFTP;zalohy:/ srv/ zalohy/ restic-vps1 zalohyist das Kürzel aus~/.ssh/config.--password-file– die Passwortdatei, damit restic nicht fragt (für cron erforderlich).init– legt ein neues leeres Repository an. Sie sehencreated restic repository ….
Sichern Sie (diesen Befehl können Sie im Skript statt des
tar-Archivs verwenden; behalten Sie den Datenbankexport):bash restic -r sftp:zalohy:/srv/zalohy/restic-vps1 --password-file /root/.restic-heslo backup /etc /home /root /var/www /opt /srv /var/backups/vpsLöschen Sie alte Versionen nach einer Richtlinie:
bash restic -r sftp:zalohy:/srv/zalohy/restic-vps1 --password-file /root/.restic-heslo forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --pruneforget– entfernt Versionen (Snapshots), die die Richtlinie nicht behält.--keep-daily 7– behält die neueste Version jedes der letzten 7 Tage, die ein Backup haben.--keep-weekly 4,--keep-monthly 6– zusätzlich eine Version pro Woche für 4 Wochen und eine pro Monat für 6 Monate.--prune– löscht sofort Daten, auf die keine Version mehr verweist (gibt Platz frei).
Nützliche Befehle:
Befehl (mit -r … und --password-file …) | Was er tut |
|---|---|
snapshots | Listet gespeicherte Versionen mit ihrem Datum auf. |
restore latest --target /tmp/obnova | Stellt die neueste Version nach /tmp/obnova wieder her. |
restore latest --target /tmp/obnova --include /etc/nginx | Stellt nur das ausgewählte Verzeichnis wieder her. |
check | Prüft die Integrität des Repositorys. |
Eine Alternative zu restic ist BorgBackup (Dokumentation (öffnet sich in einem neuen Fenster)), das nach einem ähnlichen Prinzip arbeitet.
Wiederherstellung testen#
Ein Backup, dessen Wiederherstellung Sie nie geprobt haben, ist nur Hoffnung. Testen Sie es ab und zu:
Listen Sie den Archivinhalt auf:
tar -tzf /var/.backups/ vps/ soubory-2026-10-01. tar. gz | head Entpacken Sie eine einzelne Datei in ein temporäres Verzeichnis:
bash mkdir -p /tmp/obnova tar -xzf /var/backups/vps/soubory-2026-10-01.tar.gz -C /tmp/obnova etc/nginx/nginx.conf-x– entpacken,-z– gzip-Format,-f– aus einer Datei.-C /tmp/obnova– wohin entpackt wird (damit die Live-Datei nicht überschrieben wird).etc/nginx/nginx.conf– was entpackt wird (Pfad ohne führenden Schrägstrich).
Prüfen Sie den Datenbankexport:
zcat /var/muss den Anfang eines SQL-Exports zeigen.backups/ vps/ db-2026-10-01. sql. gz | head -n 20 Machen Sie einen vollständigen Test (Datenbank wiederherstellen, App starten) auf einem separaten Test-VPS, nicht auf Ihrem Produktivsystem.
Die Wiederherstellung einer Datenbank überschreibt die aktuellen Daten
Der Befehl gunzip < db-….sql.gz | mariadb stellt alle Datenbanken aus dem Backup wieder her und überschreibt ihren aktuellen Inhalt. Führen Sie ihn auf einem Produktiv-VPS nur aus, wenn Sie den Stand aus dem Backup wirklich zurückholen möchten. Die Wiederherstellung einer einzelnen Datenbank behandelt MariaDB auf einem VPS.
Überprüfung#
- Am Morgen nach der ersten Nacht:
tail /var/log/zaloha.logenthält die ZeileBackup fertig. ls -lh /var/backups/vpszeigt neue Dateien mit dem heutigen Datum und einer sinnvollen Größe (nicht 0 Bytes).- Der Zielserver hat dieselben Dateien (rsync), oder
restic snapshotszeigt die heutige Version.
Fehlerbehebung#
Cron hat das Skript nicht ausgeführt#
Prüfen Sie, dass cron läuft und was es ins Log geschrieben hat:
systemctl status cron
journalctl -u cron -n 50Häufige Ursachen: In der Crontab fehlt der vollständige Pfad zum Skript, das Skript ist nicht ausführbar (chmod 700), oder Sie haben die Crontab eines anderen Benutzers als root bearbeitet (crontab -l gibt sie aus).
mariadb-dump: Got error: 1045: "Access denied for user …"#
Das Skript läuft nicht als root, oder der Datenbank-root verwendet ein Passwort statt des Unix-Sockets. Führen Sie das Skript aus der Crontab von root aus. Hat root ein Datenbankpasswort, speichern Sie es in /root/.my.cnf, wo mariadb-dump es automatisch liest:
[client]
user=root
password=<DB_ROOT_PASSWORT>[client]– die Optionsgruppe für alle MariaDB-Client-Programme (mariadb,mariadb-dump).user,password– die Zugangsdaten. Ersetzen Sie<DB_ROOT_PASSWORT>durch das Passwort des Datenbankbenutzersroot(ohne die spitzen Klammern).
Sichern Sie die Datei mit chmod 600 /root/.my.cnf, damit niemand sonst das Passwort lesen kann.
Das Backup hat 0 Bytes oder ist verdächtig klein#
Das Skript ist mittendrin fehlgeschlagen. Führen Sie es von Hand aus und lesen Sie den Fehler. Dank set -euo pipefail bleibt ein Exportfehler nicht unbemerkt.
Permission denied (publickey) bei rsync oder restic#
Der Zielserver hat den Schlüssel nicht akzeptiert. Testen Sie ssh zalohy. Fragt es nach einem Passwort oder scheitert es, laden Sie den Schlüssel erneut hoch (ssh-copy-id) und prüfen Sie, dass IdentityFile in /root/.ssh/config auf die richtige Datei zeigt.
restic: Fatal: wrong password or no key found#
Das Passwort in /root/.restic-heslo passt nicht zum Repository. Prüfen Sie, dass die Datei kein zusätzliches Leerzeichen oder ein anderes Passwort enthält.
restic: Fatal: unable to open config file … Is there a repository at the following location?#
Unter dem angegebenen Pfad gibt es kein Repository (ein Tippfehler im Pfad, oder Sie haben init nicht ausgeführt).
Die Festplatte füllt sich#
Backups werden nicht gelöscht oder sind zu groß. Prüfen Sie, dass der Schritt find … -delete läuft, verringern Sie UCHOVAT_DNI und lassen Sie Verzeichnisse mit großen Daten weg, die Sie anders sichern.
Zusammenfassung
- Die VPS-Backups verwalten wir; in der Registerkarte Backups stellen Sie die gesamte Festplatte wieder her, und alle neueren Daten gehen verloren.
- Einzelne Dateien und Datenbanken lassen sich nur aus Ihren eigenen Backups wiederherstellen.
- Sichern Sie Datenbanken mit einem
mariadb-dump-Export, Dateien mit einemtar-Archiv oder mit restic. - Führen Sie das Skript mit cron aus und senden Sie die Backups vom VPS weg (rsync ohne
--delete, restic mit Verschlüsselung). - Testen Sie die Wiederherstellung regelmäßig.
Weiterführende Links#
- restic: Dokumentation (öffnet sich in einem neuen Fenster)
- BorgBackup: Dokumentation (öffnet sich in einem neuen Fenster)
- rsync: Handbuchseite (öffnet sich in einem neuen Fenster)
- crontab(5): Crontab-Format (öffnet sich in einem neuen Fenster)
- MariaDB: mariadb-dump (öffnet sich in einem neuen Fenster)