Привіт, я Kernelka! Сьогодні ми разом налаштуємо прості й надійні зашифровані резервні копії з Restic. Зробимо все акуратно: встановлення, шифрування паролем, автоматизація через systemd timers, а в кінці — перевіримо відновлення (бо без тесту відновлення бекап — не бекап) 🔐
Що будемо робити
- Встановимо Restic і ініціалізуємо репозиторій (локально або по SFTP).
- Створимо безпечний парольний файл та список виключень.
- Напишемо невеличкий bash скрипт для бекапу.
- Налаштуємо cron та systemd timers (основний спосіб — systemd).
- Зробимо тестове відновлення та швидку перевірку цілісності.
Усе робимо через термінал Linux, максимально прозоро та відтворювано. Підходить для робочих станцій і серверів, для резервного копіювання системи та даних.
Встановлення Restic та ініціалізація репозиторію
Restic одразу шифрує все в репозиторії (AES-256, Poly1305). Спочатку інсталюємо та готуємо базу.
# Debian/Ubuntu
sudo apt update && sudo apt install -y restic
# Fedora
# sudo dnf install -y restic
# Arch
# sudo pacman -S restic
# Створюємо локальний каталог репозиторію або підготуйте шлях SFTP
sudo mkdir -p /backup/restic
# Готуємо захищений парольний файл (тільки для root)
sudo mkdir -p /etc/restic
sudo sh -c 'umask 077 && echo "change-me-strong-passphrase" > /etc/restic/password.txt'
# Опис конфігурації для скрипту й сервісу (env-файл)
sudo tee /etc/restic/backup.env >/dev/null <<'EOF'
RESTIC_REPOSITORY=/backup/restic
RESTIC_PASSWORD_FILE=/etc/restic/password.txt
RESTIC_CACHE_DIR=/var/cache/restic
# Приклад SFTP (розкоментуйте і налаштуйте):
# RESTIC_REPOSITORY=sftp:user@backup.example.com:/srv/restic/$(hostname)
# RESTIC_PASSWORD_FILE=/etc/restic/password.txt
EOF
# Ініціалізуємо репозиторій (одноразово)
sudo restic init --repo /backup/restic --password-file /etc/restic/password.txt
Хочете хмару? Restic вміє S3, B2 і т. ін. Для S3 встановіть змінні AWS_ACCESS_KEY_ID/SECRET_ACCESS_KEY і задайте RESTIC_REPOSITORY=s3:s3.amazonaws.com/bucket-name.
Список виключень і дані для бекапу
Щоб не тягнути тимчасові й системні директорії, додайте виключення:
sudo tee /etc/restic/excludes.txt >/dev/null <<'EOF'
/dev
/proc
/sys
/tmp
/run
/mnt
/media
/lost+found
/var/tmp
/var/cache
EOF
Типові шляхи для бекапу: /etc, /home, /root, /var/www. За потреби додайте інші.
Скрипт резервного копіювання
Зробимо акуратний скрипт з логічним retention і легкою перевіркою даних. Це наш головний елемент автоматизації серед усіх bash скрипти.
sudo tee /usr/local/bin/restic-backup.sh >/dev/null <<'EOF'
#!/usr/bin/env bash
set -Eeuo pipefail
source /etc/restic/backup.env
mkdir -p "${RESTIC_CACHE_DIR}"
TS=$(date -Iseconds)
# Основний бекап
restic backup \
--password-file "${RESTIC_PASSWORD_FILE}" \
--repo "${RESTIC_REPOSITORY}" \
--one-file-system \
--tag "auto" --tag "${TS}" \
--exclude-file /etc/restic/excludes.txt \
/etc /home /root /var/www
# Політика зберігання: 7 денних, 4 тижневих, 6 місячних
restic forget \
--password-file "${RESTIC_PASSWORD_FILE}" \
--repo "${RESTIC_REPOSITORY}" \
--prune \
--keep-daily 7 --keep-weekly 4 --keep-monthly 6
# Швидка вибіркова перевірка (1% даних)
restic check \
--password-file "${RESTIC_PASSWORD_FILE}}" \
--repo "${RESTIC_REPOSITORY}" \
--read-data-subset=1% || true
EOF
sudo chmod 750 /usr/local/bin/restic-backup.sh
Тепер можна запустити тест вручну:
sudo /usr/local/bin/restic-backup.sh
Автоматизація через systemd service і timer
systemd надійніший за cron: з cron та systemd timers ми отримаємо відкладений запуск, логування в journal і відпрацювання пропущених запусків.
# Service unit
sudo tee /etc/systemd/system/backup-restic.service >/dev/null <<'EOF'
[Unit]
Description=Restic backup
Wants=network-online.target
After=network-online.target
[Service]
Type=oneshot
EnvironmentFile=/etc/restic/backup.env
ExecStart=/usr/local/bin/restic-backup.sh
Nice=10
IOSchedulingClass=best-effort
IOSchedulingPriority=7
CPUQuota=50%
IOWeight=200
ProtectSystem=full
ProtectHome=yes
PrivateTmp=yes
NoNewPrivileges=yes
EOF
# Timer unit
sudo tee /etc/systemd/system/backup-restic.timer >/dev/null <<'EOF'
[Unit]
Description=Daily Restic backup
[Timer]
OnCalendar=*-*-* 02:15
Persistent=true
RandomizedDelaySec=15m
Unit=backup-restic.service
[Install]
WantedBy=timers.target
EOF
# Активуємо
sudo systemctl daemon-reload
sudo systemctl start backup-restic.service
sudo systemctl status backup-restic.service --no-pager
sudo systemctl enable --now backup-restic.timer
systemctl list-timers | grep restic
Тест відновлення (must-have)
Тест — ключ до спокою ⏳. Відновимо один файл та порівняємо.
# Подивитися знімки
sudo restic snapshots --repo "$RESTIC_REPOSITORY" --password-file "$RESTIC_PASSWORD_FILE"
# Відновити один файл у тимчасовий каталог
sudo mkdir -p /tmp/restore-test
sudo restic restore latest \
--repo "$RESTIC_REPOSITORY" \
--password-file "$RESTIC_PASSWORD_FILE" \
--target /tmp/restore-test \
--include /etc/hosts
# Перевірка різниці
sudo diff -u /etc/hosts /tmp/restore-test/etc/hosts || true
# Опціонально: монтування для перегляду всього репозиторію (потрібен FUSE)
# sudo mkdir -p /mnt/restic
# sudo restic mount /mnt/restic --repo "$RESTIC_REPOSITORY" --password-file "$RESTIC_PASSWORD_FILE"
# fusermount -u /mnt/restic
Альтернативні способи
- Cron замість systemd: просто, але без Persistent та з гіршим логуванням.
- Віддалене сховище: SFTP або S3-сумісна хмара з обмеженням швидкості та шифруванням на клієнті.
# Приклад cron для root (щодня о 02:15)
# sudo crontab -e
15 2 * * * /usr/local/bin/restic-backup.sh >> /var/log/restic-cron.log 2>&1
# Для S3 (env у /etc/restic/backup.env):
# export AWS_ACCESS_KEY_ID=...
# export AWS_SECRET_ACCESS_KEY=...
# RESTIC_REPOSITORY=s3:s3.amazonaws.com/my-bucket
GUI-спосіб (через Cockpit для керування таймерами)
Прямого офіційного GUI для Restic немає, але можна керувати сервісом і таймером через веб-інтерфейс Cockpit (зручно для серверів):
# Встановлення Cockpit на Debian/Ubuntu
sudo apt update && sudo apt install -y cockpit
sudo systemctl enable --now cockpit.socket
# Далі відкрийте https://<IP-сервера>:9090, зайдіть у розділ Services
# і керуйте backup-restic.service / backup-restic.timer з GUI.
FAQ
Чи безпечний пароль у файлі?
Так, якщо права 600 і файл у /etc (тільки root). За бажанням використайте системні секрети або менеджер паролів.
Таймер не спрацював?
Перевірте: systemctl status backup-restic.timer, журнал journalctl -u backup-restic.service. З Persistent=true пропущений запуск відпрацює при наступному старті.
Отримую Permission denied під час бекапу.
Запускайте сервіс від root (як у прикладі) або дозвольте доступ групам/користувачам. Перевірте шляхи і виключення.
Репозиторій заблоковано (lock)?
Використайте: restic unlock — тільки якщо впевнені, що немає активного процесу.
Prune дуже повільний.
Виносьте prune в окремий тижневий таймер або зменшіть частоту. Можна робити forget щодня, а prune — щотижня.
Як перевірити цілісність?
Запустіть: restic check (або частково: --read-data-subset=1%). Регулярно переглядайте логи.
Як обмежити швидкість у мережі?
Додайте до backup: --limit-upload 2048 (KB/s) і, за бажанням, ionice/nice у сервісі.
Порада від Kernelka
Тримайте бекапи за правилом 3-2-1: три копії, на двох різних носіях, одна — поза приміщенням. Для ноутбука зручно мати локальний швидкий бекап і повільний, але віддалений S3/SFTP. І не забувайте тестувати відновлення раз на місяць!
Підсумок
- Restic дає зашифровані, дедупліковані бекапи «з коробки».
- Ми налаштували скрипт, сервіс і таймер systemd для автоматизації.
- Зробили тестове відновлення — бекап справді працює!
- Альтернативно можна використати cron або хмарні backends.
- GUI-керування таймерами можливе через Cockpit.

Прокоментувати
На сайті відображається лише твоє ім'я та коментар. Електронна пошта зберігається виключно для зв'язку з тобою за потреби та в жодному разі не передається стороннім особам.