У меня есть сервер резервного копирования, который координирует резервные копии на множестве серверов. Я хочу, чтобы мой сервер резервного копирования забирал резервные копии Discourse с сервера моего форума.
Я подумал, как разрешить серверу резервного копирования доступ к файлам резервных копий на сервере форума. Лучший способ, который я смог придумать, — предоставить удалённый доступ от имени пользователя www-data (который владеет резервными копиями Discourse).
Я не хотел разрешать серверу резервного копирования выполнять вход на сервер форума от имени root (по стандартным причинам системного администрирования). Также я хотел избежать любых действий, которые, как мне казалось, могут вызвать сбои в работе Discourse во время резервного копирования или восстановления. Кроме того, я не хотел запускать на сервере форума ещё один сервис.
Вот как я это реализовал.
Разрешение удалённого доступа от имени пользователя www-data
- Отредактируйте
/etc/passwdи замените оболочку пользователяwww-dataна/bin/bashвместо/usr/sbin/nologin. - Снова отредактируйте
/etc/passwdи замените домашний каталог пользователяwww-dataна/home/www-dataвместо/var/www(необязательно, но мне это кажется логичным). - Добавьте 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"
Надеюсь, это окажется полезным кому-нибудь из вас.