VPS для Telegram-бота на aiogram: полный деплой
aiogram — самый популярный асинхронный фреймворк для Telegram-ботов на Python. Чтобы бот отвечал пользователям круглосуточно, ему нужен сервер, который не выключается. Развернём бота на VPS: venv, systemd, выбор между polling и вебхуком.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Почему боту нужен сервер, а не ноутбук
Пока вы тестируете бота на локальной машине, всё работает. Но как только вы закроете крышку ноутбука или пропадёт интернет — бот замолчит, а пользователи будут писать в пустоту. Продакшн-бот обязан жить на машине, которая включена всегда.
VPS даёт постоянный аптайм, внешний IP (нужен для вебхуков) и полный root-доступ для установки чего угодно. Даже младшего тарифа с 1 ГБ RAM хватает для бота с тысячами пользователей, потому что aiogram асинхронный и почти не грузит CPU в простое.
- Работает 24/7 — не зависит от вашего компьютера.
- Внешний IP и домен — можно поднять вебхук с TLS.
- Лёгкий по ресурсам — async-архитектура экономит RAM.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.
Арендовать VPS для Telegram-ботаУстановка Python и окружения
aiogram 3.x требует Python 3.9+. Ставим свежий Python, git и создаём отдельного пользователя с изолированным venv.
sudo apt update && sudo apt install -y python3 python3-venv python3-pip git
sudo useradd -r -m -s /bin/bash botuser
sudo -u botuser bash -c 'cd ~ && git clone https://github.com/you/mybot.git'
sudo -u botuser bash -c 'cd ~/mybot && python3 -m venv venv && venv/bin/pip install -U aiogram'
Токен бота, полученный от @BotFather, кладём в файл окружения, а не в код. Права 600 — чтобы токен не прочитал никто, кроме бота.
echo 'BOT_TOKEN=123456:AAxxxxxxxx' | sudo -u botuser tee /home/botuser/mybot/.env
sudo chmod 600 /home/botuser/mybot/.env
Минимальный бот на aiogram 3
Вот рабочий каркас бота на long polling — этого достаточно для старта. Токен читается из окружения.
import asyncio, os
from aiogram import Bot, Dispatcher
from aiogram.types import Message
from aiogram.filters import CommandStart
dp = Dispatcher()
@dp.message(CommandStart())
async def start(m: Message):
await m.answer('Привет! Бот работает на VPS 24/7.')
async def main():
bot = Bot(os.environ['BOT_TOKEN'])
await dp.start_polling(bot)
if __name__ == '__main__':
asyncio.run(main())
Long polling не требует домена и TLS — бот сам ходит за обновлениями к Telegram. Это идеальный вариант для старта и большинства ботов.
Автозапуск через systemd
Чтобы бот пережил ребут и сам поднимался после сбоя, оформляем его как systemd-сервис. Файл окружения подхватывается через EnvironmentFile.
sudo tee /etc/systemd/system/mybot.service > /dev/null <<'EOF'
[Unit]
Description=Aiogram Telegram bot
After=network-online.target
Wants=network-online.target
[Service]
User=botuser
WorkingDirectory=/home/botuser/mybot
EnvironmentFile=/home/botuser/mybot/.env
ExecStart=/home/botuser/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
systemctl status mybot
journalctl -u mybot -f
Теперь при sudo reboot бот поднимется автоматически, а при исключении в коде systemd перезапустит его через 5 секунд.
Вебхук вместо polling
Для высоконагруженных ботов вебхук эффективнее: Telegram сам присылает апдейты на ваш HTTPS-эндпоинт, без постоянных запросов. Нужен домен и TLS — проще всего через nginx и certbot.
sudo apt install -y nginx certbot python3-certbot-nginx
sudo certbot --nginx -d bot.example.com
nginx проксирует запросы на локальный порт бота (например, 8080), а aiogram обрабатывает их через встроенный aiohttp-сервер. Для большинства проектов polling проще и не требует домена — переходите на вебхук, только когда упрётесь в нагрузку.
Где брать сервер и частые ошибки
Telegram-бот нетребователен к ресурсам, но чувствителен к сетевой доступности Telegram API. Локации MAATRIX в UK, США и РФ дают стабильный доступ к серверам Telegram, AMD EPYC + NVMe обеспечивают мгновенный отклик, а от $8/мес это дешевле любой замены упавшему хостингу. Оплата картой РФ, СБП, криптой или MAAT снимает вопрос зарубежной оплаты.
- Токен в коде и git — украдут бота; храните в .env с правами 600.
- Запуск через nohup — не поднимется после ребута; используйте systemd.
- Две копии бота с одним токеном — конфликт getUpdates, апдейты теряются.
- Нет Restart=always — одно исключение кладёт бота навсегда.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.
Арендовать VPS для Telegram-ботаОбсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Частые вопросы
Polling или вебхук — что выбрать?
Для старта и большинства ботов — polling: не нужен домен и TLS. Вебхук имеет смысл при высокой нагрузке, когда важна экономия на постоянных запросах к API.
Сколько RAM нужно боту на aiogram?
Обычному боту хватает 512 МБ-1 ГБ. aiogram асинхронный и почти не грузит память в простое; больше нужно только при работе с медиа и БД.
Почему бот отвечает с двух аккаунтов дубликатами?
Скорее всего запущены две копии с одним токеном. Остановите лишний процесс — при polling один токен обслуживает только один экземпляр.