Servery a DevOps

Zálohování VPS pomocí restic: šifrované, deduplikované, automatické

Nastavte restic na Ubuntu: repozitář na S3 nebo přes SFTP, záloha souborů i databáze, mazání starých snapshotů, timer a hlavně test obnovy.

12. 10. 2026 · 4 min čtení

Snapshot od poskytovatele VPS je fajn, ale není to plnohodnotná záloha – leží u stejného poskytovatele a obnovit z něj jeden smazaný soubor bývá nepohodlné. Restic je nástroj, který zálohuje šifrovaně, deduplikuje data (každý blok uloží jen jednou) a umí ukládat na S3 kompatibilní úložiště, SFTP server, Backblaze B2 a další cíle.

Instalace

sudo apt install restic
restic version

Verze v repozitáři Ubuntu bývá starší. Novější binárku získáte přes sudo restic self-update (funguje u oficiálních binárek z GitHubu; balíček z distribuce může mít tuto funkci vypnutou).

Kam zálohovat

Pravidlo 3-2-1: tři kopie dat, na dvou typech médií, jedna mimo lokalitu. Pro VPS to v praxi znamená zálohovat mimo poskytovatele, kde server běží.

Restic podporuje mimo jiné:

Backend Příklad adresy repozitáře
Lokální adresář /mnt/backup/restic
SFTP sftp:[email protected]:/srv/restic
S3 kompatibilní s3:https://s3.example.com/muj-bucket/server1
Backblaze B2 b2:muj-bucket:server1
rclone rclone:remote:cesta

Konfigurace přes soubor s proměnnými

Vytvořte /etc/restic/env (práva 600, vlastník root):

export RESTIC_REPOSITORY="s3:https://s3.example.com/muj-bucket/web01"
export RESTIC_PASSWORD_FILE="/etc/restic/password"
export AWS_ACCESS_KEY_ID="..."
export AWS_SECRET_ACCESS_KEY="..."

Heslo k repozitáři vygenerujte a uložte:

sudo mkdir -p /etc/restic
openssl rand -base64 32 | sudo tee /etc/restic/password
sudo chmod 600 /etc/restic/password /etc/restic/env

Heslo si uložte i jinam (správce hesel). Bez něj data z repozitáře nikdo neobnoví – ani vy.

Inicializace repozitáře:

sudo -i
source /etc/restic/env
restic init

Záloha databáze

Soubory databáze za běhu nekopírujte, vytvořte dump. Restic umí číst ze stdin, takže dump nemusí ležet na disku:

mysqldump --single-transaction --all-databases | restic backup --stdin --stdin-filename mysql.sql --tag db

Pro PostgreSQL:

sudo -u postgres pg_dumpall | restic backup --stdin --stdin-filename postgres.sql --tag db

U mysqldump předpokládáme, že root se přihlašuje přes unix_socket (výchozí v MariaDB na Ubuntu) nebo že máte přihlašovací údaje v /root/.my.cnf.

Zálohovací skript

/opt/scripts/restic-backup.sh:

#!/usr/bin/env bash
set -euo pipefail
source /etc/restic/env

# 1) Databáze
mysqldump --single-transaction --all-databases \
  | restic backup --stdin --stdin-filename mysql.sql --tag db

# 2) Soubory
restic backup /etc /var/www /home /opt \
  --exclude-caches \
  --exclude '/var/www/*/cache' \
  --exclude 'node_modules' \
  --tag files

# 3) Retence
restic forget --prune \
  --keep-daily 7 --keep-weekly 4 --keep-monthly 6

# 4) Kontrola integrity části dat
restic check --read-data-subset=5%
sudo chmod 700 /opt/scripts/restic-backup.sh

forget odstraní snapshoty mimo retenční pravidla, --prune pak uvolní místo. Retence se uplatňuje zvlášť pro každou kombinaci hostname a cest, takže snapshoty databáze a souborů si nepřekážejí.

Automatické spouštění

/etc/systemd/system/restic-backup.service:

[Unit]
Description=Restic záloha
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
ExecStart=/opt/scripts/restic-backup.sh
Nice=10
IOSchedulingClass=idle

/etc/systemd/system/restic-backup.timer:

[Timer]
OnCalendar=*-*-* 03:15:00
Persistent=true
RandomizedDelaySec=15min

[Install]
WantedBy=timers.target
sudo systemctl daemon-reload
sudo systemctl enable --now restic-backup.timer
sudo systemctl start restic-backup.service   # první ruční běh
journalctl -u restic-backup -n 50

Obnova: jediná část, na které záleží

Záloha, kterou jste nikdy neobnovili, je jen naděje. Vyzkoušejte si to:

source /etc/restic/env
restic snapshots
restic ls latest --tag files | grep nginx.conf

Obnova jednoho souboru do dočasného adresáře:

restic restore latest --tag files --target /tmp/obnova --include /etc/nginx/nginx.conf

Obnova databáze:

restic dump latest --tag db mysql.sql | mysql

Pohodlné procházení: restic mount /mnt/restic připojí všechny snapshoty jako adresáře (vyžaduje FUSE).

Restic, nebo Borg?

restic BorgBackup
Šifrování a deduplikace ano ano
Cloudová úložiště (S3, B2) nativně jen přes SSH server
Komprese ano (od verze 0.14, formát repozitáře v2) ano, víc voleb
Nejčastější volba pro S3/B2 a různé cíle vlastní zálohovací server přes SSH

Oba nástroje jsou spolehlivé. Pokud zálohujete na úložiště typu S3, je restic jednodušší.

Kontrolní seznam

  • [ ] heslo k repozitáři uložené mimo server
  • [ ] záloha mimo poskytovatele VPS
  • [ ] databáze přes dump, ne kopírováním souborů
  • [ ] retence přes forget --prune
  • [ ] vyzkoušená obnova souboru i databáze
  • [ ] kontrola logu timeru alespoň jednou za čas