This commit is contained in:
2026-01-06 22:12:07 +05:00
commit 12f57baa26
13 changed files with 3110 additions and 0 deletions

View 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