#!/bin/bash # Скрипт развертывания lottery_bot на сервере # Использование: ./deploy_server.sh set -e echo "🔧 ============================================" echo "🔧 Развертывание Lottery Bot на сервер" echo "🔧 ============================================" echo "" # Цвета для вывода GREEN='\033[0;32m' YELLOW='\033[1;33m' RED='\033[0;31m' NC='\033[0m' # No Color # Функция для вывода сообщений log_info() { echo -e "${GREEN}✅ $1${NC}" } log_warn() { echo -e "${YELLOW}⚠️ $1${NC}" } log_error() { echo -e "${RED}❌ $1${NC}" } # Проверка переменных окружения if [ -z "$DATABASE_URL" ]; then log_error "DATABASE_URL не установлен в .env" echo "Пример: export DATABASE_URL='postgresql://user:password@host:5432/lottery_bot'" exit 1 fi if [ -z "$BOT_TOKEN" ]; then log_error "BOT_TOKEN не установлен в .env" exit 1 fi log_info "Переменные окружения проверены" # 1. Проверка зависимостей echo "" echo "📦 Проверка зависимостей..." if ! command -v python3 &> /dev/null; then log_error "Python 3 не установлен" exit 1 fi log_info "Python 3 найден: $(python3 --version)" if ! command -v pip3 &> /dev/null; then log_error "pip3 не установлен" exit 1 fi log_info "pip3 установлен" # 2. Создание виртуального окружения echo "" echo "🐍 Подготовка виртуального окружения..." if [ ! -d "venv" ]; then log_info "Создание виртуального окружения..." python3 -m venv venv else log_warn "Виртуальное окружение уже существует" fi # Активируем виртуальное окружение source venv/bin/activate log_info "Виртуальное окружение активировано" # 3. Установка зависимостей echo "" echo "📚 Установка зависимостей из requirements.txt..." if [ -f "requirements.txt" ]; then pip3 install --upgrade pip setuptools wheel -q pip3 install -r requirements.txt -q log_info "Зависимости установлены" else log_error "requirements.txt не найден" exit 1 fi # 4. Проверка подключения к БД echo "" echo "🗄️ Проверка подключения к базе данных..." python3 << 'EOF' import asyncio from src.core.database import async_session_maker from sqlalchemy import text async def test_db(): try: async with async_session_maker() as session: result = await session.execute(text("SELECT 1")) print("✅ Подключение к БД успешно") return True except Exception as e: print(f"❌ Ошибка подключения: {e}") return False if not asyncio.run(test_db()): exit(1) EOF if [ $? -ne 0 ]; then log_error "Не удалось подключиться к базе данных" exit 1 fi # 5. Запуск миграций echo "" echo "📝 Запуск миграций базы данных..." if command -v alembic &> /dev/null; then log_info "Alembic найден, запуск миграций..." alembic upgrade head log_info "Миграции завершены" else log_warn "Alembic не найден, пропуск миграций Alembic" # Используем встроенный скрипт инициализации if [ -f "scripts/db_setup.py" ]; then log_info "Использование скрипта инициализации БД..." python3 scripts/db_setup.py log_info "БД инициализирована" fi fi # 6. Проверка конфигурации echo "" echo "⚙️ Проверка конфигурации..." python3 << 'EOF' from src.core.config import BOT_TOKEN, DATABASE_URL, ADMIN_IDS print(f"✅ BOT_TOKEN загружен") print(f"✅ DATABASE_URL: {DATABASE_URL[:50]}...") print(f"✅ ADMIN_IDS: {ADMIN_IDS if ADMIN_IDS else 'Не установлены'}") EOF log_info "Конфигурация проверена" # 7. Информация о запуске echo "" echo "🚀 ============================================" echo "🚀 Приложение готово к запуску" echo "🚀 ============================================" echo "" echo "📋 Команды для запуска:" echo "" echo "Режим разработки:" echo " python3 main.py" echo "" echo "Производство (с systemd):" echo " sudo systemctl start lottery-bot" echo " sudo systemctl enable lottery-bot" echo "" echo "Docker:" echo " docker-compose up -d" echo "" echo "⚙️ Переменные окружения:" echo " DATABASE_URL: $(echo $DATABASE_URL | cut -c1-50)..." echo " BOT_TOKEN: $(echo $BOT_TOKEN | cut -c1-20)...${BOT_TOKEN: -5}" echo "" log_info "Развертывание завершено!"