Заказать бота

Деплой VK-бота на сервер: systemd, nginx и работа 24/7

Пошаговый гайд по деплою VK-бота на уже подготовленный VPS: загрузка кода, виртуальное окружение, .env, systemd, логи и когда нужен nginx.

Содержание статьи

VPS уже создан, SSH работает, базовые пакеты установлены — теперь пора превратить этот сервер в нормальную рабочую среду для бота.

В этой статье не будем повторять выбор хостинга, создание сервера и первый вход по SSH. Это уже разобрано отдельно в гайде по подготовке VPS для бота.

Здесь фокус только на следующем этапе: загрузить код, настроить окружение, подключить .env, поднять systemd и добиться стабильной работы 24/7.

Что понадобится

  • Готовый бот на Python (например, из статьи «Как создать бота ВК с нуля»)
  • Уже подготовленный VPS с Ubuntu 22.04 или 24.04
  • Рабочий SSH-доступ к серверу
  • 30–60 минут

Перед стартом

Если сервер у тебя ещё не подготовлен, сначала пройди статью «Где живут боты: пошаговый гайд по запуску VPS для новичков».

На момент начала этого гайда считаем, что у тебя уже есть:

  • VPS на Ubuntu;
  • вход по SSH;
  • обновлённая система;
  • базовые утилиты;
  • отдельный пользователь для работы с ботом.

Шаг 1: Установка 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

Шаг 2: Загружаем код бота на сервер

Два способа: через 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          ← создадим на следующем шаге

Шаг 3: Виртуальное окружение и зависимости

cd ~/vkbot

# создаём виртуальное окружение
python3 -m venv .venv

# активируем
source .venv/bin/activate

# устанавливаем зависимости
pip install -r requirements.txt

Если requirements.txt нет — создай его на своём компьютере перед загрузкой:

pip freeze > requirements.txt

Шаг 4: Настраиваем .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) и идём дальше.

Шаг 5: Создаём 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 секунд перед перезапуском (не спамить при циклических падениях)

Шаг 6: Запускаем и включаем автостарт

# перечитываем конфиги 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.

Шаг 7: Обновление кода

Когда меняешь код и хочешь задеплоить изменения:

Если используешь 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, тарифа и первичная подготовка сервера уже вынесены в отдельную статью: как выбрать и подготовить VPS для бота.

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

Да. Создай отдельный .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 МБ. Планируй с запасом.

Нужен деплой под ключ?

Если нужен бот с настроенной инфраструктурой, мониторингом и поддержкой — оставь заявку на разработку бота под ключ.

Если нужен быстрый старт на готовом сценарии — посмотри каталог готовых ботов.

Что читать дальше

Следующий шаг в цепочке — положить на этот сервер реальный бот:

Остальные материалы по теме:

Комментарии

Загрузка...