23 KiB
Конфигурация проекта sarex-backend (Django)
Документ описывает способы конфигурирования backend-сервиса sarex (Django) и
основные переменные окружения. Фронтенд-приложение sarex-frontend (шелл на
Module Federation) конфигурируется отдельно на этапе сборки — см. раздел в конце
и ENDPOINTS.md.
Способы конфигурирования
Сервис — это Django-приложение (проект config, бизнес-логика в пакете sarex).
Конфигурация складывается из двух механизмов:
- Модуль настроек Django выбирается переменной
DJANGO_SETTINGS_MODULE. Модули лежат вconfig/settings/и наследуются друг от друга черезfrom .base import *. - Переменные окружения читаются двумя способами:
django-environ— объектenv = environ.Env()вconfig/settings/base.py, вызовыenv('NAME', default=...),env.bool(...),env.list(...),env.str(...);pydantic-settings— классы-наследникиBaseSettingsсenv_prefix(напр.ServerSettings→ префиксSERVER_), инстанцируются как синглтоны (SERVERSETTINGS = ServerSettings()и т.п.).
Приложение не загружает .env автоматически в основном конфиге
(DJANGO_READ_DOT_ENV_FILE закомментирован). Исключение — pydantic-классы
SentrySettings (читает .env.base, .env), ZitadelSettings, KafkaSettings
(читают .env). В остальном переменные нужно экспортировать в окружение процесса.
Модули настроек (config/settings/*.py)
| Модуль | Назначение |
|---|---|
base.py |
Базовые настройки, все классы *Settings, INSTALLED_APPS, DRF, Celery-очереди |
production.py |
Продакшн: DEBUG=False, БД из DJANGO_POSTGRES_*, SimpleJWT (RS512), логирование |
docker.py |
Наследует test.py, ALLOWED_HOSTS=["*"], БД на хосте postgres |
test.py / test_ksg.py |
Прогон тестов |
example.local.py / example.ldap.local.py |
Шаблоны для локального local.py (копируются вручную) |
По умолчанию manage.py и config/celery.py используют config.settings.local.
В кластере задаётся DJANGO_SETTINGS_MODULE=config.settings.production, при этом
файл production.py подменяется ConfigMap-ом django-configmap (монтируется в
/opt/sarex/config/settings/production.py) — см. раздел про деплой.
Способы запуска процессов
| Процесс | Команда | Назначение |
|---|---|---|
| Web/API (uWSGI) | uwsgi --plugin python3 --ini uwsgi.ini |
HTTP API на 0.0.0.0:8000, модуль config.wsgi:application |
| Web/API (dev) | python manage.py runserver |
Локальный запуск |
| Celery worker+beat | celery -A config worker -B -l info -E -Q default -n default_worker.%h |
Фоновые задачи и периодические таски |
| Миграции | python manage.py migrate |
Выполняются в entrypoint.sh перед стартом uWSGI |
Порядок запуска контейнера backend (entrypoint.sh): сначала
opentelemetry-instrument python manage.py migrate, затем
opentelemetry-instrument uwsgi --plugin python3 --ini uwsgi.ini. В кластере
перед entrypoint.sh секреты из Vault экспортируются в окружение (set -a; . /vault/secrets/...).
Переменные приложения
Ниже перечислены основные переменные. Дефолт — означает, что значение
обязательно (в production.py без него будет ошибка старта).
Django core
| Переменная | Тип | Значение по умолчанию | Назначение |
|---|---|---|---|
DJANGO_SETTINGS_MODULE |
string | config.settings.local |
Модуль настроек Django |
DJANGO_DEBUG |
bool | False |
Режим отладки |
DJANGO_ISOLATED |
bool | False |
Изолированный режим (в configmap отключает Sentry) |
ALLOWED_HOSTS |
list/str | — (в prod из env) | Разрешённые хосты; в кластере * |
APPEND_SLASH |
bool | True |
Автодобавление слеша в URL |
FZ152_COMPLIANCE |
bool | False |
Режим соответствия 152-ФЗ |
PDM_SYNC |
bool | False |
Синхронизация с PDM |
OBJECT_STORAGE_SYNC |
bool | True |
Синхронизация с объектным хранилищем |
SECRET_KEY |
string | хардкод в production.py |
Секретный ключ Django |
SIMPLE_JWT_ISSUER |
string | django |
Issuer для JWT |
DISK_USAGE_ROOT |
string | / |
Корень для расчёта занятого места |
USE_SSL_FOR_URL_SERIALIZATION |
bool | True |
Использовать https при сериализации URL |
WEB_APP_AUTH_MODE |
string | JWTDefault |
Режим авторизации веб-приложения |
База данных (PostgreSQL)
Читаются в config/settings/production.py. В кластере приходят из Vault-секрета
secrets/data/postgresql/apps/django (файл /vault/secrets/django-postgresql).
| Переменная | Тип | Значение по умолчанию | Назначение |
|---|---|---|---|
DJANGO_POSTGRES_HOST |
string | — | Хост PostgreSQL |
DJANGO_POSTGRES_PORTS |
string | 5432 |
Порт PostgreSQL |
DJANGO_POSTGRES_DATABASE |
string | — | Имя базы |
DJANGO_POSTGRES_USER |
string | — | Пользователь |
DJANGO_POSTGRES_PASSWORD |
string | — | Пароль |
Движок БД — django_prometheus.db.backends.postgresql.
JWT (SimpleJWT, RS512)
| Переменная | Тип | Значение по умолчанию | Назначение |
|---|---|---|---|
JWT_PRIVATE_KEY |
string | — | Приватный RSA-ключ подписи (\n заменяются на переводы строк). В кластере — из Vault rsa_keys |
JWT_PUBLIC_KEY |
string | — | Публичный RSA-ключ проверки |
JWT_KID |
string | None |
kid в заголовке токена (используется для межсервисных вызовов) |
DJANGO_JWT_SECRET |
string | Froom too much love of living |
Легаси-секрет |
Celery (CELERY_*)
Брокер — RabbitMQ; backend результатов — Redis (по умолчанию) или Postgres
(CELERY_USE_POSTGRES=True). CELERY_RABBITMQ_* в кластере из Vault-секрета
secrets/data/rabbitmq/apps/django.
| Переменная | Тип | Значение по умолчанию | Назначение |
|---|---|---|---|
CELERY_USE_POSTGRES |
bool | False |
Использовать Postgres как result backend |
CELERY_RABBITMQ_HOST |
string | localhost |
Хост RabbitMQ |
CELERY_RABBITMQ_PORT |
int | 5672 |
Порт |
CELERY_RABBITMQ_USER |
string | rabbit |
Пользователь |
CELERY_RABBITMQ_PASSWORD |
string | rabbit |
Пароль |
CELERY_RABBITMQ_VHOST |
string | api |
Виртуальный хост |
CELERY_REDIS_HOST |
string | localhost |
Хост Redis (result backend) |
CELERY_REDIS_PORT |
int | 6379 |
Порт Redis |
CELERY_REDIS_DATABASE |
int | 0 |
Номер БД Redis |
CELERY_POSTGRES_DATABASE |
string | celery_db |
БД для result backend на Postgres |
CELERY_POSTGRES_USER |
string | sarex |
Пользователь |
CELERY_POSTGRES_PASSWORD |
string | sarex |
Пароль |
CELERY_POSTGRES_HOST |
string | localhost |
Хост |
CELERY_POSTGRES_PORT |
string | 5432 |
Порт |
Дополнительно из Vault-шаблона прокидываются дублирующие DJANGO_RABBIT_HOSTNAME,
DJANGO_RABBIT_USER, DJANGO_RABBIT_PASS, DJANGO_RABBIT_VHOST, а также
DJANGO_REDIS_HOST / DJANGO_REDIS_PORT.
Кеш Redis (CACHE_*)
| Переменная | Тип | Значение по умолчанию | Назначение |
|---|---|---|---|
CACHE_HOST |
string | localhost |
Хост Redis |
CACHE_PORT |
int | 6379 |
Порт |
CACHE_PASSWORD |
string | null | None |
Пароль |
CACHE_SSL |
bool | False |
TLS |
CACHE_SSL_CA_CERTS |
string | null | None |
CA-сертификат |
S3 / объектное хранилище (S3_*)
S3_* в кластере из Vault-секрета secrets/data/minio/apps/django.
| Переменная | Тип | Значение по умолчанию | Назначение |
|---|---|---|---|
S3_HOST |
string | https://storage.yandexcloud.net |
Эндпоинт S3 |
S3_LOGIN |
string | "" |
Access key |
S3_PASSWORD |
string | "" |
Secret key |
S3_BUCKET |
string | sarex-media-storage |
Бакет по умолчанию |
S3_REGION |
string | "" |
Регион (fallback: AWS_DEFAULT_REGION) |
AWS_S3_ENDPOINT_URL |
string | https://storage.yandexcloud.net |
Эндпоинт (легаси-переменная) |
S3TOOLS_LIB_PATH |
string | /opt/sarex/lib/s3tools.so |
Путь к нативной библиотеке загрузки (Dockerfile) |
S3TOOLS_WORKERS |
int | 10 |
Число воркеров загрузки |
Kafka (KAFKA_*)
Аутентификация в кластере из Vault-секрета secrets/data/kafka/apps/django.
Продюсер создаётся только при SERVER_KAFKA_ENABLED=True.
| Переменная | Тип | Значение по умолчанию | Назначение |
|---|---|---|---|
KAFKA_BOOTSTRAP_SERVERS |
list[str] (JSON) | ["localhost:9092"] |
Список брокеров |
KAFKA_SECURITY_PROTOCOL |
string | "" |
Протокол безопасности |
KAFKA_SASL_MECHANISM |
string | "" |
SASL-механизм |
KAFKA_SASL_PLAIN_USERNAME |
string | user |
Логин |
KAFKA_SASL_PLAIN_PASSWORD |
string | password |
Пароль |
KAFKA_SSL_CAFILE |
string | "" |
Путь к CA-сертификату |
KAFKA_TOPICS |
dict (JSON) | {} |
Маппинг логических имён на топики |
Sentry (SENTRY_*)
Читается классом SentrySettings из .env.base / .env.
| Переменная | Тип | Значение по умолчанию | Назначение |
|---|---|---|---|
SENTRY_USE |
bool | True |
Включить Sentry |
SENTRY_HOST |
string | "" |
DSN/хост Sentry |
SENTRY_ENVIRONMENT |
string | "" |
Окружение |
SENTRY_TRACES_SAMPLE_RATE |
float | 1.0 |
Доля трейсов |
SENTRY_PROFILES_SAMPLE_RATE |
float | 0.1 |
Доля профилей |
Флаги приложения (SERVER_*, класс ServerSettings)
Класс содержит десятки булевых флагов и параметров. Наиболее значимые (реально задаются в манифестах):
| Переменная | Тип | Значение по умолчанию | Назначение |
|---|---|---|---|
SERVER_HOST |
string | https://lk.sarex.io |
Внешний хост ЛК |
SERVER_API_HOST |
string | https://api.sarex.io |
Внешний хост API |
SERVER_ZITADEL_ENABLED |
bool | True |
Включить Zitadel-аутентификацию |
SERVER_KAFKA_ENABLED |
bool | False |
Включить Kafka-продюсер |
SERVER_USE_METASHAPE |
bool | True |
Использовать Metashape |
SERVER_USE_CLICKHOUSE |
bool | False |
Использовать ClickHouse |
SERVER_CACHE_ENABLED |
bool | False |
Включить кеш (в configmap выставляется True) |
SERVER_USE_NOTIFICATIONS |
bool | True |
Уведомления |
SERVER_TIMEOUT |
int | 60 |
Таймаут по умолчанию |
SERVER_CHUNKED_PATH |
string | — | Путь для чанкованных загрузок |
Полный список полей — в ServerSettings (config/settings/base.py). Любое поле
переопределяется переменной SERVER_<FIELD> в верхнем регистре.
Workflows / processing (WORKFLOWS_*, класс WorkFlowsSettings)
| Переменная | Тип | Значение по умолчанию | Назначение |
|---|---|---|---|
WORKFLOWS_USE |
bool | False |
Включить интеграцию с processing |
WORKFLOWS_HOST |
string | https://api.sarex.io |
Хост сервиса processing |
WORKFLOWS_BASE_HOST |
string | https://lk.sarex.io |
Базовый хост |
WORKFLOWS_PREFIX |
string | /internal/v1 |
Префикс внутреннего API |
WORKFLOWS_TIMEOUT |
int | 120 |
Таймаут |
WORKFLOWS_REGISTRY |
string | cr.yandex/crp3ccidau046kdj8g9q |
Реестр образов задач |
WORKFLOWS_TAG |
string | stable |
Тег образов |
Внешние API-сервисы (BaseApiServiceMixin)
Классы GateWaySetttings (GATEWAY_), BimV2ApiSettings (BIMV2_),
EAVSettings (EAV_), AnalyticsSettings (ANALYTICS_),
DocumentationSettings (DOCUMENTATION_), UsersSettings (USERS_),
SystemLogSettings (SYSTEM_LOG_), ResourceSettings (RESOURCES_) наследуют
общий набор полей:
Поле (переменная <PREFIX>_<FIELD>) |
Тип | Назначение |
|---|---|---|
HOST |
string | Внешний хост сервиса |
API_PREFIX |
string | Префикс публичного API |
INTERNAL_HOST |
string | Внутренний хост (внутрикластерный) |
INTERNAL_PREFIX |
string | Префикс внутреннего API |
TIMEOUT |
int | Таймаут запроса |
ENABLE |
bool | Включён ли сервис |
Реально задаваемые в манифестах: BIMV2_INTERNAL_HOST, BIMV2_TIMEOUT,
EAV_ENABLE. Отдельно — GK_ENCRYPTION_KEY (класс GatekeeperSettings).
Measurements (MEASUREMENTS_*)
| Переменная | Тип | Значение по умолчанию | Назначение |
|---|---|---|---|
MEASUREMENTS_HOST |
string | https://api.sarex.io/measurements/ |
Хост сервиса измерений |
MEASUREMENTS_TIMEOUT |
int | 180 |
Таймаут |
MEASUREMENTS_WINDOW_SIZE |
int | 1000 |
Размер окна |
ClickHouse (CLICKHOUSE_*)
| Переменная | Тип | Значение по умолчанию | Назначение |
|---|---|---|---|
CLICKHOUSE_HOST |
string | rc1d-...yandexcloud.net |
Хост |
CLICKHOUSE_PORT |
int | 9000 |
Порт |
CLICKHOUSE_USER / CLICKHOUSE_PASSWORD |
string | "" |
Учётные данные |
CLICKHOUSE_DATABASE |
string | values_db |
База |
CLICKHOUSE_TABLE |
string | values |
Таблица |
CLICKHOUSE_SECURE / CLICKHOUSE_VERIFY |
bool | False |
TLS и проверка сертификата |
CLICKHOUSE_CERT |
string | "" |
CA-сертификат |
Zitadel (ZITADEL_*) и Keycloak (KC_*, KC_SYNC*)
| Переменная | Тип | Значение по умолчанию | Назначение |
|---|---|---|---|
ZITADEL_HOST |
string | "" |
Хост Zitadel (IdP) |
ZITADEL_ACCESS_TOKEN |
string | "" |
Сервисный токен (из Vault django_auth) |
ZITADEL_USERS_ENDPOINT |
string | /v2/users |
Эндпоинт пользователей |
KC_SYNC_ENABLE |
bool | False |
Включить синхронизацию с Keycloak |
KC_USE_REDIRECT_LOGOUT |
bool | False |
Redirect при logout |
KC_CLIENT_ID / KC_CLIENT_SECRET / KC_DISCOVERY_URL / KC_REALM |
string | см. KeyCloakSettings |
Параметры клиента Keycloak |
Трейсинг (TRACING_*)
| Переменная | Тип | Значение по умолчанию | Назначение |
|---|---|---|---|
TRACING_SERVICE_NAME |
string | backend.sarex-stage |
Имя сервиса в трейсах |
TRACING_ENDPOINT |
string | localhost:4317 |
OTLP-коллектор |
TRACING_INSECURE |
bool | False |
Без TLS |
TRACING_ENVIRONMENT |
string | prod |
Окружение |
Comparator и прочее
| Переменная | Значение по умолчанию | Назначение |
|---|---|---|
COMPARATOR_URL |
https://wb.sarex.io/comparator |
URL сервиса сравнения |
COMPARATOR_SECTION |
sarex-production-storage |
Секция хранилища |
COMPARATOR_JWT |
default_jwt |
Токен сравнения |
WORKFLOWSSETTINGS_HOST / WORKFLOWSSETTINGS_REGISTRY |
— | Используются напрямую в configmap production.py |
PG_NODE_HOST, PG_API_KEY, PG_MONGO_HOST, PG_MONGO_PORT, PG_IMPORT_PATH |
см. base.py |
Легаси-интеграции PG |
Конфигурация в кластере (Kubernetes)
Манифесты приложения — в этом же каталоге (base/, оверлеи brusnika-stage,
brusnika-prod, yc-k8s-test). Секреты монтируются через Vault Agent Injector
(аннотации vault.hashicorp.com/* на Deployment backend и celery). Файлы
секретов в контейнере и их содержимое:
Файл /vault/secrets/... |
Секрет Vault | Переменные |
|---|---|---|
django-postgresql |
secrets/data/postgresql/apps/django |
DJANGO_POSTGRES_HOST/PORTS/DATABASE/USER/PASSWORD |
django-rabbitmq |
secrets/data/rabbitmq/apps/django |
CELERY_RABBITMQ_*, DJANGO_RABBIT_* |
django-s3 |
secrets/data/minio/apps/django |
AWS_S3_ENDPOINT_URL, S3_HOST/BUCKET/LOGIN/PASSWORD |
django-kafka |
secrets/data/kafka/apps/django |
KAFKA_BOOTSTRAP_SERVERS/SECURITY_PROTOCOL/SASL_* |
django-jwt-private / django-jwt-public |
secrets/data/vault/common/rsa_keys |
JWT_PRIVATE_KEY / JWT_PUBLIC_KEY |
django-common |
secrets/data/vault/common/django_auth |
ZITADEL_ACCESS_TOKEN |
Контейнер экспортирует эти файлы в окружение до запуска (set -a; . /vault/secrets/...).
Кроме того, production.py из ConfigMap содержит функцию _load_env_file, которая
подхватывает те же файлы при запуске manage.py через kubectl exec вне entrypoint.
Остальные (несекретные) переменные задаются в блоке env контейнеров
backend/celery (SERVER_*, WORKFLOWS_*, BIMV2_*, MEASUREMENTS_*,
ZITADEL_HOST, KAFKA_TOPICS, EAV_ENABLE, PDM_SYNC, JWT_KID и др.).
ConfigMap django-configmap подменяет config/settings/production.py
(смонтирован в /opt/sarex/config/settings/production.py) и переопределяет
ALLOWED_HOSTS, CORS, DATABASES, SIMPLE_JWT, REST_FRAMEWORK, MIDDLEWARE,
KeyCloakSettings, SAREX_MODULES, а также включает Sentry (если не ISOLATED).
ConfigMap zitadel-configmap содержит config.json с client_id/host Zitadel.
uwsgi-configmap монтирует uwsgi.ini.
CI (.gitlab-ci.yml)
Пайплайн подключает общие шаблоны из generic/common-ci
(common-security-scan.yaml, universal-pipeline.yaml) и переключает окружение
по ветке/тегу через workflow.rules:
| Условие | STAND | NAMESPACE |
|---|---|---|
ветка stage |
stage |
aero |
ветка master |
preprod |
(см. правила) |
| тег | prod |
(см. правила) |
Ключевые переменные: SERVICE_NAME=backend, DOCKERFILE_PATH=./Dockerfile,
RELEASE_NAME, CHART_NAME, CHART_VERSION, HELM_SET_ARGS
(universal-chart.services.backend.image.name…, …celery.image.name…).
Замечания и потенциальные проблемы
- В
production.pySECRET_KEYзадан хардкодом (закомментированныйenv('SECRET_KEY')). Для реального прод-развёртывания ключ желательно вынести в секрет. - Основной конфиг не читает
.envавтоматически; переменные нужно экспортировать в окружение (в кластере это делает Vault +set -a). ТолькоSENTRY_*,ZITADEL_*,KAFKA_*читаются из файлов.env.base/.envих pydantic-классами. production.pyв репозитории backend иproduction.pyиз ConfigMapdjango-configmap— разные файлы. В кластере используется версия из ConfigMap (в ней, в частности, выставленоDEBUG=Trueв конце и включёнcorsheaders).DATABASES['default']['ENGINE']—django_prometheus.db.backends.postgresql(обёртка для метрик Prometheus).- Значения
SERVER_*-флагов уbackendиceleryместами различаются (напр.SERVER_ZITADEL_ENABLED,SERVER_API_HOST) — это ожидаемо.
Минимальный набор для локального запуска
Согласно README.md backend: поднять Postgres/Redis/RabbitMQ (docker-compose),
скопировать шаблон настроек cp config/settings/example.local.py config/settings/local.py,
применить миграции (python manage.py migrate) и создать суперпользователя.
Минимально требуются переменные БД (DJANGO_POSTGRES_* или значения в local.py),
брокера Celery (CELERY_RABBITMQ_*) и, при использовании соответствующих функций,
S3_*, JWT_PRIVATE_KEY/JWT_PUBLIC_KEY. Примеры значений — в .env.example
рядом с этим файлом.