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:
parent
659abcc431
commit
493a14e2c8
83
.github/workflows/redeploy-hint.md
vendored
Normal file
83
.github/workflows/redeploy-hint.md
vendored
Normal file
@ -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. Мониторинга после деплоя
|
||||||
|
|
||||||
11
README.md
11
README.md
@ -194,7 +194,11 @@ ERROR: Опечатка в строке:
|
|||||||
### Автоматическое развертывание с systemd:
|
### Автоматическое развертывание с systemd:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
# Первичная установка
|
||||||
sudo ./deploy-ubuntu.sh
|
sudo ./deploy-ubuntu.sh
|
||||||
|
|
||||||
|
# Обновление после изменений
|
||||||
|
sudo ./redeploy-ubuntu.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
Это настроит:
|
Это настроит:
|
||||||
@ -202,8 +206,9 @@ sudo ./deploy-ubuntu.sh
|
|||||||
- ✅ Логирование в `/var/log/ai-review/`
|
- ✅ Логирование в `/var/log/ai-review/`
|
||||||
- ✅ Nginx reverse proxy (опционально)
|
- ✅ Nginx reverse proxy (опционально)
|
||||||
- ✅ SSL с Let's Encrypt (опционально)
|
- ✅ 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)** - Полное руководство по развертыванию
|
- **[DEPLOYMENT.md](DEPLOYMENT.md)** - Полное руководство по развертыванию
|
||||||
|
- **[UBUNTU_DEPLOYMENT.md](UBUNTU_DEPLOYMENT.md)** - Развертывание на Ubuntu/Debian
|
||||||
|
- **[REDEPLOY_GUIDE.md](REDEPLOY_GUIDE.md)** - 🔄 Обновление production сервера
|
||||||
- **[ARCHITECTURE.md](ARCHITECTURE.md)** - Архитектура проекта
|
- **[ARCHITECTURE.md](ARCHITECTURE.md)** - Архитектура проекта
|
||||||
- **[DEBUG_GUIDE.md](DEBUG_GUIDE.md)** - Отладка AI агента
|
- **[DEBUG_GUIDE.md](DEBUG_GUIDE.md)** - Отладка AI агента
|
||||||
- **[MODEL_RECOMMENDATION.md](MODEL_RECOMMENDATION.md)** - Рекомендации по моделям
|
- **[MODEL_RECOMMENDATION.md](MODEL_RECOMMENDATION.md)** - Рекомендации по моделям
|
||||||
- **[MASTER_TOKEN_FEATURE.md](MASTER_TOKEN_FEATURE.md)** - Мастер токены
|
- **[MASTER_TOKEN_FEATURE.md](MASTER_TOKEN_FEATURE.md)** - Мастер токены
|
||||||
- **[HTML_ESCAPE_FIX.md](HTML_ESCAPE_FIX.md)** - Экранирование HTML
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
437
REDEPLOY_GUIDE.md
Normal file
437
REDEPLOY_GUIDE.md
Normal file
@ -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 <current-branch>
|
||||||
|
```
|
||||||
|
Загружает последние изменения из репозитория.
|
||||||
|
|
||||||
|
### Шаг 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 <commit-hash>
|
||||||
|
|
||||||
|
# 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 <PID>
|
||||||
|
|
||||||
|
# Запустить сервис
|
||||||
|
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) - Основная документация
|
||||||
|
|
||||||
150
REDEPLOY_UBUNTU_QUICK.md
Normal file
150
REDEPLOY_UBUNTU_QUICK.md
Normal file
@ -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
|
||||||
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
#!/bin/bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# AI Code Review Agent - Redeploy Script для Ubuntu/Debian
|
# AI Code Review Agent - Redeploy Script для Ubuntu/Debian
|
||||||
@ -7,10 +7,18 @@
|
|||||||
# Этот скрипт обновляет и перезапускает AI Review Agent на сервере
|
# Этот скрипт обновляет и перезапускает AI Review Agent на сервере
|
||||||
#
|
#
|
||||||
# Использование:
|
# Использование:
|
||||||
|
# sudo bash redeploy-ubuntu.sh
|
||||||
|
# или
|
||||||
# sudo ./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 # Выход при ошибке
|
set -e # Выход при ошибке
|
||||||
|
|
||||||
# Цвета для вывода
|
# Цвета для вывода
|
||||||
@ -58,47 +66,62 @@ if [ "$REAL_USER" = "root" ]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
INSTALL_DIR="/opt/ai-review"
|
# Определить директорию установки
|
||||||
|
# Если скрипт запущен из текущей директории, используем её
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
INSTALL_DIR="${SCRIPT_DIR}"
|
||||||
SERVICE_NAME="ai-review"
|
SERVICE_NAME="ai-review"
|
||||||
|
|
||||||
# Проверка, что сервис установлен
|
# Проверить, что это похоже на директорию AI Review
|
||||||
if [ ! -d "$INSTALL_DIR" ]; then
|
if [ ! -d "$INSTALL_DIR/backend" ] || [ ! -d "$INSTALL_DIR/frontend" ]; then
|
||||||
print_error "AI Review Agent не установлен в $INSTALL_DIR"
|
print_error "Не найдены директории backend или frontend"
|
||||||
print_warning "Сначала запустите deploy-ubuntu.sh"
|
print_warning "Запустите скрипт из корня проекта AI Review Agent"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Проверка, что сервис установлен
|
||||||
if ! systemctl list-unit-files | grep -q "^${SERVICE_NAME}.service"; then
|
if ! systemctl list-unit-files | grep -q "^${SERVICE_NAME}.service"; then
|
||||||
print_error "Сервис ${SERVICE_NAME} не найден"
|
print_warning "Сервис ${SERVICE_NAME} не найден в systemd"
|
||||||
print_warning "Сначала запустите deploy-ubuntu.sh"
|
print_warning "Продолжаем без управления сервисом..."
|
||||||
exit 1
|
SERVICE_EXISTS=false
|
||||||
|
else
|
||||||
|
SERVICE_EXISTS=true
|
||||||
fi
|
fi
|
||||||
|
|
||||||
cd "$INSTALL_DIR"
|
cd "$INSTALL_DIR"
|
||||||
|
print_warning "Рабочая директория: $INSTALL_DIR"
|
||||||
|
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
# Шаг 1: Остановка сервиса
|
# Шаг 1: Остановка сервиса
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
print_step 1 7 "Остановка сервиса..."
|
print_step 1 7 "Остановка сервиса..."
|
||||||
|
|
||||||
systemctl stop "$SERVICE_NAME"
|
if [ "$SERVICE_EXISTS" = true ]; then
|
||||||
print_success "Сервис остановлен"
|
systemctl stop "$SERVICE_NAME" || print_warning "Не удалось остановить сервис"
|
||||||
|
print_success "Сервис остановлен"
|
||||||
|
else
|
||||||
|
print_warning "Сервис не установлен, пропускаем остановку"
|
||||||
|
fi
|
||||||
|
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
# Шаг 2: Создание backup
|
# Шаг 2: Создание backup
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
print_step 2 7 "Создание backup..."
|
print_step 2 7 "Создание backup..."
|
||||||
|
|
||||||
BACKUP_DIR="/opt/ai-review-backups"
|
BACKUP_DIR="$INSTALL_DIR/backups"
|
||||||
mkdir -p "$BACKUP_DIR"
|
mkdir -p "$BACKUP_DIR" || print_warning "Не удалось создать директорию backup"
|
||||||
BACKUP_NAME="backup-$(date +%Y%m%d-%H%M%S)"
|
BACKUP_NAME="backup-$(date +%Y%m%d-%H%M%S)"
|
||||||
BACKUP_PATH="$BACKUP_DIR/$BACKUP_NAME"
|
BACKUP_PATH="$BACKUP_DIR/$BACKUP_NAME"
|
||||||
|
|
||||||
# Backup базы данных
|
# Backup базы данных
|
||||||
if [ -f "$INSTALL_DIR/backend/review.db" ]; then
|
if [ -f "$INSTALL_DIR/backend/review.db" ]; then
|
||||||
mkdir -p "$BACKUP_PATH"
|
mkdir -p "$BACKUP_PATH"
|
||||||
cp "$INSTALL_DIR/backend/review.db" "$BACKUP_PATH/"
|
cp "$INSTALL_DIR/backend/review.db" "$BACKUP_PATH/" 2>/dev/null || {
|
||||||
print_success "База данных сохранена в $BACKUP_PATH"
|
print_warning "Не удалось создать backup БД"
|
||||||
|
}
|
||||||
|
if [ -f "$BACKUP_PATH/review.db" ]; then
|
||||||
|
print_success "База данных сохранена в $BACKUP_PATH"
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
print_warning "База данных не найдена, пропускаем backup"
|
print_warning "База данных не найдена, пропускаем backup"
|
||||||
fi
|
fi
|
||||||
@ -112,34 +135,28 @@ print_step 3 7 "Обновление кода..."
|
|||||||
if [ -d ".git" ]; then
|
if [ -d ".git" ]; then
|
||||||
# Сохранить изменения в .env если есть
|
# Сохранить изменения в .env если есть
|
||||||
if [ -f "backend/.env" ]; then
|
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
|
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"
|
print_warning "Текущая ветка: $CURRENT_BRANCH"
|
||||||
|
|
||||||
# Обновить код
|
# Обновить код
|
||||||
sudo -u "$REAL_USER" git fetch --all
|
sudo -u "$REAL_USER" git fetch --all 2>/dev/null || print_warning "Не удалось обновить из git"
|
||||||
sudo -u "$REAL_USER" git pull origin "$CURRENT_BRANCH"
|
sudo -u "$REAL_USER" git pull origin "$CURRENT_BRANCH" 2>/dev/null || print_warning "Не удалось выполнить git pull"
|
||||||
|
|
||||||
# Восстановить .env
|
# Восстановить .env
|
||||||
if [ -f "/tmp/ai-review-env-backup" ]; then
|
if [ -f "/tmp/ai-review-env-backup" ]; then
|
||||||
cp /tmp/ai-review-env-backup backend/.env
|
cp /tmp/ai-review-env-backup backend/.env 2>/dev/null || true
|
||||||
rm /tmp/ai-review-env-backup
|
rm /tmp/ai-review-env-backup 2>/dev/null || true
|
||||||
fi
|
fi
|
||||||
|
|
||||||
print_success "Код обновлен"
|
print_success "Код обновлен"
|
||||||
else
|
else
|
||||||
print_warning "Не git репозиторий, пропускаем обновление кода"
|
print_warning "Не git репозиторий, пропускаем обновление кода"
|
||||||
echo "Если вы хотите обновить код вручную, сделайте это сейчас"
|
print_warning "Предполагается, что код уже обновлен вручную"
|
||||||
read -p "Продолжить? (y/n): " -n 1 -r
|
sleep 2
|
||||||
echo
|
|
||||||
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
|
||||||
print_error "Отменено"
|
|
||||||
systemctl start "$SERVICE_NAME"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
@ -222,23 +239,28 @@ cd ..
|
|||||||
print_step 7 7 "Запуск сервиса..."
|
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 "Не удалось установить права"
|
||||||
|
|
||||||
# Запустить сервис
|
if [ "$SERVICE_EXISTS" = true ]; then
|
||||||
systemctl start "$SERVICE_NAME"
|
# Запустить сервис
|
||||||
|
systemctl start "$SERVICE_NAME"
|
||||||
|
|
||||||
# Подождать немного
|
# Подождать немного
|
||||||
sleep 2
|
sleep 2
|
||||||
|
|
||||||
# Проверить статус
|
# Проверить статус
|
||||||
if systemctl is-active --quiet "$SERVICE_NAME"; then
|
if systemctl is-active --quiet "$SERVICE_NAME"; then
|
||||||
print_success "Сервис запущен"
|
print_success "Сервис запущен"
|
||||||
|
else
|
||||||
|
print_error "Сервис не запустился"
|
||||||
|
echo ""
|
||||||
|
echo "Логи сервиса:"
|
||||||
|
journalctl -u "$SERVICE_NAME" -n 20 --no-pager
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
print_error "Сервис не запустился"
|
print_warning "Сервис не установлен в systemd"
|
||||||
echo ""
|
print_warning "Запустите вручную: cd backend && source venv/bin/activate && uvicorn app.main:app --host 0.0.0.0 --port 8000"
|
||||||
echo "Логи сервиса:"
|
|
||||||
journalctl -u "$SERVICE_NAME" -n 20 --no-pager
|
|
||||||
exit 1
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
@ -249,16 +271,35 @@ echo -e "${GREEN}╔════════════════════
|
|||||||
echo -e "${GREEN}║ Redeploy завершен успешно! ✅ ║${NC}"
|
echo -e "${GREEN}║ Redeploy завершен успешно! ✅ ║${NC}"
|
||||||
echo -e "${GREEN}╚════════════════════════════════════════╝${NC}"
|
echo -e "${GREEN}╚════════════════════════════════════════╝${NC}"
|
||||||
echo ""
|
echo ""
|
||||||
echo "Сервис: http://$(hostname -I | awk '{print $1}'):8000"
|
|
||||||
echo "Статус: systemctl status $SERVICE_NAME"
|
# Получить IP адрес
|
||||||
echo "Логи: journalctl -u $SERVICE_NAME -f"
|
SERVER_IP=$(hostname -I 2>/dev/null | awk '{print $1}')
|
||||||
echo ""
|
if [ -z "$SERVER_IP" ]; then
|
||||||
echo "Backup создан: $BACKUP_PATH"
|
SERVER_IP="localhost"
|
||||||
echo ""
|
fi
|
||||||
echo -e "${YELLOW}Для отката к предыдущей версии:${NC}"
|
|
||||||
echo " 1. Остановите сервис: sudo systemctl stop $SERVICE_NAME"
|
echo "Сервис: http://${SERVER_IP}:8000"
|
||||||
echo " 2. Восстановите БД: sudo cp $BACKUP_PATH/review.db $INSTALL_DIR/backend/"
|
if [ "$SERVICE_EXISTS" = true ]; then
|
||||||
echo " 3. Откатите git: cd $INSTALL_DIR && sudo -u $REAL_USER git reset --hard HEAD~1"
|
echo "Статус: systemctl status $SERVICE_NAME"
|
||||||
echo " 4. Запустите redeploy снова: sudo ./redeploy-ubuntu.sh"
|
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 ""
|
echo ""
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user