Vzhled
Zálohy a obnova
Pravidelné zálohování a schopnost rychlé obnovy jsou základním pilířem bezpečného provozu platformy Než zazvoní CMS. Tato příručka popisuje fungování zálohovacích skriptů, kontrolu integrity datových souborů, pravidla pro ukládání kopií mimo server a postup pravidelné cvičné obnovy.
Postupy v této kapitole jsou určeny výhradně pro správce platformy s přístupem k serveru přes SSH.
Kde jsou uložena data
Všechna data platformy jsou uložena na dvou místech:
- Relační databáze PostgreSQL: Běží v kontejneru
dba ukládá veškerý strukturovaný obsah. Patří sem texty všech stránek a aktualit, relace mezi záznamy, nastavení jednotlivých škol, uživatelské účty redaktorů a kompletní záznamy v Historii změn. - Svazek médií (
uploads): Trvalý diskový svazek Dockeru připojený do kontejnerucmsna cestěpublic/uploads. Obsahuje všechny nahrané obrázky, fotografie, dokumenty PDF i tabulky nahrané školami přes Knihovnu médií.
Samotné kontejnery jsou bezstavové. Pro kompletní obnovu celé platformy postačuje mít k dispozici dump databáze a archiv složky médií.
Vytvoření zálohy (backup.sh)
K vytvoření kompletní zálohy slouží připravený skript ops/backup.sh. Skript se spouští v kořenovém adresáři projektu.
Na produkčním serveru spouštějte skript vždy s proměnnou WEBYSKOL_PROD=1:
sh
WEBYSKOL_PROD=1 ops/backup.shV lokálním vývojovém prostředí postačí spustit:
sh
ops/backup.shCo skript provede krok za krokem
- Vytvoří nový adresář s časovým razítkem ve formátu
ops/backups/YYYYMMDD-HHMMSS/. - V kontejneru
dbspustí příkazpg_dump -U strapi -d strapi -Fca výsledek uloží do souborustrapi.dump. Binární formát-Fc(custom format) je komprimovaný a umožňuje rychlou i selektivní obnovu. - V kontejneru
cmszabalí obsah adresářepublic/uploadsdo komprimovaného archivuuploads.tgzpomocí příkazutar czf - -C public/uploads .. - Vypočte kontrolní součty SHA-256 pro oba vytvořené soubory a zapíše je do souboru
SHA256SUMS. - Vypíše přehled vytvořených souborů a jejich velikost.
Výsledkem zálohy je adresář obsahující tři soubory:
strapi.dump: Binární export celé databáze PostgreSQL.uploads.tgz: Komprimovaný archiv všech souborů z Knihovny médií.SHA256SUMS: Textový soubor s kontrolními součty pro ověření neporušenosti dat.
Kontrola kontrolních součtů
Před jakoukoliv manipulací se zálohou nebo před zahájením obnovy je nutné ověřit, že soubory nebyly při přenosu či ukládání poškozeny.
Soubor SHA256SUMS obsahuje kontrolní otisky vytvořené s holými názvy souborů. Integritu můžete kdykoliv ověřit ručně v adresáři dané zálohy:
Na serveru se systémem Linux:
sh
cd ops/backups/<časové_razítko> && sha256sum -c SHA256SUMSNa počítači se systémem macOS:
sh
cd ops/backups/<časové_razítko> && shasum -a 256 -c SHA256SUMSPokud jsou soubory v pořádku, příkaz u obou položek vypíše stav OK. Pokud kontrolní součet nesouhlasí, soubor je poškozený a nesmí být k obnově použit.
Skript pro obnovu dat restore.sh toto ověření provádí automaticky před spuštěním jakýchkoliv zápisových akcí.
Postup obnovy ze zálohy (restore.sh)
Obnovu provádějte pomocí skriptu ops/restore.sh. Jako parametr předejte cestu k adresáři s vybranou zálohou.
Nevratný přepis dat
Obnova ze zálohy kompletně přepíše stávající databázi i všechny soubory ve složce médií. Spouštějte ji výhradně na novém prázdném serveru nebo po předchozím vytvoření zálohy stávajícího stavu.
Postup krok za krokem
- Ujistěte se, že běží databáze: Před spuštěním obnovy na novém serveru musí běžet služba
db:shdocker compose -f docker-compose.yml -f docker-compose.prod.yml up -d db - Spusťte obnovovací skript:sh
WEBYSKOL_PROD=1 ops/restore.sh ops/backups/<časové_razítko> - Průběh obnovy: Skript nejprve zkontroluje soubory pomocí
SHA256SUMS. Následně vyčistí databázi a nahraje data příkazempg_restore --clean --if-exists --no-owner. Poté spustí kontejnercmsbez závislostí a počká na jeho plnou připravenost. Nakonec vymaže starý obsah adresářepublic/uploads/*, rozbalí archivuploads.tgza nastaví správné vlastnictví souborů pro uživatelenode:node. - Spuštění zbývajících služeb: Po dokončení skriptu spusťte všechny kontejnery:sh
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d --build - Kontrola funkčnosti: Otevřete administraci a prověřte, že se zobrazují stránky, články i nahrané obrázky v Knihovně médií.
Všechny operace nad obsahem před zálohováním i po obnově můžete zkontrolovat v Historii změn.

Ukládání kopií mimo server
Ukládání záloh pouze na lokální disk virtuálního serveru nestačí. V případě havárie diskového pole, selhání celého VPS nebo nedostupnosti datacentra by došlo ke ztrátě dat i záloh.
Při zálohování dodržujte pravidlo 3-2-1:
- Mějte 3 kopie důležitých dat.
- Na 2 různých typech médií.
- 1 kopii umístěnou na fyzicky odděleném místě mimo produkční server.
Automatizace pomocí plánovače cron
Na produkčním serveru nastavte automatické spouštění zálohy každou noc. Do systémového plánovače cron (crontab -e) přidejte záznam:
cron
0 2 * * * cd /opt/webyskol && WEBYSKOL_PROD=1 ./ops/backup.sh >> /var/log/webyskol-backup.log 2>&1Záloha se spustí každou noc ve 2:00 ráno a záznam o průběhu se zapíše do protokolu /var/log/webyskol-backup.log.
Odesílání záloh do externího úložiště
Po vytvoření lokální zálohy odešlete nově vzniklý adresář na zabezpečené externí úložiště. Mezi doporučená řešení patří:
- Hetzner Storage Box: Cenově dostupné externí úložiště připojené přes SSH nebo rsync.
- Objektové úložiště S3: Ukládání záloh do S3 kompatibilního úložiště v rámci EU (například přes nástroj
rcloneneborestic).
Příklad odeslání záloh pomocí nástroje rsync:
sh
rsync -az /opt/webyskol/ops/backups/ zalohy@storagebox.example.com:/zalohy/webyskol/Pravidla pro uchovávání záloh
Pro úsporu místa na disku nastavte rotační schéma:
- Denní zálohy uchovávejte po dobu 7 dní.
- Týdenní zálohy uchovávejte po dobu 4 týdnů.
- Měsíční zálohy uchovávejte po dobu 6 měsíců.
Skript backup.sh v současnosti neprovádí automatické mazání starých lokálních záloh. Rotaci a promazávání disku je nutné zajistit externím skriptem nebo pravidlem v plánovači cron (například pomocí nástroje find s parametrem -mtime).
Pravidelný test obnovy
Neotestovaná záloha nepředstavuje spolehlivou ochranu. Jednou za měsíc proveďte cvičnou zkoušku obnovy na jiném stroji (například na vývojovém počítači nebo na staging serveru).
Postup cvičné obnovy
- Stáhněte nejnovější zálohu z externího úložiště.
- Ověřte kontrolní součty v souboru
SHA256SUMS. - Na testovacím stroji spusťte čistou databázi:
docker compose up -d db. - Spusťte obnovu:
ops/restore.sh <cesta_k_zaloze>. - Spusťte celý systém:
docker compose up -d. - Spusťte automatické testy:sh
node tests/tenant-test.mjs node tests/web-test.mjs - Otevřete web jedné ze škol v prohlížeči a prověřte načítání obrázků.
Tento nácvik zaručuje, že v případě skutečné havárie dokážete platformu obnovit v řádu desítek minut.
Časté chyby
- Spuštění obnovy na produkčním serveru bez aktuální zálohy: Skript
restore.shbez varování smaže data v databázi i nahrané soubory. Před jakýmkoliv zásahem vždy vytvořte čerstvou zálohu stávajícího stavu. - Vynechání proměnné WEBYSKOL_PROD=1 na produkci: Pokud na produkčním serveru spustíte
ops/backup.shneboops/restore.shbez této proměnné, Docker Compose se pokusí připojit k vývojové síti a operace selže. - Ponechání záloh pouze na disku VPS: Při selhání celého serveru přijdete o data i o zálohy. Automatický přenos kopií mimo server je povinný.

