Архитектура

Лор

Постоянно волновала надежность хранения данных своих репозиториев (где бы не находились удаленные репозитории: хоть свой git на сервере, хоть gitlab и т.д.), поэтому додумался до системы дублирования репозитория на разные backup-ноды.

Идея и архитектура этой системы максимально простая:

  1. Изменения в remote repo поступают только с рабочей ноды.
  2. Backup ноды лишь pull-ят самую актуальную версию с remote repo.
    Работает это с помощью автоматически (systemd или cron) запускаемого ежедневно git pull скрипта
    Backup нодами могут служить хоть флешки, не суть. Главное, чтобы было хранилище и возможность выполнять shell команды (не без git).

Естественно, репозиториев много у меня, поэтому скрипт будет pull-ить все.

Setup

git multi pull

Разработал такой простой скрипт (который будет поставляться вместе с репозиторием моих скриптов) для git pull для всех директорий, где есть .git/ :

git-multi-pull
#!/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):

/etc/crontab
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