Деплой VK-бота на сервер: systemd, nginx и работа 24/7
Пошаговый гайд: как задеплоить VK-бота на VPS, настроить systemd-сервис, автозапуск, логи и nginx. Какой хостинг выбрать, как загрузить код и не потерять бота при перезагрузке.
Содержание статьи
Написать бота локально — это старт. Но пока бот запущен только на твоём ноутбуке, он умирает при закрытии терминала. Чтобы бот работал круглосуточно и перезапускался сам после сбоев — нужен сервер.
В этой статье пройдём весь путь: от выбора хостинга до работающего сервиса с автозапуском и логами.
Что понадобится
- Готовый бот на Python (например, из статьи «Как создать бота ВК с нуля»)
- VPS с Ubuntu 22.04 или 24.04
- SSH-клиент (Terminal на Mac/Linux, PowerShell или PuTTY на Windows)
- 30–60 минут
Какой сервер выбрать
Для VK-бота требования минимальные. Бот на vkbottle в режиме Long Poll почти не нагружает CPU и держится в 50–100 МБ RAM.
Минимальные характеристики:
| Параметр | Минимум | Рекомендация |
|---|---|---|
| CPU | 1 ядро | 1–2 ядра |
| RAM | 512 МБ | 1 ГБ |
| Диск | 10 ГБ SSD | 20 ГБ SSD |
| Сеть | 100 Мбит/с | 200+ Мбит/с |
| ОС | Ubuntu 22.04 LTS | Ubuntu 22.04 / 24.04 LTS |
Российские провайдеры (оплата картой РФ, серверы в России):
- Timeweb Cloud — от 130 ₽/мес, хороший дашборд, быстрый старт
- Beget — от 150 ₽/мес, стабильный, удобен для начинающих
- REG.RU — от 149 ₽/мес, широкая сеть
Зарубежные провайдеры (если нужна низкая задержка до серверов VK):
- Hetzner — от €4/мес, отличное соотношение цены и качества
- DigitalOcean — от $6/мес, удобная панель
Для большинства ботов хватит самого дешёвого тарифа на 512 МБ — 1 ГБ RAM.
Шаг 1: Первичная настройка сервера
После создания VPS провайдер выдаёт IP-адрес и пароль root. Подключаемся:
ssh root@YOUR_SERVER_IP
Обновляем систему
apt update && apt upgrade -y
Создаём отдельного пользователя
Запускать бота от root — плохая практика. Создаём пользователя vkbot:
adduser vkbot
# задай пароль, остальное можно пропустить (Enter)
# добавляем в sudo для управления сервером
usermod -aG sudo vkbot
Настраиваем SSH-ключи (опционально, но удобно)
На своём компьютере (не сервере) генерируем ключ, если ещё нет:
ssh-keygen -t ed25519 -C "vkbot-server"
Копируем публичный ключ на сервер:
ssh-copy-id vkbot@YOUR_SERVER_IP
Теперь подключаться можно без пароля: ssh vkbot@YOUR_SERVER_IP.
Шаг 2: Установка Python
Ubuntu 22.04 поставляется с Python 3.10. Для vkbottle 4.x нужен Python 3.10+.
# переключаемся на нового пользователя
su - vkbot
# проверяем версию
python3 --version
Если версия устарела или нужен Python 3.11+:
sudo add-apt-repository ppa:deadsnakes/ppa -y
sudo apt update
sudo apt install python3.11 python3.11-venv python3.11-pip -y
Проверяем:
python3.11 --version
# Python 3.11.x
Шаг 3: Загружаем код бота на сервер
Два способа: через Git (рекомендуется) или через scp.
Способ А: Git (рекомендуется)
Если код в репозитории — просто клонируем:
cd ~
git clone https://github.com/yourname/vkbot.git
cd vkbot
Способ Б: scp — копирование файлов
С твоего компьютера (не сервера):
scp -r /путь/до/vkbot vkbot@YOUR_SERVER_IP:~/vkbot
Структура проекта на сервере
/home/vkbot/vkbot/
├── bot.py
├── requirements.txt
└── .env ← создадим на следующем шаге
Шаг 4: Виртуальное окружение и зависимости
cd ~/vkbot
# создаём виртуальное окружение
python3 -m venv .venv
# активируем
source .venv/bin/activate
# устанавливаем зависимости
pip install -r requirements.txt
Если requirements.txt нет — создай его на своём компьютере перед загрузкой:
pip freeze > requirements.txt
Шаг 5: Настраиваем .env на сервере
Токен и секреты никогда не хранятся в коде. Создаём .env прямо на сервере:
nano ~/vkbot/.env
Содержимое:
VK_TOKEN=vk1.a.ваш_реальный_токен
Сохраняем: Ctrl+O, Enter, Ctrl+X.
Ограничиваем доступ к файлу:
chmod 600 ~/vkbot/.env
Проверяем что бот запускается
source ~/vkbot/.venv/bin/activate
python ~/vkbot/bot.py
Если бот запустился без ошибок — останавливаем (Ctrl+C) и идём дальше.
Шаг 6: Создаём systemd-сервис
systemd — менеджер процессов в Linux. Он запустит бота при старте сервера и перезапустит при падении.
sudo nano /etc/systemd/system/vkbot.service
Содержимое файла:
[Unit]
Description=VK Bot
After=network.target
[Service]
Type=simple
User=vkbot
WorkingDirectory=/home/vkbot/vkbot
EnvironmentFile=/home/vkbot/vkbot/.env
ExecStart=/home/vkbot/vkbot/.venv/bin/python bot.py
Restart=on-failure
RestartSec=5
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
Объяснение ключевых параметров:
After=network.target— ждём пока поднимется сеть, иначе Long Poll упадёт сразуEnvironmentFile— загружает переменные из.envавтоматическиExecStart— полный путь до Python в виртуальном окруженииRestart=on-failure— перезапуск при любом ненулевом коде выходаRestartSec=5— пауза 5 секунд перед перезапуском (не спамить при циклических падениях)
Шаг 7: Запускаем и включаем автостарт
# перечитываем конфиги systemd
sudo systemctl daemon-reload
# запускаем бота
sudo systemctl start vkbot
# включаем автозапуск при перезагрузке сервера
sudo systemctl enable vkbot
Проверяем статус:
sudo systemctl status vkbot
Вывод должен быть примерно такой:
● vkbot.service - VK Bot
Loaded: loaded (/etc/systemd/system/vkbot.service; enabled)
Active: active (running) since ...
Main PID: 12345 (python)
active (running) — бот работает. enabled — запустится при перезагрузке.
Управление сервисом
sudo systemctl start vkbot # запустить
sudo systemctl stop vkbot # остановить
sudo systemctl restart vkbot # перезапустить
sudo systemctl status vkbot # статус
sudo systemctl disable vkbot # убрать из автозапуска
Просмотр логов
journalctl — стандартный инструмент для логов systemd:
# последние 50 строк
sudo journalctl -u vkbot -n 50
# следить в реальном времени (как tail -f)
sudo journalctl -u vkbot -f
# логи за последний час
sudo journalctl -u vkbot --since "1 hour ago"
# только ошибки
sudo journalctl -u vkbot -p err
Если бот падает и ты не понимаешь почему — первое что смотришь:
journalctl -u vkbot -n 100.
Шаг 8: Обновление кода
Когда меняешь код и хочешь задеплоить изменения:
Если используешь Git:
cd ~/vkbot
git pull
sudo systemctl restart vkbot
Если копируешь файлы через scp:
# с твоего компьютера
scp bot.py vkbot@YOUR_SERVER_IP:~/vkbot/bot.py
# потом на сервере
sudo systemctl restart vkbot
Nginx: нужен ли он для Long Poll бота
Короткий ответ: нет. Если бот работает через Long Poll (а не Callback API), nginx для него не нужен. Бот сам инициирует подключение к VK, никто к нему извне не подключается.
Nginx нужен если:
- бот использует Callback API (VK шлёт запросы на твой endpoint);
- на том же сервере есть веб-интерфейс или API для управления ботом.
Nginx для Callback API
Если всё-таки нужен Callback — ставим nginx как прокси перед ботом.
sudo apt install nginx -y
Конфиг /etc/nginx/sites-available/vkbot:
server {
listen 80;
server_name yourdomain.ru;
location /vk/callback {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_connect_timeout 3s;
proxy_read_timeout 5s;
}
}
sudo ln -s /etc/nginx/sites-available/vkbot /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
SSL через certbot:
sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d yourdomain.ru
Подробнее о Callback API и когда его выбирать: Long Poll vs Callback API для бота ВК.
Частые ошибки
Failed to start vkbot.service: Unit not found
Проверь путь к файлу сервиса и что daemon-reload был запущен после создания файла.
ModuleNotFoundError: No module named 'vkbottle'
В ExecStart указан не тот Python. Убедись что путь ведёт именно в .venv:
# проверяем что путь правильный
ls /home/vkbot/vkbot/.venv/bin/python
KeyError: 'VK_TOKEN'
.env файл не найден или указан неверный путь в EnvironmentFile. Проверь что файл существует:
ls -la ~/vkbot/.env
Бот работает, но падает каждые несколько часов
Обычно причина — сетевые таймауты или утечка памяти. Проверь логи и добавь retry-логику в обработчики. Подробнее: Сетевые запросы: timeout, retry, backoff.
Permission denied при чтении .env
# у файла должен быть владелец vkbot
chown vkbot:vkbot ~/vkbot/.env
chmod 600 ~/vkbot/.env
Чеклист перед запуском в прод
- Бот запускается вручную без ошибок
- Токен в
.env, не в коде -
.envнедоступен посторонним (chmod 600) -
systemctl status vkbotпоказываетactive (running) -
systemctl is-enabled vkbotпоказываетenabled - Логи чистые:
journalctl -u vkbot -n 20без ошибок - Проверена перезагрузка:
sudo reboot→ бот поднялся сам
Мини-FAQ
Какой хостинг лучше для VK-бота?
Для старта — любой VPS с 1 ГБ RAM и Ubuntu 22.04. Timeweb и Beget удобны для оплаты картой РФ. Hetzner выгоднее по деньгам если есть возможность платить картой Евросоюза.
Можно ли держать несколько ботов на одном сервере?
Да. Создай отдельный .service файл для каждого бота с уникальным именем: vkbot1.service, vkbot2.service. Ресурсов одного VPS на 1 ГБ хватит на 5–10 лёгких ботов.
Нужен ли домен для Long Poll бота?
Нет. Long Poll работает без домена и без открытых портов — бот сам подключается к VK.
Как автоматически деплоить изменения?
Простой способ — скрипт deploy.sh в репозитории:
#!/bin/bash
cd ~/vkbot
git pull
sudo systemctl restart vkbot
echo "Deployed at $(date)"
Более продвинутый путь — GitHub Actions с деплоем по git push.
Бот упал и не перезапустился — почему?
Если падение происходит чаще чем позволяет RestartSec, systemd может прекратить попытки. Проверь лог и добавь StartLimitIntervalSec=0 в секцию [Unit] чтобы снять ограничение на количество рестартов.
Сколько RAM реально потребляет vkbottle бот?
Базовый бот без внешних интеграций: 40–80 МБ. С БД-соединением и кешем: 80–150 МБ. Планируй с запасом.
Нужен деплой под ключ?
Если нужен бот с настроенной инфраструктурой, мониторингом и поддержкой — оставь заявку на разработку бота под ключ.
Если нужен быстрый старт на готовом сценарии — посмотри каталог готовых ботов.
Что читать дальше
- Как создать бота для ВК с нуля — если ещё не написал самого бота
- Long Poll vs Callback API для бота ВК — когда нужен nginx и Callback
- Сетевые запросы: timeout, retry, backoff — чтобы бот не падал на временных сбоях сети
- vkbottle или vk_api: что выбрать — если сомневаешься в стеке
Реклама
Комментарии
Загрузка...