Кратко: куда ходить изнутри Docker и с хоста при локальном запуске. Полный маршрутизатор внешнего трафика — WEB_UI_ACCESS.md (ingress).
Сайт из dbt docs generate: артефакты в dbt/target/, каталог монтируется в контейнер ingress только для чтения. Отдаётся по префиксу /dbt/; nginx подменяет в index.html абсолютные пути и настройки UI-router, чтобы приложение работало под подкаталогом. Пока не выполнен хотя бы один успешный docs generate (например через DAG dag_dbt_marts_rest, слой docs), /dbt/ может отдавать пустой ответ или 404 — это ожидаемо.
JSON manifest / catalog браузер загружает как manifest.json и catalog.json относительно /dbt/ (отдельного публичного «JSON API метаданных» через ingress нет).
Единственный HTTP API в compose для запуска dbt и статуса/логов прогонов.
- Сервис в
docker-compose.yml:dbt_rest(container_name: dbt-rest), порт 8580 только внутри сети compose. Реализация:services/dbt_rest/(FastAPI, версияdbt-core/dbt-postgres=DBT_IMAGE_TAG).GET /health/live— всегда200, если процесс отвечает (без проверки БД; удобно для HTTP-probe «процесс жив»).GET /health:200и"database":"ok"при успешномSELECT 1к мета-БД;503еслиDBT_REST_DB_DSNне задан или PostgreSQL недоступен (удобно для Docker healthcheck).run_idв путях должен быть валидным UUID — иначе400. Метаданные прогонов (статус, время, имена артефактов, логи) хранятся в PostgreSQLpostgres_metadb, БД${PG_META_DB}(схемаdbt_rest); тела артефактов — в каталоге проектаdbt/target/runs/{run_id}/на смонтированном томе. Завершение прогона в БД делается с повторными попытками и резервнымUPDATE, чтобы строка не зависала вrunningпри временных сбоях Postgres. - Airflow (клиент
services/dbt_client/rest_client.py):POST /runs— телоjob,selectors,target(профиль),command,fail_on_test_failureи т.д.; без непустогоcommandтребуется непустойselectors(иначе 400 — защита от прогона всего проекта). При типовом пути сselectorsиспользуетсяdbt build, приfail_on_test_failure: falseдобавляется--no-fail-fast.GET /runs/{id}— статус;GET /runs/{id}/logs— текст лога. - URL:
http://dbt-rest:8580илиhttp://dbt_rest:8580(имя сервиса в compose; на сети также задаётся aliasdbt-rest) или переопределение черезDBT_REST_BASE_URLв.env. При непустомDBT_REST_TOKENпередавайте заголовокAuthorization: Bearer …на все вызовы API. - Имя Docker-сети: в compose задано логическое имя
dataops_net. На хосте сеть обычно отображается как<имя_проекта>_dataops_net(см.docker compose ls,docker network ls); при подключении сторонних контейнеров используйте полное имя.
Файл: infra/ingress/nginx.conf. База: http://localhost:${INGRESS_PORT} (часто 8090).
| Префикс | Назначение |
|---|---|
/dbt/ |
Статический dbt Docs (после dbt docs generate) |
/dbt-web/… |
Редирект 301 на /dbt/… |
/airflow/ |
Airflow Web UI |
/mlflow/ |
MLflow UI |
/grafana/ |
Grafana |
/superset/ |
Apache Superset |
/jupyter/ |
Jupyter Notebook / Lab (base_url=/jupyter/) |
/prometheus/ |
Prometheus Web UI за nginx (бекенд без subpath на prometheus:9090) |
/pushgateway/ |
Pushgateway |
/spark-master/ / /spark-worker/ |
Spark standalone UI |
/minio-console/ |
Консоль MinIO (API S3 — порт MINIO_PORT) |
/atlas/ |
Apache Atlas — веб-UI и REST/API |
/schema-registry/ |
Schema Registry REST (JSON; не полноценный UI) |
/kafka-connect/ |
Kafka Connect / Debezium REST (JSON) |
/node-red/ |
Node-RED editor (см. NODE_RED_ADMIN_* в .env) |
Примеры:
http://localhost:8090/dbt/
http://localhost:8090/airflow/
- Переменные:
.env, шаблон.env.example - dbt-rest: в compose задаётся
DBT_REST_DB_DSN→postgres_metadb/${PG_META_DB}; локально см. комментарий кDBT_REST_DB_DSNв.env.example - Сборка: docker-compose.yml
- WEB_UI_ACCESS.md — логины и разбор 404/502
- PIPELINES.md — откуда вызываются job и генерация docs