Add deployment documentation and enhance project setup scripts
- Introduced `DEPLOYMENT.md` for comprehensive deployment instructions. - Added `start.bat` and `start.sh` scripts for unified project startup on Windows and Linux/Mac. - Updated `.gitignore` to exclude additional files and directories. - Enhanced `main.py` to serve static frontend files and handle SPA routing. - Configured Vite to output the frontend build to the backend public directory. - Minor adjustments in `ReviewDetail.tsx` for improved data handling.
This commit is contained in:
parent
09cdd06307
commit
b297bcbba9
4
.gitignore
vendored
4
.gitignore
vendored
@ -27,6 +27,10 @@ env/
|
|||||||
|
|
||||||
# Database
|
# Database
|
||||||
*.db
|
*.db
|
||||||
|
*.db-journal
|
||||||
|
|
||||||
|
# Frontend build
|
||||||
|
backend/public/
|
||||||
*.sqlite
|
*.sqlite
|
||||||
*.sqlite3
|
*.sqlite3
|
||||||
|
|
||||||
|
|||||||
369
DEPLOYMENT.md
Normal file
369
DEPLOYMENT.md
Normal file
@ -0,0 +1,369 @@
|
|||||||
|
# 🚀 Развертывание AI Code Review Platform
|
||||||
|
|
||||||
|
## 📋 Быстрый старт
|
||||||
|
|
||||||
|
### Одна команда для запуска всего:
|
||||||
|
|
||||||
|
**Linux/Mac:**
|
||||||
|
```bash
|
||||||
|
./start.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
**Windows:**
|
||||||
|
```bash
|
||||||
|
start.bat
|
||||||
|
```
|
||||||
|
|
||||||
|
Это автоматически:
|
||||||
|
1. ✅ Проверит установку Node.js и Python
|
||||||
|
2. ✅ Установит зависимости frontend
|
||||||
|
3. ✅ Соберет frontend в `backend/public`
|
||||||
|
4. ✅ Установит зависимости backend
|
||||||
|
5. ✅ Создаст `.env` из примера (если нужно)
|
||||||
|
6. ✅ Запустит сервер на http://localhost:8000
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔧 Требования
|
||||||
|
|
||||||
|
### Системные требования:
|
||||||
|
- **Python:** 3.10 или выше
|
||||||
|
- **Node.js:** 18 или выше
|
||||||
|
- **npm:** 9 или выше
|
||||||
|
|
||||||
|
### Проверка установленных версий:
|
||||||
|
```bash
|
||||||
|
python --version # или python3 --version
|
||||||
|
node --version
|
||||||
|
npm --version
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚙️ Настройка
|
||||||
|
|
||||||
|
### 1. Клонирование репозитория
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone <repository-url>
|
||||||
|
cd platform/review
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Конфигурация
|
||||||
|
|
||||||
|
Отредактируйте `backend/.env`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Ollama Configuration
|
||||||
|
OLLAMA_BASE_URL=http://localhost:11434
|
||||||
|
OLLAMA_MODEL=mistral:7b
|
||||||
|
|
||||||
|
# Master Git Tokens (optional)
|
||||||
|
MASTER_GITEA_TOKEN=your_gitea_token_here
|
||||||
|
MASTER_GITHUB_TOKEN=your_github_token_here
|
||||||
|
|
||||||
|
# Security
|
||||||
|
ENCRYPTION_KEY=your-32-character-encryption-key
|
||||||
|
```
|
||||||
|
|
||||||
|
**Генерация ключа шифрования:**
|
||||||
|
```python
|
||||||
|
python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Запуск
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Linux/Mac
|
||||||
|
chmod +x start.sh
|
||||||
|
./start.sh
|
||||||
|
|
||||||
|
# Windows
|
||||||
|
start.bat
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🏗️ Архитектура развертывания
|
||||||
|
|
||||||
|
### Схема работы:
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────────────────────────────────┐
|
||||||
|
│ Пользователь │
|
||||||
|
│ http://localhost:8000 │
|
||||||
|
└──────────────┬──────────────────────────┘
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
┌─────────────────────────────────────────┐
|
||||||
|
│ FastAPI Backend │
|
||||||
|
│ │
|
||||||
|
│ ┌─────────────────────────────────┐ │
|
||||||
|
│ │ API Endpoints │ │
|
||||||
|
│ │ /api/repositories │ │
|
||||||
|
│ │ /api/reviews │ │
|
||||||
|
│ │ /api/webhooks │ │
|
||||||
|
│ └─────────────────────────────────┘ │
|
||||||
|
│ │
|
||||||
|
│ ┌─────────────────────────────────┐ │
|
||||||
|
│ │ Static Files │ │
|
||||||
|
│ │ Serves: backend/public/ │ │
|
||||||
|
│ │ (React frontend build) │ │
|
||||||
|
│ └─────────────────────────────────┘ │
|
||||||
|
└─────────────────────────────────────────┘
|
||||||
|
│
|
||||||
|
├─────────► SQLite DB
|
||||||
|
│
|
||||||
|
├─────────► Ollama (AI)
|
||||||
|
│
|
||||||
|
└─────────► Git APIs
|
||||||
|
(Gitea/GitHub/Bitbucket)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Как это работает:
|
||||||
|
|
||||||
|
1. **Frontend билдится** в `backend/public/`
|
||||||
|
2. **Backend раздает** статику из `backend/public/`
|
||||||
|
3. **Один порт** (8000) для всего
|
||||||
|
4. **API** доступно на `/api/*`
|
||||||
|
5. **Frontend** на `/` (все остальные роуты)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📁 Структура после сборки
|
||||||
|
|
||||||
|
```
|
||||||
|
platform/review/
|
||||||
|
├── backend/
|
||||||
|
│ ├── public/ # ← Frontend build (создается автоматически)
|
||||||
|
│ │ ├── index.html
|
||||||
|
│ │ ├── assets/
|
||||||
|
│ │ │ ├── index-*.js
|
||||||
|
│ │ │ └── index-*.css
|
||||||
|
│ │ └── ...
|
||||||
|
│ ├── app/
|
||||||
|
│ ├── venv/
|
||||||
|
│ ├── .env
|
||||||
|
│ └── requirements.txt
|
||||||
|
├── frontend/
|
||||||
|
│ ├── src/
|
||||||
|
│ ├── package.json
|
||||||
|
│ └── vite.config.ts # ← Настроен на build в ../backend/public
|
||||||
|
├── start.sh # ← Единый скрипт запуска (Linux/Mac)
|
||||||
|
└── start.bat # ← Единый скрипт запуска (Windows)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔄 Процесс сборки
|
||||||
|
|
||||||
|
### Что происходит при запуске `start.sh` / `start.bat`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
1. Проверка Node.js ✓
|
||||||
|
→ node --version
|
||||||
|
|
||||||
|
2. Проверка Python ✓
|
||||||
|
→ python --version
|
||||||
|
|
||||||
|
3. Установка зависимостей frontend ✓
|
||||||
|
→ cd frontend
|
||||||
|
→ npm install
|
||||||
|
|
||||||
|
4. Сборка frontend ✓
|
||||||
|
→ npm run build
|
||||||
|
→ Вывод: backend/public/
|
||||||
|
|
||||||
|
5. Установка зависимостей backend ✓
|
||||||
|
→ cd backend
|
||||||
|
→ python -m venv venv
|
||||||
|
→ pip install -r requirements.txt
|
||||||
|
|
||||||
|
6. Проверка .env ✓
|
||||||
|
→ Создание из .env.example если нужно
|
||||||
|
|
||||||
|
7. Запуск сервера ✓
|
||||||
|
→ uvicorn app.main:app --reload
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🌐 Доступ к приложению
|
||||||
|
|
||||||
|
После запуска доступно:
|
||||||
|
|
||||||
|
- **Frontend (UI):** http://localhost:8000
|
||||||
|
- **API:** http://localhost:8000/api
|
||||||
|
- **API Docs (Swagger):** http://localhost:8000/docs
|
||||||
|
- **WebSocket:** ws://localhost:8000/ws
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🛠️ Разработка
|
||||||
|
|
||||||
|
### Запуск в режиме разработки (с hot-reload):
|
||||||
|
|
||||||
|
**Терминал 1 - Backend:**
|
||||||
|
```bash
|
||||||
|
cd backend
|
||||||
|
source venv/bin/activate # или venv\Scripts\activate на Windows
|
||||||
|
uvicorn app.main:app --reload
|
||||||
|
```
|
||||||
|
|
||||||
|
**Терминал 2 - Frontend:**
|
||||||
|
```bash
|
||||||
|
cd frontend
|
||||||
|
npm run dev
|
||||||
|
```
|
||||||
|
|
||||||
|
В этом режиме:
|
||||||
|
- Frontend: http://localhost:5173
|
||||||
|
- Backend: http://localhost:8000
|
||||||
|
- Frontend проксирует API запросы на backend
|
||||||
|
|
||||||
|
### Пересборка frontend:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd frontend
|
||||||
|
npm run build
|
||||||
|
```
|
||||||
|
|
||||||
|
Frontend автоматически соберется в `backend/public/`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🐳 Docker (опционально)
|
||||||
|
|
||||||
|
TODO: Добавить Dockerfile и docker-compose.yml
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 Production Deployment
|
||||||
|
|
||||||
|
### Для продакшена рекомендуется:
|
||||||
|
|
||||||
|
1. **Использовать Gunicorn + Uvicorn:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd backend
|
||||||
|
gunicorn app.main:app \
|
||||||
|
--workers 4 \
|
||||||
|
--worker-class uvicorn.workers.UvicornWorker \
|
||||||
|
--bind 0.0.0.0:8000
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **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";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Systemd service:**
|
||||||
|
|
||||||
|
```ini
|
||||||
|
[Unit]
|
||||||
|
Description=AI Code Review Platform
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=notify
|
||||||
|
User=www-data
|
||||||
|
WorkingDirectory=/path/to/platform/review/backend
|
||||||
|
ExecStart=/path/to/venv/bin/uvicorn app.main:app --host 0.0.0.0 --port 8000
|
||||||
|
Restart=always
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔧 Troubleshooting
|
||||||
|
|
||||||
|
### Проблема: Frontend не отображается
|
||||||
|
|
||||||
|
**Решение:**
|
||||||
|
```bash
|
||||||
|
cd frontend
|
||||||
|
npm run build
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проблема: Backend не запускается
|
||||||
|
|
||||||
|
**Проверьте:**
|
||||||
|
1. Установлен ли Python 3.10+
|
||||||
|
2. Создано ли виртуальное окружение
|
||||||
|
3. Установлены ли зависимости
|
||||||
|
4. Корректен ли `.env` файл
|
||||||
|
|
||||||
|
### Проблема: Ollama недоступен
|
||||||
|
|
||||||
|
**Убедитесь что:**
|
||||||
|
```bash
|
||||||
|
# Ollama запущен
|
||||||
|
ollama serve
|
||||||
|
|
||||||
|
# Модель скачана
|
||||||
|
ollama pull mistral:7b
|
||||||
|
|
||||||
|
# Ollama доступен
|
||||||
|
curl http://localhost:11434/api/version
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проблема: Ошибки шифрования токенов
|
||||||
|
|
||||||
|
**Удалите БД и пересоздайте:**
|
||||||
|
```bash
|
||||||
|
rm backend/review.db
|
||||||
|
# Перезапустите сервер
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📝 Полезные команды
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверка статуса
|
||||||
|
ps aux | grep uvicorn
|
||||||
|
|
||||||
|
# Просмотр логов
|
||||||
|
tail -f backend/logs/app.log # если настроено логирование
|
||||||
|
|
||||||
|
# Остановка сервера
|
||||||
|
# Ctrl+C в терминале где запущен
|
||||||
|
|
||||||
|
# Очистка
|
||||||
|
rm -rf backend/public/
|
||||||
|
rm -rf frontend/node_modules/
|
||||||
|
rm -rf backend/venv/
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✅ Готово!
|
||||||
|
|
||||||
|
Теперь у вас есть:
|
||||||
|
- 🚀 Единая команда запуска
|
||||||
|
- 📦 Автоматическая сборка frontend
|
||||||
|
- 🌐 Один порт для всего
|
||||||
|
- 🔄 Hot-reload в разработке
|
||||||
|
- 📚 Документация
|
||||||
|
|
||||||
|
**Запускайте и наслаждайтесь!** 🎉
|
||||||
|
|
||||||
619
README.md
619
README.md
@ -1,299 +1,330 @@
|
|||||||
# AI Code Review Agent 🤖
|
# 🤖 AI Code Review Platform
|
||||||
|
|
||||||
AI агент для автоматического ревью Pull Request с поддержкой **Gitea**, **GitHub** и **Bitbucket**.
|
Автоматический ревьювер кода на базе AI для Gitea, GitHub и Bitbucket.
|
||||||
|
|
||||||
Работает на **LangChain/LangGraph** с локальной LLM через **Ollama**.
|
|
||||||
|
|
||||||
## 🌟 Особенности
|
|
||||||
|
|
||||||
- ✅ **Поддержка множества Git платформ**: Gitea (приоритет), GitHub, Bitbucket
|
|
||||||
- 🤖 **AI-анализ кода**: использует Ollama с моделью codellama
|
|
||||||
- 🔄 **Real-time обновления**: WebSocket для отслеживания прогресса
|
|
||||||
- 🎯 **Умный анализ**: находит баги, проблемы безопасности, нарушения best practices
|
|
||||||
- 🌐 **Современный UI**: React + TypeScript + Tailwind CSS
|
|
||||||
- 📊 **Дашборд**: статистика и мониторинг ревью
|
|
||||||
- 🪝 **Webhook интеграция**: автоматический запуск при создании/обновлении PR
|
|
||||||
|
|
||||||
## 🏗️ Архитектура
|
|
||||||
|
|
||||||
```
|
|
||||||
┌─────────────┐ ┌──────────────┐ ┌─────────────┐
|
|
||||||
│ Git Platform│─────▶│ Backend │─────▶│ Ollama │
|
|
||||||
│ (Webhook) │ │ FastAPI + │ │ (codellama)│
|
|
||||||
└─────────────┘ │ LangGraph │ └─────────────┘
|
|
||||||
└──────┬───────┘
|
|
||||||
│
|
|
||||||
▼
|
|
||||||
┌──────────────┐
|
|
||||||
│ Frontend │
|
|
||||||
│ React + WS │
|
|
||||||
└──────────────┘
|
|
||||||
```
|
|
||||||
|
|
||||||
## 📋 Требования
|
|
||||||
|
|
||||||
- **Python 3.11+**
|
|
||||||
- **Node.js 18+**
|
|
||||||
- **Ollama** (установлен и запущен)
|
|
||||||
|
|
||||||
## 🚀 Быстрый старт
|
|
||||||
|
|
||||||
### 1. Установка Ollama и модели
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Установите Ollama с https://ollama.ai/
|
|
||||||
|
|
||||||
# Загрузите модель codellama
|
|
||||||
ollama pull codellama
|
|
||||||
|
|
||||||
# Запустите Ollama
|
|
||||||
ollama serve
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. Backend (FastAPI)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd backend
|
|
||||||
|
|
||||||
# Создайте виртуальное окружение
|
|
||||||
python -m venv venv
|
|
||||||
source venv/bin/activate # На Windows: venv\Scripts\activate
|
|
||||||
|
|
||||||
# Установите зависимости
|
|
||||||
pip install -r requirements.txt
|
|
||||||
|
|
||||||
# Создайте .env файл
|
|
||||||
cp .env.example .env
|
|
||||||
|
|
||||||
# Отредактируйте .env и установите:
|
|
||||||
# - SECRET_KEY (генерируйте случайную строку)
|
|
||||||
# - ENCRYPTION_KEY (генерируйте случайную строку)
|
|
||||||
|
|
||||||
# Запустите сервер
|
|
||||||
python -m uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
|
|
||||||
```
|
|
||||||
|
|
||||||
Backend будет доступен на `http://localhost:8000`
|
|
||||||
|
|
||||||
Swagger документация: `http://localhost:8000/docs`
|
|
||||||
|
|
||||||
### 3. Frontend (React)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd frontend
|
|
||||||
|
|
||||||
# Установите зависимости
|
|
||||||
npm install
|
|
||||||
|
|
||||||
# Запустите dev сервер
|
|
||||||
npm run dev
|
|
||||||
```
|
|
||||||
|
|
||||||
Frontend будет доступен на `http://localhost:5173`
|
|
||||||
|
|
||||||
## 🔧 Настройка
|
|
||||||
|
|
||||||
### Backend (.env)
|
|
||||||
|
|
||||||
```env
|
|
||||||
# Ollama
|
|
||||||
OLLAMA_BASE_URL=http://localhost:11434
|
|
||||||
OLLAMA_MODEL=codellama
|
|
||||||
|
|
||||||
# Database
|
|
||||||
DATABASE_URL=sqlite+aiosqlite:///./review.db
|
|
||||||
|
|
||||||
# Security
|
|
||||||
SECRET_KEY=your-secret-key-here
|
|
||||||
ENCRYPTION_KEY=your-encryption-key-here
|
|
||||||
|
|
||||||
# Server
|
|
||||||
HOST=0.0.0.0
|
|
||||||
PORT=8000
|
|
||||||
DEBUG=True
|
|
||||||
|
|
||||||
# CORS
|
|
||||||
CORS_ORIGINS=http://localhost:5173,http://localhost:3000
|
|
||||||
```
|
|
||||||
|
|
||||||
### Frontend (.env)
|
|
||||||
|
|
||||||
```env
|
|
||||||
VITE_API_URL=http://localhost:8000
|
|
||||||
VITE_WS_URL=ws://localhost:8000
|
|
||||||
```
|
|
||||||
|
|
||||||
## 📖 Использование
|
|
||||||
|
|
||||||
### 1. Добавление репозитория
|
|
||||||
|
|
||||||
1. Откройте UI: `http://localhost:5173`
|
|
||||||
2. Перейдите на страницу **Репозитории**
|
|
||||||
3. Нажмите **+ Добавить репозиторий**
|
|
||||||
4. Заполните форму:
|
|
||||||
- **Название**: имя вашего проекта
|
|
||||||
- **Платформа**: Gitea / GitHub / Bitbucket
|
|
||||||
- **URL**: полный URL репозитория
|
|
||||||
- **API токен**: токен доступа к Git платформе
|
|
||||||
|
|
||||||
### 2. Настройка webhook в Gitea
|
|
||||||
|
|
||||||
1. Скопируйте **Webhook URL** из карточки репозитория
|
|
||||||
2. В Gitea: Settings → Webhooks → Add Webhook
|
|
||||||
3. Вставьте URL
|
|
||||||
4. Выберите события: **Pull Request**
|
|
||||||
5. Сохраните
|
|
||||||
|
|
||||||
### 3. Создание Pull Request
|
|
||||||
|
|
||||||
1. Создайте PR в вашем репозитории
|
|
||||||
2. Webhook автоматически запустит ревью
|
|
||||||
3. Следите за прогрессом в UI (страница **Ревью**)
|
|
||||||
4. Комментарии появятся в PR автоматически
|
|
||||||
|
|
||||||
## 🎯 Что анализирует AI
|
|
||||||
|
|
||||||
- 🐛 **Потенциальные баги**: логические ошибки, null/undefined
|
|
||||||
- 🔒 **Безопасность**: SQL injection, XSS, утечки данных
|
|
||||||
- 📝 **Best practices**: SOLID, чистый код, паттерны
|
|
||||||
- ⚡ **Производительность**: неэффективные алгоритмы, утечки памяти
|
|
||||||
- 📖 **Читаемость**: понятность кода, комментарии
|
|
||||||
|
|
||||||
## 📊 API Endpoints
|
|
||||||
|
|
||||||
### Repositories
|
|
||||||
|
|
||||||
- `GET /api/repositories` - список репозиториев
|
|
||||||
- `POST /api/repositories` - добавить репозиторий
|
|
||||||
- `PUT /api/repositories/{id}` - обновить
|
|
||||||
- `DELETE /api/repositories/{id}` - удалить
|
|
||||||
|
|
||||||
### Reviews
|
|
||||||
|
|
||||||
- `GET /api/reviews` - список ревью
|
|
||||||
- `GET /api/reviews/{id}` - детали ревью
|
|
||||||
- `POST /api/reviews/{id}/retry` - повторить ревью
|
|
||||||
- `GET /api/reviews/stats/dashboard` - статистика
|
|
||||||
|
|
||||||
### Webhooks
|
|
||||||
|
|
||||||
- `POST /api/webhooks/gitea/{repository_id}` - Gitea webhook
|
|
||||||
- `POST /api/webhooks/github/{repository_id}` - GitHub webhook
|
|
||||||
- `POST /api/webhooks/bitbucket/{repository_id}` - Bitbucket webhook
|
|
||||||
|
|
||||||
### WebSocket
|
|
||||||
|
|
||||||
- `ws://localhost:8000/ws/reviews` - real-time обновления
|
|
||||||
|
|
||||||
## 🛠️ Разработка
|
|
||||||
|
|
||||||
### Backend
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd backend
|
|
||||||
|
|
||||||
# Запуск с hot reload
|
|
||||||
uvicorn app.main:app --reload
|
|
||||||
|
|
||||||
# Миграции (если используется Alembic)
|
|
||||||
alembic upgrade head
|
|
||||||
```
|
|
||||||
|
|
||||||
### Frontend
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd frontend
|
|
||||||
|
|
||||||
# Dev сервер
|
|
||||||
npm run dev
|
|
||||||
|
|
||||||
# Сборка
|
|
||||||
npm run build
|
|
||||||
|
|
||||||
# Предпросмотр сборки
|
|
||||||
npm run preview
|
|
||||||
|
|
||||||
# Линтинг
|
|
||||||
npm run lint
|
|
||||||
```
|
|
||||||
|
|
||||||
## 🗂️ Структура проекта
|
|
||||||
|
|
||||||
```
|
|
||||||
platform/review/
|
|
||||||
├── backend/
|
|
||||||
│ ├── app/
|
|
||||||
│ │ ├── agents/ # LangGraph агенты
|
|
||||||
│ │ ├── api/ # API endpoints
|
|
||||||
│ │ ├── models/ # Database модели
|
|
||||||
│ │ ├── schemas/ # Pydantic схемы
|
|
||||||
│ │ ├── services/ # Git платформы
|
|
||||||
│ │ ├── webhooks/ # Webhook обработчики
|
|
||||||
│ │ ├── config.py
|
|
||||||
│ │ ├── database.py
|
|
||||||
│ │ └── main.py
|
|
||||||
│ └── requirements.txt
|
|
||||||
├── frontend/
|
|
||||||
│ ├── src/
|
|
||||||
│ │ ├── api/ # API клиент
|
|
||||||
│ │ ├── components/ # React компоненты
|
|
||||||
│ │ ├── pages/ # Страницы
|
|
||||||
│ │ ├── types/ # TypeScript типы
|
|
||||||
│ │ └── App.tsx
|
|
||||||
│ └── package.json
|
|
||||||
├── cloud.md # План проекта
|
|
||||||
└── README.md # Этот файл
|
|
||||||
```
|
|
||||||
|
|
||||||
## 🔐 Безопасность
|
|
||||||
|
|
||||||
- API токены шифруются перед сохранением (Fernet)
|
|
||||||
- Webhook signature validation
|
|
||||||
- CORS настроен для конкретных доменов
|
|
||||||
- Rate limiting (рекомендуется для production)
|
|
||||||
|
|
||||||
## 🚀 Production развертывание
|
|
||||||
|
|
||||||
### Docker (рекомендуется)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# TODO: Добавить Dockerfile и docker-compose.yml
|
|
||||||
```
|
|
||||||
|
|
||||||
### Manual
|
|
||||||
|
|
||||||
1. Используйте PostgreSQL вместо SQLite
|
|
||||||
2. Настройте reverse proxy (nginx)
|
|
||||||
3. Используйте HTTPS
|
|
||||||
4. Настройте environment variables
|
|
||||||
5. Используйте process manager (systemd/supervisor)
|
|
||||||
|
|
||||||
## 🤝 Вклад в разработку
|
|
||||||
|
|
||||||
Contributions welcome!
|
|
||||||
|
|
||||||
1. Fork проект
|
|
||||||
2. Создайте feature branch
|
|
||||||
3. Commit изменения
|
|
||||||
4. Push в branch
|
|
||||||
5. Создайте Pull Request
|
|
||||||
|
|
||||||
## 📝 Лицензия
|
|
||||||
|
|
||||||
MIT License
|
|
||||||
|
|
||||||
## 🙏 Благодарности
|
|
||||||
|
|
||||||
- [LangChain](https://github.com/langchain-ai/langchain) - фреймворк для LLM
|
|
||||||
- [Ollama](https://ollama.ai/) - локальный запуск LLM
|
|
||||||
- [FastAPI](https://fastapi.tiangolo.com/) - веб-фреймворк
|
|
||||||
- [React](https://react.dev/) - UI библиотека
|
|
||||||
|
|
||||||
## 📞 Поддержка
|
|
||||||
|
|
||||||
Возникли проблемы? Создайте Issue в репозитории.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
Made with ❤️ and 🤖 AI
|
## 🚀 Быстрый старт
|
||||||
|
|
||||||
|
### Запуск одной командой:
|
||||||
|
|
||||||
|
**Windows:**
|
||||||
|
```bash
|
||||||
|
start.bat
|
||||||
|
```
|
||||||
|
|
||||||
|
**Linux/Mac:**
|
||||||
|
```bash
|
||||||
|
chmod +x start.sh
|
||||||
|
./start.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Это автоматически:
|
||||||
|
- ✅ Проверит зависимости
|
||||||
|
- ✅ Установит пакеты
|
||||||
|
- ✅ Соберет frontend
|
||||||
|
- ✅ Запустит сервер
|
||||||
|
|
||||||
|
**Готово!** Откройте http://localhost:8000
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📋 Что делает платформа
|
||||||
|
|
||||||
|
1. **Получает Pull Request** через webhook
|
||||||
|
2. **Анализирует код** с помощью AI (Ollama)
|
||||||
|
3. **Находит проблемы:**
|
||||||
|
- ❌ Критичные ошибки (синтаксис, логика)
|
||||||
|
- ⚠️ Важные замечания (code smell, антипаттерны)
|
||||||
|
- ℹ️ Рекомендации (стиль, best practices)
|
||||||
|
4. **Публикует комментарии** в PR
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 Особенности
|
||||||
|
|
||||||
|
- ✅ **3 платформы:** Gitea, GitHub, Bitbucket
|
||||||
|
- ✅ **Webhooks:** Автоматический ревью при создании PR
|
||||||
|
- ✅ **Ручной запуск:** Кнопка "Проверить сейчас"
|
||||||
|
- ✅ **WebSocket:** Обновления в реальном времени
|
||||||
|
- ✅ **Детальные комментарии:** Отдельный комментарий на каждую проблему
|
||||||
|
- ✅ **Мастер токены:** Один токен для всех репозиториев
|
||||||
|
- ✅ **Единый порт:** Frontend и Backend на 8000
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🛠️ Требования
|
||||||
|
|
||||||
|
- **Python:** 3.10+
|
||||||
|
- **Node.js:** 18+
|
||||||
|
- **Ollama:** Для запуска AI моделей
|
||||||
|
|
||||||
|
### Установка Ollama:
|
||||||
|
|
||||||
|
**Linux:**
|
||||||
|
```bash
|
||||||
|
curl -fsSL https://ollama.com/install.sh | sh
|
||||||
|
```
|
||||||
|
|
||||||
|
**Windows/Mac:**
|
||||||
|
Скачайте с https://ollama.com/download
|
||||||
|
|
||||||
|
### Скачайте модель:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ollama pull mistral:7b
|
||||||
|
# или
|
||||||
|
ollama pull llama3:8b
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚙️ Настройка
|
||||||
|
|
||||||
|
### 1. Клонируйте репозиторий
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone <repository-url>
|
||||||
|
cd platform/review
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Настройте `.env`
|
||||||
|
|
||||||
|
Файл `backend/.env` будет создан автоматически из `.env.example`.
|
||||||
|
|
||||||
|
**Обязательно настройте:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Ollama
|
||||||
|
OLLAMA_BASE_URL=http://localhost:11434
|
||||||
|
OLLAMA_MODEL=mistral:7b
|
||||||
|
|
||||||
|
# Мастер токены (опционально)
|
||||||
|
MASTER_GITEA_TOKEN=your_token_here
|
||||||
|
|
||||||
|
# Ключ шифрования (обязательно!)
|
||||||
|
ENCRYPTION_KEY=your-32-char-key-here
|
||||||
|
```
|
||||||
|
|
||||||
|
**Генерация ключа:**
|
||||||
|
```python
|
||||||
|
python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Запустите
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./start.sh # Linux/Mac
|
||||||
|
start.bat # Windows
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📖 Использование
|
||||||
|
|
||||||
|
### 1. Добавьте репозиторий
|
||||||
|
|
||||||
|
http://localhost:8000 → **"Добавить репозиторий"**
|
||||||
|
|
||||||
|
- **Платформа:** Gitea/GitHub/Bitbucket
|
||||||
|
- **URL:** https://git.example.com/owner/repo
|
||||||
|
- **API Token:** (или оставьте пустым для мастер токена)
|
||||||
|
|
||||||
|
### 2. Настройте webhook
|
||||||
|
|
||||||
|
Скопируйте webhook URL из списка репозиториев.
|
||||||
|
|
||||||
|
**В Gitea:**
|
||||||
|
Settings → Webhooks → Add Webhook → Gitea
|
||||||
|
- Payload URL: `http://your-server:8000/api/webhooks/gitea/1`
|
||||||
|
- Content Type: `application/json`
|
||||||
|
- Secret: (из списка репозиториев)
|
||||||
|
- Trigger: Pull Request
|
||||||
|
|
||||||
|
### 3. Готово!
|
||||||
|
|
||||||
|
Создайте PR и агент автоматически проведет ревью! 🎉
|
||||||
|
|
||||||
|
Или нажмите **"🔍 Проверить сейчас"** для ручного запуска.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 Что вы увидите
|
||||||
|
|
||||||
|
### В интерфейсе:
|
||||||
|
|
||||||
|
```
|
||||||
|
📊 Репозитории: 5
|
||||||
|
🔍 Ревью: 23
|
||||||
|
✅ Успешных: 20
|
||||||
|
❌ Ошибок: 3
|
||||||
|
```
|
||||||
|
|
||||||
|
### В Gitea/GitHub:
|
||||||
|
|
||||||
|
**Общий комментарий:**
|
||||||
|
```
|
||||||
|
🤖 AI Code Review
|
||||||
|
|
||||||
|
📊 Статистика
|
||||||
|
- Всего проблем: 4
|
||||||
|
- ❌ Критичных: 4
|
||||||
|
|
||||||
|
💡 Рекомендации
|
||||||
|
⚠️ Найдены критичные проблемы!
|
||||||
|
Пожалуйста, исправьте их перед мержем.
|
||||||
|
|
||||||
|
📝 Детальные комментарии для каждой
|
||||||
|
проблемы опубликованы ниже.
|
||||||
|
```
|
||||||
|
|
||||||
|
**Отдельные комментарии:**
|
||||||
|
```
|
||||||
|
❌ src/pages/search-character.tsx:58
|
||||||
|
|
||||||
|
ERROR: Опечатка в строке:
|
||||||
|
'shmapplication/json' должно быть
|
||||||
|
'application/json'
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔧 Разработка
|
||||||
|
|
||||||
|
### Backend:
|
||||||
|
```bash
|
||||||
|
cd backend
|
||||||
|
source venv/bin/activate # Windows: venv\Scripts\activate
|
||||||
|
uvicorn app.main:app --reload
|
||||||
|
```
|
||||||
|
|
||||||
|
### Frontend:
|
||||||
|
```bash
|
||||||
|
cd frontend
|
||||||
|
npm run dev
|
||||||
|
```
|
||||||
|
|
||||||
|
В режиме разработки:
|
||||||
|
- Frontend: http://localhost:5173
|
||||||
|
- Backend: http://localhost:8000
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📁 Структура
|
||||||
|
|
||||||
|
```
|
||||||
|
platform/review/
|
||||||
|
├── backend/ # FastAPI + LangGraph
|
||||||
|
│ ├── app/
|
||||||
|
│ │ ├── agents/ # AI агент
|
||||||
|
│ │ ├── api/ # REST endpoints
|
||||||
|
│ │ ├── models/ # SQLAlchemy models
|
||||||
|
│ │ ├── services/ # Git API clients
|
||||||
|
│ │ └── main.py # Entry point
|
||||||
|
│ ├── public/ # Frontend build (auto-generated)
|
||||||
|
│ └── requirements.txt
|
||||||
|
├── frontend/ # React + Vite
|
||||||
|
│ ├── src/
|
||||||
|
│ └── package.json
|
||||||
|
├── start.sh # Единый запуск (Linux/Mac)
|
||||||
|
├── start.bat # Единый запуск (Windows)
|
||||||
|
└── DEPLOYMENT.md # Подробная документация
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🌟 Возможности
|
||||||
|
|
||||||
|
### ✅ Реализовано:
|
||||||
|
|
||||||
|
- [x] Поддержка Gitea, GitHub, Bitbucket
|
||||||
|
- [x] Webhooks для автоматического ревью
|
||||||
|
- [x] Ручной запуск ревью
|
||||||
|
- [x] Детальные комментарии с ссылками на строки
|
||||||
|
- [x] WebSocket для real-time обновлений
|
||||||
|
- [x] Мастер токены для упрощения настройки
|
||||||
|
- [x] Единый запуск (frontend + backend)
|
||||||
|
- [x] Экранирование HTML тегов в комментариях
|
||||||
|
- [x] Контекст PR (title + description) в промпте
|
||||||
|
- [x] Retry механизм для failed ревью
|
||||||
|
- [x] Модальные окна вместо alert/confirm
|
||||||
|
|
||||||
|
### 🚧 Планируется:
|
||||||
|
|
||||||
|
- [ ] Docker контейнер
|
||||||
|
- [ ] Статусы PR (Approve/Request Changes)
|
||||||
|
- [ ] Настраиваемые правила ревью
|
||||||
|
- [ ] Кастомные промпты
|
||||||
|
- [ ] Множественные AI модели
|
||||||
|
- [ ] Метрики и аналитика
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🤝 Вклад
|
||||||
|
|
||||||
|
Pull requests приветствуются!
|
||||||
|
|
||||||
|
Для больших изменений сначала откройте issue для обсуждения.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📄 Лицензия
|
||||||
|
|
||||||
|
MIT
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📚 Документация
|
||||||
|
|
||||||
|
- **[DEPLOYMENT.md](DEPLOYMENT.md)** - Полное руководство по развертыванию
|
||||||
|
- **[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
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🆘 Помощь
|
||||||
|
|
||||||
|
### Проблемы с Ollama?
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверьте что Ollama запущен
|
||||||
|
curl http://localhost:11434/api/version
|
||||||
|
|
||||||
|
# Скачайте модель
|
||||||
|
ollama pull mistral:7b
|
||||||
|
```
|
||||||
|
|
||||||
|
### Frontend не отображается?
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd frontend
|
||||||
|
npm run build
|
||||||
|
```
|
||||||
|
|
||||||
|
### Backend не запускается?
|
||||||
|
|
||||||
|
Проверьте `.env` файл и установите `ENCRYPTION_KEY`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎉 Начните использовать!
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. Клонируйте
|
||||||
|
git clone <url>
|
||||||
|
cd platform/review
|
||||||
|
|
||||||
|
# 2. Настройте .env
|
||||||
|
nano backend/.env
|
||||||
|
|
||||||
|
# 3. Запустите
|
||||||
|
./start.sh # или start.bat
|
||||||
|
|
||||||
|
# 4. Откройте
|
||||||
|
http://localhost:8000
|
||||||
|
```
|
||||||
|
|
||||||
|
**Готово!** 🚀
|
||||||
|
|||||||
@ -2,8 +2,11 @@
|
|||||||
|
|
||||||
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
|
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
|
||||||
from fastapi.middleware.cors import CORSMiddleware
|
from fastapi.middleware.cors import CORSMiddleware
|
||||||
|
from fastapi.staticfiles import StaticFiles
|
||||||
|
from fastapi.responses import FileResponse
|
||||||
from contextlib import asynccontextmanager
|
from contextlib import asynccontextmanager
|
||||||
from typing import List
|
from typing import List
|
||||||
|
from pathlib import Path
|
||||||
import json
|
import json
|
||||||
|
|
||||||
from app.config import settings
|
from app.config import settings
|
||||||
@ -67,14 +70,38 @@ app.add_middleware(
|
|||||||
# Include API routes
|
# Include API routes
|
||||||
app.include_router(api_router, prefix="/api")
|
app.include_router(api_router, prefix="/api")
|
||||||
|
|
||||||
|
# Serve static files (frontend build)
|
||||||
|
public_dir = Path(__file__).parent.parent / "public"
|
||||||
|
if public_dir.exists():
|
||||||
|
# Serve assets (JS, CSS, images)
|
||||||
|
app.mount("/assets", StaticFiles(directory=str(public_dir / "assets")), name="assets")
|
||||||
|
|
||||||
@app.get("/")
|
@app.get("/", response_class=FileResponse)
|
||||||
async def root():
|
async def serve_frontend_root():
|
||||||
"""Root endpoint"""
|
"""Serve frontend index.html"""
|
||||||
|
return FileResponse(str(public_dir / "index.html"))
|
||||||
|
|
||||||
|
@app.get("/{full_path:path}", response_class=FileResponse)
|
||||||
|
async def serve_frontend_routes(full_path: str):
|
||||||
|
"""Serve frontend for all routes (SPA support)"""
|
||||||
|
# Skip API and WebSocket routes
|
||||||
|
if full_path.startswith(("api/", "ws/", "docs", "redoc", "openapi.json")):
|
||||||
|
return None
|
||||||
|
|
||||||
|
file_path = public_dir / full_path
|
||||||
|
if file_path.exists() and file_path.is_file():
|
||||||
|
return FileResponse(str(file_path))
|
||||||
|
# Fallback to index.html for SPA routing
|
||||||
|
return FileResponse(str(public_dir / "index.html"))
|
||||||
|
else:
|
||||||
|
@app.get("/")
|
||||||
|
async def root():
|
||||||
|
"""Root endpoint (when frontend not built)"""
|
||||||
return {
|
return {
|
||||||
"message": "AI Code Review Agent API",
|
"message": "AI Code Review Agent API",
|
||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"docs": "/docs"
|
"docs": "/docs",
|
||||||
|
"note": "Frontend not built. Run 'npm run build' in frontend directory."
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -16,8 +16,9 @@ export default function ReviewDetail() {
|
|||||||
const { data: review, isLoading } = useQuery({
|
const { data: review, isLoading } = useQuery({
|
||||||
queryKey: ['review', id],
|
queryKey: ['review', id],
|
||||||
queryFn: () => getReview(Number(id)),
|
queryFn: () => getReview(Number(id)),
|
||||||
refetchInterval: (data) => {
|
refetchInterval: (query) => {
|
||||||
// Refetch if review is in progress
|
// Refetch if review is in progress
|
||||||
|
const data = query.state.data;
|
||||||
return data?.status && ['pending', 'fetching', 'analyzing', 'commenting'].includes(data.status)
|
return data?.status && ['pending', 'fetching', 'analyzing', 'commenting'].includes(data.status)
|
||||||
? 5000
|
? 5000
|
||||||
: false;
|
: false;
|
||||||
|
|||||||
@ -4,6 +4,10 @@ import react from '@vitejs/plugin-react'
|
|||||||
// https://vitejs.dev/config/
|
// https://vitejs.dev/config/
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
plugins: [react()],
|
plugins: [react()],
|
||||||
|
build: {
|
||||||
|
outDir: '../backend/public',
|
||||||
|
emptyOutDir: true,
|
||||||
|
},
|
||||||
server: {
|
server: {
|
||||||
port: 5173,
|
port: 5173,
|
||||||
proxy: {
|
proxy: {
|
||||||
|
|||||||
95
start.bat
Normal file
95
start.bat
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
@echo off
|
||||||
|
REM Единый скрипт запуска AI Code Review Platform
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo ========================================
|
||||||
|
echo AI Code Review Platform - Запуск
|
||||||
|
echo ========================================
|
||||||
|
echo.
|
||||||
|
|
||||||
|
REM 1. Проверка Node.js
|
||||||
|
echo [STEP 1/7] Проверка Node.js...
|
||||||
|
where node >nul 2>nul
|
||||||
|
if %ERRORLEVEL% NEQ 0 (
|
||||||
|
echo [ERROR] Node.js не установлен! Установите Node.js 18+ и попробуйте снова.
|
||||||
|
pause
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
node --version
|
||||||
|
echo [OK] Node.js установлен
|
||||||
|
echo.
|
||||||
|
|
||||||
|
REM 2. Проверка Python
|
||||||
|
echo [STEP 2/7] Проверка Python...
|
||||||
|
where python >nul 2>nul
|
||||||
|
if %ERRORLEVEL% NEQ 0 (
|
||||||
|
echo [ERROR] Python не установлен! Установите Python 3.10+ и попробуйте снова.
|
||||||
|
pause
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
python --version
|
||||||
|
echo [OK] Python установлен
|
||||||
|
echo.
|
||||||
|
|
||||||
|
REM 3. Установка зависимостей frontend
|
||||||
|
echo [STEP 3/7] Установка зависимостей frontend...
|
||||||
|
cd frontend
|
||||||
|
if not exist "node_modules\" (
|
||||||
|
echo Установка npm пакетов...
|
||||||
|
call npm install
|
||||||
|
) else (
|
||||||
|
echo node_modules уже существует, пропускаем...
|
||||||
|
)
|
||||||
|
echo [OK] Зависимости frontend установлены
|
||||||
|
echo.
|
||||||
|
|
||||||
|
REM 4. Сборка frontend
|
||||||
|
echo [STEP 4/7] Сборка frontend...
|
||||||
|
call npm run build
|
||||||
|
echo [OK] Frontend собран в backend/public
|
||||||
|
echo.
|
||||||
|
|
||||||
|
REM 5. Установка зависимостей backend
|
||||||
|
cd ..\backend
|
||||||
|
echo [STEP 5/7] Установка зависимостей backend...
|
||||||
|
if not exist "venv\" (
|
||||||
|
echo Создание виртуального окружения...
|
||||||
|
python -m venv venv
|
||||||
|
)
|
||||||
|
|
||||||
|
REM Активация venv
|
||||||
|
call venv\Scripts\activate.bat
|
||||||
|
|
||||||
|
REM Установка зависимостей
|
||||||
|
pip install -r requirements.txt
|
||||||
|
echo [OK] Зависимости backend установлены
|
||||||
|
echo.
|
||||||
|
|
||||||
|
REM 6. Проверка .env
|
||||||
|
echo [STEP 6/7] Проверка конфигурации...
|
||||||
|
if not exist ".env" (
|
||||||
|
echo [WARNING] Файл .env не найден!
|
||||||
|
if exist ".env.example" (
|
||||||
|
echo Создаем .env из примера...
|
||||||
|
copy .env.example .env
|
||||||
|
echo [OK] Создан .env файл
|
||||||
|
echo [WARNING] ВАЖНО: Отредактируйте .env и добавьте необходимые токены!
|
||||||
|
) else (
|
||||||
|
echo [ERROR] .env.example не найден!
|
||||||
|
)
|
||||||
|
)
|
||||||
|
echo.
|
||||||
|
|
||||||
|
REM 7. Запуск backend
|
||||||
|
echo [STEP 7/7] Запуск сервера...
|
||||||
|
echo ========================================
|
||||||
|
echo.
|
||||||
|
echo Backend: http://localhost:8000
|
||||||
|
echo Frontend: http://localhost:8000
|
||||||
|
echo API Docs: http://localhost:8000/docs
|
||||||
|
echo.
|
||||||
|
echo Для остановки нажмите Ctrl+C
|
||||||
|
echo.
|
||||||
|
|
||||||
|
uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload
|
||||||
|
|
||||||
97
start.sh
Normal file
97
start.sh
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Единый скрипт запуска AI Code Review Platform
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "🚀 AI Code Review Platform - Запуск"
|
||||||
|
echo "===================================="
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Цвета для вывода
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
# 1. Проверка Node.js
|
||||||
|
echo -e "${YELLOW}📦 Проверка Node.js...${NC}"
|
||||||
|
if ! command -v node &> /dev/null; then
|
||||||
|
echo "❌ Node.js не установлен! Установите Node.js 18+ и попробуйте снова."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo -e "${GREEN}✅ Node.js $(node --version)${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# 2. Проверка Python
|
||||||
|
echo -e "${YELLOW}🐍 Проверка Python...${NC}"
|
||||||
|
if ! command -v python &> /dev/null && ! command -v python3 &> /dev/null; then
|
||||||
|
echo "❌ Python не установлен! Установите Python 3.10+ и попробуйте снова."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
PYTHON_CMD="python3"
|
||||||
|
if ! command -v python3 &> /dev/null; then
|
||||||
|
PYTHON_CMD="python"
|
||||||
|
fi
|
||||||
|
echo -e "${GREEN}✅ Python $($PYTHON_CMD --version)${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# 3. Установка зависимостей frontend
|
||||||
|
echo -e "${YELLOW}📦 Установка зависимостей frontend...${NC}"
|
||||||
|
cd frontend
|
||||||
|
if [ ! -d "node_modules" ]; then
|
||||||
|
npm install
|
||||||
|
else
|
||||||
|
echo "node_modules уже существует, пропускаем..."
|
||||||
|
fi
|
||||||
|
echo -e "${GREEN}✅ Зависимости frontend установлены${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# 4. Сборка frontend
|
||||||
|
echo -e "${YELLOW}🔨 Сборка frontend...${NC}"
|
||||||
|
npm run build
|
||||||
|
echo -e "${GREEN}✅ Frontend собран в backend/public${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# 5. Установка зависимостей backend
|
||||||
|
cd ../backend
|
||||||
|
echo -e "${YELLOW}📦 Установка зависимостей backend...${NC}"
|
||||||
|
if [ ! -d "venv" ]; then
|
||||||
|
echo "Создание виртуального окружения..."
|
||||||
|
$PYTHON_CMD -m venv venv
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Активация venv
|
||||||
|
source venv/bin/activate
|
||||||
|
|
||||||
|
# Установка зависимостей
|
||||||
|
pip install -r requirements.txt
|
||||||
|
echo -e "${GREEN}✅ Зависимости backend установлены${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# 6. Проверка .env
|
||||||
|
if [ ! -f ".env" ]; then
|
||||||
|
echo -e "${YELLOW}⚠️ Файл .env не найден!${NC}"
|
||||||
|
echo "Создаем .env из примера..."
|
||||||
|
if [ -f ".env.example" ]; then
|
||||||
|
cp .env.example .env
|
||||||
|
echo -e "${GREEN}✅ Создан .env файл${NC}"
|
||||||
|
echo -e "${YELLOW}⚠️ ВАЖНО: Отредактируйте .env и добавьте необходимые токены!${NC}"
|
||||||
|
else
|
||||||
|
echo "❌ .env.example не найден!"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 7. Запуск backend
|
||||||
|
echo -e "${GREEN}🎉 Запуск сервера...${NC}"
|
||||||
|
echo "===================================="
|
||||||
|
echo ""
|
||||||
|
echo "📍 Backend: http://localhost:8000"
|
||||||
|
echo "📍 Frontend: http://localhost:8000"
|
||||||
|
echo "📍 API Docs: http://localhost:8000/docs"
|
||||||
|
echo ""
|
||||||
|
echo "Для остановки нажмите Ctrl+C"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload
|
||||||
|
|
||||||
Loading…
x
Reference in New Issue
Block a user