initial commit

This commit is contained in:
unknown
2026-02-19 20:05:04 +03:00
parent 1ee67d8159
commit 05097d5dda
32 changed files with 4413 additions and 3 deletions

303
02/02-k-git-server-deploy.12.sh Executable file
View File

@@ -0,0 +1,303 @@
#!/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 завершён: Скрипты бэкапа созданы"