From 89ab6b14feee4a382caf9c4ae3241b4bb291b69d Mon Sep 17 00:00:00 2001 From: Primakov Alexandr Alexandrovich Date: Mon, 13 Oct 2025 00:32:08 +0300 Subject: [PATCH] Enhance deployment script with dynamic installation directory and improved error handling - Updated `deploy-ubuntu.sh` to allow users to choose the installation directory dynamically. - Added checks for required files (`package.json`, `requirements.txt`, and `migrate.py`) with appropriate error messages. - Improved feedback during the installation process, including detailed logging for service status and troubleshooting steps. - Enhanced user experience with clearer prompts and success/error messages throughout the deployment process. --- deploy-ubuntu.sh | 136 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 121 insertions(+), 15 deletions(-) diff --git a/deploy-ubuntu.sh b/deploy-ubuntu.sh index b097200..b6030ac 100644 --- a/deploy-ubuntu.sh +++ b/deploy-ubuntu.sh @@ -60,29 +60,60 @@ echo -e "${GREEN}✓ Зависимости проверены${NC}" # 2. Определение пути установки echo -e "${YELLOW}[2/10] Настройка путей...${NC}" -INSTALL_DIR="/opt/ai-review" -CURRENT_DIR=$(pwd) +# Определить, откуда запущен скрипт +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +CURRENT_DIR="$SCRIPT_DIR" +# Спросить пользователя, куда устанавливать echo "Текущая директория: $CURRENT_DIR" +echo "" +echo "Выберите директорию установки:" +echo " 1) Использовать текущую директорию ($CURRENT_DIR)" +echo " 2) Установить в /opt/ai-review" +echo "" +read -p "Выбор [1/2] (по умолчанию 1): " install_choice +install_choice=${install_choice:-1} + +if [ "$install_choice" = "2" ]; then + INSTALL_DIR="/opt/ai-review" + NEED_COPY=true +else + INSTALL_DIR="$CURRENT_DIR" + NEED_COPY=false +fi + echo "Директория установки: $INSTALL_DIR" -# 3. Копирование файлов -echo -e "${YELLOW}[3/10] Копирование файлов проекта...${NC}" +# 3. Копирование файлов (если нужно) +echo -e "${YELLOW}[3/10] Подготовка файлов проекта...${NC}" -if [ "$CURRENT_DIR" != "$INSTALL_DIR" ]; then +if [ "$NEED_COPY" = true ]; then echo "Копирование в $INSTALL_DIR..." mkdir -p "$INSTALL_DIR" - cp -r "$CURRENT_DIR"/* "$INSTALL_DIR"/ + cp -r "$CURRENT_DIR"/* "$INSTALL_DIR"/ || { + echo -e "${RED}✗ Ошибка копирования файлов${NC}" + exit 1 + } chown -R "$REAL_USER":"$REAL_USER" "$INSTALL_DIR" + echo -e "${GREEN}✓ Файлы скопированы${NC}" +else + echo "Используем текущую директорию" + chown -R "$REAL_USER":"$REAL_USER" "$INSTALL_DIR" + echo -e "${GREEN}✓ Права установлены${NC}" fi cd "$INSTALL_DIR" -echo -e "${GREEN}✓ Файлы скопированы${NC}" # 4. Сборка frontend echo -e "${YELLOW}[4/10] Сборка frontend...${NC}" cd frontend +# Проверить наличие package.json +if [ ! -f "package.json" ]; then + echo -e "${RED}✗ Не найден package.json${NC}" + exit 1 +fi + # Создаем .env.production для относительных путей cat > .env.production << 'EOF' # Production - используем относительные пути @@ -90,19 +121,77 @@ VITE_API_URL=/api VITE_WS_URL= EOF -sudo -u "$REAL_USER" npm install -sudo -u "$REAL_USER" npm run build +echo "Установка npm зависимостей..." +sudo -u "$REAL_USER" npm install || { + echo -e "${RED}✗ Ошибка установки npm зависимостей${NC}" + exit 1 +} + +echo "Сборка frontend..." +sudo -u "$REAL_USER" npm run build || { + echo -e "${RED}✗ Ошибка сборки frontend${NC}" + exit 1 +} + +# Проверить, что build создан +if [ ! -d "../backend/public" ]; then + echo -e "${RED}✗ Frontend не собрался (отсутствует backend/public)${NC}" + exit 1 +fi + cd .. -echo -e "${GREEN}✓ Frontend собран${NC}" +echo -e "${GREEN}✓ Frontend собран (файлов: $(ls -1 backend/public | wc -l))${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 .. + +# Проверить наличие requirements.txt +if [ ! -f "requirements.txt" ]; then + echo -e "${RED}✗ Не найден requirements.txt${NC}" + exit 1 +fi + +echo "Создание Python virtual environment..." +sudo -u "$REAL_USER" python3 -m venv venv || { + echo -e "${RED}✗ Ошибка создания venv${NC}" + exit 1 +} + +# Проверить, что venv создан +if [ ! -d "venv" ]; then + echo -e "${RED}✗ venv не создан${NC}" + exit 1 +fi + +echo "Установка Python пакетов..." +sudo -u "$REAL_USER" bash -c "source venv/bin/activate && pip install --upgrade pip && pip install -r requirements.txt" || { + echo -e "${RED}✗ Ошибка установки Python зависимостей${NC}" + exit 1 +} + echo -e "${GREEN}✓ Python зависимости установлены${NC}" +# Применить миграции БД +echo "Применение миграций БД..." +if [ -f "migrate.py" ]; then + sudo -u "$REAL_USER" bash -c "source venv/bin/activate && python migrate.py" || { + echo -e "${YELLOW}⚠️ Предупреждение: миграции не применились${NC}" + } + + # Проверить, что БД создана + if [ -f "review.db" ]; then + echo -e "${GREEN}✓ База данных создана${NC}" + else + echo -e "${YELLOW}⚠️ База данных будет создана при первом запуске${NC}" + fi +else + echo -e "${YELLOW}⚠️ Скрипт миграции не найден, БД будет создана автоматически${NC}" +fi + +cd .. +echo -e "${GREEN}✓ Backend настроен${NC}" + # 6. Настройка .env echo -e "${YELLOW}[6/10] Настройка конфигурации...${NC}" @@ -191,14 +280,26 @@ systemctl enable ai-review.service systemctl start ai-review.service # Ждем запуска -sleep 3 +echo "Ожидание запуска (5 секунд)..." +sleep 5 # Проверка статуса 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" + echo "" + echo -e "${YELLOW}Последние 30 строк логов:${NC}" + journalctl -u ai-review.service -n 30 --no-pager + echo "" + echo -e "${YELLOW}Для детальной диагностики запустите:${NC}" + echo " journalctl -u ai-review.service -n 100" + echo " cd $INSTALL_DIR/backend && source venv/bin/activate && python -m uvicorn app.main:app" + echo "" + echo -e "${YELLOW}Проверьте что:${NC}" + echo " 1. venv создан: ls -la $INSTALL_DIR/backend/venv" + echo " 2. Frontend собран: ls -la $INSTALL_DIR/backend/public" + echo " 3. .env настроен: cat $INSTALL_DIR/backend/.env" exit 1 fi @@ -293,6 +394,11 @@ echo " 1. Отредактировать $INSTALL_DIR/backend/.env" echo " 2. Добавить токены для Git платформ" echo " 3. Настроить firewall (разрешить порт 80/443)" echo "" +echo -e "${YELLOW}📦 Проверка установки:${NC}" +echo " Backend venv: $([ -d $INSTALL_DIR/backend/venv ] && echo '✓' || echo '✗')" +echo " Backend DB: $([ -f $INSTALL_DIR/backend/review.db ] && echo '✓' || echo '⚠️ будет создана')" +echo " Frontend build: $([ -d $INSTALL_DIR/backend/public ] && echo '✓' || echo '✗')" +echo "" echo -e "${GREEN}✨ Готово к работе!${NC}" echo ""