#!/bin/bash #=============================================================================== # ШАГ 12: СКРИПТЫ РЕЗЕРВНОГО КОПИРОВАНИЯ #=============================================================================== # Запуск: sudo bash 02-k-git-server-deploy.12.sh #=============================================================================== SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) source "$SCRIPT_DIR/02-k-git-server-deploy.00.sh" init_log check_root print_header "ШАГ 12: СКРИПТЫ РЕЗЕРВНОГО КОПИРОВАНИЯ" #------------------------------------------------------------------------------- # 12.1 Создание директории для бэкапов #------------------------------------------------------------------------------- print_subheader "Создание директории для бэкапов" create_dir "/var/backups/gitea" "root:root" "750" #------------------------------------------------------------------------------- # 12.2 Скрипт резервного копирования #------------------------------------------------------------------------------- print_subheader "Создание скрипта бэкапа" cat > /usr/local/bin/gitea-backup.sh << 'BACKUP_SCRIPT' #!/bin/bash #=============================================================================== # Скрипт резервного копирования Gitea # Запуск: sudo /usr/local/bin/gitea-backup.sh [nfs|local] #=============================================================================== set -e # Конфигурация BACKUP_DATE=$(date +%Y%m%d_%H%M%S) BACKUP_NAME="gitea-backup-${BACKUP_DATE}" LOCAL_BACKUP_DIR="/var/backups/gitea" NFS_BACKUP_DIR="/mnt/nfs-backups/gitea" GITEA_DATA="/var/lib/gitea" GITEA_CONFIG="/etc/gitea" # Создание директории mkdir -p "${LOCAL_BACKUP_DIR}/${BACKUP_NAME}" echo "=== Начало резервного копирования ===" echo "Дата: $(date)" # Остановка Gitea echo "Остановка Gitea..." systemctl stop gitea # Бэкап репозиториев echo "Архивирование репозиториев..." tar -czf "${LOCAL_BACKUP_DIR}/${BACKUP_NAME}/repositories.tar.gz" \ -C "${GITEA_DATA}" repositories/ 2>/dev/null || true # Бэкап базы данных echo "Копирование базы данных..." cp "${GITEA_DATA}/data/gitea.db" "${LOCAL_BACKUP_DIR}/${BACKUP_NAME}/" 2>/dev/null || true # Бэкап конфигурации echo "Архивирование конфигурации..." tar -czf "${LOCAL_BACKUP_DIR}/${BACKUP_NAME}/config.tar.gz" \ -C "$(dirname ${GITEA_CONFIG})" "$(basename ${GITEA_CONFIG})" 2>/dev/null || true # Бэкап LFS (если есть) if [ -d "${GITEA_DATA}/data/lfs" ]; then echo "Архивирование LFS..." tar -czf "${LOCAL_BACKUP_DIR}/${BACKUP_NAME}/lfs.tar.gz" \ -C "${GITEA_DATA}/data" lfs/ 2>/dev/null || true fi # Бэкап аватаров (если есть) if [ -d "${GITEA_DATA}/data/avatars" ]; then tar -czf "${LOCAL_BACKUP_DIR}/${BACKUP_NAME}/avatars.tar.gz" \ -C "${GITEA_DATA}/data" avatars/ 2>/dev/null || true fi # Запуск Gitea echo "Запуск Gitea..." systemctl start gitea # Метаданные cat > "${LOCAL_BACKUP_DIR}/${BACKUP_NAME}/backup.info" << EOF Backup Date: $(date) Gitea Version: $(/usr/local/bin/gitea --version 2>/dev/null || echo "unknown") Hostname: $(hostname) Repositories: $(ls -1d ${GITEA_DATA}/repositories/*/*.git 2>/dev/null | wc -l) Size: $(du -sh ${LOCAL_BACKUP_DIR}/${BACKUP_NAME} 2>/dev/null | cut -f1) EOF # Копирование на NFS if mountpoint -q "$(dirname $NFS_BACKUP_DIR)" 2>/dev/null; then echo "Копирование на NFS..." mkdir -p "${NFS_BACKUP_DIR}" cp -r "${LOCAL_BACKUP_DIR}/${BACKUP_NAME}" "${NFS_BACKUP_DIR}/" || echo "Ошибка копирования на NFS" fi # Очистка старых бэкапов (30 дней) echo "Очистка старых бэкапов..." find "${LOCAL_BACKUP_DIR}" -maxdepth 1 -type d -name "gitea-backup-*" -mtime +30 -exec rm -rf {} \; 2>/dev/null || true echo "=== Резервное копирование завершено ===" echo "Расположение: ${LOCAL_BACKUP_DIR}/${BACKUP_NAME}" echo "Размер: $(du -sh ${LOCAL_BACKUP_DIR}/${BACKUP_NAME} | cut -f1)" BACKUP_SCRIPT chmod +x /usr/local/bin/gitea-backup.sh print_success "Скрипт бэкапа создан: /usr/local/bin/gitea-backup.sh" #------------------------------------------------------------------------------- # 12.3 Скрипт восстановления #------------------------------------------------------------------------------- print_subheader "Создание скрипта восстановления" cat > /usr/local/bin/gitea-restore.sh << 'RESTORE_SCRIPT' #!/bin/bash #=============================================================================== # Скрипт восстановления Gitea из бэкапа # Запуск: sudo /usr/local/bin/gitea-restore.sh /path/to/backup #=============================================================================== set -e BACKUP_DIR="$1" if [ -z "$BACKUP_DIR" ]; then echo "Использование: $0 /path/to/backup-directory" echo "" echo "Доступные бэкапы:" ls -1d /var/backups/gitea/gitea-backup-* 2>/dev/null || echo " Нет бэкапов" exit 1 fi if [ ! -d "$BACKUP_DIR" ]; then echo "Ошибка: Директория $BACKUP_DIR не существует" exit 1 fi echo "=== Восстановление Gitea ===" echo "Источник: $BACKUP_DIR" read -p "Продолжить? [y/N]: " CONFIRM [[ ! "$CONFIRM" =~ ^[Yy]$ ]] && exit 0 GITEA_DATA="/var/lib/gitea" GITEA_CONFIG="/etc/gitea" # Остановка systemctl stop gitea # Восстановление репозиториев if [ -f "$BACKUP_DIR/repositories.tar.gz" ]; then echo "Восстановление репозиториев..." rm -rf "${GITEA_DATA}/repositories" tar -xzf "$BACKUP_DIR/repositories.tar.gz" -C "${GITEA_DATA}" fi # Восстановление базы данных if [ -f "$BACKUP_DIR/gitea.db" ]; then echo "Восстановление базы данных..." cp "$BACKUP_DIR/gitea.db" "${GITEA_DATA}/data/gitea.db" chown git:git "${GITEA_DATA}/data/gitea.db" fi # Восстановление конфигурации if [ -f "$BACKUP_DIR/config.tar.gz" ]; then echo "Восстановление конфигурации..." tar -xzf "$BACKUP_DIR/config.tar.gz" -C / fi # Восстановление LFS if [ -f "$BACKUP_DIR/lfs.tar.gz" ]; then echo "Восстановление LFS..." tar -xzf "$BACKUP_DIR/lfs.tar.gz" -C "${GITEA_DATA}/data" fi # Права chown -R git:git "$GITEA_DATA" # Запуск echo "Запуск Gitea..." systemctl start gitea echo "=== Восстановление завершено ===" RESTORE_SCRIPT chmod +x /usr/local/bin/gitea-restore.sh print_success "Скрипт восстановления создан: /usr/local/bin/gitea-restore.sh" #------------------------------------------------------------------------------- # 12.4 Скрипт экспорта на GitHub #------------------------------------------------------------------------------- print_subheader "Создание скрипта экспорта на GitHub" cat > /usr/local/bin/gitea-to-github.sh << 'EXPORT_SCRIPT' #!/bin/bash #=============================================================================== # Экспорт репозиториев на GitHub # Запуск: sudo /usr/local/bin/gitea-to-github.sh # # ТРЕБУЕТСЯ НАСТРОЙКА: # - Создайте Personal Access Token на GitHub (Settings -> Developer settings -> Personal access tokens) # - Права: repo (full control) #=============================================================================== set -e GITEA_REPO_DIR="/var/lib/gitea/repositories" # НАСТРОЙТЕ ЭТИ ПАРАМЕТРЫ! GITHUB_USER="" # Ваш GitHub username GITHUB_TOKEN="" # Ваш GitHub Personal Access Token if [ -z "$GITHUB_USER" ] || [ -z "$GITHUB_TOKEN" ]; then echo "=== Экспорт репозиториев на GitHub ===" echo "" echo "Настройте переменные в скрипте:" echo " sudo nano /usr/local/bin/gitea-to-github.sh" echo "" echo "Укажите:" echo " GITHUB_USER - ваш GitHub username" echo " GITHUB_TOKEN - Personal Access Token с правами 'repo'" echo "" echo "Для получения токена:" echo " 1. GitHub -> Settings -> Developer settings -> Personal access tokens -> Tokens (classic)" echo " 2. Generate new token (classic)" echo " 3. Выберите права 'repo'" echo "" echo "Доступные репозитории:" find "$GITEA_REPO_DIR" -name "*.git" -type d 2>/dev/null | while read repo; do owner=$(basename $(dirname "$repo")) name=$(basename "$repo" .git) echo " $owner/$name" done exit 1 fi echo "=== Экспорт репозиториев на GitHub ===" echo "" export_repo() { local REPO_PATH="$1" local OWNER=$(basename $(dirname "$REPO_PATH")) local NAME=$(basename "$REPO_PATH" .git) echo "Экспорт $OWNER/$NAME..." # Создание репозитория на GitHub (если не существует) curl -s -X POST \ -H "Authorization: token $GITHUB_TOKEN" \ -H "Accept: application/vnd.github.v3+json" \ "https://api.github.com/user/repos" \ -d "{\"name\":\"$NAME\",\"private\":true}" > /dev/null 2>&1 || true # Зеркалирование TEMP_DIR=$(mktemp -d) git clone --bare "$REPO_PATH" "$TEMP_DIR" 2>/dev/null cd "$TEMP_DIR" git push --mirror "https://$GITHUB_TOKEN@github.com/$GITHUB_USER/$NAME.git" 2>/dev/null || true cd / rm -rf "$TEMP_DIR" echo " -> https://github.com/$GITHUB_USER/$NAME" } # Интерактивный выбор echo "Доступные репозитории:" find "$GITEA_REPO_DIR" -name "*.git" -type d | while read repo; do owner=$(basename $(dirname "$repo")) name=$(basename "$repo" .git) echo " $owner/$name" done echo "" read -p "Введите owner/repo для экспорта (или 'all' для всех): " TARGET if [ "$TARGET" = "all" ]; then find "$GITEA_REPO_DIR" -name "*.git" -type d | while read repo; do export_repo "$repo" done else IFS='/' read -r OWNER NAME <<< "$TARGET" REPO_PATH="$GITEA_REPO_DIR/$OWNER/$NAME.git" if [ -d "$REPO_PATH" ]; then export_repo "$REPO_PATH" else echo "Репозиторий не найден: $REPO_PATH" exit 1 fi fi echo "" echo "=== Экспорт завершён ===" EXPORT_SCRIPT chmod +x /usr/local/bin/gitea-to-github.sh print_success "Скрипт экспорта создан: /usr/local/bin/gitea-to-github.sh" print_success "Шаг 12 завершён: Скрипты бэкапа созданы"