С появлением на нашем хостинге возможности запуска Фоновых процессов, процесс запуска различных ботов, таких как ботов для Telegram, Discord, FB и т.п значительно упростился.
Как правило бот - это отдельный от сайта процесс, который должен работать 24/7, но у которого нет веб-интерфейса и который не должен быть доступен по http(s) снаружи по доменному имени. Но с другой стороны, бот, как и любое программное обеспечение, может содержать ошибки и при возникновении ошибок падать, поэтому очень важно в этом случае его автоматически перезапустить. Кроме того, бот пишет свои логи и к ним необходим прямой доступ, чтобы иметь возможность отслеживать его состояние. Ну и конечно, в случае если сервер хостинга будет перезагружен, либо контейнер для ваших сайтов на хостинге по какой-то причине остановлен, а затем запущен вновь, бот должен незамедлительно стартовать. Все эти вещи обеспечиваются Фоновыми процессами.
Фоновые процессы привязаны к сайтам, а сайты располагаются внутри контейнеров. Если нам требуется бот на python, первым делом необходимо создать сайт, который будет работать на python. Ознакомиться с процессом создания сайта на python (django) можно в этой статье.
Далее мы будем считать, что сайт создан и нужная версия python установлена и настроена, вы зашли на сервер по ssh и установили все необходимые базовые пакеты через pip install
.
В этой статье рассматривается создание и запуск бота для Discord, но общий подход для запуска других ботов, например бота для Telegram, ничем не отличается. Для Discord бота нам потребуется установить пакет discord
, что мы и сделаем, перейдя в каталог приложения нашего сайта:
cd site.ru/app
pip install "discord>=2"
Теперь создадим скрипт, который будет нашим минимальным ботом. Пусть он выглядит так:
import discord
intents = discord.Intents.default()
intents.message_content = True
client = discord.Client(intents=intents)
@client.event
async def on_ready():
print(f'We have logged in as {client.user}')
@client.event
async def on_message(message):
if message.author == client.user:
return
if message.content.startswith('$hello'):
await message.channel.send('Hello!')
client.run('your token here')
Этот бот не делает ничего, кроме того, что если вы напишите сообщение в дискорд сервер, к которому подключен ваш бот, которое начинается с фразы “$hello”, бот ответит вам сообщением “Hello!”. В последней строке кода вместо 'your token here'
вам необходимо прописать ваш токен для API Discord. Если в итоге файл создан и назван my_bot.py
, то запустить его очень просто:
python my_bot.py
Начало положено. Но теперь, если мы закроем ssh-консоль, процесс бота будет завершен и бот перестанет работать. Давайте сделаем так, чтобы бот работал постоянно.
Для этого переходим в раздел Хостинг, далее выбираем контейнер в котором был создан сайт, а в контейнере в списке сайтов выбираем тот сайт, в рамках которого будет запущен процесс бота. И переходим во вкладку “Фоновые процессы”:
Теперь нажимаем на кнопку “Добавить процесс” и перед нами окрывается окно настроек:
Всё что нам осталось сделать для запуска бота, это написать команду, которая будет его запускать. Команда будет выглядеть следующим образом:
cd ~/site.ru/app && python my_bot.py
Если в коде бота не было ошибок и все остальное вы сделали по инструкции, после нажатия на кнопку “Добавить и запустить”, процесс бота будет запущен.
В окне, где мы подключены к серверу по ssh, мы запускаем следующую команду:
ls -l ~/site.ru/log
Нам будет показан список папок с логами. Для фоновых процессов название папок имеет вид service-ID-runlog
, где ID - уникальный идентификатор процесса, который для каждого процесса отображается в списке процессов в Личном кабинете. Теперь запустим команду:
tail -f ~/site.ru/log/service-ID-runlog/current
И на экране будет отображаться лог бота, обновляемый в реальном времени.
Когда вы вносите изменения в код бота, по умолчанию процесс бота в памяти о них ничего знать не будет. Чтобы бот подхватил изменения, нужно его перезапустить. Для этого есть несколько способов:
touch ~/site.ru/reload
. Эта команда перезапустит ваш сайт и все фоновые процессы, привязанные к этому сайту.