Zálohy VPS spravujeme my a v zákazníckom účte z nich obnovíte celý disk. Pre jednotlivé súbory, databázy a kópiu mimo našej infraštruktúry si nastavíte vlastné zálohy. Ukážeme oboje.
Čo budete potrebovať
- VPS u StormHostu s Ubuntu 24.04 alebo Debianom 13
- Pripojenie cez SSH ako root (návod)
- Na zálohu mimo VPS druhý počítač alebo server s prístupom cez SSH
- Približne 25 minút
Automatické zálohy StormHost#
Zálohy VPS vytvárame automaticky. Nájdete ich v zákazníckom účte: Moje služby › váš VPS › záložka Zálohy.
- Zoznam ukazuje pri každej zálohe Vytvorené (dátum a čas), Veľkosť a Úložisko, na ktorom je uložená.
- Ručné vytvorenie zálohy zo zákazníckeho účtu nie je možné. Pred riskantným zásahom (upgrade systému, veľká zmena konfigurácie) si preto urobte vlastnú zálohu podľa zvyšku návodu.
- Ak sa zobrazí „Jedno zo zálohovacích úložísk teraz neodpovedá — zoznam nemusí byť úplný“, časť záloh je dočasne nedostupná. Skúste to neskôr, alebo nám napíšte.
- Člen zdieľanej služby vidí zálohy iba s oprávnením Zálohy a obnova.
Obnova celého VPS#
Obnova prepíše celý disk
„Dáta na disku sa nenávratne prepíšu zálohou. VPS sa počas obnovy vypne.“ Všetko, čo na VPS vzniklo po vytvorení zálohy (nové objednávky na webe, uložené hry, databázy, logy), sa stratí. Ak na VPS niečo také je, stiahnite si to najprv (SFTP, mariadb-dump).
- V záložke Zálohy nájdite zálohu podľa dátumu v stĺpci Vytvorené.
- Kliknite na Obnoviť.
- Prečítajte si upozornenie a potvrďte ho potiahnutím posuvníka („Potiahnite pre obnovenie“).
- Počkajte na dokončenie. Počas obnovy je VPS vypnutý a zamknutý, konzola sa nepripojí.
- Po obnove VPS spustite (ak sa nespustí sám) a skontrolujte služby.
Celá obnova, alebo jednotlivé súbory?#
| Situácia | Čo použiť |
|---|---|
| Rozbitý systém, napadnutý VPS, nepodarená aktualizácia | Obnova celého VPS v záložke Zálohy. |
| Zmazaný alebo prepísaný súbor, chybná úprava konfigurácie | Vlastná záloha súborov (nižšie). Obnova celého disku by vrátila aj všetko ostatné. |
| Poškodené alebo zmazané dáta v databáze | Vlastná záloha databázy (export mariadb-dump). |
| Presun na iný VPS alebo k inému poskytovateľovi | Vlastné zálohy, ideálne uložené mimo VPS. |
Pravidlo 3-2-1#
Osvedčené pravidlo pre zálohy: 3 kópie dát, na 2 rôznych miestach alebo typoch úložiska, z toho 1 mimo hlavnej infraštruktúry.
Pre VPS to znamená:
- Dáta na VPS (pôvodná kópia).
- Naše automatické zálohy (druhá kópia, mimo vášho VPS).
- Vaša vlastná záloha inde: domáci NAS, iný server, cloudové úložisko (tretia kópia, mimo našej infraštruktúry).
Tretia kópia vás ochráni aj v situáciách, keď nepomôže obnova v zákazníckom účte: potrebujete starší stav, jednotlivý súbor, alebo sa chcete presťahovať.
Čo zálohovať#
| Cesta / dáta | Čo obsahuje | Poznámka |
|---|---|---|
/etc | Konfigurácia systému a služieb (Nginx, SSH, cron, firewall). | Malé, zálohujte vždy. |
/home, /root | Domovské priečinky používateľov, skripty, SSH kľúče. | /root/.ssh obsahuje súkromné kľúče, zálohu šifrujte. |
/var/www | Weby. | |
/opt, /srv | Aplikácie a dáta, ktoré sem inštalujete (napríklad projekty Docker Compose). | |
| Databázy | Dáta MariaDB/MySQL. | Vždy exportom (mariadb-dump), nie kópiou priečinka /var/lib/mysql za behu, tá by bola nekonzistentná. |
| Volumes Dockeru | Dáta kontajnerov (/var/lib/docker/volumes). | Databázy v kontajneroch exportujte, pozri Docker a Docker Compose. |
| Dáta herných serverov | Svety, konfigurácia, pluginy. | Priečinok podľa vašej inštalácie. Server pred zálohou sveta ideálne uložte (príkaz save-all pri Minecrafte). |
| Crontab | Naplánované úlohy. | crontab -l > /root/crontab-zaloha.txt |
Zálohovací skript#
Skript urobí každý deň export všetkých databáz a archív dôležitých priečinkov a zmaže zálohy staršie než 7 dní.
Vytvorte súbor 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ázy (iba ak je MariaDB/MySQL nainštalovaná) 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) subory tar -czf "$CIL/soubory-$DNES.tar.gz" --ignore-failed-read /etc /home /root /var/www /opt /srv || [ $? -eq 1 ] # 3) zmazanie 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), zatvorte (Ctrl+X) a povoľte spustenie:
bash chmod 700 /usr/local/sbin/zaloha.shchmod 700– skript smie čítať a spúšťať iba root.
Čo skript robí:
| Riadok | Význam |
|---|---|
#!/bin/bash | Skript sa spustí interpretom bash. |
set -euo pipefail | Skript skončí pri prvej chybe (-e), pri použití nenastavenej premennej (-u) a pri chybe kdekoľvek v reťazi príkazov s | (pipefail). Nevznikne tak ticho poškodená záloha. |
umask 077 | Nové súbory bude smieť čítať iba root. Zálohy obsahujú heslá a kľúče. |
CIL=/var/backups/vps | Priečinok pre zálohy na VPS. |
DNES=$(date +%F) | Dnešný dátum v tvare 2026-10-01, použije sa v názvoch súborov. |
UCHOVAT_DNI=7 | Koľko dní zálohy držať. Viac dní = viac miesta na disku. |
command -v mariadb-dump | Zistí, či je databáza nainštalovaná; keď nie, export preskočí. |
mariadb-dump … | gzip > … | Export všetkých databáz bez zamykania tabuliek, rovno komprimovaný. Root sa do databázy prihlási cez unix socket bez hesla. |
tar -czf … /etc /home … | Zabalí a skomprimuje uvedené priečinky do jedného archívu. |
--ignore-failed-read | Neskončí chybou, keď niektorý priečinok neexistuje alebo sa nedá prečítať. |
|| [ $? -eq 1 ] | Tar vracia kód 1, keď sa súbor počas čítania zmenil (napríklad log). To neprekáža; skutočná chyba (kód 2) skript zastaví. |
find … -mtime +7 -delete | Zmaže archívy staršie než 7 dní. |
Vyskúšajte skript ručne:
bash /usr/local/sbin/zaloha.sh ls -lh /var/backups/vpsUvidíte
záloha hotováa súborydb-….sql.gzasoubory-….tar.gz. Hlásenietar: Removing leading '/' from member namesje normálne: cesty sa do archívu ukladajú bez úvodnej lomky.
Miesto na disku
Záloha leží na rovnakom disku ako dáta. Zaberá miesto a pri poruche disku alebo napadnutí VPS zmizne spolu s dátami. Sledujte voľné miesto (df -h) a zálohy kopírujte mimo VPS (kapitola Prenos mimo VPS).
Automatické spúšťanie cronom#
Uistite sa, že je nainštalovaný cron (keď už je, nič sa nestane):
bash apt -y install cronOtvorte crontab roota:
bash crontab -ePri prvom spustení zvoľte editor
nano.Na koniec pridajte riadok:
text 30 3 * * * /usr/local/sbin/zaloha.sh >> /var/log/zaloha.log 2>&1Uložte a zatvorte editor. Uvidíte
crontab: installing new crontab.
Riadok crontabu má päť časových polí a príkaz:
| Pole | Povolené hodnoty | V príklade | Význam |
|---|---|---|---|
| minúta | 0–59 | 30 | v 30. minúte |
| hodina | 0–23 | 3 | o 3 hodine ráno |
| deň v mesiaci | 1–31 | * | každý deň |
| mesiac | 1–12 | * | každý mesiac |
| deň v týždni | 0–7 (0 aj 7 = nedeľa) | * | každý deň v týždni |
| príkaz | /usr/ | čo spustiť (vždy celou cestou) | |
| presmerovanie | >> /var/log/zaloha.log 2>&1 | výstup aj chyby pripísať do logu |
Ďalšie príklady časov:
| Zápis | Kedy sa spustí |
|---|---|
0 */6 * * * | každých 6 hodín (0:00, 6:00, 12:00, 18:00) |
15 2 * * 0 | každú nedeľu o 2:15 |
0 4 1 * * | prvého dňa v mesiaci o 4:00 |
Čas sa riadi časovým pásmom VPS (timedatectl). Zálohy plánujte na čas, keď je na serveri najmenšia prevádzka.
Prenos mimo VPS#
Príprava SSH prístupu k cieľovému serveru#
Zálohy pošlete na iný server (domáci NAS s SSH, iný VPS). V ukážkach má cieľový server IP adresu 198.51.100.25, dosaďte namiesto nej adresu svojho servera.
Na cieľovom serveri (Ubuntu alebo Debian, prihlásenie ako root) pripravte používateľa a priečinok, do ktorého smie zapisovať:
adduser zaloha
mkdir -p /srv/zalohy
chown zaloha:zaloha /srv/zalohy
chmod 700 /srv/zalohyadduser zaloha– vytvorí používateľazaloha. Opýta sa na heslo (budete ho potrebovať v kroku 2 nižšie) a na nepovinné údaje, ktoré potvrdíte klávesom Enter.mkdir -p /srv/zalohy– priečinok pre zálohy.chown zaloha:zaloha– priečinok bude patriť používateľovizaloha, aby doň mohol zapisovať. Bez toho rsync aj restic skončia chybouPermission denied.chmod 700– do priečinka nesmie nikto iný.
Na cieľovom serveri musí byť povolené prihlásenie heslom aspoň dovtedy, než nahráte kľúč (krok 2). Na NAS postupujte podľa jeho návodu (používateľ, zdieľaný priečinok, zapnuté SSH).
Potom na zálohovanom VPS:
Vytvorte SSH kľúč bez hesla, ktorý použije iba zálohovanie:
bash ssh-keygen -t ed25519 -f /root/.ssh/zaloha -N "" -C "zaloha-vps"-t ed25519– moderný typ kľúča.-f /root/.ssh/zaloha– kam kľúč uložiť (vzniknezalohaazaloha.pub).-N ""– bez hesla ku kľúču, aby ho cron mohol použiť bez vás.-C "zaloha-vps"– popis kľúča.
Nahrajte verejný kľúč na cieľový server (zadáte heslo používateľa
zalohana cieľovom serveri):bash ssh-copy-id -i /root/.ssh/zaloha.pub [email protected]Pri prvom spojení sa SSH opýta
Are you sure you want to continue connecting (yes/no/[fingerprint])?. Napíšteyes: odtlačok cieľového servera sa uloží do/root/.ssh/known_hostsa cron sa potom už pýtať nebude.Vytvorte skratku na pripojenie. Otvorte
nano /root/.ssh/configa pridajte:/root/ .ssh/ textconfig Host zalohy HostName 198.51.100.25 User zaloha IdentityFile /root/.ssh/zalohaHost zalohy– skratka, ktorú potom použijete namiesto adresy.HostName– IP adresa alebo doména cieľového servera.User– používateľ na cieľovom serveri.IdentityFile– kľúč na prihlásenie.
Vyskúšajte pripojenie:
ssh zalohysa musí prihlásiť bez hesla. Odhláste sa príkazomexit.
Postup práce s kľúčmi podrobne: SSH kľúč.
rsync#
rsync kopíruje iba zmenené súbory, takže je rýchly aj pri veľkých zálohách. Musí byť nainštalovaný na oboch stranách (apt -y install rsync).
rsync -az /var/backups/vps/ zalohy:/srv/zalohy/vps1/-a– archívny režim: kopíruje rekurzívne a zachováva práva, časy a odkazy.-z– komprimuje dáta počas prenosu./var/backups/vps/– čo kopírovať. Lomka na konci znamená „obsah priečinka“, nie priečinok samotný.zalohy:/srv/zalohy/vps1/– cieľ: skratka zo~/.ssh/configa priečinok na cieľovom serveri.
Prenos zaraďte do skriptu zaloha.sh ako posledný riadok, alebo do crontabu hodinu po zálohe:
30 4 * * * rsync -az /var/backups/vps/ zalohy:/srv/zalohy/vps1/ >> /var/log/zaloha.log 2>&1Prečo bez --delete
Prepínač --delete by na cieli zmazal všetko, čo na VPS chýba. Keď útočník alebo chyba zmaže zálohy na VPS, zmazali by sa pri ďalšom behu aj na cieli. Staré zálohy na cieľovom serveri radšej mažte tam, napríklad vlastným cronom s find … -mtime +30 -delete.
Pamätajte, že útočník, ktorý ovládne VPS, môže kľúč zaloha použiť aj priamo a zálohy na cieli zmazať. Pred tým chráni až kópia, ku ktorej sa z VPS dostať nedá: napríklad cieľový server, ktorý si zálohy sťahuje sám (rsync spustený na cieli), alebo úložisko s históriou verzií.
restic (pre pokročilých)#
restic ukladá zálohy šifrovane a s deduplikáciou: opakujúce sa dáta sa uložia iba raz, takže môžete držať desiatky denných verzií s malými nárokmi na miesto. Dokáže zálohovať na SFTP server aj do cloudových úložísk.
Nainštalujte restic:
apt -y install restic.Vytvorte súbor s heslom repozitára a obmedzte jeho práva:
bash nano /root/.restic-heslo chmod 600 /root/.restic-hesloDo súboru vložte dlhé náhodné heslo (generátor hesiel).
Bez hesla zálohy neobnovíte
restic dáta šifruje. Keď heslo stratíte, zálohy už nikto nerozšifruje, ani vy. Uložte si ho aj mimo VPS (do správcu hesiel).
Založte repozitár na cieľovom serveri:
bash restic -r sftp:zalohy:/srv/zalohy/restic-vps1 --password-file /root/.restic-heslo init-r sftp:– repozitár cez SFTP;zalohy:/ srv/ zalohy/ restic-vps1 zalohyje skratka zo~/.ssh/config.--password-file– súbor s heslom, aby sa restic nepýtal (nutné pre cron).init– vytvorí nový prázdny repozitár. Uvidítecreated restic repository ….
Zálohujte (príkaz môžete dať do skriptu namiesto archívu
tar; export databázy ponechajte):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é verzie podľa 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– odoberie verzie (snapshoty), ktoré pravidlo nezachová.--keep-daily 7– ponechá poslednú verziu z každého zo 7 posledných dní so zálohou.--keep-weekly 4,--keep-monthly 6– navyše jednu verziu týždenne za 4 týždne a mesačne za 6 mesiacov.--prune– rovno zmaže dáta, na ktoré už žiadna verzia neodkazuje (uvoľní miesto).
Užitočné príkazy:
Príkaz (s -r … a --password-file …) | Čo robí |
|---|---|
snapshots | Zoznam uložených verzií s dátumom. |
restore latest --target /tmp/obnova | Obnoví poslednú verziu do priečinka /tmp/obnova. |
restore latest --target /tmp/obnova --include /etc/nginx | Obnoví iba vybraný priečinok. |
check | Skontroluje celistvosť repozitára. |
Alternatívou k resticu je BorgBackup (dokumentácia (otvorí sa v novom okne)), funguje na podobnom princípe.
Test obnovy#
Záloha, ktorú ste nikdy neskúsili obnoviť, je iba nádej. Aspoň raz za čas si ju vyskúšajte:
Vypíšte obsah archívu:
tar -tzf /var/.backups/ vps/ soubory-2026-10-01. tar. gz | head Rozbaľte jeden súbor do dočasného priečinka:
bash mkdir -p /tmp/obnova tar -xzf /var/backups/vps/soubory-2026-10-01.tar.gz -C /tmp/obnova etc/nginx/nginx.conf-x– rozbaliť,-z– formát gzip,-f– zo súboru.-C /tmp/obnova– kam rozbaliť (neprepíše sa tak živý súbor).etc/nginx/nginx.conf– čo rozbaliť (cesta bez úvodnej lomky).
Skontrolujte export databázy:
zcat /var/musí ukázať začiatok SQL exportu.backups/ vps/ db-2026-10-01. sql. gz | head -n 20 Úplný test (obnova databázy, spustenie aplikácie) robte na inom, testovacom VPS, nie na ostrom.
Obnova databázy prepíše súčasné dáta
Príkaz gunzip < db-….sql.gz | mariadb obnoví všetky databázy zo zálohy a prepíše ich súčasný obsah. Na ostrom VPS ho spúšťajte iba vtedy, keď naozaj chcete vrátiť stav zo zálohy. Postup obnovy jednej databázy je v návode MariaDB na VPS.
Overenie#
- Ráno po prvej noci:
tail /var/log/zaloha.logobsahuje riadokzáloha hotová. ls -lh /var/backups/vpsukazuje nové súbory s dnešným dátumom a rozumnou veľkosťou (nie 0 bajtov).- Na cieľovom serveri sú rovnaké súbory (rsync), alebo
restic snapshotsukazuje dnešnú verziu.
Keď niečo nefunguje#
Cron skript nespustil#
Skontrolujte, že beží cron a čo zapísal do logu:
systemctl status cron
journalctl -u cron -n 50Časté príčiny: v crontabe chýba celá cesta ku skriptu, skript nemá právo spustenia (chmod 700), alebo ste upravili crontab iného používateľa než root (crontab -l ho vypíše).
mariadb-dump: Got error: 1045: "Access denied for user …"#
Skript nebeží ako root, alebo databázový root používa heslo namiesto unix socketu. Spúšťajte skript z crontabu roota. Ak má root v databáze heslo, uložte ho do súboru /root/.my.cnf, odkiaľ si ho mariadb-dump prečíta sám:
[client]
user=root
password=<HESLO_ROOT_DATABAZE>[client]– skupina volieb pre všetky klientske programy MariaDB (mariadb,mariadb-dump).user,password– prihlasovacie údaje. Za<HESLO_ROOT_DATABAZE>dosaďte heslo databázového používateľaroot(bez špicatých zátvoriek).
Súbor zabezpečte príkazom chmod 600 /root/.my.cnf, aby heslo nemohol čítať nikto iný.
Záloha má 0 bajtov alebo je podozrivo malá#
Skript skončil chybou uprostred. Spustite ho ručne a prečítajte si chybu. Vďaka set -euo pipefail sa chyba exportu neprejde ticho.
Permission denied (publickey) pri rsync alebo restic#
Cieľový server neprijal kľúč. Overte ssh zalohy. Ak sa pýta na heslo alebo zlyhá, nahrajte kľúč znova (ssh-copy-id) a skontrolujte, že IdentityFile v /root/.ssh/config ukazuje na správny súbor.
restic: Fatal: wrong password or no key found#
Heslo v súbore /root/.restic-heslo nezodpovedá repozitáru. Skontrolujte, že v súbore nie je navyše medzera alebo iné heslo.
restic: Fatal: unable to open config file … Is there a repository at the following location?#
Repozitár na zadanej ceste neexistuje (preklep v ceste, alebo ste nespustili init).
Disk sa zapĺňa#
Zálohy sa nemažú, alebo sú príliš veľké. Skontrolujte, že beží krok find … -delete, znížte UCHOVAT_DNI a vynechajte priečinky s veľkými dátami, ktoré zálohujete inak.
Zhrnutie
- Zálohy VPS spravujeme my; v záložke Zálohy obnovíte celý disk, novšie dáta sa tým stratia.
- Jednotlivé súbory a databázy obnovíte iba z vlastných záloh.
- Databázy zálohujte exportom
mariadb-dump, súbory archívomtaralebo resticom. - Skript spúšťajte cronom a zálohy posielajte mimo VPS (rsync bez
--delete, restic so šifrovaním). - Obnovu si pravidelne vyskúšajte.