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

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

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


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


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

TL;DR поста

Пишем два юнита / таймера для 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 %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}.


Ссылки


  • Рецепт бэкапа PostgreSQL в контейнере, из которого вырос скрипт в посте.
  • Документация systemd: systemd.service, systemd.timer.
  • Этот пост в моем блоге на английском языке.
Источник: https://habr.com/ru/post/540096/


Интересные статьи

Интересные статьи

Нередко при работе с Bitrix24 REST API возникает необходимость быстро получить содержимое определенных полей всех элементов какого-то списка (например, лидов). Традиционн...
Я давно знаком с Битрикс24, ещё дольше с 1С-Битрикс и, конечно же, неоднократно имел дела с интернет-магазинами которые работают на нём. Да, конечно это дорого, долго, местами неуклюже...
Недавно на проекте интегрировал модуль CRM Битрикса c виртуальной АТС Ростелеком. Делал по стандартной инструкции, где пошагово показано, какие поля заполнять. Оказалось, следование ей не гаран...
Так как предыдущая статья зашла довольно хорошо, было бы неправильно не поделиться дополнительными утилитами, которые я использую и по сей день. Сразу хочу оговориться, что статья адаптирована ...
Есть в мире вещи, которые мы принимаем как нечто само собой разумеющееся, хотя они являются истинными шедеврами. Одними из таких вещей являются утилиты Linux, такие, как ls и ps. Хотя они обычно ...