11 октября 2026 г.
Бот запускается и сразу падает: как найти причину в логе
Бота запустили на сервере, через секунду он остановился. На хостинге статус «упал» или «exited», systemd пишет status=1/FAILURE, а сам бот молчит. Причина почти всегда уже написана — в последних строках лога. Ниже как её найти и что значат самые частые варианты.
Где смотреть лог
- запускали руками в терминале — ошибка прямо там, над приглашением командной строки;
- systemd —
journalctl -u имя-сервиса -n 50; - Docker —
docker logs имя-контейнера --tail 50; - хостинг или панель — вкладка «Логи» у бота.
Как читать traceback: снизу вверх
Python при падении печатает «трейсбек» — путь, по которому шла программа до ошибки. Пример:
Traceback (most recent call last):
File "/app/bot.py", line 3, in <module>
from config import TOKEN
File "/app/config.py", line 2, in <module>
TOKEN = os.environ["BOT_TOKEN"]
File "<frozen os>", line 714, in __getitem__
KeyError: 'BOT_TOKEN'- Самая последняя строка — это и есть ошибка. Здесь
KeyError: 'BOT_TOKEN': переменной окружения BOT_TOKEN нет. - Чуть выше — последнее место в вашем коде, где это произошло:
config.py, строка 2. Строки из библиотек и<frozen …>пропускайте, они почти никогда не виноваты. - Всё, что выше, — как программа туда пришла. Обычно это читать не нужно.
Если трейсбеков несколько, нужен последний, а не первый. Строка с ошибкой — то, что стоит копировать в поиск.
Частые причины и где про них подробно
ModuleNotFoundError: No module named …— библиотека не установлена: её нет в requirements.txt. Разбор.ImportError: cannot import name 'executor'— код под aiogram 2, а стоит aiogram 3. Разбор.Unauthorized,TokenValidationError,KeyError: 'BOT_TOKEN'— токен не передан или неверный. Разбор.can't open file … No such file or directory— запускается не тот файл или его нет в репозитории. Разбор.unable to open database file,Read-only file system— бот пишет файл туда, куда писать нельзя. Разбор.Conflict: terminated by other getUpdates request— тот же бот запущен где-то ещё. Разбор.- Таймауты и
Cannot connect to host api.telegram.org— проблема сети до Telegram, частая на серверах в России. Разбор.
Ошибки нет, а бот всё равно остановился
Если лог пустой или в нём только ваши print, вариантов немного:
- Программа просто дошла до конца: нет строки запуска опроса (
start_polling,infinity_polling,run_polling) или она внутриif __name__ == "__main__":с опечаткой. - Запускается не тот файл: например,
main.py, в котором только функции, а запуск — вbot.py. - В логе одно слово
Killedили код выхода 137 — процесс убили за превышение памяти. Обычно это большая библиотека или загрузка всего файла в память разом. - Вывод не успел попасть в лог: Python буферизует
print. Запустите сpython -u bot.pyили переменнойPYTHONUNBUFFERED=1, и ошибка станет видна.
Повторите падение у себя
Сервер отличается от вашего компьютера тремя вещами. Воспроизведите их — и ошибка появится локально:
python -m venv /tmp/check && source /tmp/check/bin/activate pip install -r requirements.txt # только то, что в файле export BOT_TOKEN=123456:ABC... # те же переменные, что на сервере python bot.py # из корня репозитория, как на сервере
Чистое окружение ловит забытые библиотеки, явные переменные — забытый .env (он обычно не попадает в git), запуск из корня — неправильные относительные пути.
Или пусть разберёт за вас
Вставьте лог в нашу бесплатную проверку ошибок бота: она узнаёт частые ошибки и говорит, что исправить. А если бот работает на botdepo, то же самое показывается само — рядом с логом упавшего деплоя, и падение после запуска приходит уведомлением в Telegram. Задеплоить бота.
Частые вопросы
Локально работает, на сервере нет. Почему?
В 9 случаях из 10 — библиотека, которой нет в requirements.txt, или переменная из .env, которой нет на сервере. Проверка в чистом окружении выше ловит обе.
Бот упал через несколько часов, а не сразу. Это то же самое?
Искать так же — по последней строке лога. Но причины чаще другие: сеть до Telegram, необработанное исключение в одном хендлере, нехватка памяти. Нужен автоматический перезапуск, чтобы бот не лежал до утра.