#!/bin/bash # # Полный скрипт миграции Gitea # Координирует весь процесс миграции # set -e # ============================================ # НАСТРОЙКИ - ОБЯЗАТЕЛЬНО ИЗМЕНИТЕ! # ============================================ # Исходный сервер (VM с Docker Gitea) SOURCE_HOST="192.168.0.38" SOURCE_USER="tactile" # Целевой Proxmox хост PROXMOX_HOST="192.168.0.33" PROXMOX_USER="root" # LXC контейнер LXC_ID="300" LXC_IP="192.168.0.40" # Docker контейнеры Gitea на исходном сервере GITEA_CONTAINER="gitea-server-1" DB_CONTAINER="gitea-db-1" # Версия Gitea (должна совпадать с исходной или новее) GITEA_VERSION="1.25.3" # Настройки PostgreSQL DB_USER="gitea" DB_NAME="gitea" DB_PASSWORD="gitea" # ОБЯЗАТЕЛЬНО УКАЖИТЕ РЕАЛЬНЫЙ ПАРОЛЬ! # Локальная директория для временных файлов WORK_DIR="/tmp/gitea-migration-$(date +%Y%m%d)" # ============================================ # ФУНКЦИИ # ============================================ log() { echo -e "\n\033[1;34m========================================\033[0m" echo -e "\033[1;34m $1\033[0m" echo -e "\033[1;34m========================================\033[0m\n" } step() { echo -e "\033[1;32m[STEP]\033[0m $1" } warn() { echo -e "\033[1;33m[WARN]\033[0m $1" } error() { echo -e "\033[1;31m[ERROR]\033[0m $1" >&2 exit 1 } confirm() { read -p "$1 [y/N] " response case "$response" in [yY][eE][sS]|[yY]) return 0 ;; *) return 1 ;; esac } # ============================================ # ГЛАВНОЕ МЕНЮ # ============================================ show_menu() { echo "" echo "==========================================" echo " Миграция Gitea: Docker VM → LXC" echo "==========================================" echo "" echo " Исходный сервер: $SOURCE_HOST" echo " Контейнер: $GITEA_CONTAINER" echo " БД контейнер: $DB_CONTAINER (PostgreSQL)" echo " Версия Gitea: $GITEA_VERSION" echo "" echo " Целевой сервер: $LXC_IP (LXC ID:$LXC_ID на $PROXMOX_HOST)" echo "" echo " Этапы миграции:" echo "" echo " 1) Проверить подключение к серверам" echo " 2) Создать бэкап на исходном сервере" echo " 3) Создать LXC контейнер" echo " 4) Установить Gitea в LXC" echo " 5) Перенести бэкап на новый сервер" echo " 6) Восстановить данные" echo " 7) Проверить миграцию" echo "" echo " 0) Выполнить всё автоматически" echo " q) Выход" echo "" read -p "Выберите действие: " choice echo "" } # ============================================ # ЭТАП 1: ПРОВЕРКА ПОДКЛЮЧЕНИЯ # ============================================ check_connections() { log "Проверка подключений" step "Проверка SSH к исходному серверу ($SOURCE_HOST)..." if ssh -o ConnectTimeout=5 -o BatchMode=yes "$SOURCE_USER@$SOURCE_HOST" "echo OK" 2>/dev/null; then echo " ✅ Подключение успешно" else warn "Не удалось подключиться. Настройте SSH ключи:" echo " ssh-copy-id $SOURCE_USER@$SOURCE_HOST" return 1 fi step "Проверка SSH к Proxmox ($PROXMOX_HOST)..." if ssh -o ConnectTimeout=5 -o BatchMode=yes "$PROXMOX_USER@$PROXMOX_HOST" "echo OK" 2>/dev/null; then echo " ✅ Подключение успешно" else warn "Не удалось подключиться. Настройте SSH ключи:" echo " ssh-copy-id $PROXMOX_USER@$PROXMOX_HOST" return 1 fi step "Проверка Docker на исходном сервере..." if ssh "$SOURCE_USER@$SOURCE_HOST" "docker ps" &>/dev/null; then echo " ✅ Docker доступен" echo "" echo " Контейнеры Gitea:" if ssh "$SOURCE_USER@$SOURCE_HOST" "docker ps --format ' {{.Names}}\t{{.Image}}\t{{.Status}}' | grep -i gitea"; then echo "" else warn "Контейнеры с 'gitea' в имени не найдены" echo " Все контейнеры:" ssh "$SOURCE_USER@$SOURCE_HOST" "docker ps --format ' {{.Names}}\t{{.Image}}'" fi # Проверяем настроенные контейнеры if ssh "$SOURCE_USER@$SOURCE_HOST" "docker ps --format '{{.Names}}' | grep -q '^${GITEA_CONTAINER}$'"; then echo " ✅ Контейнер $GITEA_CONTAINER найден" else warn "Контейнер $GITEA_CONTAINER не найден! Обновите GITEA_CONTAINER в настройках" fi if [ -n "$DB_CONTAINER" ]; then if ssh "$SOURCE_USER@$SOURCE_HOST" "docker ps --format '{{.Names}}' | grep -q '^${DB_CONTAINER}$'"; then echo " ✅ Контейнер БД $DB_CONTAINER найден" else warn "Контейнер БД $DB_CONTAINER не найден! Обновите DB_CONTAINER в настройках" fi fi else warn "Docker не найден или не доступен" fi echo "" echo "Проверка завершена" } # ============================================ # ЭТАП 2: БЭКАП # ============================================ create_backup() { log "Создание бэкапа Gitea" step "Копирование скрипта бэкапа на исходный сервер..." scp "$(dirname $0)/backup-gitea-for-migration.sh" "$SOURCE_USER@$SOURCE_HOST:/tmp/" step "Запуск бэкапа..." # Передаём настройки контейнеров через переменные окружения ssh "$SOURCE_USER@$SOURCE_HOST" "chmod +x /tmp/backup-gitea-for-migration.sh && \ GITEA_CONTAINER='$GITEA_CONTAINER' \ DB_CONTAINER='$DB_CONTAINER' \ DB_USER='$DB_USER' \ DB_NAME='$DB_NAME' \ /tmp/backup-gitea-for-migration.sh" step "Получение имени архива..." BACKUP_FILE=$(ssh "$SOURCE_USER@$SOURCE_HOST" "ls -t /tmp/gitea-backup-*.tar.gz 2>/dev/null | head -1") if [ -z "$BACKUP_FILE" ]; then error "Архив бэкапа не найден" fi echo " Архив: $BACKUP_FILE" echo "" echo "Бэкап создан" } # ============================================ # ЭТАП 3: СОЗДАНИЕ LXC # ============================================ create_lxc() { log "Создание LXC контейнера" step "Копирование скрипта на Proxmox..." scp "$(dirname $0)/../lxc/create-lxc.sh" "$PROXMOX_USER@$PROXMOX_HOST:/tmp/" step "Создание контейнера..." ssh "$PROXMOX_USER@$PROXMOX_HOST" "chmod +x /tmp/create-lxc.sh && CT_ID=$LXC_ID CT_IP=${LXC_IP}/24 /tmp/create-lxc.sh" echo "LXC контейнер создан" } # ============================================ # ЭТАП 4: УСТАНОВКА GITEA # ============================================ install_gitea() { log "Установка Gitea в LXC" step "Копирование скрипта установки..." scp "$(dirname $0)/install-gitea-lxc.sh" "$PROXMOX_USER@$PROXMOX_HOST:/tmp/" step "Копирование в LXC контейнер..." ssh "$PROXMOX_USER@$PROXMOX_HOST" "pct push $LXC_ID /tmp/install-gitea-lxc.sh /root/install-gitea-lxc.sh" step "Запуск установки (Gitea v$GITEA_VERSION, PostgreSQL)..." ssh "$PROXMOX_USER@$PROXMOX_HOST" "pct exec $LXC_ID -- bash -c 'chmod +x /root/install-gitea-lxc.sh && \ GITEA_VERSION=$GITEA_VERSION \ GITEA_DOMAIN=$LXC_IP \ DB_USER=$DB_USER \ DB_NAME=$DB_NAME \ DB_PASSWORD=$DB_PASSWORD \ /root/install-gitea-lxc.sh'" echo "Gitea установлена" } # ============================================ # ЭТАП 5: ПЕРЕНОС БЭКАПА # ============================================ transfer_backup() { log "Перенос бэкапа" step "Получение последнего бэкапа..." BACKUP_FILE=$(ssh "$SOURCE_USER@$SOURCE_HOST" "ls -t /tmp/gitea-backup-*.tar.gz 2>/dev/null | head -1") if [ -z "$BACKUP_FILE" ]; then error "Архив бэкапа не найден. Сначала выполните этап 2" fi step "Скачивание бэкапа локально..." mkdir -p "$WORK_DIR" scp "$SOURCE_USER@$SOURCE_HOST:$BACKUP_FILE" "$WORK_DIR/" LOCAL_BACKUP="$WORK_DIR/$(basename $BACKUP_FILE)" step "Загрузка на Proxmox..." scp "$LOCAL_BACKUP" "$PROXMOX_USER@$PROXMOX_HOST:/tmp/" step "Копирование в LXC контейнер..." ssh "$PROXMOX_USER@$PROXMOX_HOST" "pct push $LXC_ID /tmp/$(basename $BACKUP_FILE) /tmp/$(basename $BACKUP_FILE)" echo "Бэкап перенесён: /tmp/$(basename $BACKUP_FILE)" } # ============================================ # ЭТАП 6: ВОССТАНОВЛЕНИЕ # ============================================ restore_data() { log "Восстановление данных" step "Копирование скрипта восстановления..." scp "$(dirname $0)/restore-gitea.sh" "$PROXMOX_USER@$PROXMOX_HOST:/tmp/" ssh "$PROXMOX_USER@$PROXMOX_HOST" "pct push $LXC_ID /tmp/restore-gitea.sh /root/restore-gitea.sh" step "Получение имени бэкапа в LXC..." BACKUP_IN_LXC=$(ssh "$PROXMOX_USER@$PROXMOX_HOST" "pct exec $LXC_ID -- ls -t /tmp/gitea-backup-*.tar.gz 2>/dev/null | head -1") if [ -z "$BACKUP_IN_LXC" ]; then error "Бэкап не найден в LXC. Сначала выполните этап 5" fi step "Запуск восстановления..." ssh "$PROXMOX_USER@$PROXMOX_HOST" "pct exec $LXC_ID -- bash -c 'chmod +x /root/restore-gitea.sh && NEW_DOMAIN=$LXC_IP /root/restore-gitea.sh $BACKUP_IN_LXC'" echo "Данные восстановлены" } # ============================================ # ЭТАП 7: ПРОВЕРКА # ============================================ verify_migration() { log "Проверка миграции" step "Проверка статуса Gitea..." ssh "$PROXMOX_USER@$PROXMOX_HOST" "pct exec $LXC_ID -- systemctl status gitea --no-pager" || true step "Проверка доступности веб-интерфейса..." if curl -s --connect-timeout 5 "http://$LXC_IP:3000" | grep -q "Gitea"; then echo " ✅ Веб-интерфейс доступен" else warn "Веб-интерфейс недоступен. Проверьте логи:" echo " ssh $PROXMOX_USER@$PROXMOX_HOST 'pct exec $LXC_ID -- journalctl -u gitea -n 50'" fi echo "" echo "==========================================" echo " Миграция завершена!" echo "==========================================" echo "" echo " Gitea доступна: http://$LXC_IP:3000" echo "" echo " Не забудьте:" echo " - Проверить авторизацию" echo " - Проверить репозитории" echo " - Обновить DNS записи" echo " - Обновить git remote на клиентах" echo "" } # ============================================ # MAIN # ============================================ mkdir -p "$WORK_DIR" while true; do show_menu case "$choice" in 1) check_connections ;; 2) create_backup ;; 3) create_lxc ;; 4) install_gitea ;; 5) transfer_backup ;; 6) restore_data ;; 7) verify_migration ;; 0) log "Полная автоматическая миграция" if confirm "Начать полную миграцию?"; then check_connections || exit 1 create_backup create_lxc install_gitea transfer_backup restore_data verify_migration fi ;; q|Q) echo "Выход" exit 0 ;; *) echo "Неверный выбор" ;; esac echo "" read -p "Нажмите Enter для продолжения..." done