# Makefile для телеграм-бота розыгрышей .PHONY: help install setup setup-postgres init-db run test clean # По умолчанию показываем справку help: @echo "🎲 Телеграм-бот для розыгрышей" @echo "================================" @echo "" @echo "Доступные команды:" @echo " make install - Установка зависимостей" @echo " make setup-postgres- Настройка PostgreSQL БД" @echo " make setup - Первоначальная настройка" @echo " make init-db - Инициализация базы данных" @echo " make run - Запуск бота" @echo " make test - Запуск тестов и примеров" @echo " make migration - Создание миграции" @echo " make migrate - Применение миграций" @echo " make sample - Создание тестового розыгрыша" @echo " make stats - Показать статистику" @echo " make demo-admin - Демонстрация админ-панели" @echo " make test-admin - Тестирование улучшений админки" @echo " make clear-db - ⚠️ УДАЛИТЬ ВСЕ ДАННЫЕ из БД" @echo "" @echo "Быстрый старт с PostgreSQL:" @echo " 1. cp .env.example .env" @echo " 2. Отредактируйте .env файл" @echo " 3. make setup-postgres" @echo " 4. make migrate" @echo " 5. make setup" @echo " 6. make run" # Установка зависимостей install: @echo "📦 Установка зависимостей..." python3 -m venv .venv . .venv/bin/activate && pip install -r requirements.txt # Настройка PostgreSQL базы данных setup-postgres: @echo "🐘 Настройка PostgreSQL базы данных..." ./scripts/setup_postgres.sh # Первоначальная настройка setup: install @echo "🔧 Настройка проекта..." @if [ ! -f .env ]; then \ echo "❌ Файл .env не найден! Скопируйте .env.example в .env"; \ exit 1; \ fi . .venv/bin/activate && python -c "from src.utils.utils import setup_admin_users; import asyncio; asyncio.run(setup_admin_users())" @echo "✅ Настройка завершена!" # Инициализация базы данных init-db: @echo "🗄️ Инициализация базы данных..." . .venv/bin/activate && python -c "from src.core.database import init_db; import asyncio; asyncio.run(init_db())" @echo "✅ База данных инициализирована!" # Проверка подключения к базе данных check-db: @echo "🔍 Проверка подключения к базе данных..." . .venv/bin/activate && python -c "from src.core.database import async_session_maker; import asyncio; asyncio.run(async_session_maker().__aenter__())" @echo "✅ Подключение к базе данных работает!" # Запуск бота run: @echo "🚀 Запуск бота..." . .venv/bin/activate && python main.py # Управление ботом через скрипт (безопасный запуск одного экземпляра) bot-start: @./bot_control.sh start bot-stop: @./bot_control.sh stop bot-restart: @./bot_control.sh restart bot-status: @./bot_control.sh status bot-logs: @./bot_control.sh logs # Создание миграции migration: @echo "📄 Создание новой миграции..." . .venv/bin/activate && alembic revision --autogenerate -m "$(MSG)" # Применение миграций migrate: @echo "⬆️ Применение миграций..." . .venv/bin/activate && alembic upgrade head # Тесты и примеры test: @echo "🧪 Запуск тестов..." . .venv/bin/activate && python scripts/examples.py # Создание тестового розыгрыша sample: @echo "🎲 Создание тестового розыгрыша..." . .venv/bin/activate && python -c "from src.utils.utils import create_sample_lottery; import asyncio; asyncio.run(create_sample_lottery())" # Статистика stats: @echo "📊 Статистика бота..." . .venv/bin/activate && python -c "from src.utils.utils import show_stats; import asyncio; asyncio.run(show_stats())" # Демонстрация админ-панели demo-admin: @echo "🎪 Демонстрация возможностей админ-панели..." . .venv/bin/activate && python src/display/demo_admin.py # Тестирование улучшений админки test-admin: @echo "🧪 Тестирование новых функций админ-панели..." . .venv/bin/activate && python tests/test_admin_improvements.py # ⚠️ ОПАСНО: Полная очистка базы данных clear-db: @echo "⚠️ ВНИМАНИЕ! Это удалит ВСЕ данные из базы данных!" @echo " - Все пользователи" @echo " - Все розыгрыши" @echo " - Все счета" @echo " - Все участия" @echo " - Всех победителей" @echo "" @read -p "Вы уверены? Введите 'yes' для подтверждения: " confirm; \ if [ "$$confirm" = "yes" ]; then \ echo "🗑️ Очистка базы данных..."; \ . .venv/bin/activate && python scripts/clear_database.py; \ else \ echo "❌ Отменено"; \ fi # Очистка clean: @echo "🧹 Очистка временных файлов..." find . -type f -name "*.pyc" -delete find . -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true find . -type f -name "*.log" -delete @echo "✅ Очистка завершена!" # Полная переустановка reset: clean @echo "🔄 Полная переустановка..." rm -f *.db *.sqlite *.sqlite3 rm -rf migrations/versions/*.py make setup # ============================================ # 🐳 Docker команды для продакшн # ============================================ # Показать справку по Docker командам docker-help: @echo "🐳 Docker команды для продакшн-развертывания" @echo "==============================================" @echo "" @echo "Настройка:" @echo " make docker-setup - Первоначальная настройка (создать .env.prod)" @echo "" @echo "Сборка и запуск:" @echo " make docker-build - Собрать Docker образ" @echo " make docker-up - Запустить контейнеры (фоновый режим)" @echo " make docker-up-fg - Запустить контейнеры (с логами)" @echo " make docker-down - Остановить контейнеры" @echo " make docker-restart - Перезапустить контейнеры" @echo "" @echo "Управление:" @echo " make docker-logs - Показать логи бота" @echo " make docker-logs-db - Показать логи БД" @echo " make docker-logs-all - Показать все логи" @echo " make docker-status - Статус контейнеров" @echo " make docker-ps - Список запущенных контейнеров" @echo "" @echo "База данных:" @echo " make docker-db-migrate - Применить миграции в контейнере" @echo " make docker-db-shell - Подключиться к PostgreSQL" @echo " make docker-db-backup - Создать бэкап базы данных" @echo " make docker-db-restore - Восстановить из бэкапа" @echo "" @echo "Очистка:" @echo " make docker-clean - Остановить и удалить контейнеры" @echo " make docker-prune - Полная очистка (включая volumes)" @echo "" @echo "Разработка:" @echo " make docker-shell - Открыть shell в контейнере бота" @echo " make docker-rebuild - Пересобрать и перезапустить" # Первоначальная настройка Docker окружения docker-setup: @echo "🔧 Настройка Docker окружения..." @if [ ! -f .env.prod ]; then \ if [ -f .env.prod.example ]; then \ echo "📄 Создание .env.prod из примера..."; \ cp .env.prod.example .env.prod; \ echo "⚠️ ВНИМАНИЕ: Отредактируйте .env.prod и укажите реальные значения!"; \ echo " - BOT_TOKEN"; \ echo " - POSTGRES_PASSWORD"; \ echo " - DATABASE_URL"; \ echo " - ADMIN_IDS"; \ else \ echo "❌ Файл .env.prod.example не найден!"; \ exit 1; \ fi \ else \ echo "✅ Файл .env.prod уже существует"; \ fi @mkdir -p logs backups @echo "✅ Настройка завершена!" # Сборка Docker образа docker-build: @echo "🔨 Сборка Docker образа..." docker-compose build --no-cache # Запуск контейнеров в фоновом режиме docker-up: @echo "🚀 Запуск контейнеров..." @if [ ! -f .env.prod ]; then \ echo "❌ Файл .env.prod не найден! Запустите 'make docker-setup'"; \ exit 1; \ fi docker-compose --env-file .env.prod up -d @echo "✅ Контейнеры запущены!" @echo "📊 Проверьте статус: make docker-status" @echo "📋 Просмотр логов: make docker-logs" # Запуск контейнеров с выводом логов docker-up-fg: @echo "🚀 Запуск контейнеров с логами..." @if [ ! -f .env.prod ]; then \ echo "❌ Файл .env.prod не найден! Запустите 'make docker-setup'"; \ exit 1; \ fi docker-compose --env-file .env.prod up # Остановка контейнеров docker-down: @echo "🛑 Остановка контейнеров..." docker-compose down @echo "✅ Контейнеры остановлены!" # Перезапуск контейнеров docker-restart: @echo "🔄 Перезапуск контейнеров..." docker-compose restart @echo "✅ Контейнеры перезапущены!" # Просмотр логов бота docker-logs: @echo "📋 Логи бота..." docker-compose logs -f bot # Просмотр логов базы данных docker-logs-db: @echo "📋 Логи базы данных..." docker-compose logs -f db # Просмотр всех логов docker-logs-all: @echo "📋 Все логи..." docker-compose logs -f # Статус контейнеров docker-status: @echo "📊 Статус контейнеров..." @docker-compose ps @echo "" @echo "💾 Использование volumes:" @docker volume ls | grep lottery || echo "Нет volumes" # Список запущенных контейнеров docker-ps: @docker ps --filter "name=lottery" # Применение миграций в контейнере docker-db-migrate: @echo "⬆️ Применение миграций в контейнере..." docker-compose exec bot alembic upgrade head @echo "✅ Миграции применены!" # Подключение к PostgreSQL в контейнере docker-db-shell: @echo "🐘 Подключение к PostgreSQL..." @docker-compose exec db psql -U $${POSTGRES_USER:-lottery_user} -d $${POSTGRES_DB:-lottery_bot_db} # Создание бэкапа базы данных docker-db-backup: @echo "💾 Создание бэкапа базы данных..." @mkdir -p backups @BACKUP_FILE=backups/backup_$$(date +%Y%m%d_%H%M%S).sql; \ docker-compose exec -T db pg_dump -U $${POSTGRES_USER:-lottery_user} $${POSTGRES_DB:-lottery_bot_db} > $$BACKUP_FILE && \ echo "✅ Бэкап создан: $$BACKUP_FILE" # Восстановление из бэкапа docker-db-restore: @echo "⚠️ Восстановление базы данных из бэкапа" @if [ -z "$(BACKUP)" ]; then \ echo "❌ Укажите файл бэкапа: make docker-db-restore BACKUP=backups/backup_20231115_120000.sql"; \ exit 1; \ fi @echo "Восстановление из: $(BACKUP)" @read -p "Это удалит текущие данные! Продолжить? [y/N] " confirm; \ if [ "$$confirm" = "y" ] || [ "$$confirm" = "Y" ]; then \ cat $(BACKUP) | docker-compose exec -T db psql -U $${POSTGRES_USER:-lottery_user} $${POSTGRES_DB:-lottery_bot_db}; \ echo "✅ База данных восстановлена!"; \ else \ echo "❌ Отменено"; \ fi # Открыть shell в контейнере бота docker-shell: @echo "🐚 Открытие shell в контейнере бота..." docker-compose exec bot /bin/bash # Остановка и удаление контейнеров docker-clean: @echo "🧹 Очистка контейнеров..." docker-compose down --remove-orphans @echo "✅ Контейнеры удалены!" # Полная очистка (включая volumes) docker-prune: @echo "⚠️ ВНИМАНИЕ! Это удалит ВСЕ данные Docker (включая БД)!" @read -p "Продолжить? [y/N] " confirm; \ if [ "$$confirm" = "y" ] || [ "$$confirm" = "Y" ]; then \ echo "🗑️ Полная очистка..."; \ docker-compose down -v --remove-orphans; \ docker system prune -f; \ echo "✅ Очистка завершена!"; \ else \ echo "❌ Отменено"; \ fi # Пересборка и перезапуск docker-rebuild: @echo "🔄 Пересборка и перезапуск..." docker-compose down docker-compose build --no-cache docker-compose --env-file .env.prod up -d @echo "✅ Готово!" @make docker-logs # Быстрое развертывание с нуля docker-deploy: @echo "🚀 Полное развертывание в продакшн с внешней БД..." @make docker-setup @echo "" @echo "⚠️ Перед продолжением:" @echo " 1. Настройте внешний PostgreSQL (см. EXTERNAL_DB_SETUP.md)" @echo " 2. Отредактируйте .env.prod с параметрами внешней БД" @echo "" @read -p "Продолжить развертывание? [y/N] " confirm; \ if [ "$$confirm" = "y" ] || [ "$$confirm" = "Y" ]; then \ make docker-build; \ make docker-up; \ sleep 5; \ make docker-db-migrate; \ echo ""; \ echo "✅ Развертывание завершено!"; \ echo "📊 Статус:"; \ make docker-status; \ else \ echo "❌ Отменено"; \ fi # Проверка подключения к внешней БД docker-test-db: @echo "🔍 Проверка подключения к БД..." @docker exec -it lottery_bot python -c "\ from src.core.database import engine; \ import asyncio; \ print('✅ Подключение успешно!'); \ asyncio.run(engine.dispose())" || echo "❌ Ошибка подключения!" # Информация о настройке внешней БД docker-external-db-help: @echo "📖 Настройка внешнего PostgreSQL" @echo "==================================" @echo "" @echo "Полная документация: EXTERNAL_DB_SETUP.md" @echo "" @echo "Быстрый старт:" @echo " 1. Создайте БД на внешнем сервере" @echo " 2. Отредактируйте .env.prod:" @echo " DATABASE_URL=postgresql+asyncpg://user:pass@host:5432/db" @echo " 3. make docker-deploy" @echo "" @echo "Проверить подключение:" @echo " make docker-test-db"