8.7 KiB
Бот в контейнер для запуска на ВМ
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. Подробно эта процедура описана в документации. В двух словах:
- Выведите содержимое файла ~/.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.
Есть несколько способов подтянуть репозиторий:
- в существующий проект можно подтянуть командой:
git pull --rebase git@github.com:vasilytray/quick_bot_tutorial.git
возможно появятся коллизии с существующими в дирректории файлами. git предложит удалить файлы, вызывающие коллизии. (возможно необходимо добавить файли в git и закоммитить)- Можно клонировать репозиторий и работать с ним.
Клонируем репозиторий с github
git clone git@github.com:<ИМЯ НА ГИТХАБЕ>/mybot.git
Да добавляем наш файл с секретами .env
в проект на ВМ иначе запустить не получиться.
далее запускаем контейнер с ботом как описано выше.
Обновление бота из репозитория GitHub
Подтянем изменения из github
git pull --rebase