Automatizace zálohování

Naučte se nastavit zálohy, které běží spolehlivě bez vašeho zásahu. Plánování, skriptování, monitoring a notifikace — vše, co potřebujete vědět.

Proč automatizovat zálohy

Ruční zálohování je nespolehlivé. Lidé zapomínají, odkládají, nebo se prostě nedostanou k pravidelnému kopírování dat. Studie společnosti Acronis ukazuje, že 42 % uživatelů, kteří zálohují ručně, vynechá zálohu alespoň jednou měsíčně. Ve firemním prostředí může jediná vynechaná záloha znamenat ztrátu dat za celý den práce desítek zaměstnanců.

Automatizace zálohy odstraňuje lidský faktor z procesu. Správně nastavená automatická záloha běží v pozadí bez zásahu uživatele — ve stanoveném čase, s předdefinovanou konfigurací, s automatickým ověřením a notifikací v případě problémů. Administrátor pak řeší pouze výjimky, místo aby řídil rutinní operace.

Zlaté pravidlo automatizace Automatizovaná záloha by měla splňovat princip „fire and forget" — nastavíte ji jednou a pak jen monitorujete. Pokud vyžaduje pravidelný manuální zásah, není dostatečně automatizovaná.

Plánování záloh

Než začnete automatizovat, musíte definovat zálohovací plán. Ten odpovídá na otázky: co zálohovat, kam, jak často, jak dlouho uchovávat a co dělat při selhání.

Definice zálohovacích úloh

Každá zálohovací úloha (backup job) by měla mít jasně definované parametry:

  • Zdroj: Jaká data nebo systémy se zálohují (cesty, databáze, VM, mailboxy)
  • Cíl: Kam se záloha ukládá (lokální disk, NAS, cloud, páska)
  • Typ: Plná, inkrementální, diferenciální nebo kontinuální záloha
  • Plán: Kdy a jak často záloha probíhá
  • Retence: Jak dlouho se zálohy uchovávají
  • Šifrování: Jakým algoritmem a s jakým klíčem
  • Notifikace: Kdo dostane zprávu při úspěchu/selhání

Retenční politiky

Retenční politika určuje, jak dlouho se zálohy uchovávají a kdy se starší zálohy mazou. Nejrozšířenějším schématem je GFS (Grandfather-Father-Son):

  • Denní zálohy (Son): uchovávat 7–14 dní
  • Týdenní zálohy (Father): uchovávat 4–8 týdnů
  • Měsíční zálohy (Grandfather): uchovávat 6–12 měsíců
  • Roční zálohy: uchovávat 3–7 let (dle regulačních požadavků)

Moderní zálohovací nástroje jako Restic nebo BorgBackup používají flexibilnější přístup — uchovávají všechny zálohy a při čištění (pruning) automaticky aplikují pravidla jako „uchovej jednu zálohu za den za poslední týden, jednu za týden za poslední měsíc, jednu za měsíc za poslední rok".

Nástroje pro plánování

Linux: Cron a Systemd Timers

Cron je tradiční plánovač úloh na Linuxu. Zálohovací skript přidáte do crontabu příkazem crontab -e. Syntaxe crontabu definuje minutu, hodinu, den v měsíci, měsíc a den v týdnu.

# Denní záloha v 2:00 ráno
0 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

# Plná záloha každou neděli v 1:00
0 1 * * 0 /usr/local/bin/backup-full.sh >> /var/log/backup.log 2>&1

# Inkrementální záloha každý pracovní den v 23:00
0 23 * * 1-5 /usr/local/bin/backup-incremental.sh >> /var/log/backup.log 2>&1

Systemd Timers jsou modernější alternativou k cronu s lepší integrací do systému, přesnějším plánováním a možností sledování stavu přes systemctl. Timer unit definuje kdy se spustí, service unit definuje co se spustí.

# /etc/systemd/system/backup.timer
[Unit]
Description=Denní záloha

[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
RandomizedDelaySec=300

[Install]
WantedBy=timers.target
# /etc/systemd/system/backup.service
[Unit]
Description=Zálohovací úloha
After=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
User=backup
StandardOutput=journal
StandardError=journal

Výhoda systemd timerů je parametr Persistent=true, který zajistí, že pokud byl počítač v plánovaném čase vypnutý, záloha se spustí co nejdříve po startu. Cron tuto funkci nemá — pokud je systém v plánovaný čas offline, záloha se přeskočí.

Windows: Plánovač úloh (Task Scheduler)

Windows Task Scheduler nabízí grafické rozhraní i příkazový řádek (schtasks) pro plánování úloh. Pro zálohovací skripty v PowerShellu:

# Vytvoření naplánované úlohy přes PowerShell
$trigger = New-ScheduledTaskTrigger -Daily -At "2:00AM"
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" `
    -Argument "-NoProfile -ExecutionPolicy Bypass -File C:\Scripts\backup.ps1"
$settings = New-ScheduledTaskSettingsSet -StartWhenAvailable `
    -DontStopOnIdleEnd -RestartCount 3 -RestartInterval (New-TimeSpan -Minutes 5)

Register-ScheduledTask -TaskName "DailyBackup" -Trigger $trigger `
    -Action $action -Settings $settings -User "SYSTEM" -RunLevel Highest

Parametr -StartWhenAvailable je ekvivalent Persistent=true u systemd — pokud byl počítač v plánovaném čase vypnutý, úloha se spustí při dalším startu.

macOS: launchd

Na macOS je nativním plánovačem launchd. Zálohovací úlohy se definují jako .plist soubory v ~/Library/LaunchAgents/ (uživatelské) nebo /Library/LaunchDaemons/ (systémové).

<!-- ~/Library/LaunchAgents/com.backup.daily.plist -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
  "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.backup.daily</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/bin/backup.sh</string>
    </array>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>2</integer>
        <key>Minute</key>
        <integer>0</integer>
    </dict>
</dict>
</plist>

Zálohovací skripty

Restic — kompletní zálohovací skript (Linux/macOS)

Restic je moderní zálohovací nástroj s deduplikací, šifrováním a podporou mnoha backendů (lokální disk, SFTP, S3, B2, Azure, GCS). Zde je kompletní zálohovací skript s notifikacemi:

#!/bin/bash
# backup.sh — Automatická záloha pomocí Restic
set -euo pipefail

# Konfigurace
export RESTIC_REPOSITORY="s3:s3.eu-central-1.amazonaws.com/my-backups"
export RESTIC_PASSWORD_FILE="/etc/restic/password"
export AWS_ACCESS_KEY_ID="AKIA..."
export AWS_SECRET_ACCESS_KEY="secret..."

BACKUP_PATHS="/home /etc /var/www"
EXCLUDE_FILE="/etc/restic/excludes.txt"
LOG_FILE="/var/log/restic-backup.log"
WEBHOOK_URL="https://hooks.slack.com/services/xxx/yyy/zzz"

# Funkce pro notifikaci
notify() {
    local status="$1"
    local message="$2"
    curl -s -X POST "$WEBHOOK_URL" \
        -H 'Content-type: application/json' \
        -d "{\"text\": \"[$status] Záloha $(hostname): $message\"}" \
        > /dev/null 2>&1 || true
}

# Spuštění zálohy
echo "=== Záloha zahájena: $(date) ===" >> "$LOG_FILE"

if restic backup $BACKUP_PATHS \
    --exclude-file="$EXCLUDE_FILE" \
    --tag "auto" \
    --verbose >> "$LOG_FILE" 2>&1; then

    # Čištění starých záloh
    restic forget \
        --keep-daily 7 \
        --keep-weekly 4 \
        --keep-monthly 12 \
        --keep-yearly 3 \
        --prune >> "$LOG_FILE" 2>&1

    # Kontrola integrity
    restic check >> "$LOG_FILE" 2>&1

    notify "OK" "Záloha dokončena úspěšně"
    echo "=== Záloha dokončena: $(date) ===" >> "$LOG_FILE"
else
    notify "CHYBA" "Záloha selhala! Zkontrolujte log: $LOG_FILE"
    echo "=== ZÁLOHA SELHALA: $(date) ===" >> "$LOG_FILE"
    exit 1
fi

BorgBackup — zálohovací skript s deduplikací

#!/bin/bash
# Záloha pomocí BorgBackup na vzdálený server
set -euo pipefail

export BORG_REPO="ssh://backup@backup-server:22/~/backups/$(hostname)"
export BORG_PASSPHRASE="$(cat /etc/borg/passphrase)"

# Vytvoření zálohy
borg create \
    --stats --progress \
    --compression zstd,6 \
    --exclude-caches \
    --exclude '/home/*/.cache' \
    --exclude '/var/tmp/*' \
    "::auto-{now:%Y-%m-%d_%H:%M}" \
    /home /etc /var/www /var/lib/docker/volumes

# Retenční politika
borg prune --stats \
    --keep-daily=7 \
    --keep-weekly=4 \
    --keep-monthly=6

# Ověření integrity
borg check --verify-data

PowerShell — záloha pro Windows

# backup.ps1 — Windows zálohovací skript
$ErrorActionPreference = "Stop"

$Source = @("C:\Users", "C:\Projects", "C:\Databases")
$Destination = "\\NAS\Backups\$(hostname)\$(Get-Date -Format 'yyyy-MM-dd')"
$LogFile = "C:\Logs\backup-$(Get-Date -Format 'yyyy-MM-dd').log"

try {
    # Vytvoření cílového adresáře
    New-Item -Path $Destination -ItemType Directory -Force | Out-Null

    foreach ($path in $Source) {
        $folderName = Split-Path $path -Leaf
        Write-Output "Zálohuji: $path" | Tee-Object -FilePath $LogFile -Append

        robocopy $path "$Destination\$folderName" /MIR /Z /MT:8 /R:3 /W:5 `
            /XD ".cache" "node_modules" ".git" `
            /LOG+:$LogFile /NP /NDL
    }

    # Odeslání notifikace
    Send-MailMessage -From "[email protected]" -To "[email protected]" `
        -Subject "Záloha $(hostname) — OK" `
        -Body "Záloha dokončena: $(Get-Date)" `
        -SmtpServer "smtp.firma.cz"
}
catch {
    Send-MailMessage -From "[email protected]" -To "[email protected]" `
        -Subject "CHYBA zálohy $(hostname)" `
        -Body "Chyba: $($_.Exception.Message)" `
        -SmtpServer "smtp.firma.cz" -Priority High
    exit 1
}

Monitoring a notifikace

Automatizovaná záloha bez monitoringu je jako alarm bez sirény. Musíte vědět, zda zálohy probíhají, jak dlouho trvají, kolik místa zabírají a zda neobsahují chyby.

E-mailové notifikace

Nejjednodušší forma monitoringu. Zálohovací skript odešle e-mail po dokončení (nebo selhání). Nevýhodou je, že pokud záloha vůbec neběží (například kvůli pádu plánovače), nedostanete žádný e-mail — a absence zprávy je snadno přehlédnutelná.

Push notifikace a webhooky

Moderní přístup využívá služby jako Slack, Microsoft Teams, Telegram nebo PagerDuty. Zálohovací skript odešle zprávu přes webhook nebo API. Výhodou je, že notifikace přijde okamžitě na telefon.

Dead man's switch (heartbeat monitoring)

Služby jako Healthchecks.io, Cronitor nebo Dead Man's Snitch fungují na opačném principu — zálohovací skript na konci „pingne" URL služby. Pokud ping nepřijde v očekávaném čase, služba vás upozorní. Tento přístup zachytí i případ, kdy záloha vůbec neběží.

# Na konci zálohovacího skriptu přidejte:
curl -s "https://hc-ping.com/vaše-uuid" > /dev/null

# Při selhání:
curl -s "https://hc-ping.com/vaše-uuid/fail" > /dev/null

Centralizovaný monitoring

Pro firmy s více servery je vhodný centralizovaný monitoring přes nástroje jako Prometheus + Grafana, Zabbix nebo Nagios. Zálohovací skript exportuje metriky (doba trvání, velikost zálohy, počet souborů, stav) a monitorovací systém je vizualizuje a upozorňuje na anomálie.

Nastavte alerting na chybějící zálohy Nejnebezpečnější situace nastane, když záloha tiše přestane běžet a nikdo si toho nevšimne týdny nebo měsíce. Vždy nastavte upozornění na případ, kdy záloha neproběhne — nejen na případ, kdy selže.

Osvědčené postupy

1. Oddělte zálohovací přístupové údaje

Zálohovací skript by měl běžet pod dedikovaným uživatelským účtem s minimálními potřebnými oprávněními. Přístupové údaje k úložišti ukládejte v chráněném souboru (chmod 600) nebo v systémovém secret manageru (Vault, AWS Secrets Manager). Nikdy neukládejte hesla přímo ve skriptu.

2. Logujte vše

Každý běh zálohy by měl vytvořit záznam obsahující: čas zahájení a dokončení, počet zálohovaných souborů a jejich velikost, případné chyby a varování, stav verifikace. Logy uchovávejte dostatečně dlouho pro analýzu trendů a troubleshooting.

3. Testujte zálohy automaticky

Pokud to zálohovací nástroj podporuje, nastavte automatickou verifikaci integrity po každé záloze. Restic nabízí příkaz restic check, BorgBackup borg check --verify-data, Veeam má funkci SureBackup pro automatický test obnovy.

4. Omezte okno zálohy

Záloha by neměla běžet v době špičkového provozu. Na serverech plánujte zálohy na noční hodiny nebo víkendy. U pracovních stanic využijte idle detection — záloha se spustí, když uživatel nepracuje. Šířku pásma pro cloud zálohy omezte parametry jako --bwlimit u rsync nebo Restic.

5. Ošetřete chybové stavy

Zálohovací skript musí správně reagovat na chyby: nedostupné úložiště, plný disk, výpadek sítě, zamknuté soubory. Implementujte retry logiku s exponenciálním backoffem pro dočasné chyby a okamžitou notifikaci pro kritické selhání.

6. Verzujte zálohovací konfiguraci

Zálohovací skripty, konfigurační soubory a dokumentaci uchovávejte v Git repozitáři. Při změně konfigurace vytvoříte commit s popisem změny, což umožňuje sledovat historii a v případě problému se vrátit k předchozí funkční verzi.

Přehled nástrojů pro automatizaci

Nástroj Platforma Automatizace Cloud GUI Cena
Restic Linux, macOS, Windows Cron/systemd/Task Scheduler S3, B2, Azure, GCS Ne (CLI) Zdarma
BorgBackup Linux, macOS Cron/systemd Přes SSH/rclone Vorta (GUI) Zdarma
Duplicati Linux, macOS, Windows Vestavěný plánovač 20+ backendů Ano (web) Zdarma
Veeam Agent Linux, Windows Vestavěný plánovač S3, Veeam Cloud Ano Free / placený
Acronis Cyber Protect Všechny Vestavěný plánovač Acronis Cloud Ano Placený
Backblaze macOS, Windows Kontinuální Backblaze Ano 9 USD/měsíc

Automatizace zálohy databází

Databáze vyžadují speciální přístup k zálohování, protože jednoduché kopírování souborů může vést k nekonzistentním zálohám. Většina databázových systémů nabízí nástroje pro konzistentní zálohu.

# PostgreSQL — automatická záloha s kompresí
pg_dump -Fc -U postgres mydb > "/backups/pg/mydb-$(date +%Y%m%d).dump"

# MySQL/MariaDB — záloha všech databází
mysqldump --all-databases --single-transaction --routines \
    --triggers > "/backups/mysql/all-$(date +%Y%m%d).sql"

# MongoDB — záloha s kompresí
mongodump --gzip --archive="/backups/mongo/dump-$(date +%Y%m%d).gz"

Tyto příkazy zabalte do zálohovacího skriptu s retencí a notifikacemi a naplánujte přes cron nebo systemd timer. U produkčních databází zvažte kontinuální archivaci WAL logů (PostgreSQL) nebo binárních logů (MySQL) pro point-in-time recovery.

Shrnutí

Automatizace záloh je investice, která se mnohonásobně vrátí. Jednou nastavený systém vás chrání 24 hodin denně, 7 dní v týdnu, bez nutnosti pamatovat si, co a kdy zálohovat. Klíčové body: používejte osvědčené nástroje (Restic, Borg, Duplicati, Veeam), nastavte retenční politiky, implementujte monitoring s heartbeat kontrolou a pravidelně testujte obnovu. Automatická záloha bez monitoringu a testování je jen poloviční řešení.