BIM API в контуре aero + вывод наружу

Релиз идёт из base без единого патча, и это проверено по исходникам
bim-backend-v2, а не принято на веру:

  * DJANGO_HOST в base уже правильный (backend-svc.django:80) — редкость,
    у processing и workspaces там лежал несуществующий backend:8000;
  * DB_CERT_PATH_2/3/4 указывают на сертификат управляемой СУБД Яндекса,
    которого в контуре нет, но зануления не требуют: файл читается только
    под флагом ENABLE_SSL, а при нуле к строке подключения дописывается
    ?sslmode=disable и путь не трогается;
  * пять комплектов POSTGRES_*_N в vault-шаблоне смотрят на один хост —
    в проде это реплики, в контуре СУБД одна.

Django ходил в никуда: BIMV2_INTERNAL_HOST в base ведёт в namespace
bim-api к сервису bim-backend-v2-service, а релиз разворачивается в
namespace bim и называет сервис backend-svc. Поправлено в обоих релизах
django — backend и celery.

Наружу выведен отдельным поддоменом bim.sarex.local.lonsdaleites.ru, а не
префиксом на домене платформы: своего фронтенда у сервиса нет, общего с
платформой origin тоже, а его пути конфликтовали бы с маршрутом /api/
django. Имя добавлено в dnsNames сертификата — без этого браузер получил
бы сертификат без него.

Обвязка: regcred и роль Vault для namespace bim, apps/bim в
gitea_sync_paths, секрет secrets/apps/bim/postgres (база bim_db и роль bim
уже заведены в contour.databases).

ИЗВЕСТНЫЙ РИСК, проверяется логами первого пода. В ветке develop у
bim-backend-v2 миграции катятся при старте httpserver, ошибка фатальна, а
адрес БД внутри RunOnStartup взят не из конфига, а из константы
rc1b-sse4o3n9vea392g4.mdb.yandexcloud.net:6432. Из контура он недостижим.
Если этот код попал в образ contour_f9f2a39-dirty, под уйдёт в
CrashLoopBackOff и лечиться это будет только пересборкой образа.
This commit is contained in:
emelinda 2026-08-09 12:45:09 +03:00
parent c24f02b078
commit c8eefab4b6
5 changed files with 101 additions and 0 deletions

View File

@ -88,6 +88,7 @@ registry_secrets:
- {name: regcred, namespace: measurements} - {name: regcred, namespace: measurements}
- {name: regcred, namespace: processing} - {name: regcred, namespace: processing}
- {name: regcred, namespace: workspaces} - {name: regcred, namespace: workspaces}
- {name: regcred, namespace: bim}
# Поднимать стек (docker compose up -d). Требует запущенной службы docker и # Поднимать стек (docker compose up -d). Требует запущенной службы docker и
# docker login в cr.yandex — по умолчанию выключено. # docker login в cr.yandex — по умолчанию выключено.
@ -157,6 +158,7 @@ gitea_sync_paths:
- apps/measurements - apps/measurements
- apps/processing - apps/processing
- apps/workspaces - apps/workspaces
- apps/bim
# Рабочая копия репозитория gitea на хосте (клон, живёт между прогонами). # Рабочая копия репозитория gitea на хосте (клон, живёт между прогонами).
gitea_sync_workdir: "{{ deploy_dir }}/gitea-sync" gitea_sync_workdir: "{{ deploy_dir }}/gitea-sync"
@ -243,6 +245,7 @@ vault_k8s_roles:
- {name: processing, namespaces: [processing]} - {name: processing, namespaces: [processing]}
- {name: measurements, namespaces: [measurements]} - {name: measurements, namespaces: [measurements]}
- {name: workspaces, namespaces: [workspaces]} - {name: workspaces, namespaces: [workspaces]}
- {name: bim, namespaces: [bim]}
# Боевые креды инфраструктурных сервисов. Пути и имена ключей заданы чартами # Боевые креды инфраструктурных сервисов. Пути и имена ключей заданы чартами
# (см. vaultRoot у minio и auth.vault у rabbitmq в infrastructure/*/aero) — # (см. vaultRoot у minio и auth.vault у rabbitmq в infrastructure/*/aero) —
@ -370,6 +373,18 @@ vault_app_secrets:
# django, той самой учётки из secrets/apps/django/superuser выше. Из этого же # django, той самой учётки из secrets/apps/django/superuser выше. Из этого же
# пути django в base читает django_zitadel_access_token, но в контуре Zitadel # пути django в base читает django_zitadel_access_token, но в контуре Zitadel
# нет и та аннотация удалена в apps/django/aero — здесь удалять её НЕ нужно. # нет и та аннотация удалена в apps/django/aero — здесь удалять её НЕ нужно.
# --- Секреты приложения bim ---------------------------------------------
# Структура задана vault-шаблоном в apps/bim/base/backend.yaml: он собирает
# ПЯТЬ комплектов POSTGRES_*_N из одних и тех же ключей. В проде это разные
# кластеры-реплики, в контуре СУБД одна — шаблон просто повторяет её пять раз,
# поэтому здесь достаточно одного набора значений.
- path: secrets/apps/bim/postgres
data:
host: postgresql.postgresql.svc.cluster.local
port: "5432"
database: "{{ sarex_postgres_bim_db }}"
username: "{{ sarex_postgres_bim_user }}"
password: "{{ sarex_secrets.SAREX_BIM_DB_PASSWORD }}"
- path: secrets/vault/common/django_auth - path: secrets/vault/common/django_auth
data: data:
key: "{{ (superuser_name ~ ':' ~ superuser_password) | b64encode }}" key: "{{ (superuser_name ~ ':' ~ superuser_password) | b64encode }}"
@ -410,6 +425,11 @@ sarex_postgres_processing_user: processing
sarex_postgres_workspaces_db: workspace_db sarex_postgres_workspaces_db: workspace_db
sarex_postgres_workspaces_user: workspace sarex_postgres_workspaces_user: workspace
# То же для bim. Должно совпадать с записью bim_db в contour.databases
# (infrastructure/postgresql/aero).
sarex_postgres_bim_db: bim_db
sarex_postgres_bim_user: bim
# Бакет медиафайлов django. ВНИМАНИЕ: чарт MinIO бакеты не создаёт — его нужно # Бакет медиафайлов django. ВНИМАНИЕ: чарт MinIO бакеты не создаёт — его нужно
# завести отдельно, иначе загрузка файлов будет падать. # завести отдельно, иначе загрузка файлов будет падать.
sarex_django_s3_bucket: sarex-media-storage sarex_django_s3_bucket: sarex-media-storage

View File

@ -0,0 +1,36 @@
---
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: bim
resources:
- ../base
# Патчей к самому релизу НЕТ, и это проверено, а не «руки не дошли».
#
# 1. DJANGO_HOST в base уже правильный — http://backend-svc.django...:80.
# Это редкость: у processing и workspaces в base лежал несуществующий
# backend.django:8000, здесь адрес корректный.
#
# 2. DB_CERT_PATH_2/3/4 указывают на /root/yandex_pg.pem — сертификат
# управляемой СУБД Яндекса, которого в контуре нет. Зануление не нужно:
# в bim-backend-v2 файл читается ТОЛЬКО под флагом —
# if !cfg.IntegrationTest && cfg.EnableSSL { GetTLSCert(cfg.DBCertPath) }
# а при ENABLE_SSL=0 (значение из base) к строке подключения дописывается
# ?sslmode=disable и путь не трогается вовсе.
#
# 3. Пять комплектов POSTGRES_* в vault-шаблоне base смотрят на один и тот же
# хост — так и задумано: в проде это разные кластеры-реплики, в контуре
# СУБД одна, и шаблон просто повторяет её пять раз.
#
# ВНИМАНИЕ, ИЗВЕСТНЫЙ РИСК. В ветке develop у bim-backend-v2 миграции
# накатываются при старте httpserver и ошибка фатальна:
# if err := appmigrations.RunOnStartup(cfg); err != nil {
# log.Fatalf("Error applying migrations: %v", err)
# }
# а внутри RunOnStartup адрес БД взят не из конфига, а из константы
# const v5ClusterAddr = "rc1b-sse4o3n9vea392g4.mdb.yandexcloud.net:6432"
# Из контура этот хост недостижим. Если тот же код попал в образ
# contour_f9f2a39-dirty, под будет падать в CrashLoopBackOff с этим текстом —
# и лечится это только сборкой образа, конфигурацией здесь ничего не сделать.
# Образ, впрочем, собран с master и с пометкой -dirty, то есть руками, так что
# там может быть уже исправлено. Проверяется по логам первого же пода.

View File

@ -68,6 +68,17 @@ patches:
# четыре, и все четыре у celery: у backend те же переменные уже указывают # четыре, и все четыре у celery: у backend те же переменные уже указывают
# внутрь кластера. WORKFLOWS_USE=1, так что оставить как есть — значит # внутрь кластера. WORKFLOWS_USE=1, так что оставить как есть — значит
# получить зависания на недоступном домене вместо явной ошибки. # получить зависания на недоступном домене вместо явной ошибки.
# BIM API. В base адрес ведёт в namespace bim-api к сервису
# bim-backend-v2-service — ни того, ни другого в контуре нет: релиз
# разворачивается в namespace bim и называет сервис backend-svc.
# См. apps/bim/aero.
- op: test
path: /spec/values/services/celery/envs/8/name
value: BIMV2_INTERNAL_HOST
- op: replace
path: /spec/values/services/celery/envs/8/value/_default
value: http://backend-svc.bim.svc.cluster.local:80
- op: test - op: test
path: /spec/values/services/celery/envs/15/name path: /spec/values/services/celery/envs/15/name
value: SERVER_API_HOST value: SERVER_API_HOST
@ -153,6 +164,16 @@ patches:
path: /spec/values/services/backend/envs/2/value/_default path: /spec/values/services/backend/envs/2/value/_default
value: "False" value: "False"
# BIM API — то же, что у celery выше: в base адрес ведёт в namespace
# bim-api к сервису bim-backend-v2-service, а в контуре это namespace bim
# и сервис backend-svc.
- op: test
path: /spec/values/services/backend/envs/10/name
value: BIMV2_INTERNAL_HOST
- op: replace
path: /spec/values/services/backend/envs/10/value/_default
value: http://backend-svc.bim.svc.cluster.local:80
# --- Администратор платформы -------------------------------------------- # --- Администратор платформы --------------------------------------------
# Учётка приезжает из Vault под именами, которые ждёт штатная # Учётка приезжает из Vault под именами, которые ждёт штатная
# createsuperuser --noinput. Секрет кладёт ansible # createsuperuser --noinput. Секрет кладёт ansible

View File

@ -12,3 +12,6 @@ resources:
# Воркспейсы: api и фронтенд-ремоут. Фронтенд наружу не публикуется — его # Воркспейсы: api и фронтенд-ремоут. Фронтенд наружу не публикуется — его
# подгружает главный фронтенд платформы через свой nginx (/workspaces-v2/). # подгружает главный фронтенд платформы через свой nginx (/workspaces-v2/).
- ../../../apps/workspaces/aero - ../../../apps/workspaces/aero
# BIM API. Django обращается к нему через BIMV2_INTERNAL_HOST — адрес там
# чужой (namespace bim-api), поправлен патчем в apps/django/aero.
- ../../../apps/bim/aero

View File

@ -146,6 +146,26 @@ spec:
prefix: / prefix: /
service: frontend-svc.django.svc.cluster.local service: frontend-svc.django.svc.cluster.local
port: 80 port: 80
# BIM API. Отдельный поддомен, а не префикс на домене платформы:
# у сервиса нет своего фронтенда и нет общего с платформой origin,
# а его пути (/ping, /api/...) на общем домене конфликтовали бы с
# маршрутом /api/ django. Внутри кластера django обращается к нему
# напрямую по backend-svc.bim, этот маршрут — для внешних клиентов
# и отладки.
#
# Имя добавлено в dnsNames сертификата ниже: без этого браузер
# получит сертификат, в котором его нет.
bim:
namespace: gateway
hosts:
- bim.sarex.local.lonsdaleites.ru
gateways:
- gateway/contour-gateway
routes:
- path:
prefix: /
service: backend-svc.bim.svc.cluster.local
port: 80
# Management UI RabbitMQ. # Management UI RabbitMQ.
rabbitmq: rabbitmq:
namespace: gateway namespace: gateway
@ -203,6 +223,7 @@ spec:
- dashboard.sarex.local.lonsdaleites.ru - dashboard.sarex.local.lonsdaleites.ru
- rabbitmq.sarex.local.lonsdaleites.ru - rabbitmq.sarex.local.lonsdaleites.ru
- minio.sarex.local.lonsdaleites.ru - minio.sarex.local.lonsdaleites.ru
- bim.sarex.local.lonsdaleites.ru
issuerRef: issuerRef:
# Боевой издатель, см. infrastructure/cert-manager/aero/configs. # Боевой издатель, см. infrastructure/cert-manager/aero/configs.
name: letsencrypt-issuer-istio name: letsencrypt-issuer-istio