Zálohy VPS spravujeme my a v zákaznické zóně z nich obnovíte celý disk. Pro jednotlivé soubory, databáze a kopii mimo naši infrastrukturu si nastavíte vlastní zálohy. Ukážeme obojí.
Co budete potřebovat
- VPS u StormHostu s Ubuntu 24.04 nebo Debianem 13
- Připojení přes SSH jako root (návod)
- Pro zálohu mimo VPS druhý počítač nebo server s přístupem přes SSH
- Asi 25 minut
Automatické zálohy StormHost#
Zálohy VPS vytváříme automaticky. Najdete je v zákaznické zóně: Moje služby › vaše VPS › záložka Zálohy.
- Seznam ukazuje u každé zálohy Vytvořeno (datum a čas), Velikost a Úložiště, na kterém je uložená.
- Ruční vytvoření zálohy ze zákaznické zóny není možné. Před riskantním zásahem (upgrade systému, velká změna konfigurace) si proto udělejte vlastní zálohu podle zbytku návodu.
- Pokud se zobrazí „Jedno ze zálohovacích úložišť teď neodpovídá — seznam nemusí být úplný“, část záloh je dočasně nedostupná. Zkuste to později, nebo nám napište.
- Člen sdílené služby vidí zálohy jen s oprávněním Zálohy a obnova.
Obnova celé VPS#
Obnova přepíše celý disk
„Data na disku se nevratně přepíší zálohou. VPS se během obnovy vypne.“ Všechno, co na VPS vzniklo po vytvoření zálohy (nové objednávky na webu, uložené hry, databáze, logy), se ztratí. Pokud na VPS něco takového je, stáhněte si to nejdřív (SFTP, mariadb-dump).
- V záložce Zálohy najděte zálohu podle data ve sloupci Vytvořeno.
- Klikněte na Obnovit.
- Přečtěte si upozornění a potvrďte ho přejetím posuvníku („Přejeďte pro obnovení“).
- Počkejte na dokončení. Během obnovy je VPS vypnutá a zamčená, konzole se nepřipojí.
- Po obnově VPS spusťte (pokud se nespustí sama) a zkontrolujte služby.
Celá obnova, nebo jednotlivé soubory?#
| Situace | Co použít |
|---|---|
| Rozbitý systém, napadená VPS, nepovedená aktualizace | Obnova celé VPS v záložce Zálohy. |
| Smazaný nebo přepsaný soubor, chybná úprava konfigurace | Vlastní záloha souborů (níže). Obnova celého disku by vrátila i všechno ostatní. |
| Poškozená nebo smazaná data v databázi | Vlastní záloha databáze (export mariadb-dump). |
| Přesun na jinou VPS nebo k jinému poskytovateli | Vlastní zálohy, ideálně uložené mimo VPS. |
Pravidlo 3-2-1#
Osvědčené pravidlo pro zálohy: 3 kopie dat, na 2 různých místech nebo typech úložiště, z toho 1 mimo hlavní infrastrukturu.
Pro VPS to znamená:
- Data na VPS (původní kopie).
- Naše automatické zálohy (druhá kopie, mimo vaši VPS).
- Vaše vlastní záloha jinde: domácí NAS, jiný server, cloudové úložiště (třetí kopie, mimo naši infrastrukturu).
Třetí kopie vás ochrání i v situacích, kdy nepomůže obnova v zákaznické zóně: potřebujete starší stav, jednotlivý soubor, nebo se chcete přestěhovat.
Co zálohovat#
| Cesta / data | Co obsahuje | Poznámka |
|---|---|---|
/etc | Konfigurace systému a služeb (Nginx, SSH, cron, firewall). | Malé, zálohujte vždy. |
/home, /root | Domovské složky uživatelů, skripty, SSH klíče. | /root/.ssh obsahuje soukromé klíče, zálohu šifrujte. |
/var/www | Weby. | |
/opt, /srv | Aplikace a data, která sem instalujete (například projekty Docker Compose). | |
| Databáze | Data MariaDB/MySQL. | Vždy exportem (mariadb-dump), ne kopií složky /var/lib/mysql za běhu, ta by byla nekonzistentní. |
| Volumes Dockeru | Data kontejnerů (/var/lib/docker/volumes). | Databáze v kontejnerech exportujte, viz Docker a Docker Compose. |
| Data herních serverů | Světy, konfigurace, pluginy. | Složka podle vaší instalace. Server před zálohou světa ideálně uložte (příkaz save-all u Minecraftu). |
| Crontab | Naplánované úlohy. | crontab -l > /root/crontab-zaloha.txt |
Zálohovací skript#
Skript udělá každý den export všech databází a archiv důležitých složek a smaže zálohy starší než 7 dní.
Vytvořte soubor skriptu:
bash nano /usr/local/sbin/zaloha.shVložte obsah:
/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) databáze (jen pokud je MariaDB/MySQL nainstalovaná) 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) soubory tar -czf "$CIL/soubory-$DNES.tar.gz" --ignore-failed-read /etc /home /root /var/www /opt /srv || [ $? -eq 1 ] # 3) smazání starých záloh find "$CIL" -type f -name '*.gz' -mtime +"$UCHOVAT_DNI" -delete echo "$(date '+%F %T') záloha hotová"Uložte (Ctrl+O, Enter), zavřete (Ctrl+X) a povolte spuštění:
bash chmod 700 /usr/local/sbin/zaloha.shchmod 700– skript smí číst a spouštět jen root.
Co skript dělá:
| Řádek | Význam |
|---|---|
#!/bin/bash | Skript se spustí interpretem bash. |
set -euo pipefail | Skript skončí při první chybě (-e), při použití nenastavené proměnné (-u) a při chybě kdekoli v řetězu příkazů s | (pipefail). Nevznikne tak tiše poškozená záloha. |
umask 077 | Nové soubory bude smět číst jen root. Zálohy obsahují hesla a klíče. |
CIL=/var/backups/vps | Složka pro zálohy na VPS. |
DNES=$(date +%F) | Dnešní datum ve tvaru 2026-10-01, použije se v názvech souborů. |
UCHOVAT_DNI=7 | Kolik dní zálohy držet. Víc dní = víc místa na disku. |
command -v mariadb-dump | Zjistí, jestli je databáze nainstalovaná; když ne, export přeskočí. |
mariadb-dump … | gzip > … | Export všech databází bez zamykání tabulek, rovnou komprimovaný. Root se do databáze přihlásí přes unix socket bez hesla. |
tar -czf … /etc /home … | Zabalí a zkomprimuje uvedené složky do jednoho archivu. |
--ignore-failed-read | Neskončí chybou, když některá složka neexistuje nebo nejde přečíst. |
|| [ $? -eq 1 ] | Tar vrací kód 1, když se soubor během čtení změnil (například log). To nevadí; skutečná chyba (kód 2) skript zastaví. |
find … -mtime +7 -delete | Smaže archivy starší než 7 dní. |
Vyzkoušejte skript ručně:
bash /usr/local/sbin/zaloha.sh ls -lh /var/backups/vpsUvidíte
záloha hotováa souborydb-….sql.gzasoubory-….tar.gz. Hláškatar: Removing leading '/' from member namesje normální: cesty se do archivu ukládají bez úvodního lomítka.
Místo na disku
Záloha leží na stejném disku jako data. Zabírá místo a při poruše disku nebo napadení VPS zmizí spolu s daty. Sledujte volné místo (df -h) a zálohy kopírujte mimo VPS (kapitola Přenos mimo VPS).
Automatické spouštění cronem#
Ujistěte se, že je nainstalovaný cron (když už je, nic se nestane):
bash apt -y install cronOtevřete crontab roota:
bash crontab -ePři prvním spuštění zvolte editor
nano.Na konec přidejte řádek:
text 30 3 * * * /usr/local/sbin/zaloha.sh >> /var/log/zaloha.log 2>&1Uložte a zavřete editor. Uvidíte
crontab: installing new crontab.
Řádek crontabu má pět časových polí a příkaz:
| Pole | Povolené hodnoty | V příkladu | Význam |
|---|---|---|---|
| minuta | 0–59 | 30 | ve 30. minutě |
| hodina | 0–23 | 3 | ve 3 hodiny ráno |
| den v měsíci | 1–31 | * | každý den |
| měsíc | 1–12 | * | každý měsíc |
| den v týdnu | 0–7 (0 i 7 = neděle) | * | každý den v týdnu |
| příkaz | /usr/ | co spustit (vždy celou cestou) | |
| přesměrování | >> /var/log/zaloha.log 2>&1 | výstup i chyby připsat do logu |
Další příklady časů:
| Zápis | Kdy se spustí |
|---|---|
0 */6 * * * | každých 6 hodin (0:00, 6:00, 12:00, 18:00) |
15 2 * * 0 | každou neděli ve 2:15 |
0 4 1 * * | prvního dne v měsíci ve 4:00 |
Čas se řídí časovým pásmem VPS (timedatectl). Zálohy plánujte na dobu, kdy je na serveru nejmenší provoz.
Přenos mimo VPS#
Příprava SSH přístupu k cílovému serveru#
Zálohy pošlete na jiný server (domácí NAS s SSH, jiná VPS). V ukázkách má cílový server IP adresu 198.51.100.25, dosaďte místo ní adresu svého serveru.
Na cílovém serveru (Ubuntu nebo Debian, přihlášení jako root) připravte uživatele a složku, do které smí zapisovat:
adduser zaloha
mkdir -p /srv/zalohy
chown zaloha:zaloha /srv/zalohy
chmod 700 /srv/zalohyadduser zaloha– vytvoří uživatelezaloha. Zeptá se na heslo (budete ho potřebovat v kroku 2 níže) a na nepovinné údaje, které potvrdíte klávesou Enter.mkdir -p /srv/zalohy– složka pro zálohy.chown zaloha:zaloha– složka bude patřit uživatelizaloha, aby do ní mohl zapisovat. Bez toho rsync i restic skončí chybouPermission denied.chmod 700– do složky nesmí nikdo jiný.
Na cílovém serveru musí být povolené přihlášení heslem aspoň do doby, než nahrajete klíč (krok 2). Na NAS postupujte podle jeho návodu (uživatel, sdílená složka, zapnuté SSH).
Pak na zálohované VPS:
Vytvořte SSH klíč bez hesla, který použije jen zálohování:
bash ssh-keygen -t ed25519 -f /root/.ssh/zaloha -N "" -C "zaloha-vps"-t ed25519– moderní typ klíče.-f /root/.ssh/zaloha– kam klíč uložit (vzniknezalohaazaloha.pub).-N ""– bez hesla ke klíči, aby ho cron mohl použít bez vás.-C "zaloha-vps"– popisek klíče.
Nahrajte veřejný klíč na cílový server (zadáte heslo uživatele
zalohana cílovém serveru):bash ssh-copy-id -i /root/.ssh/zaloha.pub [email protected]Při prvním spojení se SSH zeptá
Are you sure you want to continue connecting (yes/no/[fingerprint])?. Napišteyes: otisk cílového serveru se uloží do/root/.ssh/known_hostsa cron se pak už ptát nebude.Vytvořte zkratku pro připojení. Otevřete
nano /root/.ssh/configa přidejte:/root/ .ssh/ textconfig Host zalohy HostName 198.51.100.25 User zaloha IdentityFile /root/.ssh/zalohaHost zalohy– zkratka, kterou pak použijete místo adresy.HostName– IP adresa nebo doména cílového serveru.User– uživatel na cílovém serveru.IdentityFile– klíč pro přihlášení.
Vyzkoušejte připojení:
ssh zalohyse musí přihlásit bez hesla. Odhlaste se příkazemexit.
Postup práce s klíči podrobně: SSH klíč.
rsync#
rsync kopíruje jen změněné soubory, takže je rychlý i u velkých záloh. Musí být nainstalovaný na obou stranách (apt -y install rsync).
rsync -az /var/backups/vps/ zalohy:/srv/zalohy/vps1/-a– archivní režim: kopíruje rekurzivně a zachovává práva, časy a odkazy.-z– komprimuje data během přenosu./var/backups/vps/– co kopírovat. Lomítko na konci znamená „obsah složky“, ne složku samotnou.zalohy:/srv/zalohy/vps1/– cíl: zkratka ze~/.ssh/configa složka na cílovém serveru.
Přenos zařaďte do skriptu zaloha.sh jako poslední řádek, nebo do crontabu hodinu po záloze:
30 4 * * * rsync -az /var/backups/vps/ zalohy:/srv/zalohy/vps1/ >> /var/log/zaloha.log 2>&1Proč bez --delete
Přepínač --delete by na cíli smazal vše, co na VPS chybí. Když útočník nebo chyba smaže zálohy na VPS, smazaly by se při dalším běhu i na cíli. Staré zálohy na cílovém serveru raději mažte tam, například vlastním cronem s find … -mtime +30 -delete.
Pamatujte, že útočník, který ovládne VPS, může klíč zaloha použít i přímo a zálohy na cíli smazat. Před tím chrání až kopie, ke které se z VPS dostat nejde: například cílový server, který si zálohy stahuje sám (rsync spuštěný na cíli), nebo úložiště s historií verzí.
restic (pro pokročilé)#
restic ukládá zálohy šifrovaně a s deduplikací: opakující se data se uloží jen jednou, takže můžete držet desítky denních verzí s malými nároky na místo. Umí zálohovat na SFTP server i do cloudových úložišť.
Nainstalujte restic:
apt -y install restic.Vytvořte soubor s heslem repozitáře a omezte jeho práva:
bash nano /root/.restic-heslo chmod 600 /root/.restic-hesloDo souboru vložte dlouhé náhodné heslo (generátor hesel).
Bez hesla zálohy neobnovíte
restic data šifruje. Když heslo ztratíte, zálohy už nikdo nerozšifruje, ani vy. Uložte si ho i mimo VPS (do správce hesel).
Založte repozitář na cílovém serveru:
bash restic -r sftp:zalohy:/srv/zalohy/restic-vps1 --password-file /root/.restic-heslo init-r sftp:– repozitář přes SFTP;zalohy:/ srv/ zalohy/ restic-vps1 zalohyje zkratka ze~/.ssh/config.--password-file– soubor s heslem, aby se restic neptal (nutné pro cron).init– vytvoří nový prázdný repozitář. Uvidítecreated restic repository ….
Zálohujte (příkaz můžete dát do skriptu místo archivu
tar; export databáze ponechte):bash restic -r sftp:zalohy:/srv/zalohy/restic-vps1 --password-file /root/.restic-heslo backup /etc /home /root /var/www /opt /srv /var/backups/vpsMažte staré verze podle pravidla:
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– odebere verze (snapshoty), které pravidlo nezachová.--keep-daily 7– ponechá poslední verzi z každého ze 7 posledních dní se zálohou.--keep-weekly 4,--keep-monthly 6– navíc jednu verzi týdně za 4 týdny a měsíčně za 6 měsíců.--prune– rovnou smaže data, na která už žádná verze neodkazuje (uvolní místo).
Užitečné příkazy:
Příkaz (s -r … a --password-file …) | Co dělá |
|---|---|
snapshots | Seznam uložených verzí s datem. |
restore latest --target /tmp/obnova | Obnoví poslední verzi do složky /tmp/obnova. |
restore latest --target /tmp/obnova --include /etc/nginx | Obnoví jen vybranou složku. |
check | Zkontroluje celistvost repozitáře. |
Alternativou k resticu je BorgBackup (dokumentace (otevře se v novém okně)), funguje na podobném principu.
Test obnovy#
Záloha, kterou jste nikdy nezkusili obnovit, je jen naděje. Aspoň jednou za čas si ji vyzkoušejte:
Vypište obsah archivu:
tar -tzf /var/.backups/ vps/ soubory-2026-10-01. tar. gz | head Rozbalte jeden soubor do dočasné složky:
bash mkdir -p /tmp/obnova tar -xzf /var/backups/vps/soubory-2026-10-01.tar.gz -C /tmp/obnova etc/nginx/nginx.conf-x– rozbalit,-z– formát gzip,-f– ze souboru.-C /tmp/obnova– kam rozbalit (nepřepíše se tak živý soubor).etc/nginx/nginx.conf– co rozbalit (cesta bez úvodního lomítka).
Zkontrolujte export databáze:
zcat /var/musí ukázat začátek SQL exportu.backups/ vps/ db-2026-10-01. sql. gz | head -n 20 Úplný test (obnova databáze, spuštění aplikace) dělejte na jiné, testovací VPS, ne na ostré.
Obnova databáze přepíše současná data
Příkaz gunzip < db-….sql.gz | mariadb obnoví všechny databáze ze zálohy a přepíše jejich současný obsah. Na ostré VPS ho spouštějte jen tehdy, když opravdu chcete vrátit stav ze zálohy. Postup obnovy jedné databáze je v návodu MariaDB na VPS.
Ověření#
- Ráno po první noci:
tail /var/log/zaloha.logobsahuje řádekzáloha hotová. ls -lh /var/backups/vpsukazuje nové soubory s dnešním datem a rozumnou velikostí (ne 0 bajtů).- Na cílovém serveru jsou stejné soubory (rsync), nebo
restic snapshotsukazuje dnešní verzi.
Když něco nefunguje#
Cron skript nespustil#
Zkontrolujte, že běží cron a co zapsal do logu:
systemctl status cron
journalctl -u cron -n 50Časté příčiny: v crontabu chybí celá cesta ke skriptu, skript nemá právo spuštění (chmod 700), nebo jste upravili crontab jiného uživatele než root (crontab -l ho vypíše).
mariadb-dump: Got error: 1045: "Access denied for user …"#
Skript neběží jako root, nebo databázový root používá heslo místo unix socketu. Spouštějte skript z crontabu roota. Pokud má root v databázi heslo, uložte ho do souboru /root/.my.cnf, odkud si ho mariadb-dump přečte sám:
[client]
user=root
password=<HESLO_ROOT_DATABAZE>[client]– skupina voleb pro všechny klientské programy MariaDB (mariadb,mariadb-dump).user,password– přihlašovací údaje. Za<HESLO_ROOT_DATABAZE>dosaďte heslo databázového uživateleroot(bez špičatých závorek).
Soubor zabezpečte příkazem chmod 600 /root/.my.cnf, aby heslo nemohl číst nikdo jiný.
Záloha má 0 bajtů nebo je podezřele malá#
Skript skončil chybou uprostřed. Spusťte ho ručně a přečtěte si chybu. Díky set -euo pipefail se chyba exportu nepřejde tiše.
Permission denied (publickey) při rsync nebo restic#
Cílový server nepřijal klíč. Ověřte ssh zalohy. Pokud se ptá na heslo nebo selže, nahrajte klíč znovu (ssh-copy-id) a zkontrolujte, že IdentityFile v /root/.ssh/config ukazuje na správný soubor.
restic: Fatal: wrong password or no key found#
Heslo v souboru /root/.restic-heslo neodpovídá repozitáři. Zkontrolujte, že v souboru není navíc mezera nebo jiné heslo.
restic: Fatal: unable to open config file … Is there a repository at the following location?#
Repozitář na zadané cestě neexistuje (překlep v cestě, nebo jste nespustili init).
Disk se zaplňuje#
Zálohy se nemažou, nebo jsou příliš velké. Zkontrolujte, že běží krok find … -delete, snižte UCHOVAT_DNI a vynechte složky s velkými daty, které zálohujete jinak.
Shrnutí
- Zálohy VPS spravujeme my; v záložce Zálohy obnovíte celý disk, novější data se tím ztratí.
- Jednotlivé soubory a databáze obnovíte jen z vlastních záloh.
- Databáze zálohujte exportem
mariadb-dump, soubory archivemtarnebo resticem. - Skript spouštějte cronem a zálohy posílejte mimo VPS (rsync bez
--delete, restic se šifrováním). - Obnovu si pravidelně vyzkoušejte.