Pull to refresh

Как мы решили вопрос с размещением Телеграм-бота

Level of difficultyEasy
Reading time6 min
Views7.4K

Деплой бота в интернет: История и Текущее Решения

Введение

Важность присутствия в интернете и доступность для широкой аудитории 24/7, сложно переоценить. Однако эта статья предназначена для начинающих разработчиков, делающих свои первые шаги в мире создания и развертывания чат-ботов.

Для опытных разработчиков, уже имеющих собственные решения и методы работы, материал покажется базовым. Я поделюсь своим опытом организации работы чат-бота @world_for_life_bot, предлагая это как пример базового решения. Моя цель - показать, как можно развернуть бота за 15-30 минут, включая установку всех необходимых зависимостей.

А что тут можно сделать?

В начале развития интернет-сервисов, разработчики имели доступ к множеству стабильных и бесплатных ресурсов, которые предлагали неплохую поддержку. Эти платформы позволяли быстро и без значительных затрат запускать различные онлайн-проекты, включая чат-ботов. К примеру я еще застал работу сервиса Heroku с бесплатным тарифом. Однако со временем ситуация изменилась. Бесплатные тарифы канули в лету. Конечно и сейчас можно встретить сервисы, на которые можно задеплоить бота бесплатно, но это скорее для тестов, чем для тестирования продакшен решения, т.к. они имеют кучу ограничений по времени беспрерывной работы скриптов, сложности проекта и отсутствует поддержка БД и брокеров.

Новые Времена - Новые Требования

Сегодня, в мире, где конкуренция растет с каждым днем, важно не только создать функционального бота, но и обеспечить его стабильную и надежную работу. Именно поэтому многие разработчики отдают предпочтение виртуальным выделенным серверам (VDS) даже на минимальных тарифах. VDS предоставляет больше контроля, мощности и гибкости для масштабирования проекта.

Выбор и Настройка VDS

Я осознано не стану называть провайдера, которым я пользуюсь. Меня все устраивает. Но вы сами можете выбрать тот, который считаете наиболее подходящим для вас. При выборе VDS важно обратить внимание на следующие аспекты:

  1. Надежность Провайдера: Изучите отзывы и репутацию провайдера.

  2. Технические Характеристики: Убедитесь, что сервер соответствует требованиям вашего проекта.

    По своему опыту скажу что самый базовый бот, без БД может уместиться на 1CPU, 0.5GB ОЗУ и 10GB SSD

    Бот посложнее с БД запросит 1-2CPU, 2GB ОЗУ и 15GB SSD. С включением дополнительных компонент могут происходить и другие изменения в требованиях, например инсталляция MongoDB, потребовала наличия AVX инструкций на CPU, что было невозможно на базом тарифе и стоило мне почти 70руб ежемесячно плюсом.

    Далее все зависит от ваших желаний, локальные инстансы ИИ могут потребовать GPU, но это отдельная тема и стоимость. Для первых шагов вам вполне подойдет база

  3. Ценовая Политика: Сравните цены и выберите оптимальный тариф. На старте для 4 ботов я уложился в 170 рублей в месяц, включая статический IP. С ростом моих запросов и запросов ПО стоимость доросла до 600 рублей месяц, но у меня есть теперь примерно 100% запаса емкости по любому параметру, что меня вполне устраивает.

  4. Местоположение серверов: этот пункт стал очень актуален последнее время, т.к если ваш сервис, предполагает взаимодействие с другими интернет ресурсами, то возможно стоит выбирать провайдера в том информационном пространстве, с элементами которого ему предстоит взаимодействовать.

  5. Поддержка и Служба Помощи: Наличие квалифицированной технической поддержки. Проблемы и вопросы, как бы вы не хотели их избежать, будут. Раз в год-два, примерно, я всё-таки обращаюсь в ТП и мне очень нравится, что они оперативно 24/7 решают их, самостоятельно эскалируя те, которые не могут решить.

После выбора подходящего VDS следует настроить его согласно потребностям вашего бота. Это включает установку необходимого программного обеспечения, настройку безопасности и т.д. Я использовал ОС Ubuntu, т.к. она входит в базовый старт-комплект провайдера, я привык с ней работать и меня устраивает наличие модулей из коробки. Но это не значит, что вам стоит переходить с той ОС, с которой у вас уже налажено взаимодействие.

Деплой на Сервер

Копирование кода:

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

Поэтому генерируем ключи на сервере:

ssh-keygen 

Оставляем все по умолчанию. Потом копируем ключ:

cat /root/.ssh/id_rsa.pub 

И добавляем его в список разрешенных ключей в своем профиле GitHub:

Settings -> SSH and GPG Keys -> New SSH key

Не забудем скопировать ссылку на клонирование репозитория:

Your Repositories -> <Имя бота> -> <> Code -> Local -> SSH

Идем в консоли сервера в каталог, где будет жить бот и клонируем код проекта:

cd /home/programms/bots/
git clone git@github.com:<your_account>/world_for_life_bot.git

Теперь в папке, где вы находитесь появилась папка с названием репозитория в которой есть все файлы, из вашего репозитория GitHub

При помощи файлового менеджера переносим в основной каталог проекта дополнительные файлы, которые вы не хотите шарить на GitHub. У меня это только 1 файл, в котором я храню токен от бота.

Подготовка виртуального окружения

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

Переходим в папку с проектом на сервере, создаем виртуальное окружение и временно активируем его для настройки и тестирования

cd /home/programms/bots/world_for_life_bot/
python3.10 -m venv venv
source activate venv/bin/activate

В штатном режиме запуск виртуального окружения происходит в скрипте сервиса (о нем я расскажу чуть позже). Но вы можете использовать ручную загрузку виртуальной среды при исследовании проблем с запуском бота, например после обновления, а также вам это понадобится для изменений виртуального окружения

Устанавливаем зависимости, которые вы ранее сохранили в файл, к примеру requirements.txt командой pip freeze > requirements.txt

pip install -r requirements.txt

Тестовый запуск бота

Все! Ваш бот готов к запуску. Не выходя из виртуального окружения проведите стартовый запуск бота (в примере бот запускается скриптом start.py)

python start.py

Если вы все сделали правильно, ваш бот будет доступен онлайн в телеграме

Запускаем бота как сервис

Сидеть и смотреть что ваш сервис работает, занятие неблагодарное. Запуск при старте системы и перезапуск, если что-то пошло не так, лучше доверить самой системе. Я привлекаю для этой работы подсистему инициализации и управления службами в Linux systemd. В корне проекта я добавляю файл world_for_life.service, который в последствии всегда доступен на сервере.

Вот пример такого скрипта (я привожу минимально рабочую версию, но с развитием вашего бота будет модифицироваться и скрипт сервиса)

[Unit]
Description=world_for_life_bot
After=syslog.target
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/home/programms/bots/world_for_life_bot
ExecStart=/home/programms/bots/world_for_life_bot/venv/bin/python3 /home/programms/bots/world_for_life_bot/bot.py
Restart=always

[Install]
WantedBy=multi-user.target

Копируем скрипт сервиса и запускаем его

cp /home/programms/bots/world_for_life_bot/world_for_life.service /etc/systemd/system/
systemctl daemon-reload
systemctl enable world_for_life.service 
systemctl start world_for_life.service 

Теперь ваш бот работает в виде сервиса. Проверить его состояние можно так

systemctl status world_for_life.service

Перезапустить при обновлениях можно командой

systemctl restart world_for_life.service 

Бэкап MongoDB Системными Средствами

Одним из ключевых моментов обеспечения надежности работы бота является регулярное создание резервных копий баз данных. Для MongoDB можно использовать системные средства, такие как mongodump и mongorestore, для создания и восстановления бэкапов.

Чтобы не изобретать велосипед, воспользуемся встроенными средствами. Я использую Crone для выполнения этой работы. Весь процесс будет выполняется в 4 команды.

Открываем crontab для редактирования

crontab -e

И добавляем в конец файла следующие команды для выполнения

5 4 * * * mongodump --out /home/programms/dumps/`date +"%m-%d-%y"`
15 4 * * * zip -r /home/programms/dumps/`date +"%m-%d-%y"`.zip /home/programms/dumps/`date +"%m-%d-%y"`/
30 4 * * * rm -r /home/programms/dumps/`date +"%m-%d-%y"`
35 4 * * * find /home/programms/dumps/ -mtime +7 -exec rm -rf {} \;

Сохраняем файл. Посмотреть содержание файла можно командой

crontab -l

Что мы делаем?

  1. Первая команда в 04:05 ежедневно делает бэкап БД

  2. Вторая команда в 04:15 упаковывает бэкап в zip

  3. Третья команда в 04:30 удаляет незипованный бэкап

  4. Четвертая команда 04:35 удаляет все копии бэкапа старше 7 дней

Таким образом у вас на диске всегда будут храниться 8 бэкапов за последнюю неделю

Заключение

Не стоит недооценивать сколько времени может вам сэкономить удобная и отлаженная система деплоя. И уверен вы будете развивать ее не меньше чем основной код, по мере роста вашего проекта. Однако, нужно с чего-то начинать. Надеюсь для вас было полезно почитать.

И как всегда - буду рад за конструктив в комментариях, а также ваш опыт в разработке и продвижении телеграм-проектов!

Предыдущие статьи

Как мы запускали серьезный проект в Telegram

Как мы решали вопрос многоязычности в боте

Tags:
Hubs:
Total votes 25: ↑17 and ↓8+10
Comments15

Articles