From c0a8cf133459ba3241aae97d38132455c82bccce Mon Sep 17 00:00:00 2001 From: Vlad Date: Wed, 4 Jun 2025 08:02:53 +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=D0=BE=20=D0=BB=D0=BE=D0=B3=D0=B8=D1=80=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D0=B8=20=D0=BE=20=D0=B7=D0=B0=D0=BF=D1=83=D1=81?= =?UTF-8?q?=D0=BA=D0=B5=20=D0=BF=D1=80=D0=B8=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=B2=20Docker-=D0=BA=D0=BE=D0=BD=D1=82=D0=B5?= =?UTF-8?q?=D0=B9=D0=BD=D0=B5=D1=80=D0=B5=20=D0=B2=20=D1=84=D1=83=D0=BD?= =?UTF-8?q?=D0=BA=D1=86=D0=B8=D0=B8=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=B9=D0=BA=D0=B8=20=D0=BB=D0=BE=D0=B3=D0=B8=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=8F.=20=D0=A2=D0=B5=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D1=8C=20=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4=D0=B8=D1=82=D1=81=D1=8F?= =?UTF-8?q?=20=D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D1=8F?= =?UTF-8?q?=20=D0=BE=20=D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD=D0=BE?= =?UTF-8?q?=D0=B9=20=D0=B7=D0=BE=D0=BD=D0=B5=20=D0=B8=20=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5=D0=BB=D0=B5=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BD=D1=82=D0=B5=D0=B9=D0=BD=D0=B5=D1=80=D0=B0,=20?= =?UTF-8?q?=D1=87=D1=82=D0=BE=20=D1=83=D0=BB=D1=83=D1=87=D1=88=D0=B0=D0=B5?= =?UTF-8?q?=D1=82=20=D0=BE=D1=82=D1=81=D0=BB=D0=B5=D0=B6=D0=B8=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B8=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=B2=20=D1=80=D0=B0=D0=B7=D0=BB=D0=B8=D1=87=D0=BD=D1=8B=D1=85?= =?UTF-8?q?=20=D1=81=D1=80=D0=B5=D0=B4=D0=B0=D1=85.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .dockerignore | 91 +++++++++++++++++ Dockerfile | 62 ++++++++++++ Makefile | 148 +++++++++++++++++++++++++++ README_DOCKER.md | 236 +++++++++++++++++++++++++++++++++++++++++++ docker-compose.yml | 115 +++++++++++++++++++++ docker-entrypoint.sh | 98 ++++++++++++++++++ env.example | 61 +++++++++++ main.py | 9 ++ requirements.txt | 20 ++++ 9 files changed, 840 insertions(+) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 Makefile create mode 100644 README_DOCKER.md create mode 100644 docker-compose.yml create mode 100644 docker-entrypoint.sh create mode 100644 env.example create mode 100644 requirements.txt diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..bc89709 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,91 @@ +# Версионный контроль +.git/ +.gitignore +.gitattributes +.gitmodules + +# Окружение Python +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +venv/ +env/ +ENV/ +.env +.venv + +# IDE и редакторы +.vscode/ +.idea/ +*.swp +*.swo +*.sublime-* +*.code-workspace + +# Операционная система +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db +Desktop.ini + +# Логи и временные файлы +logs/ +*.log +*.tmp +*.temp +temp/ +tmp/ + +# Тестирование +.pytest_cache/ +.coverage +.tox/ +.cache +coverage.xml +htmlcov/ +.nyc_output + +# Документация +docs/ +*.md +*.rst +*.txt +!requirements.txt + +# Docker файлы +Dockerfile.* +docker-compose*.yml +!docker-compose.yml + +# Конфигурация +env.example +.env.* +!.env.example + +# Базы данных (если есть локальные) +*.db +*.sqlite3 +data/ + +# Бекапы и архивы +*.bak +*.backup +*.zip +*.tar.gz +*.rar + +# Локальные изображения для разработки +images/* +!images/.gitkeep + +# Специфичные для проекта +node_modules/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..368e387 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,62 @@ +# Используем официальный Python образ +FROM python:3.12-slim + +# Устанавливаем системные зависимости +RUN apt-get update && apt-get install -y \ + gcc \ + libaio1 \ + libaio-dev \ + unzip \ + wget \ + && rm -rf /var/lib/apt/lists/* + +# Устанавливаем Oracle Instant Client +RUN mkdir -p /opt/oracle && \ + cd /opt/oracle && \ + wget https://download.oracle.com/otn_software/linux/instantclient/1921000/instantclient-basic-linux.x64-19.21.0.0.0dbru.zip && \ + unzip instantclient-basic-linux.x64-19.21.0.0.0dbru.zip && \ + rm instantclient-basic-linux.x64-19.21.0.0.0dbru.zip && \ + echo /opt/oracle/instantclient_19_21 > /etc/ld.so.conf.d/oracle-instantclient.conf && \ + ldconfig + +# Устанавливаем переменные окружения для Oracle +ENV ORACLE_HOME=/opt/oracle/instantclient_19_21 +ENV LD_LIBRARY_PATH=/opt/oracle/instantclient_19_21:$LD_LIBRARY_PATH +ENV PATH=/opt/oracle/instantclient_19_21:$PATH + +# Создаем пользователя для безопасности +RUN useradd --create-home --shell /bin/bash salvagebot +USER salvagebot +WORKDIR /home/salvagebot/app + +# Копируем файл зависимостей +COPY --chown=salvagebot:salvagebot requirements.txt . + +# Устанавливаем Python зависимости +RUN pip install --user --no-cache-dir -r requirements.txt + +# Копируем entrypoint скрипт +COPY --chown=salvagebot:salvagebot docker-entrypoint.sh /usr/local/bin/ +USER root +RUN chmod +x /usr/local/bin/docker-entrypoint.sh +USER salvagebot + +# Копируем код приложения +COPY --chown=salvagebot:salvagebot . . + +# Создаем необходимые директории +RUN mkdir -p logs images data + +# Устанавливаем переменные окружения Python +ENV PYTHONPATH=/home/salvagebot/app +ENV PYTHONUNBUFFERED=1 + +# Проверяем здоровье контейнера +HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ + CMD python -c "import sys; sys.exit(0)" + +# Используем entrypoint для инициализации +ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"] + +# Команда запуска +CMD ["python", "main.py"] \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..b8f8c1a --- /dev/null +++ b/Makefile @@ -0,0 +1,148 @@ +# Makefile для SalvageDB Telegram Bot +.PHONY: help build up down restart logs shell clean test health + +# Переменные +COMPOSE_FILE = docker-compose.yml +SERVICE_NAME = salvagedb-bot +CONTAINER_NAME = salvagedb-telegram-bot + +# Помощь +help: ## Показать доступные команды + @echo "SalvageDB Telegram Bot - Docker Commands" + @echo "========================================" + @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-15s\033[0m %s\n", $$1, $$2}' + +# Основные команды +build: ## Собрать Docker образ + @echo "🔨 Building Docker image..." + docker-compose build --no-cache + +up: ## Запустить контейнер + @echo "🚀 Starting container..." + docker-compose up -d + +down: ## Остановить контейнер + @echo "🛑 Stopping container..." + docker-compose down + +restart: ## Перезапустить контейнер + @echo "🔄 Restarting container..." + docker-compose restart + +# Логи и мониторинг +logs: ## Показать логи в реальном времени + @echo "📋 Following logs..." + docker-compose logs -f $(SERVICE_NAME) + +logs-tail: ## Показать последние 100 строк логов + @echo "📋 Last 100 log lines..." + docker-compose logs --tail=100 $(SERVICE_NAME) + +health: ## Проверить здоровье контейнера + @echo "🏥 Checking container health..." + docker inspect --format='{{.State.Health.Status}}' $(CONTAINER_NAME) || echo "Health check not available" + +status: ## Показать статус контейнера + @echo "📊 Container status:" + docker-compose ps + +stats: ## Показать статистику ресурсов + @echo "📈 Resource usage:" + docker stats $(CONTAINER_NAME) --no-stream + +# Разработка +shell: ## Подключиться к контейнеру + @echo "🐚 Opening shell in container..." + docker-compose exec $(SERVICE_NAME) bash + +shell-root: ## Подключиться как root + @echo "🔑 Opening root shell in container..." + docker-compose exec --user root $(SERVICE_NAME) bash + +# Тестирование +test-env: ## Проверить переменные окружения + @echo "🔍 Checking environment variables..." + docker-compose exec $(SERVICE_NAME) python -c "import os; [print(f'{k}={v[:20]}{"..." if len(v) > 20 else ""}') for k, v in sorted(os.environ.items()) if any(x in k.upper() for x in ['BOT', 'DB', 'PRICE', 'ADMIN', 'DEBUG'])]" + +test-db: ## Тестировать подключение к БД + @echo "🗄️ Testing database connection..." + docker-compose exec $(SERVICE_NAME) python -c "import oracledb, os; conn = oracledb.connect(user=os.getenv('DB_USER'), password=os.getenv('DB_PASSWORD'), dsn=os.getenv('DB_DSN')); print('✅ Database connection successful!'); conn.close()" + +test-bot: ## Проверить импорты бота + @echo "🤖 Testing bot imports..." + docker-compose exec $(SERVICE_NAME) python -c "import aiogram, oracledb, asyncio, logging; print('✅ All imports successful!')" + +test-all: test-env test-db test-bot ## Запустить все тесты + +# Обслуживание +clean: ## Удалить контейнеры и volumes + @echo "🧹 Cleaning up..." + docker-compose down -v + docker system prune -f + +clean-images: ## Удалить неиспользуемые образы + @echo "🗑️ Removing unused images..." + docker image prune -f + +clean-all: clean clean-images ## Полная очистка + +# Бэкап и восстановление +backup-logs: ## Создать архив логов + @echo "💾 Creating logs backup..." + tar -czf logs_backup_$(shell date +%Y%m%d_%H%M%S).tar.gz logs/ + +backup-env: ## Создать бэкап переменных окружения + @echo "🔐 Creating environment backup..." + cp .env .env.backup.$(shell date +%Y%m%d_%H%M%S) + +# Деплой +deploy: build up ## Полный деплой (сборка + запуск) + @echo "🚀 Deployment complete!" + @make health + +redeploy: down build up ## Переделой (остановка + сборка + запуск) + @echo "🔄 Redeployment complete!" + @make health + +# Мониторинг +monitor: ## Мониторинг в реальном времени + @echo "📊 Starting monitoring (Ctrl+C to stop)..." + @while true; do \ + clear; \ + echo "=== SalvageDB Bot Monitoring ==="; \ + echo "Time: $$(date)"; \ + echo ""; \ + echo "Container Status:"; \ + docker-compose ps; \ + echo ""; \ + echo "Resource Usage:"; \ + docker stats $(CONTAINER_NAME) --no-stream 2>/dev/null || echo "Container not running"; \ + echo ""; \ + echo "Last 5 log lines:"; \ + docker-compose logs --tail=5 $(SERVICE_NAME) 2>/dev/null || echo "No logs available"; \ + sleep 5; \ + done + +# Обновление +update: ## Обновить код и перезапустить + @echo "📥 Updating application..." + git pull + @make redeploy + +# Конфигурация +setup: ## Первоначальная настройка + @echo "⚙️ Initial setup..." + @if [ ! -f .env ]; then \ + echo "📝 Creating .env file from template..."; \ + cp env.example .env; \ + echo "✅ Please edit .env file with your configuration"; \ + else \ + echo "✅ .env file already exists"; \ + fi + @echo "📁 Creating directories..." + mkdir -p logs images data + chmod 755 logs images data + @echo "✅ Setup complete! Edit .env file and run 'make deploy'" + +# По умолчанию +.DEFAULT_GOAL := help \ No newline at end of file diff --git a/README_DOCKER.md b/README_DOCKER.md new file mode 100644 index 0000000..97fdae0 --- /dev/null +++ b/README_DOCKER.md @@ -0,0 +1,236 @@ +# SalvageDB Telegram Bot - Docker Deployment + +Полная инструкция по развертыванию SalvageDB Telegram Bot в Docker контейнере. + +## 📋 Требования + +- Docker Engine 20.10+ +- Docker Compose 2.0+ +- Минимум 512 MB RAM +- Доступ к Oracle Database + +## 🚀 Быстрый старт + +### 1. Подготовка переменных окружения + +Скопируйте файл с примером и настройте переменные: + +```bash +cp env.example .env +nano .env +``` + +Обязательно настройте следующие переменные: +- `BOT_TOKEN` - токен от @BotFather +- `DB_USER`, `DB_PASSWORD`, `DB_DSN` - настройки Oracle DB +- `ADMIN_USER_ID` - ваш Telegram ID для админ-функций + +### 2. Создание необходимых директорий + +```bash +# Создаем директории для данных +mkdir -p logs images data + +# Устанавливаем права доступа +chmod 755 logs images data +``` + +### 3. Запуск контейнера + +```bash +# Сборка и запуск +docker-compose up --build -d + +# Проверка статуса +docker-compose ps + +# Просмотр логов +docker-compose logs -f salvagedb-bot +``` + +## 📁 Структура проекта + +``` +salvagedb_bot/ +├── Dockerfile # Конфигурация Docker образа +├── docker-compose.yml # Orchestration конфигурация +├── docker-entrypoint.sh # Скрипт инициализации +├── .dockerignore # Исключения для Docker +├── env.example # Пример переменных окружения +├── requirements.txt # Python зависимости +├── main.py # Основной код бота +├── db.py # Модуль работы с БД +├── middlewares/ # Middleware компоненты +├── logs/ # Логи приложения (volume) +├── images/ # Изображения автомобилей (volume) +└── data/ # Дополнительные данные (volume) +``` + +## 🔧 Конфигурация + +### Переменные окружения + +| Переменная | Описание | Значение по умолчанию | +|-----------|----------|----------------------| +| `BOT_TOKEN` | Токен Telegram бота | **Обязательно** | +| `BOT_NAME` | Имя бота | `SalvageDB Bot` | +| `ADMIN_USER_ID` | ID администратора | **Обязательно** | +| `DECODE_PRICE` | Цена декодирования VIN | `1` | +| `CHECK_PRICE` | Цена проверки повреждений | `10` | +| `IMG_PRICE` | Цена доступа к фото | `100` | +| `DB_USER` | Пользователь Oracle DB | **Обязательно** | +| `DB_PASSWORD` | Пароль Oracle DB | **Обязательно** | +| `DB_DSN` | DSN строка Oracle DB | **Обязательно** | +| `DEBUG` | Режим отладки | `0` | +| `TIMEZONE` | Часовой пояс | `UTC` | + +### Volumes + +- `./logs:/home/salvagebot/app/logs` - Логи приложения +- `./images:/home/salvagebot/app/images:ro` - Изображения (read-only) +- `./data:/home/salvagebot/app/data` - Дополнительные данные + +## 🛠️ Управление контейнером + +### Основные команды + +```bash +# Запуск +docker-compose up -d + +# Остановка +docker-compose down + +# Перезапуск +docker-compose restart + +# Пересборка и запуск +docker-compose up --build -d + +# Просмотр логов в реальном времени +docker-compose logs -f salvagedb-bot + +# Подключение к контейнеру +docker-compose exec salvagedb-bot bash + +# Просмотр статуса +docker-compose ps +``` + +### Мониторинг + +```bash +# Проверка здоровья контейнера +docker-compose exec salvagedb-bot python -c "print('Bot is healthy!')" + +# Статистика ресурсов +docker stats salvagedb-telegram-bot + +# Информация о контейнере +docker inspect salvagedb-telegram-bot +``` + +## 📊 Логирование + +### Структура логов + +Логи сохраняются в директории `./logs/`: +- `salvagedb_bot.log` - текущий лог файл +- `salvagedb_bot.log.YYYY-MM-DD` - архивные логи + +### Конфигурация логирования + +- **Ротация:** ежедневно в полночь +- **Хранение:** 30 дней +- **Формат:** `YYYY-MM-DD HH:MM:SS - module - LEVEL - message` +- **Уровни:** INFO, WARNING, ERROR + +## 🔒 Безопасность + +### Рекомендации + +1. **Переменные окружения:** + - Никогда не коммитьте `.env` файл + - Используйте сильные пароли для БД + - Ограничьте доступ к токену бота + +2. **Сетевая безопасность:** + - Контейнер работает в изолированной сети + - Нет открытых портов (только исходящие соединения) + +3. **Файловая система:** + - Приложение работает под непривилегированным пользователем + - Read-only монтирование для изображений + +## 🐛 Устранение неполадок + +### Проблемы с Oracle + +```bash +# Проверка Oracle client в контейнере +docker-compose exec salvagedb-bot python -c "import oracledb; print(oracledb.version)" + +# Тест подключения к БД +docker-compose exec salvagedb-bot python -c " +import oracledb +import os +conn = oracledb.connect(user=os.getenv('DB_USER'), password=os.getenv('DB_PASSWORD'), dsn=os.getenv('DB_DSN')) +print('Connection successful!') +conn.close() +" +``` + +### Проблемы с ботом + +```bash +# Проверка токена бота +docker-compose exec salvagedb-bot python -c " +import os +print('Bot token length:', len(os.getenv('BOT_TOKEN', ''))) +" + +# Проверка aiogram +docker-compose exec salvagebot-bot python -c "import aiogram; print('aiogram version:', aiogram.__version__)" +``` + +### Логи отладки + +```bash +# Включить DEBUG режим +echo "DEBUG=1" >> .env +docker-compose restart + +# Просмотр подробных логов +docker-compose logs -f --tail=100 salvagedb-bot +``` + +## 🔄 Обновление + +```bash +# Остановить контейнер +docker-compose down + +# Обновить код +git pull + +# Пересобрать и запустить +docker-compose up --build -d + +# Проверить статус +docker-compose logs -f salvagedb-bot +``` + +## 📞 Поддержка + +При возникновении проблем: + +1. Проверьте логи: `docker-compose logs salvagedb-bot` +2. Убедитесь в правильности переменных окружения +3. Проверьте подключение к Oracle DB +4. Проверьте валидность токена бота + +## 🏷️ Теги версий + +- `latest` - последняя стабильная версия +- `dev` - версия для разработки +- `v1.x.x` - конкретные релизы \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..3f8e54c --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,115 @@ +version: '3.8' + +services: + salvagedb-bot: + build: + context: . + dockerfile: Dockerfile + container_name: salvagedb-telegram-bot + restart: unless-stopped + + # Переменные окружения + environment: + # Telegram Bot настройки + - BOT_TOKEN=${BOT_TOKEN} + - BOT_NAME=${BOT_NAME:-SalvageDB Bot} + - ADMIN_USER_ID=${ADMIN_USER_ID} + + # Цены на услуги (в Telegram Stars) + - DECODE_PRICE=${DECODE_PRICE:-1} + - CHECK_PRICE=${CHECK_PRICE:-10} + - IMG_PRICE=${IMG_PRICE:-100} + + # База данных Oracle + - db_user=${DB_USER} + - db_password=${DB_PASSWORD} + - db_dsn=${DB_DSN} + + # Настройки приложения + - DEBUG=${DEBUG:-0} + - PYTHONUNBUFFERED=1 + - TZ=${TIMEZONE:-UTC} + + # Монтируем volumes для логов и изображений + volumes: + - ./logs:/home/salvagebot/app/logs + - ./images:/home/salvagebot/app/images:ro # read-only для изображений + - ./data:/home/salvagebot/app/data # дополнительные данные если нужны + + # Настройки сети + networks: + - salvagedb-network + + # Ограничения ресурсов + deploy: + resources: + limits: + memory: 512M + cpus: '0.5' + reservations: + memory: 256M + cpus: '0.25' + + # Политика перезапуска + restart: unless-stopped + + # Зависимости (если есть другие сервисы) + depends_on: [] + + # Логирование + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + # Проверка здоровья + healthcheck: + test: ["CMD", "python", "-c", "import sys; sys.exit(0)"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + +# Дополнительные сервисы (если понадобятся) + # nginx: + # image: nginx:alpine + # container_name: salvagedb-nginx + # restart: unless-stopped + # ports: + # - "80:80" + # - "443:443" + # volumes: + # - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro + # - ./nginx/ssl:/etc/nginx/ssl:ro + # networks: + # - salvagedb-network + # depends_on: + # - salvagedb-bot + + # redis: + # image: redis:7-alpine + # container_name: salvagedb-redis + # restart: unless-stopped + # volumes: + # - redis_data:/data + # networks: + # - salvagedb-network + # command: redis-server --appendonly yes + +# Определяем сети +networks: + salvagedb-network: + driver: bridge + ipam: + config: + - subnet: 172.20.0.0/16 + +# Определяем volumes +volumes: + # redis_data: + # driver: local + logs_data: + driver: local + images_data: + driver: local \ No newline at end of file diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh new file mode 100644 index 0000000..fc1d62e --- /dev/null +++ b/docker-entrypoint.sh @@ -0,0 +1,98 @@ +#!/bin/bash + +# Скрипт инициализации для Docker контейнера SalvageDB Bot +set -e + +echo "=====================================================" +echo "SalvageDB Telegram Bot - Docker Container Startup" +echo "=====================================================" + +# Проверяем обязательные переменные окружения +check_env_var() { + if [ -z "${!1}" ]; then + echo "❌ ERROR: Environment variable $1 is not set!" + echo "Please check your .env file or docker-compose.yml" + exit 1 + else + echo "✅ $1 is configured" + fi +} + +echo "🔍 Checking required environment variables..." +check_env_var BOT_TOKEN +check_env_var DB_USER +check_env_var DB_PASSWORD +check_env_var DB_DSN +check_env_var ADMIN_USER_ID + +echo "" +echo "📋 Configuration Summary:" +echo " • Bot Name: ${BOT_NAME:-'SalvageDB Bot'}" +echo " • Debug Mode: ${DEBUG:-'0'}" +echo " • Timezone: ${TZ:-'UTC'}" +echo " • Decode Price: ${DECODE_PRICE:-'1'} ⭐" +echo " • Check Price: ${CHECK_PRICE:-'10'} ⭐" +echo " • Image Price: ${IMG_PRICE:-'100'} ⭐" +echo " • Database DSN: ${DB_DSN}" +echo " • Admin User ID: ${ADMIN_USER_ID}" + +echo "" +echo "📁 Creating directories..." +mkdir -p /home/salvagebot/app/logs +mkdir -p /home/salvagebot/app/images +mkdir -p /home/salvagebot/app/data + +echo "✅ Directory structure created" + +echo "" +echo "🐍 Testing Python environment..." +python -c " +import sys +print(f'Python version: {sys.version}') +print(f'Python path: {sys.executable}') +" + +echo "" +echo "📦 Testing critical imports..." +python -c " +try: + import aiogram + print('✅ aiogram imported successfully') + + import oracledb + print('✅ oracledb imported successfully') + + import asyncio + print('✅ asyncio imported successfully') + + import logging + print('✅ logging imported successfully') + + print('🎉 All critical dependencies are available') +except ImportError as e: + print(f'❌ Import error: {e}') + exit(1) +" + +echo "" +echo "🔗 Testing Oracle connectivity..." +python -c " +import oracledb +import os + +try: + # Тестируем создание пула соединений (без подключения к БД) + print('Testing Oracle client library...') + print(f'Oracle client version: {oracledb.version}') + print('✅ Oracle client is ready') +except Exception as e: + print(f'❌ Oracle client error: {e}') + exit(1) +" + +echo "" +echo "🚀 Starting SalvageDB Telegram Bot..." +echo "=====================================================" + +# Запускаем основное приложение +exec "$@" \ No newline at end of file diff --git a/env.example b/env.example new file mode 100644 index 0000000..b670caf --- /dev/null +++ b/env.example @@ -0,0 +1,61 @@ +# ================================================== +# SALVAGEDB TELEGRAM BOT - ПЕРЕМЕННЫЕ ОКРУЖЕНИЯ +# ================================================== + +# -------------------------------------------------- +# TELEGRAM BOT НАСТРОЙКИ +# -------------------------------------------------- +# Токен бота от @BotFather +BOT_TOKEN=your_bot_token_here + +# Имя бота (опционально) +BOT_NAME=SalvageDB Bot + +# ID администратора для возврата платежей и статистики +ADMIN_USER_ID=123456789 + +# -------------------------------------------------- +# ЦЕНЫ НА УСЛУГИ (в Telegram Stars) +# -------------------------------------------------- +# Цена за детальную информацию о VIN +DECODE_PRICE=1 + +# Цена за детальную проверку повреждений +CHECK_PRICE=10 + +# Цена за доступ к фотографиям +IMG_PRICE=100 + +# -------------------------------------------------- +# БАЗА ДАННЫХ ORACLE +# -------------------------------------------------- +# Пользователь базы данных +DB_USER=your_db_user + +# Пароль базы данных +DB_PASSWORD=your_db_password + +# DSN строка подключения к Oracle +# Формат: host:port/service_name +DB_DSN=localhost:1521/XEPDB1 + +# -------------------------------------------------- +# НАСТРОЙКИ ПРИЛОЖЕНИЯ +# -------------------------------------------------- +# Режим отладки (0 = выключен, 1 = включен) +DEBUG=0 + +# Часовой пояс +TIMEZONE=UTC + +# -------------------------------------------------- +# ДОПОЛНИТЕЛЬНЫЕ НАСТРОЙКИ (опционально) +# -------------------------------------------------- +# Максимальный размер лог файла +LOG_MAX_SIZE=10M + +# Количество архивных лог файлов +LOG_MAX_FILES=3 + +# Интервал очистки временных файлов (в часах) +CLEANUP_INTERVAL=24 \ No newline at end of file diff --git a/main.py b/main.py index 3f04135..860e68b 100644 --- a/main.py +++ b/main.py @@ -75,6 +75,15 @@ def setup_logging(): logging.info(f"Log level: {logging.getLevelName(log_level)}") logging.info(f"Logs directory: {os.path.abspath(logs_dir)}") logging.info(f"Log rotation: daily, keeping 30 days") + + # Проверяем запуск в Docker + if os.path.exists('/.dockerenv'): + logging.info("Running inside Docker container") + logging.info(f"Container timezone: {getenv('TZ', 'UTC')}") + logging.info(f"Container user: {getenv('USER', 'unknown')}") + else: + logging.info("Running on host system") + logging.info("=== LOGGING SETUP COMPLETE ===") diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..cab7e1b --- /dev/null +++ b/requirements.txt @@ -0,0 +1,20 @@ +# Telegram Bot Framework +aiogram==3.13.1 + +# Oracle Database +oracledb==2.5.0 + +# Async HTTP client (зависимость aiogram) +aiohttp==3.10.11 + +# Дополнительные зависимости для работы с данными +typing-extensions==4.12.2 + +# Для работы с датами и временем +python-dateutil==2.9.0 + +# Для логирования (встроенно в Python, но для совместимости) +# logging - встроенно + +# Для работы с переменными окружения +python-dotenv==1.0.1 \ No newline at end of file