From b75b8e62a60c4fd11900f08ea3393f76b64748b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=B3=D0=BE=D1=80=D1=8C=20=D0=9D=D0=B0=D0=B4=D0=B5?= =?UTF-8?q?=D0=B8=D0=BD?= Date: Mon, 3 Nov 2025 14:20:26 +0300 Subject: [PATCH] feat: Add Docker containerization for development - Add Dockerfile with Python 3.11-slim base - Add docker-compose.yml for local development - Add .dockerignore to optimize build context - Add start/stop scripts for Linux and Windows - Add .env.example template - Configure volumes for data, logs, temp_documents - Add healthcheck with 30s interval - Resource limits: 0.5 CPU, 512MB RAM --- .dockerignore | 66 ++++++++++++++++++++++++++++++++++++++++++ .env.example | 15 ++++++++++ Dockerfile | 46 +++++++++++++++++++++++++++++ docker-compose.yml | 72 ++++++++++++++++++++++++++++++++++++++++++++++ start.bat | 47 ++++++++++++++++++++++++++++++ start.sh | 44 ++++++++++++++++++++++++++++ start_bot.bat | 27 +++++++++++++++++ start_bot.sh | 34 ++++++++++++++++++++++ stop.bat | 16 +++++++++++ stop.sh | 13 +++++++++ 10 files changed, 380 insertions(+) create mode 100644 .dockerignore create mode 100644 .env.example create mode 100644 Dockerfile create mode 100644 docker-compose.yml create mode 100644 start.bat create mode 100644 start.sh create mode 100644 start_bot.bat create mode 100644 start_bot.sh create mode 100644 stop.bat create mode 100644 stop.sh diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..6097b43 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,66 @@ +# Python +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +*.egg-info/ +.pytest_cache/ +.coverage +htmlcov/ + +# Virtual Environment +venv/ +env/ +ENV/ +.venv/ + +# IDE +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# OS +.DS_Store +Thumbs.db + +# Git +.git/ +.gitignore +.gitattributes + +# Документация (опционально, можно оставить) +*.md +docs/ + +# Данные (будут в volumes) +users.json +.encryption_key +temp_documents/ +logs/ +*.log +output/ + +# Тестовые файлы +test_*.py +check_*.py +list_*.py +download_*.py + +# Временные файлы +*.json +nul + +# Docker +Dockerfile +.dockerignore +docker-compose.yml +.env.example + +# Java (если есть) +java-jxls-filler/ +target/ +*.jar +*.class diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..17dda9d --- /dev/null +++ b/.env.example @@ -0,0 +1,15 @@ +# Telegram Bot Token +# Получить: https://t.me/BotFather +TELEGRAM_BOT_TOKEN=your_telegram_bot_token_here + +# МойСклад API +# Примечание: Логин и пароль больше не нужны в .env +# Каждый пользователь вводит свои credentials при первом запуске через /start +MOYSKLAD_API_URL=https://api.moysklad.ru/api/remap/1.2 + +# Настройки приложения +LOG_LEVEL=INFO +DEBUG=False + +# Timezone (для Docker) +TZ=Europe/Moscow diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..2c56804 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,46 @@ +# Используем официальный Python образ +FROM python:3.11-slim + +# Метаданные +LABEL maintainer="BUH_bot" +LABEL description="Telegram бот для работы с МойСклад" + +# Устанавливаем рабочую директорию +WORKDIR /app + +# Устанавливаем системные зависимости +RUN apt-get update && apt-get install -y \ + gcc \ + g++ \ + libxml2-dev \ + libxslt1-dev \ + && rm -rf /var/lib/apt/lists/* + +# Копируем файл зависимостей +COPY requirements.txt . + +# Устанавливаем Python зависимости +RUN pip install --no-cache-dir --upgrade pip && \ + pip install --no-cache-dir -r requirements.txt + +# Копируем код приложения +COPY . . + +# Создаём директории для данных +RUN mkdir -p /app/data /app/temp_documents /app/logs + +# Переменные окружения по умолчанию +ENV PYTHONUNBUFFERED=1 \ + PYTHONDONTWRITEBYTECODE=1 \ + DATA_DIR=/app/data \ + LOGS_DIR=/app/logs + +# Volumes для персистентных данных +VOLUME ["/app/data", "/app/logs", "/app/temp_documents"] + +# Healthcheck +HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ + CMD python -c "import sys; sys.exit(0)" + +# Запуск бота +CMD ["python", "-u", "bot.py"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..a9c5182 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,72 @@ +version: '3.8' + +services: + # Telegram бот + buh_bot: + build: + context: . + dockerfile: Dockerfile + container_name: buh_bot + restart: unless-stopped + + # Переменные окружения + environment: + - TELEGRAM_BOT_TOKEN=${TELEGRAM_BOT_TOKEN} + - MOYSKLAD_API_URL=${MOYSKLAD_API_URL:-https://api.moysklad.ru/api/remap/1.2} + - TZ=Europe/Moscow + + # Переменные из файла .env + env_file: + - .env + + # Volumes для персистентных данных + volumes: + # Пользовательские данные (users.json, .encryption_key) + - ./data:/app/data + # Логи + - ./logs:/app/logs + # Временные документы + - ./temp_documents:/app/temp_documents + + # Сеть + networks: + - buh_network + + # Ограничения ресурсов + deploy: + resources: + limits: + cpus: '0.5' + memory: 512M + reservations: + cpus: '0.25' + memory: 256M + + # Healthcheck + healthcheck: + test: ["CMD", "python", "-c", "import sys; sys.exit(0)"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + + # Логирование + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + +# Сеть +networks: + buh_network: + driver: bridge + +# Volumes (опционально, можно использовать bind mounts как выше) +volumes: + bot_data: + driver: local + bot_logs: + driver: local + bot_temp: + driver: local diff --git a/start.bat b/start.bat new file mode 100644 index 0000000..b1c5bb5 --- /dev/null +++ b/start.bat @@ -0,0 +1,47 @@ +@echo off +REM Скрипт для запуска бота в Docker (Windows) + +echo 🚀 Запуск BUH Bot в Docker... + +REM Проверка наличия .env файла +if not exist .env ( + echo ❌ Файл .env не найден! + echo 📝 Создайте .env на основе .env.example: + echo copy .env.example .env + echo notepad .env + exit /b 1 +) + +REM Создание необходимых директорий +echo 📁 Создание директорий для данных... +if not exist data mkdir data +if not exist logs mkdir logs +if not exist temp_documents mkdir temp_documents + +REM Сборка образа +echo 🔨 Сборка Docker образа... +docker-compose build + +REM Запуск контейнера +echo ▶️ Запуск контейнера... +docker-compose up -d + +REM Проверка статуса +echo. +echo ✅ Бот запущен! +echo. +echo 📊 Статус контейнера: +docker-compose ps + +echo. +echo 📝 Просмотр логов: +echo docker-compose logs -f +echo. +echo 🛑 Остановка бота: +echo docker-compose down +echo. +echo 🔄 Перезапуск бота: +echo docker-compose restart +echo. + +pause diff --git a/start.sh b/start.sh new file mode 100644 index 0000000..eab8ba4 --- /dev/null +++ b/start.sh @@ -0,0 +1,44 @@ +#!/bin/bash +# Скрипт для запуска бота в Docker + +set -e + +echo "🚀 Запуск BUH Bot в Docker..." + +# Проверка наличия .env файла +if [ ! -f .env ]; then + echo "❌ Файл .env не найден!" + echo "📝 Создайте .env на основе .env.example:" + echo " cp .env.example .env" + echo " nano .env # и заполните TELEGRAM_BOT_TOKEN" + exit 1 +fi + +# Создание необходимых директорий +echo "📁 Создание директорий для данных..." +mkdir -p data logs temp_documents + +# Сборка образа +echo "🔨 Сборка Docker образа..." +docker-compose build + +# Запуск контейнера +echo "▶️ Запуск контейнера..." +docker-compose up -d + +# Проверка статуса +echo "" +echo "✅ Бот запущен!" +echo "" +echo "📊 Статус контейнера:" +docker-compose ps + +echo "" +echo "📝 Просмотр логов:" +echo " docker-compose logs -f" +echo "" +echo "🛑 Остановка бота:" +echo " docker-compose down" +echo "" +echo "🔄 Перезапуск бота:" +echo " docker-compose restart" diff --git a/start_bot.bat b/start_bot.bat new file mode 100644 index 0000000..3133c01 --- /dev/null +++ b/start_bot.bat @@ -0,0 +1,27 @@ +@echo off +REM Скрипт быстрого запуска Telegram бота (Windows) + +echo 🤖 Запуск Telegram бота для МойСклад... +echo. + +REM Проверка виртуального окружения +if not exist ".venv" ( + echo ❌ Виртуальное окружение не найдено! + echo Создайте его командой: python -m venv .venv + exit /b 1 +) + +REM Проверка .env файла +if not exist ".env" ( + echo ❌ Файл .env не найден! + echo Скопируйте .env.example в .env и заполните параметры: + echo copy .env.example .env + exit /b 1 +) + +REM Активация и запуск +echo ✅ Запуск бота... +echo. + +call .venv\Scripts\activate.bat +python bot.py diff --git a/start_bot.sh b/start_bot.sh new file mode 100644 index 0000000..d8d8a78 --- /dev/null +++ b/start_bot.sh @@ -0,0 +1,34 @@ +#!/bin/bash +# Скрипт быстрого запуска Telegram бота + +echo "🤖 Запуск Telegram бота для МойСклад..." +echo "" + +# Проверка виртуального окружения +if [ ! -d ".venv" ]; then + echo "❌ Виртуальное окружение не найдено!" + echo "Создайте его командой: python -m venv .venv" + exit 1 +fi + +# Проверка .env файла +if [ ! -f ".env" ]; then + echo "❌ Файл .env не найден!" + echo "Скопируйте .env.example в .env и заполните параметры:" + echo " cp .env.example .env" + exit 1 +fi + +# Активация виртуального окружения и запуск +echo "✅ Запуск бота..." +echo "" + +if [[ "$OSTYPE" == "msys" ]] || [[ "$OSTYPE" == "win32" ]]; then + # Windows + source .venv/Scripts/activate +else + # Linux/Mac + source .venv/bin/activate +fi + +python bot.py diff --git a/stop.bat b/stop.bat new file mode 100644 index 0000000..3893c4f --- /dev/null +++ b/stop.bat @@ -0,0 +1,16 @@ +@echo off +REM Скрипт для остановки бота (Windows) + +echo 🛑 Остановка BUH Bot... +docker-compose down + +echo. +echo ✅ Бот остановлен! +echo. +echo 💾 Данные сохранены в: +echo - .\data\users.json +echo - .\data\.encryption_key +echo - .\logs\ +echo. + +pause diff --git a/stop.sh b/stop.sh new file mode 100644 index 0000000..c300f41 --- /dev/null +++ b/stop.sh @@ -0,0 +1,13 @@ +#!/bin/bash +# Скрипт для остановки бота + +echo "🛑 Остановка BUH Bot..." +docker-compose down + +echo "" +echo "✅ Бот остановлен!" +echo "" +echo "💾 Данные сохранены в:" +echo " - ./data/users.json" +echo " - ./data/.encryption_key" +echo " - ./logs/"