Все статьи
Руководства

Как запустить Telegram-бота на VPS: Python, aiogram и systemd

Коротко

Чтобы бот работал круглосуточно, его запускают на VPS как сервис systemd: код лежит в отдельном каталоге с виртуальным окружением Python, токен - в файле .env с правами 600, а systemd поднимает бота после падения и перезагрузки сервера. Для бота на polling не нужны ни домен, ни открытые порты; небольшому боту хватает конфигурации за $4.00 в месяц.

Главное
  • Telegram-бота на VPS запускают как сервис systemd с Restart=always: systemd перезапускает бота через 5 секунд после падения и поднимает его после перезагрузки сервера.
  • Telegram-боту на polling не нужны домен, TLS-сертификат и открытые порты; webhook требует домен с HTTPS и открытый порт 443.
  • Токен Telegram-бота от @BotFather хранят в файле .env с правами 600 и передают процессу через EnvironmentFile в юните systemd - не в коде и не в git.
  • Небольшому Telegram-боту, который отвечает на сообщения и ходит в базу, хватает VPS с 1 vCPU и 2 ГБ памяти; на Tihost такая конфигурация стоит от $4.00 в месяц.

Какой сервер нужен боту

Боту, который отвечает на сообщения и ходит в базу, хватает младшей конфигурации Starter - 1 vCPU и 2 ГБ памяти за $4.00 в месяц. Больше ресурсов нужно, если бот обрабатывает медиа, держит тысячи одновременных диалогов или рядом работают база данных и сайт. Нагрузку видно в панели - начать с малого и перейти на тариф выше можно в любой момент.

Перед установкой пройдите первую настройку сервера: дальше команды выполняются от пользователя deploy с sudo, а не от root.

Шаг 1. Установите Python и зависимости

Бот живёт в /opt/mybot со своим виртуальным окружением - системный Python остаётся нетронутым:

bash
sudo apt update
sudo apt install -y python3-venv git
sudo mkdir -p /opt/mybot
sudo chown deploy: /opt/mybot
cd /opt/mybot
python3 -m venv .venv
.venv/bin/pip install aiogram

Шаг 2. Положите код бота

Если код в репозитории - git clone в /opt/mybot и .venv/bin/pip install -r requirements.txt. Для проверки подойдёт минимальный бот на aiogram 3 - сохраните его как /opt/mybot/bot.py:

bot.py
import asyncio
import os

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

dp = Dispatcher()


@dp.message(CommandStart())
async def start(message: Message) -> None:
    await message.answer("Bot is running on a VPS")


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


if __name__ == "__main__":
    asyncio.run(main())

Шаг 3. Спрячьте токен в .env

Токен из @BotFather не должен попадать в код и в git. Положите его в файл, который может прочитать только владелец:

bash
echo 'BOT_TOKEN=123456789:AA...' > /opt/mybot/.env
chmod 600 /opt/mybot/.env

Шаг 4. Запустите бота как сервис systemd

systemd запускает бота при загрузке сервера и перезапускает его через 5 секунд после падения. EnvironmentFile передаёт токен из .env в переменные окружения процесса:

bash
sudo tee /etc/systemd/system/mybot.service > /dev/null <<'EOF'
[Unit]
Description=Telegram bot
After=network-online.target
Wants=network-online.target

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

[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now mybot

Шаг 5. Проверьте статус и логи

Первая команда показывает, запущен ли сервис, вторая выводит журнал бота в реальном времени:

bash
systemctl status mybot
journalctl -u mybot -f

Напишите боту /start. Если он молчит, в журнале будет причина: неверный токен, ошибка импорта или исключение в коде.

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

bash
cd /opt/mybot
git pull
.venv/bin/pip install -r requirements.txt
sudo systemctl restart mybot

Если бот хранит данные в базе или файлах, перед обновлением сделайте резервную копию - способы описаны в руководстве по бэкапам VPS.

Polling или webhook

Polling - бот сам спрашивает Telegram о новых сообщениях. Ему не нужны домен, сертификат и открытые порты, поэтому для начала это лучший вариант. Webhook - Telegram присылает обновления на ваш HTTPS-адрес: так меньше задержка и лишних запросов, но нужен домен с сертификатом и открытый порт 443. Переходить на webhook имеет смысл, когда у бота много пользователей.

Вариант без консоли: Tihost Deploy

Если не хотите настраивать systemd руками, в разделе «Мои проекты» создайте проект на своём Linux-сервере и укажите код: репозиторий GitHub, загруженные файлы или архив, либо код одним текстом. Токен бота добавьте в «Переменные окружения» - они хранятся зашифрованными. Сборку, запуск и перезапуск Tihost Deploy берёт на себя. Подписка стоит $4.00 в месяц на весь аккаунт, а не на каждый проект.

Запустите сервер за 2 минуты

AMD Ryzen 9, NVMe и защита от DDoS в Германии, Финляндии и Польше. Оплата криптовалютой или картой.

Заказать сервер

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

Сколько стоит держать Telegram-бота на VPS?

Сервер от $4.00 в месяц; при оплате сразу за 12 месяцев действует скидка 20%. Для бота на polling домен не нужен.

Бот перестаёт работать, когда я закрываю SSH. Почему?

Бот, запущенный прямо из терминала, завершается вместе с SSH-сессией. Запустите его как сервис systemd - тогда бот работает независимо от SSH и поднимается после перезагрузки сервера.

Где смотреть ошибки бота?

В журнале systemd: journalctl -u mybot -f показывает вывод бота в реальном времени.

Можно ли держать несколько ботов на одном VPS?

Да, на одном VPS можно держать несколько ботов. Каждому боту - свой каталог, своё виртуальное окружение и свой файл сервиса systemd с уникальным именем.

Нужен ли домен для Telegram-бота?

Telegram-боту на polling домен не нужен. Домен с HTTPS-сертификатом нужен только боту на webhook.