init
This commit is contained in:
363
migration-scripts/full-migration.sh
Executable file
363
migration-scripts/full-migration.sh
Executable file
@@ -0,0 +1,363 @@
|
||||
#!/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
|
||||
Reference in New Issue
Block a user