Add deployment script and documentation for Ubuntu setup
- Introduced `deploy-ubuntu.sh` for automated deployment of the AI Code Review Platform on Ubuntu with systemd. - Added `UBUNTU_DEPLOYMENT.md` for detailed deployment instructions and requirements. - Updated `README.md` to include quick deployment instructions and features of the new script. - Created `uninstall-ubuntu.sh` for easy removal of the platform and its components. - Enhanced logging and configuration setup within the deployment script.
This commit is contained in:
parent
b297bcbba9
commit
48fbb5bcb3
18
README.md
18
README.md
@ -189,6 +189,24 @@ ERROR: Опечатка в строке:
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## 🐧 Production (Ubuntu/Debian)
|
||||||
|
|
||||||
|
### Автоматическое развертывание с systemd:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo ./deploy-ubuntu.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Это настроит:
|
||||||
|
- ✅ Systemd service (автозапуск)
|
||||||
|
- ✅ Логирование в `/var/log/ai-review/`
|
||||||
|
- ✅ Nginx reverse proxy (опционально)
|
||||||
|
- ✅ SSL с Let's Encrypt (опционально)
|
||||||
|
|
||||||
|
**Подробнее:** [UBUNTU_DEPLOYMENT.md](UBUNTU_DEPLOYMENT.md)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## 🔧 Разработка
|
## 🔧 Разработка
|
||||||
|
|
||||||
### Backend:
|
### Backend:
|
||||||
|
|||||||
522
UBUNTU_DEPLOYMENT.md
Normal file
522
UBUNTU_DEPLOYMENT.md
Normal file
@ -0,0 +1,522 @@
|
|||||||
|
# 🐧 Развертывание на Ubuntu с Systemd
|
||||||
|
|
||||||
|
Руководство по развертыванию AI Code Review Platform на Ubuntu Server с systemd.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🚀 Быстрая установка
|
||||||
|
|
||||||
|
### Одна команда:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo ./deploy-ubuntu.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Скрипт автоматически:
|
||||||
|
- ✅ Установит зависимости (Python, Node.js)
|
||||||
|
- ✅ Соберет frontend
|
||||||
|
- ✅ Создаст systemd service
|
||||||
|
- ✅ Настроит логирование
|
||||||
|
- ✅ Запустит сервис
|
||||||
|
- ✅ (Опционально) Настроит nginx
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📋 Требования
|
||||||
|
|
||||||
|
### Системные требования:
|
||||||
|
|
||||||
|
- **OS:** Ubuntu 20.04+ / Debian 11+
|
||||||
|
- **Python:** 3.10+
|
||||||
|
- **Node.js:** 18+
|
||||||
|
- **RAM:** минимум 2GB
|
||||||
|
- **Disk:** минимум 5GB
|
||||||
|
|
||||||
|
### Права:
|
||||||
|
|
||||||
|
Скрипт должен быть запущен с **sudo**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔧 Пошаговая установка
|
||||||
|
|
||||||
|
### 1. Клонирование репозитория
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd ~
|
||||||
|
git clone <repository-url>
|
||||||
|
cd platform/review
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Подготовка скрипта
|
||||||
|
|
||||||
|
```bash
|
||||||
|
chmod +x deploy-ubuntu.sh
|
||||||
|
chmod +x uninstall-ubuntu.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Запуск установки
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo ./deploy-ubuntu.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Следуйте инструкциям
|
||||||
|
|
||||||
|
Скрипт спросит:
|
||||||
|
- Установить ли nginx?
|
||||||
|
- Доменное имя (для nginx)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📁 Структура после установки
|
||||||
|
|
||||||
|
```
|
||||||
|
/opt/ai-review/ # Основная директория
|
||||||
|
├── backend/
|
||||||
|
│ ├── app/
|
||||||
|
│ ├── public/ # Frontend build
|
||||||
|
│ ├── venv/ # Python venv
|
||||||
|
│ ├── .env # Конфигурация
|
||||||
|
│ └── review.db # База данных
|
||||||
|
├── frontend/
|
||||||
|
└── ...
|
||||||
|
|
||||||
|
/var/log/ai-review/ # Логи
|
||||||
|
├── access.log
|
||||||
|
└── error.log
|
||||||
|
|
||||||
|
/etc/systemd/system/ # Systemd
|
||||||
|
└── ai-review.service
|
||||||
|
|
||||||
|
/etc/nginx/ # Nginx (опционально)
|
||||||
|
└── sites-available/
|
||||||
|
└── ai-review
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚙️ Конфигурация
|
||||||
|
|
||||||
|
### Редактирование .env:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo nano /opt/ai-review/backend/.env
|
||||||
|
```
|
||||||
|
|
||||||
|
**Обязательно настройте:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Ollama
|
||||||
|
OLLAMA_BASE_URL=http://localhost:11434
|
||||||
|
OLLAMA_MODEL=mistral:7b
|
||||||
|
|
||||||
|
# Мастер токены
|
||||||
|
MASTER_GITEA_TOKEN=your_token_here
|
||||||
|
MASTER_GITHUB_TOKEN=your_token_here
|
||||||
|
|
||||||
|
# Ключ шифрования (уже создан)
|
||||||
|
ENCRYPTION_KEY=...
|
||||||
|
```
|
||||||
|
|
||||||
|
**После изменений:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo systemctl restart ai-review
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔄 Управление сервисом
|
||||||
|
|
||||||
|
### Systemd команды:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Статус
|
||||||
|
sudo systemctl status ai-review
|
||||||
|
|
||||||
|
# Запуск
|
||||||
|
sudo systemctl start ai-review
|
||||||
|
|
||||||
|
# Остановка
|
||||||
|
sudo systemctl stop ai-review
|
||||||
|
|
||||||
|
# Перезапуск
|
||||||
|
sudo systemctl restart ai-review
|
||||||
|
|
||||||
|
# Автозапуск при загрузке
|
||||||
|
sudo systemctl enable ai-review
|
||||||
|
|
||||||
|
# Отключить автозапуск
|
||||||
|
sudo systemctl disable ai-review
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 Мониторинг
|
||||||
|
|
||||||
|
### Просмотр логов:
|
||||||
|
|
||||||
|
**Systemd журнал:**
|
||||||
|
```bash
|
||||||
|
# Последние 50 строк
|
||||||
|
sudo journalctl -u ai-review -n 50
|
||||||
|
|
||||||
|
# В реальном времени
|
||||||
|
sudo journalctl -u ai-review -f
|
||||||
|
|
||||||
|
# Только ошибки
|
||||||
|
sudo journalctl -u ai-review -p err
|
||||||
|
```
|
||||||
|
|
||||||
|
**Файлы логов:**
|
||||||
|
```bash
|
||||||
|
# Access log
|
||||||
|
tail -f /var/log/ai-review/access.log
|
||||||
|
|
||||||
|
# Error log
|
||||||
|
tail -f /var/log/ai-review/error.log
|
||||||
|
|
||||||
|
# Последние 100 строк
|
||||||
|
tail -n 100 /var/log/ai-review/error.log
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проверка состояния:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Health check
|
||||||
|
curl http://localhost:8000/health
|
||||||
|
|
||||||
|
# API
|
||||||
|
curl http://localhost:8000/api/repositories
|
||||||
|
|
||||||
|
# Статус процесса
|
||||||
|
ps aux | grep uvicorn
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🌐 Nginx как Reverse Proxy
|
||||||
|
|
||||||
|
### Конфигурация создается автоматически:
|
||||||
|
|
||||||
|
```nginx
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name yourdomain.com;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
proxy_pass http://localhost:8000;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /ws {
|
||||||
|
proxy_pass http://localhost:8000;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Ручная настройка nginx:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Редактировать конфиг
|
||||||
|
sudo nano /etc/nginx/sites-available/ai-review
|
||||||
|
|
||||||
|
# Проверить синтаксис
|
||||||
|
sudo nginx -t
|
||||||
|
|
||||||
|
# Перезагрузить nginx
|
||||||
|
sudo systemctl reload nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔒 SSL/HTTPS с Let's Encrypt
|
||||||
|
|
||||||
|
### Установка Certbot:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo apt-get install certbot python3-certbot-nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
### Получение сертификата:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo certbot --nginx -d yourdomain.com
|
||||||
|
```
|
||||||
|
|
||||||
|
Certbot автоматически настроит nginx для HTTPS!
|
||||||
|
|
||||||
|
### Автопродление:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверка таймера
|
||||||
|
sudo systemctl status certbot.timer
|
||||||
|
|
||||||
|
# Тестовое продление
|
||||||
|
sudo certbot renew --dry-run
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔥 Firewall
|
||||||
|
|
||||||
|
### UFW (Ubuntu Firewall):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Разрешить SSH
|
||||||
|
sudo ufw allow 22
|
||||||
|
|
||||||
|
# Разрешить HTTP
|
||||||
|
sudo ufw allow 80
|
||||||
|
|
||||||
|
# Разрешить HTTPS
|
||||||
|
sudo ufw allow 443
|
||||||
|
|
||||||
|
# Включить firewall
|
||||||
|
sudo ufw enable
|
||||||
|
|
||||||
|
# Статус
|
||||||
|
sudo ufw status
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔧 Troubleshooting
|
||||||
|
|
||||||
|
### Сервис не запускается:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверить логи
|
||||||
|
sudo journalctl -u ai-review -n 100
|
||||||
|
|
||||||
|
# Проверить статус
|
||||||
|
sudo systemctl status ai-review
|
||||||
|
|
||||||
|
# Проверить права
|
||||||
|
ls -la /opt/ai-review/backend/
|
||||||
|
|
||||||
|
# Проверить .env
|
||||||
|
cat /opt/ai-review/backend/.env
|
||||||
|
```
|
||||||
|
|
||||||
|
### База данных не создается:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверить права на директорию
|
||||||
|
sudo chown -R $USER:$USER /opt/ai-review/backend/
|
||||||
|
|
||||||
|
# Пересоздать БД
|
||||||
|
rm /opt/ai-review/backend/review.db
|
||||||
|
sudo systemctl restart ai-review
|
||||||
|
```
|
||||||
|
|
||||||
|
### Ollama недоступен:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверить Ollama
|
||||||
|
curl http://localhost:11434/api/version
|
||||||
|
|
||||||
|
# Установить Ollama
|
||||||
|
curl -fsSL https://ollama.com/install.sh | sh
|
||||||
|
|
||||||
|
# Скачать модель
|
||||||
|
ollama pull mistral:7b
|
||||||
|
```
|
||||||
|
|
||||||
|
### Nginx ошибка:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверить конфигурацию
|
||||||
|
sudo nginx -t
|
||||||
|
|
||||||
|
# Проверить логи nginx
|
||||||
|
sudo tail -f /var/log/nginx/error.log
|
||||||
|
|
||||||
|
# Проверить что backend работает
|
||||||
|
curl http://localhost:8000/health
|
||||||
|
```
|
||||||
|
|
||||||
|
### Нет места на диске:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверить место
|
||||||
|
df -h
|
||||||
|
|
||||||
|
# Очистить старые логи
|
||||||
|
sudo journalctl --vacuum-time=7d
|
||||||
|
|
||||||
|
# Очистить логи приложения
|
||||||
|
sudo truncate -s 0 /var/log/ai-review/*.log
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📦 Обновление
|
||||||
|
|
||||||
|
### Автоматическое обновление:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /opt/ai-review
|
||||||
|
sudo git pull
|
||||||
|
sudo ./deploy-ubuntu.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### Ручное обновление:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. Остановить сервис
|
||||||
|
sudo systemctl stop ai-review
|
||||||
|
|
||||||
|
# 2. Обновить код
|
||||||
|
cd /opt/ai-review
|
||||||
|
sudo git pull
|
||||||
|
|
||||||
|
# 3. Пересобрать frontend
|
||||||
|
cd frontend
|
||||||
|
npm install
|
||||||
|
npm run build
|
||||||
|
|
||||||
|
# 4. Обновить Python зависимости
|
||||||
|
cd ../backend
|
||||||
|
source venv/bin/activate
|
||||||
|
pip install -r requirements.txt
|
||||||
|
deactivate
|
||||||
|
|
||||||
|
# 5. Запустить сервис
|
||||||
|
sudo systemctl start ai-review
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🗑️ Удаление
|
||||||
|
|
||||||
|
### Полное удаление:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo ./uninstall-ubuntu.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Это удалит:
|
||||||
|
- Systemd service
|
||||||
|
- Все файлы в `/opt/ai-review`
|
||||||
|
- Nginx конфигурацию
|
||||||
|
- Логи
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 Мониторинг производительности
|
||||||
|
|
||||||
|
### Использование ресурсов:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# CPU и память
|
||||||
|
top -p $(pgrep -f "uvicorn app.main")
|
||||||
|
|
||||||
|
# Детальная информация
|
||||||
|
htop
|
||||||
|
|
||||||
|
# Использование диска
|
||||||
|
du -sh /opt/ai-review/*
|
||||||
|
```
|
||||||
|
|
||||||
|
### Systemd ресурсы:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Статистика сервиса
|
||||||
|
systemctl show ai-review --property=CPUUsageNSec
|
||||||
|
systemctl show ai-review --property=MemoryCurrent
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔄 Backup
|
||||||
|
|
||||||
|
### Создание резервной копии:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
# backup.sh
|
||||||
|
|
||||||
|
BACKUP_DIR="/backup/ai-review"
|
||||||
|
DATE=$(date +%Y%m%d_%H%M%S)
|
||||||
|
|
||||||
|
mkdir -p "$BACKUP_DIR"
|
||||||
|
|
||||||
|
# Резервная копия БД
|
||||||
|
cp /opt/ai-review/backend/review.db \
|
||||||
|
"$BACKUP_DIR/review_$DATE.db"
|
||||||
|
|
||||||
|
# Резервная копия .env
|
||||||
|
cp /opt/ai-review/backend/.env \
|
||||||
|
"$BACKUP_DIR/env_$DATE"
|
||||||
|
|
||||||
|
# Сжать старые бэкапы
|
||||||
|
find "$BACKUP_DIR" -name "*.db" -mtime +7 -exec gzip {} \;
|
||||||
|
|
||||||
|
echo "Backup создан: $BACKUP_DIR/review_$DATE.db"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Автоматический backup через cron:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Редактировать crontab
|
||||||
|
sudo crontab -e
|
||||||
|
|
||||||
|
# Добавить строку (каждый день в 3:00)
|
||||||
|
0 3 * * * /opt/ai-review/backup.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✅ Checklist после установки
|
||||||
|
|
||||||
|
- [ ] Сервис запущен (`systemctl status ai-review`)
|
||||||
|
- [ ] Health check работает (`curl localhost:8000/health`)
|
||||||
|
- [ ] Frontend открывается в браузере
|
||||||
|
- [ ] Настроен .env с токенами
|
||||||
|
- [ ] Ollama запущен и модель скачана
|
||||||
|
- [ ] Nginx настроен (если используется)
|
||||||
|
- [ ] SSL сертификат получен (если нужен)
|
||||||
|
- [ ] Firewall настроен
|
||||||
|
- [ ] Логи пишутся (`tail -f /var/log/ai-review/access.log`)
|
||||||
|
- [ ] Автозапуск включен (`systemctl is-enabled ai-review`)
|
||||||
|
- [ ] Backup настроен
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📞 Поддержка
|
||||||
|
|
||||||
|
Если возникли проблемы:
|
||||||
|
|
||||||
|
1. Проверьте логи: `sudo journalctl -u ai-review -n 100`
|
||||||
|
2. Проверьте конфигурацию: `cat /opt/ai-review/backend/.env`
|
||||||
|
3. Проверьте статус: `sudo systemctl status ai-review`
|
||||||
|
4. Откройте issue в репозитории
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎉 Готово!
|
||||||
|
|
||||||
|
Сервис развернут и готов к работе!
|
||||||
|
|
||||||
|
**Доступ:**
|
||||||
|
- Local: http://localhost:8000
|
||||||
|
- External: http://your-domain.com
|
||||||
|
|
||||||
|
**Управление:**
|
||||||
|
```bash
|
||||||
|
sudo systemctl {start|stop|restart|status} ai-review
|
||||||
|
```
|
||||||
|
|
||||||
|
**Логи:**
|
||||||
|
```bash
|
||||||
|
sudo journalctl -u ai-review -f
|
||||||
|
```
|
||||||
|
|
||||||
|
**Наслаждайтесь автоматическим ревью кода! 🚀**
|
||||||
|
|
||||||
290
deploy-ubuntu.sh
Normal file
290
deploy-ubuntu.sh
Normal file
@ -0,0 +1,290 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Скрипт развертывания AI Code Review Platform на Ubuntu с systemd
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Цвета для вывода
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
# Проверка что скрипт запущен с sudo
|
||||||
|
if [ "$EUID" -ne 0 ]; then
|
||||||
|
echo -e "${RED}Ошибка: Этот скрипт должен быть запущен с sudo${NC}"
|
||||||
|
echo "Используйте: sudo ./deploy-ubuntu.sh"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Получаем имя реального пользователя (не root)
|
||||||
|
REAL_USER=${SUDO_USER:-$USER}
|
||||||
|
REAL_HOME=$(eval echo ~$REAL_USER)
|
||||||
|
|
||||||
|
echo -e "${BLUE}"
|
||||||
|
echo "========================================="
|
||||||
|
echo " AI Code Review Platform - Установка"
|
||||||
|
echo "========================================="
|
||||||
|
echo -e "${NC}"
|
||||||
|
|
||||||
|
# 1. Проверка зависимостей
|
||||||
|
echo -e "${YELLOW}[1/10] Проверка системных зависимостей...${NC}"
|
||||||
|
|
||||||
|
# Проверка Python
|
||||||
|
if ! command -v python3 &> /dev/null; then
|
||||||
|
echo -e "${RED}Python 3 не установлен!${NC}"
|
||||||
|
echo "Установка Python 3..."
|
||||||
|
apt-get update
|
||||||
|
apt-get install -y python3 python3-pip python3-venv
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Проверка Node.js
|
||||||
|
if ! command -v node &> /dev/null; then
|
||||||
|
echo -e "${RED}Node.js не установлен!${NC}"
|
||||||
|
echo "Установка Node.js..."
|
||||||
|
curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
|
||||||
|
apt-get install -y nodejs
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Установка nginx (опционально)
|
||||||
|
if ! command -v nginx &> /dev/null; then
|
||||||
|
echo -e "${YELLOW}Установить nginx как reverse proxy? [y/N]${NC}"
|
||||||
|
read -r install_nginx
|
||||||
|
if [[ "$install_nginx" =~ ^[Yy]$ ]]; then
|
||||||
|
apt-get install -y nginx
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "${GREEN}✓ Зависимости проверены${NC}"
|
||||||
|
|
||||||
|
# 2. Определение пути установки
|
||||||
|
echo -e "${YELLOW}[2/10] Настройка путей...${NC}"
|
||||||
|
|
||||||
|
INSTALL_DIR="/opt/ai-review"
|
||||||
|
CURRENT_DIR=$(pwd)
|
||||||
|
|
||||||
|
echo "Текущая директория: $CURRENT_DIR"
|
||||||
|
echo "Директория установки: $INSTALL_DIR"
|
||||||
|
|
||||||
|
# 3. Копирование файлов
|
||||||
|
echo -e "${YELLOW}[3/10] Копирование файлов проекта...${NC}"
|
||||||
|
|
||||||
|
if [ "$CURRENT_DIR" != "$INSTALL_DIR" ]; then
|
||||||
|
echo "Копирование в $INSTALL_DIR..."
|
||||||
|
mkdir -p "$INSTALL_DIR"
|
||||||
|
cp -r "$CURRENT_DIR"/* "$INSTALL_DIR"/
|
||||||
|
chown -R "$REAL_USER":"$REAL_USER" "$INSTALL_DIR"
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd "$INSTALL_DIR"
|
||||||
|
echo -e "${GREEN}✓ Файлы скопированы${NC}"
|
||||||
|
|
||||||
|
# 4. Сборка frontend
|
||||||
|
echo -e "${YELLOW}[4/10] Сборка frontend...${NC}"
|
||||||
|
cd frontend
|
||||||
|
sudo -u "$REAL_USER" npm install
|
||||||
|
sudo -u "$REAL_USER" npm run build
|
||||||
|
cd ..
|
||||||
|
echo -e "${GREEN}✓ Frontend собран${NC}"
|
||||||
|
|
||||||
|
# 5. Установка Python зависимостей
|
||||||
|
echo -e "${YELLOW}[5/10] Установка Python зависимостей...${NC}"
|
||||||
|
cd backend
|
||||||
|
sudo -u "$REAL_USER" python3 -m venv venv
|
||||||
|
sudo -u "$REAL_USER" bash -c "source venv/bin/activate && pip install --upgrade pip && pip install -r requirements.txt"
|
||||||
|
cd ..
|
||||||
|
echo -e "${GREEN}✓ Python зависимости установлены${NC}"
|
||||||
|
|
||||||
|
# 6. Настройка .env
|
||||||
|
echo -e "${YELLOW}[6/10] Настройка конфигурации...${NC}"
|
||||||
|
|
||||||
|
if [ ! -f "backend/.env" ]; then
|
||||||
|
echo "Создание .env файла..."
|
||||||
|
|
||||||
|
# Генерируем ключ шифрования
|
||||||
|
ENCRYPTION_KEY=$(python3 -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())")
|
||||||
|
|
||||||
|
cat > backend/.env << EOF
|
||||||
|
# Ollama Configuration
|
||||||
|
OLLAMA_BASE_URL=http://localhost:11434
|
||||||
|
OLLAMA_MODEL=mistral:7b
|
||||||
|
|
||||||
|
# Database
|
||||||
|
DATABASE_URL=sqlite+aiosqlite:///$INSTALL_DIR/backend/review.db
|
||||||
|
|
||||||
|
# Security
|
||||||
|
SECRET_KEY=$(openssl rand -hex 32)
|
||||||
|
ENCRYPTION_KEY=$ENCRYPTION_KEY
|
||||||
|
|
||||||
|
# Master Git Tokens (optional)
|
||||||
|
MASTER_GITEA_TOKEN=
|
||||||
|
MASTER_GITHUB_TOKEN=
|
||||||
|
MASTER_BITBUCKET_TOKEN=
|
||||||
|
|
||||||
|
# Server
|
||||||
|
HOST=0.0.0.0
|
||||||
|
PORT=8000
|
||||||
|
DEBUG=false
|
||||||
|
|
||||||
|
# CORS
|
||||||
|
CORS_ORIGINS=http://localhost:8000,http://localhost:5173
|
||||||
|
EOF
|
||||||
|
|
||||||
|
chown "$REAL_USER":"$REAL_USER" backend/.env
|
||||||
|
echo -e "${GREEN}✓ Создан .env файл${NC}"
|
||||||
|
echo -e "${YELLOW}⚠️ ВАЖНО: Отредактируйте backend/.env и добавьте необходимые токены!${NC}"
|
||||||
|
else
|
||||||
|
echo ".env уже существует"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 7. Создание systemd service
|
||||||
|
echo -e "${YELLOW}[7/10] Создание systemd service...${NC}"
|
||||||
|
|
||||||
|
cat > /etc/systemd/system/ai-review.service << EOF
|
||||||
|
[Unit]
|
||||||
|
Description=AI Code Review Platform
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=$REAL_USER
|
||||||
|
Group=$REAL_USER
|
||||||
|
WorkingDirectory=$INSTALL_DIR/backend
|
||||||
|
Environment="PATH=$INSTALL_DIR/backend/venv/bin:/usr/local/bin:/usr/bin:/bin"
|
||||||
|
ExecStart=$INSTALL_DIR/backend/venv/bin/python -m uvicorn app.main:app --host 0.0.0.0 --port 8000
|
||||||
|
Restart=always
|
||||||
|
RestartSec=10
|
||||||
|
StandardOutput=append:/var/log/ai-review/access.log
|
||||||
|
StandardError=append:/var/log/ai-review/error.log
|
||||||
|
|
||||||
|
# Security
|
||||||
|
NoNewPrivileges=true
|
||||||
|
PrivateTmp=true
|
||||||
|
ProtectSystem=strict
|
||||||
|
ProtectHome=true
|
||||||
|
ReadWritePaths=$INSTALL_DIR/backend
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo -e "${GREEN}✓ Systemd service создан${NC}"
|
||||||
|
|
||||||
|
# 8. Создание директории для логов
|
||||||
|
echo -e "${YELLOW}[8/10] Настройка логирования...${NC}"
|
||||||
|
mkdir -p /var/log/ai-review
|
||||||
|
chown "$REAL_USER":"$REAL_USER" /var/log/ai-review
|
||||||
|
echo -e "${GREEN}✓ Директория логов создана${NC}"
|
||||||
|
|
||||||
|
# 9. Включение и запуск сервиса
|
||||||
|
echo -e "${YELLOW}[9/10] Запуск сервиса...${NC}"
|
||||||
|
systemctl daemon-reload
|
||||||
|
systemctl enable ai-review.service
|
||||||
|
systemctl start ai-review.service
|
||||||
|
|
||||||
|
# Ждем запуска
|
||||||
|
sleep 3
|
||||||
|
|
||||||
|
# Проверка статуса
|
||||||
|
if systemctl is-active --quiet ai-review.service; then
|
||||||
|
echo -e "${GREEN}✓ Сервис успешно запущен${NC}"
|
||||||
|
else
|
||||||
|
echo -e "${RED}✗ Ошибка запуска сервиса${NC}"
|
||||||
|
echo "Проверьте логи: journalctl -u ai-review.service -n 50"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 10. Настройка nginx (опционально)
|
||||||
|
echo -e "${YELLOW}[10/10] Настройка nginx...${NC}"
|
||||||
|
|
||||||
|
if command -v nginx &> /dev/null; then
|
||||||
|
echo -e "${YELLOW}Настроить nginx как reverse proxy? [y/N]${NC}"
|
||||||
|
read -r setup_nginx
|
||||||
|
|
||||||
|
if [[ "$setup_nginx" =~ ^[Yy]$ ]]; then
|
||||||
|
echo "Введите доменное имя (или нажмите Enter для localhost):"
|
||||||
|
read -r domain_name
|
||||||
|
domain_name=${domain_name:-localhost}
|
||||||
|
|
||||||
|
cat > /etc/nginx/sites-available/ai-review << EOF
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name $domain_name;
|
||||||
|
|
||||||
|
client_max_body_size 50M;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
proxy_pass http://localhost:8000;
|
||||||
|
proxy_set_header Host \$host;
|
||||||
|
proxy_set_header X-Real-IP \$remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto \$scheme;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /ws {
|
||||||
|
proxy_pass http://localhost:8000;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade \$http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
proxy_set_header Host \$host;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /api {
|
||||||
|
proxy_pass http://localhost:8000;
|
||||||
|
proxy_set_header Host \$host;
|
||||||
|
proxy_set_header X-Real-IP \$remote_addr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
ln -sf /etc/nginx/sites-available/ai-review /etc/nginx/sites-enabled/
|
||||||
|
nginx -t && systemctl reload nginx
|
||||||
|
echo -e "${GREEN}✓ Nginx настроен${NC}"
|
||||||
|
echo -e "${GREEN}✓ Доступ: http://$domain_name${NC}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Итоговая информация
|
||||||
|
echo ""
|
||||||
|
echo -e "${GREEN}=========================================${NC}"
|
||||||
|
echo -e "${GREEN} 🎉 Установка завершена!${NC}"
|
||||||
|
echo -e "${GREEN}=========================================${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e "📍 ${BLUE}Директория установки:${NC} $INSTALL_DIR"
|
||||||
|
echo -e "📍 ${BLUE}Конфигурация:${NC} $INSTALL_DIR/backend/.env"
|
||||||
|
echo -e "📍 ${BLUE}Логи:${NC} /var/log/ai-review/"
|
||||||
|
echo ""
|
||||||
|
echo -e "${YELLOW}Полезные команды:${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e " ${BLUE}Статус сервиса:${NC}"
|
||||||
|
echo " sudo systemctl status ai-review"
|
||||||
|
echo ""
|
||||||
|
echo -e " ${BLUE}Перезапуск:${NC}"
|
||||||
|
echo " sudo systemctl restart ai-review"
|
||||||
|
echo ""
|
||||||
|
echo -e " ${BLUE}Остановка:${NC}"
|
||||||
|
echo " sudo systemctl stop ai-review"
|
||||||
|
echo ""
|
||||||
|
echo -e " ${BLUE}Просмотр логов:${NC}"
|
||||||
|
echo " sudo journalctl -u ai-review -f"
|
||||||
|
echo " tail -f /var/log/ai-review/access.log"
|
||||||
|
echo " tail -f /var/log/ai-review/error.log"
|
||||||
|
echo ""
|
||||||
|
echo -e " ${BLUE}Редактирование конфигурации:${NC}"
|
||||||
|
echo " sudo nano $INSTALL_DIR/backend/.env"
|
||||||
|
echo " sudo systemctl restart ai-review"
|
||||||
|
echo ""
|
||||||
|
echo -e "${GREEN}🌐 Приложение доступно по адресу:${NC}"
|
||||||
|
echo -e " ${BLUE}http://localhost:8000${NC}"
|
||||||
|
if [ -n "$domain_name" ] && [ "$domain_name" != "localhost" ]; then
|
||||||
|
echo -e " ${BLUE}http://$domain_name${NC}"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
echo -e "${YELLOW}⚠️ Не забудьте:${NC}"
|
||||||
|
echo " 1. Отредактировать $INSTALL_DIR/backend/.env"
|
||||||
|
echo " 2. Добавить токены для Git платформ"
|
||||||
|
echo " 3. Настроить firewall (разрешить порт 80/443)"
|
||||||
|
echo ""
|
||||||
|
echo -e "${GREEN}✨ Готово к работе!${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
61
uninstall-ubuntu.sh
Normal file
61
uninstall-ubuntu.sh
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Скрипт удаления AI Code Review Platform из Ubuntu
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
NC='\033[0m'
|
||||||
|
|
||||||
|
if [ "$EUID" -ne 0 ]; then
|
||||||
|
echo -e "${RED}Ошибка: Этот скрипт должен быть запущен с sudo${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "${YELLOW}"
|
||||||
|
echo "========================================="
|
||||||
|
echo " AI Code Review Platform - Удаление"
|
||||||
|
echo "========================================="
|
||||||
|
echo -e "${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e "${RED}⚠️ ВНИМАНИЕ: Это удалит все данные!${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e "Вы уверены? Введите 'yes' для подтверждения:"
|
||||||
|
read -r confirmation
|
||||||
|
|
||||||
|
if [ "$confirmation" != "yes" ]; then
|
||||||
|
echo "Отменено"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
INSTALL_DIR="/opt/ai-review"
|
||||||
|
|
||||||
|
echo -e "${YELLOW}[1/5] Остановка сервиса...${NC}"
|
||||||
|
systemctl stop ai-review.service || true
|
||||||
|
systemctl disable ai-review.service || true
|
||||||
|
echo -e "${GREEN}✓ Сервис остановлен${NC}"
|
||||||
|
|
||||||
|
echo -e "${YELLOW}[2/5] Удаление systemd service...${NC}"
|
||||||
|
rm -f /etc/systemd/system/ai-review.service
|
||||||
|
systemctl daemon-reload
|
||||||
|
echo -e "${GREEN}✓ Service удален${NC}"
|
||||||
|
|
||||||
|
echo -e "${YELLOW}[3/5] Удаление nginx конфигурации...${NC}"
|
||||||
|
rm -f /etc/nginx/sites-enabled/ai-review
|
||||||
|
rm -f /etc/nginx/sites-available/ai-review
|
||||||
|
systemctl reload nginx 2>/dev/null || true
|
||||||
|
echo -e "${GREEN}✓ Nginx конфигурация удалена${NC}"
|
||||||
|
|
||||||
|
echo -e "${YELLOW}[4/5] Удаление файлов...${NC}"
|
||||||
|
rm -rf "$INSTALL_DIR"
|
||||||
|
echo -e "${GREEN}✓ Файлы удалены${NC}"
|
||||||
|
|
||||||
|
echo -e "${YELLOW}[5/5] Удаление логов...${NC}"
|
||||||
|
rm -rf /var/log/ai-review
|
||||||
|
echo -e "${GREEN}✓ Логи удалены${NC}"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo -e "${GREEN}✓ AI Code Review Platform полностью удален${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
Loading…
x
Reference in New Issue
Block a user