Бот на Python с ChatGPT: Докеризация и деплой на VPS [Гайд]
В данной статье мы научимся упаковывать нашего бота с ChatGPT на основе aiogram с помощью Docker-контейнера и запустим его на виртуальном сервере в интернете, чтобы он был доступен для использования 24/7 из любой точки мира.
Если вы хотите выразить благодарность автору сайта, статей и курса по Django, вы можете сделать это по ссылке ниже:
Статьи, которые вам необходимы перед изучением этой:
- Бот на Python, использующий ChatGPT для Telegram
- Установка Docker на Ubuntu 22.04
- Установка Docker Compose v2 на Ubuntu 22.04
- Версия бота с запоминаем контекста общения (Необязательно).
Напоминаю, что мы имеем следующий код бота chatGPT на aiogram (python)
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 для запуска проекта со следующим содержимым:
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 со следующим содержимым:
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
В нашем случае получится следующий файл, у вас могут быть версии поновее:
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.
Далее перейдем к запуску. Мы должны будем подключиться через терминал по SSH протоколу на наш сервер.
Запускаем telegram бота с ChatGPT на VPS
Далее вам необходимо установить Docker на вашу ОС.
В начале статьи я уже оставил нужные уроки, по которым вам необходимо поставить Docker и Docker Compose. Ставятся они очень быстро без каких либо проблем.
Подключаемся по 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
Теперь я напишу своему боту что-нибудь:
На этом всё. Мы быстро развернули проект пошагово в Docker контейнере и проверили его работу. Как видите, я специально вывел функцию print()
моих сообщений боту, чтобы наглядно вам показать работу с ботом на сервере.