Restic хорошо известная программа для резервного копирования. Она достаточно проста, чтобы переноситься на любую ОС, и, вероятно, поэтому с ней не прилагается полноценный пример настройки на среднестатистической Linux-системе. Исправим это данным постом.
Поставим задачу следующим образом:
- Автоматический бэкап запускается ежедневно.
- Бэкап хранит только важные файлы и данные.
- Бэкап также включает в себя содержимое баз PostgreSQL, которое
можно восстановить
psql -f
.
Пишем два юнита / таймера для systemd, запускаем restic под
выделенным пользователем с CAP_DAC_READ_SEARCH
, для
PostgreSQL архивируем результат pg_dumpall
.
Здесь предполагается, что бэкап производится на машине с Ubuntu
Server 20.04 и выполняется на rest-server, работающий на
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 %IAfter=syslog.targetAfter=network-online.target[Service]Type=oneshotUser=restic# читать список файлов к бэкапу будем из /etc/restic/your-repo.filesExecStart=/usr/local/bin/restic backup --files-from /etc/restic/%I.files# считаем репозиторий и пароль из /etc/restic/your-repo.envEnvironmentFile=/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.serviceDescription=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_passwordRESTIC_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 bashset -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 %IAfter=syslog.targetAfter=network-online.targetAfter=postgresql.serviceRequires=postgresql.service[Service]Type=oneshotUser=resticExecStart=/usr/local/bin/pgdump.sh %IEnvironmentFile=/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}
.
Ссылки
- Рецепт бэкапа PostgreSQL в контейнере, из которого вырос скрипт в посте.
- Документация systemd: systemd.service, systemd.timer.
- Этот пост в моем блоге на английском языке.