diff --git a/README.md b/README.md index 9f98f5c..69e160d 100644 --- a/README.md +++ b/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: diff --git a/UBUNTU_DEPLOYMENT.md b/UBUNTU_DEPLOYMENT.md new file mode 100644 index 0000000..33425dd --- /dev/null +++ b/UBUNTU_DEPLOYMENT.md @@ -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 +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 +``` + +**Наслаждайтесь автоматическим ревью кода! 🚀** + diff --git a/deploy-ubuntu.sh b/deploy-ubuntu.sh new file mode 100644 index 0000000..4ea28a8 --- /dev/null +++ b/deploy-ubuntu.sh @@ -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 "" + diff --git a/uninstall-ubuntu.sh b/uninstall-ubuntu.sh new file mode 100644 index 0000000..5da416d --- /dev/null +++ b/uninstall-ubuntu.sh @@ -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 "" +