Бекапи є в усіх — доки не спробуєш щось відновити. Каталог виявляється порожнім, cron-завдання померло ще в березні, а архів лежить на тому самому диску, що щойно відмовив. restic закриває майже всі ці проблеми: шифрує на вашому боці, зберігає кожен шматок даних один раз і дає змогу відновити один файл так само просто, як забекапити весь сервер.
Ось налаштування, якому ми довірилися б самі, на Ubuntu чи Debian.
1. Ставимо restic
apt update && apt install -y restic
restic self-update
Пакети в дистрибутивах відстають; self-update підтягне актуальну версію.
2. Обираємо місце для репозиторію
Репозиторій не повинен жити на сервері, який ви захищаєте. Два поширені варіанти:
- Інший сервер через SFTP:
sftp:backup@203.0.113.20:/srv/restic/web1 - S3-сумісне об'єктне сховище:
s3:https://s3.example.com/my-bucket/web1
3. Зберігаємо облікові дані
Тримаємо все в одному файлі, доступному лише root, щоб таймер і ваша оболонка використовували ті самі налаштування:
cat > /root/.restic-env <<'EOF'
export RESTIC_REPOSITORY="s3:https://s3.example.com/my-bucket/web1"
export RESTIC_PASSWORD_FILE="/root/.restic-pass"
export AWS_ACCESS_KEY_ID="your-key-id"
export AWS_SECRET_ACCESS_KEY="your-secret"
EOF
openssl rand -base64 32 > /root/.restic-pass
chmod 600 /root/.restic-env /root/.restic-pass
Тепер скопіюйте вміст /root/.restic-pass у менеджер паролів. Без нього бекапи не розшифрувати — ні вам, ні комусь іншому.
4. Ініціалізуємо й робимо перший бекап
source /root/.restic-env
restic init
restic backup /etc /home /root /srv /var/www \
--exclude-caches --exclude '/root/.cache'
restic snapshots
Виправте шляхи під те, де справді лежать ваші дані. Томи Docker містяться в /var/lib/docker/volumes, дані застосунків часто — у /srv або /opt.
5. Бази даних: спершу дамп, потім бекап
Не бекапте сирі файли робочої бази. Зробіть дамп просто перед бекапом:
mkdir -p /var/backups/db
sudo -u postgres pg_dump -Fc mydb > /var/backups/db/mydb.dump
Додайте /var/backups/db до шляхів бекапу. Докладніше про дампи — у нашій інструкції з PostgreSQL.
6. Розклад через systemd
Таймер тут кращий за cron: він пише в журнал і наздоганяє пропущений запуск, якщо сервер був вимкнений.
# /etc/systemd/system/restic-backup.service
[Unit]
Description=restic backup
[Service]
Type=oneshot
ExecStart=/bin/bash -c 'source /root/.restic-env && restic backup /etc /home /root /srv /var/www /var/backups/db --exclude-caches && restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune'
# /etc/systemd/system/restic-backup.timer
[Unit]
Description=Daily restic backup
[Timer]
OnCalendar=*-*-* 03:30:00
Persistent=true
[Install]
WantedBy=timers.target
systemctl daemon-reload
systemctl enable --now restic-backup.timer
systemctl list-timers restic-backup.timer
forget --prune лишає 7 щоденних, 4 щотижневі та 6 щомісячних знімків, решту видаляє. Якщо потрібен дамп бази, винесіть його в рядок ExecStartPre=.
7. Справді відновіть щось
Цей крок перетворює «бекапи в нас є» на факт. Витягніть один каталог у тимчасову теку й подивіться на нього:
source /root/.restic-env
restic restore latest --target /tmp/restore-test --include /etc/nginx
ls -la /tmp/restore-test/etc/nginx
restic check
Зробіть це зараз, а потім повторюйте раз на кілька місяців. restic check перевіряє структуру репозиторію, а відновлення доводить, що дані там справді є.
restic і Managed Backups
Вони не конкурують. Managed Backups роблять щоденну точку відновлення всього сервера з відкатом з особистого кабінету — швидкі ліки після невдалого оновлення. Коштують $2 на місяць і безкоштовно входять у будь-який річний тариф. restic дає копії на рівні файлів у сховищі, яким керуєте ви, — це важливо, коли зник файл із минулого вівторка або хочеться мати копію повністю поза нашою інфраструктурою.
Якщо зберігаєте чутливі дані, додайте повне шифрування диска, а для власного сховища бекапів подивіться сценарій із зашифрованим сховищем. Більшості невеликих серверів разом із бекапами вистачає тарифу Micro.
Коментарі
Поки немає коментарів. Будьте першим.