Как запустить ChatGPT-бота на сервере? Программирование с нуля для начинающих. Python + Telebot + демон PM2

В этом уроке по программированию с нуля я покажу, как запустить на сервере Телеграм-бота, использующего API ChatGPT, и как настроить специальный сервис «демон» (daemon) для его бесперебойной работы. Урок будет полезен, если вы хотите сделать пет-проект или MVP своими руками, умеете писать Телеграм-боты на Python, но не знаете, как работать с сервером.

План урока:

Меня очень вдохновила реакция на предыдущую статью «Обучение программированию с нуля. Вы напишете MVP для стартапа на Python за 1 день. OpenAI API + Google API». Я решил поднять планку контента и добавить видео.

Запускаем ChatGPT на сервере. Пишем Telegram bot на Python, используем демон pm2
Игорь Диев
Запускаю стартапы и учу новичков программированию. Подпишитесь на мои linkedin или телеграм. Это вдохновит на новые материалы 🤗

Постановка задачи — зачем что-то выкладывать на сервер?

Представьте, вы написали первую программу, и вы решаете ее показать друзьям, коллегам или, например. потенциальным инвесторам. Они смогут посмотреть ее только тогда, когда она запущена. Допустим, они решат ее посмотреть в выходные, и если у вас не будет включен компьютер, то программа работать не будет. Для этого мы и выкладываем ее на сервер.

Аренда виртуального выделенного сервера

Я не буду делать объективных обзоров или рейтингов провайдеров серверов. Моя цель — показать, что лично я делаю для достижения результата, какими сервисами и решениями пользуюсь. Мы будем использовать ruvds, это не реклама, просто мне их сервис кажется удобным.

Заходим на ruvds. com.

Как запустить ChatGPT-бота на сервере? Программирование с нуля для начинающих. Python + Telebot + демон PM2

Регистрируемся или авторизуемся.

Как запустить ChatGPT-бота на сервере? Программирование с нуля для начинающих. Python + Telebot + демон PM2

Нажимаем на кнопку «Заказать сервер». Выбираем страну.

Как запустить ChatGPT-бота на сервере? Программирование с нуля для начинающих. Python + Telebot + демон PM2

Выбираем параметры, можно выбрать базовые настройки, например, 1 Gb RAM, 2CPU, 20Gb жесткий диск.

Как запустить ChatGPT-бота на сервере? Программирование с нуля для начинающих. Python + Telebot + демон PM2

Для базовых задач с запасом подойдет сервер с таким набором параметров. Но можно еще покопаться в настройках, еще урезать параметры и получить максимально дешевый сервер с 1 ядром, 0,5 Гб оперативной памяти, 10 Gb диска. Для этого нужно выбрать сразу Ubuntu в качестве операционной системы.

Выбираем чистую операционную систему Ubuntu. Нам не нужно, чтобы Python или какие-то еще программы были установлены, мы это все будем ставить с нуля.

Как запустить ChatGPT-бота на сервере? Программирование с нуля для начинающих. Python + Telebot + демон PM2

Обратите внимание, что во многих уроках предлагается арендовать хостинг, а не виртуальный выделенный сервер. На хостинге будет сразу установлен Python и кажется, что это удобно. Но на деле, если вам, например, понадобится другая версия Python, вы не сможете ничего именить, т. к. у вас не будет прав root. Root — это главный пользователь сервера с максимальными правами. К тому же, т. к. нам нужно будет ставить много разных программ, нет никакой гарантии, что хостинг разрешит вам это сделать без root-доступа.

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

После оплаты сервер начнет создаваться. Изучите появившийся экран, самая важная информация — это пароль от root и ip-адрес. Их нужно сохранить в отдельный файлик, например в блокнот.

Как запустить ChatGPT-бота на сервере? Программирование с нуля для начинающих. Python + Telebot + демон PM2

Написание программы (Телеграм-Бот, использующий ChatPGT)

Обратите внимание, мы не будем для этого урока использовать программу из прошлой статьи (Обучение программированию с нуля. Вы напишете MVP для стартапа на Python за 1 день. OpenAI API + Google API). Ее мы будем выкладывать на сервер позднее, т. к. для нее процесс будет сложнее.

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

Процесс создания программы вам уже знаком по предыдущей статье, кратко по нему еще раз пройдемся:

  1. Авторизуемся на сайте OpenAI, заходим в раздел API Keys, получаем ключ.
  2. Заходим в PyCharm, создаем новый проект. Называем его, например, ChatGPTHashtags.
  3. Жмем File > New, создаем файл config. py. В нем создаем переменную openai_token и сохраняем в нее наш ключ.
  4. Заходим в Open AI Playground. Создаем и тестируем промпт на примере нейросети da_vinci. У меня получился такой: I give you a post in Russian. You translate it to English. AND you also add appropriate hashtags.
  5. Копируем код с помощью кнопки View code. Вставляем его в main. py.
  6. Оборачиваем обращение к нейросети в функцию make_post. В качестве аргумента получаем пост, в качестве result передаем ответ от нейросети.
  7. Импортируем токен OpenAI (Api key) в основном коде.
  8. Заходим в @botfather в Телеграме, создаем нового бота, получаем токен.
  9. Добавляем токен в config. py. Импортируем токен Telegram в основном коде.
  10. Пишем функции для команды start и для типа контента text.
  11. Пишем bot. polling().
  12. Устанавливаем модули telebot и openai командами pip3 install telebot и pip3 install openai. Важно делать это в режиме активированной виртуальной среды (venv).

Так как цель данной статьи — показать, как публиковать программу на сервере, а не как ее написать, я не даю подробных комментариев по приведенному выше тексту. Подробный и исчерпывающий гайд вы можете найти в предыдущей статье.

Тестируем бота в видим, что он генерирует нужный нам результат.

Тестируем бота, генерирующего перевод постов и добавляющего хештеги
Тестируем бота, генерирующего перевод постов и добавляющего хештеги

Бот перестанет работать, когда мы выключим PyCharm. Дальше мы узнаем как сделать так, чтобы он работал 24/7.

Код для нейросети da_vinci:

import telebot import config import openai openai.api_key = config.openai_token bot = telebot.TeleBot(config.tg_token) def make_post(text): response = openai.Completion.create( model="text-davinci-003", prompt="We are making a post for Instagram. " "I give you a post in Russian. " "You translate it to English. " "AND you also add appropriate hashtags.\n" + text + "\n", temperature=0.7, max_tokens=256, top_p=1, frequency_penalty=0, presence_penalty=0 ) return response['choices'][0]['text'] @bot.message_handler(commands=['start']) def show_start(message): bot.send_message(message.chat.id, text="Введите любой пост на русском. Я переведу" "его на английский и добавлю хештеги") @bot.message_handler(content_types=['text']) def show_response(message): bot.send_message(message.chat.id, text=make_post(message.text)) bot.polling()

Код для нейросети Chat GPT-3.5-turbo:

import telebot import config import openai openai.api_key = config.openai_token bot = telebot.TeleBot(config.tg_token) def make_post(text): response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[ {"role": "user", "content": "We are making a post for Instagram. " "I give you a post in Russian. " "You translate it to English. " "AND you also add appropriate hashtags.\n" + text + "\n"} ] ) return response.choices[0].message.content @bot.message_handler(commands=['start']) def show_start(message): bot.send_message(message.chat.id, text="Введите любой пост на русском. Я переведу" "его на английский и добавлю хештеги") @bot.message_handler(content_types=['text']) def show_response(message): bot.send_message(message.chat.id, text=make_post(message.text)) bot.polling()

Если нейросеть будет возвращать кавычки, которые нам не нужны, можно будет прописать такой код:

@bot.message_handler(content_types=['text']) def show_response(message): bot.send_message(message.chat.id, text=(make_post(message.text).replace('"', '')))

Эмулируем Linux на Windows, разбираемся в командах

Данный блок только для пользователей WIndows. Пользователи Mac могут переходить сразу к следующей части, т. к. Mac OS — это Unix-подобная система и на нее не нужно ставить эмуляцию Unix/Linux. Все команды в Mac нужно выполнять в Терминале. Если что-то не сработает, попробуйте установить Java JDK. Если не получится, пишите в комментариях, я помогу разобраться.

Набираем в разделе «Поиск» на панели быстрого запуска слово cmd.

Как запустить ChatGPT-бота на сервере? Программирование с нуля для начинающих. Python + Telebot + демон PM2

Нажимаем на слово «Командная строка», открываем Терминал.

В Терминале пишем wsl --install.

Как запустить ChatGPT-бота на сервере? Программирование с нуля для начинающих. Python + Telebot + демон PM2

WSL (Windows Subsystem for Linux) — это как бы Linux/Unix на Windows. В Unix проще выполнять некоторые команды, которые нам нужны для работы с сервером. Да и в целом, это полезная вещь, например, на сайте OpenAI многие команды написаны именно для Unix:

Команды с сайта Open AI
Команды с сайта Open AI

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

Входим в Unix через командную строку Windows
Входим в Unix через командную строку Windows

Теперь выполните следующую команду (напишите ее в терминале и нажмите Enter):

sudo apt install ssh​

Apt install — это команда, которая устанавливает одобренные Unix дистрибутивы. SSH нужен нам для безопасного доступа к серверу.

Теперь достаем из файлика, куда мы сохранили IP и пароль, наши данные. Либо заходим в личный кабинет хостинг-провайдера и берем их там.

Как запустить ChatGPT-бота на сервере? Программирование с нуля для начинающих. Python + Telebot + демон PM2

Выполняем команду

ssh root@ip-адрес-сервера

Система попросит ввести пароль от сервера. Вводим его и жмем Enter.

Обратите внимание, что пароль не отображается на экране в целях безопасности даже в виде звездочек. Еще интересно, что в эмуляции Unix операции «копировать» и «вставить» могут выполняться просто правой кнопкой мыши, это может стать для вас неожиданностью. Нажатием кнопки »вверх» на клавиатуре вы можете увидеть предыдущие выполненные команды, а кнопка «tab» просит Unix дополнить начатую строку.

Если все прошло успешно, вы попадете на сервер и увидите префикс с именем сервера.

Вошли на виртуальный выделенный сервер
Вошли на виртуальный выделенный сервер

Устанавливаем Python на сервер с Ubuntu, устанавливаем модули

Установка Python на сервер

Процесс установки Python состоит из нескольких этапов.

Сначала мы заходим на сервер (см. инструкцию выше) и вводим следующую команду:

sudo apt-get install software-properties-common

Эта команда установит программу, которая нам позволит управлять PPA-пакетами, с помощью которых мы будем устанавливать Python. Разница между PPA и Apt install в том, что PPA позволяет ставить неодобренные Unix программы. Последние версии Python не получалось ставить через простой Apt install, поэтому я воспользовался этим методом.

Далее пишем

sudo add-apt-repository ppa:deadsnakes/ppa -y

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

Ставим Python.

sudo apt install python3.10

Проверяем, что Python работает. Набираем python3, видим, что в терминале появились три скобки >>> в начале строки. Можем написать 3+5, если получим ответ 8, значит Python работает.

Создаем на сервере папку для нашего проекта и заходим в нее с помощью команд mkdir (make directory) и cd (change directory).

mkdir HTbot cd HTbot

Уходим с сервера, возвращаемся в WSL. Командой cd переходим в папку нашего проекта ChatGPTHashtags. У меня команды такие. У вас могут быть другие, в зависимости от того, куда вы положили ваш проект.

cd PycharmProjects cd ChatGPTHashtags

Копируем файлы программы на сервер.

scp main.py root@193.___.___.___:HTbot scp config.py root@193.___.___.___:HTbot

При копировании система попросит ввести пароль от сервера. Вы знаете, где его искать. Обратите внимание на синтаксис этой операции, если куда-то добавить лишний /, например, то все скопируется не туда.

Возвращаемся на сервер с помощью ssh.

ssh root@ip-адрес-сервера

Установка pip

Пишем стандартную команду, все должно пройти успешно. Система попросит ввести Y для подтверждения операции.

sudo apt install pip

Установка виртуальной среды (venv) на сервер

С виртуальной средой вы уже знакомы. Если нет — читайте подробный гайд Обучение программированию с нуля. Вы напишете MVP для стартапа на Python за 1 день. OpenAI API + Google API.

Работа с виртуальной средой на сервере состоит из 3-х этапов: мы ее устанавливаем, мы ее создаем и мы ее активируем.

Установка виртуальной среды. По какой-то причине работает только для версии 3.8, поэтому пишем команду так:

apt install python3.8-venv

Создание venv. Обратите внимание, что лучше это делать, находясь в нашей папке HTbot.

python3 -m venv venv

Если команда прошла успешно, ничего не произойдет, вы увидите новую пустую строку.

Если после любой из команд возникает ошибка, которую не получается исправить. вы всегда можете перезапустить сервер и попробовать все с начала. Важно следить за тем, все ли префиксы указаны в командах, правильно ли прописаны пути. Еще один способ решить возникающие проблемы — это команды sudo apt update и sudo apt upgrade. Также сервер может ругаться, что у вас неправильно прописано имя хоста. Решается путем команды sudo nano etc/hosts. В открывшемся файле нужно добавить строчку, написать 127.0.1.1 ruvds-____ — имя вашего хоста, которое вы видите в терминале, когда заходите на сервер.

Теперь активируем venv.

source venv/bin/activate

Делаем мы это из той папки, в которой создавали venv. Если все прошло успешно, вы видите префикс (venv) в начале строки в терминале.

Как запустить ChatGPT-бота на сервере? Программирование с нуля для начинающих. Python + Telebot + демон PM2

Устанавливаем модули (важно, что после активации venv).

pip3 install telebot pip3 install openai

Создаем демона (daemon) для бесперебойной работы программы на сервере

Как запустить ChatGPT-бота на сервере? Программирование с нуля для начинающих. Python + Telebot + демон PM2

Выполняем несколько команд. Сначала:

sudo apt install npm

Npm — это программа для установки пакетов Node. js. Наш менеджер демонов pm2 — это как раз программа для проектов, написанных на Node. js. Но и для Python решение подойдет.

Устанавливаем pm2:

npm install pm2 -g

Запускаем нашу программу из корневой директории. Чтобы вернуться в корневую директорию (вернее подняться на уровень выше) наберите:

cd ..

Теперь пишем

pm2 start HTbot/main.py

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

pm2 startup pm2 save

Проверим, как работает бот.

От сервера отсоединился, а бот работает!
От сервера отсоединился, а бот работает!

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

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

Бот из данного урока:

Примеры следующих тем:

  • Подключаем базу данных.
  • Используем GIT.
  • Улучшаем код по рекомендациям профессиональных программистов.
  • Доработка программы Linguo Raccoon — выбор языка, выбор количества слов в словаре, улучшение интерфейса через inline-кнопки.
  • Добавляем новые тесты.
  • Реализация таймера для отправки сообщений по расписанию.
  • Генерация аудио и распознавание голосовых сообщений.
  • Обработка word chunks и идиом.

Пишите, какая интересней, и я ее приоритизирую.

Всем ❤

3434
24 комментария

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

Почитайте про systemctl: всего-то надо, что создать один файл /etc/systemd/system/mysuperbot и выполнить одну команду systemctl start mysuperbot

Кстати именно так запускается в режиме демона мой бот, который делает стикеры из фотографий с помощью Stable Diffusion: https://t.me/magic_sticker_bot?start=refVC

3
Ответить

Бот хороший, спасибо!

1
Ответить

В чем минусы использования pm2 для этой задачи?

А в файле systemctl что нужно прописать? Его же не просто нужно создать, его нужно заполнить. По количеству действий ваш способ будет более удобный и простой?

Ответить

Вообще, хорошая идея, спасибо.
Добавлю как альтернативный способ. Пусть люди сами решают, что удобнее.

Ответить

сверхразумно!

3
Ответить

Игорь, спасибо за полезный контент!

2
Ответить

Завтра попробую, спс

2
Ответить