280 lines
8.7 KiB
Markdown
280 lines
8.7 KiB
Markdown
## Бот в контейнер для запуска на ВМ
|
||
|
||
### 1. Структура проекта
|
||
|
||
```py
|
||
mybot/
|
||
├── bot/
|
||
│ ├── __init__.py
|
||
│ └── main.py
|
||
├── .env # Файл с переменными окружения
|
||
├── requirements.txt
|
||
├── Dockerfile
|
||
├── docker-compose.yml
|
||
└── .gitignore
|
||
```
|
||
|
||
### 2. .env файл
|
||
|
||
```py
|
||
BOT_TOKEN=ваш_токен_бота
|
||
```
|
||
### 3. docker-compose.yml
|
||
|
||
```yaml
|
||
|
||
version: '3.8'
|
||
|
||
services:
|
||
bot:
|
||
build: .
|
||
env_file:
|
||
- .env
|
||
restart: unless-stopped
|
||
```
|
||
|
||
### 4. Обновленный Dockerfile
|
||
|
||
```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)
|
||
|
||
```python
|
||
|
||
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 в корне проекта:
|
||
|
||
```bash
|
||
echo "BOT_TOKEN=ваш_действительный_токен" > .env
|
||
Соберите и запустите контейнер:
|
||
```
|
||
```bash
|
||
docker-compose up --build -d
|
||
Проверьте работу бота:
|
||
```
|
||
```bash
|
||
docker-compose logs -f
|
||
```
|
||
|
||
### Важные изменения:
|
||
|
||
Убраны системные зависимости из Dockerfile (gcc и python3-dev не нужны для простых ботов)
|
||
|
||
Добавлен **env_file** в ``docker-compose.yml`` для автоматической загрузки переменных из **.env**
|
||
|
||
Упрощена структура **Dockerfile**
|
||
|
||
Добавлено автоматическое пересоздание контейнера при рестарте **(restart: unless-stopped)**
|
||
|
||
#### Для обновления бота:
|
||
|
||
Внесите изменения в код или подтяните из GitHub изменения, например:
|
||
```sh
|
||
git pull --rebase git@github.com:vasilytray/quick_bot_tutorial.git
|
||
```
|
||
|
||
#### Пересоберите контейнер:
|
||
|
||
```bash
|
||
docker-compose up --build -d
|
||
```
|
||
|
||
### Безопасность:
|
||
|
||
Никогда не коммитьте .env в git
|
||
|
||
Добавьте .env в .gitignore
|
||
|
||
Используйте разные .env файлы для разработки и продакшена
|
||
|
||
### Проверка работы:
|
||
|
||
```bash
|
||
# Проверить статус контейнера
|
||
docker-compose ps
|
||
```
|
||
```sh
|
||
# Посмотреть логи
|
||
docker-compose logs -f --tail=50
|
||
```
|
||
```sh
|
||
# Остановить контейнер
|
||
docker-compose down
|
||
```
|
||
|
||
### 8. Настройка виртуальной машины
|
||
|
||
Установите Docker:
|
||
|
||
```sh
|
||
# Для Ubuntu/Debian
|
||
sudo apt-get update
|
||
sudo apt-get install docker.io docker-compose -y
|
||
```
|
||
|
||
Скопируйте файлы проекта на VM:
|
||
|
||
```sh
|
||
scp -r mybot/ user@vm_ip:/path/to/project
|
||
```
|
||
|
||
Откройте доступ к портам (если нужно):
|
||
|
||
```sh
|
||
sudo ufw allow 80/tcp
|
||
sudo ufw allow 443/tcp
|
||
```
|
||
|
||
Запустите контейнер на VM:
|
||
|
||
```sh
|
||
cd /path/to/project
|
||
docker-compose up -d --build
|
||
```
|
||
|
||
проверьте статус контейнера
|
||
|
||
```sh
|
||
docker ps
|
||
```
|
||
|
||
## Актуализация бота с github
|
||
|
||
### 1. подключить проект на ВМ к git.
|
||
|
||
В директории /home/mybot/ инициализируем git
|
||
```sh
|
||
git init
|
||
```
|
||
|
||
В состав Git входит утилита git config, которая позволяет просматривать и настраивать параметры, контролирующие все аспекты работы Git, а также его внешний вид.
|
||
|
||
Чтобы посмотреть все установленные настройки и узнать где именно они заданы, используйте команду:
|
||
```sh
|
||
git config --list --show-origin
|
||
```
|
||
|
||
Настроим конкретный проект git под конкретного пользователя локально!:
|
||
|
||
```sh
|
||
git config --local user.name "John Doe"
|
||
git config --local user.email johndoe@example.com
|
||
```
|
||
|
||
Локальные настройки будут находиться в Файле config в каталоге Git (т. е. .git/config) репозитория.
|
||
|
||
Теперь необходимо добавить все наши существующие в дирректории файлы в систему git
|
||
```sh
|
||
git add *
|
||
```
|
||
|
||
Чтобы проконтролировать, что все файлы добавлены выведем их статус (у добавленных будет статус new file:)
|
||
```sh
|
||
git status
|
||
```
|
||
или выведем короткое отображение:
|
||
```sh
|
||
git status -s
|
||
```
|
||
при этом добавленные файлы будут иметь пометку 'A'
|
||
|
||
Останется только закоммитить изменения
|
||
```sh
|
||
git commit -m "first add"
|
||
```
|
||
|
||
Далее либо запушить на GitHub в новый репозиторий, либо если на GitHub есть версия данного проекта синхронизировать
|
||
с репозиторием на GitHub.
|
||
|
||
### 2. Подключеие проекта к GitHub
|
||
#### Настройка подключения к GitHub
|
||
|
||
Для работы с GitHub без необходимости постоянно вводить логин и пароль при синхронизации локального и удаленного репозитория (находящегося на GitHub) нужно выполнить еще одну важную операцию — добавления ssh-ключей на github.com
|
||
|
||
Сначала нужно сгенерировать ssh-ключи, а затем один из них (публичный) добавить в настройки GitHub.
|
||
|
||
```sh
|
||
# Создание 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 и скопируйте его:
|
||
```sh
|
||
cat ~/.ssh/id_ed25519.pub
|
||
```
|
||
|
||
[Добавьте ssh-ключ в аккаунт GitHub.](https://github.com/settings/keys) При добавлении вас попросят назвать ключ. Напишите что-нибудь в стиле home.
|
||
|
||
Проверьте, что подключение работает
|
||
```sh
|
||
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
|
||
```sh
|
||
git clone git@github.com:<ИМЯ НА ГИТХАБЕ>/mybot.git
|
||
```
|
||
|
||
Да добавляем наш файл с секретами ``.env ``в проект на ВМ иначе запустить не получиться.
|
||
|
||
далее запускаем контейнер с ботом как описано выше.
|
||
|
||
#### Обновление бота из репозитория GitHub
|
||
|
||
Подтянем изменения из github
|
||
```sh
|
||
git pull --rebase
|
||
``` |