Files
new_lottery_bot/Makefile
Andrew K. Choi ec8a23887d
All checks were successful
continuous-integration/drone/push Build is passing
fix: исправлена обработка редактирования розыгрышей
- Добавлен обработчик handle_edit_field для admin_edit_field_{id}_{field} callbacks
- Исправлен toggle_lottery_active - теперь передаёт state вместо None
- Правильный парсинг lottery_id из позиции 3, а не с конца строки
- Обработка 'message is not modified' в bot_controller
- Модифицированы обработчики сообщений для поддержки редактирования
- Добавлен метод update_lottery в LotteryService
- Исправлены ошибки ValueError и AttributeError в меню редактирования
2025-11-22 19:34:30 +09:00

414 lines
17 KiB
Makefile
Raw Permalink 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.

# Makefile для телеграм-бота розыгрышей
# Определяем команду $(DOCKER_COMPOSE) (v2) или docker compose (v1)
DOCKER_COMPOSE := $(shell command -v $(DOCKER_COMPOSE) 2> /dev/null || command -v docker compose 2> /dev/null)
.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 Compose
docker-check:
@echo "<22> Проверка Docker окружения..."
@command -v docker >/dev/null 2>&1 || { echo "❌ Docker не установлен! См. DOCKER_INSTALL.md"; exit 1; }
@echo "✅ Docker: $$(docker --version)"
@if [ -z "$(DOCKER_COMPOSE)" ]; then \
echo "❌ Docker Compose не найден!"; \
echo " Установите: sudo apt install docker compose-plugin"; \
echo " Или см. DOCKER_INSTALL.md"; \
exit 1; \
fi
@echo "✅ Docker Compose: $$($(DOCKER_COMPOSE) version)"
@docker ps >/dev/null 2>&1 || { echo "❌ Docker daemon не запущен!"; echo " Запустите: sudo systemctl start docker"; exit 1; }
@echo "✅ Docker daemon работает"
@echo ""
@echo "🎉 Все проверки пройдены!"
# Сборка Docker образа
docker-build: docker-check
@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"