Enhance deployment documentation and add redeploy guide
- Updated `README.md` to include instructions for the new `redeploy-ubuntu.sh` script and added a link to the new `REDEPLOY_GUIDE.md`. - Created `REDEPLOY_GUIDE.md` detailing the redeployment process, including backup creation, code updates, and troubleshooting steps. - Introduced `redeploy-hint.md` for GitHub Actions automation example, outlining setup for automatic redeployment on push events. - Improved documentation structure for better navigation and clarity.
This commit is contained in:
+96
-55
@@ -1,4 +1,4 @@
|
||||
#!/bin/bash
|
||||
#!/usr/bin/env bash
|
||||
|
||||
###############################################################################
|
||||
# AI Code Review Agent - Redeploy Script для Ubuntu/Debian
|
||||
@@ -7,10 +7,18 @@
|
||||
# Этот скрипт обновляет и перезапускает AI Review Agent на сервере
|
||||
#
|
||||
# Использование:
|
||||
# sudo bash redeploy-ubuntu.sh
|
||||
# или
|
||||
# sudo ./redeploy-ubuntu.sh
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
# Проверка, что используется bash
|
||||
if [ -z "$BASH_VERSION" ]; then
|
||||
echo "ERROR: Этот скрипт требует bash. Запустите: sudo bash redeploy-ubuntu.sh"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
set -e # Выход при ошибке
|
||||
|
||||
# Цвета для вывода
|
||||
@@ -58,47 +66,62 @@ if [ "$REAL_USER" = "root" ]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
INSTALL_DIR="/opt/ai-review"
|
||||
# Определить директорию установки
|
||||
# Если скрипт запущен из текущей директории, используем её
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
INSTALL_DIR="${SCRIPT_DIR}"
|
||||
SERVICE_NAME="ai-review"
|
||||
|
||||
# Проверка, что сервис установлен
|
||||
if [ ! -d "$INSTALL_DIR" ]; then
|
||||
print_error "AI Review Agent не установлен в $INSTALL_DIR"
|
||||
print_warning "Сначала запустите deploy-ubuntu.sh"
|
||||
# Проверить, что это похоже на директорию AI Review
|
||||
if [ ! -d "$INSTALL_DIR/backend" ] || [ ! -d "$INSTALL_DIR/frontend" ]; then
|
||||
print_error "Не найдены директории backend или frontend"
|
||||
print_warning "Запустите скрипт из корня проекта AI Review Agent"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Проверка, что сервис установлен
|
||||
if ! systemctl list-unit-files | grep -q "^${SERVICE_NAME}.service"; then
|
||||
print_error "Сервис ${SERVICE_NAME} не найден"
|
||||
print_warning "Сначала запустите deploy-ubuntu.sh"
|
||||
exit 1
|
||||
print_warning "Сервис ${SERVICE_NAME} не найден в systemd"
|
||||
print_warning "Продолжаем без управления сервисом..."
|
||||
SERVICE_EXISTS=false
|
||||
else
|
||||
SERVICE_EXISTS=true
|
||||
fi
|
||||
|
||||
cd "$INSTALL_DIR"
|
||||
print_warning "Рабочая директория: $INSTALL_DIR"
|
||||
|
||||
# ============================================================================
|
||||
# Шаг 1: Остановка сервиса
|
||||
# ============================================================================
|
||||
print_step 1 7 "Остановка сервиса..."
|
||||
|
||||
systemctl stop "$SERVICE_NAME"
|
||||
print_success "Сервис остановлен"
|
||||
if [ "$SERVICE_EXISTS" = true ]; then
|
||||
systemctl stop "$SERVICE_NAME" || print_warning "Не удалось остановить сервис"
|
||||
print_success "Сервис остановлен"
|
||||
else
|
||||
print_warning "Сервис не установлен, пропускаем остановку"
|
||||
fi
|
||||
|
||||
# ============================================================================
|
||||
# Шаг 2: Создание backup
|
||||
# ============================================================================
|
||||
print_step 2 7 "Создание backup..."
|
||||
|
||||
BACKUP_DIR="/opt/ai-review-backups"
|
||||
mkdir -p "$BACKUP_DIR"
|
||||
BACKUP_DIR="$INSTALL_DIR/backups"
|
||||
mkdir -p "$BACKUP_DIR" || print_warning "Не удалось создать директорию backup"
|
||||
BACKUP_NAME="backup-$(date +%Y%m%d-%H%M%S)"
|
||||
BACKUP_PATH="$BACKUP_DIR/$BACKUP_NAME"
|
||||
|
||||
# Backup базы данных
|
||||
if [ -f "$INSTALL_DIR/backend/review.db" ]; then
|
||||
mkdir -p "$BACKUP_PATH"
|
||||
cp "$INSTALL_DIR/backend/review.db" "$BACKUP_PATH/"
|
||||
print_success "База данных сохранена в $BACKUP_PATH"
|
||||
cp "$INSTALL_DIR/backend/review.db" "$BACKUP_PATH/" 2>/dev/null || {
|
||||
print_warning "Не удалось создать backup БД"
|
||||
}
|
||||
if [ -f "$BACKUP_PATH/review.db" ]; then
|
||||
print_success "База данных сохранена в $BACKUP_PATH"
|
||||
fi
|
||||
else
|
||||
print_warning "База данных не найдена, пропускаем backup"
|
||||
fi
|
||||
@@ -112,34 +135,28 @@ print_step 3 7 "Обновление кода..."
|
||||
if [ -d ".git" ]; then
|
||||
# Сохранить изменения в .env если есть
|
||||
if [ -f "backend/.env" ]; then
|
||||
cp backend/.env /tmp/ai-review-env-backup
|
||||
cp backend/.env /tmp/ai-review-env-backup 2>/dev/null || true
|
||||
fi
|
||||
|
||||
# Получить текущую ветку
|
||||
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
|
||||
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo "main")
|
||||
print_warning "Текущая ветка: $CURRENT_BRANCH"
|
||||
|
||||
# Обновить код
|
||||
sudo -u "$REAL_USER" git fetch --all
|
||||
sudo -u "$REAL_USER" git pull origin "$CURRENT_BRANCH"
|
||||
sudo -u "$REAL_USER" git fetch --all 2>/dev/null || print_warning "Не удалось обновить из git"
|
||||
sudo -u "$REAL_USER" git pull origin "$CURRENT_BRANCH" 2>/dev/null || print_warning "Не удалось выполнить git pull"
|
||||
|
||||
# Восстановить .env
|
||||
if [ -f "/tmp/ai-review-env-backup" ]; then
|
||||
cp /tmp/ai-review-env-backup backend/.env
|
||||
rm /tmp/ai-review-env-backup
|
||||
cp /tmp/ai-review-env-backup backend/.env 2>/dev/null || true
|
||||
rm /tmp/ai-review-env-backup 2>/dev/null || true
|
||||
fi
|
||||
|
||||
print_success "Код обновлен"
|
||||
else
|
||||
print_warning "Не git репозиторий, пропускаем обновление кода"
|
||||
echo "Если вы хотите обновить код вручную, сделайте это сейчас"
|
||||
read -p "Продолжить? (y/n): " -n 1 -r
|
||||
echo
|
||||
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||||
print_error "Отменено"
|
||||
systemctl start "$SERVICE_NAME"
|
||||
exit 1
|
||||
fi
|
||||
print_warning "Предполагается, что код уже обновлен вручную"
|
||||
sleep 2
|
||||
fi
|
||||
|
||||
# ============================================================================
|
||||
@@ -222,23 +239,28 @@ cd ..
|
||||
print_step 7 7 "Запуск сервиса..."
|
||||
|
||||
# Установить правильные права
|
||||
chown -R "$REAL_USER:$REAL_USER" "$INSTALL_DIR"
|
||||
chown -R "$REAL_USER:$REAL_USER" "$INSTALL_DIR" 2>/dev/null || print_warning "Не удалось установить права"
|
||||
|
||||
# Запустить сервис
|
||||
systemctl start "$SERVICE_NAME"
|
||||
|
||||
# Подождать немного
|
||||
sleep 2
|
||||
|
||||
# Проверить статус
|
||||
if systemctl is-active --quiet "$SERVICE_NAME"; then
|
||||
print_success "Сервис запущен"
|
||||
if [ "$SERVICE_EXISTS" = true ]; then
|
||||
# Запустить сервис
|
||||
systemctl start "$SERVICE_NAME"
|
||||
|
||||
# Подождать немного
|
||||
sleep 2
|
||||
|
||||
# Проверить статус
|
||||
if systemctl is-active --quiet "$SERVICE_NAME"; then
|
||||
print_success "Сервис запущен"
|
||||
else
|
||||
print_error "Сервис не запустился"
|
||||
echo ""
|
||||
echo "Логи сервиса:"
|
||||
journalctl -u "$SERVICE_NAME" -n 20 --no-pager
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
print_error "Сервис не запустился"
|
||||
echo ""
|
||||
echo "Логи сервиса:"
|
||||
journalctl -u "$SERVICE_NAME" -n 20 --no-pager
|
||||
exit 1
|
||||
print_warning "Сервис не установлен в systemd"
|
||||
print_warning "Запустите вручную: cd backend && source venv/bin/activate && uvicorn app.main:app --host 0.0.0.0 --port 8000"
|
||||
fi
|
||||
|
||||
# ============================================================================
|
||||
@@ -249,16 +271,35 @@ echo -e "${GREEN}╔════════════════════
|
||||
echo -e "${GREEN}║ Redeploy завершен успешно! ✅ ║${NC}"
|
||||
echo -e "${GREEN}╚════════════════════════════════════════╝${NC}"
|
||||
echo ""
|
||||
echo "Сервис: http://$(hostname -I | awk '{print $1}'):8000"
|
||||
echo "Статус: systemctl status $SERVICE_NAME"
|
||||
echo "Логи: journalctl -u $SERVICE_NAME -f"
|
||||
echo ""
|
||||
echo "Backup создан: $BACKUP_PATH"
|
||||
echo ""
|
||||
echo -e "${YELLOW}Для отката к предыдущей версии:${NC}"
|
||||
echo " 1. Остановите сервис: sudo systemctl stop $SERVICE_NAME"
|
||||
echo " 2. Восстановите БД: sudo cp $BACKUP_PATH/review.db $INSTALL_DIR/backend/"
|
||||
echo " 3. Откатите git: cd $INSTALL_DIR && sudo -u $REAL_USER git reset --hard HEAD~1"
|
||||
echo " 4. Запустите redeploy снова: sudo ./redeploy-ubuntu.sh"
|
||||
|
||||
# Получить IP адрес
|
||||
SERVER_IP=$(hostname -I 2>/dev/null | awk '{print $1}')
|
||||
if [ -z "$SERVER_IP" ]; then
|
||||
SERVER_IP="localhost"
|
||||
fi
|
||||
|
||||
echo "Сервис: http://${SERVER_IP}:8000"
|
||||
if [ "$SERVICE_EXISTS" = true ]; then
|
||||
echo "Статус: systemctl status $SERVICE_NAME"
|
||||
echo "Логи: journalctl -u $SERVICE_NAME -f"
|
||||
else
|
||||
echo "Запуск: cd $INSTALL_DIR/backend && source venv/bin/activate && uvicorn app.main:app --host 0.0.0.0 --port 8000"
|
||||
fi
|
||||
echo ""
|
||||
|
||||
if [ -f "$BACKUP_PATH/review.db" ]; then
|
||||
echo "Backup создан: $BACKUP_PATH"
|
||||
echo ""
|
||||
echo -e "${YELLOW}Для отката к предыдущей версии:${NC}"
|
||||
echo " 1. Остановите сервис"
|
||||
if [ -d ".git" ]; then
|
||||
echo " 2. Восстановите БД: sudo cp $BACKUP_PATH/review.db $INSTALL_DIR/backend/"
|
||||
echo " 3. Откатите git: cd $INSTALL_DIR && git reset --hard HEAD~1"
|
||||
echo " 4. Запустите redeploy снова: cd $INSTALL_DIR && sudo bash redeploy-ubuntu.sh"
|
||||
else
|
||||
echo " 2. Восстановите БД: sudo cp $BACKUP_PATH/review.db $INSTALL_DIR/backend/"
|
||||
echo " 3. Восстановите старые файлы вручную"
|
||||
fi
|
||||
fi
|
||||
echo ""
|
||||
|
||||
|
||||
Reference in New Issue
Block a user