← Все статьи
Полезные статьи

Telegram-бот 24/7 на своём сервере

Как запустить Telegram-бота на VPS: установка Python, автозапуск через systemd, перезапуск после сбоев, логи и обновление кода без простоя.

Бот, запущенный на домашнем компьютере, живёт ровно до перезагрузки или отключения интернета. Чтобы он работал круглосуточно, его переносят на сервер.

В инструкции — весь путь: от заказа VPS до автозапуска, который поднимает бота после сбоя и перезагрузки. Разбираем на Python, но принцип тот же для Node.js и любого другого языка.

Что понадобится

Сервер. Боту почти не нужны ресурсы: даже с базой на десятки тысяч пользователей он занимает десятки мегабайт памяти. Хватает тарифа «Старт» — 1 ядро, 2 ГБ, 10 ГБ NVMe, 5 € в месяц.

Больше ресурсов нужно, если бот обрабатывает медиа: конвертирует видео, генерирует изображения, обращается к нейросетям. Тогда смотрите в сторону тарифа «Оптимальный» — 4 ядра и 8 ГБ.

Код бота. Готовый проект на вашем компьютере или в репозитории.

Токен бота от @BotFather.

Как подобрать конфигурацию под другие задачи — разбирали отдельно: Какой VPS выбрать.

Шаг 1. Подключиться к серверу

При заказе выберите Ubuntu 24.04. После оплаты сервер создаётся за 30 секунд, данные придут на почту.

ssh root@ВАШ_IP

Подробно про подключение с разных систем: Как подключиться к VPS по SSH.

Шаг 2. Подготовить окружение

Обновите систему и поставьте Python с инструментами:

apt update && apt upgrade -y
apt install python3 python3-pip python3-venv git -y

Создайте папку для бота:

mkdir -p /opt/bot && cd /opt/bot

Шаг 3. Загрузить код на сервер

Через Git — если проект в репозитории:

git clone https://github.com/ваш-аккаунт/ваш-бот.git .

Через scp — если код только на компьютере. Команда выполняется на вашем компьютере, а не на сервере:

scp -r C:\путь\к\проекту\* root@ВАШ_IP:/opt/bot/

Шаг 4. Установить зависимости в отдельном окружении

Виртуальное окружение изолирует библиотеки бота от системных. Это избавляет от конфликтов версий, когда на сервере появится второй проект:

cd /opt/bot
python3 -m venv venv
./venv/bin/pip install -r requirements.txt

Если файла requirements.txt нет, установите библиотеки вручную. Например для aiogram:

./venv/bin/pip install aiogram

Шаг 5. Спрятать токен в переменные окружения

Держать токен прямо в коде — плохая идея: он утечёт при первом же коммите в публичный репозиторий. Создайте файл с секретами:

nano /opt/bot/.env
BOT_TOKEN=ваш_токен_от_botfather

Закройте файл от посторонних:

chmod 600 /opt/bot/.env

В коде читайте токен из окружения:

import os
TOKEN = os.environ["BOT_TOKEN"]

Шаг 6. Проверить запуск вручную

Перед настройкой автозапуска убедитесь, что бот вообще стартует:

cd /opt/bot
set -a && source .env && set +a
./venv/bin/python bot.py

Напишите боту в Telegram. Если отвечает — всё в порядке, останавливайте сочетанием Ctrl + C и идите дальше.

Шаг 7. Настроить автозапуск через systemd

Если просто запустить бота командой, он остановится при отключении от SSH. Systemd решает сразу три задачи: держит бота в фоне, поднимает после сбоя и запускает после перезагрузки сервера.

Создайте файл службы:

nano /etc/systemd/system/bot.service

Вставьте:

[Unit]
Description=Telegram Bot
After=network.target

[Service]
WorkingDirectory=/opt/bot
EnvironmentFile=/opt/bot/.env
ExecStart=/opt/bot/venv/bin/python /opt/bot/bot.py
Restart=always
RestartSec=5
User=root

[Install]
WantedBy=multi-user.target

Ключевые строки здесь — Restart=always и RestartSec=5: если бот упадёт с ошибкой, systemd поднимет его через пять секунд. Именно это и обеспечивает работу 24/7.

Включите службу:

systemctl daemon-reload
systemctl enable --now bot

Проверьте состояние:

systemctl status bot

Строка active (running) означает, что бот работает.

Шаг 8. Смотреть логи

Весь вывод бота уходит в журнал systemd.

Последние 50 строк:

journalctl -u bot -n 50

Следить в реальном времени:

journalctl -u bot -f

Только ошибки за сегодня:

journalctl -u bot -p err --since today

Как обновлять код

Когда бот уже работает, обновление занимает три команды:

cd /opt/bot
git pull
systemctl restart bot

Перезапуск занимает доли секунды, пользователи этого не замечают.

Если добавились новые библиотеки:

./venv/bin/pip install -r requirements.txt
systemctl restart bot

Несколько ботов на одном сервере

На одной машине спокойно живут несколько ботов — каждому своя папка и своя служба:

/opt/bot-first/    → bot-first.service
/opt/bot-second/   → bot-second.service

Создаёте второй файл службы по тому же шаблону, меняя пути и название. Управление раздельное:

systemctl restart bot-first
systemctl stop bot-second

Тарифа «Старт» хватает на 3–5 небольших ботов. Если каждый работает с базой данных или обрабатывает медиа, берите конфигурацию выше.

Бот на Node.js

Принцип тот же, отличаются только команды установки.

curl -fsSL https://deb.nodesource.com/setup_22.x | bash -
apt install nodejs -y
cd /opt/bot && npm install

В файле службы меняется строка запуска:

ExecStart=/usr/bin/node /opt/bot/index.js

Всё остальное — автозапуск, перезапуск при падении, логи — работает одинаково.

Частые проблемы

Бот запускается и сразу падает. Смотрите причину в логах: journalctl -u bot -n 50. Чаще всего это неверный токен или не установленная библиотека.

ModuleNotFoundError при работе через systemd, хотя вручную всё запускалось. В службе указан системный Python вместо виртуального окружения. В строке ExecStart должен быть путь /opt/bot/venv/bin/python.

Бот отвечает с задержкой в несколько секунд. Если код синхронный, каждый запрос блокирует остальные. Решается переходом на асинхронную библиотеку — например aiogram вместо pyTelegramBotAPI.

Conflict: terminated by other getUpdates request. Бот запущен дважды — например, остался старый процесс или он всё ещё работает на вашем компьютере. Проверьте: ps aux | grep python.

После перезагрузки сервера бот не поднялся. Не выполнена команда systemctl enable bot. Проверить: systemctl is-enabled bot.

Резервные копии

Если бот хранит данные в SQLite или файлах, настройте ежедневную копию:

nano /opt/backup-bot.sh
#!/bin/bash
tar -czf /opt/backups/bot-$(date +%F).tar.gz /opt/bot --exclude=/opt/bot/venv
find /opt/backups -name "bot-*.tar.gz" -mtime +7 -delete
mkdir -p /opt/backups && chmod +x /opt/backup-bot.sh
crontab -e

Строка для ежедневного бэкапа в 4 утра с хранением копий за неделю:

0 4 * * * /opt/backup-bot.sh

Частые вопросы

Сколько ресурсов нужно боту? Для большинства ботов достаточно 1 ядра и 2 ГБ памяти. Ресурсы начинают требоваться при обработке медиа и работе с нейросетями.

Нужен ли домен и SSL? Для бота на long polling — нет, достаточно IP. Домен с сертификатом нужен только при использовании вебхуков.

Что лучше: polling или webhook? Polling проще, работает без домена и подходит большинству проектов. Webhook экономнее при высокой нагрузке, но требует HTTPS и настроенного веб-сервера.

Как запустить бота на Python 3.12, если в системе другая версия? Виртуальное окружение из шага 4 решает вопрос: библиотеки изолированы, а нужную версию Python можно поставить отдельно.

Сколько ботов выдержит один сервер? На минимальном тарифе — 3–5 небольших ботов. Ограничение обычно по памяти, а не по процессору.

Итог

Бот на сервере — это виртуальное окружение, файл службы systemd и три команды для обновления кода. Настройка занимает около 20 минут, дальше бот работает сам: поднимается после сбоев и переживает перезагрузки.

Тариф «Старт» за 5 € в месяц закрывает задачу для большинства проектов, а на одной машине можно держать сразу несколько ботов.

Выбрать сервер для бота →

Команда Puws.Cloud
Puws.Cloud
Начать

СЕРВЕР ДЛЯ ВАШЕГО ПРОЕКТА

Начните
с тарифа.

ПОЛЕЗНОЕ О СЕРВЕРАХИнструкции
и советы.
Открыть блог
Наш Аптайм