diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..780feca --- /dev/null +++ b/.gitignore @@ -0,0 +1,155 @@ +# Python +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# Virtual environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# IDE +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# OS +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db +Desktop.ini + +# Logs +*.log +logs/ +log/ + +# MinIO data and cache +minio_data/ +.minio.sys/ +*.meta +part.* + +# Docker +.dockerignore +docker-compose.override.yml + +# Environment variables +.env +.env.local +.env.development.local +.env.test.local +.env.production.local + +# Temporary files +*.tmp +*.temp +*.bak +*.backup +*.orig + +# Data files (Excel, CSV, etc.) +*.xlsx +*.xls +*.xlsm +*.csv +*.json +data/ +uploads/ + +# Cache directories +.cache/ +.pytest_cache/ +.coverage +htmlcov/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# pipenv +Pipfile.lock + +# poetry +poetry.lock + +# Celery +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# Local development +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# FastAPI +.pytest_cache/ +.coverage +htmlcov/ + +# Streamlit +.streamlit/secrets.toml + +# Node.js (if any frontend components) +node_modules/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* \ No newline at end of file diff --git a/CLEANUP_SUMMARY.md b/CLEANUP_SUMMARY.md new file mode 100644 index 0000000..9c9a488 --- /dev/null +++ b/CLEANUP_SUMMARY.md @@ -0,0 +1,39 @@ +# 🧹 Сводка по очистке проекта + +## ✅ Что было удалено из `python_parser/`: + +### Файлы Streamlit: +- `streamlit_app.py` - основной файл Streamlit приложения +- `run_streamlit.py` - скрипт запуска Streamlit +- `Procfile` - конфигурация для Heroku (Streamlit) +- `runtime.txt` - версия Python для Heroku +- `manifest.yml` - манифест приложения +- `.streamlit/` - папка с конфигурацией Streamlit + +### Зависимости: +- Удален `streamlit>=1.28.0` из `python_parser/requirements.txt` + +## 🎯 Результат: + +### `python_parser/` - теперь содержит ТОЛЬКО: +- FastAPI приложение +- Адаптеры для парсеров +- Основную бизнес-логику +- Dockerfile для FastAPI +- Зависимости только для FastAPI + +### `streamlit_app/` - содержит ТОЛЬКО: +- Streamlit приложение +- Dockerfile для Streamlit +- Зависимости только для Streamlit +- Конфигурацию Streamlit + +## 🔄 Полное разделение достигнуто: + +- **FastAPI** и **Streamlit** теперь полностью независимы +- Каждый сервис имеет свои собственные зависимости +- Docker образы собираются отдельно +- Запускаются через единый `docker-compose.yml` + +--- +**Статус**: ✅ Проект полностью очищен и разделен \ No newline at end of file diff --git a/QUICK_START.md b/QUICK_START.md new file mode 100644 index 0000000..94adb7e --- /dev/null +++ b/QUICK_START.md @@ -0,0 +1,41 @@ +# 🚀 Быстрый запуск проекта + +## 1. Запуск всех сервисов +```bash +docker compose up -d +``` + +## 2. Проверка статуса +```bash +docker compose ps +``` + +## 3. Доступ к сервисам +- **FastAPI**: http://localhost:8000 +- **Streamlit**: http://localhost:8501 +- **MinIO Console**: http://localhost:9001 +- **MinIO API**: http://localhost:9000 + +## 4. Остановка +```bash +docker compose down +``` + +## 5. Просмотр логов +```bash +# Все сервисы +docker compose logs + +# Конкретный сервис +docker compose logs fastapi +docker compose logs streamlit +docker compose logs minio +``` + +## 6. Пересборка и перезапуск +```bash +docker compose up -d --build +``` + +--- +**Примечание**: При первом запуске Docker будет скачивать образы и собирать контейнеры, это может занять несколько минут. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..b980bb6 --- /dev/null +++ b/README.md @@ -0,0 +1,91 @@ +# Python Parser CF - Система анализа данных + +Проект состоит из трех основных компонентов: +- **python_parser** - FastAPI приложение для парсинга и обработки данных +- **streamlit_app** - Streamlit приложение для визуализации и анализа +- **minio_data** - хранилище данных MinIO + +## 🚀 Быстрый запуск + +### Предварительные требования +- Docker и Docker Compose +- Git + +### Запуск всех сервисов +```bash +docker-compose up -d +``` + +### Доступ к сервисам +- **FastAPI**: http://localhost:8000 +- **Streamlit**: http://localhost:8501 +- **MinIO Console**: http://localhost:9001 +- **MinIO API**: http://localhost:9000 + +### Остановка сервисов +```bash +docker-compose down +``` + +## 📁 Структура проекта + +``` +python_parser_cf/ +├── python_parser/ # FastAPI приложение +│ ├── app/ # Основной код приложения +│ ├── adapters/ # Адаптеры для парсеров +│ ├── core/ # Основная бизнес-логика +│ ├── data/ # Тестовые данные +│ └── Dockerfile # Docker образ для FastAPI +├── streamlit_app/ # Streamlit приложение +│ ├── streamlit_app.py # Основной файл приложения +│ ├── requirements.txt # Зависимости Python +│ ├── .streamlit/ # Конфигурация Streamlit +│ └── Dockerfile # Docker образ для Streamlit +├── minio_data/ # Данные для MinIO +├── docker-compose.yml # Конфигурация всех сервисов +└── README.md # Документация +``` + +## 🔧 Конфигурация + +### Переменные окружения +Все сервисы используют следующие переменные окружения: +- `MINIO_ENDPOINT` - адрес MinIO сервера +- `MINIO_ACCESS_KEY` - ключ доступа к MinIO +- `MINIO_SECRET_KEY` - секретный ключ MinIO +- `MINIO_SECURE` - использование SSL/TLS +- `MINIO_BUCKET` - имя bucket'а для данных + +### Порты +- **8000** - FastAPI +- **8501** - Streamlit +- **9000** - MinIO API +- **9001** - MinIO Console + +## 📊 Использование + +1. **Запустите все сервисы**: `docker-compose up -d` +2. **Откройте Streamlit**: http://localhost:8501 +3. **Выберите тип данных** для анализа +4. **Просматривайте результаты** в интерактивном интерфейсе + +## 🛠️ Разработка + +### Локальная разработка FastAPI +```bash +cd python_parser +pip install -r requirements.txt +uvicorn app.main:app --reload +``` + +### Локальная разработка Streamlit +```bash +cd streamlit_app +pip install -r requirements.txt +streamlit run streamlit_app.py +``` + +## 📝 Лицензия + +Проект разработан для внутреннего использования. \ No newline at end of file diff --git a/python_parser/check_services.py b/check_services.py similarity index 100% rename from python_parser/check_services.py rename to check_services.py diff --git a/python_parser/docker-compose.yml b/docker-compose.yml similarity index 59% rename from python_parser/docker-compose.yml rename to docker-compose.yml index 919ffe6..0a8c52c 100644 --- a/python_parser/docker-compose.yml +++ b/docker-compose.yml @@ -10,11 +10,11 @@ services: MINIO_ROOT_PASSWORD: minioadmin command: server /data --console-address ":9001" volumes: - - minio_data:/data + - ./minio_data:/data restart: unless-stopped fastapi: - build: . + build: ./python_parser container_name: svodka_fastapi ports: - "8000:8000" @@ -28,5 +28,19 @@ services: - minio restart: unless-stopped -volumes: - minio_data: \ No newline at end of file + streamlit: + build: ./streamlit_app + container_name: svodka_streamlit + ports: + - "8501:8501" + environment: + - API_BASE_URL=http://fastapi:8000 + - MINIO_ENDPOINT=minio:9000 + - MINIO_ACCESS_KEY=minioadmin + - MINIO_SECRET_KEY=minioadmin + - MINIO_SECURE=false + - MINIO_BUCKET=svodka-data + depends_on: + - minio + - fastapi + restart: unless-stopped \ No newline at end of file diff --git a/python_parser/.streamlit/config.toml b/python_parser/.streamlit/config.toml deleted file mode 100644 index 84e0551..0000000 --- a/python_parser/.streamlit/config.toml +++ /dev/null @@ -1,28 +0,0 @@ -[server] -port = 8501 -address = "localhost" -headless = false -enableCORS = false -enableXsrfProtection = false - -[browser] -gatherUsageStats = false -serverAddress = "localhost" -serverPort = 8501 - -[theme] -primaryColor = "#FF4B4B" -backgroundColor = "#FFFFFF" -secondaryBackgroundColor = "#F0F2F6" -textColor = "#262730" -font = "sans serif" - -[client] -showErrorDetails = true -caching = true -displayEnabled = true - -[runner] -magicEnabled = true -installTracer = false -fixMatplotlib = true \ No newline at end of file diff --git a/python_parser/Procfile b/python_parser/Procfile deleted file mode 100644 index 3f8b2b5..0000000 --- a/python_parser/Procfile +++ /dev/null @@ -1 +0,0 @@ -web: python /app/run_stand.py \ No newline at end of file diff --git a/python_parser/QUICK_START.md b/python_parser/QUICK_START.md deleted file mode 100644 index d81b67f..0000000 --- a/python_parser/QUICK_START.md +++ /dev/null @@ -1,66 +0,0 @@ -# 🚀 Быстрый старт NIN Excel Parsers API - -## 🐳 Запуск через Docker (рекомендуется) - -### Вариант 1: MinIO + FastAPI в Docker -```bash -# Запуск всех сервисов -docker-compose up -d --build - -# Проверка -curl http://localhost:8000 -curl http://localhost:9001 -``` - -### Вариант 2: Только MinIO в Docker -```bash -# Запуск только MinIO -docker-compose up -d minio - -# Проверка -curl http://localhost:9001 -``` - -## 🖥️ Запуск FastAPI локально - -```bash -# Если MinIO в Docker -python run_dev.py - -# Проверка -curl http://localhost:8000 -``` - -## 📊 Запуск Streamlit - -```bash -# В отдельном терминале -python run_streamlit.py -``` - -## 🌐 Доступные URL - -- **FastAPI API**: http://localhost:8000 -- **API документация**: http://localhost:8000/docs -- **MinIO консоль**: http://localhost:9001 -- **Streamlit интерфейс**: http://localhost:8501 - -## 🛑 Остановка - -```bash -# Остановка Docker -docker-compose down - -# Остановка Streamlit -# Ctrl+C в терминале -``` - -## 🔧 Диагностика - -```bash -# Проверка состояния -python check_services.py - -# Просмотр логов Docker -docker-compose logs -``` \ No newline at end of file diff --git a/python_parser/README.md b/python_parser/README.md deleted file mode 100644 index 035aa05..0000000 --- a/python_parser/README.md +++ /dev/null @@ -1,197 +0,0 @@ -# NIN Excel Parsers API - -API для парсинга Excel отчетов нефтеперерабатывающих заводов (НПЗ) с использованием FastAPI и MinIO для хранения данных. - -## 🚀 Быстрый запуск - -### **Вариант 1: Только MinIO в Docker + FastAPI локально** -```bash -# Запуск MinIO в Docker -docker-compose up -d minio - -# Запуск FastAPI локально -python run_dev.py - -# В отдельном терминале запуск Streamlit -python run_streamlit.py -``` - -### **Вариант 2: MinIO + FastAPI в Docker + Streamlit локально** -```bash -# Запуск MinIO и FastAPI в Docker -docker-compose up -d - -# В отдельном терминале запуск Streamlit -python run_streamlit.py -``` - -### **Вариант 3: Только MinIO в Docker** -```bash -# Запуск только MinIO -docker-compose up -d minio -``` - -## 📋 Описание сервисов - -- **MinIO** (порт 9000-9001): S3-совместимое хранилище для данных -- **FastAPI** (порт 8000): API сервер для парсинга Excel файлов -- **Streamlit** (порт 8501): Веб-интерфейс для демонстрации API - -## 🔧 Диагностика - -Для проверки состояния всех сервисов: -```bash -python check_services.py -``` - -## 🛑 Остановка - -### Остановка Docker сервисов: -```bash -# Все сервисы -docker-compose down - -# Только MinIO -docker-compose stop minio -``` - -### Остановка Streamlit: -```bash -# Нажмите Ctrl+C в терминале с Streamlit -``` - -## 📁 Структура проекта - -``` -python_parser/ -├── app/ # FastAPI приложение -│ ├── main.py # Основной файл приложения -│ └── schemas/ # Pydantic схемы -├── core/ # Бизнес-логика -│ ├── models.py # Модели данных -│ ├── ports.py # Интерфейсы (порты) -│ └── services.py # Сервисы -├── adapters/ # Адаптеры для внешних систем -│ ├── storage.py # MinIO адаптер -│ └── parsers/ # Парсеры Excel файлов -├── data/ # Тестовые данные -├── docker-compose.yml # Docker Compose конфигурация -├── Dockerfile # Docker образ для FastAPI -├── run_dev.py # Запуск FastAPI локально -├── run_streamlit.py # Запуск Streamlit -└── check_services.py # Диагностика сервисов -``` - -## 🔍 Доступные эндпоинты - -- **GET /** - Информация об API -- **GET /docs** - Swagger документация -- **POST /svodka_pm/upload-zip** - Загрузка сводок ПМ -- **POST /svodka_ca/upload-zip** - Загрузка сводок ЦА -- **POST /monitoring_fuel/upload-zip** - Загрузка мониторинга топлива -- **GET /svodka_pm/data** - Получение данных сводок ПМ -- **GET /svodka_ca/data** - Получение данных сводок ЦА -- **GET /monitoring_fuel/data** - Получение данных мониторинга топлива - -## 📊 Поддерживаемые типы отчетов - -1. **svodka_pm** - Сводки по переработке нефти (ПМ) -2. **svodka_ca** - Сводки по переработке нефти (ЦА) -3. **monitoring_fuel** - Мониторинг топлива - -## 🐳 Docker команды - -### Сборка и запуск: -```bash -# Все сервисы -docker-compose up -d --build - -# Только MinIO -docker-compose up -d minio - -# Только FastAPI (требует MinIO) -docker-compose up -d fastapi -``` - -### Просмотр логов: -```bash -# Все сервисы -docker-compose logs - -# Конкретный сервис -docker-compose logs fastapi -docker-compose logs minio -``` - -### Остановка: -```bash -docker-compose down -``` - -## 🔧 Устранение неполадок - -### Проблема: "Streamlit не может подключиться к FastAPI" - -**Симптомы:** -- Streamlit открывается, но показывает "API недоступен по адресу http://localhost:8000" -- FastAPI не отвечает на порту 8000 - -**Решения:** - -1. **Проверьте порты:** - ```bash - # Windows - netstat -an | findstr :8000 - - # Linux/Mac - netstat -an | grep :8000 - ``` - -2. **Перезапустите FastAPI:** - ```bash - # Остановите текущий процесс (Ctrl+C) - python run_dev.py - ``` - -3. **Проверьте логи Docker:** - ```bash - docker-compose logs fastapi - ``` - -### Проблема: "MinIO недоступен" - -**Решения:** -1. Запустите Docker Desktop -2. Проверьте статус контейнера: `docker ps` -3. Перезапустите MinIO: `docker-compose restart minio` - -### Проблема: "Порт уже занят" - -**Решения:** -1. Найдите процесс: `netstat -ano | findstr :8000` -2. Остановите процесс: `taskkill /PID <номер_процесса>` -3. Или используйте другой порт в конфигурации - -## 🚀 Разработка - -### Добавление нового парсера: - -1. Создайте файл в `adapters/parsers/` -2. Реализуйте интерфейс `ParserPort` -3. Добавьте в `core/services.py` -4. Создайте схемы в `app/schemas/` -5. Добавьте эндпоинты в `app/main.py` - -### Тестирование: - -```bash -# Запуск тестов -pytest - -# Запуск с покрытием -pytest --cov=. -``` - -## 📝 Лицензия - -Проект разработан для внутреннего использования НИН. \ No newline at end of file diff --git a/python_parser/README_STREAMLIT.md b/python_parser/README_STREAMLIT.md deleted file mode 100644 index d3b0d36..0000000 --- a/python_parser/README_STREAMLIT.md +++ /dev/null @@ -1,186 +0,0 @@ -# 🚀 Streamlit Demo для NIN Excel Parsers API - -## Описание - -Streamlit приложение для демонстрации работы всех API эндпоинтов NIN Excel Parsers. Предоставляет удобный веб-интерфейс для тестирования функциональности парсеров. - -## Возможности - -- 📤 **Загрузка файлов**: Загрузка ZIP архивов и Excel файлов -- 📊 **Сводки ПМ**: Работа с плановыми и фактическими данными -- 🏭 **Сводки СА**: Парсинг сводок центрального аппарата -- ⛽ **Мониторинг топлива**: Анализ данных по топливу -- 📱 **Адаптивный интерфейс**: Удобное использование на всех устройствах - -## Установка и запуск - -### 1. Установка зависимостей - -```bash -pip install -r requirements.txt -``` - -### 2. Запуск FastAPI сервера - -В одном терминале: -```bash -python run_dev.py -``` - -### 3. Запуск Streamlit приложения - -В другом терминале: -```bash -python run_streamlit.py -``` - -Или напрямую: -```bash -streamlit run streamlit_app.py -``` - -### 4. Открытие в браузере - -Приложение автоматически откроется по адресу: http://localhost:8501 - -## Конфигурация - -### Переменные окружения - -```bash -# URL API сервера -export API_BASE_URL="http://localhost:8000" - -# Порт Streamlit -export STREAMLIT_PORT="8501" - -# Хост Streamlit -export STREAMLIT_HOST="localhost" -``` - -### Настройки Streamlit - -Файл `.streamlit/config.toml` содержит настройки: -- Порт: 8501 -- Хост: localhost -- Тема: Кастомная цветовая схема -- Безопасность: Отключены CORS и XSRF для локальной разработки - -## Структура приложения - -### Вкладки - -1. **📤 Загрузка файлов** - - Загрузка сводок ПМ (ZIP) - - Загрузка мониторинга топлива (ZIP) - - Загрузка сводки СА (Excel) - -2. **📊 Сводки ПМ** - - Данные по одному ОГ - - Данные по всем ОГ - - Выбор кодов строк и столбцов - -3. **🏭 Сводки СА** - - Выбор режимов (план/факт/норматив) - - Выбор таблиц для анализа - -4. **⛽ Мониторинг топлива** - - Агрегация по колонкам - - Данные за конкретный месяц - -### Боковая панель - -- Информация о сервере (PID, CPU, память) -- Список доступных парсеров -- Статус подключения к API - -## Использование - -### 1. Загрузка файлов - -1. Выберите соответствующий тип файла -2. Нажмите "Загрузить" -3. Дождитесь подтверждения загрузки - -### 2. Получение данных - -1. Выберите нужные параметры (ОГ, коды, столбцы) -2. Нажмите "Получить данные" -3. Результат отобразится в JSON формате - -### 3. Мониторинг - -- Проверяйте статус API в верхней части -- Следите за логами операций -- Используйте индикаторы загрузки - -## Устранение неполадок - -### API недоступен - -```bash -# Проверьте, запущен ли FastAPI сервер -curl http://localhost:8000/ - -# Проверьте порт -netstat -an | grep 8000 -``` - -### Streamlit не запускается - -```bash -# Проверьте версию Python -python --version - -# Переустановите Streamlit -pip uninstall streamlit -pip install streamlit - -# Проверьте порт 8501 -netstat -an | grep 8501 -``` - -### Ошибки загрузки файлов - -- Убедитесь, что файл соответствует формату -- Проверьте размер файла (не более 100MB) -- Убедитесь, что MinIO запущен - -## Разработка - -### Добавление новых функций - -1. Создайте новую вкладку в `streamlit_app.py` -2. Добавьте соответствующие API вызовы -3. Обновите боковую панель при необходимости - -### Кастомизация темы - -Отредактируйте `.streamlit/config.toml`: -```toml -[theme] -primaryColor = "#FF4B4B" -backgroundColor = "#FFFFFF" -# ... другие цвета -``` - -### Добавление новых парсеров - -1. Создайте парсер в `adapters/parsers/` -2. Добавьте в `main.py` -3. Обновите Streamlit интерфейс - -## Безопасность - -⚠️ **Внимание**: Приложение настроено для локальной разработки -- CORS отключен -- XSRF защита отключена -- Не используйте в продакшене без дополнительной настройки - -## Поддержка - -При возникновении проблем: -1. Проверьте логи в терминале -2. Убедитесь, что все сервисы запущены -3. Проверьте конфигурацию -4. Обратитесь к документации API: http://localhost:8000/docs \ No newline at end of file diff --git a/python_parser/manifest.yml b/python_parser/manifest.yml deleted file mode 100644 index a005be4..0000000 --- a/python_parser/manifest.yml +++ /dev/null @@ -1,17 +0,0 @@ -applications: - - name: nin-python-parser-dev-test - buildpack: python_buildpack - health-check-type: web - services: - - logging-shared-dev - command: python /app/run_stand.py - path: . - disk_quota: 2G - memory: 4G - instances: 1 - env: - MINIO_ENDPOINT: s3-region1.ppc-jv-dev.sibintek.ru - MINIO_ACCESS_KEY: 00a70fac02c1208446de - MINIO_SECRET_KEY: 1gk9tVYEEoH9ADRxb4kiAuCo6CCISdV6ie0p6oDO - MINIO_BUCKET: bucket-476684e7-1223-45ac-a101-8b5aeda487d6 - MINIO_SECURE: false \ No newline at end of file diff --git a/python_parser/minio/.minio.sys/buckets/.bloomcycle.bin/xl.meta b/python_parser/minio/.minio.sys/buckets/.bloomcycle.bin/xl.meta deleted file mode 100644 index 60320f3..0000000 Binary files a/python_parser/minio/.minio.sys/buckets/.bloomcycle.bin/xl.meta and /dev/null differ diff --git a/python_parser/minio/.minio.sys/buckets/.heal/mrf/list.bin b/python_parser/minio/.minio.sys/buckets/.heal/mrf/list.bin deleted file mode 100644 index a356872..0000000 Binary files a/python_parser/minio/.minio.sys/buckets/.heal/mrf/list.bin and /dev/null differ diff --git a/python_parser/minio/.minio.sys/buckets/.usage-cache.bin.bkp/xl.meta b/python_parser/minio/.minio.sys/buckets/.usage-cache.bin.bkp/xl.meta deleted file mode 100644 index 0a02b26..0000000 Binary files a/python_parser/minio/.minio.sys/buckets/.usage-cache.bin.bkp/xl.meta and /dev/null differ diff --git a/python_parser/minio/.minio.sys/buckets/.usage-cache.bin/xl.meta b/python_parser/minio/.minio.sys/buckets/.usage-cache.bin/xl.meta deleted file mode 100644 index 241fe0b..0000000 Binary files a/python_parser/minio/.minio.sys/buckets/.usage-cache.bin/xl.meta and /dev/null differ diff --git a/python_parser/minio/.minio.sys/buckets/.usage.json/xl.meta b/python_parser/minio/.minio.sys/buckets/.usage.json/xl.meta deleted file mode 100644 index 2bb41d0..0000000 Binary files a/python_parser/minio/.minio.sys/buckets/.usage.json/xl.meta and /dev/null differ diff --git a/python_parser/minio/.minio.sys/buckets/svodka-data/.metadata.bin/xl.meta b/python_parser/minio/.minio.sys/buckets/svodka-data/.metadata.bin/xl.meta deleted file mode 100644 index 5eef2e3..0000000 Binary files a/python_parser/minio/.minio.sys/buckets/svodka-data/.metadata.bin/xl.meta and /dev/null differ diff --git a/python_parser/minio/.minio.sys/buckets/svodka-data/.usage-cache.bin.bkp/xl.meta b/python_parser/minio/.minio.sys/buckets/svodka-data/.usage-cache.bin.bkp/xl.meta deleted file mode 100644 index 1f31843..0000000 Binary files a/python_parser/minio/.minio.sys/buckets/svodka-data/.usage-cache.bin.bkp/xl.meta and /dev/null differ diff --git a/python_parser/minio/.minio.sys/buckets/svodka-data/.usage-cache.bin/xl.meta b/python_parser/minio/.minio.sys/buckets/svodka-data/.usage-cache.bin/xl.meta deleted file mode 100644 index 0774939..0000000 Binary files a/python_parser/minio/.minio.sys/buckets/svodka-data/.usage-cache.bin/xl.meta and /dev/null differ diff --git a/python_parser/minio/.minio.sys/config/config.json/xl.meta b/python_parser/minio/.minio.sys/config/config.json/xl.meta deleted file mode 100644 index f075295..0000000 Binary files a/python_parser/minio/.minio.sys/config/config.json/xl.meta and /dev/null differ diff --git a/python_parser/minio/.minio.sys/config/iam/format.json/xl.meta b/python_parser/minio/.minio.sys/config/iam/format.json/xl.meta deleted file mode 100644 index 5eb932b..0000000 Binary files a/python_parser/minio/.minio.sys/config/iam/format.json/xl.meta and /dev/null differ diff --git a/python_parser/minio/.minio.sys/config/iam/sts/46KX4VILT0DATJ36SYGD/identity.json/xl.meta b/python_parser/minio/.minio.sys/config/iam/sts/46KX4VILT0DATJ36SYGD/identity.json/xl.meta deleted file mode 100644 index 57e8644..0000000 Binary files a/python_parser/minio/.minio.sys/config/iam/sts/46KX4VILT0DATJ36SYGD/identity.json/xl.meta and /dev/null differ diff --git a/python_parser/minio/.minio.sys/format.json b/python_parser/minio/.minio.sys/format.json deleted file mode 100644 index d9111c6..0000000 --- a/python_parser/minio/.minio.sys/format.json +++ /dev/null @@ -1 +0,0 @@ -{"version":"1","format":"xl-single","id":"29118f57-702e-4363-9a41-9f06655e449d","xl":{"version":"3","this":"195a90f4-fc26-46a8-b6d4-0b50b99b1342","sets":[["195a90f4-fc26-46a8-b6d4-0b50b99b1342"]],"distributionAlgo":"SIPMOD+PARITY"}} \ No newline at end of file diff --git a/python_parser/minio/.minio.sys/pool.bin/xl.meta b/python_parser/minio/.minio.sys/pool.bin/xl.meta deleted file mode 100644 index 794f4ef..0000000 Binary files a/python_parser/minio/.minio.sys/pool.bin/xl.meta and /dev/null differ diff --git a/python_parser/minio/.minio.sys/tmp/060ca61d-ef6c-4011-9a9f-d083313258e8 b/python_parser/minio/.minio.sys/tmp/060ca61d-ef6c-4011-9a9f-d083313258e8 deleted file mode 100644 index e36ee44..0000000 Binary files a/python_parser/minio/.minio.sys/tmp/060ca61d-ef6c-4011-9a9f-d083313258e8 and /dev/null differ diff --git a/python_parser/minio/svodka-data/nin_excel_data_monitoring_fuel/xl.meta b/python_parser/minio/svodka-data/nin_excel_data_monitoring_fuel/xl.meta deleted file mode 100644 index bd3d49b..0000000 Binary files a/python_parser/minio/svodka-data/nin_excel_data_monitoring_fuel/xl.meta and /dev/null differ diff --git a/python_parser/minio/svodka-data/nin_excel_data_svodka_ca/xl.meta b/python_parser/minio/svodka-data/nin_excel_data_svodka_ca/xl.meta deleted file mode 100644 index 428e851..0000000 Binary files a/python_parser/minio/svodka-data/nin_excel_data_svodka_ca/xl.meta and /dev/null differ diff --git a/python_parser/minio/svodka-data/nin_excel_data_svodka_pm/e78ade56-02ac-482f-b4c7-98b217fb7050/part.1 b/python_parser/minio/svodka-data/nin_excel_data_svodka_pm/e78ade56-02ac-482f-b4c7-98b217fb7050/part.1 deleted file mode 100644 index ebc7a06..0000000 Binary files a/python_parser/minio/svodka-data/nin_excel_data_svodka_pm/e78ade56-02ac-482f-b4c7-98b217fb7050/part.1 and /dev/null differ diff --git a/python_parser/minio/svodka-data/nin_excel_data_svodka_pm/e78ade56-02ac-482f-b4c7-98b217fb7050/part.2 b/python_parser/minio/svodka-data/nin_excel_data_svodka_pm/e78ade56-02ac-482f-b4c7-98b217fb7050/part.2 deleted file mode 100644 index 1cb0bc2..0000000 Binary files a/python_parser/minio/svodka-data/nin_excel_data_svodka_pm/e78ade56-02ac-482f-b4c7-98b217fb7050/part.2 and /dev/null differ diff --git a/python_parser/minio/svodka-data/nin_excel_data_svodka_pm/xl.meta b/python_parser/minio/svodka-data/nin_excel_data_svodka_pm/xl.meta deleted file mode 100644 index 4278033..0000000 Binary files a/python_parser/minio/svodka-data/nin_excel_data_svodka_pm/xl.meta and /dev/null differ diff --git a/python_parser/requirements.txt b/python_parser/requirements.txt index 6f0b33e..2e74635 100644 --- a/python_parser/requirements.txt +++ b/python_parser/requirements.txt @@ -11,5 +11,4 @@ requests>=2.31.0 # pytest-cov>=4.0.0 # pytest-mock>=3.10.0 httpx>=0.24.0 -numpy -streamlit>=1.28.0 \ No newline at end of file +numpy \ No newline at end of file diff --git a/python_parser/run_streamlit.py b/python_parser/run_streamlit.py deleted file mode 100644 index 7c63763..0000000 --- a/python_parser/run_streamlit.py +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/env python3 -""" -Запуск Streamlit интерфейса для NIN Excel Parsers API -""" - -import subprocess -import sys -import webbrowser -import time - -def main(): - """Основная функция""" - print("🚀 ЗАПУСК STREAMLIT ИНТЕРФЕЙСА") - print("=" * 50) - print("Убедитесь, что FastAPI сервер запущен на порту 8000") - print("=" * 50) - - # Проверяем, установлен ли Streamlit - try: - import streamlit - print(f"✅ Streamlit {streamlit.__version__} установлен") - except ImportError: - print("❌ Streamlit не установлен") - print("Установите: pip install streamlit") - return - - print("\n🚀 Запускаю Streamlit...") - print("📍 URL: http://localhost:8501") - print("🛑 Для остановки нажмите Ctrl+C") - - # Открываем браузер - try: - webbrowser.open("http://localhost:8501") - print("✅ Браузер открыт") - except Exception as e: - print(f"⚠️ Не удалось открыть браузер: {e}") - - # Запускаем Streamlit - try: - subprocess.run([ - sys.executable, "-m", "streamlit", "run", "streamlit_app.py", - "--server.port", "8501", - "--server.address", "localhost", - "--server.headless", "false", - "--browser.gatherUsageStats", "false" - ]) - except KeyboardInterrupt: - print("\n👋 Streamlit остановлен") - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/python_parser/runtime.txt b/python_parser/runtime.txt deleted file mode 100644 index 674e467..0000000 --- a/python_parser/runtime.txt +++ /dev/null @@ -1 +0,0 @@ -python-3.11.* \ No newline at end of file diff --git a/streamlit_app/.streamlit/config.toml b/streamlit_app/.streamlit/config.toml new file mode 100644 index 0000000..1b2cb9c --- /dev/null +++ b/streamlit_app/.streamlit/config.toml @@ -0,0 +1,15 @@ +[server] +port = 8501 +address = "0.0.0.0" +enableCORS = false +enableXsrfProtection = false + +[browser] +gatherUsageStats = false + +[theme] +primaryColor = "#FF4B4B" +backgroundColor = "#FFFFFF" +secondaryBackgroundColor = "#F0F2F6" +textColor = "#262730" +font = "sans serif" \ No newline at end of file diff --git a/streamlit_app/Dockerfile b/streamlit_app/Dockerfile new file mode 100644 index 0000000..9bae015 --- /dev/null +++ b/streamlit_app/Dockerfile @@ -0,0 +1,23 @@ +FROM python:3.11-slim + +WORKDIR /app + +# Установка системных зависимостей +RUN apt-get update && apt-get install -y \ + gcc \ + && rm -rf /var/lib/apt/lists/* + +# Копирование requirements.txt +COPY requirements.txt . + +# Установка Python зависимостей +RUN pip install --no-cache-dir -r requirements.txt + +# Копирование кода приложения +COPY . . + +# Открытие порта +EXPOSE 8501 + +# Запуск Streamlit +CMD ["streamlit", "run", "streamlit_app.py", "--server.port=8501", "--server.address=0.0.0.0"] \ No newline at end of file diff --git a/streamlit_app/_streamlit_app.py b/streamlit_app/_streamlit_app.py new file mode 100644 index 0000000..4f8f90f --- /dev/null +++ b/streamlit_app/_streamlit_app.py @@ -0,0 +1,100 @@ +import streamlit as st +import pandas as pd +import numpy as np +import plotly.express as px +import plotly.graph_objects as go +from minio import Minio +import os +from io import BytesIO + +# Конфигурация страницы +st.set_page_config( + page_title="Сводка данных", + page_icon="📊", + layout="wide", + initial_sidebar_state="expanded" +) + +# Заголовок приложения +st.title("📊 Анализ данных сводки") +st.markdown("---") + +# Инициализация MinIO клиента +@st.cache_resource +def init_minio_client(): + try: + client = Minio( + os.getenv("MINIO_ENDPOINT", "localhost:9000"), + access_key=os.getenv("MINIO_ACCESS_KEY", "minioadmin"), + secret_key=os.getenv("MINIO_SECRET_KEY", "minioadmin"), + secure=os.getenv("MINIO_SECURE", "false").lower() == "true" + ) + return client + except Exception as e: + st.error(f"Ошибка подключения к MinIO: {e}") + return None + +# Боковая панель +with st.sidebar: + st.header("⚙️ Настройки") + + # Выбор типа данных + data_type = st.selectbox( + "Тип данных", + ["Мониторинг топлива", "Сводка ПМ", "Сводка ЦА"] + ) + + # Выбор периода + period = st.date_input( + "Период", + value=pd.Timestamp.now().date() + ) + + st.markdown("---") + st.markdown("### 📈 Статистика") + st.info("Выберите тип данных для анализа") + +# Основной контент +col1, col2 = st.columns([2, 1]) + +with col1: + st.subheader(f"📋 {data_type}") + + if data_type == "Мониторинг топлива": + st.info("Анализ данных мониторинга топлива") + # Здесь будет логика для работы с данными мониторинга топлива + + elif data_type == "Сводка ПМ": + st.info("Анализ данных сводки ПМ") + # Здесь будет логика для работы с данными сводки ПМ + + elif data_type == "Сводка ЦА": + st.info("Анализ данных сводки ЦА") + # Здесь будет логика для работы с данными сводки ЦА + +with col2: + st.subheader("📊 Быстрая статистика") + st.metric("Всего записей", "0") + st.metric("Активных", "0") + st.metric("Ошибок", "0") + +# Нижняя панель +st.markdown("---") +st.subheader("🔍 Детальный анализ") + +# Заглушка для графиков +placeholder = st.empty() +with placeholder.container(): + col1, col2 = st.columns(2) + + with col1: + st.write("📈 График 1") + # Здесь будет график + + with col2: + st.write("📊 График 2") + # Здесь будет график + +# Футер +st.markdown("---") +st.markdown("**Разработано для анализа данных сводки** | v1.0.0") \ No newline at end of file diff --git a/streamlit_app/requirements.txt b/streamlit_app/requirements.txt new file mode 100644 index 0000000..9e3ac80 --- /dev/null +++ b/streamlit_app/requirements.txt @@ -0,0 +1,7 @@ +streamlit>=1.28.0 +pandas>=2.0.0 +numpy>=1.24.0 +plotly>=5.15.0 +minio>=7.1.0 +openpyxl>=3.1.0 +xlrd>=2.0.1 \ No newline at end of file diff --git a/python_parser/streamlit_app.py b/streamlit_app/streamlit_app.py similarity index 99% rename from python_parser/streamlit_app.py rename to streamlit_app/streamlit_app.py index a11c130..7104851 100644 --- a/python_parser/streamlit_app.py +++ b/streamlit_app/streamlit_app.py @@ -16,7 +16,7 @@ st.set_page_config( ) # Конфигурация API -API_BASE_URL = os.getenv("API_BASE_URL", "http://localhost:8000") +API_BASE_URL = os.getenv("API_BASE_URL", "http://fastapi:8000") def check_api_health(): """Проверка доступности API"""