Администрирование

Деплой бота на VDS-сервере с Ubuntu

Данная статья рассматривает запуск Python-бота на VDS-сервере с Ubuntu 18.04. В статье опишем установку и настройку необходимых компонентов, а также создание службы systemd для непрерывной работы бота.

Первым шагом необходимо установить git для удобной работы с проектами:

apt install git

Далее настроим SSH-ключ по статье "Как настроить SSH-ключ для GitHub", чтобы иметь возможность подключаться к удаленному репозиторию.

В Ubuntu 18.04 по умолчанию стоит Python 3.6.9. Поскольку наш бот написан на версии 3.9, то выполним ее установку.

Импортируем репозиторий:

add-apt-repository ppa:deadsnakes/ppa

Далее обновим все пакеты:

apt update

Выполним установку Python 3.9 командой:

apt install python3.9

И проверим его версию:

python3.9 -V

Она должна быть 3.9.16, как показано на скриншоте:

Однако предыдущая версия 3.6.9 по-прежнему доступна, и при запуске команд с использованием Python 3 будет использоваться именно она, а нам нужна более новая версия. Чтобы изменить интерпретатор по умолчанию, необходимо сначала проверить, какие версии Python уже используются в системе, для указания корректных путей далее по инструкции, выполнив эту команду:

ls /usr/bin/python*

Результат выполненной команды представлен ниже:

Для использования новой версии 3.9.16 вместо 3.6.9 добавим альтернативы:

update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 1
update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.9 2

Проверим результат выполненных команд:

update-alternatives --list python3

Для настройки выбора версии выполним команду config:

update-alternatives --config python3

И в запросе укажем номер интерпретатора Python, который будет использоваться по умолчанию, как показано на скриншоте:

Теперь для команды Python3 будет всегда использоваться версия 3.9.16. Проверим ее:

python3 -V

Вывод работы команды представлен на скриншоте ниже:

Установим pip3 при помощи следующей команды:

apt install python3-pip

И дополнительно пакет "python3.9-distutils":

apt install python3.9-distutils

Установим виртуальное окружение:

apt install virtualenv

Дополнительно установим venv lib для Python 3.9

apt install python3.9-dev python3.9-venv

В целях безопасности для запуска нашего бота создадим нового пользователя:

useradd -m PYbot

Зададим ему пароль:

passwd PYbot

Добавим нашего пользователя с именем "PYbot" в группу "sudo":

usermod -aG sudo PYbot

Проверим, что пользователь "PYbot" принадлежит группе "sudo":

groups PYbot

После создания нового пользователя необходимо перезайти на VDS-сервер под созданной учеткой.

Далее в корень папки PYbot склонируем свой репозиторий при помощи команды:

git clone git@github.com:Deimos715/python-bot.git

Перейдем в папку "python-bot":

cd python-bot

Добавим в наш проект виртуальное окружение:

python3 -m venv venv

Выполним его активацию:

source venv/bin/activate

 Если необходимо выполнить его деактивацию, команда будет следующей:

deactivate

Импортируем все зависимости нашего проекта из файла requirements.txt:

pip3 install -r requirements.txt

Наш бот почти установлен, запускаем его:

python3 bot.py

Хотя бот будет функционировать, он перестанет отвечать после завершения сеанса работы с VDS-сервером. Чтобы решить эту проблему, мы воспользуемся системой инициализации systemd, которая широко используется в дистрибутивах Linux. Если вам интересно узнать больше о systemd, вы можете изучить наши статьи "Как создавать файлы модулей systemd" и "Как работать с systemd".

Для обеспечения непрерывной работы бота и автоматического перезапуска в случае сбоя, мы создадим специальную службу:

sudo nano /lib/systemd/system/bot.service

Со следующими настройками:

[Unit]
Description=python-bot
After=network.target

[Service]
Type=simple
User=PYbot
ExecStart=/PYbot/python-bot/venv/bin/python3 /PYbot/python-bot/bot.py
ExecReload=/PYbot/python-bot/bot.py
WorkingDirectory=/PYbot/python-bot/
KillMode=process
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

Описание важных строек службы:

- Description — описание службы.

- User — пользователь из-под которого запущена служба.

- ExecStart и ExecReload — это команды для запуска и перезапуска бота.

- WorkingDirectory — путь к папке в которой файл запуска bot.py.

Для запуска службы выполним 2 команды:

sudo systemctl enable bot.service
sudo systemctl start bot.service

После запуска наш бот будет функционировать без перерыва даже после закрытия терминала. Кроме того, после перезагрузки системы бот автоматически запустится через 5 секунд в соответствии с параметром RestartSec.

Для проверки статусов и логов можно выполнить следующие команды:

systemctl status bot.service
journalctl -u bot.service

Для того чтобы показать последние 10 записей из журнала, можно использовать команду journalctl с опцией -u для указания имени службы и опцией -n для указания количества записей:

journalctl -u bot.service -n 10

Если необходимо следить за новыми записями в реальном времени (аналогично команде tail -f), можно использовать опцию -f:

journalctl -u bot.service -f

Для очистки журнала можно выполнить команду:

sudo journalctl --vacuum-size=0