# Локальное окружение scan-gateway. Скопируйте в .env: cp .env.example .env (.env в git не попадает) # Значения совпадают с ../docs/dev/docker-compose.yml и ../docs/dev/.env (compose: NATS 4222, MinIO 9000, бакет arm-ka); # это только dev-умолчания. Файл окружения можно выбрать переменной ENV_FILE (по умолчанию .env, путь от каталога api/); # переменные окружения приоритетнее файла. Тестовый набор — .env.test (его подключает pytest.ini). DEBUG=true # --- MinIO (S3): единственный бакет, в нём лежат входные файлы, raw/{job_id}.json и results/ --- # Адрес без схемы (host:port) — так ждёт miniopy-async; MinIO из compose работает по http, поэтому MINIO_SECURE=false. # На платформе MINIO_SECURE не задаётся (по умолчанию true — https). OPENBAO__MINIO__MINIO_URL=localhost:9000 OPENBAO__MINIO__MINIO_ADMIN_LOGIN=minioadmin OPENBAO__MINIO__MINIO_ADMIN_PASSWORD=minioadmin OPENBAO__MINIO__MINIO_BUCKET=arm-ka OPENBAO__MINIO__MINIO_SECURE=false # --- NATS (core, без JetStream) --- # NATS_SEED / NATS_JWT пустые: подключение без nkeys (локальная разработка, тесты). На платформе их выдаёт OpenBAO. OPENBAO__NATS__NATS_URL=nats://localhost:4222 OPENBAO__NATS__NATS_SEED= OPENBAO__NATS__NATS_JWT= # Включает подписку на recognition.image.request. false — воркер не запускается (сервис поднимется без NATS). NATS_ENABLED=true # PUBLISH_RETRIES — число повторов публикации ack/результата в NATS после первой попытки (при 3 — до 4 попыток всего); # DONE_CACHE_SIZE — размер LRU обработанных job_id (защита от повторной доставки запроса) PUBLISH_RETRIES=3 DONE_CACHE_SIZE=1000 # --- Горячие папки ИС Сканирование --- # local — обычный каталог (dev, тесты, эмулятор); smb — SMB-шара платформы (нужен блок OPENBAO__SMB__* ниже). SCAN_HOTFOLDER_MODE=local # Корень горячей папки в режиме local: каталог должен существовать (mkdir -p .hotfolder). # Путь считается от каталога api/; его же читает эмулятор. SCAN_HOTFOLDER_PATH=./.hotfolder # Подкаталоги корня: «Входящие» (сюда кладётся UUID_имя) и «Исходящие» (оттуда забираются все *.json из /) SCAN_INPUT_DIR=Input SCAN_OUTPUT_DIR=Output # Служебный каталог корня: временный .part пишется сюда и переименовывается во «Входящие» (та же ФС/шара — rename # атомарен, во «Входящих» не бывает недописанных файлов); создаётся при первой записи SCAN_TMP_DIR=Tmp # Период опроса «Исходящих», секунды SCAN_POLL_SECONDS=5 # Набор *.json в / считается готовым, когда имена и размеры файлов не менялись столько секунд (>= 0) SCAN_SETTLE_SECONDS=2 # Потолок ожидания ответа ИС, секунды (дополнительно ограничен reply_deadline запроса); повторной отправки нет SCAN_TIMEOUT_SECONDS=300 # Сколько заданий обрабатывается одновременно SCAN_MAX_INFLIGHT=4 # --- SMB (только при SCAN_HOTFOLDER_MODE=smb; в режиме local весь блок не нужен) --- # OPENBAO__SMB__SMB_HOST=smb.example.local # OPENBAO__SMB__SMB_PATH=share/scan # OPENBAO__SMB__SMB_LOGIN=user # OPENBAO__SMB__SMB_PASSWORD=password # --- Эмулятор ИС Сканирование (python -m src.scan_emulator, make emulator; только dev) --- # Эти параметры читает сам эмулятор, сервис шлюза их не использует. Корень горячей папки и подкаталоги # эмулятор берёт из SCAN_HOTFOLDER_PATH / SCAN_INPUT_DIR / SCAN_OUTPUT_DIR выше. # Каталог с фикстурами ответов ИС (aep_N.json); путь от api/ (репозиторий fixtures лежит рядом с workspace) SCAN_FIXTURES_DIR=../../fixtures/ocr # Задержка перед выдачей ответа, секунды (имитация работы ИС) SCAN_EMULATOR_DELAY=2 # Период опроса входящего каталога эмулятором, секунды (> 0) SCAN_EMULATOR_POLL_SECONDS=1