diff --git a/.env b/.env index a88ebbf..08e59b9 100644 --- a/.env +++ b/.env @@ -16,17 +16,15 @@ WORKMODE = "ZILANT" RELAY_URL = "http://192.168.0.109:5100" # Webhook Responder-bot -# WEBHOOK_URL — адрес, по которому internal_relay доставляет апдейты боту -# (должен быть доступен с машины internal_relay). Не публичный URL для Telegram: -# Telegram ходит на external_relay; setWebhook перехватывается relay. -# WEBHOOK_URL = "http://127.0.0.1:5010/volk_bot" +# WEBHOOK_URL — адрес локальной доставки апдейтов от internal_relay к gunicorn-боту +# (должен быть доступен с машины internal_relay). Не URL для Telegram. +# gunicorn слушает 192.168.0.109:5005 — указываем его напрямую. +# WEBHOOK_URL = "http://192.168.0.109:5010/volk_bot" # WEBHOOK_PORT = 5010 # WEBHOOK_SECRET = "cc0dbc1841660da0b14d7df86ab5e0ed973c" # Webhook Responder-bot -# Пример: бот и relay на одной машине — http://127.0.0.1:5005/testbot -# Или URL через nginx, если internal_relay достучится до него -WEBHOOK_URL = "https://bot.aabpro.ru/testbot" +WEBHOOK_URL = "http://192.168.0.109:5005/testbot" WEBHOOK_PORT = 5005 WEBHOOK_SECRET = "cc0dbc1841660da0b14d7df86ab5e0ed973c" diff --git a/tg_mainbot.py b/tg_mainbot.py index 8374510..9c43301 100644 --- a/tg_mainbot.py +++ b/tg_mainbot.py @@ -1433,13 +1433,15 @@ def handle_callback(call): bot.answer_callback_query(call.id, "Произошла ошибка. Пожалуйста, попробуйте позже.") def setup_webhook(): - """Настройка вебхука""" + """Настройка вебхука через ретранслятор (доставка на WEBHOOK_URL).""" logger.info(f"starting setup_webhook") try: # Удаляем предыдущий вебхук bot.remove_webhook() - # Устанавливаем новый вебхук + # Устанавливаем новый вебхук: + # relay сохранит WEBHOOK_URL как адрес локальной доставки и зарегистрирует + # внешний URL на Telegram (external_relay). bot.set_webhook( url=WEBHOOK_URL, secret_token=WEBHOOK_SECRET, @@ -1457,7 +1459,7 @@ def setup_webhook(): error_msg = f"Ошибка настройка вебхука: {e}" logger.error(error_msg) log_event("error", "system", message=error_msg) - exit(1) + raise RuntimeError(error_msg) from e # Используем путь из WEBHOOK_URL @app.route(WEBHOOK_PATH, methods=['POST']) @@ -1532,7 +1534,10 @@ if __name__ == '__main__': log_event("system", "system", message="Бот запущен") # Настраиваем вебхук - setup_webhook() + try: + setup_webhook() + except Exception: + exit(1) # Логируем запуск Flask logger.info(f"starting Flask") diff --git a/wsgi_bot.py b/wsgi_bot.py index ed8efee..3feab50 100644 --- a/wsgi_bot.py +++ b/wsgi_bot.py @@ -1,4 +1,26 @@ -from tg_mainbot import app # Импортируйте ваше приложение +import fcntl +import os + +from tg_mainbot import app, setup_webhook + + +def _setup_webhook_once(): + """ + Регистрируем webhook один раз при старте gunicorn. + Без этого (__main__ не вызывается) Telegram не шлёт апдейты через relay — + ссылка «Подписка» (/start) молчит. + """ + lock_path = os.path.join(os.getenv("TMPDIR", "/tmp"), "zilant_webhook_setup.lock") + with open(lock_path, "w") as lock_file: + try: + fcntl.flock(lock_file.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB) + except BlockingIOError: + # Другой воркер уже ставит webhook + return + setup_webhook() + + +_setup_webhook_once() if __name__ == "__main__": app.run()