Files
gitea-backup/migration-scripts/full-migration.sh
2026-01-06 22:12:07 +05:00

364 lines
13 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
#
# Полный скрипт миграции 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