Бот на Python с ChatGPT: Докеризация и деплой на VPS [Гайд]
Нейросети

Бот на Python с ChatGPT: Докеризация и деплой на VPS [Гайд]

Razilator

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

Статьи, которые вам необходимы перед изучением этой:

  1. Бот на Python, использующий ChatGPT для Telegram
  2. Установка Docker на Ubuntu 22.04
  3. Установка Docker Compose v2 на Ubuntu 22.04
  4. Версия бота с запоминаем контекста общения (Необязательно).

Напоминаю, что мы имеем следующий код бота chatGPT на aiogram (python)

main.py
import openai
from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher
from aiogram.utils import executor

telegram_token = "Токен от телеграмм бота"
openai.api_key = "Токен от OpenAI ChatGPT"

bot = Bot(telegram_token)
dp = Dispatcher(bot)

@dp.message_handler()
async def send(message : types.Message):
    response = openai.Completion.create(
    model="text-davinci-003",
    prompt=message.text,
    temperature=0.9,
    max_tokens=2000,
    top_p=1.0,
    frequency_penalty=0.0,
    presence_penalty=0.6)
    print(message.text)
    await message.answer(response['choices'][0]['text'])

if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)

Конфигурация Dockerfile для запуска бота на aiogram с нейросетью

Рядом с файлом main.py создаем файл Dockerfile, где мы будем билдить контейнер с Python для запуска проекта со следующим содержимым:

Dockerfile
FROM python:alpine

ENV PYTHONUNBUFFERED=1
ENV PYTHONDONTWRITEBYTECODE=1

# Установим директорию для работы

WORKDIR /telegram_bot

COPY ./requirements.txt ./

# Устанавливаем зависимости и gunicorn
RUN pip install --upgrade pip
RUN pip install --no-cache-dir -r ./requirements.txt

# Копируем файлы и билд
COPY ./ ./

RUN chmod -R 777 ./

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

В первой строке указывается базовый образ python:alpine, который используется для создания контейнера. Alpine - это минималистичный дистрибутив Linux, который предлагает меньший размер и более быстрое время запуска контейнеров.

Далее, в строках ENV PYTHONUNBUFFERED=1 и ENV PYTHONDONTWRITEBYTECODE=1 определяются переменные среды. PYTHONUNBUFFERED устанавливает флаг для Python, чтобы он выводил данные в стандартный поток вывода без буферизации, а PYTHONDONTWRITEBYTECODE отключает создание .pyc-файлов, чтобы избежать проблем с обновлением кода в контейнере.

В строке WORKDIR /telegram_bot устанавливается рабочая директория в контейнере, куда будут копироваться все файлы проекта.

Далее, в строках COPY ./requirements.txt ./ и RUN pip install --no-cache-dir -r ./requirements.txt устанавливаются зависимости проекта. Сначала копируется файл requirements.txt в текущую директорию в контейнере, а затем запускается команда pip install, чтобы установить все зависимости проекта.

В строке COPY ./ ./ копируются все файлы проекта в рабочую директорию в контейнере.

Наконец, в строке RUN chmod -R 777 ./ устанавливается разрешение на чтение, запись и выполнение для всех файлов в рабочей директории проекта в контейнере. Это делается для того, чтобы приложение внутри контейнера имело необходимые права для чтения и записи в файлы.

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

Конфигурация docker-compose для запуска бота на aiogram с нейросетью

Далее нам необходимо сконфигурировать файл запуска нашего бота с нейросетью, для этого рядом с файлами Dockerfile и main.py создаем файл docker-compose.yml со следующим содержимым:

docker-compose.yml
version: "3.9"

services:
  telegram-bot:
    container_name: telegram-bot
    working_dir: /telegram_bot
    restart: always
    build:
        context: .
        dockerfile: Dockerfile
    command: sh -c "python main.py"

Этот код описывает файл docker-compose.yml, который является инструментом для определения и запуска нескольких связанных контейнеров Docker в одном и том же процессе.

Строка version: "3.9" указывает на версию Docker Compose, которая используется для создания и управления контейнерами.

Блок services определяет сервисы, которые будут запущены в контейнерах Docker, в нашем случае, сервис с именем telegram-bot определяется в блоке services.

Строка container_name: telegram-bot задает имя контейнера Docker.

Строка working_dir: /telegram_bot устанавливает рабочую директорию в контейнере.

Строка restart: always задает автоматический перезапуск контейнера в случае его остановки.

Строка build указывает, что контейнер должен быть построен с использованием Dockerfile, находящегося в текущей директории.

Строка context: . указывает на текущую директорию как контекст для сборки.

Строка dockerfile: Dockerfile указывает на имя файла Dockerfile, который будет использоваться для сборки контейнера.

Строка command: sh -c "python main.py" указывает, что при запуске контейнера будет выполнен скрипт main.py с помощью Python, который находится в текущей директории. Команда sh -c используется для запуска нескольких команд в одном процессе shell.

Создание файла requirements.txt для зависимостей

И создадим ещё один файл зависимостей, находясь в нашем виртуальном окружении. Этот файл загрузит в наш билд необходимые библиотеки для работы бота. Для его создания в терминале нашего проекта с ботом введите следующую команду: pip freeze > requirements.txt

В нашем случае получится следующий файл, у вас могут быть версии поновее:

requirements.txt
aiogram==2.25.1
aiohttp==3.8.3
aiosignal==1.3.1
async-timeout==4.0.2
attrs==22.2.0
Babel==2.9.1
certifi==2022.12.7
charset-normalizer==2.1.1
colorama==0.4.6
frozenlist==1.3.3
idna==3.4
magic-filter==1.0.9
multidict==6.0.4
openai==0.26.4
pyTelegramBotAPI==4.10.0
pytz==2022.7.1
requests==2.28.2
tqdm==4.64.1
urllib3==1.26.14
yarl==1.8.2

Копируем telegram бота с ChatGPT на VPS

Далее нам необходимо скопировать эти 3 файла в директорию на виртуальном сервере. Я уже приобрел такой сервер, обычно я беру сервера на timeweb.

Установленная ОС: Ubuntu 22.04.

Чтобы скинуть файлы на сервер, нам необходим клиент для подключения по SSH, например FileZilla или WinSCP.

Я буду использовать FileZilla:

Вводим данные от сервера и подключаемся
Вводим данные от сервера и подключаемся

Обычно я все файлы выкладываю в папку /home/ на сервере. Сюда я их и скопирую, предварительно создав папку telegram_bot.

Создаю папку telegram_bot
Создаю папку telegram_bot
Копирую файлы в папку telegram_bot
Копирую файлы в папку telegram_bot
Скопированные файлы проекта
Скопированные файлы проекта

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

Запускаем telegram бота с ChatGPT на VPS

Далее вам необходимо установить Docker на вашу ОС.

В начале статьи я уже оставил нужные уроки, по которым вам необходимо поставить Docker и Docker Compose. Ставятся они очень быстро без каких либо проблем.

  1. Установка Docker на Ubuntu 22.04
  2. Установка Docker Compose v2 на Ubuntu 22.04

Подключаемся по SSH к серверу и переходим в папку telegram_bot, подключаться можно через CMD на Windows 10/11, пишем следующую команду: ssh root@айпи_или_домен_сервера и чтобы попасть в папку telegram_bot: cd ../home/telegram_bot.

Находимся в папке проекта
Находимся в папке проекта

Далее нам остается лишь последнее, сбилдить проект и запустить его, вводим следующую команду для установки нашего билда с ботом: docker compose build

Процесс создания контейнера
Процесс создания контейнера

После окончания прогресса создания билда, мы запускаем его с помощью следующей команды: docker compose up

Контейнер запускается с нашим ботом
Контейнер запускается с нашим ботом

Проверка работы telegram-бота на aiogram с ChatGPT в Docker контейнере на VPS

Теперь я напишу своему боту что-нибудь:

Бот отвечает нам, находясь на VPS сервере и работя из Docker контейнера
Бот отвечает нам, находясь на VPS сервере и работя из Docker контейнера

На этом всё. Мы быстро развернули проект пошагово в Docker контейнере и проверили его работу. Как видите, я специально вывел функцию print() моих сообщений боту, чтобы наглядно вам показать работу с ботом на сервере.

;