Files
gitserver/02/02-k-git-server-deploy.12.sh
2026-02-19 20:05:04 +03:00

304 lines
11 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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 завершён: Скрипты бэкапа созданы"