Для автоматического создания резервной копии всех репозиториев в GitHub git и shh должны уже быть настроены и уметь работать с GitHub.

Генерируем api‑key он же personal access tokens

Идет в GitHub и переходим по пути

Домашняястраница GitHub -> Settings -> Developer settings ->Personal access token -> Fine-grained tokens -> Generate new token

Repository access - выбираем “All repositories”. Так как будем делать бэкапы не только на публичные, но и на приватные репозитории.

В Repository permissions необходимо выбрать только один пункт “Metadata” и установить его в Read-only

Имя токена, его описание и срок годности - на своё усмотрение.

Далее обязательно копируем токен и сохраняем его. Больше его не покажут. В противном случае придется повторить процедуру.

Можно не закрывать вкладку и вставить его сразу в скрипт на следующем шаге.

Подготавливаем каталог и файлы

В качестве примера возьмем каталог “/home/github”

Тут создаем файл “github_backuper.sh” и вставляем:

#!/bin/bash

API_TOKEN=""
BACKUP_DIR=""

PAGE=1

while : ; do
    REPOS=$(curl -s -H "Authorization: Bearer $API_TOKEN" \
        "https://api.github.com/user/repos?per_page=100&page=$PAGE&affiliation=owner")

    COUNT=$(echo "$REPOS" | grep -o '"ssh_url"' | wc -l)
    [ "$COUNT" -eq 0 ] && break

    echo "$REPOS" | grep '"ssh_url"' | awk -F'"' '{print $4}' | while read -r SSH_URL; do
        SSH_URL=$(echo "$SSH_URL" | sed 's/github\.com/github/')
        REPO_NAME=$(basename "$SSH_URL" .git)
        REPO_PATH="$BACKUP_DIR/$REPO_NAME"

        if [ -d "$REPO_PATH/.git" ]; then
            git -C "$REPO_PATH" pull --quiet
        else
            git clone --quiet "$SSH_URL" "$REPO_PATH"
        fi
    done

    PAGE=$((PAGE + 1))
done

Настраиваем планировщик cron

Следующим шагом запустим скрипт с помощью планировщика cron.

В /etc/crontab необходимо скорректировать несколько строк.

В переменную PATH добавить наш каталог для хранения (добавлять следует после символа “:”).

В нашем случае будет выглядеть вот так

PATH=/bin:/sbin:/home/github

Затем добавляем расписание в конец файла.

Для создания бэкапов каждый день в 00:00 добавим строку

00 00 * * * user /home/github/github_backuper.sh >> /home/github/log_github_backuper.log

Участок строки » /home/github/log_github_backuper.log нужен для логированияработы скрипта. Если эта информация не требуется то можно не писать.

user - пользователь из под которого будет запускаться скрипт.

Для упрощения формирования расписания, можно воспользоваться прекрасным сервисом.