diff --git a/.gitignore b/.gitignore index fa1b6c8..fe88a36 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,13 @@ __pycache__/ .venv/ CONTEXT.md CONTEXT.local.md +backups/ +infra1 +infra2 +infra3 +infra4 +иб1 +иб2 +иб3 +иб4 +Z-card_РФ.xlsx diff --git a/CONTEXT.md b/CONTEXT.md index b7f81c7..cf71ad9 100644 --- a/CONTEXT.md +++ b/CONTEXT.md @@ -6,13 +6,23 @@ - в двух режимах: `Инфраструктура` и `ИБ`. ## Основные файлы -- `main.py` - Flask-приложение (главная страница, API, админка, инициализация/миграция БД, импорт ИБ при необходимости). +- `main.py` - минимальный entrypoint Flask-приложения (запуск `app`). +- `zkart_app/__init__.py` - фабрика/инициализация приложения (`create_app`, регистрация роутов, `init_db`). +- `zkart_app/config.py` - конфиг и константы (пути, `ADMIN_PATH`, логин/пароль, env-флаги). +- `zkart_app/routes.py` - HTTP-роуты (`/`, `/api/data`, `/health`, админка, `/assets/mont-logo`). +- `zkart_app/db.py` - работа с SQLite, схемы, сидинг, импорт из `infra1-4`, загрузка матриц из XLSX. +- `templates/index.html` - шаблон главной страницы. +- `templates/admin.html` - шаблон админки. +- `templates/login.html` - шаблон логина в админку. +- `static/css/*` - стили интерфейса (главная/админка/логин). +- `static/js/*` - клиентские скрипты (главная/админка). - `requirements.txt` - зависимости Python. - `matrix.db` - SQLite-база со всеми сущностями по двум режимам. - `Dockerfile` - контейнеризация приложения. - `docker-compose.yml` - запуск сервиса в Docker. - `.dockerignore` - исключения для docker build context. - `mont_logo.png` - логотип, используется на главной. +- `favicon.png` - favicon сайта. ## Роуты - `/` - основной интерфейс с фильтрами. diff --git a/Dockerfile b/Dockerfile index bb66020..cbedbcb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,4 +12,4 @@ COPY . . EXPOSE 8000 -CMD ["gunicorn", "-w", "3", "-b", "0.0.0.0:8000", "main:app", "--timeout", "60"] +CMD ["sh", "-c", "gunicorn -w ${WEB_CONCURRENCY:-4} --threads ${GUNICORN_THREADS:-5} -b 0.0.0.0:8000 main:app --timeout 60"] diff --git a/README.md b/README.md index c77154f..5f40649 100644 --- a/README.md +++ b/README.md @@ -1,31 +1,49 @@ # MONT Vendor Maps Flask-приложение для визуализации и редактирования матрицы: -- вендор -> продукты -> категории -- в двух режимах: Инфраструктура и ИБ +- `вендор -> продукты -> категории` +- два контура: `Инфраструктура` и `ИБ` ## Возможности -- фильтрация по вендорам и категориям +- фильтрация по вендорам и категориям на главной - отображение продуктов по выбранным фильтрам -- переключение контуров `Инфраструктура / ИБ` -- отдельный визуальный стиль для ИБ -- админ-панель с редактированием: - - вендоров - - категорий - - продуктов - - матрицы `продукт × категория` +- переключение контура `Инфраструктура / ИБ` +- админ-панель: +- добавление/удаление вендоров +- добавление/удаление категорий +- добавление/удаление продуктов +- редактирование матрицы `продукт × категория` (автосохранение по чекбоксам) +- удобная прокрутка матрицы (вертикальная + горизонтальная) + +## Текущая структура проекта +- `main.py` - минимальный entrypoint +- `zkart_app/__init__.py` - `create_app`, регистрация роутов, `init_db` +- `zkart_app/config.py` - конфиг/константы (`ADMIN_PATH`, env, пути) +- `zkart_app/routes.py` - HTTP-роуты +- `zkart_app/db.py` - работа с SQLite, импорт и bootstrap +- `templates/` - HTML-шаблоны (`index.html`, `admin.html`, `login.html`) +- `static/css/` - CSS +- `static/js/` - JS +- `matrix.db` - рабочая SQLite БД + +## Роуты +- `/` - главная страница +- `/api/data?scope=infra|ib` - API данных матрицы +- `/health` - healthcheck +- `/assets/mont-logo` - логотип +- `/{ADMIN_PATH}` - админка (секретный путь в `zkart_app/config.py`) ## API `GET /api/data?scope=infra|ib` -Возвращает JSON: +Возвращает: - `vendors` - `categories` - `products` - `product_links` -- `links` (агрегированные vendor-category, для совместимости) +- `links` -## Локальный запуск +## Запуск локально ```bash python3 -m venv .venv .venv/bin/python -m ensurepip --upgrade @@ -38,17 +56,19 @@ python3 -m venv .venv docker compose up -d --build ``` -Приложение доступно на порту `5000`. +Порт: `5000`. ## Переменные окружения -- `SECRET_KEY` — секрет Flask-сессии. -- `ENABLE_BOOTSTRAP` — управление стартовым наполнением данных: - - `0` (по умолчанию): не выполнять автосидинг/автоимпорт; - - `1`: разрешить bootstrap (seed + импорт из `infra1..infra4` при подходящих условиях). +- `SECRET_KEY` - секрет Flask-сессии +- `ENABLE_BOOTSTRAP`: +- `0` (по умолчанию) - не выполнять автосидинг/автоимпорт +- `1` - разрешить bootstrap (seed + импорт) +- `WEB_CONCURRENCY` - число gunicorn worker-процессов (по умолчанию `4`) +- `GUNICORN_THREADS` - число потоков на worker (по умолчанию `5`) -## База данных -SQLite: `matrix.db`. +По умолчанию Gunicorn дает минимум `20` параллельных обработок (`4 x 5`). -Содержит данные по двум контурам (`infra` и `ib`), включая продукты и связи категорий. - -Если `matrix.db` уже заполнена, запускайте с `ENABLE_BOOTSTRAP=0` (дефолт), чтобы не выполнять лишнюю инициализацию. +## Данные +- Инфраструктурные пакеты импорта: `infra1..infra4` +- ИБ-пакеты импорта: `иб1..иб4` (используются для массового заполнения `ib_*` таблиц) +- Бэкапы БД: директория `backups/` diff --git a/Z-card_РФ.xlsx b/Z-card_РФ.xlsx deleted file mode 100644 index d5d1b9c..0000000 Binary files a/Z-card_РФ.xlsx and /dev/null differ diff --git a/docker-compose.yml b/docker-compose.yml index d030b92..7d664c0 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -4,6 +4,8 @@ services: container_name: zkart-app environment: SECRET_KEY: ${SECRET_KEY:-change-me-please} + WEB_CONCURRENCY: ${WEB_CONCURRENCY:-4} + GUNICORN_THREADS: ${GUNICORN_THREADS:-5} volumes: - ./matrix.db:/app/matrix.db restart: unless-stopped diff --git a/matrix.db b/matrix.db index 7bb6054..898c929 100644 Binary files a/matrix.db and b/matrix.db differ