- 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 остаётся нетронутым:
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:
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. Положите его в файл, который может прочитать только владелец:
echo 'BOT_TOKEN=123456789:AA...' > /opt/mybot/.env
chmod 600 /opt/mybot/.envШаг 4. Запустите бота как сервис systemd
systemd запускает бота при загрузке сервера и перезапускает его через 5 секунд после падения. EnvironmentFile передаёт токен из .env в переменные окружения процесса:
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. Проверьте статус и логи
Первая команда показывает, запущен ли сервис, вторая выводит журнал бота в реальном времени:
systemctl status mybot
journalctl -u mybot -fНапишите боту /start. Если он молчит, в журнале будет причина: неверный токен, ошибка импорта или исключение в коде.
Как обновлять бота
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 в месяц на весь аккаунт, а не на каждый проект.
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.