Быстрый старт
Этот раздел нужен, чтобы быстро поднять рабочий контур NPPWEB локально и понять, как проверить платформу не по одному сервису, а end-to-end.
Что вы поднимаете
NPPWEB состоит из нескольких независимых, но связанных репозиториев:
| Репозиторий | Роль |
|---|---|
infra | Docker Compose-контур и env-конфигурация |
contracts | общие GraphQL и event-схемы |
scrape-helper | сбор данных из внешних источников |
processing-worker | нормализация raw-потока и ingest |
npp-backend | доменная модель, GraphQL API, отчёты, аналитика |
npp-web | интерфейс пользователей, аналитиков и администраторов |
Основные источники, которые сейчас предусмотрены в платформе:
easuzeiseis_contractseis_contracts_223rnpfedresursfnsgistorgi
Что нужно заранее
- Docker Desktop или Docker Engine с Compose plugin;
- Node.js
20+; - свободные порты
3000,3001,8080,15672,9000,9001; - доступ к государственным площадкам напрямую или через proxy-контур;
- понимание, что часть источников может зависеть от внешних ограничений и не всегда стабильно отвечает из локального контура.
Самый короткий способ поднять всё
cd infra
cp .env.example .env
docker compose --env-file .env -f docker-compose.yml -f docker-compose.apps.yml up -d --buildАльтернатива:
make upПосле этого в норме должны подняться:
postgresredisrabbitmqminiominio-initbackend-apiprocessing-workerscraper-servicefrontend
Опционально:
xray-proxy, если активирован профильproxy
Где что открывать
| Что | URL |
|---|---|
| frontend | http://localhost:8080 |
| GraphQL backend | http://localhost:3000/graphql |
| backend health | http://localhost:3000/api/health |
| backend ready | http://localhost:3000/api/health/ready |
| scraper control-plane | http://localhost:3001/api/runtime-status |
| RabbitMQ management | http://localhost:15672 |
| MinIO console | http://localhost:9001 |
Минимальный smoke-check
1. Проверить compose-статусы
cd infra
docker compose --env-file .env -f docker-compose.yml -f docker-compose.apps.yml psЧто обычно считается нормой:
postgres,rabbitmq,minio,backend-api,frontend—healthyprocessing-worker,scraper-service—Upminio-init—Exited (0)
2. Проверить backend
curl http://localhost:3000/api/health
curl http://localhost:3000/api/health/ready3. Проверить scraper runtime
curl http://localhost:3001/health
curl http://localhost:3001/api/runtime-status4. Проверить frontend
curl -I http://localhost:8080Локальные учётные записи
Если backend-api поднят с seed-данными из infra, обычно доступны:
admin@admin.ru / 12345678analyst@admin.ru / 12345678user@admin.ru / 12345678
Как проверить, что конвейер реально работает
Одного факта, что контейнеры “живы”, недостаточно. Важнее убедиться, что данные проходят весь путь:
scrape-helperделает запуск источника.- Публикуются raw-события.
processing-workerзабирает raw-сообщения и делает нормализацию.npp-backendпринимает ingest.npp-webпоказывает закупки, source runs и аналитику без пустого GraphQL-ответа.
Нормальный end-to-end запуск в NPPWEB означает не просто “контейнеры поднялись”, а следующее:
- у
scraper-serviceесть активные источники; - в RabbitMQ появляются raw-сообщения;
processing-workerих подтверждает без массового роста retry/DLQ;- backend создаёт или обновляет доменные сущности;
- frontend открывает ролевые экраны без пустых ответов и ошибок авторизации.
Практический сценарий
- Откройте frontend и войдите под
ANALYSTилиADMIN. - Проверьте, что открываются
dashboard,analytics,procurements. - Посмотрите
jobsили административный экран запусков. - Подтвердите, что есть актуальные
SourceRun. - Если нужно, триггерните один источник вручную и посмотрите, как меняются статусы.
Ручной запуск конкретного источника
Для локальной диагностики удобно использовать control API scraper-service.
Пример ручного старта eis:
curl -X POST http://localhost:3001/api/source-runs \
-H 'content-type: application/json' \
-d '{"sourceCodes":["eis"]}'Пример запуска нескольких источников:
curl -X POST http://localhost:3001/api/source-runs \
-H 'content-type: application/json' \
-d '{"sourceCodes":["eis","rnp","fns"]}'Это удобно, когда нужно понять, пустой экран вызван общим контуром или конкретным адаптером.
Как проверить очереди и транспортный слой
Для локальной отладки полезно сразу смотреть не только логи, но и состояние очередей.
Пример:
curl -u app:app http://localhost:15672/api/queues/%2F/source.raw.v1
curl -u app:app http://localhost:15672/api/queues/%2F/source.raw.retry.v1
curl -u app:app http://localhost:15672/api/queues/%2F/source.raw.dlq.v1
curl -u app:app http://localhost:15672/api/queues/%2F/source.normalized.v1Интерпретация обычно такая:
source.raw.v1растёт и быстро уменьшается: worker успевает обрабатывать поток;source.raw.retry.v1растёт: есть transient-проблемы, чаще всего ingest или инфраструктура;source.raw.dlq.v1растёт: есть poison messages или сломана нормализация;source.normalized.v1пополняется: события дошли до стадии успешной нормализации.
Когда нужен proxy
Часть государственных площадок может быть недоступна напрямую.
В этом случае обычно нужно:
- создать
infra/xray-local/config.jsonна основеconfig.example.json; - включить
COMPOSE_PROFILES=proxy; - указать
HTTP_PROXYиHTTPS_PROXY=http://xray-proxy:8080; - не забыть про корректный
NO_PROXYдля внутренних сервисов.
Для Fedresurs отдельно важно помнить:
- стабильный production-сбор больше не стоит строить на публичном HTML;
- нужен официальный API;
- для него требуются
FEDRESURS_API_LOGINиFEDRESURS_API_PASSWORD.
Если хотите запускать сервисы по отдельности
Backend
cd npp-backend
npm install
npm run db:setup
npm run start:devFrontend
cd npp-web
npm install
npm run devScraper
cd scrape-helper
npm install
npm run start:devWorker
cd processing-worker
npm install
npm run start:devПолезная диагностика через логи
cd infra
docker compose --env-file .env -f docker-compose.yml -f docker-compose.apps.yml logs backend-api processing-worker scraper-service frontendДля живого наблюдения:
docker compose --env-file .env -f docker-compose.yml -f docker-compose.apps.yml logs -f scraper-service processing-worker backend-apiЧто особенно полезно искать:
- в
scraper-service:loaded enabled sourcessource run startedraw event published
- в
processing-worker:raw event validatednormalized event createdpublished normalized eventretry scheduledmessage dead-lettered
- в
backend-api:- ошибки ingest;
- ошибки auth/session;
- проблемы Prisma и БД.
Частые первые проблемы
| Симптом | Что смотреть первым |
|---|---|
| frontend не открывается | контейнер frontend, health backend, переменные Nuxt |
| GraphQL ошибки | backend-api logs, миграции, seed, auth |
| запуски есть, но новых закупок нет | scraper-service, processing-worker, RabbitMQ, ingest token |
источник завершился успешно, но нашёл 0 | фильтры источника, доступ к площадке, relevance-логика |
| артефакты не появляются | MinIO, minio-init, S3_* переменные |
Минимальный принцип чтения проблем
Если после запуска что-то “не работает”, лучше идти не хаотично, а по фиксированному порядку:
docker compose ps- health / ready backend
- runtime-status scraper-service
- очереди RabbitMQ
- логи
processing-worker - GraphQL API
- frontend
Так почти всегда быстрее видно, в каком именно слое сломался поток.