initial commit
This commit is contained in:
303
02/02-k-git-server-deploy.12.sh
Executable file
303
02/02-k-git-server-deploy.12.sh
Executable 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 завершён: Скрипты бэкапа созданы"
|
||||
Reference in New Issue
Block a user