Some checks failed
continuous-integration/drone/pr Build is failing
- Implemented two-level admin hierarchy (super admin from .env and assigned admins) - Only super admins (from ADMIN_IDS in .env) can manage admin assignments - Added admin management menu to settings (visible only for super admins) - Admins can add/remove other admins through the bot interface - Protected super admins from deletion - Added CLI tool for admin management (scripts/manage_admins.py) - Added database check script (scripts/check_db.py) - Added deployment scripts for server setup - Added comprehensive documentation on admin management system - Added backup and server deployment guides
173 lines
5.1 KiB
Bash
173 lines
5.1 KiB
Bash
#!/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 "Развертывание завершено!"
|