Бот, запущенный на домашнем компьютере, живёт ровно до перезагрузки или отключения интернета. Чтобы он работал круглосуточно, его переносят на сервер.
В инструкции — весь путь: от заказа 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 € в месяц закрывает задачу для большинства проектов, а на одной машине можно держать сразу несколько ботов.

