code-review-agent/deploy-ubuntu.sh
Primakov Alexandr Alexandrovich 70889421ea Implement relative paths for frontend API and WebSocket connections
- Created `.env.production` file to define relative paths for production deployment.
- Updated frontend API and WebSocket client to use environment variables for dynamic URL handling.
- Enhanced deployment scripts (`deploy-ubuntu.sh`, `start.sh`, `start.bat`) to generate `.env.production` automatically.
- Added `PRODUCTION_URLS.md` for documentation on production URL configuration and troubleshooting.
2025-10-12 23:53:47 +03:00

299 lines
9.5 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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
# Создаем .env.production для относительных путей
cat > .env.production << 'EOF'
# Production - используем относительные пути
VITE_API_URL=/api
VITE_WS_URL=
EOF
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 ""