From 493a14e2c830ea5b4fb87eca2e32a526bb9e5b00 Mon Sep 17 00:00:00 2001 From: Primakov Alexandr Alexandrovich Date: Mon, 13 Oct 2025 00:15:47 +0300 Subject: [PATCH] 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. --- .github/workflows/redeploy-hint.md | 83 ++++++ README.md | 11 +- REDEPLOY_GUIDE.md | 437 +++++++++++++++++++++++++++++ REDEPLOY_UBUNTU_QUICK.md | 150 ++++++++++ redeploy-ubuntu.sh | 151 ++++++---- 5 files changed, 775 insertions(+), 57 deletions(-) create mode 100644 .github/workflows/redeploy-hint.md create mode 100644 REDEPLOY_GUIDE.md create mode 100644 REDEPLOY_UBUNTU_QUICK.md diff --git a/.github/workflows/redeploy-hint.md b/.github/workflows/redeploy-hint.md new file mode 100644 index 0000000..8746d1d --- /dev/null +++ b/.github/workflows/redeploy-hint.md @@ -0,0 +1,83 @@ +# 🔄 Автоматический Redeploy через GitHub Actions (пример) + +Этот файл показывает, как настроить автоматическое обновление сервера при push в main. + +## ⚠️ Важно + +Этот workflow **НЕ** включен по умолчанию для безопасности. Чтобы включить: + +1. Переименуйте этот файл: `redeploy-hint.md` → `redeploy.yml` +2. Настройте secrets в GitHub: + - `SSH_PRIVATE_KEY` - SSH ключ для доступа к серверу + - `SERVER_HOST` - IP адрес или домен сервера + - `SERVER_USER` - Пользователь на сервере + +## Пример workflow: + +```yaml +name: Redeploy to Production + +on: + push: + branches: + - main + +jobs: + deploy: + runs-on: ubuntu-latest + + steps: + - name: Deploy to server + uses: appleboy/ssh-action@master + with: + host: ${{ secrets.SERVER_HOST }} + username: ${{ secrets.SERVER_USER }} + key: ${{ secrets.SSH_PRIVATE_KEY }} + script: | + cd /opt/ai-review + sudo git pull origin main + sudo ./redeploy-ubuntu.sh + + - name: Check service status + uses: appleboy/ssh-action@master + with: + host: ${{ secrets.SERVER_HOST }} + username: ${{ secrets.SERVER_USER }} + key: ${{ secrets.SSH_PRIVATE_KEY }} + script: | + sudo systemctl status ai-review --no-pager + + - name: Notify on failure + if: failure() + run: echo "Deployment failed! Check the logs." +``` + +## Альтернатива: Webhook + +Можно настроить webhook, который будет вызывать redeploy при push: + +```bash +# На сервере создать endpoint для webhook +# /opt/ai-review/webhook-server.sh + +#!/bin/bash +# Простой webhook сервер +while true; do + echo -e "HTTP/1.1 200 OK\n\n$(sudo /opt/ai-review/redeploy-ubuntu.sh 2>&1)" | nc -l -p 9000 +done +``` + +Затем в GitHub: +1. Settings → Webhooks → Add webhook +2. Payload URL: `http://your-server:9000` +3. Content type: `application/json` +4. Events: `Just the push event` + +## Безопасность + +⚠️ **Не используйте автоматический деплой без:** +1. Тестов в CI/CD +2. Staging окружения +3. Возможности быстрого отката +4. Мониторинга после деплоя + diff --git a/README.md b/README.md index 69e160d..3389fef 100644 --- a/README.md +++ b/README.md @@ -194,7 +194,11 @@ ERROR: Опечатка в строке: ### Автоматическое развертывание с systemd: ```bash +# Первичная установка sudo ./deploy-ubuntu.sh + +# Обновление после изменений +sudo ./redeploy-ubuntu.sh ``` Это настроит: @@ -202,8 +206,9 @@ sudo ./deploy-ubuntu.sh - ✅ Логирование в `/var/log/ai-review/` - ✅ Nginx reverse proxy (опционально) - ✅ SSL с Let's Encrypt (опционально) +- ✅ Автоматическое обновление с backup -**Подробнее:** [UBUNTU_DEPLOYMENT.md](UBUNTU_DEPLOYMENT.md) +**Подробнее:** [UBUNTU_DEPLOYMENT.md](UBUNTU_DEPLOYMENT.md) | [REDEPLOY_GUIDE.md](REDEPLOY_GUIDE.md) --- @@ -294,12 +299,14 @@ MIT ## 📚 Документация +- **[ORGANIZATION_QUICKSTART.md](ORGANIZATION_QUICKSTART.md)** - 🚀 Быстрый старт с организациями - **[DEPLOYMENT.md](DEPLOYMENT.md)** - Полное руководство по развертыванию +- **[UBUNTU_DEPLOYMENT.md](UBUNTU_DEPLOYMENT.md)** - Развертывание на Ubuntu/Debian +- **[REDEPLOY_GUIDE.md](REDEPLOY_GUIDE.md)** - 🔄 Обновление production сервера - **[ARCHITECTURE.md](ARCHITECTURE.md)** - Архитектура проекта - **[DEBUG_GUIDE.md](DEBUG_GUIDE.md)** - Отладка AI агента - **[MODEL_RECOMMENDATION.md](MODEL_RECOMMENDATION.md)** - Рекомендации по моделям - **[MASTER_TOKEN_FEATURE.md](MASTER_TOKEN_FEATURE.md)** - Мастер токены -- **[HTML_ESCAPE_FIX.md](HTML_ESCAPE_FIX.md)** - Экранирование HTML --- diff --git a/REDEPLOY_GUIDE.md b/REDEPLOY_GUIDE.md new file mode 100644 index 0000000..230370c --- /dev/null +++ b/REDEPLOY_GUIDE.md @@ -0,0 +1,437 @@ +# 🔄 Руководство по обновлению (Redeploy) + +## 📋 Содержание + +- [Быстрый старт](#-быстрый-старт) +- [Что делает скрипт](#-что-делает-скрипт) +- [Использование](#-использование) +- [Откат изменений](#-откат-изменений) +- [Troubleshooting](#-troubleshooting) + +--- + +## 🚀 Быстрый старт + +После внесения изменений в код на сервере: + +```bash +cd /opt/ai-review +sudo ./redeploy-ubuntu.sh +``` + +Скрипт автоматически: +1. Создаст backup +2. Обновит код +3. Применит изменения +4. Перезапустит сервис + +--- + +## 🔧 Что делает скрипт + +### Шаг 1: Остановка сервиса +```bash +systemctl stop ai-review +``` +Безопасно останавливает работающий сервис. + +### Шаг 2: Создание backup +```bash +# Backup сохраняется в: +/opt/ai-review-backups/backup-YYYYMMDD-HHMMSS/ +``` +Создается копия базы данных на случай проблем. + +### Шаг 3: Обновление кода +```bash +git fetch --all +git pull origin +``` +Загружает последние изменения из репозитория. + +### Шаг 4: Обновление зависимостей Backend +```bash +cd backend +source venv/bin/activate +pip install --upgrade pip +pip install -r requirements.txt +``` +Устанавливает новые Python пакеты, если добавлены. + +### Шаг 5: Применение миграций БД +```bash +python migrate.py +``` +Создает новые таблицы или изменяет существующие. + +### Шаг 6: Сборка Frontend +```bash +cd frontend +npm install # если нужно +npm run build +``` +Собирает React приложение в production режиме. + +### Шаг 7: Запуск сервиса +```bash +systemctl start ai-review +``` +Запускает обновленный сервис. + +--- + +## 📖 Использование + +### Стандартное обновление + +```bash +# 1. Зайти на сервер +ssh user@your-server + +# 2. Перейти в директорию проекта +cd /opt/ai-review + +# 3. Обновить код (если нужно) +git pull + +# 4. Запустить redeploy +sudo ./redeploy-ubuntu.sh +``` + +### Обновление конкретной ветки + +```bash +cd /opt/ai-review +git checkout feature-branch +git pull +sudo ./redeploy-ubuntu.sh +``` + +### Обновление без Git + +Если проект не в Git: + +```bash +# 1. Скопировать новые файлы на сервер +scp -r ./backend user@server:/opt/ai-review/ +scp -r ./frontend user@server:/opt/ai-review/ + +# 2. Запустить redeploy +ssh user@server 'cd /opt/ai-review && sudo ./redeploy-ubuntu.sh' +``` + +--- + +## ⏮️ Откат изменений + +### Быстрый откат + +Если после обновления что-то сломалось: + +```bash +# 1. Остановить сервис +sudo systemctl stop ai-review + +# 2. Найти последний backup +ls -lt /opt/ai-review-backups/ + +# 3. Восстановить БД +sudo cp /opt/ai-review-backups/backup-YYYYMMDD-HHMMSS/review.db /opt/ai-review/backend/ + +# 4. Откатить код (если использовался git pull) +cd /opt/ai-review +sudo -u $USER git reset --hard HEAD~1 + +# 5. Запустить redeploy снова +sudo ./redeploy-ubuntu.sh +``` + +### Откат к конкретному коммиту + +```bash +cd /opt/ai-review + +# Посмотреть историю +git log --oneline -10 + +# Откатиться к нужному коммиту +sudo -u $USER git reset --hard + +# Redeploy +sudo ./redeploy-ubuntu.sh +``` + +### Восстановление из backup + +Если нужно только восстановить БД: + +```bash +# Остановить сервис +sudo systemctl stop ai-review + +# Восстановить БД +sudo cp /opt/ai-review-backups/backup-YYYYMMDD-HHMMSS/review.db /opt/ai-review/backend/ + +# Запустить сервис +sudo systemctl start ai-review +``` + +--- + +## 🐛 Troubleshooting + +### Ошибка: "Сервис не запустился" + +```bash +# Посмотреть логи +journalctl -u ai-review -n 50 --no-pager + +# Проверить конфигурацию +cat /opt/ai-review/backend/.env + +# Попробовать запустить вручную +cd /opt/ai-review/backend +source venv/bin/activate +uvicorn app.main:app --host 0.0.0.0 --port 8000 +``` + +### Ошибка: "Virtual environment не найден" + +```bash +cd /opt/ai-review/backend + +# Пересоздать venv +python3 -m venv venv +source venv/bin/activate +pip install --upgrade pip +pip install -r requirements.txt +``` + +### Ошибка: "Frontend не собрался" + +```bash +cd /opt/ai-review/frontend + +# Удалить node_modules и пересобрать +rm -rf node_modules +npm install +npm run build + +# Проверить результат +ls -lh ../backend/public/ +``` + +### Ошибка: "Permission denied" + +```bash +# Исправить права доступа +sudo chown -R $USER:$USER /opt/ai-review +sudo chmod +x /opt/ai-review/redeploy-ubuntu.sh +``` + +### Сервис постоянно перезапускается + +```bash +# Остановить автоматический перезапуск +sudo systemctl stop ai-review +sudo systemctl disable ai-review + +# Запустить в режиме отладки +cd /opt/ai-review/backend +source venv/bin/activate +uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload + +# Когда найдете проблему, включить обратно +sudo systemctl enable ai-review +sudo systemctl start ai-review +``` + +### База данных заблокирована + +```bash +# Остановить все процессы, использующие БД +sudo systemctl stop ai-review +sudo lsof /opt/ai-review/backend/review.db + +# Если процессы остались, убить их +sudo kill -9 + +# Запустить сервис +sudo systemctl start ai-review +``` + +--- + +## 📊 Проверка после обновления + +### Checklist: + +1. **Сервис запущен:** + ```bash + systemctl status ai-review + ``` + Должно быть: `Active: active (running)` + +2. **API отвечает:** + ```bash + curl http://localhost:8000/docs + ``` + Должно вернуть HTML страницу Swagger UI + +3. **Frontend доступен:** + ```bash + curl http://localhost:8000/ | grep "AI Review" + ``` + Должно найти "AI Review" в HTML + +4. **WebSocket работает:** + ```bash + curl -i -N -H "Connection: Upgrade" -H "Upgrade: websocket" http://localhost:8000/ws/reviews + ``` + Должно вернуть `101 Switching Protocols` + +5. **База данных обновлена:** + ```bash + cd /opt/ai-review/backend + source venv/bin/activate + sqlite3 review.db ".tables" + ``` + Должны быть все таблицы, включая новые + +6. **Логи чистые:** + ```bash + journalctl -u ai-review -n 20 --no-pager + ``` + Не должно быть ERROR сообщений + +--- + +## 🔐 Best Practices + +### 1. Перед обновлением + +- ✅ Проверить текущий статус: `systemctl status ai-review` +- ✅ Посмотреть логи: `journalctl -u ai-review -n 50` +- ✅ Убедиться, что нет активных review +- ✅ Предупредить пользователей о downtime + +### 2. Во время обновления + +- ✅ Следить за выводом скрипта +- ✅ Не прерывать процесс +- ✅ Записать версию, на которую обновляетесь + +### 3. После обновления + +- ✅ Проверить все пункты из Checklist +- ✅ Протестировать основной функционал +- ✅ Проверить, что старые review не сломались +- ✅ Убедиться, что новые фичи работают + +### 4. В случае проблем + +- ✅ Сохранить логи: `journalctl -u ai-review > error.log` +- ✅ Откатиться к предыдущей версии +- ✅ Разобраться с проблемой в dev окружении +- ✅ Повторить обновление после исправления + +--- + +## 📅 Регулярное обслуживание + +### Еженедельно: + +```bash +# Проверить место на диске +df -h /opt + +# Очистить старые backups (старше 30 дней) +find /opt/ai-review-backups/ -type d -mtime +30 -exec rm -rf {} \; + +# Проверить обновления системы +sudo apt update +sudo apt list --upgradable +``` + +### Ежемесячно: + +```bash +# Обновить Python пакеты +cd /opt/ai-review/backend +source venv/bin/activate +pip list --outdated +pip install --upgrade pip +pip install --upgrade -r requirements.txt + +# Обновить Node.js пакеты +cd /opt/ai-review/frontend +npm outdated +npm update + +# Redeploy +cd /opt/ai-review +sudo ./redeploy-ubuntu.sh +``` + +--- + +## 🎯 Автоматизация + +### Настроить автоматическое обновление (не рекомендуется для production) + +```bash +# Создать cron job для автоматического обновления каждую ночь +sudo crontab -e + +# Добавить строку: +0 3 * * * cd /opt/ai-review && ./redeploy-ubuntu.sh >> /var/log/ai-review-redeploy.log 2>&1 +``` + +**⚠️ Внимание:** Автоматическое обновление может сломать сервис. Используйте только если уверены. + +### Уведомления о завершении + +```bash +# Установить mail utils +sudo apt install mailutils + +# Отправить email после redeploy +sudo ./redeploy-ubuntu.sh && echo "Redeploy completed" | mail -s "AI Review Updated" admin@example.com +``` + +--- + +## ✅ Резюме + +**Команда для обновления:** +```bash +sudo ./redeploy-ubuntu.sh +``` + +**Команда для отката:** +```bash +sudo systemctl stop ai-review +sudo cp /opt/ai-review-backups/backup-*/review.db /opt/ai-review/backend/ +cd /opt/ai-review && sudo -u $USER git reset --hard HEAD~1 +sudo ./redeploy-ubuntu.sh +``` + +**Логи:** +```bash +journalctl -u ai-review -f +``` + +**Проверка работы:** +```bash +systemctl status ai-review +curl http://localhost:8000/docs +``` + +--- + +## 📚 См. также + +- [UBUNTU_DEPLOYMENT.md](UBUNTU_DEPLOYMENT.md) - Первичная установка +- [DEPLOYMENT.md](DEPLOYMENT.md) - Общее руководство по развертыванию +- [README.md](README.md) - Основная документация + diff --git a/REDEPLOY_UBUNTU_QUICK.md b/REDEPLOY_UBUNTU_QUICK.md new file mode 100644 index 0000000..992e830 --- /dev/null +++ b/REDEPLOY_UBUNTU_QUICK.md @@ -0,0 +1,150 @@ +# 🚀 Быстрое обновление на Ubuntu + +## Важно! ⚠️ + +Скрипт `redeploy-ubuntu.sh` **требует bash**, не используйте `sh`. + +## ✅ Правильный способ запуска: + +```bash +# Вариант 1: Через bash явно +cd ~/code-review-agent # или /opt/ai-review +sudo bash redeploy-ubuntu.sh + +# Вариант 2: Сделать исполняемым +chmod +x redeploy-ubuntu.sh +sudo ./redeploy-ubuntu.sh +``` + +## ❌ Неправильно: + +```bash +sudo sh redeploy-ubuntu.sh # НЕ ИСПОЛЬЗУЙТЕ sh! +``` + +## 🔧 Что исправлено: + +1. ✅ Проверка наличия bash +2. ✅ Работа из любой директории проекта (не обязательно /opt/ai-review) +3. ✅ Backup создается в локальной директории `./backups/` +4. ✅ Работает без systemd сервиса (для dev окружения) +5. ✅ Не требует интерактивного подтверждения для non-git репозиториев +6. ✅ Более надежная обработка ошибок + +## 📋 Workflow обновления: + +### 1. Подготовка (на локальной машине): + +```bash +# Внести изменения в код +git add . +git commit -m "Update feature" +git push +``` + +### 2. На сервере: + +```bash +# Зайти на сервер +ssh user@your-server + +# Перейти в директорию проекта +cd ~/code-review-agent # или где у вас установлен проект + +# Обновить код (если git) +git pull + +# ИЛИ скопировать новые файлы вручную: +# scp -r ./backend user@server:~/code-review-agent/ +# scp -r ./frontend user@server:~/code-review-agent/ + +# Запустить redeploy +sudo bash redeploy-ubuntu.sh +``` + +### 3. Проверка: + +```bash +# Проверить статус +systemctl status ai-review + +# Или если без systemd: +ps aux | grep uvicorn + +# Проверить логи +journalctl -u ai-review -f +# Или: +tail -f nohup.out +``` + +## 🐛 Troubleshooting: + +### Ошибка: "This script requires bash" + +```bash +# Используйте bash явно +sudo bash redeploy-ubuntu.sh +``` + +### Ошибка: Permission denied при создании backup + +Это нормально - скрипт создаст backup в локальной директории `./backups/` + +### Ошибка: Service не найден + +Это нормально если вы не устанавливали systemd сервис. Скрипт все равно соберет проект. + +### Frontend не собрался + +```bash +cd frontend +rm -rf node_modules +npm install +npm run build +``` + +### Backend зависимости не установились + +```bash +cd backend +source venv/bin/activate +pip install --upgrade pip +pip install -r requirements.txt +``` + +## 📊 Что делает скрипт: + +1. **Останавливает сервис** (если установлен в systemd) +2. **Создает backup БД** в `./backups/backup-YYYYMMDD-HHMMSS/` +3. **Обновляет код** через git pull (если это git репозиторий) +4. **Обновляет зависимости backend** (Python пакеты) +5. **Применяет миграции БД** (создает новые таблицы) +6. **Собирает frontend** (React → static files) +7. **Запускает сервис** (если установлен в systemd) + +## 🎯 Быстрые команды: + +```bash +# Полное обновление +cd ~/code-review-agent && git pull && sudo bash redeploy-ubuntu.sh + +# Только пересборка (без git pull) +cd ~/code-review-agent && sudo bash redeploy-ubuntu.sh + +# Откат к предыдущей версии +cd ~/code-review-agent +sudo systemctl stop ai-review +sudo cp backups/backup-YYYYMMDD-HHMMSS/review.db backend/ +git reset --hard HEAD~1 +sudo bash redeploy-ubuntu.sh +``` + +## ✅ Готово! + +Скрипт теперь работает: +- ✅ С bash (не sh) +- ✅ Из любой директории проекта +- ✅ Без интерактивных вопросов +- ✅ С локальными backups +- ✅ С или без systemd + diff --git a/redeploy-ubuntu.sh b/redeploy-ubuntu.sh index 42daf17..d516273 100644 --- a/redeploy-ubuntu.sh +++ b/redeploy-ubuntu.sh @@ -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 ""