---
title: "Как запустить Telegram-бота на VPS: Python, aiogram и systemd"
description: "Запуск Telegram-бота на VPS с Ubuntu или Debian: окружение Python, токен в .env, сервис systemd с автоперезапуском, логи и обновление. Плюс вариант без консоли."
url: https://tihost.io/blog/telegram-bot-on-vps
language: ru
section: "Руководства"
published: 2026-09-24
updated: 2026-10-05
publisher: Tihost (https://tihost.io)
---

# Как запустить 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](https://tihost.io/blog/starter-vps) - 1 vCPU и 2 ГБ памяти за $4.00 в месяц. Больше ресурсов нужно, если бот обрабатывает медиа, держит тысячи одновременных диалогов или рядом работают база данных и сайт. Нагрузку видно в панели - начать с малого и перейти на тариф выше можно в любой момент.

Перед установкой пройдите [первую настройку сервера](https://tihost.io/blog/vps-first-setup): дальше команды выполняются от пользователя `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`:

```python
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](https://tihost.io/blog/vps-backup).

## Polling или webhook

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

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

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

**Запустите сервер за 2 минуты.** AMD Ryzen 9, NVMe и защита от DDoS в Германии, Финляндии и Польше. Оплата криптовалютой или картой. [Заказать сервер](https://tihost.io/login)

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

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

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

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

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

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

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

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

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

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

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

---

Обновлено 2026-10-05 · https://tihost.io/blog/telegram-bot-on-vps
