From f7847226d0569be689be807a3470273aaca7def6 Mon Sep 17 00:00:00 2001 From: "mamonov.ep" Date: Thu, 4 Dec 2025 11:16:14 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20Docker=20Compose=20=D0=B4=D0=BB=D1=8F=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D0=BE=D0=B3=D0=BE=20=D1=80=D0=B0=D0=B7=D0=B2?= =?UTF-8?q?=D1=91=D1=80=D1=82=D1=8B=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Создано: - Dockerfile для контейнеризации бота - docker-compose.yml с сервисами bot и db - .dockerignore для оптимизации образа - README_DOCKER.md с подробной документацией Изменено: - README.md - добавлена секция Docker - .env.example - добавлены переменные PostgreSQL Теперь бот можно запустить одной командой: docker-compose up -d 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .dockerignore | 46 ++++++++++++ .env.example | 9 ++- Dockerfile | 22 ++++++ README.md | 26 ++++++- README_DOCKER.md | 174 +++++++++++++++++++++++++++++++++++++++++++++ docker-compose.yml | 40 +++++++++++ 6 files changed, 314 insertions(+), 3 deletions(-) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 README_DOCKER.md create mode 100644 docker-compose.yml diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..630e089 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,46 @@ +# Git +.git +.gitignore + +# Python +__pycache__ +*.pyc +*.pyo +*.pyd +.Python +*.so +*.egg +*.egg-info +dist +build +.venv +venv +env + +# IDE +.vscode +.idea +*.swp +*.swo +*~ + +# Environment +.env + +# Logs +logs +*.log + +# Database +*.db +*.sqlite3 + +# Documentation +TZ.md +README.md +промпт.txt + +# Docker +Dockerfile +docker-compose.yml +.dockerignore diff --git a/.env.example b/.env.example index ea85242..dd56569 100644 --- a/.env.example +++ b/.env.example @@ -4,8 +4,13 @@ BOT_TOKEN=your_telegram_bot_token_here # OpenAI API Key OPENAI_API_KEY=your_openai_api_key_here -# Database -DATABASE_URL=postgresql+asyncpg://user:password@localhost:5432/language_bot +# Database (для локального запуска) +DATABASE_URL=postgresql+asyncpg://botuser:botpassword@localhost:5432/language_bot + +# PostgreSQL настройки (для Docker) +POSTGRES_USER=botuser +POSTGRES_PASSWORD=botpassword +POSTGRES_DB=language_bot # Settings DEBUG=True diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..6d5422b --- /dev/null +++ b/Dockerfile @@ -0,0 +1,22 @@ +FROM python:3.11-slim + +# Установка рабочей директории +WORKDIR /app + +# Установка зависимостей системы +RUN apt-get update && apt-get install -y \ + gcc \ + postgresql-client \ + && rm -rf /var/lib/apt/lists/* + +# Копирование файла зависимостей +COPY requirements.txt . + +# Установка Python зависимостей +RUN pip install --no-cache-dir -r requirements.txt + +# Копирование кода приложения +COPY . . + +# Команда запуска +CMD ["python", "main.py"] diff --git a/README.md b/README.md index e8d6366..e2381d1 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,31 @@ ## Установка и запуск -### 1. Клонирование репозитория +### 🐳 Docker Compose (рекомендуется) + +```bash +# Клонировать репозиторий +git clone http://103.137.249.134:3000/NANDI/tg_bot_language.git +cd tg_bot_language + +# Настроить .env +cp .env.example .env +# Отредактируйте .env и добавьте BOT_TOKEN и OPENAI_API_KEY + +# Запустить +docker-compose up -d + +# Проверить логи +docker-compose logs -f bot +``` + +📖 Подробная инструкция: [README_DOCKER.md](README_DOCKER.md) + +--- + +### Локальная установка + +#### 1. Клонирование репозитория ```bash git clone http://103.137.249.134:3000/NANDI/tg_bot_language.git diff --git a/README_DOCKER.md b/README_DOCKER.md new file mode 100644 index 0000000..c66988c --- /dev/null +++ b/README_DOCKER.md @@ -0,0 +1,174 @@ +# 🐳 Запуск через Docker Compose + +## Быстрый старт + +1. **Клонировать репозиторий:** +```bash +git clone http://103.137.249.134:3000/NANDI/tg_bot_language.git +cd tg_bot_language +``` + +2. **Настроить переменные окружения:** +```bash +cp .env.example .env +nano .env # или используйте любой редактор +``` + +Заполните обязательные поля в `.env`: +```env +BOT_TOKEN=ваш_telegram_bot_token +OPENAI_API_KEY=ваш_openai_api_key +``` + +3. **Запустить:** +```bash +docker-compose up -d +``` + +4. **Проверить логи:** +```bash +docker-compose logs -f bot +``` + +## Управление + +### Запуск +```bash +docker-compose up -d +``` + +### Остановка +```bash +docker-compose down +``` + +### Перезапуск +```bash +docker-compose restart +``` + +### Пересборка после изменений +```bash +docker-compose up -d --build +``` + +### Просмотр логов +```bash +# Все сервисы +docker-compose logs -f + +# Только бот +docker-compose logs -f bot + +# Только база данных +docker-compose logs -f db +``` + +### Статус контейнеров +```bash +docker-compose ps +``` + +## Работа с базой данных + +### Подключение к PostgreSQL +```bash +docker-compose exec db psql -U botuser -d language_bot +``` + +### Бэкап базы данных +```bash +docker-compose exec db pg_dump -U botuser language_bot > backup.sql +``` + +### Восстановление из бэкапа +```bash +docker-compose exec -T db psql -U botuser language_bot < backup.sql +``` + +## Структура Docker + +### Сервисы + +- **db** - PostgreSQL 15 (база данных) + - Порт: 5432 + - Volume: `postgres_data` для персистентности + - Health check для проверки готовности + +- **bot** - Telegram бот (Python приложение) + - Зависит от `db` + - Автоматический рестарт + - Логи в `./logs` + +### Volumes + +- `postgres_data` - данные PostgreSQL (персистентные) +- `./logs` - логи бота (на хосте) + +## Переменные окружения + +Полный список переменных в `.env`: + +```env +# Обязательные +BOT_TOKEN=your_token # Токен от @BotFather +OPENAI_API_KEY=your_key # API ключ OpenAI + +# PostgreSQL (можно оставить по умолчанию) +POSTGRES_USER=botuser +POSTGRES_PASSWORD=botpassword +POSTGRES_DB=language_bot + +# Настройки +DEBUG=True +``` + +## Troubleshooting + +### Бот не запускается + +1. Проверьте логи: +```bash +docker-compose logs bot +``` + +2. Проверьте, что база данных запущена: +```bash +docker-compose ps db +``` + +3. Проверьте переменные окружения в `.env` + +### База данных недоступна + +```bash +# Проверить статус +docker-compose ps db + +# Перезапустить базу +docker-compose restart db + +# Проверить логи +docker-compose logs db +``` + +### Очистка и полный перезапуск + +```bash +# Остановить и удалить контейнеры +docker-compose down + +# Удалить volumes (ВНИМАНИЕ: удалит все данные!) +docker-compose down -v + +# Пересобрать и запустить +docker-compose up -d --build +``` + +## Production рекомендации + +1. **Изменить пароли БД** в `.env` +2. **Отключить DEBUG**: `DEBUG=False` +3. **Настроить регулярные бэкапы** БД +4. **Использовать Docker secrets** для чувствительных данных +5. **Настроить мониторинг** логов и метрик diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..c214d94 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,40 @@ +version: '3.8' + +services: + db: + image: postgres:15-alpine + container_name: language_bot_db + restart: unless-stopped + environment: + POSTGRES_USER: ${POSTGRES_USER:-botuser} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-botpassword} + POSTGRES_DB: ${POSTGRES_DB:-language_bot} + volumes: + - postgres_data:/var/lib/postgresql/data + ports: + - "5432:5432" + healthcheck: + test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-botuser}"] + interval: 10s + timeout: 5s + retries: 5 + + bot: + build: . + container_name: language_bot + restart: unless-stopped + depends_on: + db: + condition: service_healthy + environment: + BOT_TOKEN: ${BOT_TOKEN} + OPENAI_API_KEY: ${OPENAI_API_KEY} + DATABASE_URL: postgresql+asyncpg://${POSTGRES_USER:-botuser}:${POSTGRES_PASSWORD:-botpassword}@db:5432/${POSTGRES_DB:-language_bot} + DEBUG: ${DEBUG:-False} + volumes: + - ./logs:/app/logs + env_file: + - .env + +volumes: + postgres_data: