Копирование резервных копий на другой сервер с помощью rsync и cron

У меня есть сервер резервного копирования, который координирует резервные копии на множестве серверов. Я хочу, чтобы мой сервер резервного копирования забирал резервные копии Discourse с сервера моего форума.

Я подумал, как разрешить серверу резервного копирования доступ к файлам резервных копий на сервере форума. Лучший способ, который я смог придумать, — предоставить удалённый доступ от имени пользователя www-data (который владеет резервными копиями Discourse).

Я не хотел разрешать серверу резервного копирования выполнять вход на сервер форума от имени root (по стандартным причинам системного администрирования). Также я хотел избежать любых действий, которые, как мне казалось, могут вызвать сбои в работе Discourse во время резервного копирования или восстановления. Кроме того, я не хотел запускать на сервере форума ещё один сервис.

Вот как я это реализовал.

Разрешение удалённого доступа от имени пользователя www-data

  1. Отредактируйте /etc/passwd и замените оболочку пользователя www-data на /bin/bash вместо /usr/sbin/nologin.
  2. Снова отредактируйте /etc/passwd и замените домашний каталог пользователя www-data на /home/www-data вместо /var/www (необязательно, но мне это кажется логичным).
  3. Добавьте SSH-ключ сервера резервного копирования в файл /home/www-data/.ssh/authorized_keys.

rsync

Наконец, на сервере резервного копирования я добавил ежечасную задачу cron, которая запускает следующий скрипт:

#!/usr/bin/env bash

set -xe

HOST="$1"
DIR="$2"
if [ -z "$HOST" ] || [ ! -d "$DIR" ]; then
	echo "$0 HOST DIR"
	exit 1
fi

# --ignore-existing заставит rsync игнорировать любые резервные копии, которые уже
# были скопированы.
# --delay-updates гарантирует, что в $DIR попадут только полные резервные копии. Если
# этот параметр не указан, в $DIR могут оказаться неполные резервные копии, и поскольку
# --ignore-existing не выполняет никакой проверки на равенство, проблема не будет
# исправлена или обнаружена.
rsync --ignore-existing --delay-updates "$HOST:/var/discourse/shared/standalone/backups/default/*" "$DIR"

Надеюсь, это окажется полезным кому-нибудь из вас.

8 лайков

Вау!!
Хотя я был бы очень признателен, если бы вы объяснили приведённые ниже шаги чуть подробнее, чтобы такие новички, как я, не могли ничего напутать (а также поняли, что делает каждый шаг).

Что делает приведённая выше команда?

Вы имеете в виду открытый ключ?

1 лайк

Это позволяет пользователю www-data успешно войти в систему. Это изменение «оболочки для входа» — хороший ключевой термин для поиска, чтобы узнать больше.

Да. Приватные ключи (по сути) никогда не должны копироваться или передаваться за пределы машины, на которой они находятся.

1 лайк

Учитывая, что вы немного новичок в поиске путей, не могло бы быть также простого способа переноса наших локальных резервных копий сервера в разные S3-бакеты, например Google S3, iDrive S3, через cron-задачи?
(Я знаю, что можно настроить это напрямую для бакета AWS S3, используя его ключ и секрет).

Если вы настроите резервное копирование S3, файлы будут автоматически загружаться в S3. Однако они содержат либо все загрузки, либо ничего, поэтому, если у вас нет загрузок в S3, в файлах резервных копий будет храниться несколько копий всех загрузок.

2 лайка

Об этом я уже знаю, и до сих пор, начиная с 6 лет назад, я использовал именно эту схему (загрузка всех медиафайлов и резервных копий в бакет AWS).

Но я задавал вопрос выше по поводу другой проблемы, с которой я столкнулся.
Теперь я настроил создание резервных копий (включающих медиафайлы ‘Uploads’) на локальном сервере Ubuntu. Но (как обсуждается в другой теме), я не могу восстановить систему из этих резервных копий (объемом 1 ГБ). Что-то упущено или вызывает проблему. Поэтому я подумал об использовании бакета Google и полном отказе от AWS.

1 лайк

Я не вижу разницы между AWS S3 и аналогами от Google. Но, возможно, https://restic.net/ вам поможет? Это программа для резервного копирования, которая умеет сохранять данные в бакеты S3.

Не уверен, в чём именно заключается ваша проблема с восстановлением.

2 лайка

Для тех, кто, как и я, попал в эту ветку, я хотел бы немного подробнее объяснить этот первый пост в теме.

  • Это bash-скрипт, который можно скопировать «как есть» в файл с любым именем, но с расширением .sh.
  • Первая строка скрипта просто настраивает среду для его запуска, указывая, какой оболочка или окружение должны использоваться: #!/usr/bin/env bash: это сообщает системе использовать интерпретатор bash, найденный через команду env.
  • Флаги (set -xe):
    • -x: включает отладку, то есть каждая команда и её аргументы будут выведены в терминал перед выполнением. Это полезно для отладки скрипта.
    • -e: заставляет скрипт немедленно завершиться, если любая команда вернёт ненулевой статус (что указывает на ошибку). Это полезно для предотвращения продолжения выполнения скрипта после сбоя.
  • Далее следует важный шаг: Переменные (HOST="$1" DIR="$2"):
    • HOST="$1": присваивает переменной HOST первый аргумент, переданный скрипту ($1). То есть при запуске скрипт запросит ввод от пользователя, и первый введённый параметр ($1) будет принят за значение «Host» (откуда, возможно, будут копироваться данные).
    • DIR="$2": присваивает переменной DIR второй аргумент, переданный скрипту ($2). То есть второй введённый пользователем параметр (путь к каталогу, называемый ‘$2’) будет воспринят скриптом как «Dir» — целевой каталог.
      Если кому-то интересно, я могу объяснить и оставшиеся два шага, но достаточно сказать, что следующий шаг просто проверяет, что пользователь ввёл корректные значения хоста и целевого каталога. В противном случае (последний шаг) вернётся код ошибки 1.

Главное, что я хочу подчеркнуть: это скрипт, который при запуске запросит у пользователя хост (откуда нужно копировать данные) и целевой каталог (куда нужно их вставить). И вам нужно будет указать путь к этому файлу в вашем файле cron, который может запускать этот скрипт столько раз в день, сколько вы зададите в файле cron.

Но то, что я не смог понять: где же находятся фактические команды копирования (или резервного копирования)?
Как именно произойдёт синхронизация?

1 лайк