Один VPS может обслуживать несколько Telegram-ботов. Отдельный сервер и IP-адрес для каждого обычно не нужны. Для небольшого текстового бота разумно начать с 1–2 ГБ оперативной памяти, а для постоянной работы настроить запуск как службы, автоматический перезапуск и контроль ошибок.
Главное — учитывать, что делает бот. Принимать заявки и обращаться к готовому API гораздо легче, чем обрабатывать видео, запускать браузер или выполнять нейросеть на самом сервере. Ни количество подписчиков, ни число ботов сами по себе не определяют подходящий тариф.
Что именно размещается на VPS
BotFather создаёт учётную запись бота и выдаёт токен доступа. Код, который отвечает пользователям, должен выполняться отдельно: на VPS, платформе приложений или инфраструктуре конструктора. VPS позволяет держать этот код запущенным независимо от вашего компьютера.
Для переноса готового бота понадобятся исходники, список зависимостей, токен, настройки внешних сервисов и данные, которые бот уже накопил. Если проект использует PostgreSQL, Redis или локальные файлы, их тоже нужно перенести. Одного токена недостаточно, чтобы восстановить приложение.
Для обычного проекта на Python или Node.js подойдёт поддерживаемый Linux с совместимой версией языка. Рабочий стол и хостинговая панель не обязательны. Если вы используете конструктор, который уже выполняет код за вас, сначала уточните, нужен ли ему отдельный сервер вообще.
Сколько памяти, процессора и диска нужно боту
Таблица ниже — ориентиры для первого подбора, а не гарантированная вместимость VPS. Итоговую конфигурацию проверяют на вашем коде и характерной нагрузке.
| Задача | С чего начать оценку | Что может увеличить требования |
|---|---|---|
| Небольшой текстовый бот: команды, уведомления, заявки, обращения к внешнему API | 1 vCPU, 1–2 ГБ RAM, около 20 ГБ SSD/NVMe | Большие ответы API, хранение сессий в памяти, тяжёлые библиотеки и фоновые задачи |
| Несколько лёгких ботов и небольшая база данных на том же VPS | 2 vCPU, 2–4 ГБ RAM, 30–40 ГБ SSD/NVMe | Одновременные пики, база, очереди, логи, локальные вложения |
| Обработка видео, запуск браузеров, распознавание и локальные AI-модели | Подбор по замеру одной задачи и допустимому числу одновременных задач | Память каждого рабочего процесса, CPU, временные файлы; для некоторых моделей — GPU |
Вызов AI через внешний API не равен запуску модели на VPS. В первом случае сервер в основном передаёт данные и ждёт ответ. Во втором он сам выполняет вычисления, и требования могут отличаться на порядки. Стоимость внешнего API оплачивается отдельно от аренды VPS.
Память считайте для всей системы: боты, база, фоновые процессы, операционная система и запас на пики. Условный пример: три бота потребляют в пике по 180 МБ, остальные службы — 500 МБ, ещё 400 МБ оставлены в запасе. Получается около 1,44 ГБ: VPS с 1 ГБ уже тесен, конфигурация с 2 ГБ заслуживает проверки. Это пример расчёта, а не результат тестирования конкретных ботов.
После запуска выполните:
free -h
df -h
top
В free -h смотрите прежде всего на available: небольшой показатель free сам по себе не означает нехватку памяти, поскольку Linux использует RAM под кеш. В top найдите процессы ботов и базы. Повторите наблюдение во время рассылки, построения отчёта или обработки файлов, а не только в простое.
Если память постепенно растёт даже при одинаковой нагрузке, проверьте код, кеши и лишние копии процесса. Если рост возникает при одновременных тяжёлых запросах, ограничьте их параллельное выполнение и добавьте очередь. Увеличивать RAM имеет смысл, когда измеренный рабочий объём действительно не помещается.
Если процессор свободен, а бот долго ждёт CRM или AI API, дополнительные vCPU не устранят эту задержку. Если CPU занят вычислениями, тяжёлую работу можно вынести в отдельные процессы и ограничить очередь. Несколько ядер не ускоряют автоматически обработчик, который выполняется последовательно.
Диск нужен не только для кода. Учитывайте базу, загруженные файлы, временные результаты, журналы и место для обновлений. Настройте удаление ненужных временных файлов и ограничение хранения логов; заполненный диск может остановить запись в базу даже при свободной памяти.
Нужны ли домен, HTTPS и отдельный IP
Telegram передаёт события боту двумя способами.
Long polling: приложение само обращается к Telegram и ждёт новые сообщения. Для небольшого самостоятельного бота это удобный начальный вариант: домен, сертификат и открытый входящий порт бота не требуются. Нужны работающий процесс, DNS и исходящий доступ к Telegram API по HTTPS.
Webhook: Telegram отправляет события на HTTPS-адрес вашего приложения. Этот способ удобен, если проект уже имеет веб-сервер или предполагает распределённую обработку. Обычно настраивают домен, сертификат и reverse proxy — веб-сервер, который передаёт запросы нужному боту. Для стандартного Telegram Bot API поддерживаются порты 443, 80, 88 и 8443; HTTPS обязателен на любом из них.
На одном IP можно разместить несколько webhook: например, bots.example.com/orders и bots.example.com/notify. Прокси направляет их разным приложениям. Если приложения слушают отдельные локальные порты, эти порты должны различаться. Дополнительные публичные IP только из-за появления второго бота покупать не требуется.
Polling и webhook для одного токена одновременно не работают. При переходе на polling сначала удалите прежнюю регистрацию webhook методом deleteWebhook. Не включайте drop_pending_updates=true, если не намерены удалить ожидающие события.
Локацию выбирайте с учётом доступности Telegram и сервисов, к которым обращается бот: платёжной системы, CRM, AI API. Близость VPS к пользователю не определяет всю задержку — сообщения проходят через Telegram. Доступность и региональные ограничения внешних API лучше проверить до переноса рабочего проекта.
Как запустить бота независимо от SSH-сессии
Команда python bot.py в открытом терминале подходит для проверки. Для постоянной работы используйте менеджер служб. В Linux эту задачу решает systemd: запускает приложение при загрузке VPS, следит за завершением процесса и сохраняет журнал.
Ниже пример для готового Python-проекта на Debian или Ubuntu с systemd. Предполагается, что бот работает через polling, запускается файлом bot.py и читает токен из переменной BOT_TOKEN. Для другого имени файла или версии Python измените пути и команды. Перед переносом существующего проекта сохраните его базу и настройки.
1. Создайте отдельного пользователя и каталог. Эти команды предназначены для нового размещения с именем orders:
sudo apt update
sudo apt install python3 python3-venv
sudo useradd --system --user-group \
--home-dir /opt/tgbots/orders \
--shell /usr/sbin/nologin tgbot-orders
sudo install -d -o tgbot-orders -g tgbot-orders \
-m 0750 /opt/tgbots/orders
Скопируйте файлы готового проекта, включая bot.py и requirements.txt, в /opt/tgbots/orders. Затем создайте отдельное окружение с зависимостями:
sudo chown -R tgbot-orders:tgbot-orders /opt/tgbots/orders
sudo -u tgbot-orders python3 -m venv /opt/tgbots/orders/.venv
sudo -u tgbot-orders /opt/tgbots/orders/.venv/bin/python \
-m pip install -r /opt/tgbots/orders/requirements.txt
Продолжайте только после успешной установки. Используйте список зависимостей с проверенными версиями. Если pip сообщает о несовместимости с Python, сначала установите подходящую версию среды, а не меняйте библиотеки рабочего бота наугад.
2. Сохраните токен вне исходников. Создайте каталог и откройте файл настроек:
sudo install -d -m 0700 /etc/tgbots
sudoedit /etc/tgbots/orders.env
Содержимое файла:
BOT_TOKEN=ВСТАВЬТЕ_ТОКЕН_ОТ_BOTFATHER
После сохранения ограничьте доступ:
sudo chown root:root /etc/tgbots/orders.env
sudo chmod 600 /etc/tgbots/orders.env
Код должен действительно читать эту переменную, например через os.environ["BOT_TOKEN"] после import os. systemd передаст её процессу при запуске. Не добавляйте токены в Git и не выводите их в журналы. Если токен уже опубликован, перевыпустите его через BotFather и обновите файл настроек.
3. Создайте службу. Откройте sudoedit /etc/systemd/system/tgbot-orders.service и сохраните:
[Unit]
Description=Telegram bot orders
Wants=network-online.target
After=network-online.target
StartLimitIntervalSec=300
StartLimitBurst=10
[Service]
Type=exec
User=tgbot-orders
Group=tgbot-orders
WorkingDirectory=/opt/tgbots/orders
EnvironmentFile=/etc/tgbots/orders.env
ExecStart=/opt/tgbots/orders/.venv/bin/python -u /opt/tgbots/orders/bot.py
Restart=always
RestartSec=5
TimeoutStopSec=30
MemoryAccounting=true
NoNewPrivileges=true
PrivateTmp=true
[Install]
WantedBy=multi-user.target
Здесь указаны абсолютные пути к Python и файлу бота, поэтому служба не зависит от окружения SSH-сессии. Restart=always перезапускает завершившийся процесс, включая выход без ошибки. При намеренной остановке через systemctl stop автоматического перезапуска не будет. Частые неудачные запуски ограничены, чтобы постоянная ошибка не создавала бесконечный цикл.
4. Остановите прежнюю копию и включите службу. Для этого токена не должно оставаться polling-процесса на компьютере, старом VPS или в контейнере.
sudo systemctl daemon-reload
sudo systemctl enable --now tgbot-orders
sudo systemctl status tgbot-orders --no-pager
sudo journalctl -u tgbot-orders -n 50 --no-pager
Норма — active (running) без повторяющихся ошибок. После этого отправьте боту /start и выполните его основную операцию: например, создайте тестовую заявку и проверьте запись в базе или CRM. Статус службы подтверждает наличие процесса, но не правильность его ответов.
Для бота на Node.js принцип тот же: отдельная служба, пользователь и конфигурация, а в ExecStart — абсолютный путь к Node.js и точке входа приложения. Если проект уже поставляется в Docker Compose, используйте его способ запуска с политикой restart: unless-stopped и автозапуском Docker. Вторую копию того же бота через systemd в таком случае не запускайте.
Как разместить несколько ботов на одном VPS
Для независимых проектов удобнее отдельная служба на каждого бота. Повторите предыдущую настройку, заменив orders на имя второго проекта во всех путях, имени пользователя и службы. Второй бот должен получить собственный токен.
- У каждого бота — свой каталог и отдельное Python-окружение или контейнер.
- Каждая служба получает свои токены и настройки; файлы недоступны пользователям других ботов.
- Для базы задаются отдельные базы или схемы и права доступа, если совместное использование данных не предусмотрено проектом.
- Журналы и перезапуск доступны отдельно: обновление одного бота не требует останавливать остальные.
Несколько разных ботов могут работать через polling на одном IP. Ограничение другое: для одного токена должен быть только один активный получатель getUpdates. Для разработки заведите отдельного тестового бота, чтобы запуск на ноутбуке не конфликтовал с рабочим сервером.
В обсуждении aiogram пользователь описал именно такую аварию: после отказа VPS он запустил резервную копию, а вернувшийся основной сервер начал конкурировать с ней за события. Позже автор сообщил, что управляет активным экземпляром внешним механизмом. Два одновременно работающих polling-процесса сами по себе не создают отказоустойчивость.
При совместном размещении задайте ограничения памяти после замеров. Например, для службы с измеренным пиком около 250 МБ можно проверить MemoryHigh=384M и MemoryMax=512M в секции [Service]. При превышении первого порога система активнее освобождает память и может замедлять службу; второй задаёт жёсткую границу и может привести к завершению процесса. Дождитесь завершения важных задач, затем после изменения выполните sudo systemctl daemon-reload и sudo systemctl restart tgbot-orders, затем повторите нагрузочную проверку. Это пример для указанного пика; суммарный бюджет всех служб должен оставлять место ОС и базе.
Общий VPS остаётся общей точкой отказа: проблема с его диском, сетью или памятью затронет все размещённые проекты. Отдельные VPS оправданы, когда ботам нужны независимые обновления, разные администраторы, сильная изоляция или отдельные требования к доступности. Отказоустойчивость одного бота требует ещё и согласования состояния базы и переключения обработки.
Как понять, почему бот молчит или перезапускается
Начните с журнала нужной службы. Для просмотра новых записей используйте sudo journalctl -u tgbot-orders -f; выход из просмотра — Ctrl+C, сам бот продолжит работу.
| Симптом | Что проверить | Что делать дальше |
|---|---|---|
| ModuleNotFoundError, Permission denied, ошибка запуска Python | Путь ExecStart, установленное окружение, User и права каталога | Установить зависимости именно в .venv службы; исправить пользователя или права. Не запускать бота от root ради обхода ошибки. |
| 401 Unauthorized | Актуальность токена и файл EnvironmentFile | Исправить токен и перезапустить службу. Добавление CPU или памяти здесь не поможет. |
| Повторяющийся 409 Conflict, terminated by other getUpdates request | Копии с тем же токеном на VPS, компьютере, старом сервере; оставшийся webhook | Оставить одного polling-получателя, согласовать режим получения событий. Не пытаться лечить конфликт постоянными перезапусками. |
| Процесс убит, в журнале OOM или Out of memory | Общую память, лимиты службы/контейнера, число одновременных задач и лишние процессы | Ограничить параллелизм, исправить утечку либо увеличить RAM после замеров. OOM внутри контейнера возможен даже при свободной памяти хоста. |
| 429 Too Many Requests от Telegram | Ограничения отправки и значение retry_after в ответе | Поставить отправку в очередь и выдерживать указанную паузу. Более мощный VPS не отменяет лимиты API. |
| Служба active, но ответа нет | Ошибки обработчиков, таймауты внешнего API, доступ к базе; при webhook — доставку событий | Проследить одну тестовую команду от получения до результата. Для webhook проверить getWebhookInfo: адрес url, pending_update_count и last_error_message. |
В aiogram причиной переполнения памяти может быть не только утечка: при большом потоке событий создаётся слишком много одновременных задач. В версиях, поддерживающих tasks_concurrency_limit, этот параметр ограничивает их число при handle_as_tasks=True. Значение подбирайте по памяти одной задачи и допустимой задержке; простое повышение лимита переносит проблему на базу или внешний API.
Для оценки памяти службы и числа автоматических перезапусков:
sudo systemctl show tgbot-orders -p MemoryCurrent -p NRestarts
sudo journalctl -k -b --no-pager
MemoryCurrent показывает текущее потребление службы, а не максимум за всё время; наблюдайте его под нагрузкой. В журнале ядра ищите записи Out of memory и Killed process. Если бот перестал запускаться с сообщением Start request repeated too quickly, исправьте исходную ошибку, затем выполните:
sudo systemctl reset-failed tgbot-orders
sudo systemctl start tgbot-orders
При webhook ожидайте, что очередь pending_update_count после тестового события уменьшается, новых ошибок доставки нет, а действие выполнено один раз. Растущая очередь требует проверки HTTPS, маршрута в прокси и скорости обработчика. Для защиты обработчика используйте secret_token при регистрации webhook и проверяйте соответствующий заголовок Telegram.
Что проверить для работы 24/7
Сначала закройте SSH и повторите команду в Telegram. Затем, в согласованное время без незавершённых важных задач, перезагрузите VPS через sudo reboot. После загрузки проверьте systemctl is-enabled tgbot-orders, состояние службы и реальное действие бота. Ожидаемый результат — автозапуск и обработка новой команды без ручного входа на сервер.
Автоматический перезапуск помогает при завершении процесса. Зависший обработчик может оставаться в состоянии active. Поэтому приложению нужны таймауты обращений к внешним сервисам, контролируемые повторы и отдельный мониторинг. Например, разработчик добавляет health-адрес приложения, который сообщает о доступности базы и давности успешного обращения к Telegram, а внешний монитор регулярно проверяет этот адрес. Одного ping VPS недостаточно.
Сообщение об отказе должно приходить независимо от сломавшегося бота — например, на почту. Контролируйте также свободное место, память, частые перезапуски и возраст последней успешной резервной копии.
Пользовательские данные, незавершённые заявки и важные задания храните в постоянной базе. Состояние только в оперативной памяти пропадёт после рестарта. Для действий с внешним результатом, например создания заказа, предусмотрите проверку идентификатора события или заказа, чтобы повторная доставка не создала дубль.
Telegram хранит необработанные входящие события не дольше 24 часов. Это не резервная копия базы и не гарантия сохранения всех операций при аварии. Отдельно сохраняйте код, версии зависимостей, настройки, токены, файлы и согласованную копию БД вне рабочего VPS. Проверьте восстановление на другом сервере с тестовым токеном, затем выполните основную операцию бота и убедитесь, что данные сохранились.
Один VPS позволяет работать круглосуточно, но не исключает перерывы из-за обновлений, ошибок приложения, отказов инфраструктуры или внешних API. Если даже короткий простой недопустим, потребуется отдельная схема резервирования и переключения, а не только увеличенный тариф.
Какой VPS выбрать в HSTQ
Для размещения одного или нескольких самостоятельных ботов рекомендуем VPS HSTQ для Telegram-ботов. Для лёгкого проекта можно рассмотреть конфигурацию с 2 vCPU, 2 ГБ RAM и 40 ГБ NVMe, затем проверить запас ресурсов на реальных задачах. Актуальную цену и доступность смотрите при заказе.
Для подбора укажите язык и библиотеку, количество ботов, используемую базу, фоновые задачи и ожидаемые пики. Если бот обрабатывает видео, запускает браузер или использует AI, уточните, где выполняются вычисления. В бюджет кроме VPS заложите нужные внешние API, хранилище копий и, при webhook, домен. Настройка приложения, мониторинга и резервирования в базовый VPS не входит: при необходимости инженерные работы в HSTQ согласуются отдельно.