====== Настраиваем Restic с systemd на Linux ====== [[https://restic.net/|Restic]] — активно развивающийся проект, написан на go, достаточно быстр и поддерживает большое количество бэкендов для хранения, среди которых есть как локальное хранилище, так и scp, S3 и многое другое. Отдельно хочется заметить, что есть специально созданный [[https://github.com/restic/rest-server|rest-server]] для restic, который позволяет наиболее быстро экспортировать хранилище для использования удалённо.\\ Программа достаточно проста, чтобы переноситься на любую ОС. Возможно, поэтому с ней не прилагается полноценный пример настройки на среднестатистической Linux-системе. Поставим задачу следующим образом: - Автоматический бэкап запускается ежедневно. - Бэкап хранит только важные файлы и данные. - Бэкап также включает в себя содержимое баз PostgreSQL, которое можно восстановить ''psql -f''. Здесь предполагается, что бэкап производится на машине с Ubuntu Server 20.04 и выполняется на [[https://github.com/restic/rest-server|rest-server]], работающий на ''192.168.1.200''. Тем не менее, конфигурация тривиально адаптируется к любому облачному провайдеру. Также предполагается, что репозиторий уже проинициализирован командой ''restic -r rest:[[http://192.168.1.200/your-repo/|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 Для запуска ''pg_dumpall'' от имени пользователя ''postgres'' понадобится следующая запись в ''/etc/sudoers'': restic ALL=(postgres) NOPASSWD:/usr/bin/pg_dumpall --clean Сервис ''/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}''.