Compare commits

...
2 Commits
4 changed files with 44 additions and 15 deletions
+8 -9
View File
@@ -10,22 +10,21 @@ WORKMODE = "ZILANT"
# Telegram API через internal_relay (retransbot) — обязательно
# Локально: http://127.0.0.1:8081
# Нужна схема http:// или https:// (если без схемы — подставится http://)
# Локально: http://127.0.0.1:5100 или http://192.168.0.109:5100
# Через nginx: https://rbin.aabpro.ru
RELAY_URL = "https://rbin.aabpro.ru"
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"
+4 -1
View File
@@ -13,12 +13,15 @@ from dotenv import load_dotenv
def get_relay_url() -> str:
"""Базовый URL internal_relay без завершающего слэша."""
load_dotenv()
relay = (os.getenv("RELAY_URL") or "").rstrip("/")
relay = (os.getenv("RELAY_URL") or "").strip().rstrip("/")
if not relay:
raise RuntimeError(
"Требуется переменная окружения RELAY_URL "
"(базовый URL internal_relay, например http://127.0.0.1:8081)"
)
# Допускаем host:port без схемы — httpx требует http:// или https://
if "://" not in relay:
relay = f"http://{relay}"
return relay
+8 -3
View File
@@ -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="Бот запущен")
# Настраиваем вебхук
try:
setup_webhook()
except Exception:
exit(1)
# Логируем запуск Flask
logger.info(f"starting Flask")
+23 -1
View File
@@ -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()