Архитектура
Лор
Постоянно волновала надежность хранения данных своих репозиториев (где бы не находились удаленные репозитории: хоть свой git на сервере, хоть gitlab и т.д.), поэтому додумался до системы дублирования репозитория на разные backup-ноды.
Идея и архитектура этой системы максимально простая:
- Изменения в remote repo поступают только с рабочей ноды.
- Backup ноды лишь pull-ят самую актуальную версию с remote repo.
Работает это с помощью автоматически (systemd или cron) запускаемого ежедневно git pull скрипта
Backup нодами могут служить хоть флешки, не суть. Главное, чтобы было хранилище и возможность выполнять shell команды (не без git).
Естественно, репозиториев много у меня, поэтому скрипт будет pull-ить все.
Setup
git multi pull
Разработал такой простой скрипт (который будет поставляться вместе с репозиторием моих скриптов) для git pull для всех директорий, где есть .git/ :
#!/bin/bash -
function error_handler {
local exit_code="$?"
echo "Error: exit code: $?" >&2
exit "$exit_code"
}
trap error_handler ERR
set -eEuo pipefail
REPOS_LOCATION="$(realpath "$1")"
REPOS="$(find "$REPOS_LOCATION" -type d -name '.git' -exec dirname {} \;)"
THREADS_COUNT="$(wc -l <<< "$REPOS")"
xargs -P"$THREADS_COUNT" -I{} git -C {} pull <<< "$REPOS"
Schedule
Можно настроить cron (crontab -e
):
0 0 * * * /home/user/repos_backup/sh/git-multi-pull /home/user/repos_backup 2> /home/user/cron_logs/cron-stderr.log > /home/user/cron_logs/cron-stdout.log