Бот на Bothost в статусе running, а в Telegram или Discord тишина. Ниже разбор по тексту ошибки в логах: два разных Conflict, Unauthorized, aiogram, который молчит без исключения, и Discord, который серый в списке участников.

Для людей и ИИ. Каноническая страница: https://bothost.ru/docs/bot-not-responding · Markdown: https://bothost.ru/docs/bot-not-responding.md · Индекс: https://bothost.ru/llms.txt
Отвечает на запросы: Telegram bot stopped working, bot doesn't respond, Conflict: terminated by other getUpdates request, can't use getUpdates method while webhook is active, aiogram bot doesn't respond, bot token invalid, Unauthorized, Discord bot offline, close code 4004, 4014.
Если контейнер в статусе restarting или exited, откройте падение после деплоя. Если webhook уже установлен и в getWebhookInfo есть last_error_message, откройте ошибки webhook.

С чего начать

Откройте карточку бота в панели Bothost и посмотрите две вещи: статус контейнера и логи работы (не логи сборки).
Статус и строка в логеКуда идти
running, в логе нет ошибок, в мессенджере тишинаРаздел про aiogram ниже или webhook
Conflict: terminated by other getUpdates requestДва процесса читают один токен
Conflict: can't use getUpdates method while webhook is activeНа токене висит webhook, а код запустил polling
Unauthorized или 401Токен не принимается Telegram или Discord
restarting, exited, traceback на стартеПадение после деплоя
Discord серый, в логе 4004 или 4014Раздел Discord ниже
Too Many Requests / 429 или TimeoutError при живом процессеПамять, таймауты и лимиты
Платформа кладёт токен из панели в переменные окружения. Для Telegram это BOT_TOKEN, API_TOKEN и TELEGRAM_BOT_TOKEN (одно и то же значение). Для Discord это DISCORD_BOT_TOKEN. Код должен читать именно эти имена, а не файл .env с компьютера: в Git его обычно нет, в контейнер он не попадает. Список переменных: переменные окружения. Проверка токена Telegram в браузере (подставьте значение из панели, без слова bot в начале):
https://api.telegram.org/bot<ТОКЕН>/getMe
Ответ {"ok":true,...} значит, что токен живой. {"ok":false,"error_code":401,"description":"Unauthorized"} значит, что строка токена неверная.

Conflict: terminated by other getUpdates request

Как выглядит

В логах работы снова и снова:
Conflict: terminated by other getUpdates request; make sure that only one bot instance is running
Контейнер при этом часто остаётся running. Бот то отвечает, то замолкает, потому что Telegram на каждый новый getUpdates обрывает предыдущий.

Почему так на Bothost

Long polling (getUpdates) у одного токена может держать только один клиент. Второй клиент с тем же токеном получает Conflict, и оба начинают переподключаться. Обычные источники второго клиента:
    • Тот же бот всё ещё запущен на компьютере, в IDE, в screen или в другом Docker.
    • На Bothost два бота (или старый контейнер и новый после деплоя) с одним и тем же токеном.
    • Рестарт совпал со старым процессом: новый уже вызвал getUpdates, предыдущий ещё не вышел.
    • Где-то ещё крутится копия: второй хостинг, скрипт на VPS, тестовый процесс коллеги.
Webhook тут ни при чём. Если в тексте есть while webhook is active, это следующий раздел.

Что сделать

    • Остановите локальный процесс. Закройте терминал, где запущен python bot.py или node index.js.
    • В панели Bothost оставьте один бот с этим токеном. Второй удалите или смените ему токен в BotFather и в панели.
    • Нажмите остановку, подождите, пока статус станет остановленным, затем запустите снова. Так старый процесс успевает отпустить getUpdates.
    • Откройте https://api.telegram.org/bot<ТОКЕН>/getWebhookInfo. Поле url должно быть пустым "", если бот работает через polling. Если url заполнен, смотрите следующий раздел: polling и webhook на одном токене мешают друг другу.
Отдельно библиотеку обновлять не нужно. Когда второй клиент исчез, Conflict пропадает за один-два цикла переподключения.

Conflict: can't use getUpdates method while webhook is active

Как выглядит

Conflict: can't use getUpdates method while webhook is active; use deleteWebhook to delete the webhook first

Почему так

На токене уже вызван setWebhook. Telegram перестаёт отдавать апдейты через getUpdates и шлёт их HTTP-запросом на сохранённый URL. Код на Bothost при этом вызывает start_polling / getUpdates. Так бывает, если раньше бот работал через webhook (на своём сервере или на Bothost с доменом), а теперь запущен как polling, и webhook никто не снял. В aiogram 3 Dispatcher.start_polling сам вызывает delete_webhook перед циклом. Если ошибка всё равно есть, второй процесс снова делает setWebhook, либо используется библиотека, которая webhook не снимает (старый python-telegram-bot без drop_pending_updates / явного delete_webhook, самописный цикл getUpdates). Платформа Bothost сама setWebhook в Telegram не вызывает. Она только передаёт в контейнер переменную WEBHOOK_URL вида https://ваш-домен/webhook, если у бота включён домен. Если код при старте читает WEBHOOK_URL и регистрирует webhook, а процесс одновременно уходит в polling, получается эта ошибка.

Что сделать

Выберите один режим и оставьте его. Polling (бесплатный тариф, бот без своего HTTP-сервера):
https://api.telegram.org/bot<ТОКЕН>/deleteWebhook
В ответе должно быть {"ok":true,"result":true,"description":"Webhook is already deleted"} или Webhook was deleted. После этого перезапустите бота в панели. В коде не вызывайте set_webhook на старте. Webhook: уберите start_polling / цикл getUpdates и примите POST на свой URL. Разбор 404, SSL и пустого last_error_message: Webhook Telegram не работает.

Unauthorized: bot token invalid

Как выглядит

Unauthorized
aiogram.exceptions.TelegramUnauthorizedError: Telegram server says - Unauthorized
getMe возвращает error_code 401. В Discord тот же смысл у закрытия шлюза с кодом 4004.

Почему токен «тот же», а API его отвергает

В переменную должен попасть токен вида 123456789:AAH... без кавычек, пробелов и без префикса bot. Префикс bot уже есть в URL метода (/bot<ТОКЕН>/getMe). Строка bot123456:AAH... даёт 401. Другие частые причины на Bothost:
  • Токен перевыпустили в BotFather (или в Discord Developer Portal), а в панели осталось старое значение. Новый деплой кода токен в панели не обновляет.
  • Код читает os.getenv("TOKEN"), os.getenv("TG_TOKEN") или config.BOT_TOKEN из репозитория, а панель заполняет BOT_TOKEN. Переменная есть, код смотрит в другое имя и получает None, затем падает или шлёт пустой токен.
  • В значение в панели попали кавычки из .env ("123:ABC" вместе с кавычками) или перевод строки в конце при копировании.
  • Токен от другого бота: в BotFather несколько ботов, в панель вставлен не тот.

Что сделать

    • В BotFather откройте нужного бота и при необходимости выполните /revoke, затем скопируйте новую строку целиком.
    • В настройках бота на Bothost замените токен и перезапустите контейнер.
    • В коде читайте переменную платформы и обрезайте пробелы:
import os
from aiogram import Bot, Dispatcher

token = os.environ["BOT_TOKEN"].strip()
bot = Bot(token)
dp = Dispatcher()
Для node-telegram-bot-api и telegraf то же самое: process.env.BOT_TOKEN.
    • Снова откройте getMe. Пока там 401, смотреть хендлеры и webhook бессмысленно: Telegram не примет ни один метод.

aiogram bot doesn't respond

Контейнер running, в логе нет Conflict и Unauthorized, сообщения в чат уходят в пустоту. Проверьте по порядку. Режим получения апдейтов. Если в getWebhookInfo поле url непустое, polling апдейты не получит (см. Conflict выше). Если url пустой и в логе есть Run polling for bot @name, процесс ждёт getUpdates. Напишите боту в личку и посмотрите, появилась ли в логе строка обработки. Тишины в логе на ваше сообщение значит, что апдейт до процесса не дошёл: другой клиент забрал его раньше, либо бот заблокирован, либо вы пишете не тому @username (getMe показывает поле username). Фильтры уже, чем сообщения. Хендлер на CommandStart молчит на текст без /start. Фильтр F.chat.type == "private" молчит в группе. В start_polling(..., allowed_updates=[...]) нет "message", и такие апдейты библиотека не получает. На время проверки оставьте один хендлер без фильтра и убедитесь, что он пишет в лог update_id. Исключение внутри хендлера. aiogram пишет traceback в лог и не показывает его пользователю. Бот «не отвечает», хотя апдейт пришёл. Ищите в логах работы Cause exception while process update и чините строку из traceback. Пустой BOT_TOKEN сюда не относится: процесс тогда не доходит до polling и падает на старте, см. падение после деплоя. Ответ уходит не в тот чат или метод запрещён. bot was blocked by the user и chat not found появляются в момент send_message, а не в момент входящего сообщения. Для группы бот должен быть участником и иметь право писать. Минимальный рабочий каркас под Bothost (aiogram 3, polling, токен из панели):
import asyncio
import logging
import os

from aiogram import Bot, Dispatcher
from aiogram.types import Message

logging.basicConfig(level=logging.INFO)
dp = Dispatcher()

@dp.message()
async def echo(message: Message) -> None:
    logging.info("update chat_id=%s text=%s", message.chat.id, message.text)
    await message.answer("ok")

async def main() -> None:
    bot = Bot(os.environ["BOT_TOKEN"].strip())
    await dp.start_polling(bot)

if __name__ == "__main__":
    asyncio.run(main())
start_polling в aiogram 3 перед циклом снимает webhook. Если рядом в коде есть set_webhook, оставьте что-то одно.

Discord bot offline

В списке участников бот серый, хотя контейнер на Bothost running. Шлюз Discord (Gateway) для одного токена держит одну сессию. Второй клиент с тем же токеном выталкивает первый: бот мигает онлайн и снова становится offline. Остановите локальный процесс и второй деплой с этим токеном, как в разделе про getUpdates. Дальше смотрите код закрытия соединения в логе.
КодСмыслЧто сделать
4004 Authentication failedТокен не принятВставьте токен из Developer Portal в поле бота на Bothost. Код читает DISCORD_BOT_TOKEN. Без префикса Bot , без кавычек. После Reset Token обновите значение в панели и перезапустите контейнер
4014 Disallowed intentВ коде запрошены privileged intents, которые выключены в портале, или наоборотВ портале приложения, Bot, Privileged Gateway Intents включите Message Content, если бот читает текст сообщений. В коде передайте те же intents, которые включены в портале
4008 Rate limitedШлюз закрыли из-за частых IdentifyУберите цикл немедленного реконнекта. Подождите и запустите один процесс. Подробнее: лимиты API
4005 Already authenticatedПовторный Identify в том же соединенииОдин клиент на токен, без второго client.login в том же процессе
Бот онлайн на шлюзе и при этом «не видит» сервер, если приглашение собрано без scope bot. Ссылка приглашения должна запрашивать scope bot и нужные права. Шлюз при этом в логе выглядит здоровым: гильдий просто нет. Каркас на discord.py, токен с Bothost:
import os
import discord

intents = discord.Intents.default()
intents.message_content = True  # тот же флаг включите в Developer Portal
client = discord.Client(intents=intents)

@client.event
async def on_ready():
    print(f"logged in as {client.user}")

@client.event
async def on_message(message: discord.Message):
    if message.author == client.user:
        return
    if message.content == "ping":
        await message.channel.send("pong")

client.run(os.environ["DISCORD_BOT_TOKEN"].strip())

Telegram bot stopped working

Бот отвечал и перестал. Контейнер при этом либо остался running, либо ушёл в перезапуск.
    • Логи работы за момент, когда перестал отвечать. Conflict, 401, traceback, Killed, 429 указывают на свой раздел этой статьи или соседних мануалов.
    • getMe и getWebhookInfo тем токеном, который сейчас в панели. Токен могли перевыпустить. Webhook мог остаться на старом домене после смены адреса на Bothost: Telegram продолжает слать апдейты на прежний URL, а polling их уже не видит.
    • Один токен на один процесс. Локальная копия, которую вы открыли «просто посмотреть», забирает апдейты у сервера.
    • Если статус restarting, бот падает на старте или его убивает лимит памяти. Это деплой и память, а не молчащий хендлер.

См. также

Не нашли свою строку в логе? Напишите в поддержку и приложите её целиком: @bothostru.