Причина аварии 18.09.2026 (разобрана замерами по логам и нагрузкой):
MAX доставляет один и тот же update повторно, каждый повтор запускал новый поток
runserver, а поток держал своё соединение к MySQL на всё время запроса — отсюда
117 одновременных соединений от одного процесса и 1040 Too many connections у
общего сервера БД. Залп запускался тем, что бот не мог ответить: user_query из
callback'а с числовым data уходил в Yandex как content-число, Yandex отвечал
400 'failed to parse request JSON', сообщение оставалось в истории сессии и ломало
все последующие вызовы этой сессии.
- max_bot/max_api.py: таймаут (3.05, 15) на все 12 вызовов MAX API и обёртка
_max_request — таймаут даёт success=False, а не исключение (иначе вебхук отвечает
500 и провоцирует повторную доставку).
- ai_agent/api_yandex_ai.py: таймаут 20 с и max_retries=0; приведение user_query
к строке; откат неудачной попытки из истории; окно истории 20 сообщений;
лимит 500 сессий в памяти процесса.
- ai_agent/api_common.py: user_query приводится к строке на входе во все AI-агенты.
- max_bot/views.py: дедупликация вебхука по идентификатору update (TTL 300 с,
cache.add) и семафор на 12 одновременных обработок — лишние получают быстрый 200.
Проверено: юнит active, авторелоад, 0 новых ERROR за 3 часа, счётчик 1040 не вырос,
пик соединений процесса упал со 117 до 2, два живых числовых запроса из прода
получили нормальные ответы вместо ошибки.
- Добавлены og:title, og:description, og:image, og:url и Twitter Card в landing.html.
- Реализованы normalize_logo_url и build_landing_meta для абсолютных HTTPS-ссылок на логотип.
- landing_page передаёт meta-данные и единый logo_url в шаблон.
- Добавлены тесты нормализации логотипа и проверки OG-тегов.
- Добавлен content_bot/landing_utils.py: получение ссылок MAX и Telegram из lk_integration по slug партнёра, нормализация URL и автоисправление записей в БД.
- landing_page больше не берёт Telegram из настроек max_bot; удалён устаревший fallback на url_telegram.
- Добавлены тесты нормализации URL и формирования кнопок лендинга.
✅ Обновлён: content_bot/urls.py — Добавлен URL-маршрут для минилендинга с параметром client_id
✅ Создан: templates/max_bot/landing.html — Создан шаблон минилендинга с логотипом, названием, описанием и двумя кнопками с иконками Font Awesome
✅ Обновлён: restoran_max_bot/promo_handlers.py — Изменено сохранение QR-кодов в MEDIA_ROOT и формирование ссылок через MEDIA_URL.
✅ Обновлён: restoran_max_bot/command_handlers.py — Изменено сохранение QR-кодов для бонусов в MEDIA_ROOT и формирование ссылок через MEDIA_URL.
✅ Обновлён: restoran_max_bot/urls.py — Добавлена поддержка обслуживания медиафайлов через Django при DEBUG=True.
✅ Обновлён: restoran_max_bot/promo_handlers.py — Изменено сохранение QR-кодов в MEDIA_ROOT и формирование ссылок через MEDIA_URL.
✅ Обновлён: restoran_max_bot/command_handlers.py — Изменено сохранение QR-кодов для бонусов в MEDIA_ROOT и формирование ссылок через MEDIA_URL.
✅ Обновлён: restoran_max_bot/urls.py — Добавлена поддержка обслуживания медиафайлов через Django при DEBUG=True.
✅ Обновлён: restoran_max_bot/promo_handlers.py — Изменено сохранение QR-кодов в MEDIA_ROOT и формирование ссылок через MEDIA_URL.
✅ Обновлён: restoran_max_bot/command_handlers.py — Изменено сохранение QR-кодов для бонусов в MEDIA_ROOT и формирование ссылок через MEDIA_URL.
✅ Обновлён: restoran_max_bot/urls.py — Добавлена поддержка обслуживания медиафайлов через Django при DEBUG=True.
В bot_promo добавлен вывод в консоль сформированных ссылок (статус-ссылка и QR-картинка) для отладки. Также улучшена обработка ошибок через логирование.