Деплой 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 МБ. Планируй с запасом.
Нужен деплой под ключ?
Если нужен бот с настроенной инфраструктурой, мониторингом и поддержкой — оставь заявку на разработку бота под ключ.
Если нужен быстрый старт на готовом сценарии — посмотри каталог готовых ботов.
Что читать дальше
Следующий шаг в цепочке — положить на этот сервер реальный бот:
- Бот онлайн-записи для ВКонтакте: специалисты, слоты, подтверждение администратором — готовый бот с FSM, SQLite и панелью администратора
Остальные материалы по теме:
- Как хранить токен VK API безопасно — .env, systemd EnvironmentFile и защита от утечек
- Как создать бота для ВК с нуля — если ещё не написал самого бота
- Long Poll vs Callback API для бота ВК — когда нужен nginx и Callback
- Автоответчик ВК на Python — рабочий бот для деплоя на этот сервер
- Сетевые запросы: timeout, retry, backoff — чтобы бот не падал на временных сбоях сети
- vkbottle или vk_api: что выбрать — если сомневаешься в стеке
Комментарии
Загрузка...