16 KiB
Конфигурация measurements
Документ описывает все переменные окружения и способы конфигурирования сервиса репозитория measurements:
- measurements — HTTP-сервис на FastAPI (
src/measurements), запускается через gunicorn/uvicorn (entrypoint.sh,measurements.main:app). Считает измерения по растрам (GeoTIFF), читая их напрямую из S3/MinIO через GDAL (vsis3). Отдельного воркера у сервиса нет.
Способы конфигурирования
Сервис настраивается только через переменные окружения. Разбор выполняется в src/measurements/config.py через библиотеку pydantic-settings: классы LoggerSettings, SentrySettings, DjangoSettings, ApplicationSettings, TraceSettings, S3CredentialsSettings, Store. Отдельного конфиг-файла (yaml/toml) у приложения нет.
Каждый класс задаёт свой префикс через class Config: env_prefix (LOG_, SENTRY_, DJANGO_, TRACING_, S3_); у ApplicationSettings префикса нет — её поля читаются по имени напрямую (AUTH, SHOW_UI, USE_SENTRY и т.п.). Почти все переменные имеют значения по умолчанию, поэтому обязательна фактически одна — S3_JSON_SETTINGS: её отсутствие приводит к ValueError в S3CredentialsSettings.from_env() и процесс не стартует.
Источники переменных по способам запуска:
| Способ запуска | Откуда берутся переменные |
|---|---|
| Локально (docker-compose) | docker-compose.yaml — образ measurements, проброс порта 8000:8000, инлайн environment: S3_JSON_SETTINGS. Сервис запускается entrypoint.sh (gunicorn, 4 воркера, uvicorn worker, таймаут 240) |
| Kubernetes — собственный Helm-чарт репозитория | .helm/values.yaml (universal-chart, dependency oci://…/charts): блок envs (обычные значения) и secretEnvs (значения из k8s-секретов). Per-env значения через ключи _default/stage/preprod/production |
Kubernetes — этот infra-репозиторий (iac/apps/measurements) |
base/ — kustomize-манифесты с инъекцией секрета S3 через HashiCorp Vault (annotations vault.hashicorp.com/*), обычные переменные заданы инлайн в env:. Оверлеи: yc-k8s-test (base + патч реплик), brusnika-stage/brusnika-prod (Flux HelmRelease на universal-chart, блок secretEnvs) |
| CI/CD (GitLab) | .gitlab-ci.yml подключает шаблоны generic/common-ci (universal-pipeline.yaml, ref apps-business); в workflow.rules задаются переменные пайплайна (STAND, NAMESPACE, RELEASE_NAME, CHART_NAME, CHART_VERSION, K8S_HUSTLER_BRANCH, HELM_SET_ARGS, SERVICE_NAME, DOCKERFILE_PATH) |
Миграции БД. Отсутствуют. Сервис не хранит собственное состояние в реляционной БД (psycopg2 присутствует в зависимостях, но код измерений работает с растрами из S3). Шага миграций в entrypoint.sh нет.
measurements (measurements)
Переменные читаются набором классов *Settings в config.py, инстанцируемых на уровне модуля: settings = ApplicationSettings(), store = Store(), logger = LoggerSettings().logger, tracing_settings = TraceSettings().
S3 / MinIO (обязательно)
Класс S3CredentialsSettings. Единственный обязательный источник конфигурации — переменная S3_JSON_SETTINGS (JSON-строка). Валидатор from_env (model_validator(mode='before')) читает её из окружения и при отсутствии выбрасывает ValueError. Доступы к S3 используются как boto3-клиентом (список бакетов), так и GDAL (AWS_S3_ENDPOINT/AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY, драйвер vsis3).
| Переменная | Тип | Обяз. | По умолчанию | Назначение |
|---|---|---|---|---|
S3_JSON_SETTINGS |
string (JSON) | да | — | JSON с доступами к S3. Поля: host, login, password (обяз.); verify (bool, по умолч. false); buckets (список; если пуст — бакеты запрашиваются через list_buckets()). Пример: {"host":"https://s3…","login":"…","password":"…","verify":false,"buckets":["measurements"]} |
В
hostподдерживаются схемыhttp:///https://: приhttp://GDAL переключается наAWS_HTTPS=NO, отключаетGDAL_DISABLE_READDIR_ON_OPENиAWS_VIRTUAL_HOSTING.
Логирование (префикс LOG_)
Класс LoggerSettings. Настраивает JSON-логгер (python-json-logger).
| Переменная | Тип | Обяз. | По умолчанию | Назначение |
|---|---|---|---|---|
LOG_LEVEL |
string | нет | INFO |
Уровень логирования (INFO/DEBUG/…); неизвестное значение → INFO |
LOG_FORMAT |
string | нет | JSON-шаблон | Формат строки лога для JsonFormatter |
Приложение (ApplicationSettings, без префикса)
Поля читаются по имени напрямую (регистронезависимо). Управляют поведением сервиса и подключением middleware в main.py.
| Переменная | Тип | Обяз. | По умолчанию | Назначение |
|---|---|---|---|---|
AUTH |
bool | нет | false |
Подключить CustomAuthenticationMiddleware (проверка JWT authorization/identity) |
SHOW_UI |
bool | нет | false |
Включить Swagger/redoc; при false docs_url/redoc_url отключены |
USE_SENTRY |
bool | нет | false |
Инициализировать Sentry SDK и SentryAsgiMiddleware |
DEBUG |
bool | нет | false |
Флаг отладки |
CLASSIC_MODE |
bool | нет | true |
Классический режим расчётов |
BLOCK_SIZE |
int | нет | 256 |
Размер блока обработки растра; участвует в area_factor |
BLOCK_SIZE_FACTOR |
int | нет | 10 |
Множитель площади блока (area_factor = BLOCK_SIZE_FACTOR × BLOCK_SIZE²) |
CPU_NUMBER |
int | нет | 10 |
Число используемых CPU |
DEBUG,CLASSIC_MODE,BLOCK_SIZE,BLOCK_SIZE_FACTOR,CPU_NUMBERзадаются в конфиге, но в текущих обработчиках напрямую не считываются (вmain.pyиспользуются толькоSHOW_UI,USE_SENTRY,AUTH). Оставлены как настраиваемые параметры.
Django / ЛК (префикс DJANGO_)
Класс DjangoSettings. Используется CustomAuthenticationMiddleware/DjangoUserMiddleware при включённой авторизации (AUTH=1) для запросов к ЛК.
| Переменная | Тип | Обяз. | По умолчанию | Назначение |
|---|---|---|---|---|
DJANGO_USE |
bool | нет | true |
Использовать интеграцию с Django |
DJANGO_HOST |
string | нет | https://lk.sarex.io |
Базовый URL Django/ЛК |
DJANGO_TIMEOUT |
int | нет | 10 |
Таймаут HTTP-запросов к Django, сек |
Sentry (префикс SENTRY_)
Класс SentrySettings. Значения передаются в sentry_sdk.init(**settings.sentry.kwargs) только при USE_SENTRY=1.
| Переменная | Тип | Обяз. | По умолчанию | Назначение |
|---|---|---|---|---|
SENTRY_DSN |
string | нет | "" |
DSN проекта Sentry |
SENTRY_ENVIRONMENT |
string | нет | production |
Имя окружения в Sentry |
SENTRY_TRACES_SAMPLE_RATE |
float | нет | 1.0 |
Доля трейсов |
SENTRY_SEND_DEFAULT_PII |
bool | нет | true |
Отправлять PII |
Трейсинг (OpenTelemetry, префикс TRACING_)
Класс TraceSettings. Активируется при TRACING_USE=1 (fastapi-otel-tools).
| Переменная | Тип | Обяз. | По умолчанию | Назначение |
|---|---|---|---|---|
TRACING_USE |
bool | нет | false |
Включает OTEL-трейсинг, otel-логгер и OtelMiddleware |
TRACING_HOST |
string | нет | localhost:4317 |
Адрес OTLP-коллектора |
TRACING_SERVICE_NAME |
string | нет | measurements |
Имя сервиса в трейсах |
TRACING_INSECURE |
bool | нет | false |
Небезопасное (без TLS) подключение к коллектору |
Тип
boolв pydantic принимает1/0,true/false,yes/no.
Инфраструктурные и вспомогательные переменные
Не читаются кодом приложения, но участвуют в запуске/сборке/деплое.
| Переменная | Где используется | Назначение |
|---|---|---|
S3_JSON_FILE |
.helm/values.yaml (envs) |
Путь к файлу с доступами S3 (/opt/cred_s3.json). Кодом не читается — приложение использует только S3_JSON_SETTINGS |
SERVICE_NAME, DOCKERFILE_PATH, BUILD_ARGS, CI_TRIGGER_SOURCE |
.gitlab-ci.yml (variables) |
Параметры сборки образа |
STAND, NAMESPACE, RELEASE_NAME, CHART_NAME, CHART_VERSION, K8S_HUSTLER_BRANCH, HELM_SET_ARGS |
.gitlab-ci.yml (workflow.rules) |
Параметры пайплайна universal-pipeline (деплой чарта per-env: stage/preprod/production) |
Деплой из этого репозитория (iac/apps/measurements)
В base/ используется kustomize (не собственный Helm-чарт сервиса). Доступ к S3/MinIO инъектируется агентом Vault и подгружается в окружение процесса до старта.
base/
deployment.yaml— единственный Deploymentmeasurements(namespacemeasurements). Аннотации Vault (agent-inject,role: measurements) формируют шаблон секретаmeasurements-s3изsecrets/data/minio/apps/measurements, собираяS3_JSON_SETTINGS='{"host":…,"login":…,"password":…,"verify":false,"buckets":["measurements"]}'. Контейнер запускается командойset -a; . /vault/secrets/measurements-s3; set +a; exec /opt/entrypoint.sh. Инлайн задан толькоTRACING_USE=false. Порт8000(http),serviceAccountName: measurements-vault,imagePullSecrets: regcred, ресурсыcpu 25m/memory 128Mi.service.yaml—Servicemeasurements-svc(ClusterIP, порт8000→8000).namespace.yaml— namespacemeasurementsсistio-injection: enabled.serviceaccount.yaml— SAmeasurements-vault.kustomization.yamlсобираетnamespace,serviceaccount,deployment,service.
Оверлеи
yc-k8s-test—../base+ патчreplicas.yaml(реплики Deploymentmeasurements= 1).brusnika-stage/brusnika-prod— FluxHelmReleasemeasurementsнаuniversal-chart0.1.7(sourceyc-oci-charts). СекретS3_JSON_SETTINGSберётся из k8s-секретаs3-json-settings(secretEnvs).replicaCount:stage 1,preprod 3,production 3;imagePullSecrets: regcred;labels.monitoring: prometheus; сервисmeasurements-service(ClusterIP,8000).
Замечания и потенциальные проблемы
S3_JSON_SETTINGS— единственная жёстко обязательная переменная. Локальныйdocker-compose.yamlзадаёт её значением-заглушкой ({"host":"host","login":"login","password":"password"}) — для реальной работы значение нужно заменить.S3_JSON_FILEв.helm/values.yamlкодом не читается — приложение использует толькоS3_JSON_SETTINGS(в этом infra-репозитории она и инъектируется Vault). Расхождение способов передачи доступов между собственным чартом и infra-репо.- Опечатка в
middleware.py: вDjangoUserMiddlewareиспользуетсяsettings.django.self.timeoutвместоsettings.django.timeout— лишний.selfприведёт кAttributeError. СамDjangoUserMiddlewareвmain.pyне подключается (подключаетсяCustomAuthenticationMiddleware). - Отсутствует поле
jwt_public_key:CustomAuthenticationMiddlewareпри отсутствии заголовкаidentityвызываетjwt.decode(key=settings.jwt_public_key, …), но такого поля вApplicationSettingsнет — приAUTH=1и запросе безidentityэто приведёт кAttributeError. Если планируется проверка подписи, следует добавить переменную (напр.JWT_PUBLIC_KEY) в конфиг. brusnika-stage/brusnika-prod:image.nameуказывает наdocumentations(…/documentations:prod_5904312b), а не наmeasurements— вероятно скопировано из другого сервиса; для measurements образ должен указывать на…/measurements.- Проверки liveness/readiness отключены во всех манифестах (
probes.*.enabled: false); HTTP-эндпоинта healthcheck у сервиса нет. - Probes/порт в brusnika-оверлеях:
deployment.portзадан8080, тогда как контейнер (entrypoint.sh→ gunicorn) слушает8000, иservice.port/targetPort=8000.
Минимальный набор для локального запуска
S3_JSON_SETTINGS(обязателен) — реальные доступы к S3/MinIO с бакетом(ами) растров.- при необходимости:
LOG_LEVEL,TRACING_USE(+TRACING_*),USE_SENTRY(+SENTRY_*),AUTH(+DJANGO_*).
Сервис слушает 0.0.0.0:8000 (gunicorn, 4 воркера uvicorn). См. пример значений в .env.example.