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.
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.
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í.