- PVSM.RU - https://www.pvsm.ru -

Настраиваем Restic с systemd на Linux

Restic [1] — хорошо известная программа для резервного копирования. Она достаточно проста, чтобы переноситься на любую ОС, и, вероятно, поэтому с ней не прилагается полноценный пример настройки на среднестатистической Linux-системе. Исправим это данным постом.

Поставим задачу следующим образом:

  1. Автоматический бэкап запускается ежедневно.
  2. Бэкап хранит только важные файлы и данные.
  3. Бэкап также включает в себя содержимое баз PostgreSQL, которое можно восстановить psql -f.

TL;DR поста

Пишем два юнита / таймера для systemd, запускаем restic под выделенным пользователем с CAP_DAC_READ_SEARCH, для PostgreSQL архивируем результат pg_dumpall.

Здесь предполагается, что бэкап производится на машине с Ubuntu Server 20.04 и выполняется на rest-server [2], работающий на 192.168.1.200. Тем не менее, конфигурация тривиально адаптируется к любому облачному провайдеру. Также предполагается, что репозиторий уже проинициализирован командой restic -r rest:http://192.168.1.200/your-repo/ init.

Бэкапим файлы/директории

Выполнять ПО с правами суперпользователя без особой надобности нежелательно, поэтому создадим для наших задач отдельного пользователя restic без группы и командной оболочки:

# useradd -m -N -s /usr/sbin/nologin restic

Нам понадобится следующий сервис systemd с параметром и таймер к нему:

/etc/systemd/system/restic@.service:

[Unit]
# юнит активируется с параметром после @, то есть в
#   systemctl start restic@your-repo.service
# %I означает "your-repo"
Description=Restic backup on %I
After=syslog.target
After=network-online.target

[Service]
Type=oneshot
User=restic
# читать список файлов к бэкапу будем из /etc/restic/your-repo.files
ExecStart=/usr/local/bin/restic backup --files-from /etc/restic/%I.files
# считаем репозиторий и пароль из /etc/restic/your-repo.env
EnvironmentFile=/etc/restic/%I.env
# выполняем restic с capability DAC_READ_SEARCH, дающей право
# обходить права доступа ФС в Linux, это нужно для бэкапа
# директорий, которые могут читать только другие пользователи
# или суперпользователь
AmbientCapabilities=CAP_DAC_READ_SEARCH

[Install]
WantedBy=multi-user.target

/etc/systemd/system/restic@.timer:

[Unit]
# таймер, будучи запущенным с параметром после @
# (restic@your-repo.timer), запустит restic@your-repo.service
Description=Run Restic at 12:00 AM

[Timer]
# запускаем restic ежедневно в 12 часов ночи
OnCalendar=*-*-* 12:00:00

[Install]
WantedBy=timers.target

Адрес репозитория и пароль от него подаются на вход через файл с переменными среды в /etc/restic/your-repo.env. systemd читает их при старте юнита с правами root, поэтому имеет смысл задать разрешения директории /etc/restic/ соответствующим образом (т.е. 700 и владельцем установить root):

RESTIC_PASSWORD=your_repo_password
RESTIC_REPOSITORY=rest:http://192.168.1.200/your-repo/

Нам также понадобится список файлов/директорий к бэкапу в /etc/restic/your-repo.files:

/var/lib/docker
/etc/postgresql
/etc/restic
...

Бэкап PostgreSQL

Restic позволяет подачу данных для бэкапа через стандартный вход, так что мы можем скормить ему дамп, полученный pg_dumpall. Так как systemd запускает указанное директивой ExecStart вызовом execve(3), для использования перенаправления вывода и сжатия нам понадобится отдельный скрипт /usr/local/bin/pgdump.sh:

#!/usr/bin/env bash

set -euo pipefail

/usr/bin/sudo -u postgres pg_dumpall --clean 
    | gzip --rsyncable 
    | /usr/local/bin/restic backup --host $1 --stdin 
        --stdin-filename postgres-$1.sql.gz

Сервис /etc/systemd/system/restic-pg@.service достаточно тривиален:

[Unit]
Description=Restic PostgreSQL backup on %I
After=syslog.target
After=network-online.target
After=postgresql.service
Requires=postgresql.service

[Service]
Type=oneshot
User=restic
ExecStart=/usr/local/bin/pgdump.sh %I
EnvironmentFile=/etc/restic/%I.env

[Install]
WantedBy=multi-user.target

Таймер /etc/systemd/system/restic-pg@.timer не отличается от виденного выше:

[Unit]
Description=Run Restic on PostgreSQL at 12:00 AM

[Timer]
OnCalendar=*-*-* 0:00:00

[Install]
WantedBy=timers.target

Завершаем

Запустим таймеры и включим их автозагрузку:

# systemctl enable --now restic@your-repo.timer restic-pg@your-repo.timer

Проверим, работает ли построенная система:

# systemctl start restic@your-repo.service
# systemctl start restic-pg@your-repo.service

Данный набор юнитов позволяет бэкапиться в неограниченное количество репозиториев, нужно лишь создать соответствующие /etc/restic/repo-name.{env,files}.

Ссылки

Автор: tdemin

Источник [7]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/linux/361151

Ссылки в тексте:

[1] Restic: https://restic.net

[2] rest-server: https://github.com/restic/rest-server

[3] Рецепт бэкапа PostgreSQL в контейнере: https://forum.restic.net/t/recipe-to-snapshot-postgres-container/1707

[4] systemd.service: https://www.freedesktop.org/software/systemd/man/systemd.service.html

[5] systemd.timer: https://www.freedesktop.org/software/systemd/man/systemd.timer.html

[6] на английском языке: https://tdem.in/post/restic-with-systemd/

[7] Источник: https://habr.com/ru/post/540096/?utm_source=habrahabr&utm_medium=rss&utm_campaign=540096