quick_bot_tutorial/bot_in_docker.md
2025-03-12 16:06:38 +07:00

8.7 KiB
Raw Permalink Blame History

Бот в контейнер для запуска на ВМ

1. Структура проекта

mybot/
├── bot/
   ├── __init__.py
   └── main.py
├── .env                # Файл с переменными окружения
├── requirements.txt
├── Dockerfile
├── docker-compose.yml
└── .gitignore

2. .env файл

BOT_TOKEN=ваш_токен_бота

3. docker-compose.yml


version: '3.8'

services:
  bot:
    build: .
    env_file:
      - .env
    restart: unless-stopped

4. Обновленный Dockerfile


FROM python:3.12-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["python", "-m", "bot.main"]

5. Пример кода бота (bot/main.py)


import os
from aiogram import Bot, Dispatcher, types
from aiogram.filters import Command

# Чтение токена из переменных окружения
BOT_TOKEN = os.getenv("BOT_TOKEN")

bot = Bot(token=BOT_TOKEN)
dp = Dispatcher()

@dp.message(Command("start"))
async def cmd_start(message: types.Message):
    await message.answer("Бот запущен в Docker контейнере!")

async def main():
    await dp.start_polling(bot)

if __name__ == "__main__":
    import asyncio
    asyncio.run(main())

Инструкция по запуску

Создайте файл .env в корне проекта:

echo "BOT_TOKEN=ваш_действительный_токен" > .env
Соберите и запустите контейнер:
docker-compose up --build -d
Проверьте работу бота:
docker-compose logs -f

Важные изменения:

Убраны системные зависимости из Dockerfile (gcc и python3-dev не нужны для простых ботов)

Добавлен env_file в docker-compose.yml для автоматической загрузки переменных из .env

Упрощена структура Dockerfile

Добавлено автоматическое пересоздание контейнера при рестарте (restart: unless-stopped)

Для обновления бота:

Внесите изменения в код или подтяните из GitHub изменения, например:

git pull --rebase git@github.com:vasilytray/quick_bot_tutorial.git

Пересоберите контейнер:

docker-compose up --build -d

Безопасность:

Никогда не коммитьте .env в git

Добавьте .env в .gitignore

Используйте разные .env файлы для разработки и продакшена

Проверка работы:

# Проверить статус контейнера
docker-compose ps
# Посмотреть логи
docker-compose logs -f --tail=50
# Остановить контейнер
docker-compose down

8. Настройка виртуальной машины

Установите Docker:

# Для Ubuntu/Debian
sudo apt-get update
sudo apt-get install docker.io docker-compose -y

Скопируйте файлы проекта на VM:

scp -r mybot/ user@vm_ip:/path/to/project

Откройте доступ к портам (если нужно):

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

Запустите контейнер на VM:

cd /path/to/project
docker-compose up -d --build

проверьте статус контейнера

docker ps

Актуализация бота с github

1. подключить проект на ВМ к git.

В директории /home/mybot/ инициализируем git

git init

В состав Git входит утилита git config, которая позволяет просматривать и настраивать параметры, контролирующие все аспекты работы Git, а также его внешний вид.

Чтобы посмотреть все установленные настройки и узнать где именно они заданы, используйте команду:

git config --list --show-origin

Настроим конкретный проект git под конкретного пользователя локально!:

git config --local user.name "John Doe"
git config --local user.email johndoe@example.com

Локальные настройки будут находиться в Файле config в каталоге Git (т. е. .git/config) репозитория.

Теперь необходимо добавить все наши существующие в дирректории файлы в систему git

git add *

Чтобы проконтролировать, что все файлы добавлены выведем их статус (у добавленных будет статус new file:)

git status

или выведем короткое отображение:

git status -s

при этом добавленные файлы будут иметь пометку 'A'

Останется только закоммитить изменения

git commit -m "first add"

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

2. Подключеие проекта к GitHub

Настройка подключения к GitHub

Для работы с GitHub без необходимости постоянно вводить логин и пароль при синхронизации локального и удаленного репозитория (находящегося на GitHub) нужно выполнить еще одну важную операцию — добавления ssh-ключей на github.com

Сначала нужно сгенерировать ssh-ключи, а затем один из них (публичный) добавить в настройки GitHub.

# Создание ssh-ключей
ssh-keygen -t ed25519  -C "your_email@example.com"
# Дальше будет несколько вопросов. На все вопросы нужно нажимать Enter.

# Запуск агента ssh, который следит за ключами
eval "$(ssh-agent -s)"

# Добавления нового ssh-ключа в агент
ssh-add ~/.ssh/id_ed25519

Когда ssh-ключи созданы и добавлены в систему, можно приступать к интеграции с GitHub. Подробно эта процедура описана в документации. В двух словах:

  1. Выведите содержимое файла ~/.ssh/id_ed25519.pub и скопируйте его:
cat ~/.ssh/id_ed25519.pub

Добавьте ssh-ключ в аккаунт GitHub. При добавлении вас попросят назвать ключ. Напишите что-нибудь в стиле home.

Проверьте, что подключение работает

ssh -T git@github.com
Hi tirion! You've successfully authenticated, but GitHub does not provide shell access.

Есть несколько способов подтянуть репозиторий:

  1. в существующий проект можно подтянуть командой: git pull --rebase git@github.com:vasilytray/quick_bot_tutorial.git возможно появятся коллизии с существующими в дирректории файлами. git предложит удалить файлы, вызывающие коллизии. (возможно необходимо добавить файли в git и закоммитить)
  2. Можно клонировать репозиторий и работать с ним.

Клонируем репозиторий с github

git clone git@github.com:<ИМЯ НА ГИТХАБЕ>/mybot.git

Да добавляем наш файл с секретами .env в проект на ВМ иначе запустить не получиться.

далее запускаем контейнер с ботом как описано выше.

Обновление бота из репозитория GitHub

Подтянем изменения из github

git pull --rebase