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
This commit is contained in:
admin i 2025-11-03 14:20:26 +03:00
parent e24ef22337
commit b75b8e62a6
10 changed files with 380 additions and 0 deletions

66
.dockerignore Normal file
View File

@ -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

15
.env.example Normal file
View File

@ -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

46
Dockerfile Normal file
View File

@ -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"]

72
docker-compose.yml Normal file
View File

@ -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

47
start.bat Normal file
View File

@ -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

44
start.sh Normal file
View File

@ -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"

27
start_bot.bat Normal file
View File

@ -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

34
start_bot.sh Normal file
View File

@ -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

16
stop.bat Normal file
View File

@ -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

13
stop.sh Normal file
View File

@ -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/"