Compare commits

...

465 Commits

Author SHA1 Message Date
7c2cc383c1 ++ istio solver for stuck cert domains 2026-09-02 13:13:22 +03:00
ivan
26c05888f6 ++ 2026-09-02 14:10:34 +05:00
ivan
510cf875f4 ++ 2026-09-02 13:24:41 +05:00
d37c229249 ++ default local-path storage class to retain 2026-09-01 18:21:48 +03:00
ivan
2c252e52b2 ++ 2026-09-01 18:23:40 +05:00
ivan
4b9f6869e5 ++ 2026-09-01 17:45:25 +05:00
ivan
dbd9e25017 ++ 2026-09-01 14:42:10 +05:00
da34ec0bdf ++ exclude jwt-secret from flux-managed superset render 2026-09-01 11:28:33 +03:00
ivan
b441d1c913 ++ 2026-08-31 23:46:11 +05:00
ivan
6efd29da18 fix(brusnika-stage): битые внутрикластерные ссылки + чистка мусорных оверлеев
- django/s3-proxy: образ export-project -> s3-proxy:stable
- message-hub: backend-service.pm -> backend-svc.pm
- processing: documentations-filestream-service -> documentations-filestream
- resources: minio-service -> minio-svc
- documentations: bim-api-service -> backend-service.bim:8000;
  inspections-service -> backend-service.inspections:8000;
  remarks-static-service.remarks -> remarks-static.issues:80
- notes: sarex-* namespace -> реальные, documentations-service -> documentations-api,
  sarex-processing -> ns workflow / workflows-api-service,
  BASE_HOST уралхим -> test.sarex.brusnika.tech/notes
- подключён inspections в clusters/brusnika-stage/kustomization.yaml
- удалены мёртвые копипаст-оверлеи cross-section/faas/prescriptions/comparisons
  (нигде не подключены, побайтовые копии documentations/drawings)

brusnika-prod не трогаем.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-31 20:51:07 +05:00
ivan
37063d38e1 feat(bi): standalone-оверлеи bi для ugok, brusnika-stage, brusnika-prod
Не наследуют base (vault-native) — отдельные HelmRelease на universal-chart
с обычными secretEnvs, как остальные сервисы этих контуров. Свои хосты,
имена сервисов и kafka-bootstrap на контур; KAFKA_ENABLE=0, поэтому kafka
без секретов. Подключены к соответствующим clusters/*/kustomization.yaml.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-31 19:51:23 +05:00
ivan
0cfb386c90 fix(bi): bi-backend слушает :8000, не :80
Приложение (gunicorn/uvicorn) биндится на 0.0.0.0:8000. Service targetPort
и containerPort были 80 -> istio -> svc:80 -> pod:80 (никто не слушает) -> 503.
targetPort и deployment.port -> 8000, service.port остаётся 80 (в него бьёт VS).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-31 17:04:23 +05:00
ivan
0c7f1f63e9 ++ 2026-08-31 16:56:22 +05:00
ivan
9591d770be ++ 2026-08-31 16:55:22 +05:00
ivan
1ffe61ea88 feat(bi/d8-ugmk-prod): istio-маршруты для bi на sarex-bi.uralmine.com
/analytics-v2/api/ -> /api/  -> bi-backend-service.bi:80
/analytics-v2/static/, /analytics-v2/ -> / -> bi-frontend-frontend-svc.bi:80
Префиксы уже, чем catch-all `/` -> superset на том же хосте.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-31 16:54:09 +05:00
ivan
ce5280bef1 ++ 2026-08-31 16:33:57 +05:00
ivan
55156efab2 ++ 2026-08-31 16:23:28 +05:00
ivan
d3a973adea feat(bi): новое приложение bi (ns bi) на universal-chart + подключение к d8-ugmk-prod
apps/bi/base — bi-backend (vault-native, SA bi-vault) и bi-frontend.
apps/bi/d8-ugmk-prod — патч env под контур УГМК (хосты issues/eav/pm,
AUTH_HOST, kafka), namespace с deckhouse pod-policy.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-31 16:08:29 +05:00
ivan
710f20a98e fix(flows/brusnika-stage): не создавать backend-service из celery HR
celery.yaml и backend.yaml оба рендерили Service backend-service; релиз
celery выигрывал владение и ставил селектор app=celery -> трафик уходил
в celery-под -> 503. service.enabled: false, как в brusnika-prod.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-31 16:08:29 +05:00
ivan
42ff0855ed ++ 2026-08-31 14:54:08 +05:00
ivan
96e42f9899 ++ 2026-08-31 14:49:47 +05:00
ivan
ba72d321ba change images brusnika stage 2026-08-31 13:52:56 +05:00
ivan
eeb0330ed2 ++ 2026-08-31 01:23:17 +05:00
ivan
23cf83d92b ++ 2026-08-29 15:42:18 +05:00
ivan
bfa97c8286 ++ 2026-08-29 14:17:45 +05:00
ivan
6125cc9f4b ++ 2026-08-29 13:43:21 +05:00
ivan
c7c8f2683a ++ 2026-08-29 13:42:08 +05:00
ivan
9f7af7e39e ++ 2026-08-29 12:57:51 +05:00
ivan
dfcf9423f2 ++ 2026-08-29 12:55:04 +05:00
ivan
b8755c7399 ++ 2026-08-29 12:53:22 +05:00
ivan
bee1882830 ++ 2026-08-29 12:50:53 +05:00
ivan
75922e886e ++ 2026-08-29 04:54:22 +05:00
ivan
8dae7c76c7 ++ 2026-08-29 04:33:09 +05:00
ivan
43e8fd5408 ++ 2026-08-29 04:07:08 +05:00
ivan
2233069ce1 ++ 2026-08-29 04:00:37 +05:00
ivan
068badbe0b ++ 2026-08-29 03:57:01 +05:00
ivan
b757fa5452 ++ 2026-08-29 03:52:37 +05:00
ivan
ee9819a42f ++ 2026-08-29 03:38:35 +05:00
ivan
9cab91c074 ++ 2026-08-29 03:12:46 +05:00
ivan
3a6ee99866 ++ 2026-08-29 02:41:33 +05:00
ivan
60218f2306 ++ 2026-08-29 01:53:29 +05:00
ivan
98f5d6c0ae ugok: fix 11 images that regressed to cr.yandex during vault rebuild
The standalone rebuild in the previous commit reconstructed several
services from base/wb reference values and missed re-applying the
cr.yandex -> 10.4.10.187 registry swap for: checklists, issues/frontend,
contracts, drawings, flows (backend/celery/frontend),
documentations/pdf-markings, django/s3-proxy, django/srx-admin,
inspections. All 32 previously wb-synced images now verified back on
10.4.10.187:80/library.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-29 01:41:52 +05:00
ivan
2077174ef6 ++ 2026-08-29 01:37:04 +05:00
ivan
742a811313 ugok: rebuild all apps as standalone HelmReleases, drop vault-native base
Root cause: apps/*/ugok extended ../base via kustomize patches, but base
is vault-native (Vault Agent Injector annotations + serviceAccount +
command/args wrapper sourcing /vault/secrets/*). The Vault Agent Injector
webhook IS deployed cluster-wide in ugok (infrastructure/vault/ugok), so
it actually intercepted these pods — but no per-app Vault roles/secrets
were ever provisioned there, so every pod hung in Init.

Fix, mirrored from apps/*/wb (which never extends base for these apps):
rebuild every affected app as a standalone HelmRelease per service, with
no serviceAccount/podAnnotations override and no vault-sourcing wrapper
in command/args (dropped entirely, or replaced with the real functional
command where base's wrapper did double duty — e.g. celery invocations,
pm's `python manage.py migrate`, pdf-markings-amqp's `start-amqp-worker`).

Also recreates ConfigMaps that were referenced by name in volumes but
never actually captured into the repo (eav, subscriptions, pm, issues,
django) — copied verbatim from the cluster dump and verified byte-for-byte
against it.

Incidental bugs found and fixed along the way:
- message-hub was still extending base (missed in an earlier pass).
- system-log's patches targeted services.api/services.worker while base
  uses services.backend for both — would have produced duplicate
  Deployments per release, one of them permanently vault-broken.
- contracts' real container port is 8080, not base's default 8000.
- drawings' Service.targetPort (8000) didn't match the real containerPort
  (8080), breaking routing.
- inspections/ugok was missing entirely from this pass.

apps/documentations: intentionally left without a redis Deployment even
though VALKEY_ADDR now points at one — the cluster dump has no redis in
that namespace, so provisioning one is a scope decision, not a bug fix.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-29 01:22:21 +05:00
ivan
1cab84dc7b ++ 2026-08-29 00:35:12 +05:00
ivan
ded06de176 change images ugok 2026-08-29 00:32:55 +05:00
ivan
5009d7826a ++ 2026-08-29 00:05:54 +05:00
ivan
e5c01279b7 ugok: bootstrap application layer on universal-chart from cluster dump
Adds apps/<app>/ugok overlays for 31 applications, derived strictly from
a live cluster dump (kubectl get deployment/service/configmap/secret),
following the wb overlay pattern (standalone HelmRelease patches on
universal-chart, plain k8s Secret + secretKeyRef instead of Vault Agent
since the ugok cluster has zero Vault usage cluster-wide).

- processing (workflow namespace) does not extend base: base is
  vault-native, ugok is not, so it's four standalone HelmReleases
  modeled on apps/processing/wb/*.
- issues/redis and django/redis are raw Deployments patched via JSON6902.
- documentations/pdf-markings and django/auth-flow-frontend,
  export-project are copied in as standalone files (base has no
  HelmRelease for them, and kustomize forbids cross-overlay references
  outside a directory's own tree).
- Images and images-with-registry updated to match wb where the same
  build lineage applies; left as-is where the wb tag carries a distinct
  client/cluster name (donstroi1, brusnika_*, dev4, UGOK_*, ugok1_*) or
  points at a different image repository entirely.
- Missing backend envs backfilled from wb where safe (internal
  svc.cluster.local refs, feature flags, already-established ugok
  domains); skipped where wb-specific (external DB/Kafka hosts, TLS CA
  content, features not deployed in ugok like gatekeeper/Superset).
- message-hub patch was missing its entire env block from the original
  bootstrap; rebuilt from the raw dump (not wb, whose Kafka/DB config is
  incompatible) plus a handful of small env gaps found while
  cross-checking every ugok app's rendered envs against the raw dump.

clusters/ugok/kustomization.yaml keeps the apps section commented out —
not wired into the Flux Kustomization yet, pending review.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-28 23:41:50 +05:00
ivan
935f8fa372 Revert "brusnika-stage: align images with wb, add missing backend envs"
This reverts commit e18124c73a.
2026-08-28 19:03:00 +05:00
ivan
e18124c73a brusnika-stage: align images with wb, add missing backend envs
Образы подтянуты под теги wb там, где это один и тот же сервис.
В backend-файлах добавлены недостающие env-переменные — с адаптацией
доменов под конвенцию brusnika-stage (test.sarex.brusnika.tech), без
слепого копирования wb-специфичных значений (доменов/секретов).

Не тронуты apps/comparisons/brusnika-stage/backend.yaml,
apps/faas/brusnika-stage/backend.yaml, apps/notes/brusnika-stage/backend.yaml —
по содержимому принадлежат другим приложениям/клиенту, требуют отдельного
разбора.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-28 16:00:24 +05:00
bd62e7c153 ++ force empty nodeselector and tolerations for ugok vault 2026-08-28 13:21:49 +03:00
75cecf0321 ++ add vault install for ugok 2026-08-28 13:14:11 +03:00
de24873d04 ++ revert bad certSecretRef field on gitrepository 2026-08-28 12:58:36 +03:00
f39659f7bf ++ add gitea ca secretref for ugok 2026-08-28 12:51:32 +03:00
d9703b0c19 ++ add ugok cluster flux entry 2026-08-28 12:35:30 +03:00
emelinda
bebb4e9900 Adjust resource limits and requests in backend.yaml to increase CPU allocations. 2026-08-28 11:58:36 +05:00
ivan
dff652819a wb: set requests/limits from 14d VictoriaMetrics utilization
Проставлены requests и limits в apps/*/wb на основе p95/max
потребления CPU и памяти за 14 дней (scripts/wb-resource-utilization.sh).
request ~ p95*1.2, limit ~ max*1.5-2, с полом 10m/20m CPU и 32Mi/48Mi
памяти. documentations/pdf-markings: request урезан до пола (10m/32Mi),
limit оставлен на исходном уровне (2 CPU/8Gi) — редко используется, но
при вызове может понадобиться весь объём.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-27 15:36:59 +05:00
b911b7ea50 ++ deploy dedicated in-cluster postgres for zitadel, point zitadel at it 2026-08-26 14:22:02 +03:00
2bbf786aa6 ++ revert keycloak db password to allowed vault path 2026-08-26 14:17:25 +03:00
7b5f249581 ++ read identity password from canonical vault key, drop staging secret 2026-08-26 14:03:22 +03:00
09b0d4e8d1 ++ point keycloak db password at its own vault path 2026-08-26 12:53:12 +03:00
30e58fdc30 ++ fix gateway wildcard and drop foreign domains 2026-08-26 12:32:46 +03:00
9e66a1e31d ++ route s3 domain through ingressgateway to nginx service 2026-08-26 12:20:56 +03:00
8bbc158e49 ++ add s3-proxy nginx service for vad 2026-08-26 12:15:11 +03:00
d2df6afaa4 ++ add istio-config for vad with self-signed tls 2026-08-26 12:06:00 +03:00
f051fd67b8 ++ zitadel admin password reads same key as user 2026-08-26 11:58:30 +03:00
4420efb5a1 ++ match ugmk zitadel admin username pattern 2026-08-26 11:51:32 +03:00
c38032e64e ++ add kafka camunda zitadel overlays for vad 2026-08-26 11:32:23 +03:00
9db6db713a ++ nest ingressgateway service override under internal defaults key 2026-08-25 18:43:38 +03:00
b5acdf28b5 ++ fix vad ingressgateway values schema, expose 30080/30443 2026-08-25 18:40:55 +03:00
e2c3079ab1 ++ fix vad rabbitmq gateway crd and istio image pull secrets 2026-08-25 18:28:13 +03:00
83262697c0 ++ add vault, rabbitmq and istio for vad 2026-08-25 18:22:55 +03:00
5b3fb7d3f6 ++ add yc-oci-charts helm repository for vad 2026-08-25 15:34:13 +03:00
abb6c45590 ++ add vad cluster flux entrypoint 2026-08-25 15:27:18 +03:00
98f8ad1635 ++ null out sarex_db and resources_db chart defaults in trino catalogs 2026-08-25 14:57:43 +03:00
ivan
765f68f3b7 ++ 2026-08-24 14:33:35 +05:00
88b58158de ++ point trino at django_db, drop dead resources_db catalog 2026-08-21 15:56:15 +03:00
e44528627c ++ pin pgbouncer service to LoadBalancer with elb annotations 2026-08-21 15:53:26 +03:00
b5efcc378c ++ bump pgbouncer chart to 1.0.12 2026-08-21 14:45:05 +03:00
29cc95ef33 ++ add pgbouncer backup pooler to brusnika-prod 2026-08-21 14:21:13 +03:00
ivan
dd0dcfecd4 ++ 2026-08-21 14:55:41 +05:00
emelinda
4c5f812003 Expand architecture documentation: enhance preview.html with an application layer component registry, update tooltips, refine SVG rendering, and adjust Archimate model structure. 2026-08-20 21:54:37 +03:00
emelinda
2647f2554b Expand architecture documentation: update component counts, refine Archimate model structure, adjust inter-service relationships, and enhance notation explanations. 2026-08-20 19:26:43 +03:00
emelinda
c6dff71420 Expand architecture documentation: update component counts, refine domain groupings, add new Archimate views, and enhance notation explanations. 2026-08-20 19:23:43 +03:00
emelinda
8357ccee8a Expand architecture documentation: add support for labels (archimate:Note), update SVG rendering, extend node group definitions, and refine inter-service relationship mappings. 2026-08-20 19:23:16 +03:00
emelinda
c5f95ee66f Expand architecture documentation: add SMTP integration, external service descriptions (Keycloak, AD FS, Kerberos), and new Archimate components. 2026-08-20 19:01:02 +03:00
emelinda
2ca8360388 Expand architecture documentation: add SMTP integration details to multiple components in matrix.example.json and example-technology.xml. 2026-08-20 18:55:08 +03:00
emelinda
3830144269 Expand architecture documentation: add detailed descriptions for ams-sync and resources components, update their Archimate models, and correct inter-service relationships. 2026-08-20 18:39:24 +03:00
emelinda
2ee621bf3e Add architecture documentation: detailed descriptions for application layer components and their sources. 2026-08-20 18:34:42 +03:00
emelinda
4a0d099ba7 Merge remote-tracking branch 'origin/master' 2026-08-20 17:47:40 +03:00
emelinda
d077847c00 Add inter-service call graph: generate calls.example.json, implement scan_calls.py, and update documentation 2026-08-20 17:47:27 +03:00
fb1a36c2fd ++ switch superset domain to sarex-bi.uralmine.com 2026-08-20 15:48:55 +03:00
c45150bc98 ++ fix trino worker node selector render 2026-08-20 15:48:55 +03:00
emelinda
047e2e6a91 Merge remote-tracking branch 'origin/master' 2026-08-20 15:03:34 +03:00
emelinda
e7ce7d09a0 Expand contour profile documentation: add detailed descriptions for core services, external components, and node groups. 2026-08-20 15:03:18 +03:00
1cb049ba9b ++ place trino worker on processing node 2026-08-20 14:16:49 +03:00
327212ea6f ++ use mirrored ugmk superset trino images 2026-08-20 14:09:26 +03:00
3b5a6ddcc0 ++ fix ugmk superset trino contour charts 2026-08-20 14:09:26 +03:00
emelinda
4baf5ae1b6 Merge remote-tracking branch 'origin/master' 2026-08-20 13:50:24 +03:00
emelinda
38bb4de76c Update architecture documentation: improve Camunda details and add node group definitions 2026-08-20 13:50:11 +03:00
34c05548f6 ++ add superset trino ugmk 2026-08-20 13:19:52 +03:00
emelinda
4b15a60589 Remove UGMK technology layer scripts, JSON matrix, and Archimate model from the repository 2026-08-20 13:09:47 +03:00
emelinda
dab050c6ed Add Archimate model generation scripts, data, and HTML preview for UGMK technology layer 2026-08-20 13:06:32 +03:00
emelinda
390cf969d6 exclude CLAUDE.md from .gitignore 2026-08-20 11:47:19 +03:00
emelinda
adff1623dd Update flows-frontend and checklists-backend image tags in wb configs to contour_dcc5b5e6 and production_3d148228, respectively. 2026-08-19 17:04:22 +03:00
4198f1dfbc ++ remove unused sanitizer db 2026-08-19 08:18:47 +00:00
9ee7e1f76a ++ fix wb superset guest role 2026-08-18 16:54:27 +03:00
1ccb177d3c ++ fix wb superset iframe headers 2026-08-17 18:12:12 +03:00
79cb9d3d42 ++ fix wb superset host 2026-08-17 17:54:42 +03:00
e9c582800e ++ use wb superset jwt k8s secret 2026-08-17 17:19:21 +03:00
1827903c41 ++ fix wb superset guest token secret delivery 2026-08-17 17:00:33 +03:00
1017f93c6e ++ schedule wb trino coordinator on processing 2026-08-14 15:16:06 +03:00
89d5bc0f09 ++ tune trino memory for wb 2026-08-14 14:54:29 +03:00
ivan
8aec298543 ++ 2026-08-13 20:31:44 +05:00
ivan
b5a1b0c151 ++ 2026-08-13 20:30:02 +05:00
ivan
7e7be96785 ++ 2026-08-13 20:28:39 +05:00
ivan
98543a457f ++ 2026-08-13 20:14:25 +05:00
ivan
6a239da9a7 ++ 2026-08-13 15:32:48 +05:00
ivan
491e3b652f ++ 2026-08-13 12:07:34 +05:00
ivan
a093046832 ++ 2026-08-13 04:12:15 +05:00
ivan
65f5418803 ++ 2026-08-13 03:45:09 +05:00
ivan
604c048812 ++ 2026-08-13 03:35:12 +05:00
ivan
c6b7b3f173 ++ 2026-08-13 03:22:58 +05:00
ivan
62e190f535 ++ 2026-08-13 03:11:18 +05:00
ivan
c6baeedd0c ++ 2026-08-13 01:32:27 +05:00
ivan
599eba2031 ++ 2026-08-13 01:04:12 +05:00
ivan
ca2b2c5523 ++ 2026-08-13 00:48:12 +05:00
ivan
ba0e3be067 ++ 2026-08-13 00:40:52 +05:00
ivan
661e90da61 ++ 2026-08-13 00:33:48 +05:00
ivan
67610ef269 ++ 2026-08-13 00:15:42 +05:00
ivan
744db30c5d ++ 2026-08-12 23:35:53 +05:00
ivan
e854d6064a ++ 2026-08-12 23:21:34 +05:00
0e9172fb88 ++ point issues at the terraform-managed rabbitmq secret
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-12 16:36:40 +03:00
5bd29a46f1 ++ expand brusnika-stage rabbitmq pvc 2026-08-12 15:25:32 +03:00
eb2192b8f0 ++ absolute disk free limit for brusnika-stage rabbitmq
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-12 14:52:35 +03:00
ivan
fbdad7f412 ++ 2026-08-12 16:35:37 +05:00
60d2901a0e ++ shared rabbitmq for brusnika-stage
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-12 12:07:17 +03:00
1ae2a13198 expose vault UI for wb via istio at vault-srx.wb.ru, routes to vault-vault-contour-active on 8200
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-11 12:41:56 +03:00
802f0b44fc pin wb vault to generic node group, chart default nodeSelector targets a dedicated STS pool that does not exist in this cluster, same fix as d8-ugmk-prod
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-11 12:29:04 +03:00
9391ea9c82 add vault to wb 2026-08-11 12:23:55 +03:00
dabd39f34d Merge branch 'master' of gitlab.sarex.io:infra/iac 2026-08-11 11:16:06 +03:00
ivan
e1287ee464 ++ 2026-08-10 12:51:37 +05:00
ivan
e3867c012c ++ 2026-08-10 12:37:24 +05:00
ivan
bba2c08416 ++ 2026-08-09 15:02:31 +05:00
ivan
12f219c19b ++ 2026-08-09 14:54:02 +05:00
ivan
2f2289bd89 ++ 2026-08-09 14:52:30 +05:00
ivan
1106008b19 ++ 2026-08-09 13:50:12 +05:00
ivan
b629d7a699 ++ 2026-08-09 13:30:52 +05:00
ivan
8e51376de8 ++ 2026-08-08 20:17:39 +05:00
ivan
c9ae76d672 ++ 2026-08-08 16:11:12 +05:00
ivan
dd942e6a4b ++ 2026-08-08 14:14:11 +05:00
ivan
d17b56883c ++ 2026-08-08 14:10:20 +05:00
ivan
111e13acc9 ++ 2026-08-08 13:17:40 +05:00
ivan
3c5687d970 ++ 2026-08-08 12:41:48 +05:00
c10d84861f fix identity.fullURL for ugmk, was falling back to chart default identity.camunda.sarex.io instead of camunda-identity.sarex-k8s.uralmine.com 2026-08-07 14:43:35 +03:00
a6d7db5030 fix identity.fullURL for ugmk: was falling back to chart default identity.camunda.sarex.io instead of camunda-identity.sarex-k8s.uralmine.com 2026-08-07 14:26:12 +03:00
ivan
88b7c3bee5 ++ 2026-08-07 13:43:25 +05:00
ivan
7ff0388e15 ++ 2026-08-07 13:27:56 +05:00
ivan
390eec0d1f ++ 2026-08-07 13:03:50 +05:00
ivan
f2223ceab4 ++ 2026-08-07 12:52:30 +05:00
ivan
e61fb1614f ++ 2026-08-07 12:39:02 +05:00
ivan
d0f2386e7a ++ 2026-08-07 12:33:29 +05:00
ivan
2aad903a2e ++ 2026-08-06 20:08:49 +05:00
ivan
15f472d9d3 ++ 2026-08-06 19:12:50 +05:00
ivan
6f231aaede ++ 2026-08-06 14:25:30 +05:00
ivan
12d2fe5a21 ++ 2026-08-06 13:06:00 +05:00
ivan
fef5481432 ++ 2026-08-06 13:02:09 +05:00
ivan
45df0ed4d5 ++ 2026-08-06 12:44:49 +05:00
ivan
a8624abfc1 ++ 2026-08-06 12:05:00 +05:00
ivan
0b510fb9b2 ++ 2026-08-05 19:26:13 +05:00
c55bec5b5d ++ fix acme http01 challenges on external-stage, route all domains through istio instead of the dead nginx solver 2026-08-05 17:24:04 +03:00
emelinda
15392f3373 Add message-hub HelmRelease to d8-ugmk-prod: configure Kafka topics, environment variables, and enable Kafka integration in django. 2026-08-05 17:09:39 +03:00
emelinda
3317bbf5cd Update celery and backend in d8-ugmk-prod: enable caching, configure Redis host/port, and adjust environment variables for deployment consistency 2026-08-05 16:02:56 +03:00
emelinda
e1ca5d7706 Add s3-proxy HelmRelease to d8-ugmk-prod and configure endpoint and annotations for closed contour compatibility 2026-08-05 15:50:18 +03:00
emelinda
8447ab76bb Add frontend HelmRelease to d8-ugmk-prod and configure Istio route for s3-proxy in Istio config 2026-08-05 15:33:56 +03:00
emelinda
2dbc0b9266 add python manage.py makemigrations pm --noinput to pm entripoint 2026-08-05 15:09:35 +03:00
emelinda
2993c12487 Add python manage.py migrate execution to d8-ugmk-prod backend entrypoint script 2026-08-05 15:03:17 +03:00
emelinda
028abbe4d2 Merge remote-tracking branch 'origin/master' 2026-08-05 14:52:47 +03:00
emelinda
ae70f63fa3 Update celery and backend image tags in d8-ugmk-prod to production_fa0f1551 and adjust deployment configuration accordingly. 2026-08-05 14:51:51 +03:00
ivan
bc7f8c4950 ++ 2026-08-05 16:42:30 +05:00
emelinda
16c1c03b9e Rename backend-s3 HelmRelease to backend in d8-ugmk-prod and update deployment configuration with environment variable management and migration script adjustments. 2026-08-05 14:13:14 +03:00
emelinda
3cd5600f23 Add backend-s3, celery, and redis HelmReleases to d8-ugmk-prod: configure charts, deployment settings, and include in cluster Kustomization 2026-08-05 13:44:47 +03:00
ivan
ecd758d944 ++ 2026-08-05 13:57:41 +05:00
emelinda
12f3281deb Add IaC catalog: create IAC-CATALOG.md documenting component repositories, deployment models, and cluster configurations. 2026-08-05 11:29:52 +03:00
ivan
19fe0a66c2 ++ 2026-08-05 12:40:27 +05:00
ivan
30d58ba9af ++ 2026-08-05 12:30:12 +05:00
emelinda
abc4d756db Add S3 Proxy apps to yc-ecp: define s3-proxy and s3-proxy-bim HelmReleases with chart, deployment, and service configurations, and include in cluster Kustomization 2026-08-05 02:19:42 +03:00
emelinda
af6135f2b0 Re-enable and configure multiple virtual services in yc-ecp Istio configuration for main-gateway. 2026-08-05 02:16:35 +03:00
emelinda
9da34bb9cc Re-enable Django app in yc-ecp cluster Kustomization file. 2026-08-05 02:12:32 +03:00
emelinda
8d9e1d3d9e Comment out Django app in yc-ecp cluster Kustomization file. 2026-08-05 02:11:22 +03:00
emelinda
db0b8988f1 Refactor yc-ecp configuration: update HelmRelease affinity settings for frontend and re-enable commented Istio routes for main-gateway. 2026-08-05 02:06:17 +03:00
emelinda
218d233eb7 Add Django frontend app to yc-ecp: define namespace, configure HelmRelease with chart and deployment details, update Istio configuration, and include in cluster Kustomization 2026-08-05 01:58:35 +03:00
emelinda
f88cf04434 Update Measurements app image in yc-ecp configuration: change default tag to prod_6070cd4d 2026-08-05 01:48:07 +03:00
emelinda
d5884d3a3b Update Measurements app in yc-ecp: configure custom gunicorn command with access log settings 2026-08-05 01:39:43 +03:00
emelinda
d46ba48d22 Update yc-ecp Istio configuration: add main-gateway and TLS settings for aero.invest.sarex.io 2026-08-05 01:05:11 +03:00
emelinda
638da92688 Update Measurements app configuration in yc-ecp: enable backend service, set deployment and service details, and define resource requests and ports 2026-08-05 00:46:00 +03:00
emelinda
64412e1b94 Add Measurements app to yc-ecp: define namespace, update HelmRelease with chart details, and include in cluster Kustomization 2026-08-05 00:35:29 +03:00
emelinda
4abcd33cd5 Comment out Measurements app in yc-ecp cluster Kustomization file. 2026-08-05 00:26:54 +03:00
emelinda
27e36cfa7c Refactor Measurements app kustomization in yc-ecp: remove unused patches section and update resource references 2026-08-05 00:17:21 +03:00
emelinda
c7c244e95d Update yc-ecp Istio configuration: add imagePullSecrets for cert-manager and enforce HTTPS for dashboard bindings 2026-08-05 00:11:41 +03:00
emelinda
3a5b3b07e6 Add Measurements app to yc-ecp: define HelmRelease, configure Istio certificates, and update cluster Kustomization 2026-08-05 00:00:06 +03:00
emelinda
172e889f00 Add Kubernetes Dashboard configuration to yc-ecp: define HelmRelease, update Istio Gateway and VirtualService, and include in cluster Kustomization 2026-08-04 23:34:53 +03:00
emelinda
e491466a37 Refactor yc-ecp Istio and cert-manager configurations: adjust ClusterIssuer specs, update certificate and VirtualService keys, and add port names. 2026-08-04 23:27:13 +03:00
emelinda
6b107c872a Remove deprecated Let's Encrypt ClusterIssuer configurations and update dependencies in yc-ecp cert-manager and Istio configuration. 2026-08-04 23:14:05 +03:00
emelinda
9e4a27f898 Remove unused Let's Encrypt ClusterIssuer configurations from yc-ecp cert-manager directory. 2026-08-04 23:07:06 +03:00
emelinda
da36ac822f Remove unused ClusterIssuer references from yc-ecp cert-manager kustomization 2026-08-04 23:06:33 +03:00
emelinda
4cd9a8b4d5 Add imagePullSecrets to Let's Encrypt ClusterIssuer for DockerHub authentication 2026-08-04 22:58:10 +03:00
emelinda
c4e6c079f7 Migrate cert-manager configuration to yc-ecp infrastructure directory with updated HelmRelease, ClusterIssuer, and Kustomization files. 2026-08-04 22:53:59 +03:00
emelinda
6e94f826c3 Migrate Istio and Vault configurations to separate yc-ecp infrastructure directories with updated HelmRelease and Kustomization files. 2026-08-04 22:34:42 +03:00
ivan
3bb9514f1e ++ 2026-08-04 19:22:37 +05:00
ivan
16477cc6fd ++ 2026-08-04 18:56:41 +05:00
ivan
1e1280d74e ++ 2026-08-04 18:54:52 +05:00
ivan
a8a4f5e50d ++ 2026-08-04 18:33:39 +05:00
ivan
27327f2c9c ++ 2026-08-04 14:36:19 +05:00
ivan
a9ec189e91 ++ 2026-08-04 14:30:09 +05:00
ivan
9c892604fb ++ 2026-08-04 14:18:35 +05:00
ivan
0703f6a7ea ++ 2026-08-04 14:07:53 +05:00
ivan
c5ca007f03 ++ 2026-08-04 13:42:34 +05:00
ivan
a076995f3a ++ 2026-08-04 13:37:51 +05:00
ivan
0c04c357dc ++ 2026-08-04 13:29:50 +05:00
ivan
ebe1bbfd08 ++ 2026-08-04 13:19:31 +05:00
ivan
311abec040 ++ 2026-08-04 13:08:37 +05:00
ivan
3d80c69ed1 ++ 2026-08-04 12:52:48 +05:00
ivan
fb765a9cf9 ++ 2026-08-04 12:41:10 +05:00
ivan
8a0eee6538 ++ 2026-08-03 20:41:38 +05:00
ivan
f8a16fe423 ++ 2026-08-03 16:32:47 +05:00
ivan
48ec94afc9 ++ 2026-08-03 16:05:21 +05:00
ivan
30f669ed14 ++ 2026-08-03 15:59:05 +05:00
ivan
f55f25479a ++ 2026-08-03 15:46:41 +05:00
ivan
55c9f573c3 ++ 2026-08-03 15:30:37 +05:00
ivan
0dbe5dd0ac ++ 2026-08-03 14:57:06 +05:00
ivan
b84811a5b2 ++ 2026-08-03 14:52:09 +05:00
ivan
3b1878ca59 ++ 2026-08-03 14:48:27 +05:00
ivan
9c5dd7c860 ++ 2026-08-03 14:32:07 +05:00
ivan
bf5b04ace7 ++ 2026-08-03 14:27:22 +05:00
ivan
4e59c76096 ++ 2026-08-03 13:55:20 +05:00
fb30bab0b8 ++ prefix uralmine service domains with sarex 2026-08-03 11:06:10 +03:00
a4f1424403 ++ move uralmine service domains up one level 2026-08-03 10:56:18 +03:00
ivan
95f567a62b ++ 2026-08-02 02:06:58 +05:00
ivan
c05003f184 ++ 2026-08-02 02:05:07 +05:00
ivan
c5ccafa21f ++ 2026-08-02 01:53:05 +05:00
ivan
5ea61bd508 ++ 2026-08-02 01:52:18 +05:00
ivan
a99d93f41f ++ 2026-08-02 01:44:15 +05:00
ivan
278919eade ++ 2026-08-02 01:40:23 +05:00
ivan
66cd1a599f ++ 2026-08-02 01:39:54 +05:00
ivan
e069f38cb5 ++ 2026-08-02 01:32:18 +05:00
ivan
f5e278fbbf ++ 2026-08-02 01:20:01 +05:00
ivan
9cb672cf34 ++ 2026-08-02 01:10:27 +05:00
ivan
325aad49da ++ 2026-08-02 00:50:33 +05:00
ivan
38219249b3 ++ 2026-08-02 00:44:21 +05:00
ivan
6c81ba0080 ++ 2026-08-02 00:41:18 +05:00
ivan
c14d74050f ++ 2026-08-02 00:36:36 +05:00
ivan
3dd3c12537 ++ 2026-08-01 15:13:48 +05:00
ivan
d86bc2fbc5 ++ 2026-08-01 14:49:07 +05:00
ivan
7ad5c5f4b1 ++ 2026-08-01 14:41:41 +05:00
ivan
38a357ee64 ++ 2026-08-01 14:21:30 +05:00
ivan
5b2c6b9967 ++ 2026-08-01 14:08:35 +05:00
ivan
950c1a5c51 ++ 2026-08-01 14:00:43 +05:00
ivan
f1043df2da ++ 2026-08-01 13:53:41 +05:00
ivan
a148491f95 ++ 2026-08-01 13:07:29 +05:00
ivan
987e9e3a7f ++ 2026-08-01 12:50:10 +05:00
ivan
50cee9c4d3 ++ 2026-07-31 18:40:52 +05:00
ivan
80da663600 ++ 2026-07-31 17:53:50 +05:00
ivan
c470dacee3 ++ 2026-07-31 17:48:17 +05:00
ivan
ab7611fc7e ++ 2026-07-31 17:47:56 +05:00
ivan
fc9e75945a ++ 2026-07-31 17:42:37 +05:00
ivan
84c51343f9 ++ 2026-07-31 17:32:56 +05:00
ivan
396702429f ++ 2026-07-31 17:10:00 +05:00
ivan
800718737d ++ 2026-07-31 17:01:48 +05:00
ivan
e88027ffa6 ++ 2026-07-31 16:56:56 +05:00
ivan
798648e85d ++ 2026-07-31 16:53:33 +05:00
ivan
e09067365f ++ 2026-07-31 16:26:47 +05:00
ivan
9a8a80328a ++ 2026-07-31 16:22:27 +05:00
ivan
11fbf26d6d ++ 2026-07-31 16:12:24 +05:00
ivan
4e7757b7b4 ++ 2026-07-31 16:08:52 +05:00
ivan
8b6133a81a ++ 2026-07-31 16:07:34 +05:00
ivan
106b5d450d ++ 2026-07-31 15:46:58 +05:00
ivan
b98d3f6ab2 ++ 2026-07-31 15:27:24 +05:00
ivan
7868779771 ++ 2026-07-31 15:12:16 +05:00
ivan
b14e342955 ++ 2026-07-31 14:57:31 +05:00
ivan
d6a830db05 ++ 2026-07-31 14:54:33 +05:00
ivan
0d0b2cc5f8 ++ 2026-07-31 14:45:28 +05:00
ivan
3fb27a9e53 ++ 2026-07-31 14:13:51 +05:00
ivan
d57fcf8229 ++ 2026-07-31 13:59:05 +05:00
ivan
edd357ba72 ++ 2026-07-31 13:55:22 +05:00
ivan
c7b749fd09 ++ 2026-07-31 12:55:03 +05:00
emelinda
2296dae803 Disable initChownData in Grafana configuration within Prometheus Stack. 2026-07-30 20:04:12 +03:00
emelinda
833652bbc3 Reduce Prometheus Stack timeout to 5m and set disableWait for install, upgrade, and rollback operations. 2026-07-30 19:51:19 +03:00
emelinda
86cbaceeb3 Reduce gotk-sync interval from 10m to 1m in Flux configuration. 2026-07-30 18:20:07 +03:00
emelinda
c220e01b0e Merge remote-tracking branch 'origin/master' 2026-07-30 18:18:03 +03:00
emelinda
432fdf4c2e Update Istio configuration to rename Superset references to BI in host mappings 2026-07-30 18:17:53 +03:00
ivan
a9ea2e7d91 change charts 2026-07-30 20:10:37 +05:00
ivan
da9494b483 change charts 2026-07-30 19:42:35 +05:00
emelinda
3f8757b986 Merge remote-tracking branch 'origin/master' 2026-07-30 17:23:46 +03:00
emelinda
7553651efd Update Grafana securityContext in Prometheus Stack to enforce non-root user settings 2026-07-30 17:23:31 +03:00
ivan
f78ceb119e change charts 2026-07-30 19:09:24 +05:00
ivan
23d3c7ee31 ++ 2026-07-29 19:12:10 +05:00
ivan
6692bfbd53 ++ 2026-07-29 19:11:19 +05:00
ivan
91d1e6c52c ++ 2026-07-29 19:05:27 +05:00
ivan
5726d02b62 ++ 2026-07-29 18:19:52 +05:00
ivan
77d6f20146 ++ 2026-07-29 17:55:36 +05:00
ivan
34174be2e7 ++ 2026-07-29 17:48:54 +05:00
ivan
582028b65e ++ 2026-07-29 17:45:16 +05:00
ivan
c1aa11b922 ++ 2026-07-29 17:38:58 +05:00
ivan
73ec054bba ++ 2026-07-29 17:34:10 +05:00
ivan
d1b7fb65aa ++ 2026-07-29 16:05:18 +05:00
ivan
ffc186e418 ++ 2026-07-29 16:03:27 +05:00
ivan
f0aecc51ad ++ 2026-07-29 15:45:47 +05:00
ivan
29414b27ba ++ 2026-07-29 15:12:17 +05:00
ivan
2d455821fb ++ 2026-07-29 15:11:26 +05:00
ivan
da77a575da ++ 2026-07-29 14:52:13 +05:00
ivan
9618863915 ++ 2026-07-29 14:24:16 +05:00
ivan
c34ea8658b ++ 2026-07-29 14:21:06 +05:00
ivan
1029e25d43 ++ 2026-07-28 19:34:24 +05:00
ivan
76a3ba7d4e ++ 2026-07-28 19:15:38 +05:00
ivan
24521afd47 ++ 2026-07-28 19:10:02 +05:00
ivan
e0ae79b70f ++ 2026-07-28 18:28:25 +05:00
ivan
66cfb61bf2 ++ 2026-07-28 18:11:41 +05:00
ivan
5c43502cba ++ 2026-07-28 17:05:43 +05:00
ivan
caa5e428df ++ 2026-07-28 16:40:56 +05:00
ivan
a7d90941f9 ++ 2026-07-28 16:35:58 +05:00
ivan
0fbd503ff2 ++ 2026-07-28 16:21:53 +05:00
ivan
c22c795240 ++ 2026-07-28 15:52:39 +05:00
ivan
c2ff23a372 ++ 2026-07-28 15:49:21 +05:00
ivan
a5eb1269ab ++ 2026-07-28 15:39:31 +05:00
ivan
7bf12669d5 ++ 2026-07-28 15:19:32 +05:00
ivan
2bd1276cdb ++ 2026-07-25 21:18:11 +05:00
ivan
102d55d639 ++ 2026-07-25 21:13:36 +05:00
ivan
84cdce0c16 ++ 2026-07-25 20:56:38 +05:00
ivan
12e4d88957 ++ 2026-07-25 20:40:22 +05:00
ivan
465140806a ++ 2026-07-25 20:32:59 +05:00
ivan
377280b2fa ++ 2026-07-25 20:32:08 +05:00
ivan
c318ee0ca3 ++ 2026-07-25 19:57:07 +05:00
ivan
d77e600949 ++ 2026-07-24 15:49:56 +05:00
ivan
a90a6fea22 ++ 2026-07-24 15:47:32 +05:00
ivan
e6ae2d1d31 ++ 2026-07-24 15:22:51 +05:00
ivan
dc603936ab ++ 2026-07-23 19:11:00 +05:00
5b22347385 ++ fix superset remediation 2026-07-22 14:13:19 +03:00
e1a9b632e3 ++ ignore local tmp files 2026-07-22 13:58:44 +03:00
d2ac44a245 ++ fix superset redis image 2026-07-22 13:50:01 +03:00
d8f9c4381d ++ fix superset env duplicates 2026-07-22 13:28:22 +03:00
46d0de18fb add ss + trino to wb 2026-07-22 13:10:48 +03:00
ivan
09c06170db ++ 2026-07-21 21:19:57 +05:00
ivan
cd67f0211e ++ 2026-07-21 21:16:10 +05:00
emelinda
9f7fa82e0d Migrate notes app to HelmRelease. Add backend and frontend configurations and update related resources. 2026-07-21 18:48:36 +03:00
emelinda
80c4b412c0 Migrate notes app to HelmRelease, remove raw manifest definitions, and update d8-ugmk-prod kustomization and related configurations. 2026-07-21 17:55:26 +03:00
ivan
34d181a017 ++ 2026-07-21 19:15:27 +05:00
ivan
6f32692f88 ++ 2026-07-21 14:48:52 +05:00
ivan
ef9c579d3d ++ 2026-07-21 14:45:45 +05:00
ivan
eee24c8b62 -- 2026-07-21 14:41:55 +05:00
ivan
f6f5137ded ++ 2026-07-21 14:38:34 +05:00
ivan
689024267f ++ 2026-07-21 14:35:04 +05:00
ivan
4a6cd75f64 ++ 2026-07-21 14:30:44 +05:00
ivan
52ab310c65 ++ 2026-07-21 14:22:34 +05:00
eaa5afcac4 fix rmq 2026-07-20 19:44:25 +03:00
e28264a6ed enable rmq loopback user 2026-07-20 19:30:09 +03:00
446284bf4a remove bootstrap jobs form ugmk 2026-07-20 18:48:11 +03:00
edd195cdae bump rmq chart 2026-07-20 18:38:31 +03:00
emelinda
a64f539f3d Update Vault role for attachments app in d8-ugmk-prod configuration 2026-07-18 22:13:06 +03:00
emelinda
ccbfd63a08 Migrate attachments app to HelmRelease in d8-ugmk-prod, enable in kustomization, and update related configurations. Remove legacy namespace resource. 2026-07-18 21:43:49 +03:00
emelinda
3febe6382b Remove attachments app from d8-ugmk-prod kustomization and its namespace resource 2026-07-18 20:47:24 +03:00
0c1e3f8c59 add kafka authorizer 2026-07-17 18:06:03 +03:00
emelinda
9b0942f228 Migrate various applications to manifest definitions and HelmRelease. Add them to the appropriate namespaces and update related configurations. 2026-07-16 14:01:21 +03:00
emelinda
62e29156b8 add snapshots/* to .gitignore 2026-07-16 13:30:12 +03:00
emelinda
0d87e03126 add control-interface in d8-ugmk-prod 2026-07-15 18:42:26 +03:00
emelinda
06acc89567 remove control-interface in d8-ugmk-prod 2026-07-15 18:35:57 +03:00
emelinda
a8aeb7df0e Migrate auth-flow app from raw manifest definitions to HelmRelease and add to d8-ugmk-prod kustomization. Remove deprecated deployment and service resources and update related configurations. 2026-07-15 18:04:32 +03:00
emelinda
56e9457d27 Migrate frontend app from django namespace to control-interface namespace and update related HelmRelease configurations. 2026-07-15 17:58:41 +03:00
emelinda
0e0108ea52 Migrate remarks app from raw manifest definitions to HelmRelease and add to d8-ugmk-prod kustomization. Remove deprecated resources and update related configurations. 2026-07-15 17:55:40 +03:00
emelinda
68b2fc9eaf Migrate reviews app from raw manifest definitions to HelmRelease and add to d8-ugmk-prod kustomization. Remove deprecated resources and update related configurations. 2026-07-15 17:30:01 +03:00
emelinda
c46132f75c Migrate cross-section-static from raw manifest definitions to HelmRelease and add to d8-ugmk-prod kustomization. Remove deprecated resources and update related configurations. 2026-07-15 17:13:06 +03:00
d00f91688a Merge branch 'docs' into 'master'
Add example `.env` files and configuration documentation for `measurements`...

See merge request infra/iac!2
2026-07-15 13:44:56 +00:00
emelinda
dbcde81b88 Merge remote-tracking branch 'origin/docs' into docs 2026-07-15 16:39:59 +03:00
emelinda
62c06d3619 Merge branch 'master' of gitlab.sarex.io:infra/iac into docs 2026-07-15 16:39:45 +03:00
emelinda
1ab02557a5 Add srx-admin HelmRelease to d8-ugmk-prod in django namespace with default replica count 2026-07-15 16:28:08 +03:00
emelinda
182787e33b Migrate srx-admin from raw manifest definitions to HelmRelease and move from control-interface namespace to django. Remove deprecated resources and update related configurations. 2026-07-15 16:22:37 +03:00
emelinda
d60dc2a5e1 Enable attachments app in d8-ugmk-prod kustomization 2026-07-15 15:44:43 +03:00
emelinda
58c189cd69 Comment out attachments app in d8-ugmk-prod kustomization 2026-07-15 15:42:46 +03:00
emelinda
d191375321 Add namespace.yaml to d8-ugmk-prod kustomization 2026-07-15 15:35:50 +03:00
emelinda
2b1bc53e1b Add attachments namespace definition to d8-ugmk-prod 2026-07-15 15:35:30 +03:00
emelinda
b0cb13a83b Merge remote-tracking branch 'origin/master' 2026-07-15 14:59:21 +03:00
emelinda
15f9b3036b Migrate srx-admin HelmRelease from control-interface namespace to django and update related configurations. 2026-07-15 14:58:26 +03:00
6abde9cce2 ++ change infra domains 2026-07-15 14:53:57 +03:00
emelinda
8dfceabd9a Update d8-ugmk-prod kustomization to use control-interface namespace 2026-07-15 14:53:00 +03:00
emelinda
512ef2ec8e Migrate srx-admin HelmRelease from django namespace to control-interface and update related configurations. 2026-07-15 14:46:18 +03:00
emelinda
8a350b4391 Restructure d8-ugmk-prod kustomization to directly include infrastructure resources instead of nested directory. 2026-07-15 14:41:59 +03:00
ivan
ed80fd33e6 ++ 2026-07-15 16:32:44 +05:00
63cdb767e6 ++ move ugmk infrastructure patches to overlays 2026-07-15 13:00:34 +03:00
52f90cb00c ++ clear postgresql chart node selector 2026-07-15 12:34:47 +03:00
b343438779 ++ move zitadel postgresql to master node 2026-07-15 12:26:52 +03:00
4b165fe6e1 ++ add deckhouse istio ingress and selfsigned tls 2026-07-15 12:07:54 +03:00
26f10ce34b ++ add istio routes for ugmk services 2026-07-15 11:50:31 +03:00
77b8c84b71 ++ move camunda databases external and scale down 2026-07-15 11:05:02 +03:00
emelinda
28478d9c86 Add example .env files and configuration documentation for ams-sync, auth-flow, bim, cde, comparisons, django, document-link, flows, iam, inspections services. 2026-07-14 19:23:02 +03:00
67ad879aa3 ++ remove default sts selector from postgresql 2026-07-14 16:44:07 +03:00
576b67f566 ++ fix generic scheduling for postgresql and zitadel 2026-07-14 16:24:53 +03:00
089c125fa3 ++ fix postgresql namespace for zitadel 2026-07-14 16:17:43 +03:00
6beaa1bbbf ++ deploy zitadel to a dedicated postgresql 17 2026-07-14 16:04:32 +03:00
emelinda
cce76e48a9 Add example .env files and detailed configuration documentation for checklists, contracts, drawings, and eav services. 2026-07-14 00:13:03 +03:00
emelinda
9cff5d6e39 Add example .env files and detailed configuration documentation for mapper, message-hub, notes, pm, and prescriptions services. 2026-07-13 23:48:41 +03:00
emelinda
b18e31d5d6 Add example .env file, configuration documentation, and endpoint documentation for resources, remarks, and reviews services. 2026-07-13 22:38:53 +03:00
emelinda
d7ec0cc9aa Add example .env file, configuration documentation, OpenAPI specification, and endpoint documentation for rfi-backend service. 2026-07-13 22:05:12 +03:00
emelinda
bd9e42f43d Add example .env file, configuration documentation, and OpenAPI specifications for stamp-verification service. 2026-07-13 21:40:40 +03:00
emelinda
b4568003a3 Add OpenAPI specification for transmittal service. 2026-07-13 21:24:33 +03:00
9f582bdc84 fuhrer fixes 2026-07-13 21:11:55 +03:00
emelinda
f184c7b8d9 Add OpenAPI specification for system-log service. 2026-07-13 20:51:21 +03:00
emelinda
5f7fe11748 Add example .env files and configuration documentation for measurements and subscriptions services. 2026-07-13 20:35:36 +03:00
7dba565792 ++ add d8 ugmk prod service infra 2026-07-13 20:32:32 +03:00
emelinda
1b5f5a1f67 Add example .env file and detailed configuration documentation for system-log service. 2026-07-13 18:11:28 +03:00
emelinda
3b29a987e8 change frontend + backend workspaces docs 2026-07-13 17:50:20 +03:00
38b96ebecc ++ patch vault workloads to generic in d8-ugmk-prod 2026-07-13 17:26:31 +03:00
emelinda
c70e30729c add attachments, transmittal, workspaces docs 2026-07-13 17:24:47 +03:00
cb5ca1633c ++ pin vault to generic nodes in d8-ugmk-prod 2026-07-13 17:21:00 +03:00
097696fdb4 ++ disable istio injection for vault in d8-ugmk-prod 2026-07-13 17:13:35 +03:00
5dcd01daa4 ++ add d8-ugmk-prod flux bootstrap and vault 2026-07-13 17:06:40 +03:00
ivan
63ae2ef92f ++ 2026-07-08 16:04:37 +05:00
ivan
5516bd7074 ++ 2026-07-08 15:05:04 +05:00
ivan
c307dcc62b ++ 2026-07-08 15:02:10 +05:00
ivan
0aed5f9c17 ++ 2026-07-08 14:45:22 +05:00
ivan
925310b439 ++ 2026-07-08 14:41:54 +05:00
ivan
34fd7bd892 ++ 2026-07-08 14:28:36 +05:00
ivan
0000f48391 ++ 2026-07-08 14:26:27 +05:00
ivan
38b6b8accb ++ 2026-07-08 14:18:51 +05:00
ivan
5842d961eb ++ 2026-07-07 15:15:43 +05:00
ivan
148182fb8a ++ 2026-07-07 15:07:39 +05:00
ivan
998dc945b0 ++ 2026-07-07 14:38:16 +05:00
ivan
b5f052061a ++ 2026-07-07 14:06:59 +05:00
ivan
ee75e5a015 ++ 2026-07-07 14:06:46 +05:00
ivan
f264f62b89 ++ 2026-07-07 14:06:09 +05:00
ivan
06b72160c1 ++ 2026-07-07 13:09:52 +05:00
ivan
7d1efd5e82 ++ 2026-07-07 12:55:08 +05:00
6a111ccc18 ++ enable vault prometheus metrics 2026-07-01 17:10:16 +03:00
547cd4ecf4 ++ bump all test postgresql restores 2026-06-30 13:50:15 +03:00
88084754d6 ++ bump resources and eav postgresql restore 2026-06-30 13:40:32 +03:00
923e516274 ++ restore next business databases from company dumps 2026-06-30 12:24:10 +03:00
297cce9621 ++ bump business postgresql to 13.0.14 2026-06-30 12:12:19 +03:00
bb32344acd bump postgresql chart 2026-06-30 11:04:16 +03:00
bad77b52f1 restore buisness owned postgresql from company dumps 2026-06-29 19:22:02 +03:00
9bfb5cc3b8 restore buisness owned postgresql from company dumps 2026-06-29 18:45:57 +03:00
bc8222b5cd restore buisness owned postgresql from company dumps 2026-06-29 18:20:02 +03:00
1565d9550e restore buisness owned postgresql from company dumps 2026-06-29 17:54:02 +03:00
1cc5f1c72e ++ bump business postgresql to 13.0.10 2026-06-29 17:54:02 +03:00
ivan
203f811c73 ++ 2026-06-29 16:25:31 +05:00
ivan
ecbf9b2126 ++ 2026-06-29 16:16:39 +05:00
ivan
cbdbb1bf63 ++ 2026-06-29 16:00:34 +05:00
ivan
5b53761ea9 ++ 2026-06-29 15:51:13 +05:00
51779f11c1 add contour envoy filters 2026-06-29 13:30:50 +03:00
ivan
21052884cb ++ 2026-06-29 14:38:29 +05:00
057989099b ++ bump pg-sanitizer image to infra_6622cc06 (fix circular fk prune) 2026-06-26 15:05:48 +03:00
7830bd2f08 ++ add signoz otel compatibility service 2026-06-25 17:14:28 +03:00
5995e6ff11 ++ fix otel vault agent resources 2026-06-25 12:36:09 +03:00
3908af1fbf ++ fix istio gateway values 2026-06-25 12:06:43 +03:00
26d7b18586 ++ fix istio gateway replicas 2026-06-25 11:58:44 +03:00
d733f45be5 ++ fix openobserve otel secrets 2026-06-24 20:42:11 +03:00
f511b95adf ++ disable otel extra pod monitors 2026-06-24 16:24:17 +03:00
3a53ee3306 ++ disable otel prometheus feature gates 2026-06-24 15:58:22 +03:00
2f9a3fb81b ++ disable otel monitor crds 2026-06-24 15:40:19 +03:00
7bbe836fef ++ relax otel rollout dependencies 2026-06-24 15:31:15 +03:00
c02e553ba4 ++ add otel istio tracing config 2026-06-24 15:25:48 +03:00
531fb6d0f0 ++ bump sanitizer-multi image and enable fk gate
- workflowtemplate-multi: image infra_4079fdcf -> infra_68ef2cee
- enable run_fk_integrity_validation by default, add run_fk_orphan_prune param
- cronworkflow-multi: same fk param defaults for when it is resumed

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 13:34:35 +03:00
010bf6d0cf ++ fix openobserve pull secret 2026-06-24 11:02:56 +03:00
beb833890f ++ fix postgresql namespace duplicate 2026-06-24 10:31:40 +03:00
d51db72714 Merge branch 'feature/INFRA-2004-infra-patch-restructurization' into 'master'
Refactor `yc-k8s-test` infrastructure by splitting kustomization files into...

See merge request infra/iac!1
2026-06-24 07:29:14 +00:00
emelinda
ba6fe89549 Refactor yc-k8s-test infrastructure by splitting kustomization files into resource-specific directories. 2026-06-23 11:56:05 +03:00
f43c9b7e1c ++ 2026-06-22 12:29:00 +00:00
1078 changed files with 122747 additions and 7578 deletions

7
.gitignore vendored
View File

@ -1,6 +1,9 @@
.idea
.claude
CLAUDE.md
.env
tmp
tmp
.tmp/
snapshots/*
scripts/.venv
scripts

81
CLAUDE.md Normal file
View File

@ -0,0 +1,81 @@
# Карта репозитория
Навигационный индекс `infra/iac`: где что лежит, какие здесь конвенции путей и на чём легко ошибиться. Для быстрого входа новым людям и для агентов (файл автоматически подхватывается Claude Code).
Не дублирует [README.md](README.md) (как пользоваться Flux, как добавить компонент) и [IAC-CATALOG.md](IAC-CATALOG.md) (подробный каталог всего estate `infra/*`) — отсылает к ним.
## Что это за репозиторий
Только **FluxCD v2 (GitOps) + Kustomize-оверлеи + HelmRelease**.
Здесь принципиально **нет** и искать бесполезно:
| Что | Где искать |
|---|---|
| Terraform / Terragrunt | `infra/terraform`, `infra/terraform-contour`, `infra/terraform-contour-mirror` |
| Ansible | `infra/ansible-playbooks`, `ansible-patroni-cluster`, `ansible-minio-cluster` |
| Провижининг кластеров | `infra/kubespray`, `infra/k8s-provision` |
| ArgoCD (контур ГПН) | `infra/iac-gpn` |
| CI сборки образов | `generic/common-ci`, `generic/base-image` |
| Push-деплой через `.helm/` (ветка = контур) | ~60 компонентных репозиториев, см. `IAC-CATALOG.md` §4 |
Чарты тянутся из `oci://cr.yandex/crp3ccidau046kdj8g9q/charts`, образы — `cr.yandex/crp3ccidau046kdj8g9q/<name>:<tag>`. Все приложения ставятся на общий чарт `universal-chart`; значения обёрнуты в ключ `_default` и выбираются по `global.env`.
## Дерево
| Путь | Что |
|---|---|
| `clusters/` | 10 точек входа Flux — **источник истины «что где раскатано»** |
| `infrastructure/` | 36 платформенных компонентов |
| `apps/` | 37 прикладных сервисов |
| `docs/apps/` | 35 mermaid-диаграмм по сервисам + `README.md` с доменной группировкой |
| `docs/closed-contour-deployment.md` | ранбук поднятия закрытого контура |
| `README.md` | mermaid-мегакарта платформы, структура репозитория, инструкции по добавлению app / infra / кластера |
| `IAC-CATALOG.md` | каталог всего `infra/*`; §5 — про этот репозиторий |
| `inventory.yaml` | сгенерированный снимок прода: 59 namespace → kind → имена |
## Конвенции путей
**Кластер.** `clusters/<cluster>/kustomization.yaml` — плоский список `../../apps/<app>/<cluster>`. Инфраструктура подключается двумя разными способами:
- `d8-ugmk-prod` — прямо в корневом kustomization как `../../infrastructure/<comp>/d8-ugmk-prod`;
- `brusnika-prod`, `brusnika-stage`, `wb` — через `clusters/<c>/infrastructure/kustomization.yaml`, который ссылается на `../../../infrastructure/<comp>` (резолвится в `base`), а различия лежат в `clusters/<c>/infrastructure/patches/*.yaml`.
Кластеры: `brusnika-prod`, `brusnika-stage`, `d8-ugmk-prod`, `wb`, `yc-cps-prod`, `yc-ecp`, `yc-infra-prod`, `yc-k8s-test`, `yc-k8s-test-02`, `contour`.
**Приложение.** `apps/<app>/base/` — по одному `.yaml` на процесс (`backend.yaml`, `celery.yaml`, `frontend.yaml`) плюс `namespace.yaml`; оверлеи в `apps/<app>/<cluster>/`. Namespace = имя приложения. Рядом с манифестами лежит документация: `CONFIGURATION.md` (все env-переменные и откуда берутся), `ENDPOINTS.md` (исходящие HTTP-вызовы), `openapi.yaml` (входящий контракт), `.env.example`. Если процессов несколько — файлы с префиксом процесса: `api.ENDPOINTS.md`, `pdm.CONFIGURATION.md`, `frontend.CONFIGURATION.md`.
**Инфра-компонент.** `infrastructure/<comp>/base/` + оверлеи `<comp>/<cluster>/`. Корневой `infrastructure/<comp>/kustomization.yaml` всегда указывает просто на `base`. Чарты идут с суффиксом контура: `vault-contour`, `keycloak-contour`, `postgresql-contour` и — внимание — `idp-contour` это Zitadel.
## Где искать конкретное
| Вопрос | Файл |
|---|---|
| Что развёрнуто в контуре X | `clusters/X/kustomization.yaml` (+ `clusters/X/infrastructure/kustomization.yaml`) |
| Откуда Flux тянет контур | `clusters/X/flux-system/gotk-sync.yaml` |
| Внешние хосты, TLS, path-роутинг | `infrastructure/istio-config/<cluster>/istio-config.yaml` либо `clusters/<c>/infrastructure/patches/istio-config.yaml` |
| Кто кого зовёт (граф сервисов) | `apps/*/ENDPOINTS.md` + env-переменные с `*.svc.cluster.local` в `apps/**/*.yaml` |
| Что делает сервис, его БД / брокер / S3 | `docs/apps/<app>.md` |
| Значение env-переменной | `apps/<app>/CONFIGURATION.md` |
| Секреты | Vault Agent Injector; путь `secrets/data/apps/<app>/postgres`, role = имя приложения, SA = `<app>-vault` |
| Тег образа в контуре | `apps/<app>/<cluster>/*.yaml`, поле `image.tag` |
| Что реально в проде по namespace | `inventory.yaml` |
| Где лежит исходный код приложения | `IAC-CATALOG.md` §5.3.8 |
## Ловушки
- **`dsinv/`** — оверлей есть у 25 приложений, но `clusters/dsinv/` не существует. Это материализованный снимок живого контура WB, а не источник деплоя. Развёрнутым не считать.
- **Две несовместимые конвенции оверлеев** (`IAC-CATALOG.md` §5.3.4). `d8-ugmk-prod`, `yc-k8s-test`, `dsinv` наследуют `base` и патчат его. `brusnika-prod`, `brusnika-stage`, `yc-ecp` — полные копии HelmRelease, которые молча дрейфуют от base. Правка `base` на них не влияет.
- **`IAC-CATALOG.md` — снимок на 05.08.2026** и по составу приложений на контур уже расходится с реальностью (там у `wb` ноль приложений, фактически 26 оверлеев). Всегда сверяться с `clusters/*/kustomization.yaml`.
- **Мегадиаграмма в `README.md` идеализирована** — рисована руками, показывает все приложения на одной Postgres и все фронтенды за `control-interface`. Проверяемые источники — env-переменные и istio-config.
- **`clusters/contour/` — не кластер, а шаблон**: в нём нет `flux-system`, только `apps.yaml`, `infrastructure.yaml`, `helm-repositories.yaml`.
- **Path-роутинг виден в репозитории только у `d8-ugmk-prod` и `yc-ecp`.** В Brusnika и WB весь прикладной трафик уходит одним правилом в `nginx-service.global-ingress` / `yet-another-nginx-service.global-ingress`, а разводка по путям происходит вне репозитория. Через Istio там публикуются только платформенные UI (Gitea, Grafana, OpenObserve, Superset, Vault, Zitadel, Camunda, MinIO).
- **Имена namespace расходятся между источниками**: `inventory.yaml` использует суффикс (`flows-prod`), `apps/` — голое имя (`flows`).
- **17 оверлеев приложений не подключены ни к одному кластеру** — мёртвый код.
- **Нет диаграмм** в `docs/apps/` для `iam`, `auth-flow`, `ams-sync`.
- **Чистые фронтенды без бэкенда в этом репозитории**: `auth-flow`, `control-interface`, `cross-section`, `document-link`, `prescriptions`, `projects`, `remarks`, `reviews`, `stamp-verification`. Бэкенд `projects` живёт в `planning/projects-backend`.
- Самые центральные сервисы по числу входящих ссылок: `documentations` (~85), `processing` / `workflow` (~76), `django` (~53), `eav` (~47), `resources` (~44), `bim` (~39), `flows` (~38). Менять их конфигурацию — дороже всего.
## Поддержка файла
Карта описывает структуру и конвенции, а не текущий состав. Обновлять при появлении нового кластера, смене конвенции оверлеев или когда очередная ловушка перестаёт быть правдой. Списки приложений и версии сюда не дублировать — для этого есть `clusters/*/kustomization.yaml` и `IAC-CATALOG.md`.

675
IAC-CATALOG.md Normal file
View File

@ -0,0 +1,675 @@
# Каталог IaC-компонентов и репозиториев
Карта ответственности: **какой репозиторий за что отвечает** в инфраструктуре `gitlab.sarex.io`
и **из чего состоит** этот репозиторий (`infra/iac`).
- Источники: GitLab-группа `infra` (209 проектов, включая подгруппы) + содержимое `infra/iac`.
- Дата среза: **2026-08-05**.
- Все ссылки — на `https://gitlab.sarex.io`.
Пометки достоверности:
| Знак | Значение |
|---|---|
| ✅ | структура/назначение проверены — репозиторий открыт и прочитан |
| ◻️ | назначение выведено из имени, описания в GitLab и веток; **требует подтверждения** |
---
## 1. Слои IaC и где они живут
```
┌─ Железо / VM ─────────────────────────────────────────────────────────────┐
│ ansible-playbooks, ansible-patroni-cluster, ansible-minio-cluster, │
│ tools/ansible-vm-preparing, astra-linux, hardware, intervpc-vpn-tunnel │
├─ Кластер Kubernetes ──────────────────────────────────────────────────────┤
│ kubespray, k8s-provision │
├─ Облачные и k8s-ресурсы (namespace/БД/S3/секреты/топики) ─────────────────┤
│ terraform, terraform-contour, terraform-contour-mirror, │
│ sarex-terraform-provider │
├─ GitOps: состояние кластеров ─────────────────────────────────────────────┤
│ ★ iac (Flux v2, этот репозиторий) iac-gpn (ArgoCD) poc/iac (архив) │
├─ Поставка отдельных компонентов через GitLab CI (ветка = контур) ─────────┤
│ vault, redis, kafka, postgresql, istio-config, keycloak, … (~60 репо) │
├─ Библиотеки чартов ───────────────────────────────────────────────────────┤
│ universal-helm-chart, common-charts, chart-museum │
├─ Эксплуатация, аудит, наблюдаемость ──────────────────────────────────────┤
│ k8s-changelog, cluster-maintenance, k8s-hustler, harvester, backups/* │
└───────────────────────────────────────────────────────────────────────────┘
```
**Главный водораздел.** В инфраструктуре сосуществуют **две модели доставки**:
1. **GitOps (Flux)**`infra/iac`. Один репозиторий, множество кластеров, состояние декларируется
в `clusters/<кластер>/`, Flux сам подтягивает изменения.
2. **Push-деплой (GitLab CI)** — по репозиторию на компонент, чарт лежит в `.helm/`,
**ветка = контур/окружение** (`stage`, `preprod`, `contour`, `infra`, `brusnika-prod`, …).
Проверено на [vault](https://gitlab.sarex.io/infra/vault),
[redis](https://gitlab.sarex.io/infra/redis),
[istio-config](https://gitlab.sarex.io/infra/istio-config),
[kube-prometheus-stack](https://gitlab.sarex.io/infra/kube-prometheus-stack),
[gitlab-runner](https://gitlab.sarex.io/infra/gitlab-runner). ✅
Для ряда компонентов (Vault, Redis, Kafka, PostgreSQL, Istio, Keycloak, Zitadel, OpenObserve,
Superset, Trino, GoAlert, GlitchTip, argo-*, otel-*) **существуют оба источника**.
См. раздел [6. Перекрытия](#6-перекрытия-и-как-выбирать-источник-истины).
---
## 2. Ядро IaC — репозитории верхнего уровня
| Репозиторий | Зона ответственности | Ключевое содержимое |
|---|---|---|
| ★ [infra/iac](https://gitlab.sarex.io/infra/iac) ✅ | **Основной GitOps-монорепозиторий (Flux v2).** Декларативное состояние 9 кластеров: инфраструктурные компоненты + прикладные сервисы | `clusters/`, `infrastructure/` (36), `apps/` (37), `inventory.yaml`, `docs/apps/` |
| [infra/terraform](https://gitlab.sarex.io/infra/terraform) ✅ | **Ресурсы Yandex Cloud и Kubernetes**: namespaces, PostgreSQL БД/пользователи, S3-бакеты, Valkey/Redis-пользователи, Kafka-топики, RabbitMQ, k8s-секреты. Единый источник правды — `infrastructure.yaml`, секреты через SOPS | `live/prod` (Terragrunt), `modules/`: `k8s-namespace`, `k8s-secret`, `k8s-secrets`, `kafka-topics-yc`, `rabbitmq`, `yc-database`, `yc-s3`, `yc-valkey-user` |
| [infra/terraform-contour](https://gitlab.sarex.io/infra/terraform-contour) ✅ | Тот же подход **для изолированного контура**: namespaces и секреты из Vault | `live/{namespace,vault-secrets}`, `modules/{k8s-namespace,vault-platform-secrets}` |
| [infra/terraform-contour-mirror](https://gitlab.sarex.io/infra/terraform-contour-mirror) ✅ | **Зеркало `infra/terraform` для контура** (ветка `contour`, единственная). Тот же README и структура + `Dockerfile` для запуска в закрытом периметре | `live/`, `modules/`, `scripts/`, `Dockerfile` |
| [infra/sarex-terraform-provider](https://gitlab.sarex.io/infra/sarex-terraform-provider) ✅ | **Внутренние Terraform-провайдеры**, генерируемые из OpenAPI-спек продуктовых API (например `workspaces-api`). В публичный реестр не публикуются — ставятся через dev overrides | `providers/`, `internal/`, `examples/`, `Makefile` |
| [infra/iac-gpn](https://gitlab.sarex.io/infra/iac-gpn) ✅ | **GitOps-контур ГПН на ArgoCD** (не Flux): `root.yaml` + app-of-apps, конфигмапы бэкендов, образ `terraform-contour-stronghold` | `argocd/{root.yaml,apps}`, `infrastructure/*-configmaps`, `images/` |
| [infra/poc/iac](https://gitlab.sarex.io/infra/poc/iac) ✅ | **Предшественник/PoC** текущего Flux-репозитория. Последняя активность 2026-02-16 — считать архивом | `clusters/`, `apps/`, `infra/`, `GUIDE.md` |
---
## 3. Провижининг: от железа до кластера
| Репозиторий | Отвечает за |
|---|---|
| [infra/kubespray](https://gitlab.sarex.io/infra/kubespray) ✅ | Форк upstream Kubespray — **развёртывание самих кластеров Kubernetes** на VM |
| [infra/k8s-provision](https://gitlab.sarex.io/infra/k8s-provision) ✅ | **Первичная обвязка свежего кластера**: `namespaces`, `cert_manager`, `istio` (+`ISTIO.md`), `ingress`, `dashboard`, `prometheus`, `postgres`/`ya_postgres`, `rabbitmq`, `pvc`, `gitlab`, `teamcity`, `migration` |
| [infra/ansible-playbooks](https://gitlab.sarex.io/infra/ansible-playbooks) ✅ | Зонтичный Ansible-репозиторий: каталоги `minio/`, `patroni/` |
| [infra/ansible-patroni-cluster](https://gitlab.sarex.io/infra/ansible-patroni-cluster) ✅ | **PostgreSQL HA на VM через Patroni** (`site.yml`, `roles/`, `inventory/`, `test.yml`) |
| [infra/ansible-minio-cluster](https://gitlab.sarex.io/infra/ansible-minio-cluster) ✅ | **MinIO-кластер на VM** + сценарии проверок `fault-tolerance-test.yml`, `heal-test.yml` |
| [infra/tools/ansible-vm-preparing](https://gitlab.sarex.io/infra/tools/ansible-vm-preparing) ✅ | Подготовка VM перед Ansible/Kubespray (Python-обвязка, `uv`). README — шаблонный, назначение по коду |
| [infra/hardware](https://gitlab.sarex.io/infra/hardware) ◻️ | Учёт/конфигурация физического оборудования |
| [infra/astra-linux](https://gitlab.sarex.io/infra/astra-linux) ◻️ | Сборка/настройка образов Astra Linux для импортозамещённых контуров |
| [infra/intervpc-vpn-tunnel](https://gitlab.sarex.io/infra/intervpc-vpn-tunnel) ◻️ | VPN-туннель между VPC |
| [infra/cluster-maintenance](https://gitlab.sarex.io/infra/cluster-maintenance) ◻️ | Регламентные операции обслуживания кластеров |
---
## 4. Компонентные репозитории (`.helm/` + GitLab CI, ветка = контур)
Формат ниже: **компонент → репозиторий**. Столбец «в `iac`» показывает, есть ли одноимённый
компонент в этом монорепозитории (`infrastructure/<имя>`).
### 4.1 Сеть, Ingress, Service Mesh
| Компонент | Репозиторий | в `iac` |
|---|---|---|
| Istio (base/pilot/gateway) | [infra/istio](https://gitlab.sarex.io/infra/istio) `infra` | ✔ `istio-base`, `istio-pilot`, `istio-gateway` |
| Istio: Gateway/VirtualService/AuthPolicy/EnvoyFilter | [infra/istio-config](https://gitlab.sarex.io/infra/istio-config) ✅ ветки `stage`,`preprod`,`contour`,`infra`,`master` | ✔ `istio-config` |
| Istio для контура НН | [infra/istio-nn](https://gitlab.sarex.io/infra/istio-nn) ◻️ | — |
| cert-manager | [infra/cert-manager](https://gitlab.sarex.io/infra/cert-manager) ◻️ | ✔ `cert-manager` |
| nginx (ingress для Django) | [infra/ingress-nginx-django](https://gitlab.sarex.io/infra/ingress-nginx-django) ◻️ | — |
| nginx с Kerberos / hardened nginx | [infra/nginx-krb](https://gitlab.sarex.io/infra/nginx-krb), [infra/secure-nginx](https://gitlab.sarex.io/infra/secure-nginx) ◻️ | — |
### 4.2 Identity, доступ, безопасность
| Компонент | Репозиторий | в `iac` |
|---|---|---|
| Keycloak | [infra/keycloak](https://gitlab.sarex.io/infra/keycloak) ◻️ | ✔ `keycloak` |
| Zitadel | [infra/zitadel](https://gitlab.sarex.io/infra/zitadel) ◻️ | ✔ `zitadel` |
| Zitadel auth proxy | [infra/zitadel-auth-proxy](https://gitlab.sarex.io/infra/zitadel-auth-proxy) ◻️ | — |
| OpenLDAP | [infra/openldap](https://gitlab.sarex.io/infra/openldap) `contour` ◻️ | ✔ `openldap` |
| HashiCorp Vault | [infra/vault](https://gitlab.sarex.io/infra/vault) ✅ `contour` | ✔ `vault`, `vault-unseal` |
| SpiceDB (авторизация) | [infra/spicedb](https://gitlab.sarex.io/infra/spicedb) ◻️ | — |
| OAuth2-фасад / gatekeeper | [infra/oauth2-facade](https://gitlab.sarex.io/infra/oauth2-facade), [infra/gogatekeeper](https://gitlab.sarex.io/infra/gogatekeeper) ◻️ | — |
| Фильтрация JWKS | [infra/jwks-key-filter](https://gitlab.sarex.io/infra/jwks-key-filter) ◻️ | — |
| Django ↔ Keycloak (библиотека) | [infra/django-keycloak](https://gitlab.sarex.io/infra/django-keycloak) ✅ | — |
| Сканирование секретов / образов | [infra/gitleaks](https://gitlab.sarex.io/infra/gitleaks), [infra/clair](https://gitlab.sarex.io/infra/clair), [infra/sec/report](https://gitlab.sarex.io/infra/sec/report) ◻️ | — |
### 4.3 Данные и хранилища
| Компонент | Репозиторий | в `iac` |
|---|---|---|
| PostgreSQL | [infra/postgresql](https://gitlab.sarex.io/infra/postgresql) ветки `contour`,`contour-13`,`preprod`,`stronghold` ✅ | ✔ `postgresql` |
| PostgreSQL 16 (контур WB) | [infra/wb/postgresql16](https://gitlab.sarex.io/infra/wb/postgresql16) ◻️ | — |
| pg_partman / TimescaleDB / CockroachDB | [infra/postgres-pgpartman](https://gitlab.sarex.io/infra/postgres-pgpartman), [infra/timescaledb](https://gitlab.sarex.io/infra/timescaledb), [infra/cockroachdb](https://gitlab.sarex.io/infra/cockroachdb) ◻️ | — |
| Redis | [infra/redis](https://gitlab.sarex.io/infra/redis) ✅ `contour` | ✔ `redis` |
| MinIO (в k8s) | [infra/minio-standalone](https://gitlab.sarex.io/infra/minio-standalone) `contour` ◻️ | ✔ `minio` |
| ClickHouse (+оператор) | [infra/clickhouse](https://gitlab.sarex.io/infra/clickhouse), [infra/clickhouse-operator](https://gitlab.sarex.io/infra/clickhouse-operator) ◻️ | — |
| OpenSearch (+оператор) | [infra/opensearch](https://gitlab.sarex.io/infra/opensearch), [infra/opensearch-operator](https://gitlab.sarex.io/infra/opensearch-operator) ◻️ | — |
| S3-прокси | — (только в `iac`) | ✔ `s3-proxy` |
### 4.4 Брокеры и обмен сообщениями
| Компонент | Репозиторий | в `iac` |
|---|---|---|
| Kafka | [infra/kafka](https://gitlab.sarex.io/infra/kafka) ветки `stage`,`preprod`,`brusnika-*` ✅ | ✔ `kafka` |
| Kafka standalone (контур НН) | [infra/kafka-nn](https://gitlab.sarex.io/infra/kafka-nn) ◻️ | — |
| Strimzi/Kafka-оператор | [infra/kafka-operator](https://gitlab.sarex.io/infra/kafka-operator) ◻️ | — |
| Kafka exporter | [infra/kafka-exporter](https://gitlab.sarex.io/infra/kafka-exporter) ◻️ | ✔ `kafka-exporter` |
| Маршрутизация между Kafka-кластерами | [infra/kafka-router](https://gitlab.sarex.io/infra/kafka-router) ✅ | — |
| Kafka → Vector мост | [infra/kafka-vector-bridge](https://gitlab.sarex.io/infra/kafka-vector-bridge) ◻️ | — |
| RabbitMQ (+оператор, контур НН) | [infra/rabbitmq](https://gitlab.sarex.io/infra/rabbitmq), [infra/rabbitmq-cluster-operator](https://gitlab.sarex.io/infra/rabbitmq-cluster-operator), [infra/rabbitmq-nn](https://gitlab.sarex.io/infra/rabbitmq-nn) ◻️ | ✔ `rabbitmq` |
### 4.5 Наблюдаемость
| Компонент | Репозиторий | в `iac` |
|---|---|---|
| kube-prometheus-stack | [infra/kube-prometheus-stack](https://gitlab.sarex.io/infra/kube-prometheus-stack) ✅ `infra` | ✔ `prometheus-stack` |
| prometheus-stack (описан как «A complete monitoring stack for Kubernetes») | [infra/prometheus-stack](https://gitlab.sarex.io/infra/prometheus-stack) `stage` | ✔ `prometheus-stack` |
| Алерты и дашборды для Prometheus/Grafana | [infra/prometheus-stsack-resources](https://gitlab.sarex.io/infra/prometheus-stsack-resources) *(опечатка в имени — так в GitLab)* | — |
| VictoriaMetrics stack / cluster | [infra/vm-stack](https://gitlab.sarex.io/infra/vm-stack), [infra/vm-cluster](https://gitlab.sarex.io/infra/vm-cluster) ◻️ | ✔ `vmstack` |
| Экспортеры: node / postgres / blackbox | [infra/node-exporter](https://gitlab.sarex.io/infra/node-exporter), [infra/postgres-exporter](https://gitlab.sarex.io/infra/postgres-exporter), [infra/blackbox-exporter](https://gitlab.sarex.io/infra/blackbox-exporter) ◻️ | ✔ `postgres-exporter` |
| OpenObserve | [infra/openobserve](https://gitlab.sarex.io/infra/openobserve) ветка `contour/cps` ✅ | ✔ `openobserve` |
| Loki / SigNoz | [infra/loki](https://gitlab.sarex.io/infra/loki), [infra/signoz](https://gitlab.sarex.io/infra/signoz) ◻️ | — |
| Sentry / GlitchTip | [infra/sentry](https://gitlab.sarex.io/infra/sentry), [infra/glitchtip](https://gitlab.sarex.io/infra/glitchtip) `contour/cps` ◻️ | ✔ `glitchtip` |
| GoAlert (+ исходники, + Telegram-релей) | [infra/goalert](https://gitlab.sarex.io/infra/goalert), [infra/goalert-source](https://gitlab.sarex.io/infra/goalert-source), [infra/goalert-telegram-relay](https://gitlab.sarex.io/infra/goalert-telegram-relay) ◻️ | ✔ `goalert` |
| OpenTelemetry collector / operator | [infra/opentelemetry-collector](https://gitlab.sarex.io/infra/opentelemetry-collector), [infra/opentelemetry-operator](https://gitlab.sarex.io/infra/opentelemetry-operator) ◻️ | ✔ `opentelemetry-collector`, `opentelemetry-operator` |
| eBPF-экспортер OTel | [infra/otel-ebpf-exporter](https://gitlab.sarex.io/infra/otel-ebpf-exporter) ◻️ | — |
| Конвейер телеметрии: OTel → Kafka → ClickHouse | [infra/otel-kafka-processor](https://gitlab.sarex.io/infra/otel-kafka-processor), [infra/otel-kafka-clickhouse-worker](https://gitlab.sarex.io/infra/otel-kafka-clickhouse-worker) ◻️ | — |
| SDK-обвязки инструментирования | [infra/otel/django-otel-tools](https://gitlab.sarex.io/infra/otel/django-otel-tools), [infra/otel/fastapi-otel-tools](https://gitlab.sarex.io/infra/otel/fastapi-otel-tools), [infra/golang-fiber-otel-tools](https://gitlab.sarex.io/infra/golang-fiber-otel-tools), [infra/golang-net-http-otel-tools](https://gitlab.sarex.io/infra/golang-net-http-otel-tools), [infra/django-instrumented](https://gitlab.sarex.io/infra/django-instrumented), [infra/djano-autoinstrumentation](https://gitlab.sarex.io/infra/djano-autoinstrumentation) ◻️ | — |
| PMM, Trickster, отчёты по Prometheus | [infra/pmm](https://gitlab.sarex.io/infra/pmm), [infra/trickster](https://gitlab.sarex.io/infra/trickster), [infra/prometheus-report](https://gitlab.sarex.io/infra/prometheus-report) ◻️ | — |
| SIEM-шиппер (+UI) | [infra/siem-shiper](https://gitlab.sarex.io/infra/siem-shiper), [infra/siem-shiper-frontend](https://gitlab.sarex.io/infra/siem-shiper-frontend) ◻️ | — |
### 4.6 Платформа, аналитика, BPM
| Компонент | Репозиторий | в `iac` |
|---|---|---|
| Kubernetes Dashboard | [infra/dashboard](https://gitlab.sarex.io/infra/dashboard) ◻️ | ✔ `dashboard` |
| local-path-provisioner | [infra/local-path-provisioner-nn](https://gitlab.sarex.io/infra/local-path-provisioner-nn) ◻️ | ✔ `local-path-provisioner` |
| Camunda (+ модели процессов) | [infra/camunda](https://gitlab.sarex.io/infra/camunda) `camunda-prod`, [infra/camunda-processes](https://gitlab.sarex.io/infra/camunda-processes) ◻️ | ✔ `camunda` |
| Argo Workflows / Argo Events | [infra/argo-workflows](https://gitlab.sarex.io/infra/argo-workflows), [infra/argo-events](https://gitlab.sarex.io/infra/argo-events) ◻️ | ✔ `argo-workflows`, `argo-events` |
| Superset / Trino | [infra/superset](https://gitlab.sarex.io/infra/superset), [infra/trino](https://gitlab.sarex.io/infra/trino) ◻️ | ✔ `superset`, `trino` |
| Jupyter, BI-эксперименты, ETL, ГИС | [infra/jupyter-notebook](https://gitlab.sarex.io/infra/jupyter-notebook), [infra/bi-test](https://gitlab.sarex.io/infra/bi-test), [infra/etl](https://gitlab.sarex.io/infra/etl), [infra/sarex-gis](https://gitlab.sarex.io/infra/sarex-gis) ◻️ | — |
| Mailer | [infra/mailer](https://gitlab.sarex.io/infra/mailer) ◻️ | — |
### 4.7 CI/CD и Git-инфраструктура
| Компонент | Репозиторий |
|---|---|
| GitLab Runner | [infra/gitlab-runner](https://gitlab.sarex.io/infra/gitlab-runner) ✅ (`.helm` + CI) |
| Gitea (Git-зеркала для изолированных контуров) | [infra/gitea](https://gitlab.sarex.io/infra/gitea) ◻️ — см. §5, Flux в закрытых контурах читает `iac` именно из Gitea |
| ChartMuseum (реестр Helm-чартов) | [infra/chart-museum](https://gitlab.sarex.io/infra/chart-museum) ◻️ |
| Базовые Docker-образы | [infra/base-images](https://gitlab.sarex.io/infra/base-images) ◻️ |
| Миграция и утилиты GitLab | [infra/gitlab-migrator](https://gitlab.sarex.io/infra/gitlab-migrator), [infra/gitlab-tools](https://gitlab.sarex.io/infra/gitlab-tools) ◻️ |
### 4.8 Библиотеки чартов
| Репозиторий | Отвечает за |
|---|---|
| [infra/universal-helm-chart](https://gitlab.sarex.io/infra/universal-helm-chart) ✅ | Универсальный чарт (`.helm/`), на который ссылаются HelmRelease в `iac` (`openobserve`, `glitchtip``chart: universal-chart`) |
| [infra/common-charts](https://gitlab.sarex.io/infra/common-charts) ✅ | Общие чарты, сейчас — `universal-static-site` |
| [infra/helm-values-extractor](https://gitlab.sarex.io/infra/helm-values-extractor) ◻️ | Извлечение `values` из работающих релизов (ветка `draft-script`) |
| [infra/poc/itworksonmyhelm](https://gitlab.sarex.io/infra/poc/itworksonmyhelm), [infra/wb/helm-of-business](https://gitlab.sarex.io/infra/wb/helm-of-business) ◻️ | Эксперименты/контурные наборы чартов |
---
## 5. Что внутри `infra/iac`
### 5.1 Кластеры и откуда Flux их читает
Точка входа Flux — `clusters/<кластер>/`. Источник (`gotk-sync.yaml`) различается: кластеры в
периметре Yandex Cloud смотрят прямо в GitLab, изолированные контуры — в **зеркало Gitea**.
| Кластер | Git-источник Flux | Состав |
|---|---|---|
| `yc-infra-prod` | `gitlab.sarex.io/infra/iac` | argo-workflows, argo-events, postgresql, pg-sanitizer, vault, vault-unseal, yc-pg-dumper |
| `yc-k8s-test` | `gitlab.sarex.io/infra/iac` | `bootstrap-jobs`, состав задаётся в `kustomization.yaml` кластера |
| `yc-k8s-test-02` | `gitlab.sarex.io/infra/iac` | istio (base/pilot/gateway/config), dashboard, local-path-provisioner, minio, rabbitmq, kafka, redis, camunda, postgresql, zitadel, keycloak, vault |
| `yc-cps-prod` | `gitea.cloud.cps.sarex.lonsdaleites.ru/sarex/iac` | vault, istio, gitea-istio |
| `yc-ecp` | `gitea.invest.cps.sarex.lonsdaleites.ru/sarex/iac` | cert-manager, istio-config, dashboard, vault; apps: measurements, django, s3-proxy, s3-proxy-bim |
| `brusnika-prod` | `gitea.prod.brusnika.sarex.lonsdaleites.ru/sarex/iac` | istio, vault, zitadel, minio, openobserve, vmstack, otel operator/collector, goalert, экспортеры, failed-pod-cleanup |
| `brusnika-stage` | `gitea.stage.brusnika.sarex.lonsdaleites.ru/sarex/iac` | то же без minio |
| `wb` | `gitea-srx.wb.ru/sarex/iac` | istio-config, openobserve, vmstack, otel, goalert, экспортеры, superset, trino |
| `d8-ugmk-prod` | `10.222.255.165:3000/infra/iac` (Gitea) | только `istio-ingress` |
| `contour` | — (шаблон: `apps.yaml`, `infrastructure.yaml`, `helm-repositories.yaml`) | эталонная точка входа из README |
### 5.2 `infrastructure/` — 36 компонентов
`argo-events` · `argo-workflows` · `camunda` · `cert-manager` · `dashboard` · `example-infra` ·
`failed-pod-cleanup` · `glitchtip` · `goalert` · `istio-base` · `istio-config` · `istio-gateway` ·
`istio-pilot` · `kafka` · `kafka-exporter` · `keycloak` · `local-path-provisioner` · `minio` ·
`openldap` · `openobserve` · `opentelemetry-collector` · `opentelemetry-operator` · `pg-sanitizer` ·
`postgres-exporter` · `postgresql` · `prometheus-stack` · `rabbitmq` · `redis` · `s3-proxy` ·
`superset` · `trino` · `vault` · `vault-unseal` · `vmstack` · `yc-pg-dumper` · `zitadel`
Структура компонента: `base/` (namespace + HelmRelease/манифесты) + `patches/` + `kustomization.yaml`.
### 5.3 `apps/` — 37 прикладных сервисов
> ⚠️ `apps/`**только манифесты деплоя**. Исходный код сервисов живёт в других группах GitLab
> (`platform`, `pdm`, `proc`, `planning`, `aero`, `generic`) — полная карта в **[§5.3.8](#538-где-лежит-код-приложений)**.
> Образы приезжают из одного реестра: `cr.yandex/crp3ccidau046kdj8g9q/<сервис>:<тег>`.
#### 5.3.1 Единый шаблон приложения
```
apps/<app>/
├── base/ # общий для всех кластеров слой
│ ├── namespace.yaml # namespace = имя приложения
│ ├── <компонент>.yaml # HelmRelease на universal-chart (по одному на процесс)
│ └── kustomization.yaml
├── <кластер>/ # оверлей: brusnika-prod | brusnika-stage | d8-ugmk-prod |
│ └── kustomization.yaml # yc-ecp | yc-k8s-test | dsinv
├── .env.example # ─┐
├── CONFIGURATION.md # │ «паспорт сервиса» — документация рядом с деплоем
├── ENDPOINTS.md # │
└── openapi.yaml # ─┘
```
Каждый процесс сервиса — отдельный `HelmRelease` на **общем чарте**:
```yaml
chart: universal-chart # версия 0.1.9 (у 6 приложений осталась 0.1.7)
sourceRef: HelmRepository/yc-oci-charts # OCI-реестр cr.yandex, ns flux-system
values:
global: { env: _default } # ключ окружения
services:
backend:
image: { name: { _default: cr.yandex/…/bim-api:contour_f9f2a39-dirty } }
deployment: { replicaCount: {_default: 1}, port: {_default: 8000}, probes: … }
service: { name: {_default: backend-svc}, port: {_default: 80} }
imagePullSecrets: { name: { _default: regcred } }
envs: [ … ]
podAnnotations: { _default: { vault.hashicorp.com/*: … } }
```
Особенности, общие почти для всех приложений:
- **все значения обёрнуты в `_default`** — механизм пер-окруженческих переопределений
`universal-chart` (`global.env` выбирает ключ);
- **секреты не хранятся в git** — их подставляет **Vault Agent Injector** через
`podAnnotations` (§5.3.5);
- `traffic.sidecar.istio.io/excludeOutboundPorts: "8200"` — обращение к Vault мимо sidecar Istio;
- поля `commitSha`/`gitlabUri`/`gitlabJobUrl`/`owner` в базовом слое пустые — заполняются CI.
**Исключения:** `resources` и `subscriptions` описаны голыми `Deployment`+`Service`+`ServiceAccount`
без `HelmRelease`; у `ams-sync` и `control-interface` в `base/` нет `Namespace`.
#### 5.3.2 Состав приложений
Обозначения кластеров: **B** `brusnika-prod` · **S** `brusnika-stage` · **U** `d8-ugmk-prod` ·
**E** `yc-ecp` · **T** `yc-k8s-test`. Код в скобках — **оверлей есть, но кластер его не подключает**.
| Приложение | ns | Компоненты (HelmRelease) | Образы `…/crp3ccidau046kdj8g9q/` | Кластеры |
|---|---|---|---|---|
| `ams-sync` | — | `ams-sync` | `ams-sync` | S |
| `attachments` | `attachments` | `attachments` | `att9` | (B) S U T |
| `auth-flow` | `auth-flow` | `frontend` | `auth-flow-frontend` | (B) S U T |
| `bim` | `bim` | `backend` | `bim-api` | B S U T |
| `cde` | `cde` | **13**: `cde` + `cde-splitpdf`, `cde-flowscallback`, `cde-worker-{alert,copy,copyv2,create-versions,create-versionsv2,markings,markingsv2,sign,signv2,update-bundles}` | `cde`, `orchestrator`, 11 × `*-worker` | (B) (S) U T |
| `checklists` | `checklists` | `checklists` | `checklists-backend` | B S U T |
| `comparisons` | `comparisons` | `backend`, `frontend` + 2 ConfigMap | `comparisons_backend_prod`, `comparisons-frontend` | (B) (S) U T |
| `contracts` | `contracts` | `contracts` | `contracts` | B S U T |
| `control-interface` | — | `frontend` | `srx-admin` | B S U T |
| `cross-section` | `cross-section` | `cross-section-static` | `cross-section-app` | (B) (S) U T |
| `django` | `django` | `backend`, `celery`, `frontend`, `srx-admin-frontend`, `s3-proxy` + Deployment/Service `redis` + ConfigMap `django`/`nginx`/`uwsgi`/`zitadel` | `backend`, `sarex-frontend-dev`, `srx-admin`, `s3-proxy`, `redis` | B S U **E** T |
| `document-link` | `document-link` | `frontend` | `document-link-frontend` | B S U (T) |
| `documentations` | `documentations` | `documentations-api`, `-filestream`, `-hasher`, `-pdf-markings-amqp`, `pdm-api`, `frontend` + Deployment `redis` | `documentations`, `documentations-api-files`, `hasher`, `pdf-markings-amqp`, `pdmv2`, `documentation-frontend-app`, `redis` | B S U T |
| `drawings` | `drawings` | `backend` | `drawings-api` | B S U T |
| `eav` | `eav` | `backend` + ConfigMap | `eav` | B S U T |
| `faas` | `faas` | `export-reviews` | `export-reviews` | (B) (S) U T |
| `flows` | `flows` | `backend`, `celery`, `frontend` | `flows-backend`, `flows-backend_worker`, `flows-frontend` | B S U T |
| `iam` | `iam` | `iam-backend` + ConfigMap | `iams` | (B) S U (T) |
| `inspections` | `inspections` | `backend` | `sarex-inspections`, `notification:email` | B (S) U T |
| `issues` | `issues` | `backend`, `celery`, `frontend` + Deployment/Service `redis` + ConfigMap | `issues`, `contour_issues-frontend`, `redis` | B S U T |
| `mapper` | `mapper` | `backend` | `mapper` | B S U T |
| `measurements` | `measurements` | `measurements` | `measurements` | B S U **E** T |
| `message-hub` | `message-hub` | `message-hub` | `message-hub` | B S U T |
| `notes` | `notes` | `backend`, `frontend` + ConfigMap | `notes-backend`, `notes-frontend` | B S U T |
| `pm` | `pm` | `backend`, `celery`, `frontend`, `resources-static` + ConfigMap | `pm-backend`, `pm-frontend`, `resources-frontend` | B S U T |
| `prescriptions` | `prescriptions` | `frontend` | `prescriptions-frontend` | (B) (S) U T |
| `processing` | `processing` | `workflows-api`, `engine`, `engine-low`, `frontend` + Role/RoleBinding | `workflows-api_prod`, `workflows-engine`, `workflows-endigne_prod`, `workflows-frontend` | B S U T |
| `projects` | `projects` | `frontend` | `project-frontend-app` | (B) S U T |
| `remarks` | `remarks` | `frontend` | `remarks-frontend` | B S U T |
| `resources` | `resources` | — *(Deployment + Service + SA + 2 ConfigMap)* | `sarex-resources` | B S T |
| `reviews` | `reviews` | `frontend` | `reviews-frontend` | B S U T |
| `rfi` | `rfi` | `backend`, `celery`, `frontend` | `rfi-backend`, `rfi-frontend` | B S U T |
| `stamp-verification` | `stamp-verification` | `frontend` | `stamp-verification-frontend` | U T |
| `subscriptions` | `subscriptions` | — *(Deployment + Service + SA)* | `subscriptions` | B S U T |
| `system-log` | `system-log` | `api`, `worker` | `system-log_prod`, `system-log-worker_prod` | B S U T |
| `transmittal` | `transmittal` | `backend`, `frontend`, `worker` | `transmittal-api`, `transmittal-frontend` | B S U T |
| `workspaces` | `workspaces` | `backend`, `frontend` | `workspaces`, `workspaces-v2-frontend` | B S U T |
**Как читать состав.** Типовой backend-сервис = `backend` (API) + `celery`/`worker` (асинхронные
задачи) + `frontend` (статика). Девять приложений — **чисто фронтендовые**: `auth-flow`,
`control-interface`, `cross-section`, `document-link`, `prescriptions`, `projects`, `remarks`,
`reviews`, `stamp-verification`. Самое крупное — `cde` (13 релизов: оркестратор + 11 воркеров
по типам операций над документами).
#### 5.3.3 Где приложения реально разворачиваются
| Кластер | Приложений подключено | Комментарий |
|---|---|---|
| `d8-ugmk-prod` | **35** | самый полный контур |
| `yc-k8s-test` | **34** | тестовый, близок к полному |
| `brusnika-stage` | **30** | |
| `brusnika-prod` | **26** | |
| `yc-ecp` | **2** | только `django` и `measurements` |
| `wb`, `yc-cps-prod`, `yc-infra-prod`, `yc-k8s-test-02`, `contour` | **0** | приложений из `apps/` не деплоят: эти кластеры несут только `infrastructure/` |
**Мёртвые и неподключённые оверлеи** — каталог существует, но ни один
`clusters/*/kustomization.yaml` на него не ссылается, то есть Flux его не применяет:
| Кластер | Неподключённые оверлеи |
|---|---|
| `brusnika-prod` | `attachments`, `auth-flow`, `cde`, `comparisons`, `cross-section`, `faas`, `iam`, `prescriptions`, `projects` |
| `brusnika-stage` | `cde`, `comparisons`, `cross-section`, `faas`, `inspections`, `prescriptions` |
| `yc-k8s-test` | `document-link`, `iam` |
Отдельно **`dsinv/`** — оверлей у **25 приложений**, но **кластера `clusters/dsinv/` не существует**
и никто на него не ссылается. Судя по содержимому (готовые `Deployment` с `SERVICE_URL=https://srx.wb.ru`)
и по каталогу `snapshots/dsinv/`, это **материализованный снимок живого контура WB**, а не рабочий
оверлей. Использовать как справочник «что реально крутится», не как источник деплоя.
#### 5.3.4 Две несовместимые конвенции оверлеев ⚠️
| Кластер | Как устроен оверлей | Приложений |
|---|---|---|
| `d8-ugmk-prod`, `yc-k8s-test`, `dsinv` | ✅ **наследует `base`**: `resources: [../base]` + `patches:` | 35 / 36 / 25 |
| `brusnika-prod`, `brusnika-stage`, `yc-ecp` | ⚠️ **самостоятельный**: `base` не подключается, `HelmRelease` скопирован целиком | 35 / 36 / 2 |
Последствие — **тихий дрейф**. Пример: `apps/bim/base/backend.yaml` использует
`universal-chart` **0.1.9**, а его полная копия `apps/bim/brusnika-prod/backend.yaml`**0.1.7**.
Правка в `base/` до контуров Брусники не доедет, и никакой ошибки при этом не возникнет.
Это же объясняет разнобой версий чарта: 0.1.7 остался у `ams-sync`, `auth-flow`,
`control-interface`, `cross-section`, `remarks`, `reviews`.
#### 5.3.5 Секреты: Vault Agent Injector
Пароли БД в git не лежат. Под получает их файлом от sidecar-инжектора Vault:
```yaml
vault.hashicorp.com/agent-inject: "true"
vault.hashicorp.com/agent-init-first: "true"
vault.hashicorp.com/agent-pre-populate-only: "true" # только init-контейнер, без постоянного sidecar
vault.hashicorp.com/auth-path: auth/kubernetes
vault.hashicorp.com/role: bim # роль = имя приложения
vault.hashicorp.com/agent-inject-secret-bim-postgresql: secrets/data/apps/bim/postgres
vault.hashicorp.com/agent-inject-template-bim-postgresql: |- # → env-файл
POSTGRES_ADDRESS={{ index .Data.data "host" }} …
```
Дальше контейнер стартует как `sh -ec 'set -a; . /vault/secrets/<name>; set +a; exec ./httpserver'`.
**Соглашение о путях:** `secrets/data/apps/<приложение>/postgres`; нестандартные —
`documentations/hasher/{rabbitmq,s3}`, `documentations/marks-s3`.
Соответствующие ServiceAccount называются `<app>-vault`.
Vault используют **26 приложений**. Больше всего инъекций — у `cde` (13), `documentations` (5),
`django` и `processing` (по 3). **Не используют** ровно те, у кого нет БД: девять фронтендов
(§5.3.2) плюс `ams-sync` и `faas`.
> Сами БД, пользователи и бакеты, на которые ссылаются эти пути, создаются не здесь,
> а в [infra/terraform](https://gitlab.sarex.io/infra/terraform) (`infrastructure.yaml`).
#### 5.3.6 Документация рядом с манифестами
Нетипичная и полезная особенность: в каталоге приложения лежит его «паспорт».
| Файл | Что внутри | Покрытие |
|---|---|---|
| `CONFIGURATION.md` | все переменные окружения, как они разбираются в коде, и **откуда берутся при каждом способе запуска** (локально / docker-compose / Helm в репозитории приложения / IaC+Vault / GitLab CI); команды и точки входа процессов | 32 / 37 |
| `ENDPOINTS.md` | **исходящие** HTTP-вызовы сервиса: библиотека клиента, таймауты, ретраи, проброс JWT, базовые хосты по окружениям, таблица методов и путей | 28 / 37 |
| `openapi.yaml` | **входящие** эндпоинты — спецификация того, что сервис предоставляет (от 9 КБ у `mapper` до 101 КБ у `issues`) | 25 / 37 |
| `.env.example` | образец переменных с комментариями | 32 / 37 |
Многокомпонентные приложения используют префиксы вместо одного файла: у `documentations`
`api.*`, `api-v2.*`, `pdm.*`, `frontend.*`, `dps-message-hub.*`; у `processing`
`workflows-api.*`, `workflows-engine.*`, `workflows-frontend.*`; у `workspaces`
`ENDPOINTS-workspaces-frontend.md` и `ENDPOINTS-workspace-v2-frontend.md`.
**Пробелы в документации:**
- нет `CONFIGURATION.md`: `control-interface`, `cross-section`, `faas`, `remarks`, `reviews`;
- нет `ENDPOINTS.md`: `attachments`, `checklists`, `drawings`, `eav`, `faas`, `measurements`,
`resources`, `subscriptions`, `system-log`;
- нет диаграммы в `docs/apps/`: `ams-sync`, `auth-flow`, `iam` *(остальные 34 покрыты)*.
Дополняющий слой — [`docs/apps/`](./docs/apps/README.md): по mermaid-диаграмме на сервис
с его зависимостями, сгруппированные по доменам — Платформа/Core, Управление проектом,
Документы/CDE, Контроль качества, Полевые данные.
#### 5.3.7 Внешние маршруты
Правила Istio живут не в `apps/`, а в `infrastructure/istio-config/<кластер>` и в патчах кластеров.
Пример готовой карты маршрутов (`yc-ecp`):
| Путь | Сервис назначения |
|---|---|
| `/api`, `/admin/` | `backend-service.django` |
| `/media/` | `s3-service.django` |
| `/s3/` | `s3-bim-service.django` |
| `/eav/api/`, `/eav/admin/` | `eav-service.eav` |
| `/bim-gazpromcps/{api,files}/` | `bim-api-gazpromcps-service.bim` |
| `/bim2-gazpromcps/api/` | `bim-backend-v2-service.bim` |
| `/workflows/api/` | `workflows-backend-service.processing` |
| `/projects/static/` | `projects-frontend-static-service.projects` |
В контурах Брусники и WB прикладной трафик уходит одним правилом на
`nginx-service.global-ingress` — пути до конкретных сервисов раскрываются уже там, **вне этого
репозитория**. Через Istio там опубликованы только платформенные UI (Gitea, GoAlert, OpenObserve,
Superset, Kubernetes Dashboard, Camunda, Jupyter).
#### 5.3.8 Где лежит код приложений
Исходники продуктовых сервисов — **вне группы `infra`**: 14 групп верхнего уровня, ~393 проекта.
Ориентир по владению:
| Группа | Домен | Что оттуда деплоится из `apps/` |
|---|---|---|
| [`platform`](https://gitlab.sarex.io/groups/platform) (95) | платформенное ядро, BIM, workflows, tracking | `bim`, `iam`, `mapper`, `contracts`, `eav`, `system-log`, `processing`, `control-interface`, `resources`, `ams-sync`, `auth-flow`, `cde` |
| [`pdm`](https://gitlab.sarex.io/groups/pdm) (41) | документооборот, CDE, PDF | `documentations`, `attachments`, `transmittal`, `workspaces`, `document-link`, `stamp-verification`, `subscriptions`, `comparisons` |
| [`proc`](https://gitlab.sarex.io/groups/proc) (24) | процессы и контроль качества | `inspections`, `issues`, `rfi`, `reviews`, `checklists`, `flows`, `remarks`, `prescriptions`, `faas` |
| [`planning`](https://gitlab.sarex.io/groups/planning) (10) | планирование | `pm`, `projects`, `message-hub` |
| [`aero`](https://gitlab.sarex.io/groups/aero) (50) | гео, полевые данные, обработка съёмки | `measurements`, `drawings`, `notes`, `cross-section` |
| [`generic`](https://gitlab.sarex.io/groups/generic) (56) | сквозное: монолит, CI-шаблоны, утилиты | `django` |
| [`algorithms`](https://gitlab.sarex.io/groups/algorithms) (82), [`render`](https://gitlab.sarex.io/groups/render) (16) | вычислительные библиотеки, конвертеры, рендер | напрямую не деплоятся — используются джобами и воркерами |
| `ai`, `marketing`, `hackathon`, `product`, `algorithms1`, `planning1` | прочее / архив | — |
**Карта «приложение → репозитории с кодом».** Ключ сопоставления — имя образа
`cr.yandex/crp3ccidau046kdj8g9q/<name>` и заголовок `CONFIGURATION.md` / `ENDPOINTS.md`.
| `apps/` | Компонент (образ) | Репозиторий с кодом |
|---|---|---|
| `ams-sync` | `ams-sync` | [platform/ams-sync](https://gitlab.sarex.io/platform/ams-sync) ✅ *(смежный: [platform/ams](https://gitlab.sarex.io/platform/ams))* |
| `attachments` | `att9` / `attachments` | [pdm/attachments](https://gitlab.sarex.io/pdm/attachments) ✅ |
| `auth-flow` | `auth-flow-frontend` | [platform/auth-flow-frontend](https://gitlab.sarex.io/platform/auth-flow-frontend) ✅ |
| `bim` | `bim-backend-v2` | [platform/bim-backend-v2](https://gitlab.sarex.io/platform/bim-backend-v2) ✅ |
| | `bim-api` (legacy) | [platform/bim](https://gitlab.sarex.io/platform/bim) ◻️ — репозитория с именем `bim-api` нет, привязка по смыслу |
| `cde` | `cde`, `orchestrator`, 11 × `*-worker` | [platform/cde-orchestration-demo](https://gitlab.sarex.io/platform/cde-orchestration-demo) ✅ |
| | смежные | [pdm/cde-api](https://gitlab.sarex.io/pdm/cde-api), [generic/cde-v2-write-service](https://gitlab.sarex.io/generic/cde-v2-write-service), [generic/level-cde-migration](https://gitlab.sarex.io/generic/level-cde-migration) |
| `checklists` | `checklists-backend` | [proc/checklists-backend](https://gitlab.sarex.io/proc/checklists-backend) ✅ |
| `comparisons` | `comparisons-backend` | [pdm/comparisons-backend](https://gitlab.sarex.io/pdm/comparisons-backend) ✅, v2 → [pdm/comparisons-api-v2](https://gitlab.sarex.io/pdm/comparisons-api-v2) |
| | `comparisons-frontend` | [platform/comparisons-frontend](https://gitlab.sarex.io/platform/comparisons-frontend) ✅ |
| | движок сравнения | [platform/comparator](https://gitlab.sarex.io/platform/comparator), [algorithms/comparator-algorithms](https://gitlab.sarex.io/algorithms/comparator-algorithms), [render/comparator-bins](https://gitlab.sarex.io/render/comparator-bins), [algorithms/diff-pdf-algorithm](https://gitlab.sarex.io/algorithms/diff-pdf-algorithm) |
| `contracts` | `contracts` | [platform/contracts](https://gitlab.sarex.io/platform/contracts) ✅ + [platform/contracts-frontend](https://gitlab.sarex.io/platform/contracts-frontend) ✅ |
| `control-interface` | `srx-admin` | [platform/srx-admin](https://gitlab.sarex.io/platform/srx-admin) ✅ |
| `cross-section` | `cross-section-app` | [aero/cross-section](https://gitlab.sarex.io/aero/cross-section) ✅ *(джоба: [aero/cross-secttions-to-dwg-job](https://gitlab.sarex.io/aero/cross-secttions-to-dwg-job))* |
| `django` | `backend` | [generic/sarex-backend](https://gitlab.sarex.io/generic/sarex-backend) ✅ |
| | `sarex-frontend-dev` | [generic/sarex-frontend](https://gitlab.sarex.io/generic/sarex-frontend) ✅ |
| | `s3-proxy` | [generic/s3-proxy](https://gitlab.sarex.io/generic/s3-proxy) ✅ |
| | `srx-admin` | [platform/srx-admin](https://gitlab.sarex.io/platform/srx-admin) ✅ |
| `document-link` | `document-link-frontend` | [pdm/document-link-frontend](https://gitlab.sarex.io/pdm/document-link-frontend) ✅ |
| `documentations` | `documentations` | [pdm/documentation-api](https://gitlab.sarex.io/pdm/documentation-api) ✅ |
| | `documentations-api-files` (v2) | [pdm/documentation-api-v2](https://gitlab.sarex.io/pdm/documentation-api-v2) ✅ |
| | `hasher` | [pdm/documentation-hasher](https://gitlab.sarex.io/pdm/documentation-hasher) ✅ |
| | `pdf-markings-amqp` | [pdm/pdf-markings](https://gitlab.sarex.io/pdm/pdf-markings) ✅ |
| | `pdmv2` | [pdm/pdm](https://gitlab.sarex.io/pdm/pdm) ✅ |
| | `documentation-frontend-app` | [pdm/documentation-frontend](https://gitlab.sarex.io/pdm/documentation-frontend) ✅ |
| | `dps-message-hub` | [pdm/dps_message_hub](https://gitlab.sarex.io/pdm/dps_message_hub) ✅ |
| `drawings` | `drawings-api` | [aero/drawings-api](https://gitlab.sarex.io/aero/drawings-api) ✅ |
| `eav` | `eav` | [platform/eav_python](https://gitlab.sarex.io/platform/eav_python) ✅ *(gRPC-ветка: [platform/eav](https://gitlab.sarex.io/platform/eav))* |
| `faas` | `export-reviews` | [proc/export-reviews](https://gitlab.sarex.io/proc/export-reviews) ✅ *(в GitLab называется `flows-export`)* |
| `flows` | `flows-backend`, `flows-backend_worker` | [proc/flows-backend](https://gitlab.sarex.io/proc/flows-backend) ✅ |
| | `flows-frontend` | [proc/flows-frontend](https://gitlab.sarex.io/proc/flows-frontend) ✅ |
| `iam` | `iams` | [platform/iams-v2](https://gitlab.sarex.io/platform/iams-v2) ✅ *(смежный: [platform/srx-rebac](https://gitlab.sarex.io/platform/srx-rebac))* |
| `inspections` | `sarex-inspections` | [proc/inspections-backend](https://gitlab.sarex.io/proc/inspections-backend) ✅ — подтверждено аннотацией `gitlab-uri` |
| | фронтенд | [proc/inspections-frontend](https://gitlab.sarex.io/proc/inspections-frontend) ✅ |
| | `notification:email` | [generic/jobs/email-notification-task](https://gitlab.sarex.io/generic/jobs/email-notification-task) ✅ |
| `issues` | `issues` | [proc/issues-backend](https://gitlab.sarex.io/proc/issues-backend) ✅ |
| | `contour_issues-frontend` | [proc/issues-frontend](https://gitlab.sarex.io/proc/issues-frontend) ✅ |
| | `crop-issue-pin-area` | [proc/crop-issue-pin-area-task](https://gitlab.sarex.io/proc/crop-issue-pin-area-task) ✅ |
| | `docx-to-pdf`, `rendering-template` | [pdm/docx-to-pdf](https://gitlab.sarex.io/pdm/docx-to-pdf), [pdm/rendering-template](https://gitlab.sarex.io/pdm/rendering-template) ✅ |
| | `webhook-caller` | [platform/webhook-caller](https://gitlab.sarex.io/platform/webhook-caller) ✅ |
| `mapper` | `mapper` | [platform/mapper](https://gitlab.sarex.io/platform/mapper) ✅ |
| `measurements` | `measurements` | [aero/measurements](https://gitlab.sarex.io/aero/measurements) ✅ |
| `message-hub` | `message-hub` | [planning/message-hub](https://gitlab.sarex.io/planning/message-hub) ✅ |
| `notes` | `notes-backend` / `notes-frontend` | [aero/notes-backend](https://gitlab.sarex.io/aero/notes-backend), [aero/notes-frontend](https://gitlab.sarex.io/aero/notes-frontend) ✅ |
| `pm` | `pm-backend` / `pm-frontend` | [planning/pm-backend](https://gitlab.sarex.io/planning/pm-backend), [planning/pm-frontend](https://gitlab.sarex.io/planning/pm-frontend) ✅ |
| | `resources-frontend` | [planning/resources-frontend](https://gitlab.sarex.io/planning/resources-frontend) ✅ |
| `prescriptions` | `prescriptions-frontend` | [proc/prescriptions-frontend](https://gitlab.sarex.io/proc/prescriptions-frontend) ✅ |
| `processing` | `workflows-api` | [platform/workflows-api](https://gitlab.sarex.io/platform/workflows-api) ✅ |
| | `workflows-engine`, `kubernetes-engine` | [platform/workflows-engine](https://gitlab.sarex.io/platform/workflows-engine) ✅ |
| | `workflows-frontend` | [platform/workflows-frontend](https://gitlab.sarex.io/platform/workflows-frontend) ✅ |
| | смежные | [platform/workflows-backend](https://gitlab.sarex.io/platform/workflows-backend), [generic/workflows-tools](https://gitlab.sarex.io/generic/workflows-tools), [generic/processing/job_template](https://gitlab.sarex.io/generic/processing/job_template) |
| `projects` | `project-frontend-app` / `projects-frontend` | [planning/projects-frontend](https://gitlab.sarex.io/planning/projects-frontend) ✅ *(API: [planning/projects-backend](https://gitlab.sarex.io/planning/projects-backend))* |
| `remarks` | `remarks-frontend` | [proc/remarks-frontend](https://gitlab.sarex.io/proc/remarks-frontend) ✅ |
| | `remarks-api`, `export-remarks` | ⚠️ [proc/remarks-api](https://gitlab.sarex.io/proc/remarks-api), [proc/export-remarks](https://gitlab.sarex.io/proc/export-remarks) — **помечены `_archived_`** в GitLab, но образы ещё встречаются в манифестах |
| `resources` | `sarex-resources` | [platform/sarex-resources](https://gitlab.sarex.io/platform/sarex-resources) ✅ *(старая копия: [generic/sarex-resources1](https://gitlab.sarex.io/generic/sarex-resources1))* |
| `reviews` | `reviews-frontend` | [proc/reviews-frontend](https://gitlab.sarex.io/proc/reviews-frontend) ✅ |
| `rfi` | `rfi-backend` / `rfi-frontend` | [proc/rfi-backend](https://gitlab.sarex.io/proc/rfi-backend), [proc/rfi-frontend](https://gitlab.sarex.io/proc/rfi-frontend) ✅ |
| `stamp-verification` | `stamp-verification-frontend` | [pdm/stamp-verification-frontend](https://gitlab.sarex.io/pdm/stamp-verification-frontend) ✅ |
| `subscriptions` | `subscriptions` / `sarex-subscriptions` | [pdm/sarex-subscriptions](https://gitlab.sarex.io/pdm/sarex-subscriptions) ✅ |
| `system-log` | `system-log` / `system-log-worker` | [platform/system-log](https://gitlab.sarex.io/platform/system-log), [platform/system-log-worker](https://gitlab.sarex.io/platform/system-log-worker) ✅ |
| `transmittal` | `transmittal-api` / `transmittal-frontend` | [pdm/transmittal-api](https://gitlab.sarex.io/pdm/transmittal-api), [pdm/transmittal-frontend](https://gitlab.sarex.io/pdm/transmittal-frontend) ✅ |
| `workspaces` | `workspaces` | [pdm/workspaces-api](https://gitlab.sarex.io/pdm/workspaces-api) ✅ |
| | `workspaces-frontend-static` | [platform/workspaces-frontend](https://gitlab.sarex.io/platform/workspaces-frontend) ✅ |
| | `workspaces-v2-frontend` | [platform/workspace-v2-frontend](https://gitlab.sarex.io/platform/workspace-v2-frontend) ✅ |
**Как искать самому, если компонента нет в таблице.** Порядок надёжности:
1. Взять имя образа из `apps/<app>/base/*.yaml``cr.yandex/crp3ccidau046kdj8g9q/**<name>**:tag`.
В большинстве случаев `<name>` = `path` репозитория.
2. Открыть `apps/<app>/CONFIGURATION.md` — в первой строке стоит **настоящее имя проекта**
(например `apps/eav` → «Конфигурация проекта eav-python» → `platform/eav_python`).
3. Искать по GitLab: `scope: projects`, термин ≥ 3 символов, матч идёт по `path_with_namespace`
поэтому запрос по имени группы (`proc`, `pdm`, `planning`) выдаёт всю группу целиком.
4. Если сервис уже работает в кластере — у его `Deployment` есть аннотации
`gitlab-uri` и `gitlab-job`, проставляемые CI, с прямой ссылкой на репозиторий и джобу сборки.
⚠️ Имя образа **не всегда** совпадает с репозиторием: `att9``pdm/attachments`,
`iams``platform/iams-v2`, `pdmv2``pdm/pdm`, `export-reviews``proc/export-reviews`
(в GitLab отображается как `flows-export`), `sarex-inspections``proc/inspections-backend`.
Суффиксы `_prod`, `contour_`, `-dev` в имени образа — артефакты веток CI, не часть имени проекта.
Общий CI-конвейер для всех этих репозиториев —
[generic/common-ci](https://gitlab.sarex.io/generic/common-ci) (подключается в `.gitlab-ci.yml`
каждого сервиса), базовый образ — [generic/base-image](https://gitlab.sarex.io/generic/base-image).
### 5.4 Вспомогательное в репозитории
| Путь | Назначение |
|---|---|
| `inventory.yaml` | Сгенерированный инвентарь prod: namespace → тип ресурса → имена (ConfigMap/Secret/Deployment/Service/EnvoyFilter) |
| `snapshots/dsinv/` | Снимки живых манифестов (в `.gitignore`, локальный артефакт) |
| `docs/apps/` | Диаграмма и описание по каждому бизнес-сервису |
| `gitea-data/` | Локальные данные Gitea — рабочий артефакт, **не коммитить** |
---
## 6. Перекрытия и как выбирать источник истины
Для ~20 компонентов существуют оба источника — каталог в `infra/iac` и отдельный репозиторий.
Наблюдаемое правило (по факту содержимого, **стоит подтвердить с владельцами**):
| Ситуация | Источник истины |
|---|---|
| Кластер перечислен в §5.1 (`yc-*`, `brusnika-*`, `wb`, `d8-ugmk-prod`) | **`infra/iac`**, ветка `master`. Правки в отдельном репозитории туда не доедут |
| Контур деплоится GitLab CI (ветки `stage`, `preprod`, `contour`, `infra`, `contour/cps`, `stronghold`) | **Отдельный репозиторий компонента**, ветка = имя контура |
| Контур ГПН | **`infra/iac-gpn`** (ArgoCD), не Flux |
| Namespace, БД, S3-бакет, Kafka-топик, пользователь, k8s-секрет | **`infra/terraform`** (`infrastructure.yaml`) — не создавать вручную и не дублировать в Flux |
| Изолированный контур без доступа к GitLab | `infra/iac` → зеркало **Gitea** → Flux. Пуш в GitLab обязателен, но недостаточен: нужно, чтобы зеркало обновилось |
Особые случаи:
- **`prometheus-stack` vs `kube-prometheus-stack`** — два разных репозитория с пересекающейся зоной;
в `iac` компонент один (`prometheus-stack`). Требует ревизии.
- **`terraform` vs `terraform-contour-mirror`** — README идентичны, `mirror` живёт только в ветке
`contour` и активен (2026-08-04). Расхождение между ними — реальный риск дрейфа.
- **`istio-config`** — самый «многоконтурный» репозиторий (7 веток) и одновременно компонент в `iac`.
- **`poc/iac`** — архив; не путать с `infra/iac`.
---
## 7. Эксплуатация, аудит и данные
| Репозиторий | Отвечает за |
|---|---|
| [infra/k8s-changelog](https://gitlab.sarex.io/infra/k8s-changelog) ✅ | Ежедневный снимок всех манифестов кластера в стабильную файловую структуру и коммит в git — **читаемый diff состояния кластера** для аудита и восстановления. Чистит `status`, `managedFields`, значения секретов |
| [infra/harvester](https://gitlab.sarex.io/infra/harvester) ✅ | **Резервное копирование данных платформы Sarex** (документация, планирование, замечания, рабочие процессы). Kafka-download/sync приложения, манифесты, mkdocs |
| [infra/scripts/extract-kuberntes-manifests-to-s3](https://gitlab.sarex.io/infra/scripts/extract-kuberntes-manifests-to-s3) ◻️ | Выгрузка манифестов кластера в S3 |
| [infra/yc-pg-dumper](https://gitlab.sarex.io/infra/yc-pg-dumper) ◻️ (+ компонент `infrastructure/yc-pg-dumper`) | Дампы PostgreSQL в Yandex Cloud |
| [infra/backups/*](https://gitlab.sarex.io/infra/backups) ◻️ | `frontend`, `workers`, `sendbox`, `collect-pdm-data-from-postgresql` — подсистема бэкапов |
| [infra/postgresql-ddl-extractor](https://gitlab.sarex.io/infra/postgresql-ddl-extractor) ◻️ | Извлечение DDL из PostgreSQL |
| [infra/k8s-hustler](https://gitlab.sarex.io/infra/k8s-hustler), [infra/revisor](https://gitlab.sarex.io/infra/revisor), [infra/peeping](https://gitlab.sarex.io/infra/peeping) ◻️ | Утилиты инспекции/ревизии кластера |
| [infra/compnay-cleanup-kit](https://gitlab.sarex.io/infra/compnay-cleanup-kit) ◻️ | Очистка данных компании *(опечатка в имени — так в GitLab)* |
| [infra/py-s3-size](https://gitlab.sarex.io/infra/py-s3-size), [infra/get_size_SOD](https://gitlab.sarex.io/infra/get_size_SOD), [infra/jobs/object-storage-size-by-project](https://gitlab.sarex.io/infra/jobs/object-storage-size-by-project) ◻️ | Учёт объёмов объектного хранилища |
| [infra/s3-replication-poc](https://gitlab.sarex.io/infra/s3-replication-poc) ◻️ | Репликация S3 (PoC) |
| [infra/wunderwaffe-operator](https://gitlab.sarex.io/infra/wunderwaffe-operator), [infra/wunderwaffe-tasks](https://gitlab.sarex.io/infra/wunderwaffe-tasks), [infra/wunderwaffe-dumpster](https://gitlab.sarex.io/infra/wunderwaffe-dumpster) ◻️ | Собственный k8s-оператор и его задачи |
---
## 8. Контуры заказчиков
| Подгруппа / репозиторий | Контур | Содержимое |
|---|---|---|
| [infra/wb/*](https://gitlab.sarex.io/infra/wb) ◻️ | WB | `manifestos-k8s`, `postgresql16`, `helm-of-business`. Кластер `wb` в `iac` синхронизируется из `gitea-srx.wb.ru` |
| [infra/gpnt/*](https://gitlab.sarex.io/infra/gpnt) ◻️ | ГПН, OpenShift | UBI-образы: `base`, `backend`, `nginx`, `postgres`, `rabbitmq`, `redis`, `comparator`; `gpnt-os` — «manifest and helm templates for openshift» |
| [infra/gpnr/*](https://gitlab.sarex.io/infra/gpnr) ◻️ | ГПН-Р | `docker-packaging-gdal-builder`, `docker-packaging-potree-builder`, `u190001439_skzssrx*` |
| [infra/severstal/*](https://gitlab.sarex.io/infra/severstal) ◻️ | Северсталь | UBI-образы + `ingress`, `provision` |
| [infra/iac-gpn](https://gitlab.sarex.io/infra/iac-gpn) ✅ | ГПН | ArgoCD-монорепозиторий контура |
| [infra/brusnika](https://gitlab.sarex.io/infra/brusnika), [infra/uralchem](https://gitlab.sarex.io/infra/uralchem), [infra/ugok](https://gitlab.sarex.io/infra/ugok), [infra/cps2](https://gitlab.sarex.io/infra/cps2) ◻️ | Брусника, Уралхим, УГОК, ЦПС | Контурные наборы (низкая активность — часть с 2025-01) |
---
## 9. Инструменты, скрипты, документация
| Репозиторий | Отвечает за |
|---|---|
| [infra/kafka-router](https://gitlab.sarex.io/infra/kafka-router) ✅ | Проксирование сообщений между Kafka-кластерами по `TOPIC_MAPPING`, с фильтрацией по компании (FastStream) |
| [infra/tools/sarex-cli-service](https://gitlab.sarex.io/infra/tools/sarex-cli-service) | Python-скрипт подъёма локального окружения разработчика *(описание из GitLab)* |
| [infra/tools/sdk-python](https://gitlab.sarex.io/infra/tools/sdk-python) ◻️ | Внутренний Python SDK |
| [infra/bash-scripts](https://gitlab.sarex.io/infra/bash-scripts), [infra/python-scripts](https://gitlab.sarex.io/infra/python-scripts), [infra/scripts/*](https://gitlab.sarex.io/infra/scripts), [d.emelin/infra-scripts](https://gitlab.sarex.io/d.emelin/infra-scripts) ◻️ | Разрозненные операционные скрипты |
| [infra/transfer-tools](https://gitlab.sarex.io/infra/transfer-tools) ◻️ | Перенос данных между контурами |
| [infra/docs/deploy](https://gitlab.sarex.io/infra/docs/deploy), [infra/docs/services](https://gitlab.sarex.io/infra/docs/services), [infra/kb](https://gitlab.sarex.io/infra/kb) ◻️ | Документация по деплою и сервисам, база знаний |
| [infra/automations/terraform-deletion_scheduled-454](https://gitlab.sarex.io/infra/automations/terraform-deletion_scheduled-454) ◻️ | Автоматизация; судя по имени — запланированное удаление ресурсов. **Проверить перед любыми действиями** |
| [infra/poc/*](https://gitlab.sarex.io/infra/poc) (~30 репозиториев) ◻️ | Песочница: `k8s-teleport`, `k8s-events`, `contour-storage`, `git-server`, `minikube`, `offline-sentry`, `offline-signoz`, `cdc`, `delta`, `trace-viewer`, `streaming-dump`, `system-tests`, `s3-*`, `unity/*` и др. **Не источник истины для прода** |
---
## 10. Как пользоваться каталогом
**Меняю поведение компонента в кластере из §5.1** → `infra/iac`, `infrastructure/<компонент>/patches/`
или оверлей кластера; проверка — `flux get kustomizations`, `flux get helmreleases -A`.
**Меняю поведение компонента в CI-контуре** → соответствующий `infra/<компонент>`, **ветка контура**,
каталог `.helm/`.
**Выкатываю новую версию приложения** → `apps/<app>/`: тег образа в `base/<компонент>.yaml`,
если кластер наследует базу (`d8-ugmk-prod`, `yc-k8s-test`), **и отдельно** в
`apps/<app>/brusnika-*/`, `apps/<app>/yc-ecp/` — эти оверлеи базу не подключают (§5.3.4).
Перед правкой сверься с §5.3.3: возможно, оверлей вообще не подключён к кластеру.
**Нужен новый секрет для приложения** → положить в Vault по пути `secrets/data/apps/<app>/…`
и добавить `vault.hashicorp.com/agent-inject-*` в `podAnnotations` (§5.3.5). В git секрет не кладём.
**Ищу исходники сервиса по имени namespace или образа** → карта «приложение → репозиторий»
в §5.3.8; там же порядок поиска, если компонента в таблице нет.
**Нужен новый namespace / БД / бакет / топик / секрет** → `infra/terraform`, `infrastructure.yaml`
(секреты — через SOPS, см. `SOPS.md`); для контура — `terraform-contour` / `terraform-contour-mirror`.
**Нужен новый кластер** → `kubespray``k8s-provision``flux bootstrap --path=clusters/<имя>`
в `infra/iac`.
**Понять, что реально крутится в кластере** → `inventory.yaml` в этом репозитории и
`infra/k8s-changelog` (git-история состояния).
---
### Открытые вопросы
1. Привести оверлеи `brusnika-prod`, `brusnika-stage`, `yc-ecp` к наследованию `../base` — сейчас
это полные копии, которые молча расходятся с базой (§5.3.4).
2. Разобрать 17 неподключённых оверлеев приложений и 25 каталогов `dsinv/`: удалить или
подключить (§5.3.3).
3. Выровнять версию `universal-chart` — шесть приложений остались на 0.1.7 при базовой 0.1.9.
4. Разграничить `prometheus-stack` и `kube-prometheus-stack` — какой из них актуален.
5. Зафиксировать регламент синхронизации `terraform``terraform-contour-mirror`.
6. Для ~60 компонентных репозиториев определить, какие мигрируют в `infra/iac`, а какие остаются
на CI-деплое; остальное — архивировать.
7. Закрыть пробелы в паспортах сервисов (§5.3.6) и подтвердить назначение репозиториев с ◻️.

View File

@ -0,0 +1,85 @@
# =============================================================================
# AMS-Sync — пример конфигурации (.env)
# Версия: 1.0.0
# Скопируйте в .env и заполните значения.
#
# Сервис имеет два режима запуска:
# - `run` — демон-потребитель Kafka (CMD контейнера), использует блоки
# App / Kafka / Zitadel / Logger / Healthcheck (+ Auth);
# - CLI — команды migrate / sync / diff (запускаются вручную),
# дополнительно используют блоки Auth / User server / БД sarex.
# Значения по умолчанию проставлены там, где они заданы в коде.
# =============================================================================
# --- Приложение (без префикса) ---
# LOCAL | STAGE | PREPROD | PRODUCTION
ENVIRONMENT=LOCAL
# Топик Kafka с событиями пользователей
AMS_SYNC_TOPIC=ams-sync
# ID организации-хоста в Zitadel (обязателен)
HOST_ORGANIZATION_ID=
# При True входящие model_created обрабатываются через import_user (с верификацией)
VERIFY_USERS=False
# --- Kafka (префикс KAFKA_) ---
# JSON-массив адресов брокеров, напр. ["host:9091"]
KAFKA_BOOTSTRAP_SERVERS=
KAFKA_SASL_PLAIN_USERNAME=
KAFKA_SASL_PLAIN_PASSWORD=
# Путь к CA-сертификату для SSL-подключения к Kafka
KAFKA_SSL_CAFILE=
# PLAINTEXT | SSL | SASL_PLAINTEXT | SASL_SSL
KAFKA_SECURITY_PROTOCOL=SASL_SSL
# PLAIN | SCRAM-SHA-256 | SCRAM-SHA-512
KAFKA_SASL_MECHANISM=SCRAM-SHA-512
# --- Zitadel / AMS (префикс ZITADEL_) ---
# Хост Zitadel (обязателен для адаптера пользователей)
ZITADEL_HOST=https://idp.dev.stage.sarex.io
# Service-токен доступа к API Zitadel (обязателен)
ZITADEL_SERVICE_ACCESS_TOKEN=
# ВНИМАНИЕ: переменную читают сразу несколько классов с разным типом
# - адаптер пользователей ожидает int (минуты), напр. 10
# - адаптеры организаций/грантов ожидают строку, напр. "10m"
# Задавайте int, иначе адаптер пользователей упадёт на разборе.
ZITADEL_TIMEOUT=10
# Максимальный размер пачки при bulk-импорте
ZITADEL_MAX_BATCH=2000
# Эндпоинты (обычно не переопределяются)
ZITADEL_USERS_MANAGEMENT_ENDPOINT=management/v1/users
ZITADEL_USERS_ENDPOINT=v2/users
# --- Логирование (префикс LOG_) ---
LOG_LEVEL=INFO
# LOG_FORMAT=%(asctime)s [%(levelname)s]: %(message)s
# --- TCP Healthcheck (префикс HEALTHCHECK_) ---
HEALTHCHECK_HOST=0.0.0.0
HEALTHCHECK_PORT=8008
HEALTHCHECK_MAX_CONNECTIONS=10
HEALTHCHECK_REPLY=healthy
# --- Auth: sarex-backend (префикс AUTH_) ---
# Используется для получения JWT под админом (режим run и CLI)
AUTH_HOST=https://stage.sarex.io
AUTH_ADMIN_USERNAME=
AUTH_ADMIN_PASSWORD=
AUTH_AUTH_ENDPOINT=api/token/
# --- Sarex user server (префикс USER_SERVER_, только CLI) ---
# Источник метадаты пользователя для миграции/синхронизации
USER_SERVER_HOST=https://stage.sarex.io
USER_SERVER_USERS_ENDPOINT=api/core/admin/users
# --- База данных sarex-backend (префикс USER_DB_, только CLI) ---
# Источник пользователей/компаний для команд migrate/sync/diff
USER_DB_NAME=postgres
USER_DB_USER=postgres
USER_DB_PASSWORD=password
USER_DB_HOST=127.0.0.1
USER_DB_PORT=5432
# Имена таблиц (обычно не переопределяются)
USER_DB_USER_TABLE_NAME=base_baseuser
USER_DB_COMPANYUSER_TABLE_NAME=core_companyuser
USER_DB_COMPANY_TABLE_NAME=core_company
USER_DB_ITER_SIZE=10000

View File

@ -0,0 +1,218 @@
# Конфигурация проекта ams-sync
# Версия: 1.0.0
Документ описывает все переменные окружения и способы конфигурирования сервиса.
## Что делает сервис
`ams-sync` — утилита синхронизации пользователей sarex-backend с системой управления доступом (AMS) на базе **Zitadel**. У сервиса два режима работы:
- **`run`** — фоновый демон-потребитель Kafka (`src/internal/app/service/sync_service.py`, точка входа `python3 cmd.py run`, это же `CMD` контейнера). Слушает топик событий пользователей и создаёт/обновляет пользователей в Zitadel. Параллельно поднимает TCP-healthcheck.
- **CLI-команды** (`migrate` / `sync` / `diff`, реализованы в `src/internal/app/console.py`) — разовые задачи миграции и синхронизации, запускаются вручную. Читают пользователей и компании напрямую из БД sarex-backend.
## Способы конфигурирования
Сервис настраивается **только через переменные окружения**. Разбор выполняется библиотекой [`pydantic-settings`](https://docs.pydantic.dev/latest/concepts/pydantic_settings/). В отличие от монолитного `AppSettings`, настройки разбиты на несколько независимых классов, каждый со своим префиксом:
| Класс | Файл | Префикс |
| --- | --- | --- |
| `Settings` (приложение) | `src/internal/app/service/settings.py` | *(без префикса)* |
| `KafkaSettings` | `src/internal/app/service/settings.py` | `kafka_` |
| `Settings` (console) | `src/internal/app/console.py` | *(без префикса)* |
| `Settings` (logger) | `src/internal/adapter/logger/logger.py` | `log_` |
| `Settings` (healthcheck) | `src/internal/adapter/tcphealthcheck/healthcheck.py` | `healthcheck_` |
| `Settings` (auth) | `src/internal/adapter/auth/http/adapter.py` | `auth_` |
| `Settings` (user server) | `src/internal/adapter/users/http/adapter.py` | `user_server_` |
| `Settings` (zitadel users) | `src/internal/adapter/users/zitadel/adapter.py` | `zitadel_` |
| `Settings` (organizations) | `src/internal/adapter/organizations/adapter.py` | `zitadel_` |
| `Settings` (grants) | `src/internal/adapter/grants/adapter.py` | `zitadel_` |
| `Settings` (user repo) | `src/internal/repository/users/repository.py` | `user_db_` |
| `Settings` (company repo) | `src/internal/repository/companies/repository.py` | `user_db_` |
Особенности разбора (`SettingsConfigDict`):
- у каждого класса задан `env_file=".env"`, `env_file_encoding="utf-8"` и `extra="ignore"` — при наличии файла `.env` в рабочей директории он загружается автоматически, лишние переменные игнорируются;
- вложенного разделителя нет — каждая группа настроек читается отдельным классом по своему префиксу (либо без префикса для классов приложения);
- CLI-команды принимают флаг `--env-file=` (по умолчанию `.env`), который прокидывается в конструкторы настроек как `_env_file`; режим `run` всегда читает `.env`.
Отдельного конфиг-файла (yaml/toml) у приложения нет.
Источники переменных по способам запуска:
| Способ запуска | Откуда берутся переменные |
| --- | --- |
| Локально (CLI) | Файл `.env` (или указанный через `--env-file=`) в директории с `cmd.py` и/или переменные окружения процесса |
| Локально (контейнер) | `Dockerfile`: `CMD ["python3", "cmd.py", "run"]`; переменные пробрасываются в окружение контейнера |
| Kubernetes (Helm) | `.helm/values.yaml`: блоки `universal-chart.envs` (обычные значения) и `universal-chart.secretEnvs` (значения из k8s-секретов). Базовый чарт — `universal-chart` |
| CI/CD (GitLab) | `.gitlab-ci.yml`: переменные пайплайна в `workflow.rules` (`RELEASE_NAME`, `STAND`, `CHART_*`, `IMAGE_NAME`, `HELM_SET_ARGS` и т.п.) |
Команды CLI (`python3 cmd.py <command>`, см. `README.md`):
| Команда | Аргументы | Назначение |
| --- | --- | --- |
| `run` | — | Демон-потребитель Kafka + TCP-healthcheck (режим контейнера) |
| `migrate` | `--user-id`, `--with-password/--no-with-password` | Миграция пользователя(ей) из БД sarex-backend в Zitadel. Без `--user-id` мигрируются все (bulk) |
| `sync` | `--user-id`, `--company-id` | Синхронизация метадаты пользователя(ей) из БД sarex-backend в Zitadel |
| `diff` | — | Сравнение множества пользователей БД и Zitadel, отчёт по отсутствующим |
## Переменные приложения
Дефолт `—` означает, что значение обязательно (иначе ошибка старта).
### App (без префикса)
Класс `Settings` в `src/internal/app/service/settings.py` (режим `run`) и `Settings` в `console.py` (CLI).
| Переменная | Тип | Значение по умолчанию | Назначение |
| --- | --- | --- | --- |
| `ENVIRONMENT` | enum | `LOCAL` | Окружение: `LOCAL`/`STAGE`/`PREPROD`/`PRODUCTION` |
| `AMS_SYNC_TOPIC` | string | `ams-sync` | Имя топика Kafka с событиями пользователей |
| `HOST_ORGANIZATION_ID` | string | — | ID организации-хоста в Zitadel (обязателен и в `run`, и в CLI) |
| `VERIFY_USERS` | bool | `False` | При `True` события `model_created` обрабатываются через `import_user` (с верификацией e-mail), иначе через обычный `create` |
### Kafka (`KAFKA_*`)
| Переменная | Тип | Значение по умолчанию | Назначение |
| --- | --- | --- | --- |
| `KAFKA_BOOTSTRAP_SERVERS` | list[str] (JSON) | — | Адреса брокеров, напр. `["host:9091"]` |
| `KAFKA_SASL_PLAIN_USERNAME` | string | — | Логин SASL |
| `KAFKA_SASL_PLAIN_PASSWORD` | string | — | Пароль SASL |
| `KAFKA_SSL_CAFILE` | string | — | Путь к CA-сертификату для SSL |
| `KAFKA_SECURITY_PROTOCOL` | string | `SASL_SSL` | Протокол безопасности |
| `KAFKA_SASL_MECHANISM` | string | `SCRAM-SHA-512` | Механизм SASL |
### Zitadel / AMS (`ZITADEL_*`)
Префикс используют три класса (адаптеры пользователей, организаций и грантов). Общие поля:
| Переменная | Тип | Значение по умолчанию | Назначение |
| --- | --- | --- | --- |
| `ZITADEL_SERVICE_ACCESS_TOKEN` | string | — | Service-токен доступа к API Zitadel (Bearer) |
| `ZITADEL_HOST` | string | — (у адаптера пользователей); `https://idp.dev.stage.sarex.io` (у адаптеров организаций/грантов) | Базовый URL Zitadel |
| `ZITADEL_TIMEOUT` | int / string | `10` (адаптер пользователей, минуты) / `10m` (организации, гранты) | Таймаут. См. замечание о конфликте типов ниже |
| `ZITADEL_MAX_BATCH` | int | `2000` | Максимум пользователей в одной пачке bulk-импорта |
| `ZITADEL_USERS_MANAGEMENT_ENDPOINT` | string | `management/v1/users` | Базовый путь management-API |
| `ZITADEL_USERS_ENDPOINT` | string | `v2/users` | Базовый путь users-API v2 |
### Логирование (`LOG_*`)
| Переменная | Тип | Значение по умолчанию | Назначение |
| --- | --- | --- | --- |
| `LOG_LEVEL` | string | `INFO` | Уровень логирования |
| `LOG_FORMAT` | string | `%(asctime)s [%(levelname)s]: %(message)s` | Формат строки лога |
Логи пишутся в stdout и в файл `latest.log` в рабочей директории.
### TCP Healthcheck (`HEALTHCHECK_*`)
Только режим `run`. Поднимает сырой TCP-сокет, отвечающий строкой-ответом на каждое подключение.
| Переменная | Тип | Значение по умолчанию | Назначение |
| --- | --- | --- | --- |
| `HEALTHCHECK_HOST` | string | `0.0.0.0` | Адрес прослушивания |
| `HEALTHCHECK_PORT` | int | `8008` | Порт |
| `HEALTHCHECK_MAX_CONNECTIONS` | int | `10` | Размер очереди подключений (`listen`) |
| `HEALTHCHECK_REPLY` | string | `healthy` | Строка-ответ на подключение |
### Auth: sarex-backend (`AUTH_*`)
Получение JWT под сервисным админом (используется в обоих режимах — адаптер создаётся и в `run`, и в CLI).
| Переменная | Тип | Значение по умолчанию | Назначение |
| --- | --- | --- | --- |
| `AUTH_HOST` | string | — | Базовый URL sarex-backend |
| `AUTH_ADMIN_USERNAME` | string | — | Логин админа |
| `AUTH_ADMIN_PASSWORD` | string | — | Пароль админа |
| `AUTH_AUTH_ENDPOINT` | string | `api/token/` | Путь получения токена |
### Sarex user server (`USER_SERVER_*`) — только CLI
Источник метадаты пользователя при миграции/синхронизации.
| Переменная | Тип | Значение по умолчанию | Назначение |
| --- | --- | --- | --- |
| `USER_SERVER_HOST` | string | — | Базовый URL сервиса пользователей sarex-backend |
| `USER_SERVER_USERS_ENDPOINT` | string | `api/core/admin/users` | Базовый путь эндпоинта пользователей |
### База данных sarex-backend (`USER_DB_*`) — только CLI
Один префикс на два репозитория (пользователи и компании). Подключение через `psycopg2`.
| Переменная | Тип | Значение по умолчанию | Назначение |
| --- | --- | --- | --- |
| `USER_DB_NAME` | string | — | Имя базы данных |
| `USER_DB_USER` | string | — | Пользователь БД |
| `USER_DB_PASSWORD` | string | — | Пароль |
| `USER_DB_HOST` | string | — | Хост PostgreSQL |
| `USER_DB_PORT` | int | — | Порт PostgreSQL |
| `USER_DB_USER_TABLE_NAME` | string | `base_baseuser` | Таблица пользователей |
| `USER_DB_COMPANYUSER_TABLE_NAME` | string | `core_companyuser` | Таблица связи пользователь↔компания |
| `USER_DB_COMPANY_TABLE_NAME` | string | `core_company` | Таблица компаний |
| `USER_DB_ITER_SIZE` | int | `10000` | Размер серверного курсора при итерации |
## Переменные из Helm-чарта (`.helm/values.yaml`)
Базовый чарт — `universal-chart`. Обычные значения (`universal-chart.envs`) задаются на окружение (`_default`/`stage`/`preprod`/`production`):
| Переменная | Значения по окружениям |
| --- | --- |
| `AMS_SYNC_TOPIC` | `ams-sync` |
| `ENVIRONMENT` | `STAGE` / `PREPROD` / `PRODUCTION` |
| `HOST_ORGANIZATION_ID` | stage `339439562105337368`, preprod `337394329179947547`, production `337555824748561429` |
| `USER_SERVER_HOST` | stage `https://stage.sarex.io`, preprod `https://preprod.sarex.io`, production `https://.lk.sarex.io` |
| `AUTH_HOST` | stage `https://stage.sarex.io`, preprod `https://preprod.sarex.io`, production `https://lk.sarex.io` |
| `KAFKA_SECURITY_PROTOCOL` | `SASL_SSL` |
| `KAFKA_SASL_MECHANISM` | `SCRAM-SHA-512` |
Значения из секретов (`universal-chart.secretEnvs`, монтируются как env через `secretKeyRef`):
| Переменная | Секрет (`secretName`) | Ключ (`secretKey`) |
| --- | --- | --- |
| `ZITADEL_HOST` | `zitadel-token-secret` | `zitadel-host` |
| `ZITADEL_SERVICE_ACCESS_TOKEN` | `zitadel-token-secret` | `zitadel-access-token` |
| `KAFKA_BOOTSTRAP_SERVERS` | `ams-kafka-secret` | `kafka-bootstrap-servers` |
| `KAFKA_SASL_PLAIN_USERNAME` | `ams-kafka-secret` | `kafka-username` |
| `KAFKA_SASL_PLAIN_PASSWORD` | `ams-kafka-secret` | `kafka-password` |
| `KAFKA_SSL_CAFILE` | `ams-kafka-secret` | `kafka-ca-file` |
| `AUTH_ADMIN_USERNAME` | `auth-secret` | `admin-username` |
| `AUTH_ADMIN_PASSWORD` | `auth-secret` | `admin-password` |
| `USER_DB_NAME` | `user-db-secret` | `user-db-name` |
| `USER_DB_USER` | `user-db-secret` | `user-db-user` |
| `USER_DB_PASSWORD` | `user-db-secret` | `user-db-password` |
| `USER_DB_HOST` | `user-db-secret` | `user-db-host` |
| `USER_DB_PORT` | `user-db-secret` | `user-db-port` |
Помимо env, чарт монтирует CA-сертификат Kafka из секрета `ya-ca-secret` в `/etc/ca-certificates/Yandex` (`volumes`/`volumeMounts`) и раздаёт `YandexInternalRootCA.crt` через configMap `ya-ca-cert`. Прочие значения чарта (не переменные приложения): `deployment.*` (имя, реплики, ресурсы, порт `8008`), `service.*` (ClusterIP, порт `8008`), `probes.*` (TCP-пробы на `8008`, по умолчанию выключены), `serviceAccount.*`, `imagePullSecrets.*`.
## Переменные в CI (`.gitlab-ci.yml`)
Пайплайн подключает общие шаблоны из `generic/common-ci` и переключает окружение по ветке/тегу через `workflow.rules`:
| Условие | STAND | Namespace |
| --- | --- | --- |
| ветка `stage` | `stage` | `platform` (`STAGE_NAMESPACE`) |
| ветка `master` | `preprod` | `ams-sync-preprod` |
| тег (`CI_COMMIT_TAG`) | `prod` | `ams-sync-prod` |
Ключевые переменные пайплайна: `RELEASE_NAME=ams-sync`, `CHART_NAME=ams-sync`, `CHART_VERSION` (`0.0.1-<stand>`), `IMAGE_NAME`, `IMAGE_PATH=universal-chart.image.name`, `HELM_SET_ARGS`, `DOCKERFILE_PATH=Dockerfile`, флаги `ENABLE_LINTER`/`ENABLE_BUILD_CHART`/`ENABLE_BUILD_IMAGE`/`ENABLE_STATE_UPDATE`/`ENABLE_DEPLOY`.
## Замечания и потенциальные проблемы
- **Конфликт `ZITADEL_TIMEOUT`.** Переменную читают три класса с общим префиксом `zitadel_`, но разного типа: адаптер пользователей ожидает `int` (минуты, дефолт `10`), адаптеры организаций и грантов — `str` (дефолт `10m`). Если задать `ZITADEL_TIMEOUT=10m`, инициализация адаптера пользователей упадёт на разборе `int`. Рекомендуется задавать целое число.
- **`ZITADEL_HOST` без дефолта у адаптера пользователей.** В `users/zitadel/adapter.py` поле `host` обязательно (дефолта нет), тогда как в адаптерах организаций/грантов есть дефолт `https://idp.dev.stage.sarex.io`. Для режима `run` переменную нужно задать явно (в Helm приходит из секрета `zitadel-token-secret`).
- **Режим `run` не использует БД и user-server.** Демон-потребитель (`sync_service.py`) поднимает только logger, healthcheck, auth-провайдер, адаптер Zitadel и Kafka. Переменные `USER_DB_*` и `USER_SERVER_*` требуются только CLI-командам (`migrate`/`sync`/`diff`), хотя в Helm они проброшены для запуска этих команд через `kubectl exec`.
- **Приложение загружает `.env` автоматически** (у всех классов задан `env_file`), в отличие от некоторых других сервисов. CLI дополнительно поддерживает `--env-file=` для альтернативного файла.
- **TLS-проверка отключена.** Все исходящие HTTP-запросы (Zitadel, sarex-backend) выполняются с `verify=False`. Отдельного флага в конфиге нет.
- **Zitadel org-ID захардкожены в коде.** Помимо `HOST_ORGANIZATION_ID`, в use-case зашиты `glorax_org_id` и `dogma_org_id`, в которые распределяются пользователи по доменам e-mail (см. `usecase/migration/usecase.py`, `usecase/user/usecase.py`).
## Минимальный набор для режима `run` (демон)
- `ENVIRONMENT`, `HOST_ORGANIZATION_ID`, `AMS_SYNC_TOPIC`
- `KAFKA_BOOTSTRAP_SERVERS`, `KAFKA_SASL_PLAIN_USERNAME`, `KAFKA_SASL_PLAIN_PASSWORD`, `KAFKA_SSL_CAFILE` (+ при необходимости `KAFKA_SECURITY_PROTOCOL`, `KAFKA_SASL_MECHANISM`)
- `ZITADEL_HOST`, `ZITADEL_SERVICE_ACCESS_TOKEN`
- `AUTH_HOST`, `AUTH_ADMIN_USERNAME`, `AUTH_ADMIN_PASSWORD`
## Дополнительно для CLI (`migrate` / `sync` / `diff`)
- `USER_SERVER_HOST`
- `USER_DB_NAME`, `USER_DB_USER`, `USER_DB_PASSWORD`, `USER_DB_HOST`, `USER_DB_PORT`

View File

@ -0,0 +1,99 @@
# Интерфейсы сервиса ams-sync
# Версия: 1.0.0
Документ описывает интерфейсную поверхность сервиса: потребляемый топик Kafka, входящий TCP-healthcheck, исходящие HTTP-запросы к внешним сервисам (Zitadel, sarex-backend) и обращения к БД.
> `ams-sync` — не backend-сервис с REST API, а утилита синхронизации: демон-потребитель Kafka (`run`) плюс набор CLI-команд (`migrate`/`sync`/`diff`). Публичного HTTP API у сервиса нет — единственный входящий сокет отвечает на healthcheck сырой строкой (не HTTP). Поэтому файла `openapi.yaml` для сервиса нет.
## Как устроено взаимодействие
Приложение построено по слоям (adapter → repository → usecase → controller). Исходящие вызовы к внешним сервисам выполняются через `requests` (`requests.Session` с ретраями на `5xx`), к БД — через `psycopg2`. Все HTTP-запросы идут с `verify=False` (без проверки TLS). Базовые хосты берутся из переменных окружения (см. `CONFIGURATION.md`): `ZITADEL_HOST`, `AUTH_HOST`, `USER_SERVER_HOST`.
Аутентификация исходящих запросов:
- **Zitadel** — заголовок `Authorization: Bearer <ZITADEL_SERVICE_ACCESS_TOKEN>` (service-токен из конфига). Для части операций дополнительно проставляется `x-zitadel-orgid`.
- **sarex-backend** — JWT, получаемый под админом (`AUTH_ADMIN_USERNAME`/`AUTH_ADMIN_PASSWORD`) через `POST api/token/`; кешируется и обновляется за 30 секунд до `exp`.
## Входящие интерфейсы
### TCP Healthcheck
Только режим `run`. Сырой TCP-сокет (не HTTP): на каждое подключение отправляет строку `HEALTHCHECK_REPLY` (по умолчанию `healthy`) и закрывает соединение. Слушает `HEALTHCHECK_HOST:HEALTHCHECK_PORT` (по умолчанию `0.0.0.0:8008`). В Helm k8s-пробы настроены на TCP-порт `8008` (по умолчанию отключены).
### Kafka-потребитель
Топик — переменная `AMS_SYNC_TOPIC` (по умолчанию `ams-sync`). Параметры консьюмера (`src/internal/controller/sync_service/controller.py`):
| Параметр | Значение |
| --- | --- |
| `group_id` | `ams_sync_group` |
| `auto_offset_reset` | `earliest` |
| `enable_auto_commit` | `True` |
| десериализация | JSON (`utf-8`) |
Формат сообщения — объект с полями `type` и `body`. Диспетчеризация по `type`:
| `type` сообщения | Тело (`body`) | Обработчик | Действие |
| --- | --- | --- | --- |
| `model_created` | `SarexUserWithPermissions` | при `VERIFY_USERS=True``import_user` UC, иначе `user` UC `create` | Создание пользователя в Zitadel + запись метадаты |
| `model_updated` | `Metadata` | `user` UC `update_metadata` | Обновление метадаты существующего пользователя в Zitadel |
Сообщения без `type` или `body` пропускаются с предупреждением. Ошибки обработки логируются (traceback), сообщение не переотправляется (auto-commit включён).
## Исходящие HTTP-запросы
### Zitadel (`ZITADEL_HOST`)
Адаптеры `users/zitadel/adapter.py` и `organizations/adapter.py`. Итоговый URL = `<ZITADEL_HOST>` + путь.
| Метод | Путь | Назначение |
| --- | --- | --- |
| POST | `/v2/users/new` | Создать пользователя (human) |
| POST | `/management/v1/users/human/_import` | Импортировать пользователя (заголовок `x-zitadel-orgid`) |
| POST | `/admin/v1/import` | Массовый импорт пользователей (bulk, с таймаутом) |
| POST | `/v2/users` | Поиск пользователей (по username / email / org) |
| GET | `/management/v1/users/{id}` | Получить пользователя по id |
| GET | `/management/v1/users/{id}/metadata/{key}` | Получить метадату пользователя по ключу |
| POST | `/v2/users/{id}/metadata` | Массово задать метадату пользователя (значения в base64) |
| POST | `/v2/users/{id}/deactivate` | Деактивировать пользователя |
| DELETE | `/v2/users/{id}` | Удалить пользователя |
| POST | `/v2/organizations/_search` | Найти организацию по имени |
> Пути `/v2/...` частично захардкожены в адаптере, часть базовых путей управляется `ZITADEL_USERS_MANAGEMENT_ENDPOINT` (`management/v1/users`) и `ZITADEL_USERS_ENDPOINT` (`v2/users`). Методы грантов (`grants/adapter.py`) в текущей версии закомментированы.
### sarex-backend — авторизация (`AUTH_HOST`)
Адаптер `auth/http/adapter.py`.
| Метод | Путь | Назначение |
| --- | --- | --- |
| POST | `{AUTH_AUTH_ENDPOINT}` (по умолчанию `api/token/`) | Получить JWT по логину/паролю админа. Возвращает поле `access` |
### sarex-backend — сервис пользователей (`USER_SERVER_HOST`), только CLI
Адаптер `users/http/adapter.py`. Сессия с ретраями на `500/502/503/504` (до 5 попыток).
| Метод | Путь | Назначение |
| --- | --- | --- |
| GET | `{USER_SERVER_USERS_ENDPOINT}/{user_id}/metadata` (по умолчанию `api/core/admin/users/{user_id}/metadata`) | Получить метадату пользователя sarex для синхронизации в Zitadel |
## Обращения к БД sarex-backend (`USER_DB_*`), только CLI
Репозитории `repository/users` и `repository/companies` читают данные напрямую из PostgreSQL sarex-backend (только чтение, серверный курсор `itersize`).
| Операция | Таблицы | Назначение |
| --- | --- | --- |
| Пользователь по id | `base_baseuser` | `migrate --user-id` / `sync --user-id` |
| Все пользователи (итерация) | `base_baseuser` | `migrate` / `sync` / `diff` (bulk) |
| Пользователи компании | `core_companyuser``base_baseuser` | `sync --company-id` (только с непустым email) |
| Компания по id / имени | `core_company` | Вспомогательные запросы |
## Внешние зависимости (инфраструктура)
| Зависимость | Режим | Назначение |
| --- | --- | --- |
| Kafka | `run` | Источник событий пользователей (топик `AMS_SYNC_TOPIC`) |
| Zitadel (AMS) | `run` + CLI | Целевая система управления доступом (создание/обновление/удаление пользователей и метадаты) |
| sarex-backend (auth) | `run` + CLI | Получение JWT под админом |
| sarex-backend (user server) | CLI | Источник метадаты пользователя |
| PostgreSQL sarex-backend | CLI | Источник пользователей и компаний для миграции/синхронизации |

View File

@ -85,6 +85,20 @@ spec:
_default: regcred
labels:
monitoring: prometheus
volumes:
_default:
- name: cm-ya-ca-cert
mountPath:
_default: /etc/ca-certificates/Yandex/
readOnly:
_default: true
configMap:
name:
_default: kafka-cert
items:
- key: YandexInternalRootCA.crt
path:
_default: YandexInternalRootCA.crt
envs:
- name: AMS_SYNC_TOPIC

View File

@ -0,0 +1,41 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: ams-sync
namespace: ams-sync
spec:
values:
services:
backend:
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/ams-sync:ugok
envs:
- name: AMS_SYNC_TOPIC
value:
_default: ams-sync
- name: ENVIRONMENT
value:
_default: PRODUCTION
- name: HOST_ORGANIZATION_ID
value:
_default: '377835910403719938'
- name: ALERT_ENABLED
value:
_default: 'False'
- name: USER_SERVER_HOST
value:
_default: http://backend.django.svc.cluster.local:8000
- name: AUTH_HOST
value:
_default: http://backend.django.svc.cluster.local:8000
- name: VERIFY_USERS
value:
_default: 'True'
- name: KAFKA_SECURITY_PROTOCOL
value:
_default: SSL
- name: KAFKA_SASL_MECHANISM
value:
_default: SCRAM-SHA-512

View File

@ -0,0 +1,11 @@
---
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: ams-sync
resources:
- ../base
patches:
- path: backend.yaml
target:
kind: HelmRelease
name: ams-sync

View File

@ -0,0 +1,6 @@
---
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: ams-sync
resources:
- ../base

View File

@ -0,0 +1,11 @@
---
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: ams-sync
resources:
- ../base
patches:
- path: patch.yaml
target:
kind: HelmRelease
name: ams-sync

View File

@ -0,0 +1,55 @@
---
# Патч для контура wb.
#
# ВНИМАНИЕ: envs — список, kustomize заменяет его ЦЕЛИКОМ (JSON merge patch),
# поэтому здесь продублирован весь набор из apps/ams-sync/base/helmrelease.yaml.
#
# В base image-тег и USER_SERVER_HOST/AUTH_HOST зашиты под другого клиента
# (sarex.ugok.lan, образ ams-sync:ugok) — для wb это srx.wb.ru.
# secretEnvs (telegram/zitadel/kafka/db) не трогаем — они читаются из обычных
# k8s Secret'ов (не vault-agent), которые в wb уже должны быть заведены отдельно.
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: ams-sync
namespace: ams-sync
spec:
values:
services:
backend:
envs:
- name: AMS_SYNC_TOPIC
value:
_default: "ams-sync"
- name: ENVIRONMENT
value:
_default: "PRODUCTION"
- name: HOST_ORGANIZATION_ID
value:
_default: "368536846176636704"
- name: ALERT_ENABLED
value:
_default: "False"
- name: USER_SERVER_HOST
value:
_default: "https://srx.wb.ru"
- name: AUTH_HOST
value:
_default: "https://srx.wb.ru"
- name: VERIFY_USERS
value:
_default: "True"
- name: KAFKA_SECURITY_PROTOCOL
value:
_default: "SSL"
- name: KAFKA_SASL_MECHANISM
value:
_default: "SCRAM-SHA-512"

View File

@ -0,0 +1,46 @@
# =============================================================================
# Attachments — пример конфигурации (.env)
# Скопируйте в .env и заполните значения.
# =============================================================================
# --- Приложение (необязательные, есть значения по умолчанию) ---
# Версия: 0.11.1
# API=/api
# NAME=Attachments
# VERSION=0.0.1
# DESCRIPTION=Attachments
# --- База данных PostgreSQL (обязательные) ---
DATABASE_NAME=attachments
DATABASE_USER=postgres
DATABASE_PASSWORD=change_me
DATABASE_HOST=db
DATABASE_PORT=5432
DATABASE_SSL_MODE=disable
# Пароль суперпользователя PostgreSQL для контейнера db (docker-compose)
POSTGRES_PASSWORD=change_me
# --- S3 (Yandex Object Storage) ---
# Вариант 1: путь к JSON с реквизитами сервисного аккаунта.
# Файл должен содержать: {"endpoint": "...", "access_key_id": "...", "secret_access_key": "..."}
YANDEX_S3_ACCOUNT_PATH=/etc/sarex/yc-s3-storage/yc-s3-service-account.json
# Вариант 2: задать реквизиты напрямую (если не используете JSON-файл).
# YANDEX_S3_ENDPOINT_URL=storage.yandexcloud.net
# YANDEX_S3_ACCESS_KEY_ID=change_me
# YANDEX_S3_SECRET_ACCESS_KEY=change_me
YANDEX_S3_VERIFY=true
# YANDEX_S3_USE_SSL=true
# YANDEX_S3_REGION=ru-central1
BUCKET_NAME=attachments-stage-2
# --- Логирование (префикс LOG_) ---
# LOG_LEVEL=INFO
# --- Трейсинг / OpenTelemetry (префикс TRACING_) ---
# TRACING_USE=false
# TRACING_HOST=localhost:4317
# TRACING_SERVICE_NAME=attachments
# TRACING_INSECURE=false

View File

@ -0,0 +1,129 @@
# Конфигурация проекта Attachments
# Версия: 0.11.1
Документ описывает все переменные окружения и способы конфигурирования сервиса.
## Способы конфигурирования
Настройка сервиса выполняется **только через переменные окружения**. Отдельного файла с настройками (yaml/toml) в приложении нет — за конфигурацию отвечает `internal/config/settings.py` на базе `pydantic.BaseSettings`.
Источники переменных окружения по способам запуска:
| Способ запуска | Откуда берутся переменные |
| --- | --- |
| Локально (docker-compose) | Файл `.env` в корне (`env_file: .env` в `docker-compose.yml`), плюс `POSTGRES_PASSWORD` для контейнера БД |
| Kubernetes (Helm) | `.helm/values.yaml`: блок `envs` (обычные значения) и `secretEnvs` (значения из k8s-секретов) |
| CI/CD (GitLab) | `.gitlab-ci.yml`: переменные пайплайна и build-args |
Дополнительно секреты доступа к S3 не задаются напрямую, а читаются из JSON-файла (см. `YANDEX_S3_ACCOUNT_PATH` ниже).
## Переменные приложения (класс `Settings`)
Читаются напрямую по имени (регистрозависимо, `case_sensitive = True`). Переменные без значения по умолчанию **обязательны** — без них приложение не стартует.
| Переменная | Тип | Обязательна | Значение по умолчанию | Назначение |
| --- | --- | --- | --- | --- |
| `API` | str | нет | `/api` | Префикс всех HTTP-роутов |
| `NAME` | str | нет | `Attachments` | Имя сервиса (title в FastAPI/OpenAPI) |
| `VERSION` | str | нет | `0.0.1` | Версия сервиса |
| `DESCRIPTION` | str | нет | `Attachments` | Описание сервиса |
| `YANDEX_S3_ENDPOINT_URL` | str | да* | — | Endpoint S3 (без схемы; `https://`/`http://` добавляется в коде по `YANDEX_S3_USE_SSL`) |
| `YANDEX_S3_ACCESS_KEY_ID` | str | да* | — | Access Key ID для S3 |
| `YANDEX_S3_SECRET_ACCESS_KEY` | str | да* | — | Secret Access Key для S3 |
| `YANDEX_S3_USE_SSL` | bool | нет | `True` | Использовать ли HTTPS при обращении к S3 |
| `YANDEX_S3_REGION` | str | нет | `ru-central1` | Регион S3 |
| `YANDEX_S3_VERIFY` | bool | да | — | Проверять ли SSL-сертификат S3 |
| `BUCKET_NAME` | str | да | — | Имя бакета для вложений |
| `DATABASE_NAME` | str | да | — | Имя базы данных PostgreSQL |
| `DATABASE_USER` | str | да | — | Пользователь БД |
| `DATABASE_PASSWORD` | str | да | — | Пароль пользователя БД |
| `DATABASE_HOST` | str | да | — | Хост БД |
| `DATABASE_PORT` | int | да | — | Порт БД |
| `DATABASE_SSL_MODE` | str | да | — | Режим SSL при подключении к БД (напр. `disable`, `require`, `verify-full`) |
\* Три переменные `YANDEX_S3_ENDPOINT_URL`, `YANDEX_S3_ACCESS_KEY_ID`, `YANDEX_S3_SECRET_ACCESS_KEY` формально обязательны, но при старте приложения они **проставляются автоматически** функцией `json_config_s3_account_settings()` из JSON-файла (см. `YANDEX_S3_ACCOUNT_PATH`). Задавать их вручную не нужно, если задан путь к файлу.
## Настройки S3 через JSON-файл
| Переменная | Обязательна | Назначение |
| --- | --- | --- |
| `YANDEX_S3_ACCOUNT_PATH` | да | Путь к JSON-файлу с реквизитами сервисного аккаунта S3 |
При старте функция `json_config_s3_account_settings()` читает файл по этому пути и выставляет переменные окружения `YANDEX_S3_ENDPOINT_URL`, `YANDEX_S3_ACCESS_KEY_ID`, `YANDEX_S3_SECRET_ACCESS_KEY`.
Ожидаемая структура JSON-файла:
```json
{
"endpoint": "storage.yandexcloud.net",
"access_key_id": "<ключ>",
"secret_access_key": "<секрет>"
}
```
В Kubernetes файл монтируется из секрета `attachments-s3-secret` (в prod — `yc-s3`) в `/etc/sarex/yc-s3-storage/yc-s3-service-account.json`.
## Логирование (класс `LoggerSettings`, префикс `LOG_`)
| Переменная | Тип | Значение по умолчанию | Назначение |
| --- | --- | --- | --- |
| `LOG_LEVEL` | str | `INFO` | Уровень логирования (`DEBUG`, `INFO`, `WARNING`, ...). При неизвестном значении откатывается на `INFO` |
| `LOG_FORMAT` | str | JSON-шаблон с полями `timestamp`, `level`, `message` | Формат строк лога (используется `pythonjsonlogger`) |
## Трейсинг / OpenTelemetry (класс `TraceSettings`, префикс `TRACING_`)
| Переменная | Тип | Значение по умолчанию | Назначение |
| --- | --- | --- | --- |
| `TRACING_USE` | bool | `False` | Включает OTEL-трейсинг, логгер и middleware |
| `TRACING_HOST` | str | `localhost:4317` | Адрес OTLP-коллектора |
| `TRACING_SERVICE_NAME` | str | `attachments` | Имя сервиса в трейсах |
| `TRACING_INSECURE` | bool | `False` | Небезопасное (без TLS) подключение к коллектору |
Трейсинг активируется только при `TRACING_USE=true`.
## Переменные инфраструктуры и сборки
Не читаются кодом приложения, но нужны для запуска/сборки/деплоя.
| Переменная | Где используется | Назначение |
| --- | --- | --- |
| `POSTGRES_PASSWORD` | `docker-compose.yml` (контейнер `db`) | Пароль суперпользователя PostgreSQL при локальном запуске |
| `PIP_EXTRA_INDEX_URL` | `docker/Dockerfile` (build-arg) | Доп. индекс pip для установки приватных пакетов при сборке образа |
| `GITLAB_PYPI_EXTRA_INDEX_URL` | `.gitlab-ci.yml` | Значение, пробрасываемое в `PIP_EXTRA_INDEX_URL` при сборке в CI |
### Переменные CI/CD (`.gitlab-ci.yml`)
Служебные переменные пайплайна: `SERVICE_NAME`, `DOCKERFILE_PATH`, `BUILD_ARGS`, `CI_TRIGGER_SOURCE`, а также подставляемые по окружениям `STAND`, `NAMESPACE`, `RELEASE_NAME`, `CHART_NAME`, `CHART_VERSION`, `K8S_HUSTLER_BRANCH`, `HELM_SET_ARGS`. Окружение выбирается по ветке/тегу: `stage` → ветка `stage`, `preprod` → ветка `master`, `production` → git-тег.
## Переменные из Helm-чарта (`.helm/values.yaml`)
Обычные переменные (`envs`):
| Переменная | Значение | Примечание |
| --- | --- | --- |
| `API_ADDRESS` | `0.0.0.0:8000` | Задаётся в чарте, но **кодом приложения не читается** |
| `POSTGRES_POOL_SIZE` | `10` | Задаётся в чарте, но **кодом приложения не читается** |
| `DATABASE_SSL_MODE` | `verify-full` | |
| `YANDEX_S3_VERIFY` | `true` | |
| `YANDEX_S3_ACCOUNT_PATH` | `/etc/sarex/yc-s3-storage/yc-s3-service-account.json` | |
| `BUCKET_NAME` | `attachments-stage-2` / `attachments-prod-2` | Зависит от окружения |
Переменные из секретов (`secretEnvs`, секрет `attachments-postgresql-secret` / `ya-pg-secret`):
| Переменная | Ключ секрета | Примечание |
| --- | --- | --- |
| `DATABASE_PORT` | `port` | |
| `DATABASE_HOST` | `host` | |
| `DATABASE_USER` | `username` | |
| `DATABASE_PASSWORD` | `password` | |
| `DATABASE_NAME` | `database` | |
| `YC-PG-CERTIFICATE` | `ca.crt` | CA-сертификат PostgreSQL; также монтируется файлом в `/root/.postgresql/root.crt` |
## Минимальный набор для локального запуска
Для запуска через `docker-compose` в файле `.env` достаточно задать (см. `.env.example`):
- `POSTGRES_PASSWORD` — для контейнера БД
- `DATABASE_*` — параметры подключения к БД
- `BUCKET_NAME`, `YANDEX_S3_VERIFY`
- `YANDEX_S3_ACCOUNT_PATH` **или** напрямую `YANDEX_S3_ENDPOINT_URL` + `YANDEX_S3_ACCESS_KEY_ID` + `YANDEX_S3_SECRET_ACCESS_KEY`

View File

@ -49,10 +49,19 @@ spec:
[ -f /vault/secrets/attachments-db ] && . /vault/secrets/attachments-db
[ -f /vault/secrets/attachments-s3 ] && . /vault/secrets/attachments-s3
set +a
mkdir -p /etc/sarex/yc-s3-storage
cat > /etc/sarex/yc-s3-storage/yc-s3-service-account.json <<EOF
{
"endpoint": "${YANDEX_S3_ENDPOINT_URL}",
"access_key_id": "${YANDEX_S3_ACCESS_KEY_ID}",
"secret_access_key": "${YANDEX_S3_SECRET_ACCESS_KEY}",
"use_ssl": ${YANDEX_S3_USE_SSL}
}
EOF
exec /opt/attachments/entrypoint.sh
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/attachments:feature_6238c882
_default: cr.yandex/crp3ccidau046kdj8g9q/att9:dev
pullPolicy:
_default: IfNotPresent
service:
@ -76,6 +85,9 @@ spec:
- name: POSTGRES_POOL_SIZE
value:
_default: "10"
- name: YANDEX_S3_ACCOUNT_PATH
value:
_default: "/etc/sarex/yc-s3-storage/yc-s3-service-account.json"
- name: API_ADDRESS
value:
_default: 0.0.0.0:8000
@ -87,12 +99,12 @@ spec:
vault.hashicorp.com/agent-pre-populate-only: "true"
vault.hashicorp.com/auth-path: auth/kubernetes
vault.hashicorp.com/role: attachments
vault.hashicorp.com/agent-inject-secret-attachments-db: secrets/data/postgresql/apps/attachments
vault.hashicorp.com/agent-inject-secret-attachments-db: secrets/data/apps/attachments/postgres
vault.hashicorp.com/agent-inject-template-attachments-db: |-
{{- with secret "secrets/data/postgresql/apps/attachments" -}}
DATABASE_HOST=postgresql.attachments.svc.cluster.local
DATABASE_PORT=5432
DATABASE_NAME=attachments_db
{{- with secret "secrets/data/apps/attachments/postgres" -}}
DATABASE_HOST={{ index .Data.data "host" }}
DATABASE_PORT={{ index .Data.data "port" }}
DATABASE_NAME={{ index .Data.data "database" }}
DATABASE_USER={{ index .Data.data "username" }}
DATABASE_PASSWORD={{ index .Data.data "password" }}
DATABASE_SSL_MODE=disable
@ -103,7 +115,7 @@ spec:
YANDEX_S3_ENDPOINT_URL=minio.minio:9000
YANDEX_S3_ACCESS_KEY_ID={{ index .Data.data "access_key" }}
YANDEX_S3_SECRET_ACCESS_KEY={{ index .Data.data "secret_key" }}
YANDEX_S3_USE_SSL=false
YANDEX_S3_USE_SSL=true
YANDEX_S3_REGION=ru-central
YANDEX_S3_VERIFY=false
BUCKET_NAME=attachments

View File

@ -3,4 +3,5 @@ apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: attachments
resources:
- namespace.yaml
- helmrelease.yaml

View File

@ -0,0 +1,8 @@
---
apiVersion: v1
kind: Namespace
metadata:
name: attachments
labels:
istio-injection: enabled
security.deckhouse.io/pod-policy: privileged

View File

@ -0,0 +1,11 @@
---
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: attachments
resources:
- ../base
patches:
- path: patch.yaml
target:
kind: HelmRelease
name: attachments

View File

@ -0,0 +1,35 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: attachments
namespace: attachments
spec:
values:
services:
attachments:
podAnnotations:
_default:
vault.hashicorp.com/auth-path: auth/kubernetes
vault.hashicorp.com/role: attachments
vault.hashicorp.com/agent-inject-secret-attachments-db: secrets/data/apps/attachments/postgres
vault.hashicorp.com/agent-inject-template-attachments-db: |-
{{- with secret "secrets/data/apps/attachments/postgres" -}}
DATABASE_HOST={{ index .Data.data "host" }}
DATABASE_PORT={{ index .Data.data "port" }}
DATABASE_NAME={{ index .Data.data "database" }}
DATABASE_USER={{ index .Data.data "username" }}
DATABASE_PASSWORD={{ index .Data.data "password" }}
DATABASE_SSL_MODE=disable
{{- end -}}
vault.hashicorp.com/agent-inject-secret-attachments-s3: secrets/data/minio/apps/attachments
vault.hashicorp.com/agent-inject-template-attachments-s3: |-
{{- with secret "secrets/data/minio/apps/attachments" -}}
YANDEX_S3_ENDPOINT_URL=s3.uralmine.com
YANDEX_S3_ACCESS_KEY_ID={{ index .Data.data "access_key" }}
YANDEX_S3_SECRET_ACCESS_KEY={{ index .Data.data "secret_key" }}
YANDEX_S3_USE_SSL=true
YANDEX_S3_REGION=ru-central
YANDEX_S3_VERIFY=false
BUCKET_NAME=sarex-attachments-storage
{{- end -}}

View File

@ -0,0 +1,44 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: attachments
namespace: attachments
spec:
values:
services:
attachments:
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/attachments:0.0.9
envs:
- name: DATABASE_HOST
value:
_default: postgres-service.attachments.svc.cluster.local
- name: DATABASE_PORT
value:
_default: '5432'
- name: DATABASE_NAME
value:
_default: attachments
- name: POSTGRES_POOL_SIZE
value:
_default: '10'
- name: API_ADDRESS
value:
_default: 0.0.0.0:8000
- name: DATABASE_SSL_MODE
value:
_default: disable
- name: YANDEX_S3_VERIFY
value:
_default: 'False'
- name: YANDEX_S3_USE_SSL
value:
_default: 'False'
- name: YANDEX_S3_ACCOUNT_PATH
value:
_default: /etc/sarex/yc-s3-storage/yc-s3-service-account.json
- name: BUCKET_NAME
value:
_default: attachments

View File

@ -0,0 +1,11 @@
---
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: attachments
resources:
- ../base
patches:
- path: attachments.yaml
target:
kind: HelmRelease
name: attachments

View File

@ -0,0 +1,144 @@
---
# standalone HelmRelease по образцу apps/attachments/wb/backend.yaml — base
# vault-native, а в ugok Vault не используется. Command/args/serviceAccount
# из base не нужны и не нужны были даже вживую: реальный дамп кластера
# показывает, что контейнер стартует штатным entrypoint'ом образа без
# обёртки и без выделенного serviceAccount, а креды S3 монтируются
# напрямую секретом attachments-s3-secret (не генерируются скриптом).
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: attachments
namespace: attachments
spec:
interval: 10m
chart:
spec:
chart: universal-chart
version: "0.1.9"
sourceRef:
kind: HelmRepository
name: yc-oci-charts
namespace: flux-system
interval: 10m
install:
remediation:
retries: 3
upgrade:
remediation:
retries: 3
values:
global:
env: _default
services:
attachments:
enabled: true
image:
name:
_default: 10.4.10.187:80/library/att9:dev
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: attachments
replicaCount:
_default: 1
port:
_default: 8000
probes:
liveness:
enabled: false
readiness:
enabled: false
service:
enabled: true
name:
_default: attachments-service
type:
_default: ClusterIP
port:
_default: 8000
targetPort:
_default: 8000
portName:
_default: http
volumes:
_default:
- name: attachments-s3-secret
mountPath:
_default: /etc/sarex/yc-s3-storage
readOnly:
_default: true
secret:
secretName:
_default: attachments-s3-secret
envs:
- name: POSTGRES_POOL_SIZE
value:
_default: "10"
- name: API_ADDRESS
value:
_default: 0.0.0.0:8000
- name: YANDEX_S3_ACCOUNT_PATH
value:
_default: /etc/sarex/yc-s3-storage/yc-s3-service-account.json
- name: BUCKET_NAME
value:
_default: attachments-storage
- name: DATABASE_SSL_MODE
value:
_default: disable
- name: YANDEX_S3_VERIFY
value:
_default: "false"
- name: YANDEX_S3_USE_SSL
value:
_default: "true"
secretEnvs:
- name: DATABASE_HOST
secretName:
_default: attachments-postgresql-secret
secretKey: host
- name: DATABASE_PORT
secretName:
_default: attachments-postgresql-secret
secretKey: port
- name: DATABASE_NAME
secretName:
_default: attachments-postgresql-secret
secretKey: database
- name: DATABASE_USER
secretName:
_default: attachments-postgresql-secret
secretKey: username
- name: DATABASE_PASSWORD
secretName:
_default: attachments-postgresql-secret
secretKey: password
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

View File

@ -0,0 +1,7 @@
---
# Не наследуем base (vault-native) — см. комментарий в backend.yaml.
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: attachments
resources:
- backend.yaml

View File

@ -0,0 +1,166 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: attachments
namespace: attachments
spec:
interval: 10m
chart:
spec:
chart: universal-chart
version: "0.1.7"
sourceRef:
kind: HelmRepository
name: yc-oci-charts
namespace: flux-system
interval: 10m
install:
remediation:
retries: 3
upgrade:
remediation:
retries: 3
values:
global:
env: _default
services:
attachments:
enabled: true
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/att9:dev
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: attachments
replicaCount:
_default: 1
port:
_default: 8000
resources:
limits:
cpu:
_default: 63m
memory:
_default: 205Mi
requests:
cpu:
_default: 10m
memory:
_default: 164Mi
probes:
liveness:
enabled: false
readiness:
enabled: false
service:
enabled: true
name:
_default: attachments-service
type:
_default: ClusterIP
port:
_default: 8000
targetPort:
_default: 8000
portName:
_default: http
imagePullSecrets:
enabled:
_default: true
name:
_default: dockerhub
volumes:
_default:
- name: yc-s3
mountPath:
_default: /etc/sarex/yc-s3-storage
readOnly:
_default: true
secret:
secretName:
_default: yc-s3
envs:
- name: POSTGRES_POOL_SIZE
value:
_default: "10"
- name: API_ADDRESS
value:
_default: "0.0.0.0:8000"
- name: YANDEX_S3_ACCOUNT_PATH
value:
_default: "/etc/sarex/yc-s3-storage/yc-s3-service-account.json"
- name: BUCKET_NAME
value:
_default: "attachments-storage"
- name: DATABASE_SSL_MODE
value:
_default: "disable"
- name: YANDEX_S3_VERIFY
value:
_default: "false"
- name: YANDEX_S3_USE_SSL
value:
_default: "false"
secretEnvs:
- name: DATABASE_HOST
secretName:
_default: "postgres-secret"
secretKey: "host"
- name: DATABASE_PORT
secretName:
_default: "postgres-secret"
secretKey: "port"
- name: DATABASE_NAME
secretName:
_default: "postgres-secret"
secretKey: "database"
- name: DATABASE_USER
secretName:
_default: "postgres-secret"
secretKey: "username"
- name: DATABASE_PASSWORD
secretName:
_default: "postgres-secret"
secretKey: "password"
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

View File

@ -1,6 +1,6 @@
---
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: measurements
namespace: attachments
resources:
- backend.yaml

View File

@ -9,7 +9,7 @@ spec:
chart:
spec:
chart: postgresql-contour
version: "17.0.7"
version: "13.0.15"
sourceRef:
kind: HelmRepository
name: yc-oci-charts
@ -44,7 +44,7 @@ spec:
image:
registry: cr.yandex/crp3ccidau046kdj8g9q
repository: contour/postgresql
tag: 17.0.7
tag: 13.0.15
pullPolicy: Always
metrics:
enabled: false
@ -103,7 +103,7 @@ spec:
contour:
enabled: true
adminUser: "postgres"
sharedPreloadLibraries: "pg_stat_statements"
sharedPreloadLibraries: ""
vault:
enabled: true
role: postgresql
@ -116,6 +116,7 @@ spec:
user: attachments
passwordKey: attachments
extensions: []
restoreFromDump: false
restoreFromDump: true
dumpKey: "sanitized_dumps_multi/attachments/288/attachments_company288_20260626T202844Z.tar.gz"
s3-proxy:
endpointUrl: "s3-proxy-service.postgresql.svc.cluster.local"

View File

@ -0,0 +1,15 @@
# auth-flow-frontend — переменные СБОРКИ (build-time), НЕ рантайм-.env.
# Приложение не читает .env: значения подставляются в код на этапе сборки
# через webpack DefinePlugin (см. webpack.config.ts) или Dockerfile --build-arg / CI BUILD_ARGS.
# Окружение сборки: local | stage | prod | preprod | contour
# local -> mode=development, isDev=true (доступны dev-роуты /login, /logout, /)
# остальные -> mode=production
ENDPOINT=local
# Токен приватного npm-реестра @sarex-team (nexus.infra.sarex.io), нужен для `npm i` (.npmrc)
NPM_NEXUS_TOKEN=
# NOTE: IS_DEV вычисляется автоматически (ENDPOINT === 'local'), задавать вручную не нужно.
# NOTE: authority и client_id OIDC (Zitadel) НЕ задаются здесь — хостовое приложение
# кладёт их в localStorage (STORAGE.AUTHORITY / STORAGE.CLIENT_ID) во время работы.

View File

@ -0,0 +1,162 @@
# Конфигурация проекта auth-flow-frontend
Документ описывает способы конфигурирования микрофронтенда аутентификации `auth-flow-frontend` (React + webpack), а также все переменные сборки, деплоя и рантайма.
## Способы конфигурирования
В отличие от бэкенд-сервисов, приложение **не читает `.env` и не использует dotenv**. Это статический фронтенд, собираемый webpack, поэтому конфигурация распределена по трём уровням:
1. **Сборка (build-time).** Переменная `ENDPOINT` определяет окружение. Её значение подставляется в код на этапе сборки через `webpack.DefinePlugin` (`webpack.config.ts`) — заменяет обращения `process.env.ENDPOINT` и `process.env.IS_DEV` на строковые литералы. Выбор режима (`development`/`production`) и флага `isDev` выполняется в `webpack/build.config.ts`.
2. **Установка зависимостей.** Пакеты `@sarex-team/*` тянутся из приватного npm-реестра (`.npmrc` → `nexus.infra.sarex.io`). Для доступа нужен токен `NPM_NEXUS_TOKEN`.
3. **Рантайм (runtime).** Параметры OIDC-провайдера — `authority` и `client_id` — читаются из `localStorage` (`src/config/zitadel.ts`) по ключам `STORAGE.AUTHORITY` и `STORAGE.CLIENT_ID` из `@sarex-team/sdk-js`. Их задаёт хостовое приложение, а не сборка.
Источники переменных по способам запуска:
| Способ запуска | Откуда берутся переменные |
| --- | --- |
| Локально (dev) | `npm run dev``ENDPOINT=local webpack serve`. Dev-сервер на `https://localhost:9000` |
| Локально (build) | `npm run build``webpack --config webpack.config.ts` (по умолчанию `ENDPOINT=prod`, см. `build.config.ts`) |
| Docker | `Dockerfile`: build-args `ENDPOINT` и `NPM_NEXUS_TOKEN`; сборка dist → отдача через nginx |
| Kubernetes (Helm) | `.helm/values.yaml` (чарт `universal-chart`): блок `services.frontend`, `global.env` |
| CI/CD (GitLab) | `.gitlab-ci.yml`: `workflow.rules` (ветка/тег → `STAND`, `ENDPOINT`, `CHART_VERSION`), `BUILD_ARGS`, `HELM_SET_ARGS` |
## Переменные сборки (build-time)
Подставляются в код на этапе сборки; в рантайме это уже константы.
| Переменная | Тип | Значение по умолчанию | Назначение |
| --- | --- | --- | --- |
| `ENDPOINT` | enum | `prod``build.config.ts`, если не задана) | Окружение сборки: `local`/`stage`/`prod`/`preprod`/`contour`. Определяет `mode` (`development` для `local`, иначе `production`) и `isDev` |
| `IS_DEV` | bool | — (вычисляется) | `true`, если `ENDPOINT === 'local'`. Включает dev-роуты (`/login`, `/logout`, `/`). Задаётся автоматически через `DefinePlugin`, вручную указывать не нужно |
| `NPM_NEXUS_TOKEN` | string | — | Токен авторизации в приватном npm-реестре `@sarex-team` (`.npmrc`). Обязателен для `npm i` |
> `mode` по окружениям (`webpack/build.config.ts`): `local``development`, `stage`/`prod`/`preprod`/`contour` → `production`. Неизвестное значение `ENDPOINT` приводит к ошибке сборки.
## Переменные рантайма (localStorage)
Читаются в браузере во время работы приложения; задаются хостовым приложением, не сборкой.
| Ключ | Источник | Назначение |
| --- | --- | --- |
| `STORAGE.AUTHORITY` | `@sarex-team/sdk-js` | URL issuer'а Zitadel (`authority` OIDC). Обязателен — при отсутствии `src/config/zitadel.ts` бросает `Error("Authority or client ID is not set")` |
| `STORAGE.CLIENT_ID` | `@sarex-team/sdk-js` | `client_id` OIDC-клиента. Обязателен (та же проверка) |
| `sarex_logout` (`LOGOUT_STORAGE_KEY`) | `src/config/logout.ts` | Состояние логаута между вкладками (`{ logoutAt, owner, reason }`). Снимается только валидным токеном в `setTokensInfo` |
| access / refresh / id токены | `storage` из `@sarex-team/sdk-js` | Устанавливаются в `setTokensInfo` (`storage.setAccessToken`/`setRefreshToken`/`setIdentityToken`) после успешного колбэка |
## Конфигурация OIDC (Zitadel)
Задаётся в `src/config/zitadel.ts` (`configZitadel: ZitadelConfig`), клиент создаётся через `createZitadelAuth`.
| Параметр | Значение | Назначение |
| --- | --- | --- |
| `authority` | из `localStorage` (`STORAGE.AUTHORITY`) | Issuer Zitadel |
| `client_id` | из `localStorage` (`STORAGE.CLIENT_ID`) | Идентификатор клиента |
| `response_type` | `code` | Authorization Code Flow |
| `scope` | `openid profile email offline_access urn:zitadel:iam:user:metadata` | Запрашиваемые области |
| `redirect_uri` | `${window.location.origin}/auth/callback` | URL возврата после логина |
| `post_logout_redirect_uri` | `${window.location.origin}/login` | URL после логаута |
| `redirectMethod` | `replace` | Замена записи в истории браузера |
| `revokeTokensOnSignout` | `false` | Не отзывать токены при выходе |
| `automaticSilentRenew` | `false` | Фоновое обновление токенов выключено |
| `validateSubOnSilentRenew` | `false` | — |
| `silentRequestTimeoutInSeconds` | `100` | Таймаут silent-запроса |
## Роуты приложения
Определены в `src/config/urls.ts`, диспетчеризация в `src/App.tsx`.
| Роут | Константа | Доступность | Назначение |
| --- | --- | --- | --- |
| `/auth/callback` | `CALLBACK` | всегда | Обработка OIDC-колбэка (по умолчанию для неизвестных путей) |
| `/auth/error` | `ERROR` | всегда | Страница ошибки аутентификации |
| `/login` | `LOGIN` | только dev | Dev-страница входа |
| `/logout` | `LOGOUT` | только dev | Dev-страница выхода |
| `/` | `HOME` | только dev | Dev-навигация |
> В production разрешены только `/auth/callback` и `/auth/error` (`ALLOWED_PATHS`); в dev дополнительно `/login`, `/logout`, `/` (`ALLOWED_PATHS_DEV`). Неразрешённый путь заменяется на `/auth/callback` (`history.replaceState`).
## Сборка (webpack)
`webpack.config.ts` + `webpack/build.config.ts`.
| Параметр | Значение | Примечание |
| --- | --- | --- |
| `entry` | `src/index.tsx` | Точка входа |
| `output.path` | `dist/` | |
| `output.filename` | `index.js` | |
| `output.publicPath` | `/` (dev) или `/auth/callback/` (prod) | Зависит от `isDev` |
| loader | `esbuild-loader`, target `es2015` | Для `.tsx?/.jsx?` |
| `devServer` | `https`, `port: 9000`, `hot`, `historyApiFallback`, `open` | Только dev |
| plugins | `HtmlWebpackPlugin` (`public/index.html`), `DefinePlugin` (`ENDPOINT`, `IS_DEV`) | |
Node-версия для разработки: `v20.0.0` (`.nvmrc`; в `package.json` заявлено `v20.0.0`, реальная база образа — `node:20`).
## Docker
`Dockerfile` — двухстадийная сборка.
| Стадия | База | Действия |
| --- | --- | --- |
| build | `cr.yandex/crp3ccidau046kdj8g9q/node:20` | `npm i` (с `NPM_NEXUS_TOKEN`), `npm run build` (с `ENDPOINT`) |
| runtime | `cr.yandex/crp3ccidau046kdj8g9q/nginx:latest` | Копирует `/app/dist/``/dist/`, `nginx/nginx.conf``/etc/nginx/nginx.conf` |
Build-args: `ENDPOINT`, `NPM_NEXUS_TOKEN`.
## Nginx
`nginx/nginx.conf` — отдача статики и healthcheck.
| Локация | Поведение |
| --- | --- |
| `= /auth/callback/index.js` | `alias /dist/index.js` |
| `^~ /auth/callback` | `try_files $uri $uri/ /index.html`; заголовки `Cache-Control: no-store,...`, кеш отключён |
| `= /ping` | `200 {"result": "ok"}` (healthcheck) |
`listen 80`, `root /dist`, логи в stdout/stderr, `gzip on`.
## Helm-чарт (`.helm/values.yaml`)
Деплой через зонтичный чарт `universal-chart` (`oci://cr.yandex/crp3ccidau046kdj8g9q/charts`, версия `0.1.7`; `Chart.yaml` приложения — `auth-flow-frontend` `1.0.0`). Значения задаются с ключами по окружениям (`_default`/`stage`/`preprod`/`production`).
| Параметр | Значение | Назначение |
| --- | --- | --- |
| `global.env` | `stage` (`_default` в файле) | Активное окружение чарта |
| `services.frontend.enabled` | `true` | Включение сервиса |
| `deployment.name._default` | `auth-flow-frontend` | Имя деплоймента |
| `deployment.replicaCount` | `_default: 1`, `production: 2` | Число реплик |
| `deployment.port._default` | `80` | Порт контейнера |
| `deployment.revisionHistoryLimit._default` | `5` | Хранимые ревизии |
| `deployment.resources.requests` | `memory: 128Mi`, `cpu: 100m` | Реквесты ресурсов |
| `deployment.probes.liveness/readiness` | `httpGet` `/` : `80` | Пробы |
| `image.name._default` | `cr.yandex/crp3ccidau046kdj8g9q/auth-flow-frontend` | Образ |
| `image.pullPolicy._default` | `IfNotPresent` | |
| `imagePullSecrets.name._default` | `dockerhub` (enabled `false`) | Секрет реестра |
| `service` | `ClusterIP`, port/targetPort `80`, portName `http`, имя `auth-flow-frontend-service` | Service |
| `envs` | `[]` | Переменные окружения контейнера (пусто) |
| `volumes._default` | `[]` | Тома |
| `commitSha`/`gitlabUri`/`gitlabJobUrl`/`owner` | заполняются из CI (`owner` по умолчанию `team-abc`) | Метаданные |
## CI (`.gitlab-ci.yml`)
Подключает общие шаблоны `generic/common-ci` (`common-security-scan.yaml`, `universal-pipeline.yaml` ref `apps-business`).
Базовые переменные: `SERVICE_NAME=auth-flow-frontend`, `DOCKERFILE_PATH=./Dockerfile`, `CI_TRIGGER_SOURCE=app`.
Переключение окружения по `workflow.rules`:
| Условие | STAND | ENDPOINT | CHART_VERSION | K8S_HUSTLER_BRANCH |
| --- | --- | --- | --- | --- |
| `merge_request_event` | — | — | — (`ENABLE_BUILD_IMAGE=false`) | — |
| ветка `stage` | `stage` | `stage` | `0.0.1-stage` | `universal-chart-stage` |
| тег (`CI_COMMIT_TAG`) | `production` | `prod` | `0.0.1-prod` | `universal-chart-production` |
> Правило для ветки `master``preprod` присутствует, но **закомментировано**. `NAMESPACE` для всех окружений — `platform`, `RELEASE_NAME`/`CHART_NAME` — `${SERVICE_NAME}`.
`BUILD_ARGS` прокидывают `--build-arg ENDPOINT=<env>` и `--build-arg NPM_NEXUS_TOKEN=${NPM_NEXUS_TOKEN}`. `HELM_SET_ARGS` устанавливают `universal-chart.services.frontend.image.name.<env>`, `global.env`, а также `commitSha`, `gitlabUri`, `gitlabJobUrl`, `owner`.
## Замечания и потенциальные проблемы
- **Обязательные runtime-параметры.** Если в `localStorage` нет `AUTHORITY` или `CLIENT_ID`, `src/config/zitadel.ts` бросает ошибку при инициализации — приложение не стартует. Эти значения должен положить хостовый сервис до загрузки микрофронтенда.
- **Нет `.env`.** Приложение не читает dotenv; `process.env.ENDPOINT`/`IS_DEV` существуют только на этапе сборки (замена через `DefinePlugin`). Значение `ENDPOINT` задаётся только через CLI/`--build-arg`/CI.
- **publicPath в prod**`/auth/callback/`: приложение обслуживается nginx под префиксом `/auth/callback`, что согласовано с `redirect_uri` OIDC.
- **`silentRenew` отключён** намеренно (`automaticSilentRenew: false`) — обновление токенов не выполняется в фоне.

View File

@ -0,0 +1,80 @@
# Эндпоинты, с которыми взаимодействует auth-flow-frontend
Документ описывает внешние эндпоинты, внутренние роуты и каналы межвкладочной коммуникации микрофронтенда аутентификации `auth-flow-frontend`.
## Как устроено взаимодействие
Приложение отвечает только за аутентификацию по протоколу **OIDC (Authorization Code Flow + PKCE)**. Прямых REST-запросов к бэкенд-сервисам Sarex у него **нет** — всё сетевое взаимодействие идёт с провайдером идентификации **Zitadel** через обёртку `@sarex-team/sdk-js/zitadel` (поверх `oidc-client`).
Клиент создаётся в `src/config/zitadel.ts` (`createZitadelAuth(configZitadel)`). Базовый адрес провайдера (`authority`, issuer) и `client_id` берутся из `localStorage` во время работы, а не задаются сборкой. OIDC-клиент сам находит конкретные эндпоинты issuer'а через discovery-документ `/.well-known/openid-configuration`.
## Провайдер идентификации (Zitadel) по окружениям
Фактический `authority` подставляется хостовым приложением через `localStorage` (`STORAGE.AUTHORITY`) — в самом `auth-flow-frontend` хосты не захардкожены. Ниже — известные для платформы Sarex значения (справочно):
| Окружение | `authority` (issuer) |
| --- | --- |
| `stage` | `https://idp.dev.stage.sarex.io` |
| `prod` | `https://login.sarex.io` |
## OIDC-эндпоинты провайдера
Обнаруживаются через discovery и вызываются `oidc-client` относительно `authority`. Итоговые пути определяются метаданными issuer'а.
| Эндпоинт (метаданные) | Метод | Где инициируется | Назначение |
| --- | --- | --- | --- |
| `/.well-known/openid-configuration` | GET | инициализация `UserManager` | Discovery метаданных провайдера |
| `authorization_endpoint` | GET (redirect) | `LoginPage``zitadel.authorize()` | Старт авторизации, редирект на форму входа |
| `token_endpoint` | POST | `AuthCallbackPage``zitadel.userManager.signinCallback()` | Обмен `code` → access/refresh/id токены |
| `jwks_uri` | GET | `oidc-client` | Ключи для проверки подписи токенов |
| `userinfo_endpoint` | GET | `oidc-client` (при необходимости) | Профиль пользователя |
| `end_session_endpoint` | GET (redirect) | `LogoutPage``zitadel.signout()` | Завершение сессии (логаут) |
Параметры OIDC-запросов (из `configZitadel`):
- `response_type`: `code`
- `scope`: `openid profile email offline_access urn:zitadel:iam:user:metadata`
- `redirect_uri`: `${window.location.origin}/auth/callback`
- `post_logout_redirect_uri`: `${window.location.origin}/login`
- `revokeTokensOnSignout`: `false`, `automaticSilentRenew`: `false`
## Внутренние роуты приложения
Диспетчеризация — в `src/App.tsx` по `window.location.pathname` (роуты из `src/config/urls.ts`).
| Роут | Страница | Метод | Назначение |
| --- | --- | --- | --- |
| `/auth/callback` | `AuthCallbackPage` | — | Обработка OIDC-колбэка: `signinCallback()`, установка токенов, рассылка события в `login_channel`. Дефолт для неизвестных путей |
| `/auth/error` | `AuthErrorPage` | — | Отображение ошибки аутентификации (параметры `error`, `error_description`, `state`, `message` из query) |
| `/login` | `LoginPage` (dev) | — | Кнопка входа (`zitadel.authorize()`) |
| `/logout` | `LogoutPage` (dev) | — | Кнопка выхода (`zitadel.signout()`) |
| `/` | `MainPage` (dev) | — | Dev-навигация (login/logout) |
| `/ping` | nginx | GET | Healthcheck, отдаёт `{"result": "ok"}` |
## Поток аутентификации (кратко)
1. `LoginPage` вызывает `zitadel.authorize()` → редирект на `authorization_endpoint` Zitadel.
2. Провайдер возвращает пользователя на `redirect_uri` = `/auth/callback` с `code`.
3. `AuthCallbackPage` вызывает `signinCallback()` → обмен `code` на токены через `token_endpoint`.
4. Токены сохраняются (`setTokensInfo` → `storage.setAccessToken/setRefreshToken/setIdentityToken`), снимается флаг логаута.
5. Результат рассылается остальным вкладкам, происходит закрытие overlay-окна (`window.opener`) или переход на `/` (`HOME`).
6. При ошибке — редирект на `/auth/error` с деталями.
## Межвкладочная и оконная коммуникация
| Канал | Ключ / имя | Назначение |
| --- | --- | --- |
| `BroadcastChannel` | `login_channel` | Сообщения `{ type: "login_success" }` и `{ type: "login_error", reason }` между вкладками |
| `localStorage` | `sarex_logout` (`LOGOUT_STORAGE_KEY`) | Состояние логаута между вкладками (`logoutAt`, `owner`, `reason`) |
| window events | `setTokensInfoIntoWindowEvents` (`@sarex-team/sdk-js`) | Оповещение хостового приложения об обновлении токенов (`reason: "auth_callback"`) |
| `window.opener` | — | Режим overlay: после успешного входа окно закрывается (`window.close()`) |
## Обработка ошибок
Логика — в `src/utils/authError.ts`; отображение — `AuthErrorPage`.
- Параметры ошибки читаются из query-строки колбэка: `error`, `error_description`, `state`, `message` (`parseAuthErrorFromSearch`).
- Причина ошибки: `error_description``message``error``"Unknown error"` (`getAuthErrorReason`).
- URL страницы ошибки собирается `buildAuthErrorUrl` (query из непустых параметров, иначе просто `/auth/error`).
- Если контекста ошибки нет — редирект на `/` (`HOME`).
- Пользователю доступны кнопки «Скопировать детали ошибки» (`formatAuthErrorForCopy`) и «Вернуться на форму входа» (`/login`), а также ссылка в поддержку `mailto:support@sarex.io`.

View File

@ -1,33 +0,0 @@
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend
namespace: auth-flow
labels:
app: frontend
spec:
replicas: 1
selector:
matchLabels:
app: frontend
template:
metadata:
labels:
app: frontend
version: stable
spec:
containers:
- name: frontend
image: cr.yandex/crp3ccidau046kdj8g9q/auth-flow-frontend:production_48bec2ff
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
protocol: TCP
resources:
requests:
cpu: 25m
memory: 100Mi
imagePullSecrets:
- name: regcred

View File

@ -0,0 +1,94 @@
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: frontend
namespace: auth-flow
spec:
interval: 10m
chart:
spec:
chart: universal-chart
version: "0.1.7"
sourceRef:
kind: HelmRepository
name: yc-oci-charts
namespace: flux-system
interval: 10m
install:
remediation:
retries: 3
upgrade:
remediation:
retries: 3
values:
global:
env: _default
services:
frontend:
enabled: true
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/auth-flow-frontend:contour_fe9ea2a3
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: frontend
replicaCount:
_default: 1
port:
_default: 80
resources:
requests:
cpu:
_default: 25m
memory:
_default: 100Mi
probes:
liveness:
enabled: false
readiness:
enabled: false
service:
enabled: true
name:
_default: frontend-svc
type:
_default: ClusterIP
port:
_default: 80
targetPort:
_default: 80
portName:
_default: http
imagePullSecrets:
enabled:
_default: true
name:
_default: regcred
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

View File

@ -4,5 +4,4 @@ kind: Kustomization
namespace: auth-flow
resources:
- namespace.yaml
- deployment.yaml
- service.yaml
- helmrelease.yaml

View File

@ -1,15 +0,0 @@
---
apiVersion: v1
kind: Service
metadata:
name: frontend-svc
namespace: reviews
spec:
type: ClusterIP
selector:
app: frontend
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP

View File

@ -0,0 +1,10 @@
---
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../base
patches:
- path: namespace.yaml
target:
kind: Namespace
name: auth-flow

View File

@ -0,0 +1,8 @@
---
apiVersion: v1
kind: Namespace
metadata:
name: auth-flow
labels:
istio-injection: enabled
security.deckhouse.io/pod-policy: privileged

View File

@ -6,5 +6,5 @@ resources:
patches: []
# - path: replicas.yaml
# target:
# kind: Deployment
# kind: HelmRelease
# name: frontend

View File

@ -1,8 +1,13 @@
---
apiVersion: apps/v1
kind: Deployment
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: frontend
namespace: reviews
namespace: auth-flow
spec:
replicas: 1
values:
services:
frontend:
deployment:
replicaCount:
_default: 1

192
apps/bi/base/backend.yaml Normal file
View File

@ -0,0 +1,192 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: bi-backend
namespace: bi
spec:
interval: 10m
chart:
spec:
chart: universal-chart
version: "0.1.9"
sourceRef:
kind: HelmRepository
name: yc-oci-charts
namespace: flux-system
interval: 10m
install:
remediation:
retries: 3
upgrade:
remediation:
retries: 3
values:
global:
env: _default
services:
main:
enabled: true
serviceAccount:
enabled:
_default: true
name:
_default: bi-vault
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/bi-backend:production_37902c73
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: bi-backend
replicaCount:
_default: 1
port:
_default: 8000
command:
_default: ["/bin/sh", "-ec"]
args:
_default:
- |
set -a
[ -f /vault/secrets/bi-db ] && . /vault/secrets/bi-db
[ -f /vault/secrets/bi-jwt ] && . /vault/secrets/bi-jwt
set +a
exec /opt/entrypoint.sh
resources:
requests:
cpu:
_default: 500m
memory:
_default: 1Gi
probes:
liveness:
enabled: false
readiness:
enabled: false
service:
enabled: true
name:
_default: bi-backend-service
type:
_default: ClusterIP
port:
_default: 80
targetPort:
_default: 8000
portName:
_default: http
imagePullSecrets:
enabled:
_default: true
name:
_default: regcred
envs:
- name: SETTINGS_DEBUG
value:
_default: "0"
- name: SETTINGS_VERIFY_SSL
value:
_default: "1"
- name: SETTINGS_API_V1_PREFIX
value:
_default: "/api/v1"
- name: AUTH_HOST
value:
_default: "https://lk.sarex.io"
- name: WORKER_TIMEOUT
value:
_default: "120"
- name: PYTHONPATH
value:
_default: "src"
- name: ISSUES_SERVICE_HOST
value:
_default: "http://sarex-issues-service.issues-prod"
- name: EAV_SERVICE_HOST
value:
_default: "http://eav-service.eav-prod"
- name: PM_SERVICE_HOST
value:
_default: "http://pm-backend-service.pm-prod:8000"
- name: SUPERSET_SYSTEM_WIDGETS
value:
_default: '{"MDR": {"id": "e7343f21-1ee0-4a87-b712-e8cfd413cc49","name": "MDR"},"SC": {"id": "d63d25e4-eab6-452f-8b31-065094bc2cb6","name": "Стройконтроль"}}'
- name: SUPERSET_DOCUMENTATION_URL
value:
_default: "https://lk.sarex.io/documentations/"
- name: KAFKA_BOOTSTRAP_SERVERS
value:
_default: '["localhost:9091"]'
- name: KAFKA_TOPICS
value:
_default: '{"planning": "message-hub-prod"}'
- name: KAFKA_ENABLE
value:
_default: "0"
podAnnotations:
_default:
traffic.sidecar.istio.io/excludeOutboundPorts: "8200"
vault.hashicorp.com/agent-init-first: "true"
vault.hashicorp.com/agent-inject: "true"
vault.hashicorp.com/agent-pre-populate-only: "true"
vault.hashicorp.com/auth-path: auth/kubernetes
vault.hashicorp.com/role: bi
vault.hashicorp.com/agent-inject-secret-bi-db: secrets/data/apps/bi/postgres
vault.hashicorp.com/agent-inject-template-bi-db: |-
{{- with secret "secrets/data/apps/bi/postgres" -}}
DB_HOST={{ index .Data.data "host" }}
DB_PORT={{ index .Data.data "port" }}
DB_DATABASE={{ index .Data.data "database" }}
DB_USERNAME={{ index .Data.data "username" }}
DB_PASSWORD={{ index .Data.data "password" }}
{{- end -}}
vault.hashicorp.com/agent-inject-secret-bi-jwt: secrets/data/vault/apps/bi
vault.hashicorp.com/agent-inject-template-bi-jwt: |-
{{- with secret "secrets/data/vault/apps/bi" -}}
SUPERSET_JWT_SECRET={{ index .Data.data "SUPERSET_JWT_SECRET" }}
{{- end -}}
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

127
apps/bi/base/frontend.yaml Normal file
View File

@ -0,0 +1,127 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: bi-frontend
namespace: bi
spec:
interval: 10m
chart:
spec:
chart: universal-chart
version: "0.1.9"
sourceRef:
kind: HelmRepository
name: yc-oci-charts
namespace: flux-system
interval: 10m
install:
remediation:
retries: 3
upgrade:
remediation:
retries: 3
values:
global:
env: _default
services:
frontend:
enabled: true
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/bi-frontend:contour_9cfd1a0b
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: bi-frontend
replicaCount:
_default: 1
port:
_default: 80
resources:
requests:
cpu:
_default: 100m
memory:
_default: 128Mi
probes:
liveness:
enabled:
_default: true
type:
_default: httpGet
httpGet:
path:
_default: /
port:
_default: 80
initialDelaySeconds:
_default: 10
periodSeconds:
_default: 60
timeoutSeconds:
_default: 1
failureThreshold:
_default: 3
readiness:
enabled:
_default: true
type:
_default: httpGet
httpGet:
path:
_default: /
port:
_default: 80
initialDelaySeconds:
_default: 10
periodSeconds:
_default: 30
timeoutSeconds:
_default: 1
failureThreshold:
_default: 3
service:
enabled: true
name:
_default: bi-frontend-frontend-svc
type:
_default: ClusterIP
port:
_default: 80
targetPort:
_default: 80
portName:
_default: http
imagePullSecrets:
enabled:
_default: true
name:
_default: regcred
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

View File

@ -0,0 +1,8 @@
---
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: bi
resources:
- namespace.yaml
- backend.yaml
- frontend.yaml

View File

@ -2,6 +2,6 @@
apiVersion: v1
kind: Namespace
metadata:
name: control-interface
name: bi
labels:
istio-injection: enabled

View File

@ -0,0 +1,191 @@
---
# standalone HelmRelease по образцу apps/bi/ugok — контур brusnika-prod, без Vault.
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: bi-backend
namespace: bi
spec:
interval: 10m
chart:
spec:
chart: universal-chart
version: "0.1.9"
sourceRef:
kind: HelmRepository
name: yc-oci-charts
namespace: flux-system
interval: 10m
install:
remediation:
retries: 3
upgrade:
remediation:
retries: 3
values:
global:
env: _default
services:
main:
enabled: true
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/bi-backend:production_37902c73
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: bi-backend
replicaCount:
_default: 1
port:
_default: 8000
resources:
requests:
cpu:
_default: 100m
memory:
_default: 512Mi
probes:
liveness:
enabled:
_default: true
type:
_default: tcpSocket
tcpSocket:
port:
_default: 8000
initialDelaySeconds:
_default: 20
periodSeconds:
_default: 30
timeoutSeconds:
_default: 3
failureThreshold:
_default: 5
readiness:
enabled:
_default: true
type:
_default: tcpSocket
tcpSocket:
port:
_default: 8000
initialDelaySeconds:
_default: 10
periodSeconds:
_default: 10
timeoutSeconds:
_default: 3
failureThreshold:
_default: 6
service:
enabled: true
name:
_default: bi-backend-service
type:
_default: ClusterIP
port:
_default: 8000
targetPort:
_default: 8000
portName:
_default: http
imagePullSecrets:
enabled:
_default: true
name:
_default: regcred
envs:
- name: SETTINGS_DEBUG
value:
_default: "0"
- name: SETTINGS_VERIFY_SSL
value:
_default: "1"
- name: SETTINGS_API_V1_PREFIX
value:
_default: "/api/v1"
- name: AUTH_HOST
value:
_default: "https://cde.brusnika.ru"
- name: WORKER_TIMEOUT
value:
_default: "120"
- name: PYTHONPATH
value:
_default: "src"
- name: ISSUES_SERVICE_HOST
value:
_default: "http://issues-service.issues.svc.cluster.local"
- name: EAV_SERVICE_HOST
value:
_default: "http://eav-service.eav.svc.cluster.local:8000"
- name: PM_SERVICE_HOST
value:
_default: "http://backend-svc.pm.svc.cluster.local:8000"
- name: SUPERSET_SYSTEM_WIDGETS
value:
_default: '{"MDR": {"id": "e7343f21-1ee0-4a87-b712-e8cfd413cc49","name": "MDR"},"SC": {"id": "d63d25e4-eab6-452f-8b31-065094bc2cb6","name": "Стройконтроль"}}'
- name: SUPERSET_DOCUMENTATION_URL
value:
_default: "https://cde.brusnika.ru/documentations/"
- name: KAFKA_BOOTSTRAP_SERVERS
value:
_default: '["brusnika-stage-kafka-bootstrap.kafka.svc.cluster.local:9093"]'
- name: KAFKA_TOPICS
value:
_default: '{"planning": "message-hub-prod"}'
- name: KAFKA_ENABLE
value:
_default: "0"
- name: DB_HOST
value:
_default: "postgres-service"
- name: DB_PORT
value:
_default: "5432"
- name: DB_DATABASE
value:
_default: "bi_db"
secretEnvs:
- name: DB_USERNAME
secretName:
_default: bi-postgresql-secret
secretKey: username
- name: DB_PASSWORD
secretName:
_default: bi-postgresql-secret
secretKey: password
- name: SUPERSET_JWT_SECRET
secretName:
_default: bi-superset-secret
secretKey: jwt_secret
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

View File

@ -0,0 +1,96 @@
---
# standalone HelmRelease по образцу apps/bi/ugok.
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: bi-frontend
namespace: bi
spec:
interval: 10m
chart:
spec:
chart: universal-chart
version: "0.1.9"
sourceRef:
kind: HelmRepository
name: yc-oci-charts
namespace: flux-system
interval: 10m
install:
remediation:
retries: 3
upgrade:
remediation:
retries: 3
values:
global:
env: _default
services:
frontend:
enabled: true
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/bi-frontend:production_afb137d4
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: bi-frontend
replicaCount:
_default: 1
port:
_default: 80
resources:
requests:
cpu:
_default: 50m
memory:
_default: 64Mi
probes:
liveness:
enabled: false
readiness:
enabled: false
service:
enabled: true
name:
_default: bi-frontend-frontend-svc
type:
_default: ClusterIP
port:
_default: 80
targetPort:
_default: 80
portName:
_default: http
imagePullSecrets:
enabled:
_default: true
name:
_default: regcred
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

View File

@ -0,0 +1,8 @@
---
# Не наследуем base (vault-native) — standalone HelmRelease, как apps/bi/ugok.
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: bi
resources:
- backend.yaml
- frontend.yaml

View File

@ -0,0 +1,191 @@
---
# standalone HelmRelease по образцу apps/bi/ugok — контур brusnika-stage, без Vault.
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: bi-backend
namespace: bi
spec:
interval: 10m
chart:
spec:
chart: universal-chart
version: "0.1.9"
sourceRef:
kind: HelmRepository
name: yc-oci-charts
namespace: flux-system
interval: 10m
install:
remediation:
retries: 3
upgrade:
remediation:
retries: 3
values:
global:
env: _default
services:
main:
enabled: true
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/bi-backend:production_37902c73
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: bi-backend
replicaCount:
_default: 1
port:
_default: 8000
resources:
requests:
cpu:
_default: 100m
memory:
_default: 512Mi
probes:
liveness:
enabled:
_default: true
type:
_default: tcpSocket
tcpSocket:
port:
_default: 8000
initialDelaySeconds:
_default: 20
periodSeconds:
_default: 30
timeoutSeconds:
_default: 3
failureThreshold:
_default: 5
readiness:
enabled:
_default: true
type:
_default: tcpSocket
tcpSocket:
port:
_default: 8000
initialDelaySeconds:
_default: 10
periodSeconds:
_default: 10
timeoutSeconds:
_default: 3
failureThreshold:
_default: 6
service:
enabled: true
name:
_default: bi-backend-service
type:
_default: ClusterIP
port:
_default: 8000
targetPort:
_default: 8000
portName:
_default: http
imagePullSecrets:
enabled:
_default: true
name:
_default: regcred
envs:
- name: SETTINGS_DEBUG
value:
_default: "0"
- name: SETTINGS_VERIFY_SSL
value:
_default: "1"
- name: SETTINGS_API_V1_PREFIX
value:
_default: "/api/v1"
- name: AUTH_HOST
value:
_default: "https://test.sarex.brusnika.tech"
- name: WORKER_TIMEOUT
value:
_default: "120"
- name: PYTHONPATH
value:
_default: "src"
- name: ISSUES_SERVICE_HOST
value:
_default: "http://issues-service.issues.svc.cluster.local"
- name: EAV_SERVICE_HOST
value:
_default: "http://eav-service.eav.svc.cluster.local:8000"
- name: PM_SERVICE_HOST
value:
_default: "http://backend-svc.pm.svc.cluster.local:8000"
- name: SUPERSET_SYSTEM_WIDGETS
value:
_default: '{"MDR": {"id": "e7343f21-1ee0-4a87-b712-e8cfd413cc49","name": "MDR"},"SC": {"id": "d63d25e4-eab6-452f-8b31-065094bc2cb6","name": "Стройконтроль"}}'
- name: SUPERSET_DOCUMENTATION_URL
value:
_default: "https://test.sarex.brusnika.tech/documentations/"
- name: KAFKA_BOOTSTRAP_SERVERS
value:
_default: '["brusnika-stage-kafka-bootstrap.kafka.svc.cluster.local:9093"]'
- name: KAFKA_TOPICS
value:
_default: '{"planning": "message-hub-prod"}'
- name: KAFKA_ENABLE
value:
_default: "0"
- name: DB_HOST
value:
_default: "postgres-service"
- name: DB_PORT
value:
_default: "5432"
- name: DB_DATABASE
value:
_default: "bi_db"
secretEnvs:
- name: DB_USERNAME
secretName:
_default: bi-postgresql-secret
secretKey: username
- name: DB_PASSWORD
secretName:
_default: bi-postgresql-secret
secretKey: password
- name: SUPERSET_JWT_SECRET
secretName:
_default: bi-superset-secret
secretKey: jwt_secret
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

View File

@ -0,0 +1,96 @@
---
# standalone HelmRelease по образцу apps/bi/ugok.
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: bi-frontend
namespace: bi
spec:
interval: 10m
chart:
spec:
chart: universal-chart
version: "0.1.9"
sourceRef:
kind: HelmRepository
name: yc-oci-charts
namespace: flux-system
interval: 10m
install:
remediation:
retries: 3
upgrade:
remediation:
retries: 3
values:
global:
env: _default
services:
frontend:
enabled: true
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/bi-frontend:production_afb137d4
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: bi-frontend
replicaCount:
_default: 1
port:
_default: 80
resources:
requests:
cpu:
_default: 50m
memory:
_default: 64Mi
probes:
liveness:
enabled: false
readiness:
enabled: false
service:
enabled: true
name:
_default: bi-frontend-frontend-svc
type:
_default: ClusterIP
port:
_default: 80
targetPort:
_default: 80
portName:
_default: http
imagePullSecrets:
enabled:
_default: true
name:
_default: regcred
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

View File

@ -0,0 +1,8 @@
---
# Не наследуем base (vault-native) — standalone HelmRelease, как apps/bi/ugok.
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: bi
resources:
- backend.yaml
- frontend.yaml

View File

@ -0,0 +1,66 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: bi-backend
namespace: bi
spec:
values:
services:
main:
envs:
- name: SETTINGS_DEBUG
value:
_default: "0"
- name: SETTINGS_VERIFY_SSL
value:
_default: "1"
- name: SETTINGS_API_V1_PREFIX
value:
_default: "/api/v1"
- name: AUTH_HOST
value:
_default: "https://sarex.uralmine.com"
- name: WORKER_TIMEOUT
value:
_default: "120"
- name: PYTHONPATH
value:
_default: "src"
- name: ISSUES_SERVICE_HOST
value:
_default: "http://backend-svc.issues.svc.cluster.local"
- name: EAV_SERVICE_HOST
value:
_default: "http://backend-svc.eav.svc.cluster.local"
- name: PM_SERVICE_HOST
value:
_default: "http://backend-svc.pm.svc.cluster.local:8000"
- name: SUPERSET_SYSTEM_WIDGETS
value:
_default: '{"MDR": {"id": "e7343f21-1ee0-4a87-b712-e8cfd413cc49","name": "MDR"},"SC": {"id": "d63d25e4-eab6-452f-8b31-065094bc2cb6","name": "Стройконтроль"}}'
- name: SUPERSET_DOCUMENTATION_URL
value:
_default: "https://sarex.uralmine.com/documentations/"
- name: KAFKA_BOOTSTRAP_SERVERS
value:
_default: '["kafka-kafka-contour.kafka.svc.cluster.local:9092"]'
- name: KAFKA_TOPICS
value:
_default: '{"planning": "message-hub-prod"}'
- name: KAFKA_ENABLE
value:
_default: "0"

View File

@ -0,0 +1,14 @@
---
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../base
patches:
- path: namespace.yaml
target:
kind: Namespace
name: bi
- path: backend.yaml
target:
kind: HelmRelease
name: bi-backend

View File

@ -0,0 +1,8 @@
---
apiVersion: v1
kind: Namespace
metadata:
name: bi
labels:
istio-injection: enabled
security.deckhouse.io/pod-policy: privileged

194
apps/bi/ugok/backend.yaml Normal file
View File

@ -0,0 +1,194 @@
---
# standalone HelmRelease по образцу apps/bi/base + apps/eav/ugok — в ugok
# Vault не используется, поэтому не наследуем base (vault-native), а собираем
# отдельный HelmRelease с обычными secretEnvs, без serviceAccount /
# podAnnotations / vault-обёртки в command/args.
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: bi-backend
namespace: bi
spec:
interval: 10m
chart:
spec:
chart: universal-chart
version: "0.1.9"
sourceRef:
kind: HelmRepository
name: yc-oci-charts
namespace: flux-system
interval: 10m
install:
remediation:
retries: 3
upgrade:
remediation:
retries: 3
values:
global:
env: _default
services:
main:
enabled: true
image:
name:
_default: 10.4.10.187:80/library/bi-backend:production_37902c73
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: bi-backend
replicaCount:
_default: 1
port:
_default: 8000
resources:
requests:
cpu:
_default: 100m
memory:
_default: 512Mi
probes:
liveness:
enabled:
_default: true
type:
_default: tcpSocket
tcpSocket:
port:
_default: 8000
initialDelaySeconds:
_default: 20
periodSeconds:
_default: 30
timeoutSeconds:
_default: 3
failureThreshold:
_default: 5
readiness:
enabled:
_default: true
type:
_default: tcpSocket
tcpSocket:
port:
_default: 8000
initialDelaySeconds:
_default: 10
periodSeconds:
_default: 10
timeoutSeconds:
_default: 3
failureThreshold:
_default: 6
service:
enabled: true
name:
_default: bi-backend-service
type:
_default: ClusterIP
port:
_default: 8000
targetPort:
_default: 8000
portName:
_default: http
imagePullSecrets:
enabled:
_default: true
name:
_default: regcred
envs:
- name: SETTINGS_DEBUG
value:
_default: "0"
- name: SETTINGS_VERIFY_SSL
value:
_default: "1"
- name: SETTINGS_API_V1_PREFIX
value:
_default: "/api/v1"
- name: AUTH_HOST
value:
_default: "https://sarex.ugok.lan"
- name: WORKER_TIMEOUT
value:
_default: "120"
- name: PYTHONPATH
value:
_default: "src"
- name: ISSUES_SERVICE_HOST
value:
_default: "http://issues-service.issues.svc.cluster.local"
- name: EAV_SERVICE_HOST
value:
_default: "http://eav-service.eav.svc.cluster.local:8000"
- name: PM_SERVICE_HOST
value:
_default: "http://backend-service.pm.svc.cluster.local:8000"
- name: SUPERSET_SYSTEM_WIDGETS
value:
_default: '{"MDR": {"id": "e7343f21-1ee0-4a87-b712-e8cfd413cc49","name": "MDR"},"SC": {"id": "d63d25e4-eab6-452f-8b31-065094bc2cb6","name": "Стройконтроль"}}'
- name: SUPERSET_DOCUMENTATION_URL
value:
_default: "https://sarex.ugok.lan/documentations/"
- name: KAFKA_BOOTSTRAP_SERVERS
value:
_default: '["ugok-prod-kafka-bootstrap.kafka.svc.cluster.local:9093"]'
- name: KAFKA_TOPICS
value:
_default: '{"planning": "message-hub-prod"}'
- name: KAFKA_ENABLE
value:
_default: "0"
- name: DB_HOST
value:
_default: "postgres-service"
- name: DB_PORT
value:
_default: "5432"
- name: DB_DATABASE
value:
_default: "bi_db"
secretEnvs:
- name: DB_USERNAME
secretName:
_default: bi-postgresql-secret
secretKey: username
- name: DB_PASSWORD
secretName:
_default: bi-postgresql-secret
secretKey: password
- name: SUPERSET_JWT_SECRET
secretName:
_default: bi-superset-secret
secretKey: jwt_secret
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

View File

@ -0,0 +1,95 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: bi-frontend
namespace: bi
spec:
interval: 10m
chart:
spec:
chart: universal-chart
version: "0.1.9"
sourceRef:
kind: HelmRepository
name: yc-oci-charts
namespace: flux-system
interval: 10m
install:
remediation:
retries: 3
upgrade:
remediation:
retries: 3
values:
global:
env: _default
services:
frontend:
enabled: true
image:
name:
_default: 10.4.10.187:80/library/bi-frontend:production_afb137d4
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: bi-frontend
replicaCount:
_default: 1
port:
_default: 80
resources:
requests:
cpu:
_default: 50m
memory:
_default: 64Mi
probes:
liveness:
enabled: false
readiness:
enabled: false
service:
enabled: true
name:
_default: bi-frontend-frontend-svc
type:
_default: ClusterIP
port:
_default: 80
targetPort:
_default: 80
portName:
_default: http
imagePullSecrets:
enabled:
_default: true
name:
_default: regcred
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

View File

@ -0,0 +1,9 @@
---
# Не наследуем base (vault-native) — в ugok Vault не используется.
# Отдельные standalone HelmRelease с обычными secretEnvs.
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: bi
resources:
- backend.yaml
- frontend.yaml

162
apps/bi/wb/backend.yaml Normal file
View File

@ -0,0 +1,162 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: bi-backend
namespace: bi
spec:
interval: 10m
chart:
spec:
chart: universal-chart
version: "0.1.9"
sourceRef:
kind: HelmRepository
name: yc-oci-charts
namespace: flux-system
interval: 10m
install:
remediation:
retries: 3
upgrade:
remediation:
retries: 3
values:
global:
env: _default
services:
main:
enabled: true
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/bi-backend:production_e607dcc6
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: bi-backend
replicaCount:
_default: 1
port:
_default: 8000
resources:
requests:
cpu:
_default: 500m
memory:
_default: 1Gi
probes:
liveness:
enabled: false
readiness:
enabled: false
service:
enabled: true
name:
_default: bi-backend-svc
type:
_default: ClusterIP
port:
_default: 80
targetPort:
_default: 8000
portName:
_default: http
imagePullSecrets:
enabled:
_default: true
name:
_default: dockerhub
envs:
- name: SETTINGS_DEBUG
value:
_default: "0"
- name: SETTINGS_VERIFY_SSL
value:
_default: "1"
- name: SETTINGS_API_V1_PREFIX
value:
_default: "/api/v1"
- name: AUTH_HOST
value:
_default: "https://srx.wb.ru"
- name: WORKER_TIMEOUT
value:
_default: "120"
- name: PYTHONPATH
value:
_default: "src"
- name: ISSUES_SERVICE_HOST
value:
_default: "http://issues-service.issues.svc.cluster.local:80"
- name: EAV_SERVICE_HOST
value:
_default: "http://eav-service.eav.svc.cluster.local:8000"
- name: PM_SERVICE_HOST
value:
_default: "http://pm-backend-service.pm.svc.cluster.local:8000"
- name: SUPERSET_HOST
value:
_default: "https://bi-srx.wb.ru"
- name: SUPERSET_SYSTEM_WIDGETS
value:
_default: '{"MDR":{"id":"29dea0fc-67c0-472f-a580-da5aca52076a","name":"MDR"}}'
- name: SUPERSET_SYSTEM_DASHBOARDS_JSON
value:
_default: '{"MDR": {"id": "29dea0fc-67c0-472f-a580-da5aca52076a", "name": "MDR"}}'
- name: SUPERSET_DOCUMENTATION_URL
value:
_default: "https://srx.wb.ru/documentations/"
secretEnvs:
- name: DB_USERNAME
secretName:
_default: pg-secret
secretKey: user
- name: DB_PASSWORD
secretName:
_default: pg-secret
secretKey: password
- name: DB_DATABASE
secretName:
_default: pg-secret
secretKey: database
- name: DB_HOST
secretName:
_default: pg-secret
secretKey: host
- name: DB_PORT
secretName:
_default: pg-secret
secretKey: port
- name: SUPERSET_JWT_SECRET
secretName:
_default: superset-jwt-secret
secretKey: jwt_secret
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

95
apps/bi/wb/frontend.yaml Normal file
View File

@ -0,0 +1,95 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: bi-frontend
namespace: bi
spec:
interval: 10m
chart:
spec:
chart: universal-chart
version: "0.1.9"
sourceRef:
kind: HelmRepository
name: yc-oci-charts
namespace: flux-system
interval: 10m
install:
remediation:
retries: 3
upgrade:
remediation:
retries: 3
values:
global:
env: _default
services:
static:
enabled: true
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/bi-frontend:contour_9cfd1a0b
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: static
replicaCount:
_default: 1
port:
_default: 80
resources:
requests:
cpu:
_default: 50m
memory:
_default: 64Mi
probes:
liveness:
enabled: false
readiness:
enabled: false
service:
enabled: true
name:
_default: static-service
type:
_default: ClusterIP
port:
_default: 80
targetPort:
_default: 80
portName:
_default: http
imagePullSecrets:
enabled:
_default: true
name:
_default: dockerhub
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

View File

@ -0,0 +1,7 @@
---
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: bi
resources:
- backend.yaml
- frontend.yaml

64
apps/bim/.env.example Normal file
View File

@ -0,0 +1,64 @@
# App
# APP_NAME/APP_VERSION/LOG_LEVEL читаются кодом, но в деплой-envs их обычно не задают
APP_NAME='BIM Backend v2'
APP_VERSION=local
LOG_LEVEL=info
# Адрес прослушивания HTTP API (host:port)
API_ADDRESS=0.0.0.0:5555
# Master-кластер PostgreSQL (BIM id <= LAST_MASTER_BIM)
POSTGRES_ADDRESS=localhost
POSTGRES_PORT=5432
POSTGRES_USER=user
POSTGRES_PASSWORD=password
POSTGRES_DB=bimbackendv2
POSTGRES_POOL_SIZE=10
DB_CERT_PATH=./.docker/yandex_pg.pem
# Slave-1 кластер PostgreSQL (шардирование по BIM id)
POSTGRES_ADDRESS_2=localhost
POSTGRES_PORT_2=5433
POSTGRES_USER_2=user
POSTGRES_PASSWORD_2=password
POSTGRES_DB_2=bimbackendv2
POSTGRES_POOL_SIZE_2=10
DB_CERT_PATH_2=./.docker/yandex_pg.pem
# Slave-2 кластер PostgreSQL (шардирование по BIM id)
POSTGRES_ADDRESS_3=localhost
POSTGRES_PORT_3=5434
POSTGRES_USER_3=user
POSTGRES_PASSWORD_3=password
POSTGRES_DB_3=bimbackendv2
POSTGRES_POOL_SIZE_3=10
DB_CERT_PATH_3=./.docker/yandex_pg.pem
# Границы шардирования BIM id между кластерами
LAST_MASTER_BIM=10
LAST_MASTER_BIM_V3=0
LAST_SLAVE_1_BIM=0
LAST_SLAVE_1_BIM_V3=0
# TLS до PostgreSQL (0 — локально, 1 — в облаке)
ENABLE_SSL=0
# Логировать SQL-запросы (1 — включено)
ENABLE_SQL_QUERY=1
# Внешний Django-бэкенд (проверка прав администратора)
DJANGO_HOST=https://stage.sarex.io
# Режим интеграционных тестов (в этом режиме CheckUserIsAdmin всегда true)
INTEGRATION_TESTS=0
# --- Переменные окружения, не читаемые config.go (инфраструктура/тесты/сборка) ---
# Проброс портов и локальная БД в docker-compose
# API_PORT=5555
# POSTGRES_EXTERNAL_PORT=5432
# POSTGRES_EXTERNAL_PORT_2=5433
# Значения для контейнеров тестов
# TEST_ENV=1
# TEST_BIM=1
# JWT_TEST=<jwt>
# Объявлены в .env, но config.go их не использует
# GRPC_ADDRESS=0.0.0.0
# GRPC_PORT=50051

189
apps/bim/CONFIGURATION.md Normal file
View File

@ -0,0 +1,189 @@
# Конфигурация проекта bim-backend-v2
Документ описывает все переменные окружения и способы конфигурирования сервиса.
## Способы конфигурирования
Сервис настраивается **только через переменные окружения**. Разбор выполняется в `config/config.go` (функция `NewConfig`) через библиотеку [`kelseyhightower/envconfig`](https://github.com/kelseyhightower/envconfig) (структура `Config`).
Особенности разбора:
- **Префикса нет**`envconfig.Process("", &cfg)` вызывается с пустым префиксом, поэтому имена переменных задаются как есть (напр. `POSTGRES_ADDRESS`, `API_ADDRESS`). Имя переменной определяется тегом `envconfig:"..."` у каждого поля.
- Типы приводятся автоматически по типу поля Go (`string`, `int`, `bool`, `uint64`). Для `bool` подходят `1`/`0`/`true`/`false`.
- Ошибка разбора приводит к `panic` при старте (в `NewConfig` `envconfig.Process` завёрнут в `sync.Once`, ошибка не возвращается, а паникует).
- Отсутствующая переменная не является ошибкой — поле получает нулевое значение соответствующего типа (пустая строка, `0`, `false`). Обязательность полей не проверяется.
В отличие от python-сервисов, приложение **загружает `.env` автоматически**: в `cmd/httpserver/main.go` вызывается `godotenv.Load(".env")` (если файла нет — печатается предупреждение и используются переменные окружения процесса).
Отдельного конфиг-файла (yaml/toml) у приложения нет.
Источники переменных по способам запуска:
| Способ запуска | Откуда берутся переменные |
| --- | --- |
| Локально (бинарник) | Файл `.env` в рабочем каталоге (`godotenv.Load`) либо переменные окружения процесса |
| Локально (контейнеры) | `.docker/docker-compose.yml`: `env_file``.docker/.env` + `.docker/.docker.env` |
| Kubernetes (Helm, репозиторий приложения) | `.helm/values-<env>.yaml`: блоки `envs` (обычные значения) и `secrets` (из k8s-секретов); шаблон `.helm/templates/api.yaml` |
| Kubernetes (IaC, этот репозиторий) | `iac/apps/bim/base/backend-deployment.yaml`: блок `env` и секреты из Vault (аннотации `vault.hashicorp.com/*`, шаблон `bim-postgresql`) |
| CI/CD (GitLab) | `.gitlab-ci.yml`: подключение общих пайплайнов `generic/common-ci` и переменные `workflow.rules` по ветке/тегу |
Способы запуска процессов:
| Команда | Точка входа | Назначение |
| --- | --- | --- |
| `httpserver` (`make api` → `go install ./cmd/httpserver`) | `cmd/httpserver/main.go` | HTTP API. При старте применяет миграции (`appmigrations.RunOnStartup`), поднимает `net/http/pprof` на `:8081`, затем запускает API на `API_ADDRESS` |
| `migrations` (`go install ./cmd/migrations`) | `cmd/migrations/main.go` | Отдельный запуск миграций БД |
Порядок запуска в контейнере (`.docker/entrypoint.sh`): запускается `/go/bin/httpserver` (строка запуска миграций закомментирована — миграции выполняются самим приложением на старте). Финальный образ (`.docker/api.dockerfile`) — `scratch` со статически слинкованным бинарником `httpserver` и вшитым CA-сертификатом Postgres (`/root/yandex_pg.pem`).
## Переменные приложения
Ниже перечислены все переменные, читаемые кодом (`config/config.go`). Префикса нет. Дефолт — это нулевое значение типа Go, если переменная не задана.
### App
| Переменная | Тип | Значение по умолчанию | Назначение |
| --- | --- | --- | --- |
| `APP_NAME` | string | `""` | Имя приложения (в коде помечено TODO — в deploy-envs не задаётся) |
| `APP_VERSION` | string | `""` | Версия приложения (TODO — в deploy-envs не задаётся) |
| `LOG_LEVEL` | string | `""` | Уровень логирования, передаётся в `logging.NewLogger` (TODO — в deploy-envs не задаётся) |
| `API_ADDRESS` | string | `""` | Адрес прослушивания HTTP API в формате `host:port` (напр. `0.0.0.0:8080`) |
| `TEST_ENV` | string | `""` | Служебное поле для тестов |
### PostgreSQL
Сервис работает с **тремя** кластерами PostgreSQL (master, slave-1, slave-2). Выбор кластера для конкретного BIM выполняется по его id в `internal/app/http/httpserver.go` (сравнение с `LAST_MASTER_BIM*`/`LAST_SLAVE_1_BIM*`). Строка подключения собирается в `Config.GetPostgresConnectionURL` (`postgres://user:password@addr:port/db`, при `ENABLE_SSL=false` добавляется `?sslmode=disable`).
Master-кластер:
| Переменная | Тип | Назначение |
| --- | --- | --- |
| `POSTGRES_ADDRESS` | string | Хост PostgreSQL (master) |
| `POSTGRES_PORT` | string | Порт PostgreSQL (master) |
| `POSTGRES_USER` | string | Пользователь БД |
| `POSTGRES_PASSWORD` | string | Пароль пользователя БД |
| `POSTGRES_DB` | string | Имя базы данных |
| `POSTGRES_POOL_SIZE` | int | Размер пула соединений |
| `DB_CERT_PATH` | string | Путь к CA-сертификату PostgreSQL (используется при `ENABLE_SSL=1`) |
Slave-1 кластер — те же поля с суффиксом `_2`:
| Переменная | Тип | Назначение |
| --- | --- | --- |
| `POSTGRES_ADDRESS_2` | string | Хост PostgreSQL (slave-1) |
| `POSTGRES_PORT_2` | string | Порт |
| `POSTGRES_USER_2` | string | Пользователь |
| `POSTGRES_PASSWORD_2` | string | Пароль |
| `POSTGRES_DB_2` | string | База данных |
| `POSTGRES_POOL_SIZE_2` | int | Размер пула |
| `DB_CERT_PATH_2` | string | Путь к CA-сертификату |
Slave-2 кластер — те же поля с суффиксом `_3`:
| Переменная | Тип | Назначение |
| --- | --- | --- |
| `POSTGRES_ADDRESS_3` | string | Хост PostgreSQL (slave-2) |
| `POSTGRES_PORT_3` | string | Порт |
| `POSTGRES_USER_3` | string | Пользователь |
| `POSTGRES_PASSWORD_3` | string | Пароль |
| `POSTGRES_DB_3` | string | База данных |
| `POSTGRES_POOL_SIZE_3` | int | Размер пула |
| `DB_CERT_PATH_3` | string | Путь к CA-сертификату |
### Шардирование BIM по кластерам
| Переменная | Тип | Назначение |
| --- | --- | --- |
| `LAST_MASTER_BIM` | uint64 | Верхняя граница id BIM для master-кластера (API v1) |
| `LAST_MASTER_BIM_V3` | uint64 | Верхняя граница id BIM для master-кластера (API v2 / BIM v3) |
| `LAST_SLAVE_1_BIM` | uint64 | Верхняя граница id BIM для slave-1 (API v1) |
| `LAST_SLAVE_1_BIM_V3` | uint64 | Верхняя граница id BIM для slave-1 (API v2 / BIM v3) |
### Прочее
| Переменная | Тип | Значение по умолчанию | Назначение |
| --- | --- | --- | --- |
| `ENABLE_SSL` | bool | `false` | Подключение к PostgreSQL по TLS. При `false` в DSN добавляется `sslmode=disable` |
| `ENABLE_SQL_QUERY` | bool | `false` | Логировать SQL-запросы |
| `DJANGO_HOST` | string | `""` | Базовый URL Django-бэкенда для проверки прав администратора (см. `ENDPOINTS.md`) |
| `INTEGRATION_TESTS` | bool | `false` | Режим интеграционных тестов. При `true` `CheckUserIsAdmin` всегда возвращает `true` |
## Переменные, не читаемые приложением (инфраструктура/сборка/тесты)
Присутствуют в `.docker/.env`, `.docker/.docker.env`, `docker-compose.yml` или Helm, но `config/config.go` их не разбирает.
| Переменная | Где используется | Назначение |
| --- | --- | --- |
| `API_PORT` | `.docker/.env` | Порт API для локального compose |
| `POSTGRES_EXTERNAL_PORT`, `POSTGRES_EXTERNAL_PORT_2` | `docker-compose.yml` | Проброс портов контейнеров Postgres |
| `POSTGRES_ADDRESS2` | `.docker/.docker.env` | Опечатка/легаси (нет суффикса `_`), кодом не читается |
| `GRPC_ADDRESS`, `GRPC_PORT` | `.docker/.env` | Объявлены, но кодом не используются |
| `TEST_BIM`, `JWT_TEST` | `.docker/.env`, `.docker/.docker.env` | Данные для интеграционных тестов |
| `POSTGRES_*_4`, `DB_CERT_PATH_4` | `.helm/values-*.yaml`, IaC `backend-deployment.yaml` | Четвёртый кластер задаётся в деплое, но `config.go` доходит только до суффикса `_3` |
| `LAST_SLAVE_2_BIM(_V3)`, `LAST_SLAVE_3_BIM(_V3)`, `LAST_SLAVE_4_BIM(_V3)` | `.helm/values-*.yaml` | Заданы в values, но кодом не читаются (актуальны только `LAST_MASTER_*` и `LAST_SLAVE_1_*`) |
| `CI_COMMIT_SHORT_SHA` | `.gitlab-ci.yml` (build-arg) | Тег/версия сборки образа |
## Переменные из Helm-чарта приложения (`.helm/values-<env>.yaml`)
Обычные значения задаются в блоке `envs` для каждого окружения (`stage`/`preprod`/`production`) и содержат те же переменные `POSTGRES_*`, `API_ADDRESS`, `DJANGO_HOST`, `ENABLE_SSL`, `ENABLE_SQL_QUERY`, `LAST_*`, что описаны выше (различаются адресами БД, размерами пула, границами шардирования и доменом Django).
Значения из секретов (блок `secrets`, монтируются как env через `secretKeyRef`):
| Переменная | Секрет (`secret_name`) | Ключ (`secret_key`) |
| --- | --- | --- |
| `POSTGRES_USER` | `bim-v2-database-secret` | `username` |
| `POSTGRES_PASSWORD` | `bim-v2-database-secret` | `password` |
| `POSTGRES_USER_2` | `bim-v2-database-secret-2` | `username` |
| `POSTGRES_PASSWORD_2` | `bim-v2-database-secret-2` | `password` |
| `POSTGRES_USER_3` | `bim-v2-database-secret-3` | `username` |
| `POSTGRES_PASSWORD_3` | `bim-v2-database-secret-3` | `password` |
| `POSTGRES_USER_4` | `bim-v2-database-secret-3` | `username` |
| `POSTGRES_PASSWORD_4` | `bim-v2-database-secret-3` | `password` |
Ключевые не-env значения чарта: `api.name`, `api.image`, `api.version`, `api.port` (`8080`), `api.replicas`, `api.service_name`/`api.service_port` (`80`), `api.service_account`, `api.requests.memory`/`cpu`, `api.api_host`, `api.api_host_prefix` (`/bimv2/api/`), `api.api_path` (`/api/`), `api.internal_path` (`/internal/`), `api.permitted_ns` (namespace'ы, которым разрешён доступ к `/internal/*`), `imagePullSecrets`.
Сетевой слой (`.helm/templates/mesh-config.yaml`, Istio):
- `VirtualService` (при `api.virtual_service.enabled`) маршрутизирует `api_host_prefix``api_path`, задаёт CORS (`allowOrigins` — `*.sarex.io` и `localhost`, `allowHeaders` включают `Authorization`, `Content-Type`, `Identity`).
- `AuthorizationPolicy` `routes-v2`: доступ к `/api/*` разрешён только от istio-ingressgateway при наличии claim `token_type=access`; доступ к `/internal/*` — только из namespace'ов `api.permitted_ns`.
## Переменные из IaC-репозитория (`iac/apps/bim/`)
Деплой в этом репозитории (kustomize) устроен иначе, чем чарт приложения:
- `base/backend-deployment.yaml` — Deployment `backend` в namespace `bim`, образ `bim-api`, `containerPort: 8000`, `API_ADDRESS=0.0.0.0:8000`, health-проба `GET /ping`.
- Секреты PostgreSQL инъектируются **из Vault** (аннотации `vault.hashicorp.com/*`, роль `bim`, путь `secrets/data/postgresql/apps/bim`) в файл `/vault/secrets/bim-postgresql`, который экспортируется в окружение перед запуском (`set -a; . /vault/secrets/bim-postgresql; set +a; exec ./httpserver`). Шаблон Vault задаёт `POSTGRES_ADDRESS[_2../_4]`, `POSTGRES_PORT*`, `POSTGRES_DB*` (все указывают на `postgresql.bim.svc.cluster.local:5432`, БД `bim_db`) и `POSTGRES_USER*`/`POSTGRES_PASSWORD*` из Vault.
- Прочие env заданы прямо в манифесте: `LAST_MASTER_BIM`, `LAST_MASTER_BIM_V3`, `LAST_SLAVE_1_BIM`, `POSTGRES_POOL_SIZE`, `DB_CERT_PATH_2/3/4`, `DJANGO_HOST` (`http://backend.django.svc.cluster.local:8000`), `ENABLE_SQL_QUERY=0`, `ENABLE_SSL=0`.
- Оверлеи `brusnika-prod`, `brusnika-stage`, `yc-k8s-test` патчат base (реплики, образ, postgresql).
## Переменные в CI (`.gitlab-ci.yml`)
Пайплайн подключает общие шаблоны `generic/common-ci` (`universal-pipeline-<env>.yaml`, `common-security-scan.yaml`, `common-build.yaml`) и переключает окружение по ветке/тегу через `workflow.rules`:
| Условие | STAND | Namespace |
| --- | --- | --- |
| ветка `master` | `preprod` | `bim-api-preprod` |
| ветка `stage` | `stage` | `bim-api-stage` |
| тег (`CI_COMMIT_TAG`) | `prod` | `bim-api-prod` |
Общие переменные job'ов: `RELEASE_NAME=bim-backend-v2`, `CHART_NAME=bim-backend-v2`, `CHART_VERSION=0.0.1-<stand>`, `IMAGE_PATH=api.image`, `DOCKERFILE_PATH=.docker/api.dockerfile`, `HELM_SET_ARGS=--set api.image=${IMAGE_NAME}`, `BUILD_ARGS=--build-arg CI_COMMIT_SHORT_SHA=...`, флаги `ENABLE_BUILD_CHART`/`ENABLE_BUILD_IMAGE`/`ENABLE_STATE_UPDATE`/`ENABLE_DEPLOY=true`, `ENABLE_LINTER=false`. Стадии: `linter → test → unittest → prebuild-secscan → build → state-update → deploy`.
## Замечания и потенциальные проблемы
- Переменные разбираются **без префикса** (`envconfig.Process("", ...)`) — имена совпадают с тегами `envconfig` полей структуры `Config`.
- Обязательность полей не валидируется: отсутствующая переменная молча получает нулевое значение. Например пустой `API_ADDRESS` приведёт к попытке слушать на `":0"`.
- В коде объявлены только три кластера (`POSTGRES_*`, `_2`, `_3`), тогда как в деплое присутствует и четвёртый (`_4`). Переменные `_4` и дополнительные `LAST_SLAVE_2/3/4_*` в окружении задаются, но приложением не используются.
- Приложение загружает `.env` автоматически (`godotenv.Load(".env")`); при отсутствии файла ошибки нет — берутся переменные процесса.
- В `NewConfig` ошибка `envconfig.Process` не возвращается, а вызывает `panic` (обёрнута в `sync.Once`).
## Минимальный набор для локального запуска
Postgres поднимается через `docker-compose` (`.docker/docker-compose.yml`), приложение — через `make api` и запуск `httpserver`. Минимально необходимо задать (готовые примеры — в `.env.example`):
- `API_ADDRESS`
- Master-кластер: `POSTGRES_ADDRESS`, `POSTGRES_PORT`, `POSTGRES_USER`, `POSTGRES_PASSWORD`, `POSTGRES_DB`, `POSTGRES_POOL_SIZE`
- Slave-кластеры `_2` и `_3` (те же поля) — сервис создаёт соединения ко всем трём при старте
- `ENABLE_SSL=0`, `DB_CERT_PATH*` (при `ENABLE_SSL=1`)
- `DJANGO_HOST`
- `LAST_MASTER_BIM`, `LAST_MASTER_BIM_V3`, `LAST_SLAVE_1_BIM`, `LAST_SLAVE_1_BIM_V3`
- `INTEGRATION_TESTS=0`, `ENABLE_SQL_QUERY` по необходимости

55
apps/bim/ENDPOINTS.md Normal file
View File

@ -0,0 +1,55 @@
# Эндпоинты, с которыми взаимодействует bim-backend-v2
Документ описывает все HTTP-эндпоинты внешних сервисов, к которым обращается сам сервис `bim-backend-v2` (исходящие вызовы). Эндпоинты, которые сервис **предоставляет**, описаны в `openapi.yaml`.
## Как устроено взаимодействие
Исходящие вызовы выполняются HTTP-клиентом на базе [`go-resty/resty`](https://github.com/go-resty/resty) в пакете `pkg/django_client` (`DjangoClient`). Клиент создаётся в `NewRestClient`:
- базовый хост — `SetHostURL(cfg.DjangoHost)` (переменная `DJANGO_HOST`);
- таймаут запроса — `SetTimeout(10 * time.Second)`;
- число повторов — `SetRetryCount(5)`.
Аутентификация проксируется: JWT пользователя извлекается из контекста запроса (`auth.JWTFromContext`), при необходимости отбрасывается схема `Bearer `, и токен передаётся во внешний сервис заголовком `Authorization: Bearer <jwt>` (`SetAuthToken` + `SetAuthScheme("Bearer")`). Заголовок `Content-Type: application/json`.
В режиме интеграционных тестов (`INTEGRATION_TESTS=1`) внешний вызов не выполняется — `CheckUserIsAdmin` возвращает `true`.
## Базовые хосты по сервисам и окружениям
Значение берётся из переменной `DJANGO_HOST` (см. `CONFIGURATION.md`). Итоговый URL = `<DJANGO_HOST>` + `path` эндпоинта.
| Сервис | Назначение | Значение `DJANGO_HOST` |
| --- | --- | --- |
| `django` (Sarex backend) | Проверка прав пользователя (админ/не админ) | локально/`stage`: `https://stage.sarex.io`; `preprod`: `https://lk.preprod.sarex.io`; `prod`: `https://lk.sarex.io`; контур (IaC): `http://backend.django.svc.cluster.local:8000` |
## Эндпоинты по сервисам
### `django` — Sarex backend
| Метод | Путь | Назначение |
| --- | --- | --- |
| GET | `api/client/settings/` | Получить настройки текущего пользователя. Используется поле `is_admin` (проверка прав администратора в `CheckUserIsAdmin`) |
Детали вызова `GET api/client/settings/`:
| Параметр | Значение |
| --- | --- |
| Заголовки | `Authorization: Bearer <jwt пользователя>`, `Content-Type: application/json` |
| Тело запроса | нет |
| Ожидаемый ответ | `{ "is_admin": bool }` (структура `userSettingsFromDjango`) |
| Успешные статусы | `200`, `201` |
| Поведение при ошибке | Любая ошибка транспорта, `resp == nil` или статус вне `200/201` логируется, метод трактует пользователя как **не администратора** (`false`) |
## Где используется
Проверка `CheckUserIsAdmin` вызывается в обработчиках, изменяющих модели статусов (требуют прав администратора). При отсутствии прав такие эндпоинты возвращают `403 No admin rights`:
- `POST /api/v1/bims/{bim_id}/status_model` — создание модели статусов BIM;
- `DELETE /api/v1/bims/{bim_id}/delete_status_model` — удаление модели статусов BIM;
- `POST /api/v1/companies/{company_id}/status_model` — создание модели статусов компании;
- `DELETE /api/v1/companies/{company_id}/status_model` — удаление модели статусов компании.
## Замечания
- Единственная внешняя HTTP-зависимость сервиса — Django-бэкенд (`DJANGO_HOST`). Прочие интеграции (PostgreSQL, pprof) не являются HTTP-вызовами к внешним REST-сервисам.
- Подпись JWT самим сервисом не проверяется — проброшенный токен просто пересылается в Django, который и выполняет авторизацию (см. также раздел «Аутентификация» в `openapi.yaml`).

View File

@ -1,108 +0,0 @@
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend
namespace: bim
labels:
app: backend
spec:
replicas: 1
selector:
matchLabels:
app: backend
template:
metadata:
labels:
app: backend
annotations:
traffic.sidecar.istio.io/excludeOutboundPorts: "8200"
vault.hashicorp.com/agent-init-first: "true"
vault.hashicorp.com/agent-inject: "true"
vault.hashicorp.com/agent-pre-populate-only: "true"
vault.hashicorp.com/auth-path: auth/kubernetes
vault.hashicorp.com/role: bim
vault.hashicorp.com/agent-inject-secret-bim-postgresql: secrets/data/postgresql/apps/bim
vault.hashicorp.com/agent-inject-template-bim-postgresql: |-
{{- with secret "secrets/data/postgresql/apps/bim" -}}
POSTGRES_ADDRESS=postgresql.bim.svc.cluster.local
POSTGRES_ADDRESS_2=postgresql.bim.svc.cluster.local
POSTGRES_ADDRESS_3=postgresql.bim.svc.cluster.local
POSTGRES_ADDRESS_4=postgresql.bim.svc.cluster.local
POSTGRES_PORT=5432
POSTGRES_PORT_2=5432
POSTGRES_PORT_3=5432
POSTGRES_PORT_4=5432
POSTGRES_DB=bim_db
POSTGRES_DB_2=bim_db
POSTGRES_DB_3=bim_db
POSTGRES_DB_4=bim_db
POSTGRES_USER={{ index .Data.data "username" }}
POSTGRES_USER_2={{ index .Data.data "username" }}
POSTGRES_USER_3={{ index .Data.data "username" }}
POSTGRES_USER_4={{ index .Data.data "username" }}
POSTGRES_PASSWORD={{ index .Data.data "password" }}
POSTGRES_PASSWORD_2={{ index .Data.data "password" }}
POSTGRES_PASSWORD_3={{ index .Data.data "password" }}
POSTGRES_PASSWORD_4={{ index .Data.data "password" }}
{{- end -}}
spec:
serviceAccountName: bim-vault
containers:
- name: backend
image: cr.yandex/crp3ccidau046kdj8g9q/bim-api:contour_3d704fef
imagePullPolicy: IfNotPresent
command: ["/bin/sh", "-ec"]
args:
- |
set -a
[ -f /vault/secrets/bim-postgresql ] && . /vault/secrets/bim-postgresql
set +a
exec ./httpserver
ports:
- name: http
containerPort: 8000
protocol: TCP
env:
- name: LAST_MASTER_BIM
value: "100000"
- name: LAST_MASTER_BIM_V3
value: "100000"
- name: DB_CERT_PATH_4
value: /root/yandex_pg.pem
- name: DB_CERT_PATH_3
value: /root/yandex_pg.pem
- name: DB_CERT_PATH_2
value: /root/yandex_pg.pem
- name: LAST_SLAVE_1_BIM
value: "1000000"
- name: POSTGRES_POOL_SIZE
value: "30"
- name: API_ADDRESS
value: 0.0.0.0:8000
- name: DJANGO_HOST
value: http://backend.django.svc.cluster.local:8000
- name: ENABLE_SQL_QUERY
value: "0"
- name: ENABLE_SSL
value: "0"
resources:
requests:
cpu: 25m
memory: 100Mi
livenessProbe:
httpGet:
path: /ping
port: 8000
initialDelaySeconds: 10
periodSeconds: 60
failureThreshold: 10
readinessProbe:
httpGet:
path: /ping
port: 8000
initialDelaySeconds: 5
periodSeconds: 5
failureThreshold: 20
imagePullSecrets:
- name: regcred

View File

@ -1,15 +0,0 @@
---
apiVersion: v1
kind: Service
metadata:
name: backend-svc
namespace: bim
spec:
type: ClusterIP
selector:
app: backend
ports:
- name: http
port: 80
targetPort: 8000
protocol: TCP

222
apps/bim/base/backend.yaml Normal file
View File

@ -0,0 +1,222 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: backend
namespace: bim
spec:
interval: 10m
chart:
spec:
chart: universal-chart
version: "0.1.9"
sourceRef:
kind: HelmRepository
name: yc-oci-charts
namespace: flux-system
interval: 10m
install:
remediation:
retries: 3
upgrade:
remediation:
retries: 3
values:
global:
env: _default
services:
backend:
enabled: true
serviceAccount:
enabled:
_default: true
name:
_default: bim-vault
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/bim-api:contour_f9f2a39-dirty
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: backend
replicaCount:
_default: 1
port:
_default: 8000
command:
_default: ["/bin/sh", "-ec"]
args:
_default:
- |
set -a
[ -f /vault/secrets/bim-postgresql ] && . /vault/secrets/bim-postgresql
set +a
exec ./httpserver
resources:
requests:
cpu:
_default: 25m
memory:
_default: 100Mi
probes:
liveness:
enabled:
_default: true
type:
_default: httpGet
httpGet:
path:
_default: /ping
port:
_default: 8000
initialDelaySeconds:
_default: 10
periodSeconds:
_default: 60
failureThreshold:
_default: 10
readiness:
enabled:
_default: true
type:
_default: httpGet
httpGet:
path:
_default: /ping
port:
_default: 8000
initialDelaySeconds:
_default: 5
periodSeconds:
_default: 5
failureThreshold:
_default: 20
service:
enabled: true
name:
_default: backend-svc
type:
_default: ClusterIP
port:
_default: 80
targetPort:
_default: 8000
portName:
_default: http
imagePullSecrets:
enabled:
_default: true
name:
_default: regcred
envs:
- name: LAST_MASTER_BIM
value:
_default: "100000"
- name: LAST_MASTER_BIM_V3
value:
_default: "100000"
- name: DB_CERT_PATH_4
value:
_default: "/root/yandex_pg.pem"
- name: DB_CERT_PATH_3
value:
_default: "/root/yandex_pg.pem"
- name: DB_CERT_PATH_2
value:
_default: "/root/yandex_pg.pem"
- name: LAST_SLAVE_1_BIM
value:
_default: "1000000"
- name: POSTGRES_POOL_SIZE
value:
_default: "30"
- name: API_ADDRESS
value:
_default: "0.0.0.0:8000"
- name: DJANGO_HOST
value:
_default: "http://backend-svc.django.svc.cluster.local:80"
- name: ENABLE_SQL_QUERY
value:
_default: "0"
- name: ENABLE_SSL
value:
_default: "0"
podAnnotations:
_default:
traffic.sidecar.istio.io/excludeOutboundPorts: "8200"
vault.hashicorp.com/agent-init-first: "true"
vault.hashicorp.com/agent-inject: "true"
vault.hashicorp.com/agent-pre-populate-only: "true"
vault.hashicorp.com/auth-path: auth/kubernetes
vault.hashicorp.com/role: bim
vault.hashicorp.com/agent-inject-secret-bim-postgresql: secrets/data/apps/bim/postgres
vault.hashicorp.com/agent-inject-template-bim-postgresql: |-
{{- with secret "secrets/data/apps/bim/postgres" -}}
POSTGRES_ADDRESS={{ index .Data.data "host" }}
POSTGRES_ADDRESS_2={{ index .Data.data "host" }}
POSTGRES_ADDRESS_3={{ index .Data.data "host" }}
POSTGRES_ADDRESS_4={{ index .Data.data "host" }}
POSTGRES_ADDRESS_5={{ index .Data.data "host" }}
POSTGRES_PORT={{ index .Data.data "port" }}
POSTGRES_PORT_2={{ index .Data.data "port" }}
POSTGRES_PORT_3={{ index .Data.data "port" }}
POSTGRES_PORT_4={{ index .Data.data "port" }}
POSTGRES_PORT_5={{ index .Data.data "port" }}
POSTGRES_DB={{ index .Data.data "database" }}
POSTGRES_DB_2={{ index .Data.data "database" }}
POSTGRES_DB_3={{ index .Data.data "database" }}
POSTGRES_DB_4={{ index .Data.data "database" }}
POSTGRES_DB_5={{ index .Data.data "database" }}
POSTGRES_USER={{ index .Data.data "username" }}
POSTGRES_USER_2={{ index .Data.data "username" }}
POSTGRES_USER_3={{ index .Data.data "username" }}
POSTGRES_USER_4={{ index .Data.data "username" }}
POSTGRES_USER_5={{ index .Data.data "username" }}
POSTGRES_PASSWORD={{ index .Data.data "password" }}
POSTGRES_PASSWORD_2={{ index .Data.data "password" }}
POSTGRES_PASSWORD_3={{ index .Data.data "password" }}
POSTGRES_PASSWORD_4={{ index .Data.data "password" }}
POSTGRES_PASSWORD_5={{ index .Data.data "password" }}
{{- end -}}
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

View File

@ -4,6 +4,4 @@ kind: Kustomization
namespace: bim
resources:
- namespace.yaml
- serviceaccount.yaml
- backend-deployment.yaml
- backend-service.yaml
- backend.yaml

View File

@ -1,5 +0,0 @@
apiVersion: v1
kind: ServiceAccount
metadata:
name: bim-vault
namespace: bim

View File

@ -35,7 +35,7 @@ spec:
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/bim-backend-v2:prod_b0bd750b
_default: cr.yandex/crp3ccidau046kdj8g9q/bim-backend-v2:donstroi1
pullPolicy:
_default: IfNotPresent

View File

@ -0,0 +1,10 @@
---
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../base
patches:
- path: namespace.yaml
target:
kind: Namespace
name: bim

View File

@ -0,0 +1,8 @@
---
apiVersion: v1
kind: Namespace
metadata:
name: bim
labels:
istio-injection: enabled
security.deckhouse.io/pod-policy: privileged

View File

@ -0,0 +1,98 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: backend
namespace: bim
spec:
values:
services:
backend:
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/bim-backend-v2:1d961a7b125ae0e69bd5717658d927091d8c05cc
envs:
- name: LAST_MASTER_BIM
value:
_default: "100000"
- name: LAST_SLAVE_1_BIM
value:
_default: "94015"
- name: LAST_MASTER_BIM_V3
value:
_default: "100000"
- name: LAST_SLAVE_1_BIM_V3
value:
_default: "0"
- name: DB_CERT_PATH_3
value:
_default: "/root/yandex_pg.pem"
- name: POSTGRES_ADDRESS_3
value:
_default: "postgres-service"
- name: POSTGRES_PORT_3
value:
_default: "5432"
- name: POSTGRES_DB_3
value:
_default: "bimapidb"
- name: DB_CERT_PATH_2
value:
_default: "/root/yandex_pg.pem"
- name: POSTGRES_ADDRESS_2
value:
_default: "postgres-service"
- name: POSTGRES_PORT_2
value:
_default: "5432"
- name: POSTGRES_DB_2
value:
_default: "bimapidb"
- name: POSTGRES_ADDRESS
value:
_default: "postgres-service"
- name: POSTGRES_PORT
value:
_default: "5432"
- name: POSTGRES_DB
value:
_default: "bimapidb"
- name: POSTGRES_POOL_SIZE
value:
_default: "30"
- name: API_ADDRESS
value:
_default: "0.0.0.0:8000"
- name: DJANGO_HOST
value:
_default: "http://backend.django.svc.cluster.local:8000"
- name: ENABLE_SQL_QUERY
value:
_default: "0"
- name: ENABLE_SSL
value:
_default: "0"
- name: DB_CERT_PATH_4
value:
_default: "/root/yandex_pg.pem"

172
apps/bim/dsinv/bim-api.yaml Normal file
View File

@ -0,0 +1,172 @@
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: bim-api
namespace: bim
labels:
app: bim-api
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: bim-api
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
labels:
app: bim-api
spec:
containers:
- command:
- ./entrypoint_api.sh
env:
- name: JWT_PUBLIC_KEY_PATH
value: /etc/sarex/keys/prod.rsa.pub
- name: FEATURE_ENABLE_JWT_AUTH
value: 'false'
- name: FEATURE_ENABLE_SAREX_AUTH
value: 'false'
- name: FEATURE_ENABLE_WORKSPACES
value: 'true'
- name: FEATURE_ENABLE_GCLOUD
value: 'false'
- name: FEATURE_ENABLE_S3
value: 'true'
- name: S3_BUCKET
value: sarex-bim-storage
- name: BIM_CURRENT_STORAGE
value: s3
- name: AWS_DEFAULT_REGION
value: ru-central1
- name: FEATURE_ENABLE_PROCESSING
value: '1'
- name: PROCESSING_API_URL
value: http://workflows-service.processing.svc.cluster.local:8000/internal
- name: PROCESSING_C2M_VERSION
value: stable
- name: prometheus_multiproc_dir
value: /tmp
- name: GOOGLE_APPLICATION_CREDENTIALS
value: /etc/sarex/google-storage/service_account.json
- name: BUNDLE_VERSION
value: v1
- name: WORKSPACES_API_URL
value: http://workspaces-service.workspaces.svc.cluster.local:8000/internal
- name: BIM_API_EXTERNAL_HOST_SCHEMA
value: https
- name: BIM_API_EXTERNAL_HOST
value: sarex.uralchem.com
- name: BIM_API_INTERNAL_HOST_SCHEMA
value: http
- name: BIM_API_INTERNAL_HOST
value: bim-api-service.bim.svc.cluster.local:5555
- name: DB_HOST
value: postgres-service-bim-v1
- name: DB_PORT
value: '5432'
- name: MESH_OPTIMIZER_PATH
value: gltfpack
- name: DEBUG
value: '0'
- name: STORAGE_SEGMENT
value: sarex-production-storage
- name: STORAGE_PROJECT
value: sarex-production
- name: TMP_DIR
value: /tmp
- name: WEBHOOK_URL
value: http://bim-api-service.bim.svc.cluster.local:5555
- name: COMPARATOR_API_URL
value: http://comparator-api-service.comparator-prod/internal
- name: RABBIT_VHOST
value: api
- name: RABBIT_HOST
value: rabbitmq-service.rabbitmq:5672
- name: DISABLE_INSTANCING
value: '0'
- name: DB_USER
valueFrom:
secretKeyRef:
key: username
name: postgres-secret-bim-v1
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
key: password
name: postgres-secret-bim-v1
- name: RABBIT_USER
valueFrom:
secretKeyRef:
key: username
name: rabbitmq-secret
- name: RABBIT_PASSWORD
valueFrom:
secretKeyRef:
key: password
name: rabbitmq-secret
- name: AWS_ACCESS_KEY_ID
valueFrom:
secretKeyRef:
key: key-id
name: s3-cred
- name: AWS_SECRET_ACCESS_KEY
valueFrom:
secretKeyRef:
key: access-key
name: s3-cred
image: cr.yandex/crp3ccidau046kdj8g9q/bim-api:870965d1967cd761965029b0480884ab7fa7c951
imagePullPolicy: IfNotPresent
name: bim-api
ports:
- containerPort: 5555
name: http
protocol: TCP
- containerPort: 9000
name: prom
protocol: TCP
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /tmp
name: tmp-volume
dnsPolicy: ClusterFirst
imagePullSecrets:
- name: dockerhub
nodeSelector:
name: generic
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
serviceAccount: bim-api-sa
serviceAccountName: bim-api-sa
terminationGracePeriodSeconds: 30
volumes:
- emptyDir: {}
name: tmp-volume
---
apiVersion: v1
kind: Service
metadata:
name: bim-api-service
namespace: bim
labels: {}
spec:
externalTrafficPolicy: Cluster
ports:
- name: http
nodePort: 31352
port: 5555
protocol: TCP
targetPort: 5555
selector:
app: bim-api
sessionAffinity: None
type: NodePort

View File

@ -0,0 +1,146 @@
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: bim-worker
namespace: bim
labels:
app: bim-worker
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: bim-worker
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
labels:
app: bim-worker
spec:
containers:
- command:
- ./entrypoint_worker.sh
env:
- name: JWT_PUBLIC_KEY_PATH
value: /etc/sarex/keys/prod.rsa.pub
- name: FEATURE_ENABLE_JWT_AUTH
value: 'false'
- name: FEATURE_ENABLE_SAREX_AUTH
value: 'false'
- name: FEATURE_ENABLE_WORKSPACES
value: 'true'
- name: FEATURE_ENABLE_GCLOUD
value: 'false'
- name: FEATURE_ENABLE_S3
value: 'true'
- name: S3_BUCKET
value: sarex-bim-storage
- name: BIM_CURRENT_STORAGE
value: s3
- name: AWS_DEFAULT_REGION
value: ru-central1
- name: FEATURE_ENABLE_PROCESSING
value: '1'
- name: PROCESSING_API_URL
value: http://workflows-service.processing.svc.cluster.local:8000/internal
- name: PROCESSING_C2M_VERSION
value: stable
- name: prometheus_multiproc_dir
value: /tmp
- name: GOOGLE_APPLICATION_CREDENTIALS
value: /etc/sarex/google-storage/service_account.json
- name: BUNDLE_VERSION
value: v1
- name: WORKSPACES_API_URL
value: http://workspaces-service.workspaces.svc.cluster.local:8000/internal
- name: BIM_API_EXTERNAL_HOST_SCHEMA
value: https
- name: BIM_API_EXTERNAL_HOST
value: sarex.dsinv.ru
- name: BIM_API_INTERNAL_HOST_SCHEMA
value: http
- name: BIM_API_INTERNAL_HOST
value: bim-api-service.bim.svc.cluster.local:5555
- name: DB_HOST
value: postgres-service-bim-v1
- name: DB_PORT
value: '5432'
- name: MESH_OPTIMIZER_PATH
value: gltfpack
- name: DEBUG
value: '0'
- name: STORAGE_SEGMENT
value: sarex-production-storage
- name: STORAGE_PROJECT
value: sarex-production
- name: TMP_DIR
value: /tmp
- name: WEBHOOK_URL
value: http://bim-api-service.bim.svc.cluster.local:5555
- name: COMPARATOR_API_URL
value: http://comparator-api-service.comparator-prod/internal
- name: RABBIT_VHOST
value: api
- name: RABBIT_HOST
value: rabbitmq-service.bim:5672
- name: DISABLE_INSTANCING
value: '0'
- name: DB_USER
valueFrom:
secretKeyRef:
key: username
name: postgres-secret-bim-v1
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
key: password
name: postgres-secret-bim-v1
- name: RABBIT_USER
valueFrom:
secretKeyRef:
key: username
name: rabbitmq-secret
- name: RABBIT_PASSWORD
valueFrom:
secretKeyRef:
key: password
name: rabbitmq-secret
- name: AWS_ACCESS_KEY_ID
valueFrom:
secretKeyRef:
key: key-id
name: s3-cred
- name: AWS_SECRET_ACCESS_KEY
valueFrom:
secretKeyRef:
key: access-key
name: s3-cred
image: cr.yandex/crp3ccidau046kdj8g9q/bim-api:870965d1967cd761965029b0480884ab7fa7c951
imagePullPolicy: IfNotPresent
name: bim-worker
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /tmp
name: tmp-volume
dnsPolicy: ClusterFirst
imagePullSecrets:
- name: dockerhub
nodeSelector:
name: generic
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
serviceAccount: bim-worker-sa
serviceAccountName: bim-worker-sa
terminationGracePeriodSeconds: 30
volumes:
- emptyDir: {}
name: tmp-volume

View File

@ -0,0 +1,13 @@
---
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: bim
resources:
- ../base
- bim-api.yaml
- bim-worker.yaml
patches:
- path: backend.yaml
target:
kind: HelmRelease
name: backend

1158
apps/bim/openapi.yaml Normal file

File diff suppressed because it is too large Load Diff

228
apps/bim/ugok/backend.yaml Normal file
View File

@ -0,0 +1,228 @@
---
# standalone HelmRelease — base vault-native, в ugok Vault не используется.
# Образ оставлен как был в ugok (donstroi1 в wb — похоже на билд другого
# клиента, не переносим — см. предыдущее решение).
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: backend
namespace: bim
spec:
interval: 10m
chart:
spec:
chart: universal-chart
version: "0.1.9"
sourceRef:
kind: HelmRepository
name: yc-oci-charts
namespace: flux-system
interval: 10m
install:
remediation:
retries: 3
upgrade:
remediation:
retries: 3
values:
global:
env: _default
services:
backend:
enabled: true
image:
name:
_default: 10.4.10.187:80/library/bim-backend-v2:prod_2bde8e0a
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: backend
replicaCount:
_default: 1
port:
_default: 8000
resources:
requests:
cpu:
_default: 25m
memory:
_default: 100Mi
probes:
liveness:
enabled:
_default: true
type:
_default: httpGet
httpGet:
path:
_default: /ping
port:
_default: 8000
initialDelaySeconds:
_default: 10
periodSeconds:
_default: 60
failureThreshold:
_default: 10
readiness:
enabled:
_default: true
type:
_default: httpGet
httpGet:
path:
_default: /ping
port:
_default: 8000
initialDelaySeconds:
_default: 5
periodSeconds:
_default: 5
failureThreshold:
_default: 20
service:
enabled: true
name:
_default: backend-svc
type:
_default: ClusterIP
port:
_default: 8000
targetPort:
_default: 8000
portName:
_default: http
envs:
- name: LAST_MASTER_BIM
value:
_default: "100000"
- name: LAST_SLAVE_1_BIM
value:
_default: "94015"
- name: LAST_MASTER_BIM_V3
value:
_default: "100000"
- name: LAST_SLAVE_1_BIM_V3
value:
_default: "0"
- name: DB_CERT_PATH_2
value:
_default: /root/yandex_pg.pem
- name: DB_CERT_PATH_3
value:
_default: /root/yandex_pg.pem
- name: DB_CERT_PATH_4
value:
_default: /root/yandex_pg.pem
- name: POSTGRES_ADDRESS
value:
_default: postgresql-service
- name: POSTGRES_ADDRESS_2
value:
_default: postgresql-service
- name: POSTGRES_ADDRESS_3
value:
_default: postgresql-service
- name: POSTGRES_ADDRESS_4
value:
_default: postgresql-service
- name: POSTGRES_PORT
value:
_default: "5432"
- name: POSTGRES_PORT_2
value:
_default: "5432"
- name: POSTGRES_PORT_3
value:
_default: "5432"
- name: POSTGRES_PORT_4
value:
_default: "5432"
- name: POSTGRES_DB
value:
_default: bim_db
- name: POSTGRES_DB_2
value:
_default: bim_db
- name: POSTGRES_DB_3
value:
_default: bim_db
- name: POSTGRES_DB_4
value:
_default: bim_db
- name: POSTGRES_POOL_SIZE
value:
_default: "30"
- name: API_ADDRESS
value:
_default: 0.0.0.0:8000
- name: DJANGO_HOST
value:
_default: http://backend.django.svc.cluster.local:8000
- name: ENABLE_SQL_QUERY
value:
_default: "0"
- name: ENABLE_SSL
value:
_default: "0"
secretEnvs:
- name: POSTGRES_USER
secretName:
_default: bim-postgresql-secret
secretKey: username
- name: POSTGRES_PASSWORD
secretName:
_default: bim-postgresql-secret
secretKey: password
- name: POSTGRES_USER_2
secretName:
_default: bim-postgresql-secret
secretKey: username
- name: POSTGRES_PASSWORD_2
secretName:
_default: bim-postgresql-secret
secretKey: password
- name: POSTGRES_USER_3
secretName:
_default: bim-postgresql-secret
secretKey: username
- name: POSTGRES_PASSWORD_3
secretName:
_default: bim-postgresql-secret
secretKey: password
- name: POSTGRES_USER_4
secretName:
_default: bim-postgresql-secret
secretKey: username
- name: POSTGRES_PASSWORD_4
secretName:
_default: bim-postgresql-secret
secretKey: password
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

View File

@ -0,0 +1,7 @@
---
# Не наследуем base (vault-native) — см. комментарий в backend.yaml.
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: bim
resources:
- backend.yaml

234
apps/bim/wb/backend.yaml Normal file
View File

@ -0,0 +1,234 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: backend
namespace: bim
spec:
interval: 10m
chart:
spec:
chart: universal-chart
version: "0.1.7"
sourceRef:
kind: HelmRepository
name: yc-oci-charts
namespace: flux-system
interval: 10m
install:
remediation:
retries: 3
upgrade:
remediation:
retries: 3
values:
global:
env: _default
services:
backend:
enabled: true
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/bim-backend-v2:donstroi1
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: backend
replicaCount:
_default: 1
port:
_default: 8000
resources:
limits:
cpu:
_default: 20m
memory:
_default: 51Mi
requests:
cpu:
_default: 10m
memory:
_default: 34Mi
probes:
liveness:
enabled: false
readiness:
enabled: false
service:
enabled: true
name:
_default: backend-service
type:
_default: ClusterIP
port:
_default: 8000
targetPort:
_default: 8000
portName:
_default: http
imagePullSecrets:
enabled:
_default: true
name:
_default: dockerhub
envs:
- name: LAST_MASTER_BIM
value:
_default: "100000"
- name: LAST_MASTER_BIM_V3
value:
_default: "100000"
- name: LAST_SLAVE_1_BIM
value:
_default: "1000000"
- name: POSTGRES_ADDRESS
value:
_default: "sarex-vpsql-01.xc.wb.ru"
- name: POSTGRES_PORT
value:
_default: "6432"
- name: POSTGRES_DB
value:
_default: "bim_db"
- name: DB_CERT_PATH_2
value:
_default: "/root/yandex_pg.pem"
- name: POSTGRES_ADDRESS_2
value:
_default: "sarex-vpsql-01.xc.wb.ru"
- name: POSTGRES_PORT_2
value:
_default: "6432"
- name: POSTGRES_DB_2
value:
_default: "bim_db"
- name: DB_CERT_PATH_3
value:
_default: "/root/yandex_pg.pem"
- name: POSTGRES_ADDRESS_3
value:
_default: "sarex-vpsql-01.xc.wb.ru"
- name: POSTGRES_PORT_3
value:
_default: "6432"
- name: POSTGRES_DB_3
value:
_default: "bim_db"
- name: DB_CERT_PATH_4
value:
_default: "/root/yandex_pg.pem"
- name: POSTGRES_ADDRESS_4
value:
_default: "sarex-vpsql-01.xc.wb.ru"
- name: POSTGRES_PORT_4
value:
_default: "6432"
- name: POSTGRES_DB_4
value:
_default: "bim_db"
- name: POSTGRES_POOL_SIZE
value:
_default: "30"
- name: API_ADDRESS
value:
_default: "0.0.0.0:8000"
- name: DJANGO_HOST
value:
_default: "http://backend.django.svc.cluster.local:8000"
- name: ENABLE_SQL_QUERY
value:
_default: "0"
- name: ENABLE_SSL
value:
_default: "0"
secretEnvs:
- name: POSTGRES_USER
secretName:
_default: "postgres-secret"
secretKey: "username"
- name: POSTGRES_PASSWORD
secretName:
_default: "postgres-secret"
secretKey: "password"
- name: POSTGRES_USER_2
secretName:
_default: "postgres-secret"
secretKey: "username"
- name: POSTGRES_PASSWORD_2
secretName:
_default: "postgres-secret"
secretKey: "password"
- name: POSTGRES_USER_3
secretName:
_default: "postgres-secret"
secretKey: "username"
- name: POSTGRES_PASSWORD_3
secretName:
_default: "postgres-secret"
secretKey: "password"
- name: POSTGRES_USER_4
secretName:
_default: "postgres-secret"
secretKey: "username"
- name: POSTGRES_PASSWORD_4
secretName:
_default: "postgres-secret"
secretKey: "password"
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

View File

@ -1,6 +1,6 @@
---
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: measurements
namespace: bim
resources:
- backend.yaml

View File

@ -7,5 +7,5 @@ resources:
patches:
- path: replicas.yaml
target:
kind: Deployment
kind: HelmRelease
name: backend

View File

@ -9,7 +9,7 @@ spec:
chart:
spec:
chart: postgresql-contour
version: "13.0.8"
version: "13.0.15"
sourceRef:
kind: HelmRepository
name: yc-oci-charts
@ -45,7 +45,7 @@ spec:
image:
registry: cr.yandex/crp3ccidau046kdj8g9q
repository: contour/postgresql
tag: 13.0.8
tag: 13.0.15
pullPolicy: Always
metrics:
enabled: false
@ -104,7 +104,7 @@ spec:
contour:
enabled: true
adminUser: "postgres"
sharedPreloadLibraries: "pg_stat_statements,uuid-ossp,ltree,timescaledb"
sharedPreloadLibraries: ""
vault:
enabled: true
role: postgresql

View File

@ -1,8 +1,13 @@
---
apiVersion: apps/v1
kind: Deployment
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: backend
namespace: bim
spec:
replicas: 1
values:
services:
backend:
deployment:
replicaCount:
_default: 1

80
apps/cde/.env.example Normal file
View File

@ -0,0 +1,80 @@
# =============================================================================
# cde-orchestration-demo (Оркестратор) — пример переменных окружения
#
# Разбор переменных: github.com/sethvargo/go-envconfig.
# Файл .env подгружается через godotenv (флаг -env-file, по умолчанию `.env`).
# Глобального префикса у переменных НЕТ (в отличие от других сервисов Sarex).
# Вложенные секции задаются префиксом в env-тегах (напр. DATABASE_URL).
#
# Значения ниже — примеры и значения по умолчанию из кода. Секреты (ключи,
# пароли, токены) оставлены пустыми — заполните собственными.
# Один и тот же .env используется всеми бинарниками (см. docker-compose.yml),
# но каждый бинарник читает только нужное ему подмножество (см. CONFIGURATION.md).
# =============================================================================
# --- Общие ---
ENVIRONMENT=production
LOG_LEVEL=info # cmd/http: default=info; воркеры: default=debug
IS_CONTOUR=false
# --- HTTP-сервер (cmd/http) ---
ADDRESS=:8080
PROCESS_CACHE_TTL=60
PROCESS_CACHE_CLEAR_INTERVAL=60
PUBLIC_KEY= # PEM RSA public key для проверки JWT (обязателен для http)
OPERATE_URL= # Базовый URL Camunda Operate/REST
SAREX_BACKEND_BASE_URL=https://stage.sarex.io
# --- Camunda ---
CAMUNDA_KEYCLOAK_URL=
CAMUNDA_CLIENT_ID=operate # только cmd/http
CAMUNDA_CLIENT_SECRET=identity-secret-for-components # только cmd/http
CAMUNDA_PROCESS_DEFINITION_ID=actionsOnApproval # только cmd/http
# --- Zeebe ---
ZEEBE_GATEWAY=
ZEEBE_CLIENT_ID=zeebe
ZEEBE_CLIENT_SECRET=identity-secret-for-components
ZEEBE_WORKER_JOB_TYPE=markDocuments # у каждого воркера своё значение по умолчанию (см. CONFIGURATION.md)
# --- Database (PostgreSQL) ---
DATABASE_URL=
DATABASE_POOL_SIZE=10
# --- S3 ---
S3_ENDPOINT_URL=https://storage.yandexcloud.net
S3_ACCESS_KEY_ID=
S3_SECRET_ACCESS_KEY=
S3_PARTITION_ID=yc
S3_SIGNING_REGION=ru-central1
# --- Auth (без префикса) ---
AUTH_HOST=
USERNAME=
PASSWORD=
# --- Flows (сервис рабочих процессов) ---
FLOWS_URL=
FLOWS_INTERNAL_URL=
# --- Workspaces ---
WORKSPACES_URL=
# --- Workflows (используется воркером split_pdf) ---
WORKFLOWS_HOST=
WORKFLOWS_IMAGE_TAG=latest
# --- System log ---
SYSTEM_LOG_URL=
# --- Telegram (алертинг воркеров) ---
TELEGRAM_TOKEN=
TELEGRAM_ALERT_GROUP_ID=
TELEGRAM_DEBUG=false
# --- AMQP / RabbitMQ (markings v2, copy v2) ---
AMQP_HOST=
AMQP_PORT=
AMQP_USER=
AMQP_PASSWORD=
AMQP_PATH_API=

215
apps/cde/CONFIGURATION.md Normal file
View File

@ -0,0 +1,215 @@
# Конфигурация проекта cde-orchestration-demo (Оркестратор)
Документ описывает все переменные окружения и способы конфигурирования сервиса.
## Способы конфигурирования
Сервис настраивается **только через переменные окружения**. Разбор выполняется библиотекой [`github.com/sethvargo/go-envconfig`](https://github.com/sethvargo/go-envconfig): в каждом бинарнике вызывается `envconfig.Process(ctx, config)` со своей структурой `Config` (см. `internal/app/http/config.go` и `internal/app/worker/*/config.go`).
Особенности разбора:
- **Глобального префикса нет** — в отличие от других сервисов Sarex, переменные не имеют общего префикса (напр. просто `LOG_LEVEL`, `DATABASE_URL`).
- Вложенные секции задаются тегом `env:", prefix=XXX_"` на поле-структуре. Например поле `Database DatabaseConfig` с `prefix=DATABASE_` и полем `Url` с тегом `env:"URL"` даёт переменную `DATABASE_URL`.
- Структура `Auth` **не имеет** тега `prefix`, поэтому её поля читаются без префикса: `AUTH_HOST`, `USERNAME`, `PASSWORD`.
- Значения по умолчанию задаются в теге через `default=...`. Отсутствие поля без дефолта не приводит к ошибке `envconfig` (пустое значение), но может привести к падению при инициализации зависимого клиента (напр. пустой `PUBLIC_KEY` вызовет панику при старте http).
Файл `.env` подгружается через [`github.com/lpernett/godotenv`](https://github.com/lpernett/godotenv): в `main` вызывается `godotenv.Load(*envFileFlag)`, путь задаётся флагом `-env-file` (по умолчанию `.env`). Если файла нет — загрузка пропускается, переменные берутся из окружения процесса.
Отдельного конфиг-файла (yaml/toml) у приложения нет.
Источники переменных по способам запуска:
| Способ запуска | Откуда берутся переменные |
| --- | --- |
| Локально (бинарник) | Флаг `-env-file``.env` (godotenv) и/или переменные окружения процесса |
| Локально (docker-compose) | `docker-compose.yml`: у каждого сервиса `env_file: .env` |
| Kubernetes (Helm) | `.helm/values.yaml`: блок `envs` (обычные значения) и `secretEnvs` (значения из k8s-секрета `cde-secret`) чарта `universal-chart` |
| Kubernetes (kustomize, этот репозиторий) | Vault Agent инжектит секрет `secrets/data/vault/apps/cde` в файл `/vault/secrets/cde-env`, который экспортируется в окружение перед запуском бинарника (`source /vault/secrets/cde-env`) |
## Бинарники (точки входа)
| Бинарник | Точка входа | Config | Назначение |
| --- | --- | --- | --- |
| `http` | `cmd/http/main.go` | `internal/app/http` | HTTP API оркестрации (процессы, подпись, загрузка BPMN) |
| `copy` | `cmd/worker/copy/main.go` | `.../worker/copy` | Воркер копирования документов (`copyDocuments`) |
| `copyv2` | `cmd/worker/copyv2/main.go` | `.../worker/copyv2` | Копирование документов v2 (`copyDocumentsv2`) |
| `create_versions` | `cmd/worker/create_versions/main.go` | `.../worker/create_versions` | Создание версий (`createVersions`) |
| `create_versionsv2` | `cmd/worker/create_versionsv2/main.go` | `.../worker/create_versionsv2` | Создание версий v2 (`createVersionsv2`) |
| `flows_callback` | `cmd/worker/flows_callback/main.go` | `.../worker/flows_callback` | Обратный вызов в сервис flows (`flowsCallback`) |
| `markings` | `cmd/worker/markings/main.go` | `.../worker/markings` | Маркировка документов (`markDocuments`) |
| `markingsv2` | `cmd/worker/markingsv2/main.go` | `.../worker/markingsv2` | Маркировка v2 (`markDocumentsv2`) |
| `sign` | `cmd/worker/sign/main.go` | `.../worker/sign` | Подпись документов (`signDocuments`) |
| `signv2` | `cmd/worker/signv2/main.go` | `.../worker/signv2` | Подпись v2 (`signDocumentsv2`) |
| `split_pdf` | `cmd/worker/split_pdf/main.go` | `.../worker/split_pdf` | Разбиение/обработка PDF (`splitPDF`) |
| `update_bundles` | `cmd/worker/update_bundles/main.go` | `.../worker/update_bundles` | Обновление бандлов (`updateBundles`) |
Воркеры — это Zeebe job-workers: они подключаются к Zeebe-gateway и обрабатывают Service Task соответствующего типа (`ZEEBE_WORKER_JOB_TYPE`). HTTP-сервер, помимо приёма запросов, обращается к Camunda Operate/Zeebe (см. `ENDPOINTS.md`).
## Переменные приложения
Дефолт `—` означает, что значения по умолчанию нет.
### Общие (для всех бинарников)
| Переменная | Тип | Значение по умолчанию | Назначение |
| --- | --- | --- | --- |
| `ENVIRONMENT` | string | `production` (у воркеров) | Окружение развёртывания. У `http` не читается |
| `LOG_LEVEL` | string | `info` (http) / `debug` (воркеры) | Уровень логирования |
| `IS_CONTOUR` | bool | `false` | Режим изолированного контура (влияет на инициализацию S3) |
### HTTP-сервер (`cmd/http`)
| Переменная | Тип | Значение по умолчанию | Назначение |
| --- | --- | --- | --- |
| `ADDRESS` | string | `:8080` | Адрес прослушивания Fiber |
| `PROCESS_CACHE_TTL` | int (сек) | `60` | TTL кеша процессов |
| `PROCESS_CACHE_CLEAR_INTERVAL` | int (сек) | `60` | Интервал очистки кеша процессов |
| `PUBLIC_KEY` | string (PEM) | — | RSA public key для проверки JWT. Обязателен: при пустом/некорректном значении сервис падает при старте |
| `OPERATE_URL` | string | — | Базовый URL Camunda Operate/REST |
| `SAREX_BACKEND_BASE_URL` | string | — | Базовый URL sarex-backend (проверка MRPA при подписи) |
### Camunda (`CAMUNDA_*`)
| Переменная | Тип | Значение по умолчанию | Назначение | Где используется |
| --- | --- | --- | --- | --- |
| `CAMUNDA_KEYCLOAK_URL` | string | — | URL Keycloak для OAuth (Zeebe/Operate) | http + воркеры |
| `CAMUNDA_CLIENT_ID` | string | `operate` | Client ID для Operate | только http |
| `CAMUNDA_CLIENT_SECRET` | string | `identity-secret-for-components` | Client secret для Operate | только http |
| `CAMUNDA_PROCESS_DEFINITION_ID` | string | `actionsOnApproval` | ID определения процесса | только http |
### Zeebe (`ZEEBE_*`)
| Переменная | Тип | Значение по умолчанию | Назначение |
| --- | --- | --- | --- |
| `ZEEBE_GATEWAY` | string | — | Адрес Zeebe gateway |
| `ZEEBE_CLIENT_ID` | string | `zeebe` | Client ID |
| `ZEEBE_CLIENT_SECRET` | string | `identity-secret-for-components` | Client secret |
| `ZEEBE_WORKER_JOB_TYPE` | string | зависит от воркера | Тип Service Task, который слушает воркер |
Значения `ZEEBE_WORKER_JOB_TYPE` по умолчанию: `markDocuments` (http/markings), `markDocumentsv2` (markingsv2), `copyDocuments` (copy), `copyDocumentsv2` (copyv2), `createVersions` (create_versions), `createVersionsv2` (create_versionsv2), `flowsCallback` (flows_callback), `signDocuments` (sign), `signDocumentsv2` (signv2), `splitPDF` (split_pdf), `updateBundles` (update_bundles).
### Database (`DATABASE_*`)
| Переменная | Тип | Значение по умолчанию | Назначение |
| --- | --- | --- | --- |
| `DATABASE_URL` | string | — | DSN подключения к PostgreSQL (pgx) |
| `DATABASE_POOL_SIZE` | int32 | `10` | Размер пула соединений |
### S3 (`S3_*`)
| Переменная | Тип | Значение по умолчанию | Назначение |
| --- | --- | --- | --- |
| `S3_ENDPOINT_URL` | string | `https://storage.yandexcloud.net` | Эндпоинт S3 |
| `S3_ACCESS_KEY_ID` | string | — | Access key |
| `S3_SECRET_ACCESS_KEY` | string | — | Secret key |
| `S3_PARTITION_ID` | string | `yc` | Partition ID (aws-sdk-go-v2) |
| `S3_SIGNING_REGION` | string | `ru-central1` | Регион для подписи запросов |
### Auth (без префикса)
Поле-структура `Auth` не имеет префикса, поэтому переменные читаются напрямую.
| Переменная | Тип | Значение по умолчанию | Назначение |
| --- | --- | --- | --- |
| `AUTH_HOST` | string | — | Хост сервиса аутентификации (получение токенов пользователя/админа) |
| `USERNAME` | string | — | Логин админ-учётки |
| `PASSWORD` | string | — | Пароль админ-учётки |
### Flows (`FLOWS_*`)
| Переменная | Тип | Значение по умолчанию | Назначение |
| --- | --- | --- | --- |
| `FLOWS_URL` | string | — | Базовый URL сервиса flows |
| `FLOWS_INTERNAL_URL` | string | — | Внутренний URL flows (обновление документов review). Есть только в конфигах `copy`/`copyv2` |
### Workspaces (`WORKSPACES_*`)
| Переменная | Тип | Значение по умолчанию | Назначение |
| --- | --- | --- | --- |
| `WORKSPACES_URL` | string | — | URL сервиса рабочих областей (используется воркерами copy/copyv2) |
### Workflows (`WORKFLOWS_*`)
Используется воркером `split_pdf`.
| Переменная | Тип | Значение по умолчанию | Назначение |
| --- | --- | --- | --- |
| `WORKFLOWS_HOST` | string | — | Хост сервиса workflows |
| `WORKFLOWS_IMAGE_TAG` | string | `latest` | Тег docker-образа задач обработки PDF |
> Container registry (`cr.yandex/crp3ccidau046kdj8g9q`) и флаг `UploadResultsToS3=true` заданы в коде воркера `split_pdf` (`worker.go`), а не через окружение.
### System log (`SYSTEM_LOG_*`)
| Переменная | Тип | Значение по умолчанию | Назначение |
| --- | --- | --- | --- |
| `SYSTEM_LOG_URL` | string | — | URL сервиса системных логов (copy, copyv2, create_versions, create_versionsv2) |
### Telegram (`TELEGRAM_*`)
Клиент алертинга для воркеров.
| Переменная | Тип | Значение по умолчанию | Назначение |
| --- | --- | --- | --- |
| `TELEGRAM_TOKEN` | string | — | Токен бота |
| `TELEGRAM_ALERT_GROUP_ID` | int64 | — | ID группы для алертов |
| `TELEGRAM_DEBUG` | bool | `false` | Debug-режим бота |
### AMQP / RabbitMQ (`AMQP_*`)
Используется воркерами `markingsv2` и `copyv2` (маркировка бандлов через RabbitMQ).
| Переменная | Тип | Значение по умолчанию | Назначение |
| --- | --- | --- | --- |
| `AMQP_HOST` | string | — | Хост RabbitMQ |
| `AMQP_PORT` | string | — | Порт RabbitMQ |
| `AMQP_USER` | string | — | Пользователь |
| `AMQP_PASSWORD` | string | — | Пароль |
| `AMQP_PATH_API` | string | — | Vhost / путь API в URL подключения |
## Матрица «переменная → бинарник»
| Секция | http | copy | copyv2 | create_versions | create_versionsv2 | flows_callback | markings | markingsv2 | sign | signv2 | split_pdf | update_bundles |
| --- | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: |
| Общие | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| `ADDRESS`/`PROCESS_CACHE_*` | ✓ | | | | | | | | | | | |
| `PUBLIC_KEY`,`OPERATE_URL`,`SAREX_BACKEND_BASE_URL`,`CAMUNDA_CLIENT_*`,`CAMUNDA_PROCESS_DEFINITION_ID` | ✓ | | | | | | | | | | | |
| `CAMUNDA_KEYCLOAK_URL`,`ZEEBE_*` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| `DATABASE_*` | ✓ | ✓ | ✓ | ✓ | ✓ | | ✓ | ✓ | ✓ | ✓ | ✓ | |
| `S3_*` | ✓ | ✓ | ✓ | ✓ | ✓ | | | ✓ | ✓ | ✓ | | |
| `AUTH_*`/`USERNAME`/`PASSWORD` | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| `FLOWS_URL` | | ✓ | ✓ | | | ✓ | ✓ | ✓ | ✓ | ✓ | | ✓ |
| `FLOWS_INTERNAL_URL` | | ✓ | ✓ | | | | | | | | | |
| `WORKSPACES_URL` | | ✓ | ✓ | | | | | | | | | |
| `WORKFLOWS_*` | | | | | | | | | | | ✓ | |
| `SYSTEM_LOG_URL` | | ✓ | ✓ | ✓ | ✓ | | | | | | | |
| `AMQP_*` | | | ✓ | | | | | ✓ | | | | |
| `TELEGRAM_*` | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
> Матрица построена по структурам `Config` соответствующих бинарников. Наличие поля в структуре не всегда означает, что клиент инициализируется — см. замечания ниже.
## Переменные в Helm-чарте (`.helm/values.yaml`)
Обычные значения (блок `envs`):
| Переменная | Значения по окружениям |
| --- | --- |
| `SAREX_BACKEND_BASE_URL` | stage: `https://stage.sarex.io`, preprod: `https://preprod.sarex.io`, production: `https://lk.sarex.io` |
Значения из секрета (блок `secretEnvs`, общий для всех сервисов через якорь `*cde_secret_envs`), берутся из k8s-секрета `cde-secret` одноимёнными ключами: `ENVIRONMENT`, `LOG_LEVEL`, `ZEEBE_GATEWAY`, `DATABASE_URL`, `S3_ENDPOINT_URL`, `S3_ACCESS_KEY_ID`, `S3_SECRET_ACCESS_KEY`, `PUBLIC_KEY`, `PDM_URL`, `FLOWS_URL`, `FLOWS_INTERNAL_URL`, `USERNAME`, `PASSWORD`, `CAMUNDA_PROCESS_DEFINITION_ID`, `OPERATE_URL`, `CAMUNDA_KEYCLOAK_URL`, `CAMUNDA_CLIENT_ID`, `CAMUNDA_CLIENT_SECRET`, `WORKFLOWS_HOST`, `WORKSPACES_URL`, `AUTH_HOST`, `TELEGRAM_ALERT_GROUP_ID`, `TELEGRAM_TOKEN`, `IS_CONTOUR`, `AMQP_HOST`, `AMQP_PORT`, `AMQP_USER`, `AMQP_PASSWORD`, `AMQP_PATH_API`, `SYSTEM_LOG_URL`.
## Развёртывание через kustomize (этот репозиторий)
В `iac/apps/cde` секреты доставляются не через `secretEnvs` чарта, а через **Vault Agent Injector**: аннотации подов монтируют секрет `secrets/data/vault/apps/cde` в файл `/vault/secrets/cde-env`, который экспортируется перед запуском (`source /vault/secrets/cde-env`, затем `exec /http` или `/worker`). Дополнительно контейнерам задаётся `S3_IS_CONTOUR=true` (примечание: в коде используется переменная `IS_CONTOUR`).
Оверлеи: `base` (общие манифесты), `brusnika-stage`, `brusnika-prod`, `yc-k8s-test`.
## Замечания и потенциальные проблемы
- **Нет глобального префикса.** Имена переменных короткие (`USERNAME`, `PASSWORD`, `AUTH_HOST`) — легко пересечься с системными; следите за окружением процесса.
- **`PUBLIC_KEY` обязателен для `http`** — при пустом/некорректном PEM сервис паникует на старте (`server.go`).
- **`PDM_URL`** присутствует в `secretEnvs` Helm, но соответствующий клиент (`internal/adapters/http/pdm`) в текущей сборке нигде не инициализируется — переменная фактически не используется кодом.
- **`S3_IS_CONTOUR`** задаётся в kustomize-манифестах, тогда как код читает `IS_CONTOUR` (без префикса `S3_`). Проверьте, что для влияния на поведение выставлен именно `IS_CONTOUR`.
- **`FLOWS_INTERNAL_URL`** объявлен только в конфигах `copy`/`copyv2`; в остальных воркерах поля нет, хотя ключ есть в общем секрете.
- **Значения по умолчанию для секретов Camunda/Zeebe** (`identity-secret-for-components`) подходят для локального стенда, но должны переопределяться в prod.
- Приложение читает `.env` только если файл существует; иначе используются переменные окружения. `make`-целей для генерации `.env` в репозитории нет — используйте этот `.env.example` как шаблон.

130
apps/cde/ENDPOINTS.md Normal file
View File

@ -0,0 +1,130 @@
# Эндпоинты внешних сервисов, с которыми взаимодействует cde-orchestration-demo
Документ описывает все HTTP/AMQP/gRPC-эндпоинты внешних сервисов, к которым обращается оркестратор (сервер `cmd/http` и воркеры). Это исходящие вызовы; описание API, который оркестратор **предоставляет**, — в `openapi.yaml`.
## Как устроено взаимодействие
Клиенты внешних сервисов лежат в `internal/adapters/http/*` и `internal/adapters/*`. Базовые URL берутся из переменных окружения (см. `CONFIGURATION.md`). Для HTTP используются два клиента: Fiber `client` (camunda, flows, pdm, workspaces, system_log) и `go-resty` (workflows, sarexbackend). Аутентификация — по-разному в зависимости от сервиса (OAuth client_credentials, Bearer-токен пользователя/админа, Basic).
## Базовые адреса по сервисам
| Сервис | Переменная базового адреса | Клиент | Назначение |
| --- | --- | --- | --- |
| Camunda Operate / REST | `OPERATE_URL` | Fiber | Управление инстансами процессов, переменными, сообщениями |
| Camunda Keycloak | `CAMUNDA_KEYCLOAK_URL` | Fiber | OAuth-токен для Operate |
| Zeebe Gateway | `ZEEBE_GATEWAY` | gRPC (SDK) | Деплой BPMN, обработка job'ов воркерами |
| Auth (токены) | `AUTH_HOST` | Fiber/resty | Токены пользователя/админа для flows и pdm |
| Flows | `FLOWS_URL`, `FLOWS_INTERNAL_URL` | Fiber | Ревью, действия пользователя, обновление бандлов/документов |
| PDM | `PDM_URL` | Fiber | Маркировка бандлов *(клиент не подключён — см. примечание)* |
| Workflows | `WORKFLOWS_HOST` | resty | Создание workflow обработки PDF |
| Workspaces | `WORKSPACES_URL` | Fiber | Создание рабочих областей |
| System log | `SYSTEM_LOG_URL` | Fiber | Отправка системных логов |
| Sarex backend | `SAREX_BACKEND_BASE_URL` | resty | Получение MRPA по id |
| Telegram Bot API | `TELEGRAM_TOKEN` | tgbotapi | Алертинг воркеров |
| RabbitMQ (AMQP) | `AMQP_*` | amqp091 | Маркировка бандлов (RPC), вычисление хеш-сумм |
## Эндпоинты по сервисам
### Camunda Operate / REST (`OPERATE_URL`, `CAMUNDA_KEYCLOAK_URL`)
`internal/adapters/http/camunda/client.go`. Все запросы (кроме получения токена) идут с заголовком `Authorization: Bearer <access_token>`.
| Метод | Путь | Назначение |
| --- | --- | --- |
| POST | `{CAMUNDA_KEYCLOAK_URL}/auth/realms/camunda-platform/protocol/openid-connect/token` | OAuth-токен (`grant_type=client_credentials`) |
| POST | `{OPERATE_URL}/v2/process-instances` | Создать инстанс процесса |
| GET | `{OPERATE_URL}/api/process-instances/{key}` | Получить инстанс процесса |
| POST | `{OPERATE_URL}/v1/variables/search` | Поиск переменных процесса по имени/значению |
| GET | `{OPERATE_URL}/api/process-instances/{key}/variables/{varId}` | Значение конкретной переменной |
| POST | `{OPERATE_URL}/api/process-instances/{key}/variables` | Список переменных инстанса (`scopeId`) |
| POST | `{OPERATE_URL}/v2/messages/publication` | Публикация сообщения процессу (напр. `signRequest`) |
### Zeebe Gateway (`ZEEBE_GATEWAY`)
`internal/adapters/zeebe`. gRPC через официальный SDK `camunda/zeebe/clients/go/v8`. Используется для деплоя определений процессов (`NewProcessDefinition`) и для job-воркеров, которые слушают Service Task типа `ZEEBE_WORKER_JOB_TYPE` и по завершении/ошибке возвращают результат в инстанс процесса.
### Auth — токены (`AUTH_HOST`)
Используется адаптерами flows и pdm для получения Bearer-токенов.
| Метод | Путь | Назначение |
| --- | --- | --- |
| GET | `{AUTH_HOST}/token/user/{userID}/` | Токен от имени пользователя |
| POST | `{AUTH_HOST}/token/` | Токен админа (`username`/`password`) |
### Flows (`FLOWS_URL`, `FLOWS_INTERNAL_URL`)
`internal/adapters/http/flows/adapter.go`. Запросы (кроме `update-documents`) идут с `Authorization: Bearer <token>`; часть операций — с ретраями (экспоненциальный backoff).
| Метод | Путь | Назначение |
| --- | --- | --- |
| POST | `{FLOWS_URL}/user-actions/` | Добавить действие в историю |
| PATCH | `{FLOWS_URL}/reviews/{reviewID}/approve/` | Утвердить review (со статусом/комментарием) |
| PATCH | `{FLOWS_URL}/reviews/{reviewID}/update-bundles/` | Обновить бандлы review |
| PATCH | `{FLOWS_INTERNAL_URL}/reviews/{reviewID}/update-documents/` | Обновить документы review (внутренний URL, без авторизации) |
| GET | `{FLOWS_URL}/reviews/{reviewID}/documents/` | История бандлов документов review |
### PDM (`PDM_URL`, `AUTH_HOST`) — не подключён
`internal/adapters/http/pdm/client.go`. Клиент реализован, но в текущей сборке нигде не инициализируется (см. примечание в конце). Для полноты — какие вызовы он делает:
| Метод | Путь | Назначение |
| --- | --- | --- |
| GET | `{AUTH_HOST}/token/user/{userID}/` | Токен пользователя (Basic auth логин/пароль) |
| PUT | `{PDM_URL}/bundles/{bundleID}/marks` | Проставить маркировки бандлу |
### Workflows (`WORKFLOWS_HOST`, `AUTH_HOST`)
`internal/adapters/http/workflows/adapter.go` (resty). Используется воркером `split_pdf`.
| Метод | Путь | Назначение |
| --- | --- | --- |
| POST | `{WORKFLOWS_HOST}/internal/v1/companies/{companyID}/workflows` | Создать workflow обработки/оптимизации PDF |
> Базовый URL resty-клиента установлен в `AUTH_HOST`, а адрес workflows подставляется полным (`WORKFLOWS_HOST`). В параметрах задач передаётся `django_host = AUTH_HOST`.
### Workspaces (`WORKSPACES_URL`)
`internal/adapters/http/workspaces/client.go`. Используется воркерами `copy`/`copyv2`.
| Метод | Путь | Назначение |
| --- | --- | --- |
| POST | `{WORKSPACES_URL}/internal/v2/workspaces` | Создать рабочую область |
### System log (`SYSTEM_LOG_URL`)
`internal/adapters/http/system_log/client.go`. Используется воркерами `copy`, `copyv2`, `create_versions`, `create_versionsv2`.
| Метод | Путь | Назначение |
| --- | --- | --- |
| POST | `{SYSTEM_LOG_URL}/api/v0/system_log` | Отправить пакет системных логов |
### Sarex backend (`SAREX_BACKEND_BASE_URL`)
`internal/adapters/sarexbackend/client.go` (resty). Используется HTTP-сервером при подписи (проверка MRPA). Токены проксируются из входящего запроса (`Authorization`, опц. `Identity`).
| Метод | Путь | Назначение |
| --- | --- | --- |
| GET | `{SAREX_BACKEND_BASE_URL}/api/core/mrpa/{id}/` | Получить MRPA по id |
### Telegram Bot API (`TELEGRAM_TOKEN`, `TELEGRAM_ALERT_GROUP_ID`)
`internal/adapters/http/telegram/client.go` через `go-telegram-bot-api`. Отправка алертов в заданную группу при ошибках/паниках в задачах воркеров.
### RabbitMQ / AMQP (`AMQP_*`)
Подключение вида `amqp://{USER}:{PASSWORD}@{HOST}:{PORT}/{PATH_API}`.
| Адаптер | Назначение |
| --- | --- |
| `internal/adapters/amqp/markings` | Маркировка бандла и получение его хеш-суммы (RPC поверх временной очереди, `correlation_id`). Используется воркерами `markingsv2`/`copyv2` |
| `internal/adapters/amqp/rpc` | Общий RPC-клиент RabbitMQ (переподключение, вычисление хеш-сумм объектов) |
## Обработка ошибок
Каждый адаптер проверяет `StatusCode()` ответа и оборачивает не-`200 OK` в ошибку с телом ответа (`internal/errors`). Отдельно у sarexbackend маппинг: `404 → ErrNotFound`, `403 → ErrForbidden`, прочие → generic. Адаптеры flows и pdm выполняют ретраи с экспоненциальным backoff (до 5 попыток).
## Примечания
- **PDM-клиент не подключён.** `internal/adapters/http/pdm` реализован, а переменная `PDM_URL` присутствует в Helm-секрете, но `pdm.New(...)` не вызывается ни в одном бинарнике. Раздел оставлен для полноты; при фактическом использовании актуализируйте документ.
- Пути даны относительно базовых URL из окружения; итоговый URL = `<базовый адрес>` + `путь`.

View File

@ -1,60 +1,121 @@
---
apiVersion: apps/v1
kind: Deployment
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: cde-flowscallback
namespace: cde
labels:
app: cde-flowscallback
service: cde-flowscallback
spec:
replicas: 1
selector:
matchLabels:
app: cde-flowscallback
template:
metadata:
labels:
app: cde-flowscallback
service: cde-flowscallback
annotations:
traffic.sidecar.istio.io/excludeOutboundPorts: "8200"
vault.hashicorp.com/agent-init-first: "true"
vault.hashicorp.com/agent-inject: "true"
vault.hashicorp.com/agent-pre-populate-only: "true"
vault.hashicorp.com/auth-path: auth/kubernetes
vault.hashicorp.com/role: cde
vault.hashicorp.com/agent-inject-secret-cde-env: secrets/data/vault/apps/cde
vault.hashicorp.com/agent-inject-template-cde-env: |-
{{- with secret "secrets/data/vault/apps/cde" -}}
{{- range $k, $v := .Data.data }}
export {{ $k }}=$(printf '%b' {{ printf "%q" (printf "%v" $v) }})
{{- end }}
{{- end -}}
interval: 10m
chart:
spec:
serviceAccountName: cde-vault
containers:
- name: cde-flowscallback
image: cr.yandex/crp3ccidau046kdj8g9q/flowscallback-worker:prod_9f3c1d2a
imagePullPolicy: IfNotPresent
chart: universal-chart
version: "0.1.9"
sourceRef:
kind: HelmRepository
name: yc-oci-charts
namespace: flux-system
interval: 10m
install:
remediation:
retries: 3
upgrade:
remediation:
retries: 3
values:
global:
env: _default
services:
cde-flowscallback:
enabled: true
serviceAccount:
enabled:
_default: true
name:
_default: cde-vault
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/flowscallback-worker:preprod_4302d8f3
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: cde-flowscallback
replicaCount:
_default: 1
port:
_default: 8080
command:
- /bin/bash
- -lc
_default: ["/bin/bash", "-lc"]
args:
- |
set -e
source /vault/secrets/cde-env
exec /worker
ports:
- name: http
containerPort: 8000
protocol: TCP
env:
- name: S3_IS_CONTOUR
value: "true"
_default:
- |
set -e
cp /vault/secrets/cde-env .env
source .env
exec /worker
resources:
requests:
cpu: "25m"
memory: 128Mi
imagePullSecrets:
- name: regcred
cpu:
_default: 500m
memory:
_default: 1Gi
probes:
liveness:
enabled: false
readiness:
enabled: false
service:
enabled: false
imagePullSecrets:
enabled:
_default: true
name:
_default: regcred
envs:
- name: S3_IS_CONTOUR
value:
_default: "true"
- name: IS_CONTOUR
value:
_default: "true"
podAnnotations:
_default:
traffic.sidecar.istio.io/excludeOutboundPorts: "8200"
vault.hashicorp.com/agent-init-first: "true"
vault.hashicorp.com/agent-inject: "true"
vault.hashicorp.com/agent-pre-populate-only: "true"
vault.hashicorp.com/auth-path: auth/kubernetes
vault.hashicorp.com/role: cde
vault.hashicorp.com/agent-inject-secret-cde-env: secrets/data/vault/apps/cde
vault.hashicorp.com/agent-inject-template-cde-env: |-
{{- with secret "secrets/data/vault/apps/cde" -}}
{{- range $k, $v := .Data.data }}
export {{ $k }}=$(printf '%b' {{ printf "%q" (printf "%v" $v) }})
{{- end }}
{{- end -}}
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

View File

@ -1,60 +1,121 @@
---
apiVersion: apps/v1
kind: Deployment
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: cde-splitpdf
namespace: cde
labels:
app: cde-splitpdf
service: cde-splitpdf
spec:
replicas: 1
selector:
matchLabels:
app: cde-splitpdf
template:
metadata:
labels:
app: cde-splitpdf
service: cde-splitpdf
annotations:
traffic.sidecar.istio.io/excludeOutboundPorts: "8200"
vault.hashicorp.com/agent-init-first: "true"
vault.hashicorp.com/agent-inject: "true"
vault.hashicorp.com/agent-pre-populate-only: "true"
vault.hashicorp.com/auth-path: auth/kubernetes
vault.hashicorp.com/role: cde
vault.hashicorp.com/agent-inject-secret-cde-env: secrets/data/vault/apps/cde
vault.hashicorp.com/agent-inject-template-cde-env: |-
{{- with secret "secrets/data/vault/apps/cde" -}}
{{- range $k, $v := .Data.data }}
export {{ $k }}=$(printf '%b' {{ printf "%q" (printf "%v" $v) }})
{{- end }}
{{- end -}}
interval: 10m
chart:
spec:
serviceAccountName: cde-vault
containers:
- name: cde-splitpdf
image: cr.yandex/crp3ccidau046kdj8g9q/splitpdf-worker:prod_9f3c1d2a
imagePullPolicy: IfNotPresent
chart: universal-chart
version: "0.1.9"
sourceRef:
kind: HelmRepository
name: yc-oci-charts
namespace: flux-system
interval: 10m
install:
remediation:
retries: 3
upgrade:
remediation:
retries: 3
values:
global:
env: _default
services:
cde-splitpdf:
enabled: true
serviceAccount:
enabled:
_default: true
name:
_default: cde-vault
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/splitpdf-worker:preprod_4302d8f3
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: cde-splitpdf
replicaCount:
_default: 1
port:
_default: 8080
command:
- /bin/bash
- -lc
_default: ["/bin/bash", "-lc"]
args:
- |
set -e
source /vault/secrets/cde-env
exec /worker
ports:
- name: http
containerPort: 8000
protocol: TCP
env:
- name: S3_IS_CONTOUR
value: "true"
_default:
- |
set -e
cp /vault/secrets/cde-env .env
source .env
exec /worker
resources:
requests:
cpu: "25m"
memory: 128Mi
imagePullSecrets:
- name: regcred
cpu:
_default: 500m
memory:
_default: 1Gi
probes:
liveness:
enabled: false
readiness:
enabled: false
service:
enabled: false
imagePullSecrets:
enabled:
_default: true
name:
_default: regcred
envs:
- name: S3_IS_CONTOUR
value:
_default: "true"
- name: IS_CONTOUR
value:
_default: "true"
podAnnotations:
_default:
traffic.sidecar.istio.io/excludeOutboundPorts: "8200"
vault.hashicorp.com/agent-init-first: "true"
vault.hashicorp.com/agent-inject: "true"
vault.hashicorp.com/agent-pre-populate-only: "true"
vault.hashicorp.com/auth-path: auth/kubernetes
vault.hashicorp.com/role: cde
vault.hashicorp.com/agent-inject-secret-cde-env: secrets/data/vault/apps/cde
vault.hashicorp.com/agent-inject-template-cde-env: |-
{{- with secret "secrets/data/vault/apps/cde" -}}
{{- range $k, $v := .Data.data }}
export {{ $k }}=$(printf '%b' {{ printf "%q" (printf "%v" $v) }})
{{- end }}
{{- end -}}
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

View File

@ -0,0 +1,121 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: cde-worker-alert
namespace: cde
spec:
interval: 10m
chart:
spec:
chart: universal-chart
version: "0.1.9"
sourceRef:
kind: HelmRepository
name: yc-oci-charts
namespace: flux-system
interval: 10m
install:
remediation:
retries: 3
upgrade:
remediation:
retries: 3
values:
global:
env: _default
services:
cde-worker-alert:
enabled: true
serviceAccount:
enabled:
_default: true
name:
_default: cde-vault
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/orchestrator:preprod_4302d8f3
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: cde-worker-alert
replicaCount:
_default: 1
port:
_default: 8080
command:
_default: ["/bin/bash", "-lc"]
args:
_default:
- |
set -e
cp /vault/secrets/cde-env .env
source .env
exec /worker
resources:
requests:
cpu:
_default: 500m
memory:
_default: 1Gi
probes:
liveness:
enabled: false
readiness:
enabled: false
service:
enabled: false
imagePullSecrets:
enabled:
_default: true
name:
_default: regcred
envs:
- name: S3_IS_CONTOUR
value:
_default: "true"
- name: IS_CONTOUR
value:
_default: "true"
podAnnotations:
_default:
traffic.sidecar.istio.io/excludeOutboundPorts: "8200"
vault.hashicorp.com/agent-init-first: "true"
vault.hashicorp.com/agent-inject: "true"
vault.hashicorp.com/agent-pre-populate-only: "true"
vault.hashicorp.com/auth-path: auth/kubernetes
vault.hashicorp.com/role: cde
vault.hashicorp.com/agent-inject-secret-cde-env: secrets/data/vault/apps/cde
vault.hashicorp.com/agent-inject-template-cde-env: |-
{{- with secret "secrets/data/vault/apps/cde" -}}
{{- range $k, $v := .Data.data }}
export {{ $k }}=$(printf '%b' {{ printf "%q" (printf "%v" $v) }})
{{- end }}
{{- end -}}
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

View File

@ -1,60 +1,121 @@
---
apiVersion: apps/v1
kind: Deployment
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: cde-worker-copy
namespace: cde
labels:
app: cde-worker-copy
service: cde-worker-copy
spec:
replicas: 1
selector:
matchLabels:
app: cde-worker-copy
template:
metadata:
labels:
app: cde-worker-copy
service: cde-worker-copy
annotations:
traffic.sidecar.istio.io/excludeOutboundPorts: "8200"
vault.hashicorp.com/agent-init-first: "true"
vault.hashicorp.com/agent-inject: "true"
vault.hashicorp.com/agent-pre-populate-only: "true"
vault.hashicorp.com/auth-path: auth/kubernetes
vault.hashicorp.com/role: cde
vault.hashicorp.com/agent-inject-secret-cde-env: secrets/data/vault/apps/cde
vault.hashicorp.com/agent-inject-template-cde-env: |-
{{- with secret "secrets/data/vault/apps/cde" -}}
{{- range $k, $v := .Data.data }}
export {{ $k }}=$(printf '%b' {{ printf "%q" (printf "%v" $v) }})
{{- end }}
{{- end -}}
interval: 10m
chart:
spec:
serviceAccountName: cde-vault
containers:
- name: cde-worker-copy
image: cr.yandex/crp3ccidau046kdj8g9q/copy-worker:prod_9f3c1d2a
imagePullPolicy: IfNotPresent
chart: universal-chart
version: "0.1.9"
sourceRef:
kind: HelmRepository
name: yc-oci-charts
namespace: flux-system
interval: 10m
install:
remediation:
retries: 3
upgrade:
remediation:
retries: 3
values:
global:
env: _default
services:
cde-worker-copy:
enabled: true
serviceAccount:
enabled:
_default: true
name:
_default: cde-vault
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/copy-worker:preprod_4302d8f3
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: cde-worker-copy
replicaCount:
_default: 1
port:
_default: 8080
command:
- /bin/bash
- -lc
_default: ["/bin/bash", "-lc"]
args:
- |
set -e
source /vault/secrets/cde-env
exec /worker
ports:
- name: http
containerPort: 8000
protocol: TCP
env:
- name: S3_IS_CONTOUR
value: "true"
_default:
- |
set -e
cp /vault/secrets/cde-env .env
source .env
exec /worker
resources:
requests:
cpu: "25m"
memory: 128Mi
imagePullSecrets:
- name: regcred
cpu:
_default: "1"
memory:
_default: 1Gi
probes:
liveness:
enabled: false
readiness:
enabled: false
service:
enabled: false
imagePullSecrets:
enabled:
_default: true
name:
_default: regcred
envs:
- name: S3_IS_CONTOUR
value:
_default: "true"
- name: IS_CONTOUR
value:
_default: "true"
podAnnotations:
_default:
traffic.sidecar.istio.io/excludeOutboundPorts: "8200"
vault.hashicorp.com/agent-init-first: "true"
vault.hashicorp.com/agent-inject: "true"
vault.hashicorp.com/agent-pre-populate-only: "true"
vault.hashicorp.com/auth-path: auth/kubernetes
vault.hashicorp.com/role: cde
vault.hashicorp.com/agent-inject-secret-cde-env: secrets/data/vault/apps/cde
vault.hashicorp.com/agent-inject-template-cde-env: |-
{{- with secret "secrets/data/vault/apps/cde" -}}
{{- range $k, $v := .Data.data }}
export {{ $k }}=$(printf '%b' {{ printf "%q" (printf "%v" $v) }})
{{- end }}
{{- end -}}
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

View File

@ -0,0 +1,121 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: cde-worker-copyv2
namespace: cde
spec:
interval: 10m
chart:
spec:
chart: universal-chart
version: "0.1.9"
sourceRef:
kind: HelmRepository
name: yc-oci-charts
namespace: flux-system
interval: 10m
install:
remediation:
retries: 3
upgrade:
remediation:
retries: 3
values:
global:
env: _default
services:
cde-worker-copyv2:
enabled: true
serviceAccount:
enabled:
_default: true
name:
_default: cde-vault
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/copyv2-worker:preprod_4302d8f3
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: cde-worker-copyv2
replicaCount:
_default: 1
port:
_default: 8080
command:
_default: ["/bin/bash", "-lc"]
args:
_default:
- |
set -e
cp /vault/secrets/cde-env .env
source .env
exec /worker
resources:
requests:
cpu:
_default: "1"
memory:
_default: 1Gi
probes:
liveness:
enabled: false
readiness:
enabled: false
service:
enabled: false
imagePullSecrets:
enabled:
_default: true
name:
_default: regcred
envs:
- name: S3_IS_CONTOUR
value:
_default: "true"
- name: IS_CONTOUR
value:
_default: "true"
podAnnotations:
_default:
traffic.sidecar.istio.io/excludeOutboundPorts: "8200"
vault.hashicorp.com/agent-init-first: "true"
vault.hashicorp.com/agent-inject: "true"
vault.hashicorp.com/agent-pre-populate-only: "true"
vault.hashicorp.com/auth-path: auth/kubernetes
vault.hashicorp.com/role: cde
vault.hashicorp.com/agent-inject-secret-cde-env: secrets/data/vault/apps/cde
vault.hashicorp.com/agent-inject-template-cde-env: |-
{{- with secret "secrets/data/vault/apps/cde" -}}
{{- range $k, $v := .Data.data }}
export {{ $k }}=$(printf '%b' {{ printf "%q" (printf "%v" $v) }})
{{- end }}
{{- end -}}
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

View File

@ -1,60 +1,121 @@
---
apiVersion: apps/v1
kind: Deployment
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: cde-worker-create-versions
namespace: cde
labels:
app: cde-worker-create-versions
service: cde-worker-create-versions
spec:
replicas: 1
selector:
matchLabels:
app: cde-worker-create-versions
template:
metadata:
labels:
app: cde-worker-create-versions
service: cde-worker-create-versions
annotations:
traffic.sidecar.istio.io/excludeOutboundPorts: "8200"
vault.hashicorp.com/agent-init-first: "true"
vault.hashicorp.com/agent-inject: "true"
vault.hashicorp.com/agent-pre-populate-only: "true"
vault.hashicorp.com/auth-path: auth/kubernetes
vault.hashicorp.com/role: cde
vault.hashicorp.com/agent-inject-secret-cde-env: secrets/data/vault/apps/cde
vault.hashicorp.com/agent-inject-template-cde-env: |-
{{- with secret "secrets/data/vault/apps/cde" -}}
{{- range $k, $v := .Data.data }}
export {{ $k }}=$(printf '%b' {{ printf "%q" (printf "%v" $v) }})
{{- end }}
{{- end -}}
interval: 10m
chart:
spec:
serviceAccountName: cde-vault
containers:
- name: cde-worker-create-versions
image: cr.yandex/crp3ccidau046kdj8g9q/createversions-worker:prod_9f3c1d2a
imagePullPolicy: IfNotPresent
chart: universal-chart
version: "0.1.9"
sourceRef:
kind: HelmRepository
name: yc-oci-charts
namespace: flux-system
interval: 10m
install:
remediation:
retries: 3
upgrade:
remediation:
retries: 3
values:
global:
env: _default
services:
cde-worker-create-versions:
enabled: true
serviceAccount:
enabled:
_default: true
name:
_default: cde-vault
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/createversions-worker:preprod_4302d8f3
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: cde-worker-create-versions
replicaCount:
_default: 1
port:
_default: 8080
command:
- /bin/bash
- -lc
_default: ["/bin/bash", "-lc"]
args:
- |
set -e
source /vault/secrets/cde-env
exec /worker
ports:
- name: http
containerPort: 8000
protocol: TCP
env:
- name: S3_IS_CONTOUR
value: "true"
_default:
- |
set -e
cp /vault/secrets/cde-env .env
source .env
exec /worker
resources:
requests:
cpu: "25m"
memory: 128Mi
imagePullSecrets:
- name: regcred
cpu:
_default: 500m
memory:
_default: 512Mi
probes:
liveness:
enabled: false
readiness:
enabled: false
service:
enabled: false
imagePullSecrets:
enabled:
_default: true
name:
_default: regcred
envs:
- name: S3_IS_CONTOUR
value:
_default: "true"
- name: IS_CONTOUR
value:
_default: "true"
podAnnotations:
_default:
traffic.sidecar.istio.io/excludeOutboundPorts: "8200"
vault.hashicorp.com/agent-init-first: "true"
vault.hashicorp.com/agent-inject: "true"
vault.hashicorp.com/agent-pre-populate-only: "true"
vault.hashicorp.com/auth-path: auth/kubernetes
vault.hashicorp.com/role: cde
vault.hashicorp.com/agent-inject-secret-cde-env: secrets/data/vault/apps/cde
vault.hashicorp.com/agent-inject-template-cde-env: |-
{{- with secret "secrets/data/vault/apps/cde" -}}
{{- range $k, $v := .Data.data }}
export {{ $k }}=$(printf '%b' {{ printf "%q" (printf "%v" $v) }})
{{- end }}
{{- end -}}
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

View File

@ -0,0 +1,121 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: cde-worker-create-versionsv2
namespace: cde
spec:
interval: 10m
chart:
spec:
chart: universal-chart
version: "0.1.9"
sourceRef:
kind: HelmRepository
name: yc-oci-charts
namespace: flux-system
interval: 10m
install:
remediation:
retries: 3
upgrade:
remediation:
retries: 3
values:
global:
env: _default
services:
cde-worker-create-versionsv2:
enabled: true
serviceAccount:
enabled:
_default: true
name:
_default: cde-vault
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/createversionsv2-worker:preprod_4302d8f3
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: cde-worker-create-versionsv2
replicaCount:
_default: 1
port:
_default: 8080
command:
_default: ["/bin/bash", "-lc"]
args:
_default:
- |
set -e
cp /vault/secrets/cde-env .env
source .env
exec /worker
resources:
requests:
cpu:
_default: 500m
memory:
_default: 512Mi
probes:
liveness:
enabled: false
readiness:
enabled: false
service:
enabled: false
imagePullSecrets:
enabled:
_default: true
name:
_default: regcred
envs:
- name: S3_IS_CONTOUR
value:
_default: "true"
- name: IS_CONTOUR
value:
_default: "true"
podAnnotations:
_default:
traffic.sidecar.istio.io/excludeOutboundPorts: "8200"
vault.hashicorp.com/agent-init-first: "true"
vault.hashicorp.com/agent-inject: "true"
vault.hashicorp.com/agent-pre-populate-only: "true"
vault.hashicorp.com/auth-path: auth/kubernetes
vault.hashicorp.com/role: cde
vault.hashicorp.com/agent-inject-secret-cde-env: secrets/data/vault/apps/cde
vault.hashicorp.com/agent-inject-template-cde-env: |-
{{- with secret "secrets/data/vault/apps/cde" -}}
{{- range $k, $v := .Data.data }}
export {{ $k }}=$(printf '%b' {{ printf "%q" (printf "%v" $v) }})
{{- end }}
{{- end -}}
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

View File

@ -1,60 +1,121 @@
---
apiVersion: apps/v1
kind: Deployment
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: cde-worker-markings
namespace: cde
labels:
app: cde-worker-markings
service: cde-worker-markings
spec:
replicas: 1
selector:
matchLabels:
app: cde-worker-markings
template:
metadata:
labels:
app: cde-worker-markings
service: cde-worker-markings
annotations:
traffic.sidecar.istio.io/excludeOutboundPorts: "8200"
vault.hashicorp.com/agent-init-first: "true"
vault.hashicorp.com/agent-inject: "true"
vault.hashicorp.com/agent-pre-populate-only: "true"
vault.hashicorp.com/auth-path: auth/kubernetes
vault.hashicorp.com/role: cde
vault.hashicorp.com/agent-inject-secret-cde-env: secrets/data/vault/apps/cde
vault.hashicorp.com/agent-inject-template-cde-env: |-
{{- with secret "secrets/data/vault/apps/cde" -}}
{{- range $k, $v := .Data.data }}
export {{ $k }}=$(printf '%b' {{ printf "%q" (printf "%v" $v) }})
{{- end }}
{{- end -}}
interval: 10m
chart:
spec:
serviceAccountName: cde-vault
containers:
- name: cde-worker-markings
image: cr.yandex/crp3ccidau046kdj8g9q/markings-worker:prod_9f3c1d2a
imagePullPolicy: IfNotPresent
chart: universal-chart
version: "0.1.9"
sourceRef:
kind: HelmRepository
name: yc-oci-charts
namespace: flux-system
interval: 10m
install:
remediation:
retries: 3
upgrade:
remediation:
retries: 3
values:
global:
env: _default
services:
cde-worker-markings:
enabled: true
serviceAccount:
enabled:
_default: true
name:
_default: cde-vault
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/markings-worker:preprod_4302d8f3
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: cde-worker-markings
replicaCount:
_default: 1
port:
_default: 8080
command:
- /bin/bash
- -lc
_default: ["/bin/bash", "-lc"]
args:
- |
set -e
source /vault/secrets/cde-env
exec /worker
ports:
- name: http
containerPort: 8000
protocol: TCP
env:
- name: S3_IS_CONTOUR
value: "true"
_default:
- |
set -e
cp /vault/secrets/cde-env .env
source .env
exec /worker
resources:
requests:
cpu: "25m"
memory: 128Mi
imagePullSecrets:
- name: regcred
cpu:
_default: 500m
memory:
_default: 512Mi
probes:
liveness:
enabled: false
readiness:
enabled: false
service:
enabled: false
imagePullSecrets:
enabled:
_default: true
name:
_default: regcred
envs:
- name: S3_IS_CONTOUR
value:
_default: "true"
- name: IS_CONTOUR
value:
_default: "true"
podAnnotations:
_default:
traffic.sidecar.istio.io/excludeOutboundPorts: "8200"
vault.hashicorp.com/agent-init-first: "true"
vault.hashicorp.com/agent-inject: "true"
vault.hashicorp.com/agent-pre-populate-only: "true"
vault.hashicorp.com/auth-path: auth/kubernetes
vault.hashicorp.com/role: cde
vault.hashicorp.com/agent-inject-secret-cde-env: secrets/data/vault/apps/cde
vault.hashicorp.com/agent-inject-template-cde-env: |-
{{- with secret "secrets/data/vault/apps/cde" -}}
{{- range $k, $v := .Data.data }}
export {{ $k }}=$(printf '%b' {{ printf "%q" (printf "%v" $v) }})
{{- end }}
{{- end -}}
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

View File

@ -0,0 +1,121 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: cde-worker-markingsv2
namespace: cde
spec:
interval: 10m
chart:
spec:
chart: universal-chart
version: "0.1.9"
sourceRef:
kind: HelmRepository
name: yc-oci-charts
namespace: flux-system
interval: 10m
install:
remediation:
retries: 3
upgrade:
remediation:
retries: 3
values:
global:
env: _default
services:
cde-worker-markingsv2:
enabled: true
serviceAccount:
enabled:
_default: true
name:
_default: cde-vault
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/markingsv2-worker:preprod_4302d8f3
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: cde-worker-markingsv2
replicaCount:
_default: 1
port:
_default: 8080
command:
_default: ["/bin/bash", "-lc"]
args:
_default:
- |
set -e
cp /vault/secrets/cde-env .env
source .env
exec /worker
resources:
requests:
cpu:
_default: 500m
memory:
_default: 512Mi
probes:
liveness:
enabled: false
readiness:
enabled: false
service:
enabled: false
imagePullSecrets:
enabled:
_default: true
name:
_default: regcred
envs:
- name: S3_IS_CONTOUR
value:
_default: "true"
- name: IS_CONTOUR
value:
_default: "true"
podAnnotations:
_default:
traffic.sidecar.istio.io/excludeOutboundPorts: "8200"
vault.hashicorp.com/agent-init-first: "true"
vault.hashicorp.com/agent-inject: "true"
vault.hashicorp.com/agent-pre-populate-only: "true"
vault.hashicorp.com/auth-path: auth/kubernetes
vault.hashicorp.com/role: cde
vault.hashicorp.com/agent-inject-secret-cde-env: secrets/data/vault/apps/cde
vault.hashicorp.com/agent-inject-template-cde-env: |-
{{- with secret "secrets/data/vault/apps/cde" -}}
{{- range $k, $v := .Data.data }}
export {{ $k }}=$(printf '%b' {{ printf "%q" (printf "%v" $v) }})
{{- end }}
{{- end -}}
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

View File

@ -1,60 +1,121 @@
---
apiVersion: apps/v1
kind: Deployment
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: cde-worker-sign
namespace: cde
labels:
app: cde-worker-sign
service: cde-worker-sign
spec:
replicas: 1
selector:
matchLabels:
app: cde-worker-sign
template:
metadata:
labels:
app: cde-worker-sign
service: cde-worker-sign
annotations:
traffic.sidecar.istio.io/excludeOutboundPorts: "8200"
vault.hashicorp.com/agent-init-first: "true"
vault.hashicorp.com/agent-inject: "true"
vault.hashicorp.com/agent-pre-populate-only: "true"
vault.hashicorp.com/auth-path: auth/kubernetes
vault.hashicorp.com/role: cde
vault.hashicorp.com/agent-inject-secret-cde-env: secrets/data/vault/apps/cde
vault.hashicorp.com/agent-inject-template-cde-env: |-
{{- with secret "secrets/data/vault/apps/cde" -}}
{{- range $k, $v := .Data.data }}
export {{ $k }}=$(printf '%b' {{ printf "%q" (printf "%v" $v) }})
{{- end }}
{{- end -}}
interval: 10m
chart:
spec:
serviceAccountName: cde-vault
containers:
- name: cde-worker-sign
image: cr.yandex/crp3ccidau046kdj8g9q/sign-worker:prod_9f3c1d2a
imagePullPolicy: IfNotPresent
chart: universal-chart
version: "0.1.9"
sourceRef:
kind: HelmRepository
name: yc-oci-charts
namespace: flux-system
interval: 10m
install:
remediation:
retries: 3
upgrade:
remediation:
retries: 3
values:
global:
env: _default
services:
cde-worker-sign:
enabled: true
serviceAccount:
enabled:
_default: true
name:
_default: cde-vault
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/sign-worker:preprod_4302d8f3
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: cde-worker-sign
replicaCount:
_default: 1
port:
_default: 8080
command:
- /bin/bash
- -lc
_default: ["/bin/bash", "-lc"]
args:
- |
set -e
source /vault/secrets/cde-env
exec /worker
ports:
- name: http
containerPort: 8000
protocol: TCP
env:
- name: S3_IS_CONTOUR
value: "true"
_default:
- |
set -e
cp /vault/secrets/cde-env .env
source .env
exec /worker
resources:
requests:
cpu: "25m"
memory: 128Mi
imagePullSecrets:
- name: regcred
cpu:
_default: 500m
memory:
_default: 512Mi
probes:
liveness:
enabled: false
readiness:
enabled: false
service:
enabled: false
imagePullSecrets:
enabled:
_default: true
name:
_default: regcred
envs:
- name: S3_IS_CONTOUR
value:
_default: "true"
- name: IS_CONTOUR
value:
_default: "true"
podAnnotations:
_default:
traffic.sidecar.istio.io/excludeOutboundPorts: "8200"
vault.hashicorp.com/agent-init-first: "true"
vault.hashicorp.com/agent-inject: "true"
vault.hashicorp.com/agent-pre-populate-only: "true"
vault.hashicorp.com/auth-path: auth/kubernetes
vault.hashicorp.com/role: cde
vault.hashicorp.com/agent-inject-secret-cde-env: secrets/data/vault/apps/cde
vault.hashicorp.com/agent-inject-template-cde-env: |-
{{- with secret "secrets/data/vault/apps/cde" -}}
{{- range $k, $v := .Data.data }}
export {{ $k }}=$(printf '%b' {{ printf "%q" (printf "%v" $v) }})
{{- end }}
{{- end -}}
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

View File

@ -0,0 +1,121 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: cde-worker-signv2
namespace: cde
spec:
interval: 10m
chart:
spec:
chart: universal-chart
version: "0.1.9"
sourceRef:
kind: HelmRepository
name: yc-oci-charts
namespace: flux-system
interval: 10m
install:
remediation:
retries: 3
upgrade:
remediation:
retries: 3
values:
global:
env: _default
services:
cde-worker-signv2:
enabled: true
serviceAccount:
enabled:
_default: true
name:
_default: cde-vault
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/signv2-worker:preprod_4302d8f3
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: cde-worker-signv2
replicaCount:
_default: 1
port:
_default: 8080
command:
_default: ["/bin/bash", "-lc"]
args:
_default:
- |
set -e
cp /vault/secrets/cde-env .env
source .env
exec /worker
resources:
requests:
cpu:
_default: 500m
memory:
_default: 512Mi
probes:
liveness:
enabled: false
readiness:
enabled: false
service:
enabled: false
imagePullSecrets:
enabled:
_default: true
name:
_default: regcred
envs:
- name: S3_IS_CONTOUR
value:
_default: "true"
- name: IS_CONTOUR
value:
_default: "true"
podAnnotations:
_default:
traffic.sidecar.istio.io/excludeOutboundPorts: "8200"
vault.hashicorp.com/agent-init-first: "true"
vault.hashicorp.com/agent-inject: "true"
vault.hashicorp.com/agent-pre-populate-only: "true"
vault.hashicorp.com/auth-path: auth/kubernetes
vault.hashicorp.com/role: cde
vault.hashicorp.com/agent-inject-secret-cde-env: secrets/data/vault/apps/cde
vault.hashicorp.com/agent-inject-template-cde-env: |-
{{- with secret "secrets/data/vault/apps/cde" -}}
{{- range $k, $v := .Data.data }}
export {{ $k }}=$(printf '%b' {{ printf "%q" (printf "%v" $v) }})
{{- end }}
{{- end -}}
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

View File

@ -1,60 +1,121 @@
---
apiVersion: apps/v1
kind: Deployment
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: cde-worker-update-bundles
namespace: cde
labels:
app: cde-worker-update-bundles
service: cde-worker-update-bundles
spec:
replicas: 1
selector:
matchLabels:
app: cde-worker-update-bundles
template:
metadata:
labels:
app: cde-worker-update-bundles
service: cde-worker-update-bundles
annotations:
traffic.sidecar.istio.io/excludeOutboundPorts: "8200"
vault.hashicorp.com/agent-init-first: "true"
vault.hashicorp.com/agent-inject: "true"
vault.hashicorp.com/agent-pre-populate-only: "true"
vault.hashicorp.com/auth-path: auth/kubernetes
vault.hashicorp.com/role: cde
vault.hashicorp.com/agent-inject-secret-cde-env: secrets/data/vault/apps/cde
vault.hashicorp.com/agent-inject-template-cde-env: |-
{{- with secret "secrets/data/vault/apps/cde" -}}
{{- range $k, $v := .Data.data }}
export {{ $k }}=$(printf '%b' {{ printf "%q" (printf "%v" $v) }})
{{- end }}
{{- end -}}
interval: 10m
chart:
spec:
serviceAccountName: cde-vault
containers:
- name: cde-worker-update-bundles
image: cr.yandex/crp3ccidau046kdj8g9q/updatebundles-worker:prod_9f3c1d2a
imagePullPolicy: IfNotPresent
chart: universal-chart
version: "0.1.9"
sourceRef:
kind: HelmRepository
name: yc-oci-charts
namespace: flux-system
interval: 10m
install:
remediation:
retries: 3
upgrade:
remediation:
retries: 3
values:
global:
env: _default
services:
cde-worker-update-bundles:
enabled: true
serviceAccount:
enabled:
_default: true
name:
_default: cde-vault
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/updatebundles-worker:preprod_4302d8f3
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: cde-worker-update-bundles
replicaCount:
_default: 1
port:
_default: 8080
command:
- /bin/bash
- -lc
_default: ["/bin/bash", "-lc"]
args:
- |
set -e
source /vault/secrets/cde-env
exec /worker
ports:
- name: http
containerPort: 8000
protocol: TCP
env:
- name: S3_IS_CONTOUR
value: "true"
_default:
- |
set -e
cp /vault/secrets/cde-env .env
source .env
exec /worker
resources:
requests:
cpu: "25m"
memory: 128Mi
imagePullSecrets:
- name: regcred
cpu:
_default: 500m
memory:
_default: 512Mi
probes:
liveness:
enabled: false
readiness:
enabled: false
service:
enabled: false
imagePullSecrets:
enabled:
_default: true
name:
_default: regcred
envs:
- name: S3_IS_CONTOUR
value:
_default: "true"
- name: IS_CONTOUR
value:
_default: "true"
podAnnotations:
_default:
traffic.sidecar.istio.io/excludeOutboundPorts: "8200"
vault.hashicorp.com/agent-init-first: "true"
vault.hashicorp.com/agent-inject: "true"
vault.hashicorp.com/agent-pre-populate-only: "true"
vault.hashicorp.com/auth-path: auth/kubernetes
vault.hashicorp.com/role: cde
vault.hashicorp.com/agent-inject-secret-cde-env: secrets/data/vault/apps/cde
vault.hashicorp.com/agent-inject-template-cde-env: |-
{{- with secret "secrets/data/vault/apps/cde" -}}
{{- range $k, $v := .Data.data }}
export {{ $k }}=$(printf '%b' {{ printf "%q" (printf "%v" $v) }})
{{- end }}
{{- end -}}
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

View File

@ -1,60 +1,140 @@
---
apiVersion: apps/v1
kind: Deployment
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: cde
namespace: cde
labels:
app: cde
service: cde
spec:
replicas: 1
selector:
matchLabels:
app: cde
template:
metadata:
labels:
app: cde
service: cde
annotations:
traffic.sidecar.istio.io/excludeOutboundPorts: "8200"
vault.hashicorp.com/agent-init-first: "true"
vault.hashicorp.com/agent-inject: "true"
vault.hashicorp.com/agent-pre-populate-only: "true"
vault.hashicorp.com/auth-path: auth/kubernetes
vault.hashicorp.com/role: cde
vault.hashicorp.com/agent-inject-secret-cde-env: secrets/data/vault/apps/cde
vault.hashicorp.com/agent-inject-template-cde-env: |-
{{- with secret "secrets/data/vault/apps/cde" -}}
{{- range $k, $v := .Data.data }}
export {{ $k }}=$(printf '%b' {{ printf "%q" (printf "%v" $v) }})
{{- end }}
{{- end -}}
interval: 10m
chart:
spec:
serviceAccountName: cde-vault
containers:
- name: api
image: cr.yandex/crp3ccidau046kdj8g9q/cde:prod_9f3c1d2a
imagePullPolicy: IfNotPresent
chart: universal-chart
version: "0.1.9"
sourceRef:
kind: HelmRepository
name: yc-oci-charts
namespace: flux-system
interval: 10m
install:
remediation:
retries: 3
upgrade:
remediation:
retries: 3
values:
global:
env: _default
services:
cde:
enabled: true
serviceAccount:
enabled:
_default: true
name:
_default: cde-vault
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/cde:preprod_4302d8f3
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: cde
replicaCount:
_default: 1
port:
_default: 8080
command:
- /bin/bash
- -lc
_default: ["/bin/bash", "-lc"]
args:
- |
set -e
source /vault/secrets/cde-env
exec /http
ports:
- name: http
containerPort: 8000
protocol: TCP
env:
- name: S3_IS_CONTOUR
value: "true"
_default:
- |
set -e
cp /vault/secrets/cde-env .env
source .env
exec /http
resources:
requests:
cpu: "25m"
memory: 128Mi
imagePullSecrets:
- name: regcred
cpu:
_default: 500m
memory:
_default: 512Mi
probes:
liveness:
enabled: false
readiness:
enabled: false
service:
enabled: true
name:
_default: cde-svc
type:
_default: ClusterIP
port:
_default: 80
targetPort:
_default: 8080
portName:
_default: http
imagePullSecrets:
enabled:
_default: true
name:
_default: regcred
envs:
- name: SAREX_BACKEND_BASE_URL
value:
_default: "https://lk.sarex.io"
- name: S3_IS_CONTOUR
value:
_default: "true"
- name: IS_CONTOUR
value:
_default: "true"
podAnnotations:
_default:
traffic.sidecar.istio.io/excludeOutboundPorts: "8200"
vault.hashicorp.com/agent-init-first: "true"
vault.hashicorp.com/agent-inject: "true"
vault.hashicorp.com/agent-pre-populate-only: "true"
vault.hashicorp.com/auth-path: auth/kubernetes
vault.hashicorp.com/role: cde
vault.hashicorp.com/agent-inject-secret-cde-env: secrets/data/vault/apps/cde
vault.hashicorp.com/agent-inject-template-cde-env: |-
{{- with secret "secrets/data/vault/apps/cde" -}}
{{- range $k, $v := .Data.data }}
export {{ $k }}=$(printf '%b' {{ printf "%q" (printf "%v" $v) }})
{{- end }}
{{- end -}}
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

View File

@ -4,13 +4,16 @@ kind: Kustomization
namespace: cde
resources:
- namespace.yaml
- serviceaccount.yaml
- cde.yaml
- cde-splitpdf.yaml
- backend-service.yaml
- cde-flowscallback.yaml
- cde-worker-alert.yaml
- cde-worker-copy.yaml
- cde-worker-copyv2.yaml
- cde-worker-create-versions.yaml
- cde-worker-create-versionsv2.yaml
- cde-worker-markings.yaml
- cde-worker-markingsv2.yaml
- cde-worker-sign.yaml
- cde-worker-signv2.yaml
- cde-worker-update-bundles.yaml

View File

@ -5,3 +5,4 @@ metadata:
name: cde
labels:
istio-injection: enabled
security.deckhouse.io/pod-policy: privileged

View File

@ -1,5 +0,0 @@
apiVersion: v1
kind: ServiceAccount
metadata:
name: cde-vault
namespace: cde

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,10 @@
---
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../base
patches:
- path: namespace.yaml
target:
kind: Namespace
name: cde

Some files were not shown because too many files have changed in this diff Show More