Skip to content

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:

  1. Relační databáze PostgreSQL: Běží v kontejneru db a 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.
  2. Svazek médií (uploads): Trvalý diskový svazek Dockeru připojený do kontejneru cms na 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.sh

V lokálním vývojovém prostředí postačí spustit:

sh
ops/backup.sh

Co skript provede krok za krokem ​

  1. Vytvoří nový adresář s časovým razítkem ve formátu ops/backups/YYYYMMDD-HHMMSS/.
  2. V kontejneru db spustí příkaz pg_dump -U strapi -d strapi -Fc a výsledek uloží do souboru strapi.dump. Binární formát -Fc (custom format) je komprimovaný a umožňuje rychlou i selektivní obnovu.
  3. V kontejneru cms zabalí obsah adresáře public/uploads do komprimovaného archivu uploads.tgz pomocí příkazu tar czf - -C public/uploads ..
  4. Vypočte kontrolní součty SHA-256 pro oba vytvořené soubory a zapíše je do souboru SHA256SUMS.
  5. 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 SHA256SUMS

Na počítači se systémem macOS:

sh
cd ops/backups/<časové_razítko> && shasum -a 256 -c SHA256SUMS

Pokud 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 ​

  1. Ujistěte se, že běží databáze: Před spuštěním obnovy na novém serveru musí běžet služba db:
    sh
    docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d db
  2. Spusťte obnovovací skript:
    sh
    WEBYSKOL_PROD=1 ops/restore.sh ops/backups/<časové_razítko>
  3. Průběh obnovy: Skript nejprve zkontroluje soubory pomocí SHA256SUMS. Následně vyčistí databázi a nahraje data příkazem pg_restore --clean --if-exists --no-owner. Poté spustí kontejner cms bez závislostí a počká na jeho plnou připravenost. Nakonec vymaže starý obsah adresáře public/uploads/*, rozbalí archiv uploads.tgz a nastaví správné vlastnictví souborů pro uživatele node:node.
  4. 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
  5. 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.

Přehled historie změn v administraci

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>&1

Zá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 rclone nebo restic).

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 ​

  1. Stáhněte nejnovější zálohu z externího úložiště.
  2. Ověřte kontrolní součty v souboru SHA256SUMS.
  3. Na testovacím stroji spusťte čistou databázi: docker compose up -d db.
  4. Spusťte obnovu: ops/restore.sh <cesta_k_zaloze>.
  5. Spusťte celý systém: docker compose up -d.
  6. Spusťte automatické testy:
    sh
    node tests/tenant-test.mjs
    node tests/web-test.mjs
  7. 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.sh bez 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.sh nebo ops/restore.sh bez 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ý.

Související ​