Compare commits

..

144 Commits
aero ... master

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
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
409 changed files with 42503 additions and 4390 deletions

View File

@ -1,25 +0,0 @@
# В контекст сборки нужны только манифесты: clusters/, apps/, infrastructure/
# и скрипты из hack/. Всё остальное — история, IDE, секреты — только раздувает
# контекст и рискует уехать в образ.
.git
.gitignore
.idea
.claude
CLAUDE.md
.env
.env.*
docs
*.md
aero
inventory.yaml
tmp
.tmp/
snapshots
out
# Секреты и ключи не должны попадать в контекст сборки даже случайно.
*.pem
*.key
*.p12
kubeconfig*
*service-account*.json

16
.gitignore vendored
View File

@ -1,21 +1,9 @@
.idea
.claude
CLAUDE.md
.env
.env.*
tmp
.tmp/
snapshots/*
# Рантайм-артефакты контура aero (gitea-data, k3s-storage, ключи реестра)
# переехали в infra/aero-deploy вместе с docker-compose, который их создаёт.
# Здесь остаётся только gitea-data: каталог мог остаться от прежней раскладки.
gitea-data/
# --- Секреты и ключи: не коммитить никогда ---
*.pem
*.key
*.p12
kubeconfig*
*service-account*.json
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`.

View File

@ -1,77 +0,0 @@
# Полная сборка манифестов IaC-репозитория для одного контура.
#
# docker build --build-arg CONTOUR=aero -t iac:aero .
# docker run --rm iac:aero list # что собралось
# docker run --rm iac:aero cat clusters # слои Flux одним потоком
# docker run --rm -v "$PWD/out:/export" iac:aero export
#
# Контур — имя каталога в clusters/ (aero, brusnika-prod, dsinv, wb, ...).
# Тот же идентификатор служит именем overlay внутри apps/* и infrastructure/*,
# поэтому одного аргумента хватает на весь рендер.
#
# Сборка офлайновая: kustomize build разворачивает оверлеи и патчи, а
# HelmRelease остаётся Custom Resource'ом — чарты тянет Flux уже в кластере.
# Ни helm, ни доступ к OCI-реестру здесь не нужны. Исключение — валидация:
# схемы CRD kubeconform берёт из сети (отключается VALIDATE=0).
ARG KUSTOMIZE_VERSION=v5.4.3
ARG KUBECONFORM_VERSION=v0.6.7
FROM registry.k8s.io/kustomize/kustomize:${KUSTOMIZE_VERSION} AS kustomize
FROM ghcr.io/yannh/kubeconform:${KUBECONFORM_VERSION} AS kubeconform
FROM alpine:3.20 AS builder
# Контур обязателен по смыслу, но значение по умолчанию оставлено: сборка без
# --build-arg собирает aero, а не падает на пустой переменной.
ARG CONTOUR=aero
ARG VALIDATE=1
ARG KUBERNETES_VERSION=1.30.0
COPY --from=kustomize /app/kustomize /usr/local/bin/kustomize
COPY --from=kubeconform /kubeconform /usr/local/bin/kubeconform
WORKDIR /src
# Скрипт копируется отдельным слоем: правка манифестов не инвалидирует его,
# а правка скрипта не тянет за собой пересборку базовых слоёв.
COPY hack/render-contour.sh /usr/local/bin/render-contour
RUN chmod +x /usr/local/bin/render-contour
COPY . .
RUN render-contour "${CONTOUR}" /out
# Валидация отдельным слоем: смена версии Kubernetes не пересобирает рендер.
# --ignore-missing-schemas пропускает ресурсы, чьих схем нет в каталоге
# (часть CRD), но не заглушает ошибки в тех, что нашлись.
RUN if [ "${VALIDATE}" = "1" ]; then \
kubeconform \
-kubernetes-version "${KUBERNETES_VERSION}" \
-strict \
-ignore-missing-schemas \
-schema-location default \
-schema-location 'https://raw.githubusercontent.com/datreeio/CRDs-catalog/main/{{.Group}}/{{.ResourceKind}}_{{.ResourceAPIVersion}}.json' \
-summary \
/out/*.yaml ; \
else \
echo "VALIDATE=0 — проверка схемами пропущена" ; \
fi
FROM alpine:3.20
ARG CONTOUR=aero
ENV CONTOUR=${CONTOUR}
LABEL org.opencontainers.image.title="iac-manifests" \
org.opencontainers.image.description="Собранные манифесты контура ${CONTOUR}" \
ru.iac.contour="${CONTOUR}"
COPY --from=builder /out /manifests
COPY hack/entrypoint.sh /usr/local/bin/entrypoint
RUN chmod +x /usr/local/bin/entrypoint
ENTRYPOINT ["/usr/local/bin/entrypoint"]
CMD ["list"]

View File

@ -60,7 +60,7 @@ Superset, Trino, GoAlert, GlitchTip, argo-*, otel-*) **существуют об
| Репозиторий | Зона ответственности | Ключевое содержимое |
|---|---|---|
| ★ [infra/iac](https://gitlab.sarex.io/infra/iac) ✅ | **Основной GitOps-монорепозиторий (Flux v2).** Декларативное состояние 9 кластеров: инфраструктурные компоненты + прикладные сервисы. Только манифесты — развёртывание контура aero выделено в [infra/aero-deploy](https://gitlab.sarex.io/infra/aero-deploy) | `clusters/`, `infrastructure/` (36), `apps/` (37), `inventory.yaml`, `docs/apps/` |
| ★ [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` |
@ -74,7 +74,6 @@ Superset, Trino, GoAlert, GlitchTip, argo-*, otel-*) **существуют об
| Репозиторий | Отвечает за |
|---|---|
| [infra/aero-deploy](https://gitlab.sarex.io/infra/aero-deploy) ✅ | **Изолированный контур aero на одном хосте**: ansible-роли (`base`, `docker`, `sarex_stack`) + `docker-compose.yaml` подложки — k3s тремя контейнерами, gitea как источник правды, Vault, bootstrap FluxCD. Манифесты берёт из `infra/iac` (`flux_src_root`) и синхронизирует в gitea контура. Выделен из `infra/iac` |
| [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/` |

View File

@ -369,23 +369,6 @@ flowchart LR
│ └── patches/ # Патчи поверх base
```
### Чего здесь нет: развёртывание контура aero
Машинерия подъёма самого хоста живёт в отдельном репозитории
[`infra/aero-deploy`](https://gitlab.sarex.io/infra/aero-deploy): ansible-роли,
`docker-compose.yaml` подложки (k3s, gitea, vault, bootstrap Flux),
конфигурация Vault и k3s-манифесты DNS-мостов. Здесь остаётся только то, что
раскатывает Flux.
Связь между репозиториями односторонняя: роль `sarex_stack` пакует отсюда
`clusters/aero` и его замыкание (переменная `gitea_sync_paths`) и коммитит в
gitea внутри контура, откуда это читает Flux. Путь к этому репозиторию роль
берёт из `flux_src_root`, по умолчанию — соседний каталог `../iac`.
Практическое следствие: **добавили компонент в `clusters/aero/controllers`
допишите его в `gitea_sync_paths`** в `aero-deploy`, иначе kustomize в кластере
упадёт на отсутствующем каталоге. Обратной ссылки нет, и забыть об этом легко.
## Как это работает
Flux отслеживает директорию `clusters/<имя-кластера>/`. Каждый кластер содержит два Flux Kustomization CRD верхнего уровня:

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,6 @@
---
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: ams-sync
resources:
- ../base

View File

@ -1,10 +1,11 @@
---
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: ams-sync
resources:
- ../base
patches:
- path: postgresql.yaml
- path: patch.yaml
target:
kind: HelmRelease
name: postgresql
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,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

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: bim
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

View File

@ -1,224 +0,0 @@
---
# BIM API — приложение из aero/bimbackend (Python, api + worker).
#
# ЭТО НЕ ТО ЖЕ, ЧТО apps/bim/base. В base описан platform/bim-backend-v2 —
# другой сервис, на Go, с единственным httpserver. Спутать их легко: ОБА
# пушат в реестр один и тот же образ bim-api, и различаются только тегами и
# содержимым. У bimbackend теги — полный SHA коммита (CI пушит
# bim-api:${CI_COMMIT_SHA} с master), у bim-backend-v2 — contour_*.
# Поэтому здесь ../base намеренно НЕ подключён.
#
# Манифесты обычные, а не HelmRelease с universal-chart: в репозитории этот
# сервис так и описан (apps/bim/dsinv), своего чарта у него нет, и заводить
# его ради контура значило бы поддерживать ещё одну сущность.
apiVersion: v1
kind: ServiceAccount
metadata:
name: bim-api-sa
namespace: bim
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: bim-api
namespace: bim
labels:
app: bim-api
spec:
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: bim-api
template:
metadata:
labels:
app: bim-api
annotations:
# Порт Vault исключён из перехвата sidecar'ом: сам Vault живёт вне
# кластера, и заворачивать обращения к нему в mesh незачем.
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
# БД. Имена переменных — DB_*, как их читает settings.py bimbackend,
# а не POSTGRES_*, как у остальных приложений контура.
vault.hashicorp.com/agent-inject-secret-bim-db: secrets/data/apps/bim/postgres
vault.hashicorp.com/agent-inject-template-bim-db: |-
{{- with secret "secrets/data/apps/bim/postgres" -}}
DB_HOST={{ index .Data.data "host" }}
DB_PORT={{ index .Data.data "port" }}
DB_USER={{ index .Data.data "username" }}
DB_PASSWORD={{ index .Data.data "password" }}
{{- end -}}
vault.hashicorp.com/agent-inject-secret-bim-rabbitmq: secrets/data/rabbitmq/apps/bim
vault.hashicorp.com/agent-inject-template-bim-rabbitmq: |-
{{- with secret "secrets/data/rabbitmq/apps/bim" -}}
RABBIT_USER={{ index .Data.data "username" }}
RABBIT_PASSWORD={{ index .Data.data "password" }}
{{- end -}}
vault.hashicorp.com/agent-inject-secret-bim-s3: secrets/data/minio/apps/bim
vault.hashicorp.com/agent-inject-template-bim-s3: |-
{{- with secret "secrets/data/minio/apps/bim" -}}
AWS_ACCESS_KEY_ID={{ index .Data.data "access_key" }}
AWS_SECRET_ACCESS_KEY={{ index .Data.data "secret_key" }}
{{- end -}}
# Публичный ключ JWT отдаётся файлом. Оба флага аутентификации ниже
# выключены, то есть читаться он не должен, — но путь в переменной
# обязан существовать, иначе рискуем падением при импорте настроек.
vault.hashicorp.com/agent-inject-secret-jwt-public: secrets/data/vault/common/rsa_keys
vault.hashicorp.com/agent-inject-template-jwt-public: |-
{{- with secret "secrets/data/vault/common/rsa_keys" -}}
{{ index .Data.data "public_key" }}
{{- end -}}
spec:
serviceAccountName: bim-api-sa
imagePullSecrets:
- name: regcred
containers:
- name: bim-api
# Тег — полный SHA, как их пушит CI aero/bimbackend с master. Именно
# этот образ крутится в dsinv. contour_*-теги у образа bim-api брать
# НЕЛЬЗЯ: их собирает bim-backend-v2, это чужое приложение.
image: cr.yandex/crp3ccidau046kdj8g9q/bim-api:870965d1967cd761965029b0480884ab7fa7c951
imagePullPolicy: IfNotPresent
# Штатный entrypoint не умеет читать секреты из файлов, поэтому
# оборачиваем его: подгружаем отрендеренное vault-агентом и передаём
# управление. exec — чтобы приложение осталось процессом с PID 1 и
# корректно получало сигналы остановки.
command: ["/bin/sh", "-ec"]
args:
- |
set -a
[ -f /vault/secrets/bim-db ] && . /vault/secrets/bim-db
[ -f /vault/secrets/bim-rabbitmq ] && . /vault/secrets/bim-rabbitmq
[ -f /vault/secrets/bim-s3 ] && . /vault/secrets/bim-s3
set +a
exec ./entrypoint_api.sh
ports:
- containerPort: 5555
name: http
protocol: TCP
- containerPort: 9000
name: prom
protocol: TCP
env:
- name: JWT_PUBLIC_KEY_PATH
value: /vault/secrets/jwt-public
- name: FEATURE_ENABLE_JWT_AUTH
value: "false"
- name: FEATURE_ENABLE_SAREX_AUTH
value: "false"
- name: FEATURE_ENABLE_WORKSPACES
value: "true"
# Google-хранилища в контуре нет и не будет — флаг выключен.
# Том с ключом, который есть в dsinv, здесь не нужен, а сама
# переменная ниже нужна, см. комментарий к ней.
- name: FEATURE_ENABLE_GCLOUD
value: "false"
# Значение НЕ УДАЛЯТЬ, даже при выключенном флаге выше. settings.py
# делает check_settings(): проходит по всем ключам ENV_FIELDS и
# падает на первом же незаданном —
# Exception: ENV_VARIABLE NOT SET: GOOGLE_APPLICATION_CREDENTIALS
# Флаги проверяются позже, до них дело не доходит. Файла по этому
# пути нет и не будет: при FEATURE_ENABLE_GCLOUD=false его никто не
# открывает, важно лишь наличие самой переменной.
- name: GOOGLE_APPLICATION_CREDENTIALS
value: /etc/sarex/google-storage/service_account.json
# ВНИМАНИЕ: S3 в этом приложении НЕ НАСТРАИВАЕТСЯ на MinIO.
# В storage/s3.py адрес зашит в код:
# endpoint_url='https://storage.yandexcloud.net'
# переменной окружения для него нет. Из контура он недостижим,
# поэтому любые операции с файлами будут падать по таймауту —
# это принято осознанно, API и остальные эндпоинты живут.
# Починить можно только пересборкой образа с вынесенным endpoint
# либо переводом на BIM_CURRENT_STORAGE=local (тип есть в
# storage/storages.py).
- name: FEATURE_ENABLE_S3
value: "true"
- name: S3_BUCKET
value: sarex-media-storage
- name: BIM_CURRENT_STORAGE
value: s3
- name: AWS_DEFAULT_REGION
value: ru-central1
- name: FEATURE_ENABLE_PROCESSING
value: "1"
# Адреса смежных сервисов приведены к именам контура. В dsinv это
# workflows-service:8000 и workspaces-service:8000 — таких сервисов
# здесь нет, оба называются backend-svc и слушают 80.
- name: PROCESSING_API_URL
value: http://backend-svc.processing.svc.cluster.local:80/internal
- name: PROCESSING_C2M_VERSION
value: stable
- name: WORKSPACES_API_URL
value: http://backend-svc.workspaces.svc.cluster.local:80/internal
# Сервиса сравнений в контуре нет и не планируется, флага для его
# отключения приложение не предоставляет. Имя оставлено говорящим:
# в логах будет видно, куда именно оно не достучалось.
- name: COMPARATOR_API_URL
value: http://comparator-api-service.comparator.svc.cluster.local/internal
- name: BIM_API_EXTERNAL_HOST_SCHEMA
value: https
- name: BIM_API_EXTERNAL_HOST
value: bim.sarex.local.lonsdaleites.ru
- name: BIM_API_INTERNAL_HOST_SCHEMA
value: http
- name: BIM_API_INTERNAL_HOST
value: bim-api-service.bim.svc.cluster.local:5555
- name: WEBHOOK_URL
value: http://bim-api-service.bim.svc.cluster.local:5555
# Брокер общий, vhost по умолчанию. В dsinv vhost называется api,
# но в контуре отдельных vhost'ов нет — см. secrets/rabbitmq/*.
- name: RABBIT_HOST
value: rabbitmq.rabbitmq.svc.cluster.local:5672
- name: RABBIT_VHOST
value: "/"
- 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: prometheus_multiproc_dir
value: /tmp
- name: BUNDLE_VERSION
value: v1
- name: DISABLE_INSTANCING
value: "0"
resources:
requests:
cpu: 25m
memory: 200Mi
volumeMounts:
- mountPath: /tmp
name: tmp-volume
volumes:
- name: tmp-volume
emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
name: bim-api-service
namespace: bim
labels:
app: bim-api
spec:
# ClusterIP, а не NodePort с прибитым портом 31352, как в dsinv: наружу
# сервис выходит через общий Gateway и VirtualService контура, отдельный
# порт на нодах ему не нужен.
type: ClusterIP
ports:
- name: http
port: 5555
targetPort: 5555
protocol: TCP
selector:
app: bim-api

View File

@ -1,157 +0,0 @@
---
# Воркер bimbackend. Крутит тот же образ и те же настройки, что api, —
# отличается только точкой входа (entrypoint_worker.sh) и отсутствием портов.
# Обоснования переменных не дублирую, они в bim-api.yaml.
apiVersion: v1
kind: ServiceAccount
metadata:
name: bim-worker-sa
namespace: bim
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: bim-worker
namespace: bim
labels:
app: bim-worker
spec:
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: bim-worker
template:
metadata:
labels:
app: bim-worker
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-db: secrets/data/apps/bim/postgres
vault.hashicorp.com/agent-inject-template-bim-db: |-
{{- with secret "secrets/data/apps/bim/postgres" -}}
DB_HOST={{ index .Data.data "host" }}
DB_PORT={{ index .Data.data "port" }}
DB_USER={{ index .Data.data "username" }}
DB_PASSWORD={{ index .Data.data "password" }}
{{- end -}}
vault.hashicorp.com/agent-inject-secret-bim-rabbitmq: secrets/data/rabbitmq/apps/bim
vault.hashicorp.com/agent-inject-template-bim-rabbitmq: |-
{{- with secret "secrets/data/rabbitmq/apps/bim" -}}
RABBIT_USER={{ index .Data.data "username" }}
RABBIT_PASSWORD={{ index .Data.data "password" }}
{{- end -}}
vault.hashicorp.com/agent-inject-secret-bim-s3: secrets/data/minio/apps/bim
vault.hashicorp.com/agent-inject-template-bim-s3: |-
{{- with secret "secrets/data/minio/apps/bim" -}}
AWS_ACCESS_KEY_ID={{ index .Data.data "access_key" }}
AWS_SECRET_ACCESS_KEY={{ index .Data.data "secret_key" }}
{{- end -}}
vault.hashicorp.com/agent-inject-secret-jwt-public: secrets/data/vault/common/rsa_keys
vault.hashicorp.com/agent-inject-template-jwt-public: |-
{{- with secret "secrets/data/vault/common/rsa_keys" -}}
{{ index .Data.data "public_key" }}
{{- end -}}
spec:
serviceAccountName: bim-worker-sa
imagePullSecrets:
- name: regcred
containers:
- name: bim-worker
image: cr.yandex/crp3ccidau046kdj8g9q/bim-api:870965d1967cd761965029b0480884ab7fa7c951
imagePullPolicy: IfNotPresent
command: ["/bin/sh", "-ec"]
args:
- |
set -a
[ -f /vault/secrets/bim-db ] && . /vault/secrets/bim-db
[ -f /vault/secrets/bim-rabbitmq ] && . /vault/secrets/bim-rabbitmq
[ -f /vault/secrets/bim-s3 ] && . /vault/secrets/bim-s3
set +a
exec ./entrypoint_worker.sh
env:
- name: JWT_PUBLIC_KEY_PATH
value: /vault/secrets/jwt-public
- 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"
# Значение НЕ УДАЛЯТЬ, даже при выключенном флаге выше. settings.py
# делает check_settings(): проходит по всем ключам ENV_FIELDS и
# падает на первом же незаданном —
# Exception: ENV_VARIABLE NOT SET: GOOGLE_APPLICATION_CREDENTIALS
# Флаги проверяются позже, до них дело не доходит. Файла по этому
# пути нет и не будет: при FEATURE_ENABLE_GCLOUD=false его никто не
# открывает, важно лишь наличие самой переменной.
- name: GOOGLE_APPLICATION_CREDENTIALS
value: /etc/sarex/google-storage/service_account.json
- name: FEATURE_ENABLE_S3
value: "true"
- name: S3_BUCKET
value: sarex-media-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://backend-svc.processing.svc.cluster.local:80/internal
- name: PROCESSING_C2M_VERSION
value: stable
- name: WORKSPACES_API_URL
value: http://backend-svc.workspaces.svc.cluster.local:80/internal
- name: COMPARATOR_API_URL
value: http://comparator-api-service.comparator.svc.cluster.local/internal
- name: BIM_API_EXTERNAL_HOST_SCHEMA
value: https
- name: BIM_API_EXTERNAL_HOST
value: bim.sarex.local.lonsdaleites.ru
- name: BIM_API_INTERNAL_HOST_SCHEMA
value: http
- name: BIM_API_INTERNAL_HOST
value: bim-api-service.bim.svc.cluster.local:5555
- name: WEBHOOK_URL
value: http://bim-api-service.bim.svc.cluster.local:5555
# В dsinv у воркера здесь rabbitmq-service.bim:5672 — брокера в
# namespace bim нет ни там, ни здесь; у api в том же файле адрес
# другой и правильный. Ставим общий брокер контура.
- name: RABBIT_HOST
value: rabbitmq.rabbitmq.svc.cluster.local:5672
- name: RABBIT_VHOST
value: "/"
- 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: prometheus_multiproc_dir
value: /tmp
- name: BUNDLE_VERSION
value: v1
- name: DISABLE_INSTANCING
value: "0"
resources:
requests:
cpu: 25m
memory: 200Mi
volumeMounts:
- mountPath: /tmp
name: tmp-volume
volumes:
- name: tmp-volume
emptyDir: {}

View File

@ -1,11 +0,0 @@
---
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: bim
# ../base НЕ подключён намеренно: там описан platform/bim-backend-v2 — другое
# приложение, которое разворачивать в контуре не нужно. Подробности в шапке
# bim-api.yaml.
resources:
- namespace.yaml
- bim-api.yaml
- bim-worker.yaml

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

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

File diff suppressed because it is too large Load Diff

View File

@ -35,7 +35,7 @@ spec:
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/checklists-backend:preprod_b1980fc6
_default: cr.yandex/crp3ccidau046kdj8g9q/checklists-backend:production_3d148228
pullPolicy:
_default: IfNotPresent

View File

@ -0,0 +1,134 @@
---
# standalone HelmRelease по образцу apps/checklists/wb/backend.yaml — base
# vault-native, в ugok Vault не используется.
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: checklists
namespace: checklists
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:
checklists:
enabled: true
image:
name:
_default: 10.4.10.187:80/library/checklists-backend:production_3d148228
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: checklists-backend
replicaCount:
_default: 1
port:
_default: 8000
resources:
requests:
cpu:
_default: 25m
memory:
_default: 128Mi
service:
enabled: true
name:
_default: checklists-backend-service
type:
_default: ClusterIP
port:
_default: 80
targetPort:
_default: 8000
portName:
_default: http
envs:
- name: HTTP_APP_HOST
value:
_default: "0.0.0.0"
- name: HTTP_APP_PORT
value:
_default: "8000"
- name: HTTP_APP_ROOT_PATH
value:
_default: /checklists
- name: HTTP_APP_WORKERS
value:
_default: "8"
- name: HTTP_APP_ADMIN_ENABLE
value:
_default: "true"
- name: JWT_AUTH_ENABLE
value:
_default: "true"
- name: DEBUG
value:
_default: "false"
secretEnvs:
- name: DATABASE_HOST
secretName:
_default: checklists-postgresql-secret
secretKey: hostname
- name: DATABASE_PORT
secretName:
_default: checklists-postgresql-secret
secretKey: port
- name: DATABASE_NAME
secretName:
_default: checklists-postgresql-secret
secretKey: database
- name: DATABASE_USER
secretName:
_default: checklists-postgresql-secret
secretKey: username
- name: DATABASE_PASSWORD
secretName:
_default: checklists-postgresql-secret
secretKey: password
- name: JWT_AUTH_PUBLIC_KEY
secretName:
_default: checklists-public-key
secretKey: key
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

View File

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

View File

@ -0,0 +1,157 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: checklists-backend
namespace: checklists
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:
checklists-backend:
enabled: true
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/checklists-backend:production_3d148228
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: checklists-backend
replicaCount:
_default: 1
port:
_default: 80
resources:
limits:
cpu:
_default: 20m
memory:
_default: 1023Mi
requests:
cpu:
_default: 10m
memory:
_default: 818Mi
probes:
liveness:
enabled: false
readiness:
enabled: false
service:
enabled: true
name:
_default: checklists-backend-service
type:
_default: ClusterIP
port:
_default: 80
targetPort:
_default: 8000
portName:
_default: http
imagePullSecrets:
enabled:
_default: true
name:
_default: dockerhub
envs:
- name: HTTP_APP_HOST
value:
_default: "0.0.0.0"
- name: HTTP_APP_PORT
value:
_default: "8000"
- name: HTTP_APP_ROOT_PATH
value:
_default: "/checklists"
- name: HTTP_APP_WORKERS
value:
_default: "8"
- name: HTTP_APP_ADMIN_ENABLE
value:
_default: "true"
- name: DATABASE_HOST
value:
_default: "sarex-vpsql-01.xc.wb.ru"
- name: DATABASE_PORT
value:
_default: "5432"
- name: DATABASE_NAME
value:
_default: "checklists_db"
- name: JWT_AUTH_ENABLE
value:
_default: "true"
- name: DEBUG
value:
_default: "false"
secretEnvs:
- name: DATABASE_USER
secretName:
_default: "postgres-secret"
secretKey: "user"
- name: DATABASE_PASSWORD
secretName:
_default: "postgres-secret"
secretKey: "password"
- name: JWT_AUTH_PUBLIC_KEY
secretName:
_default: "jwt-secret"
secretKey: "public-key"
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

View File

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

View File

@ -0,0 +1,228 @@
---
# standalone HelmRelease — base vault-native, в ugok Vault не используется.
# volumes (tasks-execution-config) убраны: в живом дампе кластера у backend
# нет volumeMounts вообще, ни такого ConfigMap'а в namespace.
# Образ оставлен как в ugok (в wb — другое имя репозитория образа целиком,
# не просто тег, см. предыдущее решение по этому приложению).
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: backend
namespace: comparisons
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: cr.yandex/crp3ccidau046kdj8g9q/comparisons-backend:c864f102a3a476b9a80658148da2b3f7acb772ac
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-service
type:
_default: ClusterIP
port:
_default: 8000
targetPort:
_default: 8000
portName:
_default: http
envs:
- name: HTTP_PORT
value:
_default: "8080"
- name: LAST_MASTER_BIM
value:
_default: "100_000"
- name: APP_NAME
value:
_default: comparisons-api-v2
- name: APP_VERSION
value:
_default: 0.0.1
- name: LOGGER_LOG_LEVEL
value:
_default: info
- name: DATABASE_HOST
value:
_default: postgres-service
- name: DATABASE_PORT
value:
_default: "5432"
- name: DATABASE_NAME
value:
_default: postgres
- name: DATABASE_DB
value:
_default: comparisons_db
- name: API_ADDRESS
value:
_default: 0.0.0.0:8080
- name: API_ADDRESS_FILE
value:
_default: 0.0.0.0:8080
- name: ENABLE_SQL_QUERY
value:
_default: "0"
- name: DOCUMENTATIONS_INTERNAL_HOST
value:
_default: http://documentations-api.documentations.svc.cluster.local:8080
- name: DOCUMENTATIONS_EXTERNAL_HOST
value:
_default: http://documentations-api.documentations.svc.cluster.local:8080/
- name: DOCUMENTATION_URL
value:
_default: http://documentations-api.documentations.svc.cluster.local:8080/
- name: DOCUMENTATION_FILESTREAM_URL
value:
_default: http://documentations-filestream.documentations.svc.cluster.local:8080/
- name: WORKFLOWS_HOST
value:
_default: http://workflows-api-service.workflow.svc.cluster.local:8000/
- name: EAV_HOST
value:
_default: http://eav-service.eav.svc.cluster.local:8000
- name: WORKSPACES_HOST
value:
_default: http://backend-svc.workspaces.svc.cluster.local:8000/
- name: COMPARISON_URL
value:
_default: http://backend-service.comparisons.svc.cluster.local:8000/
- name: WORKFLOWS_IMAGE_VERSION
value:
_default: master
- name: EXTERNAL_DOCUMENTATION_URL
value:
_default: http://documentations-api.documentations.svc.cluster.local:8080/
- name: WORKFLOWS_BIMV2_INTERNAL_HOST
value:
_default: http://backend-svc.bim.svc.cluster.local:8000/
- name: ENABLE_SSL
value:
_default: "0"
- name: WORKFLOWS_DJANGO_HOST
value:
_default: http://backend.django.svc.cluster.local:8000
- name: POSTGRES_POOL_SIZE
value:
_default: "10"
- name: LAST_SLAVE_1_BIM
value:
_default: "94015"
- name: LAST_SLAVE_2_BIM
value:
_default: "135771"
- name: ABAP_FIXED_CONC
value:
_default: "0"
- name: WORKFLOWS_CONFIG_FILEPATH
value:
_default: /etc/app/tasks-execution-config.json
secretEnvs:
- name: DATABASE_USER
secretName:
_default: comparisons-postgresql-secret
secretKey: username
- name: DATABASE_PASSWORD
secretName:
_default: comparisons-postgresql-secret
secretKey: password
- name: AUTH_PUBLIC_KEY
secretName:
_default: public-key
secretKey: key
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

View File

@ -0,0 +1,88 @@
---
# volumes (nginx-configmap) убраны: в живом дампе кластера у frontend нет
# volumeMounts и такого ConfigMap'а в namespace.
# Образ оставлен как в ugok (в wb — другое имя репозитория образа целиком).
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: frontend
namespace: comparisons
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/comparisons-frontend-static:69d50235fdc8fd654ae63308e23fc27f28e9cd99_relative
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-service
type:
_default: ClusterIP
port:
_default: 80
targetPort:
_default: 80
portName:
_default: http

View File

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

View File

@ -0,0 +1,94 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: backend
namespace: comparisons
spec:
values:
services:
backend:
envs:
- name: APP_NAME
value:
_default: "comparisons"
- name: APP_VERSION
value:
_default: "0.0.1"
- name: LOGGER_LOG_LEVEL
value:
_default: "info"
- name: DATABASE_NAME
value:
_default: "postgres"
- name: ENABLE_SSL
value:
_default: "false"
- name: POSTGRES_POOL_SIZE
value:
_default: "10"
- name: HTTP_PORT
value:
_default: "8000"
- name: DOCUMENTATIONS_INTERNAL_HOST
value:
_default: "http://documentations-service.documentations"
- name: DOCUMENTATIONS_EXTERNAL_HOST
value:
_default: "https://lk.srx.wb.ru:30443/documentations"
- name: DOCUMENTATION_FILESTREAM_URL
value:
_default: "http://backend-filestream-svc.documentations.svc.cluster.local/"
- name: WORKFLOWS_HOST
value:
_default: "http://workflows-service.workflow"
- name: WORKFLOWS_IMAGE_VERSION
value:
_default: "master"
- name: WORKFLOWS_DJANGO_HOST
value:
_default: "https://lk.srx.wb.ru:30443"
- name: WORKFLOWS_BIMV2_INTERNAL_HOST
value:
_default: "http://bim-backend-v2-service.bim-api"
- name: WORKSPACES_HOST
value:
_default: "http://workspaces-service.workspaces"
- name: EAV_HOST
value:
_default: "https://lk.srx.wb.ru:30443/eav"
- name: LAST_MASTER_BIM
value:
_default: "36311"
- name: LAST_SLAVE_1_BIM
value:
_default: "94015"
- name: LAST_SLAVE_2_BIM
value:
_default: "135771"
- name: ABAP_FIXED_CONC
value:
_default: "0"
- name: WORKFLOWS_CONFIG_FILEPATH
value:
_default: "/etc/app/tasks-execution-config.json"

View File

@ -1,10 +1,11 @@
---
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: comparisons
resources:
- ../base
patches:
- path: local-path-provisioner.yaml
- path: backend.yaml
target:
kind: HelmRelease
name: local-path-provisioner
name: backend

View File

@ -0,0 +1,94 @@
---
# standalone HelmRelease по образцу apps/contracts/wb/backend.yaml — base
# vault-native, в ugok Vault не используется.
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: contracts
namespace: contracts
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:
contracts:
enabled: true
image:
name:
_default: 10.4.10.187:80/library/contracts:prod_d3bbd9fc
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: backend
replicaCount:
_default: 1
port:
_default: 8080
probes:
liveness:
enabled: false
readiness:
enabled: false
service:
enabled: true
name:
_default: backend-svc
type:
_default: ClusterIP
port:
_default: 8000
targetPort:
_default: 8080
portName:
_default: http
secretEnvs:
- name: DB_URL
secretName:
_default: contracts-postgresql-secret
secretKey: url
- name: PUBLIC_KEY
secretName:
_default: contracts-public-key
secretKey: key
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

View File

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

View File

@ -0,0 +1,111 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: contracts
namespace: contracts
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:
contracts:
enabled: true
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/contracts:prod_d3bbd9fc
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: contracts
replicaCount:
_default: 1
port:
_default: 8080
resources:
limits:
cpu:
_default: 20m
memory:
_default: 48Mi
requests:
cpu:
_default: 10m
memory:
_default: 32Mi
probes:
liveness:
enabled: false
readiness:
enabled: false
service:
enabled: true
name:
_default: contracts-service
type:
_default: ClusterIP
port:
_default: 8080
targetPort:
_default: 8080
portName:
_default: http
imagePullSecrets:
enabled:
_default: true
name:
_default: dockerhub
secretEnvs:
- name: DB_URL
secretName:
_default: "ya-pg-secret"
secretKey: "db_url"
- name: PUBLIC_KEY
secretName:
_default: "public-key"
secretKey: "key"
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

View File

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

View File

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

View File

@ -0,0 +1,13 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: frontend
namespace: control-interface
spec:
values:
services:
frontend:
image:
name:
_default: 10.4.10.187:80/library/srx-admin:prod_638c3442

View File

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

View File

@ -0,0 +1,15 @@
---
# В ugok образ реально называется cross-section-static (не cross-section-app,
# как в base) — берём как есть из дампа кластера.
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: cross-section-static
namespace: cross-section
spec:
values:
services:
frontend:
image:
name:
_default: 10.4.10.187:80/library/cross-section-static:988a872bfe72ca29ffa6a43e074b94118e9e655a

View File

@ -101,6 +101,7 @@ Module Federation) конфигурируется отдельно на этап
| `JWT_PUBLIC_KEY` | string | — | Публичный RSA-ключ проверки |
| `JWT_KID` | string | `None` | `kid` в заголовке токена (используется для межсервисных вызовов) |
| `DJANGO_JWT_SECRET` | string | `Froom too much love of living` | Легаси-секрет |
| `SERVER_SUPERSET_JWT_SECRET` | string | `""` | hmac-секрет для embedded superset guest token. В контуре wb берётся из k8s-секрета `superset-jwt-secret`, ключ `jwt_secret` |
### Celery (`CELERY_*`)
@ -299,11 +300,19 @@ Module Federation) конфигурируется отдельно на этап
| `django-kafka` | `secrets/data/kafka/apps/django` | `KAFKA_BOOTSTRAP_SERVERS/SECURITY_PROTOCOL/SASL_*` |
| `django-jwt-private` / `django-jwt-public` | `secrets/data/vault/common/rsa_keys` | `JWT_PRIVATE_KEY` / `JWT_PUBLIC_KEY` |
| `django-common` | `secrets/data/vault/common/django_auth` | `ZITADEL_ACCESS_TOKEN` |
| `superset-jwt-secret` | k8s-секрет в неймспейсе `django` | `SERVER_SUPERSET_JWT_SECRET` для `/api/analytics/widgets/<id>/superset_guest_token/` |
Контейнер экспортирует эти файлы в окружение до запуска (`set -a; . /vault/secrets/...`).
Кроме того, `production.py` из ConfigMap содержит функцию `_load_env_file`, которая
подхватывает те же файлы при запуске `manage.py` через `kubectl exec` вне entrypoint.
Для wb superset guest token не использует сервисную учётку Guest Token API: backend
формирует jwt локально и подписывает его `SERVER_SUPERSET_JWT_SECRET`, а superset
проверяет тем же значением через `GUEST_TOKEN_JWT_SECRET = os.getenv("JWT_SECRET")`.
Оба значения должны совпадать: `superset/jwt-secret` используется superset как
`JWT_SECRET`, а `django/superset-jwt-secret` используется backend как
`SERVER_SUPERSET_JWT_SECRET`.
Остальные (несекретные) переменные задаются в блоке `env` контейнеров
`backend`/`celery` (`SERVER_*`, `WORKFLOWS_*`, `BIMV2_*`, `MEASUREMENTS_*`,
`ZITADEL_HOST`, `KAFKA_TOPICS`, `EAV_ENABLE`, `PDM_SYNC`, `JWT_KID` и др.).

View File

@ -1,262 +0,0 @@
---
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: django
resources:
- ../base
patches:
# Свой nginx.conf вместо базового: в base зашиты upstream'ы на namespace,
# которых в контуре нет, и nginx из-за этого не стартовал. Подробности —
# в шапке nginx-configmap.yaml.
#
# ИМЕННО ПАТЧ, а не resources. Объект с тем же kind+name уже пришёл из
# ../base, и добавление его вторым ресурсом валит сборку целиком:
# may not add resource with an already registered id:
# ConfigMap.v1.[noGrp]/nginx-configmap.django
# Перекрывать базовый ресурс можно только патчем.
- path: nginx-configmap.yaml
target:
kind: ConfigMap
name: nginx-configmap
# Настройки django: в base захардкожен домен ЧУЖОГО контура. По нему backend
# строил абсолютные ссылки на медиа, и браузер уходил на
# https://sarex.contour.infra.sarex.tech/media/state/previews/....png
# получая 404. Причина копии та же, что у nginx-configmap: настройки лежат
# одним значением data.production.py, заменить можно только целиком.
- path: django-configmap.yaml
target:
kind: ConfigMap
name: django-configmap
# --- celery: те же правки, что и у backend --------------------------------
# Worker крутит тот же образ и те же настройки, поэтому и расхождения с base
# у него ровно те же: нет Kafka, нет Zitadel, MinIO живёт внутри кластера.
# Обоснования — в блоке backend ниже, здесь не дублирую.
#
# SERVER_ZITADEL_ENABLED правки не требует: в base у celery он уже "False"
# (в отличие от backend).
- target: {kind: HelmRelease, name: celery}
patch: |
- op: remove
path: /spec/values/services/celery/podAnnotations/_default/vault.hashicorp.com~1agent-inject-secret-django-kafka
- op: remove
path: /spec/values/services/celery/podAnnotations/_default/vault.hashicorp.com~1agent-inject-template-django-kafka
- op: remove
path: /spec/values/services/celery/podAnnotations/_default/vault.hashicorp.com~1agent-inject-secret-django-common
- op: remove
path: /spec/values/services/celery/podAnnotations/_default/vault.hashicorp.com~1agent-inject-template-django-common
- op: replace
path: /spec/values/services/celery/podAnnotations/_default/vault.hashicorp.com~1agent-inject-template-django-s3
value: |-
{{- with secret "secrets/data/minio/apps/django" }}
AWS_S3_ENDPOINT_URL=http://minio.minio.svc.cluster.local:9000
S3_HOST=http://minio.minio.svc.cluster.local:9000
{{- $buckets := index .Data.data "buckets" }}
S3_BUCKET={{ if gt (len $buckets) 0 }}{{ index (index $buckets 0) "name" }}{{ else }}django{{ end }}
S3_LOGIN={{ index .Data.data "access_key" }}
S3_PASSWORD={{ index .Data.data "secret_key" }}
{{- end }}
# Стартовый скрипт без подключения django-kafka: этого секрета в контуре
# нет. migrate и создание администратора сюда НЕ добавляются — схемой
# владеет backend, а два процесса, катящих миграции наперегонки при
# одновременном старте, — это гонка на ровном месте.
- op: replace
path: /spec/values/services/celery/deployment/args/_default/0
value: |
set -a
[ -f /vault/secrets/django-postgresql ] && . /vault/secrets/django-postgresql
[ -f /vault/secrets/django-rabbitmq ] && . /vault/secrets/django-rabbitmq
[ -f /vault/secrets/django-s3 ] && . /vault/secrets/django-s3
[ -f /vault/secrets/django-jwt-private ] && export JWT_PRIVATE_KEY="$(cat /vault/secrets/django-jwt-private)"
[ -f /vault/secrets/django-jwt-public ] && export JWT_PUBLIC_KEY="$(cat /vault/secrets/django-jwt-public)"
set +a
exec celery -A config worker -B -l info -E -Q default -n default_worker.%h --concurrency=2
# Адреса на wb.sarex.io — чужой контур, из aero недостижим. В base их
# четыре, и все четыре у celery: у backend те же переменные уже указывают
# внутрь кластера. WORKFLOWS_USE=1, так что оставить как есть — значит
# получить зависания на недоступном домене вместо явной ошибки.
- op: test
path: /spec/values/services/celery/envs/15/name
value: SERVER_API_HOST
- op: replace
path: /spec/values/services/celery/envs/15/value/_default
value: https://sarex.local.lonsdaleites.ru
- op: test
path: /spec/values/services/celery/envs/16/name
value: SERVER_HOST
- op: replace
path: /spec/values/services/celery/envs/16/value/_default
value: https://sarex.local.lonsdaleites.ru
- op: test
path: /spec/values/services/celery/envs/17/name
value: WORKFLOWS_HOST
- op: replace
path: /spec/values/services/celery/envs/17/value/_default
value: http://backend-svc.processing.svc.cluster.local:80
- op: test
path: /spec/values/services/celery/envs/18/name
value: WORKFLOWS_BASE_HOST
- op: replace
path: /spec/values/services/celery/envs/18/value/_default
value: http://backend-svc.django.svc.cluster.local:80
# Тег образа выравнен с backend. В base у celery production_a96dead0, а у
# backend production_f813140d — worker и web крутили бы разный код, и
# рассинхрон вылезал бы не при старте, а на конкретной задаче: worker
# десериализует аргументы по своей версии модели.
- op: replace
path: /spec/values/services/celery/image/name/_default
value: cr.yandex/crp3ccidau046kdj8g9q/backend:production_f813140d
# --- s3-proxy: S3 внутри кластера ------------------------------------------
# В base адрес MinIO зашит ВНУТРИ vault-шаблона:
# AWS_API_ENDPOINT=https://minio.contour.infra.sarex.tech
# Это чужой контур. Через values не перекрыть — значение внутри шаблона
# аннотации, поэтому заменяем аннотацию целиком, как у backend и celery.
#
# Проявлялось не отказом в соединении, а тем, что s3-proxy ДОСТУЧАЛСЯ до
# чужого MinIO и получил от него настоящий ответ S3:
# SignatureDoesNotMatch: The request signature we calculated does not
# match the signature you provided
# наружу это выглядело как 500 на каждую плитку /media/orthophotos/...
# Наши ключи в чужом хранилище, разумеется, не подходят — и хорошо, что так:
# иначе контур молча читал бы и писал в чужой S3.
- target: {kind: HelmRelease, name: s3-proxy}
patch: |
- op: replace
path: /spec/values/services/s3-proxy/podAnnotations/_default/vault.hashicorp.com~1agent-inject-template-s3
value: |
{{- with secret "secrets/data/minio/apps/django" }}
AWS_API_ENDPOINT=http://minio.minio.svc.cluster.local:9000
{{- $buckets := index .Data.data "buckets" }}
AWS_S3_BUCKET={{ if gt (len $buckets) 0 }}{{ index (index $buckets 0) "name" }}{{ else }}django{{ end }}
AWS_ACCESS_KEY_ID={{ index .Data.data "access_key" }}
AWS_SECRET_ACCESS_KEY={{ index .Data.data "secret_key" }}
{{- end }}
# --- backend: убираем зависимости, которых в контуре нет ------------------
- target: {kind: HelmRelease, name: backend}
patch: |
# Kafka и Zitadel в контуре не развёрнуты. Само приложение без них живёт:
# * SERVER_KAFKA_ENABLED в base уже "False", а в sarex-backend продюсер
# создаётся только под флагом (config/settings/deps/kafka.py);
# * zitadel_enabled читается ровно в одном месте — update_ams_user()
# в sarex/core/utils.py, которая при выключенном флаге сразу выходит.
# К аутентификации Zitadel отношения не имеет.
#
# Но аннотации инжекции убрать ОБЯЗАТЕЛЬНО: vault-agent-init не отрендерит
# шаблон для несуществующего секрета, упадёт, и под навсегда останется в
# Init:Error — приложение до своих флагов даже не дойдёт.
#
# В JSON Pointer слэш внутри ключа экранируется как ~1, поэтому
# vault.hashicorp.com/agent-... записан как vault.hashicorp.com~1agent-...
- op: remove
path: /spec/values/services/backend/podAnnotations/_default/vault.hashicorp.com~1agent-inject-secret-django-kafka
- op: remove
path: /spec/values/services/backend/podAnnotations/_default/vault.hashicorp.com~1agent-inject-template-django-kafka
- op: remove
path: /spec/values/services/backend/podAnnotations/_default/vault.hashicorp.com~1agent-inject-secret-django-common
- op: remove
path: /spec/values/services/backend/podAnnotations/_default/vault.hashicorp.com~1agent-inject-template-django-common
# S3 внутри кластера, а не через внешний домен. В base шаблон прибит к
# https://minio.contour.infra.sarex.tech — чужому домену, который отсюда
# не резолвится. Через values это не перекрыть: адрес зашит ВНУТРИ
# vault-шаблона аннотации, поэтому заменяем аннотацию целиком.
# Ходим напрямую в сервис MinIO, как это делал compose-стек.
- op: replace
path: /spec/values/services/backend/podAnnotations/_default/vault.hashicorp.com~1agent-inject-template-django-s3
value: |-
{{- with secret "secrets/data/minio/apps/django" }}
AWS_S3_ENDPOINT_URL=http://minio.minio.svc.cluster.local:9000
S3_HOST=http://minio.minio.svc.cluster.local:9000
{{- $buckets := index .Data.data "buckets" }}
S3_BUCKET={{ if gt (len $buckets) 0 }}{{ index (index $buckets 0) "name" }}{{ else }}django{{ end }}
S3_LOGIN={{ index .Data.data "access_key" }}
S3_PASSWORD={{ index .Data.data "secret_key" }}
{{- end }}
# Выключаем Zitadel. Операция test перед replace — страховка от смещения
# индекса: если в base порядок envs изменится, патч упадёт явно, вместо
# того чтобы молча перезаписать соседнюю переменную.
- op: test
path: /spec/values/services/backend/envs/2/name
value: SERVER_ZITADEL_ENABLED
- op: replace
path: /spec/values/services/backend/envs/2/value/_default
value: "False"
# Адреса на чужой контур. У celery те же две переменные поправлены выше,
# у backend они оставались с sarex.contour.infra.sarex.tech.
- op: test
path: /spec/values/services/backend/envs/17/name
value: SERVER_API_HOST
- op: replace
path: /spec/values/services/backend/envs/17/value/_default
value: https://sarex.local.lonsdaleites.ru
- op: test
path: /spec/values/services/backend/envs/18/name
value: SERVER_HOST
- op: replace
path: /spec/values/services/backend/envs/18/value/_default
value: https://sarex.local.lonsdaleites.ru
# --- Администратор платформы --------------------------------------------
# Учётка приезжает из Vault под именами, которые ждёт штатная
# createsuperuser --noinput. Секрет кладёт ansible
# (vault_app_secrets, secrets/apps/django/superuser).
- op: add
path: /spec/values/services/backend/podAnnotations/_default/vault.hashicorp.com~1agent-inject-secret-django-superuser
value: secrets/data/apps/django/superuser
- op: add
path: /spec/values/services/backend/podAnnotations/_default/vault.hashicorp.com~1agent-inject-template-django-superuser
value: |-
{{- with secret "secrets/data/apps/django/superuser" -}}
DJANGO_SUPERUSER_USERNAME={{ index .Data.data "username" }}
DJANGO_SUPERUSER_EMAIL={{ index .Data.data "email" }}
DJANGO_SUPERUSER_PASSWORD={{ index .Data.data "password" }}
{{- end -}}
# Стартовый скрипт целиком, а не точечная правка: JSON6902 умеет заменять
# только элемент списка, а вся логика запуска — один shell-блок args[0].
# Отличия от base:
# * не подключается django-kafka — этого секрета в контуре нет;
# * добавлены migrate и создание администратора.
#
# Почему migrate здесь, хотя его же делает /opt/sarex/entrypoint.sh:
# там он запущен без set -e, и его падение НИКАК не мешает uwsgi
# стартовать. Именно так контур несколько часов отдавал 200 на /admin/
# с пустой схемой БД, пока backend не мог аутентифицироваться. Здесь
# команда выполняется под set -e из command базы (/bin/sh -ec), поэтому
# неудача валит под в CrashLoopBackOff — то есть становится видимой.
# Повторный прогон внутри entrypoint.sh при уже накатанной схеме
# отрабатывает вхолостую за секунды.
- op: replace
path: /spec/values/services/backend/deployment/args/_default/0
value: |
set -a
[ -f /vault/secrets/django-postgresql ] && . /vault/secrets/django-postgresql
[ -f /vault/secrets/django-rabbitmq ] && . /vault/secrets/django-rabbitmq
[ -f /vault/secrets/django-s3 ] && . /vault/secrets/django-s3
[ -f /vault/secrets/django-superuser ] && . /vault/secrets/django-superuser
[ -f /vault/secrets/django-jwt-private ] && export JWT_PRIVATE_KEY="$(cat /vault/secrets/django-jwt-private)"
[ -f /vault/secrets/django-jwt-public ] && export JWT_PUBLIC_KEY="$(cat /vault/secrets/django-jwt-public)"
set +a
python manage.py migrate --noinput
# Идемпотентно по построению: команда отрабатывает при КАЖДОМ старте
# пода, а на уже существующем логине штатно возвращает
# "That username is already taken" с ненулевым кодом. Ошибка ожидаема
# и гасится веткой else, иначе set -e ронял бы под на втором запуске.
if [ -n "${DJANGO_SUPERUSER_USERNAME:-}" ]; then
if python manage.py createsuperuser --noinput; then
echo "entrypoint: администратор создан"
else
echo "entrypoint: администратор уже существует, пропускаем"
fi
fi
exec /opt/sarex/entrypoint.sh

View File

@ -1,194 +0,0 @@
# Копия nginx-configmap из base с правками под контур aero.
#
# Патчем это сделать нельзя: конфиг лежит одной строкой в data.nginx.conf,
# и kustomize умеет только заменить значение целиком.
#
# ЧТО ИЗМЕНЕНО ОТНОСИТЕЛЬНО base — три вещи:
#
# 1. Убран location /api/pm/. Сервис pm в контуре не нужен и не планируется.
#
# 2. Для workspaces и processing адрес вынесен в переменную и добавлен
# resolver. Причина: nginx резолвит все upstream'ы ПРИ СТАРТЕ и падает
# целиком, если хоть один не найден:
# nginx: [emerg] host not found in upstream "backend-svc.pm..."
# Из-за этого весь frontend уходил в CrashLoopBackOff, хотя не работал
# лишь один маршрут. С переменной nginx откладывает резолвинг до запроса:
# сейчас эти пути отдают 502, а когда сервисы приедут — заработают сами,
# без правки конфига и перезапуска.
#
# ПОРЯДОК ДИРЕКТИВ ВНУТРИ ТАКОГО location ЗНАЧИМ: set обязан идти ДО
# rewrite ... break. Обе директивы принадлежат ngx_http_rewrite_module, а
# флаг break прекращает обработку его директив в этом location — set после
# него просто не выполняется, переменная остаётся пустой, и запрос падает с
# [error] no host in upstream ":80"
# отдавая наружу 500. Именно так и было: / работал, а /workspaces-v2/... и
# /workflows/... возвращали 500, пока set стоял ниже rewrite.
#
# 3. backend-svc оставлен прямой ссылкой: он в этом же namespace и существует
# всегда, откладывать его резолвинг незачем — наоборот, ошибка в имени
# обнаружится сразу при старте.
#
# Адрес resolver'а — CoreDNS кластера. В k3s он называется kube-dns
# (имя сохранено для совместимости), namespace kube-system.
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-configmap
namespace: django
data:
nginx.conf: |
worker_processes auto;
pid /var/run/nginx.pid;
events {
use epoll;
worker_connections 1024;
}
http {
# Basic Settings
large_client_header_buffers 8 128k;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 300;
types_hash_max_size 2048;
client_max_body_size 5000M;
client_header_buffer_size 5M;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Logging Settings
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
# GZIP Settings
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# Резолвер нужен для upstream'ов, заданных переменной (см. ниже).
resolver kube-dns.kube-system.svc.cluster.local valid=30s ipv6=off;
server {
listen 80;
listen [::]:80;
root /opt/react_client/;
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Methods' '*' always;
add_header 'Access-Control-Allow-Headers' '*' always;
location = /static/index.bundle.js {
add_header Cache-Control 'no-store no-cache, must-revalidate, proxy-revalidate, max-age=0';
if_modified_since off;
expires off;
}
# Выбор способа аутентификации. Фронтенд на старте делает
# fetch("/static/config.json") и, если там есть auth_type,
# БЕЗУСЛОВНО перекрывает им режим, зашитый в сборку
# (src/Model/api/http-service.ts). Значения ровно два:
# "zitadel" и "original"; original — классический вход по
# логину и паролю с JWT, ради которого backend и получает из
# Vault ключи RS512.
#
# В образе sarex-frontend-dev:contour_* этот файл лежит со
# значением zitadel и хостом zitadel.contour.infra.sarex.tech —
# чужой контур, из aero недоступен. Из-за него платформа
# редиректила на /oauth/v2/authorize и получала
# invalid_request: The requested redirect_uri is missing
# in the client configuration
# то есть войти было нельзя в принципе.
#
# Отдаём файл прямо из nginx, не подкладывая том: сам
# static/config.json в sarex-frontend лежит в .gitignore и
# заполняется на каждом стенде своим — это штатная точка
# расширения, а не обход. В апстримном nginx.conf под него уже
# заведён такой же location =, только читающий с диска.
#
# Подменить через localStorage нельзя: оверрайд оттуда
# действует лишь для endpoint'ов stage, preprod и local,
# contour в этом списке нет.
#
# ВАЖНО ПРИ ПРОВЕРКЕ: правка НЕ видна с первой перезагрузки.
# Класс Config (src/shared/config/config.ts) держит копию в
# localStorage под ключом "config" и на старте берёт СИНХРОННО
# кеш, а файл сверяет уже асинхронно:
# if (this.cacheData) { this.data = this.cacheData;
# this.invalidateCache(); }
# а http-service.ts читает auth_type в момент импорта модуля.
# Поэтому первая загрузка после правки лишь обновляет кеш, а
# применяется он со второй. Ускорить —
# localStorage.removeItem('config')
# Консоль удобно открыть на /static/config.json: тот же origin,
# но JS не выполняется и редиректа на Zitadel не будет.
location = /static/config.json {
default_type application/json;
add_header Cache-Control 'no-store no-cache, must-revalidate, proxy-revalidate, max-age=0';
if_modified_since off;
expires off;
return 200 '{"auth_type":"original"}';
}
# location /api/pm/ из base удалён: сервис pm контуру не нужен.
location ~^/(api|admin)/ {
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_pass http://backend-svc.django.svc.cluster.local:80;
}
# workspaces появится позже — резолвим лениво, через переменную.
location ~^/workspaces-v2/(.+).js {
proxy_http_version 1.1;
proxy_set_header Connection "";
set $up_workspaces frontend-svc.workspaces.svc.cluster.local;
rewrite /workspaces-v2/(.+) /$1 break;
proxy_pass http://$up_workspaces:80;
}
location ~^/workspaces-v2/(.+)\.wasm$ {
proxy_http_version 1.1;
proxy_set_header Connection "";
set $up_workspaces_wasm frontend-svc.workspaces.svc.cluster.local;
rewrite ^/workspaces-v2/(.+) /$1 break;
proxy_pass http://$up_workspaces_wasm:80;
}
location @index {
add_header Cache-Control 'no-cache, must-revalidate, proxy-revalidate, max-age=0';
if_modified_since off;
expires off;
try_files /static/index.html =404;
}
# processing появится позже — тоже лениво.
location ~^/workflows/(.+).js {
proxy_http_version 1.1;
proxy_set_header Connection "";
set $up_processing frontend-svc.processing.svc.cluster.local;
rewrite /workflows/(.+) /$1 break;
proxy_pass http://$up_processing:80;
}
location /service-worker.js {
try_files /static/$uri @index;
}
location / {
try_files $uri @index;
}
}
}

View File

@ -296,6 +296,10 @@ data:
"name": "Запросы",
"uri": "/rfi"
},
{
"name": "Аналитика",
"uri": "/analytics"
},
{
"name": "Управление проектами",
"uri": "/management/projects"

View File

@ -29,7 +29,7 @@ spec:
enabled: true
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/sarex-frontend-dev:contour_5.22.0
_default: cr.yandex/crp3ccidau046kdj8g9q/sarex-frontend-dev:contour_5.22.3
pullPolicy:
_default: IfNotPresent
deployment:

View File

@ -35,7 +35,7 @@ spec:
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/backend:production_8f05291e
_default: cr.yandex/crp3ccidau046kdj8g9q/backend:production_7d0ec48b
pullPolicy:
_default: IfNotPresent

View File

@ -35,7 +35,7 @@ spec:
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/export-project:prod_37a48176
_default: cr.yandex/crp3ccidau046kdj8g9q/export-project:prod_ef8aa756
pullPolicy:
_default: IfNotPresent

View File

@ -35,7 +35,7 @@ spec:
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/export-project:prod_37a48176
_default: cr.yandex/crp3ccidau046kdj8g9q/s3-proxy:stable
pullPolicy:
_default: IfNotPresent
@ -93,6 +93,12 @@ spec:
- name: APP_PORT
value:
_default: "8000"
- name: ACCESS_LOG
value:
_default: "true"
- name: CORS_ALLOW_HEADERS
value:
_default: "Content-Type, Accept-Ranges, Content-Range, Content-Encoding"
secretEnvs:
- name: AWS_ACCESS_KEY_ID
secretName:

View File

@ -35,7 +35,7 @@ spec:
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/backend:production_8f05291e
_default: cr.yandex/crp3ccidau046kdj8g9q/backend:production_7d0ec48b
pullPolicy:
_default: IfNotPresent

View File

@ -35,7 +35,7 @@ spec:
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/sarex-frontend-dev:contour_5.16.3
_default: cr.yandex/crp3ccidau046kdj8g9q/sarex-frontend-dev:contour_5.22.3
pullPolicy:
_default: IfNotPresent

View File

@ -0,0 +1,91 @@
---
# Скопировано из apps/django/wb/auth-flow-frontend.yaml (см. pdf-markings.yaml
# для причины) — компонент auth-flow, развёрнутый в ns django.
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: auth-flow-frontend
namespace: django
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:
auth-flow-frontend:
enabled: true
image:
name:
_default: 10.4.10.187:80/library/auth-flow-frontend:contour_fe9ea2a3
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: auth-flow-frontend
replicaCount:
_default: 1
port:
_default: 80
resources:
requests:
cpu:
_default: 100m
memory:
_default: 128Mi
probes:
liveness:
enabled: false
readiness:
enabled: false
service:
enabled: true
name:
_default: auth-flow-frontend-service
type:
_default: ClusterIP
port:
_default: 80
targetPort:
_default: 80
portName:
_default: http
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

View File

@ -0,0 +1,369 @@
---
# standalone HelmRelease — base vault-native, в ugok Vault не используется.
# command/args из base — только vault-обёртка (в живом дампе кластера у
# backend command/args нет вообще), не переносим.
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: backend
namespace: django
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/backend:production_7d0ec48b
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: backend
replicaCount:
_default: 1
port:
_default: 8000
resources:
requests:
cpu:
_default: 25m
memory:
_default: 128Mi
probes:
liveness:
enabled: false
readiness:
enabled: false
service:
enabled: true
name:
_default: backend
type:
_default: ClusterIP
port:
_default: 8000
targetPort:
_default: 8000
portName:
_default: http
volumes:
_default:
- name: django-configmap
mountPath:
_default: /opt/sarex/config/settings/production.py
subPath:
_default: production.py
readOnly:
_default: true
configMap:
name:
_default: django-configmap
items:
- key: production.py
path:
_default: production.py
- name: uwsgi-configmap
mountPath:
_default: /opt/sarex/uwsgi.ini
subPath:
_default: uwsgi.ini
readOnly:
_default: true
configMap:
name:
_default: uwsgi-configmap
items:
- key: uwsgi.ini
path:
_default: uwsgi.ini
- name: kafka-cert-volume
mountPath:
_default: /usr/local/share/ca-certificates
readOnly:
_default: true
configMap:
name:
_default: kafka-cert
envs:
- name: ALLOWED_HOSTS
value:
_default: "*"
- name: SERVER_USE_CHANGELOG
value:
_default: "0"
- name: SERVER_ZITADEL_ENABLED
value:
_default: "True"
- name: DJANGO_SETTINGS_MODULE
value:
_default: config.settings.production
- name: CELERY_REDIS_HOST
value:
_default: redis-service
- name: CELERY_REDIS_PORT
value:
_default: "6379"
- name: SERVER_EXTERNAL_FIND_BY_USERNAME_ENABLED
value:
_default: "True"
- name: SERVER_EXTERNAL_FIND_BY_EMAIL_ENABLED
value:
_default: "True"
- name: DJANGO_REDIS_HOST
value:
_default: redis-service
- name: DJANGO_REDIS_PORT
value:
_default: "6379"
- name: BIMV2_INTERNAL_HOST
value:
_default: http://bim-backend-v2-service.bim-api
- name: BIMV2_TIMEOUT
value:
_default: "60"
- name: JWT_KID
value:
_default: "1"
- name: PDM_SYNC
value:
_default: "1"
- name: KC_SYNC_ENABLE
value:
_default: "0"
- name: MEASUREMENTS_HOST
value:
_default: http://measurement-svc.measurements.svc.cluster.local:8000/api
- name: MEASUREMENTS_USE_MEASUREMENTS
value:
_default: "1"
- name: SERVER_API_HOST
value:
_default: https://ugok-sarex.uralmine.com
- name: SERVER_HOST
value:
_default: https://ugok-sarex.uralmine.com
- name: WORKFLOWS_HOST
value:
_default: http://workflows-api-service.workflow.svc.cluster.local:8000
- name: WORKFLOWS_BASE_HOST
value:
_default: http://backend.django.svc.cluster.local:8000
- name: WORKFLOWS_PREFIX
value:
_default: /internal/v1
- name: WORKFLOWS_USE
value:
_default: "1"
- name: SERVER_S3_STREAM_IMPORT
value:
_default: "1"
- name: SERVER_SAVE_DIFF_DEM
value:
_default: "1"
- name: SERVER_USE_CLICKHOUSE
value:
_default: "0"
- name: SERVER_USE_CREATE_COMPARED_GEOTIFF_TASK
value:
_default: "0"
- name: SERVER_USE_DJANGO_STORAGE
value:
_default: "1"
- name: SERVER_USE_METASHAPE
value:
_default: "0"
- name: SERVER_CHANGELOG_MODE_SYSTEM_LOG
value:
_default: "1"
- name: SERVER_CHANGELOG_MODE
value:
_default: "0"
- name: SERVER_DJANGO_URLS
value:
_default: "1"
- name: CHECK_IMPORT_HASH
value:
_default: "1"
- name: ZITADEL_HOST
value:
_default: https://ugok-zitadel-sarex.uralmine.com
- name: EAV_ENABLE
value:
_default: "1"
- name: SERVER_CHECK_IMPORT_HASH
value:
_default: "1"
- name: SERVER_CHUNKED_PATH
value:
_default: /tmp/chunked_uploads/%Y/%m/%d
- name: SERVER_HIDE_USER_SCROLL_PERMISSIONS
value:
_default: "0"
- name: SERVER_USE_WRORKFLOW_STATUS
value:
_default: "1"
- name: SERVER_KAFKA_ENABLED
value:
_default: "True"
- name: RESOURCES_INTERNAL_HOST
value:
_default: http://iams.iam.svc.cluster.local:8080
- name: KAFKA_TOPICS
value:
_default: '{"planning": "message-hub-stage", "ams-sync": "ams-sync"}'
- name: KAFKA_BOOTSTRAP_SERVERS
value:
_default: '["ugok-prod-kafka-bootstrap.kafka.svc.cluster.local:9093"]'
- name: KAFKA_SECURITY_PROTOCOL
value:
_default: SSL
- name: KAFKA_SASL_MECHANISM
value:
_default: SCRAM-SHA-512
- name: KAFKA_SSL_CAFILE
value:
_default: /usr/local/share/ca-certificates/kafka.crt
- name: S3_HOST
value:
_default: http://minio.minio.svc.cluster.local:9000
- name: KC_USE_REDIRECT_LOGOUT
value:
_default: "False"
secretEnvs:
- name: ZITADEL_ACCESS_TOKEN
secretName:
_default: zitadel-secret
secretKey: access_token
- name: KAFKA_SASL_PLAIN_USERNAME
secretName:
_default: kafka-secret
secretKey: username
- name: KAFKA_SASL_PLAIN_PASSWORD
secretName:
_default: kafka-secret
secretKey: password
- name: AWS_S3_ENDPOINT_URL
secretName:
_default: sarex-s3-secret
secretKey: endpoint
- name: CELERY_RABBITMQ_HOST
secretName:
_default: sarex-rabbitmq-secret
secretKey: host
- name: CELERY_RABBITMQ_USER
secretName:
_default: sarex-rabbitmq-secret
secretKey: username
- name: CELERY_RABBITMQ_PASSWORD
secretName:
_default: sarex-rabbitmq-secret
secretKey: password
- name: CELERY_RABBITMQ_VHOST
secretName:
_default: sarex-rabbitmq-secret
secretKey: vhost
- name: DJANGO_POSTGRES_HOST
secretName:
_default: sarex-postgresql-secret
secretKey: host
- name: DJANGO_POSTGRES_PORTS
secretName:
_default: sarex-postgresql-secret
secretKey: port
- name: DJANGO_POSTGRES_USER
secretName:
_default: sarex-postgresql-secret
secretKey: username
- name: DJANGO_POSTGRES_PASSWORD
secretName:
_default: sarex-postgresql-secret
secretKey: password
- name: DJANGO_POSTGRES_DATABASE
secretName:
_default: sarex-postgresql-secret
secretKey: database
- name: DJANGO_RABBIT_HOSTNAME
secretName:
_default: sarex-rabbitmq-secret
secretKey: host
- name: DJANGO_RABBIT_USER
secretName:
_default: sarex-rabbitmq-secret
secretKey: username
- name: DJANGO_RABBIT_PASS
secretName:
_default: sarex-rabbitmq-secret
secretKey: password
- name: DJANGO_RABBIT_VHOST
secretName:
_default: sarex-rabbitmq-secret
secretKey: vhost
- name: JWT_PRIVATE_KEY
secretName:
_default: backend-secret
secretKey: ssh_private.key
- name: JWT_PUBLIC_KEY
secretName:
_default: backend-secret
secretKey: ssh_public.key
- name: S3_BUCKET
secretName:
_default: sarex-s3-secret
secretKey: bucket
- name: S3_LOGIN
secretName:
_default: sarex-s3-secret
secretKey: access_key
- name: S3_PASSWORD
secretName:
_default: sarex-s3-secret
secretKey: secret_key
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

View File

@ -0,0 +1,360 @@
---
# standalone HelmRelease — base vault-native, в ugok Vault не используется.
# command — реальная команда запуска celery из дампа кластера (не
# vault-обёртка).
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: celery
namespace: django
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:
celery:
enabled: true
image:
name:
_default: 10.4.10.187:80/library/backend:production_7d0ec48b
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: celery
replicaCount:
_default: 1
port:
_default: 8000
command:
_default: ["celery", "-A", "config", "worker", "-B", "-l", "info", "-E", "-Q", "default", "-n", "default_worker.%h", "--concurrency=2"]
resources:
requests:
cpu:
_default: 25m
memory:
_default: 128Mi
probes:
liveness:
enabled: false
readiness:
enabled: false
service:
enabled: false
volumes:
_default:
- name: django-configmap
mountPath:
_default: /opt/sarex/config/settings/production.py
subPath:
_default: production.py
readOnly:
_default: true
configMap:
name:
_default: django-configmap
items:
- key: production.py
path:
_default: production.py
- name: uwsgi-configmap
mountPath:
_default: /opt/sarex/uwsgi.ini
subPath:
_default: uwsgi.ini
readOnly:
_default: true
configMap:
name:
_default: uwsgi-configmap
items:
- key: uwsgi.ini
path:
_default: uwsgi.ini
- name: kafka-cert-volume
mountPath:
_default: /usr/local/share/ca-certificates
readOnly:
_default: true
configMap:
name:
_default: kafka-cert
envs:
- name: ALLOWED_HOSTS
value:
_default: "*"
- name: SERVER_USE_CHANGELOG
value:
_default: "0"
- name: SERVER_ZITADEL_ENABLED
value:
_default: "True"
- name: DJANGO_SETTINGS_MODULE
value:
_default: config.settings.production
- name: CELERY_REDIS_HOST
value:
_default: redis-service
- name: CELERY_REDIS_PORT
value:
_default: "6379"
- name: SERVER_EXTERNAL_FIND_BY_USERNAME_ENABLED
value:
_default: "True"
- name: SERVER_EXTERNAL_FIND_BY_EMAIL_ENABLED
value:
_default: "True"
- name: DJANGO_REDIS_HOST
value:
_default: redis-service
- name: DJANGO_REDIS_PORT
value:
_default: "6379"
- name: BIMV2_INTERNAL_HOST
value:
_default: http://bim-backend-v2-service.bim-api
- name: BIMV2_TIMEOUT
value:
_default: "60"
- name: JWT_KID
value:
_default: "1"
- name: PDM_SYNC
value:
_default: "1"
- name: KC_SYNC_ENABLE
value:
_default: "0"
- name: MEASUREMENTS_HOST
value:
_default: http://measurement-svc.measurements.svc.cluster.local:8000/api
- name: MEASUREMENTS_USE_MEASUREMENTS
value:
_default: "1"
- name: SERVER_API_HOST
value:
_default: https://ugok-sarex.uralmine.com
- name: SERVER_HOST
value:
_default: https://ugok-sarex.uralmine.com
- name: WORKFLOWS_HOST
value:
_default: http://workflows-api-service.workflow.svc.cluster.local:8000
- name: WORKFLOWS_BASE_HOST
value:
_default: http://backend.django.svc.cluster.local:8000
- name: WORKFLOWS_PREFIX
value:
_default: /internal/v1
- name: WORKFLOWS_USE
value:
_default: "1"
- name: SERVER_S3_STREAM_IMPORT
value:
_default: "1"
- name: SERVER_SAVE_DIFF_DEM
value:
_default: "1"
- name: SERVER_USE_CLICKHOUSE
value:
_default: "0"
- name: SERVER_USE_CREATE_COMPARED_GEOTIFF_TASK
value:
_default: "0"
- name: SERVER_USE_DJANGO_STORAGE
value:
_default: "1"
- name: SERVER_USE_METASHAPE
value:
_default: "0"
- name: SERVER_CHANGELOG_MODE_SYSTEM_LOG
value:
_default: "1"
- name: SERVER_CHANGELOG_MODE
value:
_default: "0"
- name: SERVER_DJANGO_URLS
value:
_default: "1"
- name: CHECK_IMPORT_HASH
value:
_default: "1"
- name: EAV_ENABLE
value:
_default: "1"
- name: SERVER_CHECK_IMPORT_HASH
value:
_default: "1"
- name: SERVER_CHUNKED_PATH
value:
_default: /tmp/chunked_uploads/%Y/%m/%d
- name: SERVER_HIDE_USER_SCROLL_PERMISSIONS
value:
_default: "0"
- name: SERVER_USE_WRORKFLOW_STATUS
value:
_default: "1"
- name: SERVER_KAFKA_ENABLED
value:
_default: "True"
- name: RESOURCES_INTERNAL_HOST
value:
_default: http://iams.iam.svc.cluster.local:8080
- name: KAFKA_TOPICS
value:
_default: '{"planning": "message-hub-stage", "ams-sync": "ams-sync"}'
- name: KAFKA_BOOTSTRAP_SERVERS
value:
_default: '["ugok-prod-kafka-bootstrap.kafka.svc.cluster.local:9093"]'
- name: KAFKA_SECURITY_PROTOCOL
value:
_default: SSL
- name: KAFKA_SASL_MECHANISM
value:
_default: SCRAM-SHA-512
- name: KAFKA_SSL_CAFILE
value:
_default: /usr/local/share/ca-certificates/kafka.crt
- name: S3_HOST
value:
_default: http://minio.minio.svc.cluster.local:9000
- name: CACHE_HOST
value:
_default: redis.pm.svc.cluster.local
- name: ZITADEL_HOST
value:
_default: https://ugok-zitadel-sarex.uralmine.com
- name: KC_USE_REDIRECT_LOGOUT
value:
_default: "False"
secretEnvs:
- name: ZITADEL_ACCESS_TOKEN
secretName:
_default: zitadel-secret
secretKey: access_token
- name: KAFKA_SASL_PLAIN_USERNAME
secretName:
_default: kafka-secret
secretKey: username
- name: KAFKA_SASL_PLAIN_PASSWORD
secretName:
_default: kafka-secret
secretKey: password
- name: AWS_S3_ENDPOINT_URL
secretName:
_default: sarex-s3-secret
secretKey: endpoint
- name: CELERY_RABBITMQ_HOST
secretName:
_default: sarex-rabbitmq-secret
secretKey: host
- name: CELERY_RABBITMQ_USER
secretName:
_default: sarex-rabbitmq-secret
secretKey: username
- name: CELERY_RABBITMQ_PASSWORD
secretName:
_default: sarex-rabbitmq-secret
secretKey: password
- name: CELERY_RABBITMQ_VHOST
secretName:
_default: sarex-rabbitmq-secret
secretKey: vhost
- name: DJANGO_POSTGRES_HOST
secretName:
_default: sarex-postgresql-secret
secretKey: host
- name: DJANGO_POSTGRES_PORTS
secretName:
_default: sarex-postgresql-secret
secretKey: port
- name: DJANGO_POSTGRES_USER
secretName:
_default: sarex-postgresql-secret
secretKey: username
- name: DJANGO_POSTGRES_PASSWORD
secretName:
_default: sarex-postgresql-secret
secretKey: password
- name: DJANGO_POSTGRES_DATABASE
secretName:
_default: sarex-postgresql-secret
secretKey: database
- name: DJANGO_RABBIT_HOSTNAME
secretName:
_default: sarex-rabbitmq-secret
secretKey: host
- name: DJANGO_RABBIT_USER
secretName:
_default: sarex-rabbitmq-secret
secretKey: username
- name: DJANGO_RABBIT_PASS
secretName:
_default: sarex-rabbitmq-secret
secretKey: password
- name: DJANGO_RABBIT_VHOST
secretName:
_default: sarex-rabbitmq-secret
secretKey: vhost
- name: JWT_PRIVATE_KEY
secretName:
_default: backend-secret
secretKey: ssh_private.key
- name: JWT_PUBLIC_KEY
secretName:
_default: backend-secret
secretKey: ssh_public.key
- name: S3_BUCKET
secretName:
_default: sarex-s3-secret
secretKey: bucket
- name: S3_LOGIN
secretName:
_default: sarex-s3-secret
secretKey: access_key
- name: S3_PASSWORD
secretName:
_default: sarex-s3-secret
secretKey: secret_key
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,103 @@
---
# Скопировано из apps/django/wb/export-project.yaml — в base нет HelmRelease
# для этого сервиса (только в wb overlay), а ссылаться на файл в другом
# оверлее kustomize не даёт (вне дерева каталога). Образ/envs совпадают с
# дампом ugok уже "из коробки" (только регистр другой — правится патчем).
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: export-project
namespace: django
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:
export-project:
enabled: true
image:
name:
_default: 10.4.10.187:80/library/export-project:prod_ef8aa756
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: export-project
replicaCount:
_default: 1
port:
_default: 8000
resources:
limits:
cpu:
_default: "2"
memory:
_default: 8Gi
requests:
cpu:
_default: "1"
memory:
_default: 512Mi
probes:
liveness:
enabled: false
readiness:
enabled: false
service:
enabled: true
name:
_default: export-project-service
type:
_default: ClusterIP
port:
_default: 8000
targetPort:
_default: 8000
portName:
_default: http
envs:
- name: TIMEOUT
value:
_default: "180"
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

View File

@ -0,0 +1,116 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: frontend
namespace: django
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/sarex-frontend-dev:contour_5.22.3
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-service
type:
_default: ClusterIP
port:
_default: 80
targetPort:
_default: 80
portName:
_default: http
volumes:
_default:
- name: nginx-configmap
mountPath:
_default: /etc/nginx/nginx.conf
subPath:
_default: nginx.conf
readOnly:
_default: true
configMap:
name:
_default: nginx-configmap
items:
- key: nginx.conf
path:
_default: nginx.conf
- name: zitadel-configmap
mountPath:
_default: /opt/react_client/static/config.json
subPath:
_default: config.json
readOnly:
_default: true
configMap:
name:
_default: zitadel-configmap
items:
- key: config.json
path:
_default: config.json

View File

@ -0,0 +1,39 @@
---
# Скопировано из живого ConfigMap кластера ugok (namespace django).
apiVersion: v1
kind: ConfigMap
metadata:
name: kafka-cert
namespace: django
data:
kafka.crt: |
-----BEGIN CERTIFICATE-----
MIIFLTCCAxWgAwIBAgIUD6mKIbYkBT6T/cgK3Ibgm75vRrAwDQYJKoZIhvcNAQEN
BQAwLTETMBEGA1UECgwKaW8uc3RyaW16aTEWMBQGA1UEAwwNY2x1c3Rlci1jYSB2
MDAeFw0yNjA0MTQwODQ1MTRaFw0yNzA0MTQwODQ1MTRaMC0xEzARBgNVBAoMCmlv
LnN0cmltemkxFjAUBgNVBAMMDWNsdXN0ZXItY2EgdjAwggIiMA0GCSqGSIb3DQEB
AQUAA4ICDwAwggIKAoICAQCc9ecE59Ju5JRuGr1ConD8wPINXO9jgKdctuiwZloE
eHYZGfLpEZY1v6CulK3xlVdK4rJRH7MA0r5G3+o7ZkGW4htaAz1zk71npiibLxC/
2g7MQoMsfheglB8NpVpjGlbMScCJUIbWZr6UK1JUX9kAPgZBMR3E/R24nlYiygKP
4T9EEMw0YgKFkXZl20+cH2pmaUK7219+WR/MdiQ+d+445L7DLJNYI/xn9Yoc8OQb
A63SVK5APWwGFvXAjNqrcJpvrud3Age9CRqJ+M4Y6PTu05Pf1C6GUhLfTfsdleU6
PsORiG/9DVc9rjDOvEk7pwrBYaK4u39BA5XBnppxHuAsxPjbnVAwGBia/3N2vLa4
Fht4PBIDMH0KUKDRktT+rGFdg+gl1HJ/vT2Z+HqAOdW3DUCt4aY8B10/jPWHWByq
gvRNUSJSBGeLI2Yk3pbQKerS+UOMjcmGXw8gZHSvqwEs6EAX/msSmcTS2wDbu83E
tAXrHyriNpHilIaxlizbb7h3jXVhZX7G2o0BtPqFOsV9eo0bzUcRaf8XWqXHFoGw
6rks0Q06HOTrARDhAG0qot8pQ6WIM8zYjPT5Jb+Wx2UbPbdLtqY+W/t9udL8Q+tW
eL3+4oTllSeuHtCJy/UX1/GyN+O/PAXxDeEP1AmamweftXALlMhHzV/FHJjvd2L4
rQIDAQABo0UwQzAdBgNVHQ4EFgQUlPHFj51uMcGYeqJ9bf7BRqOiWdowEgYDVR0T
AQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQENBQADggIB
ABsb407P4GzhY1in3wwA9wB2evF4WhtuBQw4Cm1/jDFv6Yhe+qTFOM8+g8RiFJl4
KfGLzzQWiBbZfyKdqYTSDjio2WJhdXjP+V9YVmnNBXAwdTJOUbKjKgZlo1CniC3O
O/xzEmohC6Vkl9Ph4aGzqMivpYfiVjRzs1TeJNzPO131HOwzLUtrXEUJ5I9AWEzE
C0QCdr38ZoXSOq+eNm7q4ANi10ElHoiUdIkgjobCu2y6m+oiaeWLhs+i/LjE93vb
hlIzsIcJRIc5hC7QIORiR4pDuoxn/WP+41wdfUfVF7FugAaPhyF5TOJgTx0baCj9
3gtCfcfsy6Md2U4GLXj0UIs5M//7s0pdjCrvyDOCbrZUQs8JUZ4viqIUqVGRSFjg
5ofP1KgOIbG225T+XaXVapJETu29ggOv/ZhGm9JHZjAKi6yCUvXS2H7VWVk1Ob+e
GAXCtCWPF8C4uM4rkNwXCYzlX4kEeGyq0PifxOlz/KDSY+5C00fK9Ke+4C3aV53v
1NDoOaOYbObWHls3jrZ4EN08vYh9RIHmLpXCTdwwPqhHj/oJSFwN9ZHh0gW5NcYW
etX8+dQHoVkJP7KDMgAJ3l3Bgh2qOh6bM4gmvAc4Kp7YdlslBxzGscnKbkfoQYl+
NK4a+hSjXnk7ttSxachKb38LSZRNBA/LGUUB3t07anjZ
-----END CERTIFICATE-----

View File

@ -0,0 +1,21 @@
---
# Не наследуем base (backend/celery/s3-proxy vault-native) — см. комментарии
# в файлах. auth-flow-frontend.yaml/export-project.yaml/pdf-markings.yaml
# скопированы из wb (в base для них нет HelmRelease).
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: django
resources:
- django-configmap.yaml
- uwsgi-configmap.yaml
- kafka-cert.yaml
- nginx-configmap.yaml
- zitadel-configmap.yaml
- backend.yaml
- celery.yaml
- frontend.yaml
- s3-proxy.yaml
- srx-admin.yaml
- auth-flow-frontend.yaml
- export-project.yaml
- redis.yaml

View File

@ -0,0 +1,188 @@
---
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-configmap
namespace: django
data:
nginx.conf: |
worker_processes auto;
pid /var/run/nginx.pid;
events {
use epoll;
worker_connections 1024;
}
http {
# Basic Settings
large_client_header_buffers 8 128k;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 300;
types_hash_max_size 2048;
client_max_body_size 5000M;
client_header_buffer_size 5M;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Logging Settings
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
# GZIP Settings
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
server {
listen 80;
listen [::]:80;
root /opt/react_client/;
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Methods' '*' always;
add_header 'Access-Control-Allow-Headers' '*' always;
location = /static/index.bundle.js {
add_header Cache-Control 'no-store no-cache, must-revalidate, proxy-revalidate, max-age=0';
if_modified_since off;
expires off;
}
location ~^/api/pm/ {
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_pass http://backend-service.pm.svc.cluster.local:8000;
}
location ~^/media/ {
proxy_http_version 1.1;
rewrite ^/media/(.*)$ /$1 break;
proxy_set_header Host $host;
proxy_pass http://s3-proxy-service:80;
}
location ~^/api/v1/documents/ {
proxy_http_version 1.1;
rewrite /api/(.+) /$1 break;
proxy_set_header Host $host;
proxy_pass http://documentations-filestream.documentations.svc.cluster.local:8080;
}
location ~^/(api|admin)/ {
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_pass http://backend:8000;
}
# location ~^/flows/static/ {
# rewrite /flows/static/(.+) /$1 break;
# proxy_pass http://frontend-service.flows:80;
# }
# location = ~^/orchestrator/ {
# rewrite ^/orchestrator$ /api/ break;
# proxy_pass http://cde.orchestrator.svc.cluster.local:8080;
# }
# location = ~^/orchestrator/api/process {
# rewrite ^/orchestrator/api/process$ /api/process break;
# proxy_pass http://cde.orchestrator.svc.cluster.local:8080;
# }
# location ~ ^/orchestrator/api/process/(.*)$ {
# rewrite ^/orchestrator/api/process/(.*)$ /api/process/$1 break;
# proxy_pass http://cde.orchestrator.svc.cluster.local:8080;
# }
# location = ~^/orchestrator/api/sign {
# rewrite ^/orchestrator/api/sign$ /api/sign break;
# proxy_pass http://cde.orchestrator.svc.cluster.local:8080;
# }
location = /static/pdf-runtime/assets/mupdf-wasm.wasm {
alias /opt/react_client/static/pdf-runtime/assets/mupdf-wasm.wasm;
add_header Content-Type application/wasm always;
add_header Cache-Control "public, max-age=31536000, immutable" always;
add_header Access-Control-Allow-Origin "*" always;
add_header Access-Control-Allow-Methods "GET, OPTIONS" always;
add_header Access-Control-Allow-Headers "DNT,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization" always;
}
location = /workspaces-v2/worker/static/viewer-pdf/mupdf-wasm.js {
alias /opt/react_client/static/viewer-pdf/mupdf-wasm.js;
add_header Content-Type application/javascript always;
add_header Cache-Control "public, max-age=31536000, immutable" always;
add_header Access-Control-Allow-Origin "*" always;
add_header Access-Control-Allow-Methods "GET, OPTIONS" always;
add_header Access-Control-Allow-Headers "DNT,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization" always;
}
location = /workspaces-v2/worker/mupdf.worker-3.3.9.js {
alias /opt/react_client/static/pdf-runtime/mupdf.worker-3.3.9.js;
add_header Content-Type application/javascript always;
add_header Cache-Control "public, max-age=31536000, immutable" always;
add_header Access-Control-Allow-Origin "*" always;
add_header Access-Control-Allow-Methods "GET, OPTIONS" always;
add_header Access-Control-Allow-Headers "DNT,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization" always;
}
location = /workspaces-v2/worker/static/viewer-pdf/mupdf.js {
alias /opt/react_client/static/viewer-pdf/mupdf.js;
add_header Content-Type application/javascript always;
add_header Cache-Control "public, max-age=31536000, immutable" always;
add_header Access-Control-Allow-Origin "*" always;
add_header Access-Control-Allow-Methods "GET, OPTIONS" always;
add_header Access-Control-Allow-Headers "DNT,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization" always;
}
location = /workspaces-v2/worker/static/viewer-pdf/mupdf-wasm.wasm {
add_header Content-Type application/wasm always;
alias /opt/react_client/static/viewer-pdf/mupdf-wasm.wasm;
}
location ~^/workspaces-v2/(.+).js {
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header Connection "";
rewrite /workspaces-v2/(.+) /$1 break;
proxy_pass http://frontend-svc.workspaces.svc.cluster.local:8080;
}
location @index {
add_header Cache-Control 'no-cache, must-revalidate, proxy-revalidate, max-age=0';
if_modified_since off;
expires off;
try_files /static/index.html =404;
}
location ~^/workflows/(.+).js {
proxy_http_version 1.1;
rewrite /workflows/(.+) /$1 break;
proxy_pass http://frontend-service.workflow.svc.cluster.local:8080;
}
location /service-worker.js {
try_files /static/$uri @index;
}
location / {
try_files $uri @index;
}
}
}

View File

@ -0,0 +1,41 @@
---
# Скопировано из apps/django/base/redis-deployment.yaml + redis-service.yaml —
# сырой Deployment (не universal-chart, не vault-native), перенесён в
# standalone-оверлей, чтобы не зависеть от ../base.
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
namespace: django
labels:
app: redis
spec:
replicas: 1
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: 10.4.10.187:80/library/redis:latest
imagePullPolicy: Always
ports:
- containerPort: 6379
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: redis
namespace: django
spec:
selector:
app: redis
ports:
- port: 6379
targetPort: 6379
protocol: TCP

View File

@ -0,0 +1,103 @@
---
# standalone HelmRelease — base vault-native, в ugok Vault не используется.
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: s3-proxy
namespace: django
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:
s3-proxy:
enabled: true
image:
name:
_default: 10.4.10.187:80/library/s3-proxy:stable
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: s3-proxy
replicaCount:
_default: 1
port:
_default: 80
probes:
liveness:
enabled: false
readiness:
enabled: false
service:
enabled: true
name:
_default: s3-proxy-service
type:
_default: ClusterIP
port:
_default: 80
targetPort:
_default: 80
portName:
_default: http
envs:
- name: AWS_API_ENDPOINT
value:
_default: http://minio.minio.svc.cluster.local:9000
- name: ACCESS_LOG
value:
_default: "true"
- name: CORS_ALLOW_HEADERS
value:
_default: "Content-Type, Accept-Ranges, Content-Range, Content-Encoding"
secretEnvs:
- name: AWS_ACCESS_KEY_ID
secretName:
_default: sarex-s3-secret
secretKey: access_key
- name: AWS_SECRET_ACCESS_KEY
secretName:
_default: sarex-s3-secret
secretKey: secret_key
- name: AWS_S3_BUCKET
secretName:
_default: sarex-s3-secret
secretKey: bucket

View File

@ -0,0 +1,85 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: srx-admin-frontend
namespace: django
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:
srx-admin:
enabled: true
image:
name:
_default: 10.4.10.187:80/library/srx-admin:prod_638c3442
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: srx-admin-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: srx-admin-svc
type:
_default: ClusterIP
port:
_default: 80
targetPort:
_default: 80
portName:
_default: http

View File

@ -0,0 +1,9 @@
---
# Скопировано из живого ConfigMap кластера ugok (namespace django).
apiVersion: v1
kind: ConfigMap
metadata:
name: uwsgi-configmap
namespace: django
data:
uwsgi.ini: "[uwsgi]\r\nmodule = config.wsgi:application\r\nDJANGO_SETTINGS_MODULE = config.settings.production\r\nhttp = 0.0.0.0:8000\r\nprocesses = 16\r\nmaster = true\r\nvacuum = true\r\nenable-threads = true\r\nbuffer-size = 65535\r\nstats = :3031\r\nstats-http = true\r\nmemory-report = true\r\nlazy-apps = true\r\nlisten = 128\r\ndisable-write-exception= 0\r\nharakiri = 300\r\nsocket-timeout = 300\r\nchunked-input-timeout = 300\r\nhttp-timeout = 300\r\nworker-reload-mercy = 240\r\nmule-reload-mercy = 240\r\nstatic-map = /static=/opt/sarex/sarex/static/\r\nstatic-map = /media=/media/\r\n"

View File

@ -0,0 +1,17 @@
---
# Скопировано из живого ConfigMap кластера ugok (namespace django) —
# монтируется frontend в /opt/react_client/static/config.json.
apiVersion: v1
kind: ConfigMap
metadata:
name: zitadel-configmap
namespace: django
data:
config.json: |-
{
"auth_type": "zitadel",
"zitadel": {
"client_id": "368538787334147872",
"host": "https://ugok-zitadel-sarex.uralmine.com"
}
}

View File

@ -0,0 +1,102 @@
---
# auth-flow-frontend — компонент приложения auth-flow (apps/auth-flow),
# в wb развёрнут в ns django, а не в своём собственном неймспейсе.
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: auth-flow-frontend
namespace: django
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:
auth-flow-frontend:
enabled: true
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/auth-flow-frontend:contour_fe9ea2a3
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: auth-flow-frontend
replicaCount:
_default: 1
port:
_default: 80
resources:
limits:
cpu:
_default: 20m
memory:
_default: 48Mi
requests:
cpu:
_default: 10m
memory:
_default: 32Mi
probes:
liveness:
enabled: false
readiness:
enabled: false
service:
enabled: true
name:
_default: auth-flow-frontend-service
type:
_default: ClusterIP
port:
_default: 80
targetPort:
_default: 80
portName:
_default: http
imagePullSecrets:
enabled:
_default: true
name:
_default: dockerhub
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

465
apps/django/wb/backend.yaml Normal file
View File

@ -0,0 +1,465 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: backend
namespace: django
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/backend:production_7d0ec48b
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: backend
replicaCount:
_default: 1
port:
_default: 8000
resources:
limits:
cpu:
_default: 2223m
memory:
_default: 7626Mi
requests:
cpu:
_default: 495m
memory:
_default: 6012Mi
probes:
liveness:
enabled: false
readiness:
enabled: false
service:
enabled: true
name:
_default: backend-svc
type:
_default: ClusterIP
port:
_default: 8000
targetPort:
_default: 8000
portName:
_default: http
imagePullSecrets:
enabled:
_default: true
name:
_default: dockerhub
volumes:
_default:
- name: tmp-volume
mountPath:
_default: /tmp
emptyDir: {}
- name: uwsgi-configmap
mountPath:
_default: /opt/sarex/uwsgi.ini
subPath:
_default: uwsgi.ini
readOnly:
_default: true
configMap:
name:
_default: uwsgi-configmap
items:
- key: uwsgi.ini
path:
_default: uwsgi.ini
- name: django-configmap
mountPath:
_default: /opt/sarex/config/settings/production.py
subPath:
_default: production.py
readOnly:
_default: true
configMap:
name:
_default: django-configmap
items:
- key: production.py
path:
_default: production.py
- name: kafka-cert-volume
mountPath:
_default: /usr/local/share/ca-certificates
readOnly:
_default: true
configMap:
name:
_default: kafka-cert
envs:
- name: GK_ENCRYPTION_KEY
value:
_default: "zfDjuszywHSbAhY8KJQbESbpUYN74XTs"
- name: ALLOWED_HOSTS
value:
_default: "*"
- name: SERVER_USE_CHANGELOG
value:
_default: "0"
- name: SERVER_ZITADEL_ENABLED
value:
_default: "True"
- name: DJANGO_SETTINGS_MODULE
value:
_default: "config.settings.production"
- name: CELERY_REDIS_HOST
value:
_default: "redis-service"
- name: CELERY_REDIS_PORT
value:
_default: "6379"
- name: DJANGO_REDIS_HOST
value:
_default: "redis-service"
- name: DJANGO_REDIS_PORT
value:
_default: "6379"
- name: BIMV2_INTERNAL_HOST
value:
_default: "http://bim-backend-v2-service.bim-api"
- name: BIMV2_TIMEOUT
value:
_default: "60"
- name: JWT_KID
value:
_default: "1"
- name: PDM_SYNC
value:
_default: "1"
- name: KC_SYNC_ENABLE
value:
_default: "0"
- name: MEASUREMENTS_HOST
value:
_default: "http://measurements-service.measurements.svc.cluster.local:8000/api"
- name: MEASUREMENTS_USE_MEASUREMENTS
value:
_default: "1"
- name: SERVER_EXTERNAL_FIND_BY_USERNAME_ENABLED
value:
_default: "True"
- name: SERVER_EXTERNAL_FIND_BY_EMAIL_ENABLED
value:
_default: "True"
- name: SERVER_API_HOST
value:
_default: "https://srx.wb.ru"
- name: SERVER_HOST
value:
_default: "https://srx.wb.ru"
- name: SERVER_SUPERSET_HOST
value:
_default: "https://bi-srx.wb.ru"
- name: WORKFLOWS_HOST
value:
_default: "https://srx.wb.ru"
- name: WORKFLOWS_BASE_HOST
value:
_default: "https://srx.wb.ru"
- name: WORKFLOWS_USE
value:
_default: "1"
- name: SERVER_S3_STREAM_IMPORT
value:
_default: "1"
- name: SERVER_SAVE_DIFF_DEM
value:
_default: "1"
- name: SERVER_USE_CLICKHOUSE
value:
_default: "0"
- name: SERVER_USE_CREATE_COMPARED_GEOTIFF_TASK
value:
_default: "0"
- name: SERVER_USE_DJANGO_STORAGE
value:
_default: "1"
- name: SERVER_USE_METASHAPE
value:
_default: "0"
- name: SERVER_CHANGELOG_MODE_SYSTEM_LOG
value:
_default: "1"
- name: SERVER_CHANGELOG_MODE
value:
_default: "0"
- name: SERVER_DJANGO_URLS
value:
_default: "1"
- name: CHECK_IMPORT_HASH
value:
_default: "1"
- name: EAV_ENABLE
value:
_default: "1"
- name: SERVER_CHECK_IMPORT_HASH
value:
_default: "1"
- name: SERVER_CHUNKED_PATH
value:
_default: "/tmp/chunked_uploads/%Y/%m/%d"
- name: SERVER_HIDE_USER_SCROLL_PERMISSIONS
value:
_default: "0"
- name: SERVER_USE_WRORKFLOW_STATUS
value:
_default: "1"
- name: ZITADEL_HOST
value:
_default: "https://zitadel-srx.wb.ru"
- name: SERVER_KAFKA_ENABLED
value:
_default: "True"
- name: KAFKA_TOPICS
value:
_default: '{"planning": "message-hub-stage", "ams-sync": "ams-sync"}'
- name: KAFKA_BOOTSTRAP_SERVERS
value:
_default: '["wb-prod-kafka-bootstrap.kafka.svc.cluster.local:9093"]'
- name: KAFKA_SECURITY_PROTOCOL
value:
_default: "SSL"
- name: KAFKA_SASL_MECHANISM
value:
_default: "SCRAM-SHA-512"
- name: KAFKA_SSL_CAFILE
value:
_default: "/usr/local/share/ca-certificates/kafka.crt"
- name: S3_HOST
value:
_default: "http://10.49.10.90:9000"
- name: KC_USE_REDIRECT_LOGOUT
value:
_default: "False"
secretEnvs:
- name: SERVER_SUPERSET_JWT_SECRET
secretName:
_default: "superset-jwt-secret"
secretKey: "jwt_secret"
- name: ZITADEL_ACCESS_TOKEN
secretName:
_default: "zitadel-secret"
secretKey: "access_token"
- name: KAFKA_SASL_PLAIN_USERNAME
secretName:
_default: "kafka-secret"
secretKey: "username"
- name: KAFKA_SASL_PLAIN_PASSWORD
secretName:
_default: "kafka-secret"
secretKey: "password"
- name: KC_CLIENT_ID
secretName:
_default: "gatekeeper-secret"
secretKey: "client_id"
- name: KC_CLIENT_SECRET
secretName:
_default: "gatekeeper-secret"
secretKey: "client_secret"
- name: AWS_S3_ENDPOINT_URL
secretName:
_default: "s3-secret"
secretKey: "endpoint"
- name: CELERY_RABBITMQ_HOST
secretName:
_default: "rabbitmq-secret"
secretKey: "host"
- name: CELERY_RABBITMQ_USER
secretName:
_default: "rabbitmq-secret"
secretKey: "username"
- name: CELERY_RABBITMQ_PASSWORD
secretName:
_default: "rabbitmq-secret"
secretKey: "password"
- name: CELERY_RABBITMQ_VHOST
secretName:
_default: "rabbitmq-secret"
secretKey: "vhost"
- name: DJANGO_POSTGRES_HOST
secretName:
_default: "postgres-secret"
secretKey: "host"
- name: DJANGO_POSTGRES_PORTS
secretName:
_default: "postgres-secret"
secretKey: "port"
- name: DJANGO_POSTGRES_USER
secretName:
_default: "postgres-secret"
secretKey: "username"
- name: DJANGO_POSTGRES_PASSWORD
secretName:
_default: "postgres-secret"
secretKey: "password"
- name: DJANGO_POSTGRES_DATABASE
secretName:
_default: "postgres-secret"
secretKey: "database"
- name: DJANGO_RABBIT_HOSTNAME
secretName:
_default: "rabbitmq-secret"
secretKey: "host"
- name: DJANGO_RABBIT_USER
secretName:
_default: "rabbitmq-secret"
secretKey: "username"
- name: DJANGO_RABBIT_PASS
secretName:
_default: "rabbitmq-secret"
secretKey: "password"
- name: DJANGO_RABBIT_VHOST
secretName:
_default: "rabbitmq-secret"
secretKey: "vhost"
- name: JWT_PRIVATE_KEY
secretName:
_default: "backend-secret"
secretKey: "ssh_private.key"
- name: JWT_PUBLIC_KEY
secretName:
_default: "backend-secret"
secretKey: "ssh_public.key"
- name: S3_BUCKET
secretName:
_default: "sarex-media-storage-secret"
secretKey: "bucket"
- name: S3_LOGIN
secretName:
_default: "sarex-media-storage-secret"
secretKey: "login"
- name: S3_PASSWORD
secretName:
_default: "sarex-media-storage-secret"
secretKey: "password"
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

440
apps/django/wb/celery.yaml Normal file
View File

@ -0,0 +1,440 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: celery
namespace: django
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:
celery:
enabled: true
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/backend:production_7d0ec48b
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: celery
replicaCount:
_default: 1
port:
_default: 8000
command:
_default: ["celery", "-A", "config", "worker", "-B", "-l", "info", "-E", "-Q", "default", "-n", "default_worker.%h", "--concurrency=2"]
resources:
limits:
cpu:
_default: 20m
memory:
_default: 1385Mi
requests:
cpu:
_default: 10m
memory:
_default: 1107Mi
probes:
liveness:
enabled: false
readiness:
enabled: false
service:
enabled: false
imagePullSecrets:
enabled:
_default: true
name:
_default: dockerhub
volumes:
_default:
- name: tmp-volume
mountPath:
_default: /tmp
emptyDir: {}
- name: uwsgi-configmap
mountPath:
_default: /opt/sarex/uwsgi.ini
subPath:
_default: uwsgi.ini
readOnly:
_default: true
configMap:
name:
_default: uwsgi-configmap
items:
- key: uwsgi.ini
path:
_default: uwsgi.ini
- name: django-configmap
mountPath:
_default: /opt/sarex/config/settings/production.py
subPath:
_default: production.py
readOnly:
_default: true
configMap:
name:
_default: django-configmap
items:
- key: production.py
path:
_default: production.py
- name: kafka-cert-volume
mountPath:
_default: /usr/local/share/ca-certificates
readOnly:
_default: true
configMap:
name:
_default: kafka-cert
envs:
- name: GK_ENCRYPTION_KEY
value:
_default: "zfDjuszywHSbAhY8KJQbESbpUYN74XTs"
- name: ALLOWED_HOSTS
value:
_default: "*"
- name: SERVER_USE_CHANGELOG
value:
_default: "0"
- name: SERVER_ZITADEL_ENABLED
value:
_default: "False"
- name: DJANGO_SETTINGS_MODULE
value:
_default: "config.settings.production"
- name: CELERY_REDIS_HOST
value:
_default: "redis-service"
- name: CELERY_REDIS_PORT
value:
_default: "6379"
- name: DJANGO_REDIS_HOST
value:
_default: "redis-service"
- name: CACHE_HOST
value:
_default: "redis.pm.svc.cluster.local"
- name: DJANGO_REDIS_PORT
value:
_default: "6379"
- name: BIMV2_INTERNAL_HOST
value:
_default: "http://bim-backend-v2-service.bim-api"
- name: BIMV2_TIMEOUT
value:
_default: "60"
- name: JWT_KID
value:
_default: "1"
- name: PDM_SYNC
value:
_default: "1"
- name: KC_SYNC_ENABLE
value:
_default: "0"
- name: MEASUREMENTS_HOST
value:
_default: "http://measurements-service.measurements.svc.cluster.local:8000/api"
- name: MEASUREMENTS_USE_MEASUREMENTS
value:
_default: "1"
- name: SERVER_API_HOST
value:
_default: "https://srx.wb.ru"
- name: SERVER_HOST
value:
_default: "https://srx.wb.ru"
- name: WORKFLOWS_HOST
value:
_default: "https://srx.wb.ru"
- name: WORKFLOWS_BASE_HOST
value:
_default: "https://srx.wb.ru"
- name: WORKFLOWS_USE
value:
_default: "1"
- name: SERVER_S3_STREAM_IMPORT
value:
_default: "1"
- name: SERVER_SAVE_DIFF_DEM
value:
_default: "1"
- name: SERVER_USE_CLICKHOUSE
value:
_default: "0"
- name: SERVER_USE_CREATE_COMPARED_GEOTIFF_TASK
value:
_default: "0"
- name: SERVER_USE_DJANGO_STORAGE
value:
_default: "1"
- name: SERVER_USE_METASHAPE
value:
_default: "0"
- name: SERVER_CHANGELOG_MODE_SYSTEM_LOG
value:
_default: "1"
- name: ZITADEL_HOST
value:
_default: "https://zitadel-srx.wb.ru"
- name: SERVER_KAFKA_ENABLED
value:
_default: "True"
- name: KAFKA_TOPICS
value:
_default: '{"planning": "message-hub-stage", "ams-sync": "ams-sync"}'
- name: KAFKA_BOOTSTRAP_SERVERS
value:
_default: '["wb-prod-kafka-bootstrap.kafka.svc.cluster.local:9093"]'
- name: KAFKA_SECURITY_PROTOCOL
value:
_default: "SSL"
- name: KAFKA_SASL_MECHANISM
value:
_default: "SCRAM-SHA-512"
- name: KAFKA_SSL_CAFILE
value:
_default: "/usr/local/share/ca-certificates/kafka.crt"
- name: SERVER_CHANGELOG_MODE
value:
_default: "0"
- name: SERVER_DJANGO_URLS
value:
_default: "1"
- name: CHECK_IMPORT_HASH
value:
_default: "1"
- name: EAV_ENABLE
value:
_default: "1"
- name: SERVER_CHECK_IMPORT_HASH
value:
_default: "1"
- name: SERVER_CHUNKED_PATH
value:
_default: "/tmp/chunked_uploads/%Y/%m/%d"
- name: SERVER_HIDE_USER_SCROLL_PERMISSIONS
value:
_default: "0"
- name: SERVER_USE_WRORKFLOW_STATUS
value:
_default: "1"
- name: S3_HOST
value:
_default: "http://10.49.10.90:9000"
- name: KC_USE_REDIRECT_LOGOUT
value:
_default: "False"
secretEnvs:
- name: ZITADEL_ACCESS_TOKEN
secretName:
_default: "zitadel-secret"
secretKey: "access_token"
- name: KAFKA_SASL_PLAIN_USERNAME
secretName:
_default: "kafka-secret"
secretKey: "username"
- name: KAFKA_SASL_PLAIN_PASSWORD
secretName:
_default: "kafka-secret"
secretKey: "password"
- name: KC_CLIENT_ID
secretName:
_default: "gatekeeper-secret"
secretKey: "client_id"
- name: KC_CLIENT_SECRET
secretName:
_default: "gatekeeper-secret"
secretKey: "client_secret"
- name: AWS_S3_ENDPOINT_URL
secretName:
_default: "s3-secret"
secretKey: "endpoint"
- name: CELERY_RABBITMQ_HOST
secretName:
_default: "rabbitmq-secret"
secretKey: "host"
- name: CELERY_RABBITMQ_USER
secretName:
_default: "rabbitmq-secret"
secretKey: "username"
- name: CELERY_RABBITMQ_PASSWORD
secretName:
_default: "rabbitmq-secret"
secretKey: "password"
- name: CELERY_RABBITMQ_VHOST
secretName:
_default: "rabbitmq-secret"
secretKey: "vhost"
- name: DJANGO_POSTGRES_HOST
secretName:
_default: "postgres-secret"
secretKey: "host"
- name: DJANGO_POSTGRES_PORTS
secretName:
_default: "postgres-secret"
secretKey: "port"
- name: DJANGO_POSTGRES_USER
secretName:
_default: "postgres-secret"
secretKey: "username"
- name: DJANGO_POSTGRES_PASSWORD
secretName:
_default: "postgres-secret"
secretKey: "password"
- name: DJANGO_POSTGRES_DATABASE
secretName:
_default: "postgres-secret"
secretKey: "database"
- name: DJANGO_RABBIT_HOSTNAME
secretName:
_default: "rabbitmq-secret"
secretKey: "host"
- name: DJANGO_RABBIT_USER
secretName:
_default: "rabbitmq-secret"
secretKey: "username"
- name: DJANGO_RABBIT_PASS
secretName:
_default: "rabbitmq-secret"
secretKey: "password"
- name: DJANGO_RABBIT_VHOST
secretName:
_default: "rabbitmq-secret"
secretKey: "vhost"
- name: JWT_PRIVATE_KEY
secretName:
_default: "backend-secret"
secretKey: "ssh_private.key"
- name: JWT_PUBLIC_KEY
secretName:
_default: "backend-secret"
secretKey: "ssh_public.key"
- name: S3_BUCKET
secretName:
_default: "sarex-media-storage-secret"
secretKey: "bucket"
- name: S3_LOGIN
secretName:
_default: "sarex-media-storage-secret"
secretKey: "login"
- name: S3_PASSWORD
secretName:
_default: "sarex-media-storage-secret"
secretKey: "password"
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

View File

@ -1,25 +1,4 @@
# Копия django-configmap из base с заменой домена на домен контура.
#
# Патчем этого не сделать: все настройки лежат ОДНИМ значением data.production.py
# (331 строка python), kustomize умеет заменить его только целиком. Ровно та же
# причина, что у nginx-configmap.yaml рядом.
#
# ЧТО ИЗМЕНЕНО — две строки про домен sarex.contour.infra.sarex.tech,
# принадлежащий ДРУГОМУ контуру:
#
# HOST — по нему backend строит АБСОЛЮТНЫЕ ссылки на медиа.
# Браузер получал
# https://sarex.contour.infra.sarex.tech/media/state/previews/....png
# и, разумеется, 404: чужой хост, наших файлов там нет.
# CSRF_TRUSTED_ORIGINS — без нашего домена django отклонял бы POST-формы
# админки с ошибкой проверки Referer.
#
# И один блок сверх того: CsrfExemptSessionAuthentication в
# DEFAULT_AUTHENTICATION_CLASSES вместо штатного SessionAuthentication —
# из-за него SPA получала 403 на любое удаление. Обоснование и цена решения
# расписаны прямо над классом.
#
# Больше в файле ничего не менялось: сравнивать с base удобно обычным diff.
---
apiVersion: v1
kind: ConfigMap
metadata:
@ -27,57 +6,17 @@ metadata:
namespace: django
data:
production.py: |
import ast
import os
from .base import *
from logging.handlers import SysLogHandler
from datetime import timedelta
def _load_env_file(path):
try:
with open(path, "r", encoding="utf-8") as f:
for raw_line in f:
line = raw_line.strip()
if not line or line.startswith("#") or "=" not in line:
continue
key, value = line.split("=", 1)
key = key.strip()
value = value.strip()
if len(value) >= 2 and value[0] == value[-1] and value[0] in ("'", '"'):
try:
value = ast.literal_eval(value)
except (ValueError, SyntaxError):
value = value[1:-1]
if key and key not in os.environ:
os.environ[key] = value
except FileNotFoundError:
pass
def _read_secret_file(path, default=""):
try:
with open(path, "r", encoding="utf-8") as f:
return f.read().strip()
except FileNotFoundError:
return default
# Fallback for manage.py launched via `kubectl exec` (outside entrypoint),
# so Django can still read DB/JWT values from Vault-injected files.
_load_env_file("/vault/secrets/django-postgresql")
_load_env_file("/vault/secrets/django-rabbitmq")
_load_env_file("/vault/secrets/django-s3")
_load_env_file("/vault/secrets/django-kafka")
_load_env_file("/vault/secrets/django-common")
if not os.environ.get("JWT_PRIVATE_KEY"):
os.environ["JWT_PRIVATE_KEY"] = _read_secret_file("/vault/secrets/django-jwt-private")
if not os.environ.get("JWT_PUBLIC_KEY"):
os.environ["JWT_PUBLIC_KEY"] = _read_secret_file("/vault/secrets/django-jwt-public")
ALLOWED_HOSTS = ["*"]
FILE_UPLOAD_PERMISSIONS = 0o644
DEBUG = False
CSRF_COOKIE_SECURE = True
CSRF_TRUSTED_ORIGINS = ["https://sarex.local.lonsdaleites.ru", "http://sarex.local.lonsdaleites.ru"]
CSRF_TRUSTED_ORIGINS = ["https://lk.srx.wb.ru:30443", "https://lk.srx.wb.ru"]
SESSION_COOKIE_SECURE = True
SECURE_SSL_REDIRECT = False
@ -109,7 +48,7 @@ data:
'Bearer',
)
HOST = "https://sarex.local.lonsdaleites.ru"
HOST = "https://wb.sarex.io"
POSTGRES_DATABASE = os.environ.get('DJANGO_POSTGRES_DATABASE')
POSTGRES_USER = os.environ.get('DJANGO_POSTGRES_USER')
@ -128,11 +67,6 @@ data:
}
}
MEASUREMENTSETTINGS = MeasurementSettings()
WORKFLOWSSETTINGS = WorkFlowsSettings()
S3SETTINGS = S3Settings()
GATEWAYSETTINGS = GateWaySetttings()
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
@ -177,8 +111,8 @@ data:
'BLACKLIST_AFTER_ROTATION': True,
'UPDATE_LAST_LOGIN': False,
'ALGORITHM': 'RS512',
'SIGNING_KEY': os.environ.get("JWT_PRIVATE_KEY", "").replace("\\n", "\n"),
'VERIFYING_KEY': os.environ.get("JWT_PUBLIC_KEY", "").replace("\\n", "\n"),
'SIGNING_KEY': os.environ.get("JWT_PRIVATE_KEY").replace("\\n", "\n"),
'VERIFYING_KEY': os.environ.get("JWT_PUBLIC_KEY").replace("\\n", "\n"),
'AUDIENCE': None,
'ISSUER': os.environ.get('SIMPLE_JWT_ISSUER', 'default_issuer'),
'AUTH_HEADER_TYPES': ('Bearer',),
@ -220,40 +154,6 @@ data:
},
}
# Сессионная аутентификация без проверки CSRF.
#
# SPA платформы аутентифицируется сессионной кукой и не прикладывает
# заголовок X-CSRFToken, а SessionAuthentication из DRF требует его на
# любом небезопасном методе. Наружу это выглядело так:
# DELETE /api/core/videos/<id>/ → 403
# {"detail": "CSRF Failed: CSRF token missing."}
#
# Проверено на контуре: тот же запрос с X-CSRFToken проходит, и он же с
# заголовком Authorization: Bearer проходит тоже — до SessionAuthentication
# дело в этом случае просто не доходит, потому что simple_jwt в списке ниже
# стоит раньше. То есть бэкенд исправен, чинить нужно ровно сочетание
# "кука без заголовка".
#
# ЧЕМ ПЛАТИМ: с запросов, авторизованных кукой, снимается защита от CSRF.
# Основной вектор закрыт самими куками — sessionid и csrftoken выставляются
# с SameSite=Lax, и браузер не пошлёт их при кросс-сайтовом DELETE. Щель
# остаётся одна: SameSite смотрит на site, а не на origin, поэтому соседи
# по домену (minio., rabbitmq., dashboard.) считаются "своими", а в MinIO
# лежит пользовательский контент.
#
# Импорт DRF прямо в модуле настроек безопасен НЕ всегда — обычно так и
# ловят AppRegistryNotReady. Здесь проверено запуском django.setup() внутри
# работающего пода: rest_framework.authentication тянет только
# django.contrib.auth и rest_framework.exceptions, и ни один из них к
# моделям на уровне модуля не обращается.
from rest_framework.authentication import SessionAuthentication
class CsrfExemptSessionAuthentication(SessionAuthentication):
def enforce_csrf(self, request):
return
REST_FRAMEWORK = { 'DEFAULT_PAGINATION_CLASS': (
'rest_framework.pagination.LimitOffsetPagination' ),
'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',
@ -264,7 +164,7 @@ data:
'rest_framework.authentication.RemoteUserAuthentication',
'rest_framework_simplejwt.authentication.JWTAuthentication',
'rest_framework.authentication.BasicAuthentication',
'config.settings.production.CsrfExemptSessionAuthentication',
'rest_framework.authentication.SessionAuthentication',
'sarex.authentication.backends.JWTAuthentication' ],
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated', ] }
@ -328,17 +228,17 @@ data:
"name": "Замечания",
"uri": "/remarks"
},
# {
# "name": "Управление проектами",
# "uri": "/management/projects",
# },
{
"name": "Управление проектами",
"uri": "/management/projects",
},
{
"name": "Замечания V2",
"uri": "/issues"
},
{
"name": "Документация",
"uri": "/documentations",
"uri": "/documentations"
},
{
"name": "Согласование документов",
@ -348,35 +248,36 @@ data:
"name": "Рабочие процессы",
"uri": "/processes"
},
{
"name": "Аналитика",
"uri": "/analytics"
},
{
"name": "Запросы",
"uri": "/rfi"
},
{
"name": "Управление проектами",
"uri": "/management/projects"
},
# {
# "name": "Обзор",
# "uri": "/projects"
# },
{
"name": "Передача документации",
"uri": "/transmittal"
},
"name": "Передача документации",
"uri": "/transmittal"
},
]
AUTH_SETTINGS = {
"refresh_token": False,
"refresh_token_uri": "/api/token/me",
"refresh_oauth_token": True,
"refresh_oauth_token_uri": "/oauth/token",
"refresh_time": 240,
"refresh_token": False,
"refresh_token_uri": "/api/token/me",
"refresh_oauth_token": True,
"refresh_oauth_token_uri": "/oauth/token",
"refresh_time": 240,
}
DEBUG=True
WEB_APP_AUTH_MODE='jwt-session-based'
DEBUG=False
#WEB_APP_AUTH_MODE='jwt-session-based'
SAREX_MODULES_SETTINGS = {

View File

@ -1,8 +1,9 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: measurements
namespace: measurements
name: export-project
namespace: django
spec:
interval: 10m
@ -24,20 +25,18 @@ spec:
upgrade:
remediation:
retries: 3
driftDetection:
mode: enabled
values:
global:
env: _default
services:
backend:
export-project:
enabled: true
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/documentations:prod_5904312b
_default: cr.yandex/crp3ccidau046kdj8g9q/export-project:prod_ef8aa756
pullPolicy:
_default: IfNotPresent
@ -45,16 +44,25 @@ spec:
enabled: true
name:
_default: measurements
_default: export-project
replicaCount:
_default: 1
stage: 1
preprod: 3
production: 3
port:
_default: 8080
_default: 8000
resources:
limits:
cpu:
_default: "2"
memory:
_default: 8Gi
requests:
cpu:
_default: "1"
memory:
_default: 512Mi
probes:
liveness:
@ -66,7 +74,7 @@ spec:
enabled: true
name:
_default: measurements-service
_default: export-project-service
type:
_default: ClusterIP
@ -84,16 +92,12 @@ spec:
enabled:
_default: true
name:
_default: regcred
_default: dockerhub
labels:
monitoring: prometheus
secretEnvs:
- name: S3_JSON_SETTINGS
secretName:
_default: "s3-json-settings"
secretKey: "S3_JSON_SETTINGS"
envs:
- name: TIMEOUT
value:
_default: "180"
commitSha: ""
gitlabUri: ""

View File

@ -0,0 +1,130 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: frontend
namespace: django
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/sarex-frontend-dev:contour_5.22.3
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: frontend
replicaCount:
_default: 1
port:
_default: 80
resources:
limits:
cpu:
_default: 66m
memory:
_default: 61Mi
requests:
cpu:
_default: 10m
memory:
_default: 39Mi
probes:
liveness:
enabled: false
readiness:
enabled: false
service:
enabled: true
name:
_default: frontend-service
type:
_default: ClusterIP
port:
_default: 80
targetPort:
_default: 80
portName:
_default: http
imagePullSecrets:
enabled:
_default: true
name:
_default: dockerhub
volumes:
_default:
- name: nginx-configmap
mountPath:
_default: /etc/nginx/nginx.conf
subPath:
_default: nginx.conf
configMap:
name:
_default: nginx-configmap
items:
- key: nginx.conf
path:
_default: nginx.conf
- name: zitadel-configmap
mountPath:
_default: /opt/react_client/static/config.json
subPath:
_default: config.json
readOnly:
_default: true
configMap:
name:
_default: zitadel-configmap
items:
- key: config.json
path:
_default: config.json
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

View File

@ -0,0 +1,132 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: gatekeeper
namespace: django
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:
gatekeeper:
enabled: true
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/gatekeeper:2.12.1
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: gatekeeper
replicaCount:
_default: 1
port:
_default: 8080
args:
_default:
- "--discovery-url=https://keycloak.wildberries.ru/realms/infrastructure/.well-known/openid-configuration"
- "--listen=0.0.0.0:8080"
- "--enable-logging=true"
- "--upstream-url=http://frontend-service.django.svc.cluster.local:80/"
- "--enable-refresh-tokens=true"
- "--enable-session-cookies=true"
- "--verbose"
- "--resources=uri=/*"
- "--encryption-key=zfDjuszywHSbAhY8KJQbESbpUYN74XTs"
- "--secure-cookie=false"
- "--cors-origins=*"
- "--skip-openid-provider-tls-verify=true"
- "--enable-default-deny=false"
resources:
limits:
cpu:
_default: 20m
memory:
_default: 48Mi
requests:
cpu:
_default: 10m
memory:
_default: 32Mi
probes:
liveness:
enabled: false
readiness:
enabled: false
service:
enabled: true
name:
_default: gatekeeper-service
type:
_default: ClusterIP
port:
_default: 80
targetPort:
_default: 8080
portName:
_default: http
imagePullSecrets:
enabled:
_default: true
name:
_default: dockerhub
envs:
- name: PROXY_REDIRECTION_URL
value:
_default: "https://lk.srx.wb.ru"
secretEnvs:
- name: PROXY_CLIENT_ID
secretName:
_default: "gatekeeper-secret"
secretKey: "client_id"
- name: PROXY_CLIENT_SECRET
secretName:
_default: "gatekeeper-secret"
secretKey: "client_secret"
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

View File

@ -0,0 +1,38 @@
---
apiVersion: v1
kind: ConfigMap
metadata:
name: kafka-cert
namespace: django
data:
kafka.crt: |
-----BEGIN CERTIFICATE-----
MIIFLTCCAxWgAwIBAgIUYDZPxGRsr7IiqHEmfd07QTQlOKYwDQYJKoZIhvcNAQEN
BQAwLTETMBEGA1UECgwKaW8uc3RyaW16aTEWMBQGA1UEAwwNY2x1c3Rlci1jYSB2
MDAeFw0yNTEyMTYxNDM0NTVaFw0yNjEyMTYxNDM0NTVaMC0xEzARBgNVBAoMCmlv
LnN0cmltemkxFjAUBgNVBAMMDWNsdXN0ZXItY2EgdjAwggIiMA0GCSqGSIb3DQEB
AQUAA4ICDwAwggIKAoICAQCfzDZhEzw2pbU5Xpu8OzD+3iQG+DVjU8PQWWQEF27h
yjohDkUr3zCZtW7xMKWKUNxBgrKsfe4TDOQN8cij3cS9sy0So+UhMeF7Bq9PU1Yd
bmTRq8q1PiuNUkiCGJ5wrb3+NZvVxZLJUIFgiealsRw80MgMWWSzy0I35T2Edn/a
DU4jhlgQxyzQ621+oGP0n28gCjmm6pCq2tkj/Z8WTdu1gOWyRdK02a2uE2Ts2nLa
Di32GaZrIbIuD/WUd6Ek66uCeJvh2CT7s+SqgtMbtT7gibUuPQ3hk1VGQsjy22l3
hUNpLu86nrwbuf21mY55KnLOcaVq1ag1TpIIKfZAL/KWFCGZ6H6kwEIbCAL0Hei7
cJ2Wm2/qlzKUeU869M7YybZAfXl/t6XT4QgFgje+42N980vy5A4GhWi1Z7lPqqOe
jPGBstkRZybKz1sTk87+oJx82iQU/ozVmzjSEK1SoYRNbvug8PNpxmPoPnJ2flgG
t2q2+2ZQP3f1aAHVcZ3U5+hWlRmKPXzjrJv7gnhuvqJl7OwB50y+yWiVfZ9xrYl2
EpX+yHuFFK+9NnB5taUK8Fz+hQaLU8J4q7P0bRqkoI+LdcEErjuDT/eI2d5+Ql8K
/JkV823hX2WNB9bdaQ24BelVUbsxGpR7ms6KWrM11kHnbzUlEM+AxZES6F7Qbr55
TwIDAQABo0UwQzAdBgNVHQ4EFgQUM7hshx7e9TFEN82Pf446aBrJUA4wEgYDVR0T
AQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQENBQADggIB
AFNHFGPDxY966fz0dxDFFSfeo47y7XQZMK9xAwH73cQoSeqx+IMxzgM8nfJQ9XMN
PeLwVRZ7pvRee2ZhUPglBSTHnW2rvfmLBOO9xyKZxRsCkoFxuHH9xfM7bFWb96R6
fGrOdEZDB3yj00T+tkubwqt+/dUhQUj8juwyPs55WMb/0BIbapaoQ6QOP13CaXDV
ZmAfsEEIBkNxfq7GTr/z0Rq0B4+9FxAf3Jrsmi/dYoFD/prHsvBDkYw1daoFyp5C
tbctvB9wtphnCCynekt8UBvpVKHUU/xaUa09TQTToXjBbV1SZeIOHNG0MNbWa4sz
AL/cpXdq1EAxiTeAVT9XhCwhe/xJvFZIWuFLmW3J+ZxrOUCKieCYpTqBY2tBkkDY
//egic787yTR6zxqQNSzvNU5LhzrN7lu+KHGM06T35+HvpzgPPiRCzsxO62p63op
mq04K31yYZgLiqeAj5W+rioRGJNn4TXJpH9KIrzmGM7lVWLYWMAKeZU4r1lDUdcu
7jsBH8BRJWJeVK3xVw2HB3lk7Xn0WrR92adeYQ3f0vKbMIAVUnSJ3yCKJ4NMFSki
j78nx2mi/G0RhUPGZ9hhLXQKj9BtbpEnwpbGWtf0ShtVOxD/HKLCr7koBtW9TMPS
9K0sJhE5VjsQLkDDu9p3GdRcuLNA/oa7xFvRFtqGFsLj
-----END CERTIFICATE-----

View File

@ -0,0 +1,20 @@
---
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: django
resources:
- django-configmap.yaml
- uwsgi-configmap.yaml
- zitadel-configmap.yaml
- nginx-configmap.yaml
- kafka-cert-configmap.yaml
- backend.yaml
- celery.yaml
- export-project.yaml
- frontend.yaml
- gatekeeper.yaml
- measurement.yaml
- redis.yaml
- s3-proxy.yaml
- srx-admin.yaml
- auth-flow-frontend.yaml

View File

@ -0,0 +1,124 @@
---
# measurement — компонент приложения measurements (apps/measurements),
# в wb развёрнут в ns django, а не в своём собственном неймспейсе.
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: measurement
namespace: django
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:
measurement:
enabled: true
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/measurements:prod_ece72657
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: measurement
replicaCount:
_default: 1
port:
_default: 8000
resources:
limits:
cpu:
_default: 20m
memory:
_default: 761Mi
requests:
cpu:
_default: 10m
memory:
_default: 596Mi
probes:
liveness:
enabled: false
readiness:
enabled: false
service:
enabled: true
name:
_default: measurement-service
type:
_default: ClusterIP
port:
_default: 8000
targetPort:
_default: 8000
portName:
_default: http
imagePullSecrets:
enabled:
_default: true
name:
_default: dockerhub
volumes:
_default:
- name: tmp-volume
mountPath:
_default: /tmp
emptyDir: {}
envs:
- name: DJANGO_HOST
value:
_default: "https://lk.srx.wb.ru:30443"
- name: S3_JSON_FILE
value:
_default: "/opt/cred_s3.json"
secretEnvs:
- name: S3_JSON_SETTINGS
secretName:
_default: "s3-json-settings"
secretKey: "S3_JSON_SETTINGS"
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

View File

@ -0,0 +1,180 @@
---
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-configmap
namespace: django
data:
nginx.conf: |
worker_processes auto;
pid /var/run/nginx.pid;
events {
use epoll;
worker_connections 1024;
}
http {
# Basic Settings
large_client_header_buffers 8 128k;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 300;
types_hash_max_size 2048;
client_max_body_size 5000M;
client_header_buffer_size 5M;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Logging Settings
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
# GZIP Settings
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
server {
listen 80;
listen [::]:80;
root /opt/react_client/;
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Methods' '*' always;
add_header 'Access-Control-Allow-Headers' '*' always;
location = /static/index.bundle.js {
add_header Cache-Control 'no-store no-cache, must-revalidate, proxy-revalidate, max-age=0';
if_modified_since off;
expires off;
}
location = /static/pdf-runtime/assets/mupdf-wasm.wasm {
alias /opt/react_client/static/pdf-runtime/assets/mupdf-wasm.wasm;
add_header Content-Type application/wasm always;
add_header Cache-Control "public, max-age=31536000, immutable" always;
add_header Access-Control-Allow-Origin "*" always;
add_header Access-Control-Allow-Methods "GET, OPTIONS" always;
add_header Access-Control-Allow-Headers "DNT,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization" always;
}
location = /workspaces-v2/worker/static/viewer-pdf/mupdf-wasm.js {
alias /opt/react_client/static/viewer-pdf/mupdf-wasm.js;
add_header Content-Type application/javascript always;
add_header Cache-Control "public, max-age=31536000, immutable" always;
add_header Access-Control-Allow-Origin "*" always;
add_header Access-Control-Allow-Methods "GET, OPTIONS" always;
add_header Access-Control-Allow-Headers "DNT,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization" always;
}
location = /workspaces-v2/worker/mupdf.worker-3.3.9.js {
alias /opt/react_client/static/pdf-runtime/mupdf.worker-3.3.9.js;
add_header Content-Type application/javascript always;
add_header Cache-Control "public, max-age=31536000, immutable" always;
add_header Access-Control-Allow-Origin "*" always;
add_header Access-Control-Allow-Methods "GET, OPTIONS" always;
add_header Access-Control-Allow-Headers "DNT,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization" always;
}
location = /workspaces-v2/worker/static/viewer-pdf/mupdf.js {
alias /opt/react_client/static/viewer-pdf/mupdf.js;
add_header Content-Type application/javascript always;
add_header Cache-Control "public, max-age=31536000, immutable" always;
add_header Access-Control-Allow-Origin "*" always;
add_header Access-Control-Allow-Methods "GET, OPTIONS" always;
add_header Access-Control-Allow-Headers "DNT,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization" always;
}
location = /workspaces-v2/worker/static/viewer-pdf/mupdf-wasm.wasm {
add_header Content-Type application/wasm always;
alias /opt/react_client/static/viewer-pdf/mupdf-wasm.wasm;
}
# location ~^/api/pm/ {
# #rewrite /api/(.+) /$1 break;
# proxy_set_header Host $host;
# proxy_pass http://backend-service.pm.svc.cluster.local:8000;
# }
location ~^/media/ {
rewrite ^/media/(.*)$ /$1 break;
proxy_set_header Host $host;
proxy_pass http://s3-proxy-service:80;
}
location ~^/api/v1/documents/ {
#rewrite /api/(.+) /$1 break;
proxy_set_header Host $host;
proxy_pass http://documentations-filestream.documentations.svc.cluster.local:8080;
}
location ~^/(api|admin)/ {
proxy_set_header Host $host;
proxy_pass http://backend:8000;
}
# location ~^/flows/static/ {
# rewrite /flows/static/(.+) /$1 break;
# proxy_pass http://frontend-service.flows:80;
# }
# location = ~^/orchestrator/ {
# rewrite ^/orchestrator$ /api/ break;
# proxy_pass http://cde.orchestrator.svc.cluster.local:8080;
# }
# location = ~^/orchestrator/api/process {
# rewrite ^/orchestrator/api/process$ /api/process break;
# proxy_pass http://cde.orchestrator.svc.cluster.local:8080;
# }
# location ~ ^/orchestrator/api/process/(.*)$ {
# rewrite ^/orchestrator/api/process/(.*)$ /api/process/$1 break;
# proxy_pass http://cde.orchestrator.svc.cluster.local:8080;
# }
# location = ~^/orchestrator/api/sign {
# rewrite ^/orchestrator/api/sign$ /api/sign break;
# proxy_pass http://cde.orchestrator.svc.cluster.local:8080;
# }
location ~^/workspaces-v2/(.+).js {
rewrite /workspaces-v2/(.+) /$1 break;
proxy_pass http://workspaces-v2-frontend-static-service.workspaces.svc.cluster.local:8080;
}
location @index {
add_header Cache-Control 'no-cache, must-revalidate, proxy-revalidate, max-age=0';
if_modified_since off;
expires off;
try_files /static/index.html =404;
}
location ~^/workflows/(.+).js {
rewrite /workflows/(.+) /$1 break;
proxy_pass http://frontend-service.workflow.svc.cluster.local:8080;
}
location /service-worker.js {
try_files /static/$uri @index;
}
location / {
try_files $uri @index;
}
}
}

100
apps/django/wb/redis.yaml Normal file
View File

@ -0,0 +1,100 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: redis
namespace: django
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:
redis:
enabled: true
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/redis:latest
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: redis
replicaCount:
_default: 1
port:
_default: 6379
resources:
limits:
cpu:
_default: 20m
memory:
_default: 48Mi
requests:
cpu:
_default: 10m
memory:
_default: 32Mi
probes:
liveness:
enabled: false
readiness:
enabled: false
service:
enabled: true
name:
_default: redis-service
type:
_default: ClusterIP
port:
_default: 6379
targetPort:
_default: 6379
portName:
_default: tcp
imagePullSecrets:
enabled:
_default: true
name:
_default: dockerhub
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

View File

@ -0,0 +1,129 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: s3-proxy
namespace: django
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:
s3-proxy:
enabled: true
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/s3-proxy:stable
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: s3-proxy
replicaCount:
_default: 1
port:
_default: 80
resources:
limits:
cpu:
_default: 20m
memory:
_default: 48Mi
requests:
cpu:
_default: 10m
memory:
_default: 32Mi
probes:
liveness:
enabled: false
readiness:
enabled: false
service:
enabled: true
name:
_default: s3-proxy-service
type:
_default: ClusterIP
port:
_default: 80
targetPort:
_default: 80
portName:
_default: http
imagePullSecrets:
enabled:
_default: true
name:
_default: dockerhub
envs:
- name: AWS_API_ENDPOINT
value:
_default: "http://10.49.10.90:9000"
- name: ACCESS_LOG
value:
_default: "true"
- name: CORS_ALLOW_HEADERS
value:
_default: "Content-Type, Accept-Ranges, Content-Range, Content-Encoding"
secretEnvs:
- name: AWS_ACCESS_KEY_ID
secretName:
_default: "sarex-media-storage-secret"
secretKey: "login"
- name: AWS_SECRET_ACCESS_KEY
secretName:
_default: "sarex-media-storage-secret"
secretKey: "password"
- name: AWS_S3_BUCKET
secretName:
_default: "sarex-media-storage-secret"
secretKey: "bucket"
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

View File

@ -0,0 +1,107 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: srx-admin
namespace: django
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:
srx-admin:
enabled: true
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/srx-admin:prod_ee0a6717
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: srx-admin
replicaCount:
_default: 1
port:
_default: 80
resources:
limits:
cpu:
_default: 20m
memory:
_default: 48Mi
requests:
cpu:
_default: 10m
memory:
_default: 32Mi
probes:
liveness:
enabled: false
readiness:
enabled: false
service:
enabled: true
name:
_default: srx-admin-svc
type:
_default: ClusterIP
port:
_default: 8080
targetPort:
_default: 80
portName:
_default: http
imagePullSecrets:
enabled:
_default: true
name:
_default: dockerhub
volumes:
_default:
- name: tmp-volume
mountPath:
_default: /tmp
emptyDir: {}
commitSha: ""
gitlabUri: ""
gitlabJobUrl: ""
owner: ""

View File

@ -0,0 +1,31 @@
---
apiVersion: v1
kind: ConfigMap
metadata:
name: uwsgi-configmap
namespace: django
data:
uwsgi.ini: |
[uwsgi]
module = config.wsgi:application
DJANGO_SETTINGS_MODULE = config.settings.production
http = 0.0.0.0:8000
processes = 16
master = true
vacuum = true
enable-threads = true
buffer-size = 65535
stats = :3031
stats-http = true
memory-report = true
lazy-apps = true
listen = 128
disable-write-exception= 0
harakiri = 300
socket-timeout = 300
chunked-input-timeout = 300
http-timeout = 300
worker-reload-mercy = 240
mule-reload-mercy = 240
static-map = /static=/opt/sarex/sarex/static/
static-map = /media=/media/

View File

@ -0,0 +1,15 @@
---
apiVersion: v1
kind: ConfigMap
metadata:
name: zitadel-configmap
namespace: django
data:
config.json: |-
{
"auth_type": "zitadel",
"zitadel": {
"client_id": "363741990556356237",
"host": "https://zitadel-srx.wb.ru"
}
}

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