Files
bottohelp/run_production.py
T

109 lines
3.8 KiB
Python

#!/usr/bin/env python3
"""
Скрипт запуска телеграм-бота в продакшен среде.
Обеспечивает надежный запуск с обработкой ошибок и логированием.
"""
import sys
import os
import logging
import io
from datetime import datetime
# Исправляем кодировку для Windows
if os.name == 'nt':
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')
# Добавляем текущую директорию в путь
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
# Загружаем переменные окружения из .env файла
from dotenv import load_dotenv
load_dotenv()
from core.application import Application
def setup_logging():
"""Настройка системы логирования"""
log_format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
logging.basicConfig(
format=log_format,
level=logging.INFO,
handlers=[
logging.FileHandler(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'logs', 'bot.log'), encoding='utf-8'),
logging.StreamHandler(sys.stdout)
]
)
# Отключаем логи от библиотек
logging.getLogger('telegram').setLevel(logging.WARNING)
logging.getLogger('httpx').setLevel(logging.WARNING)
def check_environment():
"""Проверка окружения перед запуском"""
print("🔍 Проверка окружения...")
# Проверяем токен бота
token = os.getenv('BOT_TOKEN')
if not token:
print("❌ BOT_TOKEN не найден в переменных окружения!")
print("💡 Добавьте BOT_TOKEN в файл .env или переменные окружения")
return False
print(f"✅ BOT_TOKEN найден (длина: {len(token)})")
# Проверяем API ключи (опционально)
api_keys = ['OPENWEATHER_API_KEY', 'NEWS_API_KEY', 'OPENAI_API_KEY']
for key in api_keys:
value = os.getenv(key)
if value:
print(f"✅ {key} найден")
else:
print(f"⚠️ {key} не найден (функция будет ограничена)")
return True
def main():
"""Основная функция запуска"""
print("🚀 Запуск телеграм-бота в продакшен среде")
print(f"🕐 Время запуска: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
# Настраиваем логирование
setup_logging()
# Проверяем окружение
if not check_environment():
print("❌ Проверка окружения провалилась!")
sys.exit(1)
try:
# Создаем приложение
print("🏗️ Инициализация приложения...")
app = Application("config_prod.py")
# Показываем статус
status = app.get_status()
print("✅ Приложение инициализировано успешно!")
print(f"📊 Статус: {status}")
# Запускаем бота
print("🎯 Запуск бота...")
app.run()
except KeyboardInterrupt:
print("\n👋 Получен сигнал остановки (Ctrl+C)")
print("🛑 Остановка бота...")
except Exception as e:
print(f"❌ Критическая ошибка: {e}")
logging.critical(f"Критическая ошибка при запуске бота: {e}", exc_info=True)
sys.exit(1)
finally:
print("🏁 Процесс завершен")
if __name__ == '__main__':
main()