304 lines
11 KiB
Bash
Executable File
304 lines
11 KiB
Bash
Executable File
#!/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 завершён: Скрипты бэкапа созданы"
|