All checks were successful
continuous-integration/drone/push Build is passing
- Добавлен обработчик 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 в меню редактирования
414 lines
17 KiB
Makefile
414 lines
17 KiB
Makefile
# 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"
|