Compare commits

...

66 Commits
aero ... master

Author SHA1 Message Date
ivan
0b510fb9b2 ++ 2026-08-05 19:26:13 +05:00
c55bec5b5d ++ fix acme http01 challenges on external-stage, route all domains through istio instead of the dead nginx solver 2026-08-05 17:24:04 +03:00
emelinda
15392f3373 Add message-hub HelmRelease to d8-ugmk-prod: configure Kafka topics, environment variables, and enable Kafka integration in django. 2026-08-05 17:09:39 +03:00
emelinda
3317bbf5cd Update celery and backend in d8-ugmk-prod: enable caching, configure Redis host/port, and adjust environment variables for deployment consistency 2026-08-05 16:02:56 +03:00
emelinda
e1ca5d7706 Add s3-proxy HelmRelease to d8-ugmk-prod and configure endpoint and annotations for closed contour compatibility 2026-08-05 15:50:18 +03:00
emelinda
8447ab76bb Add frontend HelmRelease to d8-ugmk-prod and configure Istio route for s3-proxy in Istio config 2026-08-05 15:33:56 +03:00
emelinda
2dbc0b9266 add python manage.py makemigrations pm --noinput to pm entripoint 2026-08-05 15:09:35 +03:00
emelinda
2993c12487 Add python manage.py migrate execution to d8-ugmk-prod backend entrypoint script 2026-08-05 15:03:17 +03:00
emelinda
028abbe4d2 Merge remote-tracking branch 'origin/master' 2026-08-05 14:52:47 +03:00
emelinda
ae70f63fa3 Update celery and backend image tags in d8-ugmk-prod to production_fa0f1551 and adjust deployment configuration accordingly. 2026-08-05 14:51:51 +03:00
ivan
bc7f8c4950 ++ 2026-08-05 16:42:30 +05:00
emelinda
16c1c03b9e Rename backend-s3 HelmRelease to backend in d8-ugmk-prod and update deployment configuration with environment variable management and migration script adjustments. 2026-08-05 14:13:14 +03:00
emelinda
3cd5600f23 Add backend-s3, celery, and redis HelmReleases to d8-ugmk-prod: configure charts, deployment settings, and include in cluster Kustomization 2026-08-05 13:44:47 +03:00
ivan
ecd758d944 ++ 2026-08-05 13:57:41 +05:00
emelinda
12f3281deb Add IaC catalog: create IAC-CATALOG.md documenting component repositories, deployment models, and cluster configurations. 2026-08-05 11:29:52 +03:00
ivan
19fe0a66c2 ++ 2026-08-05 12:40:27 +05:00
ivan
30d58ba9af ++ 2026-08-05 12:30:12 +05:00
emelinda
abc4d756db Add S3 Proxy apps to yc-ecp: define s3-proxy and s3-proxy-bim HelmReleases with chart, deployment, and service configurations, and include in cluster Kustomization 2026-08-05 02:19:42 +03:00
emelinda
af6135f2b0 Re-enable and configure multiple virtual services in yc-ecp Istio configuration for main-gateway. 2026-08-05 02:16:35 +03:00
emelinda
9da34bb9cc Re-enable Django app in yc-ecp cluster Kustomization file. 2026-08-05 02:12:32 +03:00
emelinda
8d9e1d3d9e Comment out Django app in yc-ecp cluster Kustomization file. 2026-08-05 02:11:22 +03:00
emelinda
db0b8988f1 Refactor yc-ecp configuration: update HelmRelease affinity settings for frontend and re-enable commented Istio routes for main-gateway. 2026-08-05 02:06:17 +03:00
emelinda
218d233eb7 Add Django frontend app to yc-ecp: define namespace, configure HelmRelease with chart and deployment details, update Istio configuration, and include in cluster Kustomization 2026-08-05 01:58:35 +03:00
emelinda
f88cf04434 Update Measurements app image in yc-ecp configuration: change default tag to prod_6070cd4d 2026-08-05 01:48:07 +03:00
emelinda
d5884d3a3b Update Measurements app in yc-ecp: configure custom gunicorn command with access log settings 2026-08-05 01:39:43 +03:00
emelinda
d46ba48d22 Update yc-ecp Istio configuration: add main-gateway and TLS settings for aero.invest.sarex.io 2026-08-05 01:05:11 +03:00
emelinda
638da92688 Update Measurements app configuration in yc-ecp: enable backend service, set deployment and service details, and define resource requests and ports 2026-08-05 00:46:00 +03:00
emelinda
64412e1b94 Add Measurements app to yc-ecp: define namespace, update HelmRelease with chart details, and include in cluster Kustomization 2026-08-05 00:35:29 +03:00
emelinda
4abcd33cd5 Comment out Measurements app in yc-ecp cluster Kustomization file. 2026-08-05 00:26:54 +03:00
emelinda
27e36cfa7c Refactor Measurements app kustomization in yc-ecp: remove unused patches section and update resource references 2026-08-05 00:17:21 +03:00
emelinda
c7c244e95d Update yc-ecp Istio configuration: add imagePullSecrets for cert-manager and enforce HTTPS for dashboard bindings 2026-08-05 00:11:41 +03:00
emelinda
3a5b3b07e6 Add Measurements app to yc-ecp: define HelmRelease, configure Istio certificates, and update cluster Kustomization 2026-08-05 00:00:06 +03:00
emelinda
172e889f00 Add Kubernetes Dashboard configuration to yc-ecp: define HelmRelease, update Istio Gateway and VirtualService, and include in cluster Kustomization 2026-08-04 23:34:53 +03:00
emelinda
e491466a37 Refactor yc-ecp Istio and cert-manager configurations: adjust ClusterIssuer specs, update certificate and VirtualService keys, and add port names. 2026-08-04 23:27:13 +03:00
emelinda
6b107c872a Remove deprecated Let's Encrypt ClusterIssuer configurations and update dependencies in yc-ecp cert-manager and Istio configuration. 2026-08-04 23:14:05 +03:00
emelinda
9e4a27f898 Remove unused Let's Encrypt ClusterIssuer configurations from yc-ecp cert-manager directory. 2026-08-04 23:07:06 +03:00
emelinda
da36ac822f Remove unused ClusterIssuer references from yc-ecp cert-manager kustomization 2026-08-04 23:06:33 +03:00
emelinda
4cd9a8b4d5 Add imagePullSecrets to Let's Encrypt ClusterIssuer for DockerHub authentication 2026-08-04 22:58:10 +03:00
emelinda
c4e6c079f7 Migrate cert-manager configuration to yc-ecp infrastructure directory with updated HelmRelease, ClusterIssuer, and Kustomization files. 2026-08-04 22:53:59 +03:00
emelinda
6e94f826c3 Migrate Istio and Vault configurations to separate yc-ecp infrastructure directories with updated HelmRelease and Kustomization files. 2026-08-04 22:34:42 +03:00
ivan
3bb9514f1e ++ 2026-08-04 19:22:37 +05:00
ivan
16477cc6fd ++ 2026-08-04 18:56:41 +05:00
ivan
1e1280d74e ++ 2026-08-04 18:54:52 +05:00
ivan
a8a4f5e50d ++ 2026-08-04 18:33:39 +05:00
ivan
27327f2c9c ++ 2026-08-04 14:36:19 +05:00
ivan
a9ec189e91 ++ 2026-08-04 14:30:09 +05:00
ivan
9c892604fb ++ 2026-08-04 14:18:35 +05:00
ivan
0703f6a7ea ++ 2026-08-04 14:07:53 +05:00
ivan
c5ca007f03 ++ 2026-08-04 13:42:34 +05:00
ivan
a076995f3a ++ 2026-08-04 13:37:51 +05:00
ivan
0c04c357dc ++ 2026-08-04 13:29:50 +05:00
ivan
ebe1bbfd08 ++ 2026-08-04 13:19:31 +05:00
ivan
311abec040 ++ 2026-08-04 13:08:37 +05:00
ivan
3d80c69ed1 ++ 2026-08-04 12:52:48 +05:00
ivan
fb765a9cf9 ++ 2026-08-04 12:41:10 +05:00
ivan
8a0eee6538 ++ 2026-08-03 20:41:38 +05:00
ivan
f8a16fe423 ++ 2026-08-03 16:32:47 +05:00
ivan
48ec94afc9 ++ 2026-08-03 16:05:21 +05:00
ivan
30f669ed14 ++ 2026-08-03 15:59:05 +05:00
ivan
f55f25479a ++ 2026-08-03 15:46:41 +05:00
ivan
55c9f573c3 ++ 2026-08-03 15:30:37 +05:00
ivan
0dbe5dd0ac ++ 2026-08-03 14:57:06 +05:00
ivan
b84811a5b2 ++ 2026-08-03 14:52:09 +05:00
ivan
3b1878ca59 ++ 2026-08-03 14:48:27 +05:00
ivan
9c5dd7c860 ++ 2026-08-03 14:32:07 +05:00
ivan
bf5b04ace7 ++ 2026-08-03 14:27:22 +05:00
75 changed files with 3359 additions and 227 deletions

675
IAC-CATALOG.md Normal file
View File

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

View File

@ -49,10 +49,19 @@ spec:
[ -f /vault/secrets/attachments-db ] && . /vault/secrets/attachments-db
[ -f /vault/secrets/attachments-s3 ] && . /vault/secrets/attachments-s3
set +a
mkdir -p /etc/sarex/yc-s3-storage
cat > /etc/sarex/yc-s3-storage/yc-s3-service-account.json <<EOF
{
"endpoint": "${YANDEX_S3_ENDPOINT_URL}",
"access_key_id": "${YANDEX_S3_ACCESS_KEY_ID}",
"secret_access_key": "${YANDEX_S3_SECRET_ACCESS_KEY}",
"use_ssl": ${YANDEX_S3_USE_SSL}
}
EOF
exec /opt/attachments/entrypoint.sh
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/attachments:feature_6238c882
_default: cr.yandex/crp3ccidau046kdj8g9q/att9:dev
pullPolicy:
_default: IfNotPresent
service:
@ -76,6 +85,9 @@ spec:
- name: POSTGRES_POOL_SIZE
value:
_default: "10"
- name: YANDEX_S3_ACCOUNT_PATH
value:
_default: "/etc/sarex/yc-s3-storage/yc-s3-service-account.json"
- name: API_ADDRESS
value:
_default: 0.0.0.0:8000
@ -103,7 +115,7 @@ spec:
YANDEX_S3_ENDPOINT_URL=minio.minio:9000
YANDEX_S3_ACCESS_KEY_ID={{ index .Data.data "access_key" }}
YANDEX_S3_SECRET_ACCESS_KEY={{ index .Data.data "secret_key" }}
YANDEX_S3_USE_SSL=false
YANDEX_S3_USE_SSL=true
YANDEX_S3_REGION=ru-central
YANDEX_S3_VERIFY=false
BUCKET_NAME=attachments

View File

@ -22,14 +22,14 @@ spec:
DATABASE_PASSWORD={{ index .Data.data "password" }}
DATABASE_SSL_MODE=disable
{{- end -}}
# vault.hashicorp.com/agent-inject-secret-attachments-s3: secrets/data/minio/apps/attachments
# vault.hashicorp.com/agent-inject-template-attachments-s3: |-
# {{- with secret "secrets/data/minio/apps/attachments" -}}
# YANDEX_S3_ENDPOINT_URL=minio.minio:9000
# YANDEX_S3_ACCESS_KEY_ID={{ index .Data.data "access_key" }}
# YANDEX_S3_SECRET_ACCESS_KEY={{ index .Data.data "secret_key" }}
# YANDEX_S3_USE_SSL=false
# YANDEX_S3_REGION=ru-central
# YANDEX_S3_VERIFY=false
# BUCKET_NAME=attachments
# {{- end -}}
vault.hashicorp.com/agent-inject-secret-attachments-s3: secrets/data/minio/apps/attachments
vault.hashicorp.com/agent-inject-template-attachments-s3: |-
{{- with secret "secrets/data/minio/apps/attachments" -}}
YANDEX_S3_ENDPOINT_URL=s3.uralmine.com
YANDEX_S3_ACCESS_KEY_ID={{ index .Data.data "access_key" }}
YANDEX_S3_SECRET_ACCESS_KEY={{ index .Data.data "secret_key" }}
YANDEX_S3_USE_SSL=true
YANDEX_S3_REGION=ru-central
YANDEX_S3_VERIFY=false
BUCKET_NAME=sarex-attachments-storage
{{- end -}}

View File

@ -42,7 +42,7 @@ spec:
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/bim-api:contour_f9f2a39
_default: cr.yandex/crp3ccidau046kdj8g9q/bim-api:contour_f9f2a39-dirty
pullPolicy:
_default: IfNotPresent

View File

@ -64,7 +64,7 @@ spec:
service:
enabled: true
name:
_default: rfi-backend-api-svc
_default: backend-svc
type:
_default: ClusterIP
port:

View File

@ -285,6 +285,9 @@ spec:
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" }}
AWS_S3_ACCESS_KEY_ID={{ index .Data.data "access_key" }}
AWS_S3_SECRET_ACCESS_KEY={{ index .Data.data "secret_key" }}
AWS_STORAGE_BUCKET_NAME={{ if gt (len $buckets) 0 }}{{ index (index $buckets 0) "name" }}{{ else }}django{{ end }}
{{- end }}
vault.hashicorp.com/agent-inject-secret-django-kafka: secrets/data/kafka/apps/django
vault.hashicorp.com/agent-inject-template-django-kafka: |-

View File

@ -62,6 +62,7 @@ data:
if_modified_since off;
expires off;
}
location ~^/api/pm/ {
#rewrite /api/(.+) /$1 break;
proxy_http_version 1.1;
@ -70,11 +71,12 @@ data:
proxy_pass http://backend-svc.pm.svc.cluster.local:8000;
}
# location ~^/api/v1/documents/ {
# #rewrite /api/(.+) /$1 break;
# proxy_set_header Host $host;
# proxy_pass http://backend-filestream-svc.documentations.svc.cluster.local:80;
# }
location ~^/api/v1/documents/ {
proxy_http_version 1.1;
#rewrite /api/(.+) /$1 break;
proxy_set_header Host $host;
proxy_pass http://backend-filestream-svc.documentations.svc.cluster.local:80;
}
location ~^/(api|admin)/ {
proxy_http_version 1.1;
@ -83,14 +85,55 @@ data:
proxy_pass http://backend-svc.django.svc.cluster.local:80;
}
location ~^/workspaces-v2/(.+).js {
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 Connection "";
rewrite /workspaces-v2/(.+) /$1 break;
proxy_pass http://frontend-svc.workspaces.svc.cluster.local:80;
}
location ~^/workspaces-v2/(.+)\.wasm$ {
proxy_http_version 1.1;
proxy_set_header Connection "";

View File

@ -126,9 +126,13 @@ spec:
- name: ZITADEL_HOST
value:
_default: https://sarex-login.uralmine.com
# Включено вместе с message-hub: он консьюмер топика message-hub-stage
# (SETTINGS_TOPICS в apps/message-hub/d8-ugmk-prod/message-hub.yaml),
# а писать в этот топик должен django. Vault-шаблон django-kafka
# и KAFKA_SSL_CAFILE уже есть в base — здесь только флаг.
- name: SERVER_KAFKA_ENABLED
value:
_default: "False"
_default: "True"
- name: KAFKA_TOPICS
value:
_default: '{"planning": "message-hub-stage", "ams-sync": "ams-sync"}'
@ -138,3 +142,17 @@ spec:
- name: KC_USE_REDIRECT_LOGOUT
value:
_default: "False"
podAnnotations:
_default:
vault.hashicorp.com/agent-inject-template-django-s3: |-
{{- with secret "secrets/data/minio/apps/django" }}
AWS_S3_ENDPOINT_URL=https://s3.uralmine.com
S3_HOST=https://s3.uralmine.com
{{- $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" }}
AWS_S3_ACCESS_KEY_ID={{ index .Data.data "access_key" }}
AWS_S3_SECRET_ACCESS_KEY={{ index .Data.data "secret_key" }}
AWS_STORAGE_BUCKET_NAME={{ if gt (len $buckets) 0 }}{{ index (index $buckets 0) "name" }}{{ else }}django{{ end }}
{{- end }}

View File

@ -13,3 +13,7 @@ patches:
target:
kind: ConfigMap
name: zitadel-configmap
- path: s3-proxy.yaml
target:
kind: HelmRelease
name: s3-proxy

View File

@ -0,0 +1,31 @@
---
# Патч s3-proxy для контура УГМК.
#
# В base зашит AWS_API_ENDPOINT=https://minio.contour.infra.sarex.tech —
# в закрытом контуре этот хост недоступен, прокси не достучится до MinIO
# и маршрут /media/ (s3-proxy-virt-service в istio-config) вернёт ошибку.
#
# podAnnotations — map, мержится по ключам, поэтому переопределён только
# agent-inject-template-s3; остальные vault-аннотации берутся из base.
# Эндпоинт задан литералом, а не через .Data.data.client.endpoint: так же
# сделано в apps/django/d8-ugmk-prod/backend.yaml:145 для того же секрета
# secrets/data/minio/apps/django — держим один способ на весь ns.
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: s3-proxy
namespace: django
spec:
values:
services:
s3-proxy:
podAnnotations:
_default:
vault.hashicorp.com/agent-inject-template-s3: |
{{- with secret "secrets/data/minio/apps/django" }}
AWS_API_ENDPOINT=https://s3.uralmine.com
{{- $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 }}

View File

@ -0,0 +1,139 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: frontend
namespace: django
spec:
interval: 5m
timeout: 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/sarex-frontend-dev:cps_82ba823b
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
imagePullSecrets:
enabled:
_default: true
name:
_default: dockerhub
# чарт прогоняет weight, key, operator и topologyKey через pluckEnv,
# который читает только map вида {_default: …}; скаляры дают пустые значения
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight:
_default: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key:
_default: app
operator:
_default: In
values:
- frontend
topologyKey:
_default: kubernetes.io/hostname
# ConfigMap'ы nginx-configmap и robots-txt-config создаются вне этого
# релиза — чарт только монтирует их
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: robots-volume
mountPath:
_default: /opt/react_client/robots.txt
subPath:
_default: robots.txt
configMap:
name:
_default: robots-txt-config
items:
- key: robots.txt
path:
_default: robots.txt

View File

@ -0,0 +1,9 @@
---
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: django
resources:
- frontend.yaml
- s3-proxy.yaml
- s3-proxy-bim.yaml
# - namespace.yaml

View File

@ -0,0 +1,7 @@
---
apiVersion: v1
kind: Namespace
metadata:
name: django
labels:
istio-injection: enabled

View File

@ -0,0 +1,104 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: s3-proxy-bim
namespace: django
spec:
interval: 5m
timeout: 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-bim:
enabled: true
# образ публичный, из Docker Hub — pull-секрет не нужен
image:
name:
_default: pottava/s3-proxy
pullPolicy:
_default: Always
deployment:
enabled: true
name:
_default: s3-proxy-bim
replicaCount:
_default: 2
port:
_default: 80
probes:
liveness:
enabled: false
readiness:
enabled: false
service:
enabled: true
name:
_default: s3-bim-service
type:
_default: ClusterIP
port:
_default: 80
targetPort:
_default: 80
portName:
_default: http
imagePullSecrets:
enabled:
_default: false
envs:
- name: AWS_API_ENDPOINT
value:
_default: "https://storage.yandexcloud.net"
# ключи S3 лежат в Secret/s3-proxy-bim-secret, созданном вне этого релиза
secretEnvs:
- name: AWS_ACCESS_KEY_ID
secretName:
_default: "s3-proxy-bim-secret"
secretKey: "login"
- name: AWS_SECRET_ACCESS_KEY
secretName:
_default: "s3-proxy-bim-secret"
secretKey: "password"
- name: AWS_S3_BUCKET
secretName:
_default: "s3-proxy-bim-secret"
secretKey: "bucket"

View File

@ -0,0 +1,105 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: s3-proxy
namespace: django
spec:
interval: 5m
timeout: 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: cr.yandex/crp3ccidau046kdj8g9q/s3-proxy:stable
pullPolicy:
_default: Always
deployment:
enabled: true
name:
_default: s3-proxy
replicaCount:
_default: 2
port:
_default: 80
probes:
liveness:
enabled: false
readiness:
enabled: false
service:
enabled: true
name:
_default: s3-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: "https://storage.yandexcloud.net"
# ключи S3 лежат в Secret/s3-proxy-secret, созданном вне этого релиза
secretEnvs:
- name: AWS_ACCESS_KEY_ID
secretName:
_default: "s3-proxy-secret"
secretKey: "login"
- name: AWS_SECRET_ACCESS_KEY
secretName:
_default: "s3-proxy-secret"
secretKey: "password"
- name: AWS_S3_BUCKET
secretName:
_default: "s3-proxy-secret"
secretKey: "bucket"

View File

@ -3,7 +3,7 @@ apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: frontend
namespace: document-link
namespace:
spec:
interval: 10m
@ -36,7 +36,7 @@ spec:
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/document-link-frontend:wb_cb2027ce
_default: cr.yandex/crp3ccidau046kdj8g9q/document-link-frontend:contour_d8c3481b
pullPolicy:
_default: IfNotPresent
@ -50,7 +50,7 @@ spec:
_default: 1
port:
_default: 80
_default: 3000
resources:
requests:
@ -78,7 +78,7 @@ spec:
_default: 80
targetPort:
_default: 80
_default: 3000
portName:
_default: http

View File

@ -144,7 +144,7 @@ spec:
_default: sarex.contour.infra.sarex.tech
- name: DOCUMENTATION_URL
value:
_default: http://documentations-api.documentations.svc.cluster.local:80/
_default: http://backend-api-svc.documentations.svc.cluster.local:80/
- name: WORKFLOW_URL
value:
_default: http://backend-svc.processing.svc.cluster.local:80/

View File

@ -68,7 +68,7 @@ spec:
_default: sarex.uralmine.com
- name: DOCUMENTATION_URL
value:
_default: http://documentations-api.documentations.svc.cluster.local:80/
_default: http://backend-api-svc.documentations.svc.cluster.local:80/
- name: WORKFLOW_URL
value:
_default: http://backend-svc.processing.svc.cluster.local:80/
@ -95,7 +95,7 @@ spec:
_default: http://marks-service:8000
- name: PUBLIC_LINK_HOST
value:
_default: https://document-link-srx.wb.ru
_default: https://sarex-document-link.uralmine.com
- name: NAMESPACE
value:
_default: documentations

View File

@ -92,7 +92,7 @@ spec:
_default: http://marks-service:8000
- name: PUBLIC_LINK_HOST
value:
_default: https://document-link-srx.wb.ru
_default: https://sarex-document-link.uralmine.com
- name: NAMESPACE
value:
_default: documentations

View File

@ -167,11 +167,11 @@ spec:
- name: GATEWAY_URL
value:
_default: "http://pdm-api.documentations.svc.cluster.local:8080"
_default: "http://pdm-svc.documentations.svc.cluster.local:80"
- name: RESOURCE_URL
value:
_default: "http://resources-service.resources.svc.cluster.local:8000"
_default: "http://iam-backend.iam.svc.cluster.local:8000"
- name: SERVICE_HOST
value:
@ -199,7 +199,7 @@ spec:
- name: WORKFLOWS_HOST
value:
_default: "http://workflows-api-service.workflow.svc.cluster.local:8000/api/v1"
_default: "http://backend-svc.processing.svc.cluster.local:80/api/v1"
- name: WORKFLOWS_TIMEOUT
value:

View File

@ -102,6 +102,23 @@ spec:
name:
_default: regcred
volumes:
_default:
- name: iam-zitadel-org-rules
mountPath:
_default: /config/zitadel/org-rules-prod.json
subPath:
_default: org-rules-prod.json
readOnly:
_default: true
configMap:
name:
_default: iam-zitadel-org-rules
items:
- key: org-rules-prod.json
path:
_default: org-rules-prod.json
labels:
monitoring: prometheus
@ -132,11 +149,11 @@ spec:
- name: ZITADEL_ENABLED
value:
_default: "false"
_default: "true"
- name: ZITADEL_HOST
value:
_default: "https://login.sarex.io"
_default: "https://sarex-login.uralmine.com"
- name: ZITADEL_ORG_RULES_FILE
value:
@ -187,10 +204,10 @@ spec:
{{- with secret "secrets/data/apps/iam/postgres" -}}
DB_DSN=postgres://{{ index .Data.data "username" }}:{{ index .Data.data "password" }}@{{ index .Data.data "host" }}:{{ index .Data.data "port" }}/{{ index .Data.data "database" }}
{{- end -}}
vault.hashicorp.com/agent-inject-secret-iam-zitadel: secrets/data/apps/iam/zitadel
vault.hashicorp.com/agent-inject-secret-iam-zitadel: secrets/data/vault/common/django_auth
vault.hashicorp.com/agent-inject-template-iam-zitadel: |-
{{- with secret "secrets/data/apps/iam/zitadel" -}}
ZITADEL_ACCESS_TOKEN={{ index .Data.data "access_token" }}
{{- with secret "secrets/data/vault/common/django_auth" -}}
ZITADEL_ACCESS_TOKEN={{ index .Data.data "django_zitadel_access_token" }}
{{- end -}}
vault.hashicorp.com/agent-inject-secret-iam-kafka: secrets/data/kafka/apps/iam
vault.hashicorp.com/agent-inject-template-iam-kafka: |-

View File

@ -5,3 +5,4 @@ namespace: iam
resources:
- namespace.yaml
- backend.yaml
- zitadel-org-rules-configmap.yaml

View File

@ -0,0 +1,12 @@
---
apiVersion: v1
kind: ConfigMap
metadata:
name: iam-zitadel-org-rules
namespace: iam
data:
org-rules-prod.json: |
{
"default_org_id": "383923292894987370",
"rules": []
}

View File

@ -0,0 +1,78 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: iam-backend
namespace: iam
spec:
values:
services:
backend:
envs:
- name: ENVIRONMENT
value:
_default: "prod"
- name: LOG_LEVEL
value:
_default: "debug"
- name: AUTH_ENABLED
value:
_default: "true"
- name: HTTP_PORT
value:
_default: "8080"
- name: HTTP_READ_BUFFER_SIZE
value:
_default: "131072"
- name: DB_MIGRATIONS_PATH
value:
_default: "migrations"
- name: ZITADEL_ENABLED
value:
_default: "true"
- name: ZITADEL_HOST
value:
_default: "https://sarex-login.uralmine.com"
- name: ZITADEL_ORG_RULES_FILE
value:
_default: "config/zitadel/org-rules-prod.json"
- name: S3_ENABLED
value:
_default: "true"
- name: S3_ENDPOINT_URL
value:
_default: "https://s3.uralmine.com"
- name: S3_BUCKET_NAME
value:
_default: "sarex-media-storage"
- name: S3_REGION
value:
_default: "ru-central1"
- name: S3_PRESIGN_EXPIRES
value:
_default: "1h"
- name: KAFKA_ENABLED
value:
_default: "false"
- name: KAFKA_SSL_CAFILE
value:
_default: "/etc/ca-certificates/Yandex/ca-cert"
- name: KAFKA_TOPIC_LEGACY_AMS_SYNC
value:
_default: "ams-sync"

View File

@ -4,3 +4,8 @@ kind: Kustomization
namespace: iam
resources:
- ../base
patches:
- path: backend-s3.yaml
target:
kind: HelmRelease
name: iam-backend

View File

@ -8,3 +8,5 @@ resources:
- celery.yaml
- frontend.yaml
- production-configmap.yaml
- redis-deployment.yaml
- redis-service.yaml

View File

@ -46,7 +46,7 @@ data:
WORKFLOWS_HOST = "http://workflows-api-service.workflow.svc.cluster.local:8000"
WORKFLOWS_URL = "http://workflows-api-service.workflow.svc.cluster.local:8000"
DOCUMENTATIONS_URL = "http://documentations-api.documentations.svc.cluster.local:8080"
DOCUMENTATIONS_URL = "http://backend-api-svc.documentations.svc.cluster.local:80"
RESOURCES_API_HOST = os.getenv("RESOURCES_API_HOST", default="http://resources-service.resources.svc.cluster:8000")
KAFKA_HOST = "wb-stage-kafka-bootstrap.kafka.svc.cluster.local:9093"
KAFKA_USERNAME = "sarex"

View File

@ -0,0 +1,27 @@
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
namespace: issues
labels:
app: redis
spec:
replicas: 1
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: cr.yandex/crp3ccidau046kdj8g9q/redis:latest
imagePullPolicy: Always
ports:
- containerPort: 6379
protocol: TCP
imagePullSecrets:
- name: regcred

View File

@ -0,0 +1,13 @@
---
apiVersion: v1
kind: Service
metadata:
name: redis
namespace: issues
spec:
selector:
app: redis
ports:
- port: 6379
targetPort: 6379
protocol: TCP

View File

@ -0,0 +1,20 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: backend
namespace: issues
spec:
values:
services:
backend:
podAnnotations:
_default:
vault.hashicorp.com/agent-inject-secret-issues-s3: secrets/data/minio/apps/issues
vault.hashicorp.com/agent-inject-template-issues-s3: |-
{{- with secret "secrets/data/minio/apps/issues" -}}
YC_S3_ACCESS_KEY_ID={{ index .Data.data "access_key" }}
YC_S3_SECRET_ACCESS_KEY={{ index .Data.data "secret_key" }}
YC_S3_BUCKET_NAME=sarex-issues
YC_S3_ENDPOINT_URL=https://s3.uralmine.com
{{- end -}}

View File

@ -0,0 +1,20 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: celery
namespace: issues
spec:
values:
services:
celery:
podAnnotations:
_default:
vault.hashicorp.com/agent-inject-secret-issues-s3: secrets/data/minio/apps/issues
vault.hashicorp.com/agent-inject-template-issues-s3: |-
{{- with secret "secrets/data/minio/apps/issues" -}}
YC_S3_ACCESS_KEY_ID={{ index .Data.data "access_key" }}
YC_S3_SECRET_ACCESS_KEY={{ index .Data.data "secret_key" }}
YC_S3_BUCKET_NAME=sarex-issues
YC_S3_ENDPOINT_URL=https://s3.uralmine.com
{{- end -}}

View File

@ -8,3 +8,11 @@ patches:
target:
kind: Namespace
name: issues
- path: backend-s3.yaml
target:
kind: HelmRelease
name: backend
- path: celery-s3.yaml
target:
kind: HelmRelease
name: celery

View File

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

View File

@ -0,0 +1,111 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: measurements
namespace: measurements
spec:
interval: 5m
timeout: 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
# в yc-ecp S3-настройки приходят из Secret, а не через Vault Agent,
# поэтому serviceAccount, vault-аннотации и обёртка entrypoint не нужны
serviceAccount:
enabled:
_default: false
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/measurements:prod_6070cd4d
pullPolicy:
_default: Always
deployment:
enabled: true
name:
_default: measurement
replicaCount:
_default: 2
port:
_default: 8000
# entrypoint.sh запускает gunicorn без --access-logfile, поэтому
# запросы не попадают в лог; подменяем команду целиком
command:
_default: ["/bin/bash", "-ec"]
args:
_default:
- gunicorn -w 4 -k uvicorn.workers.UvicornWorker -b 0.0.0.0:8000 --timeout 240 --access-logfile - --access-logformat '%(h)s "%(r)s" %(s)s %(b)s %(M)sms' measurements.main:app
resources:
requests:
cpu:
_default: 25m
memory:
_default: 128Mi
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
secretEnvs:
- name: S3_JSON_SETTINGS
secretName:
_default: "s3-json-settings"
secretKey: "S3_JSON_SETTINGS"

View File

@ -0,0 +1,7 @@
---
apiVersion: v1
kind: Namespace
metadata:
name: measurements
labels:
istio-injection: enabled

View File

@ -8,3 +8,7 @@ patches:
target:
kind: Namespace
name: message-hub
- path: message-hub.yaml
target:
kind: HelmRelease
name: message-hub

View File

@ -0,0 +1,120 @@
---
# Патч message-hub для контура УГМК.
#
# ВНИМАНИЕ: envs — список, kustomize заменяет его ЦЕЛИКОМ (JSON merge patch),
# поэтому здесь продублирован весь набор из apps/message-hub/base/message-hub.yaml.
# podAnnotations — map, мержится по ключам, поэтому переопределён только
# agent-inject-template-message-hub-kafka; остальные берутся из base.
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: message-hub
namespace: message-hub
spec:
values:
services:
backend:
# base: production_24425472 от 15.02.2026 — 18 production-релизов назад.
# Здесь актуальный production от 31.07.2026.
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/message-hub:production_e8010fe4
envs:
- name: WORKER_TIMEOUT
value:
_default: "60"
- name: PYTHONPATH
value:
_default: "src"
- name: SETTINGS_MAX_RETRIES
value:
_default: "1"
# base: '{"planning": "pm", "assets": "assets_broadcast", "project_entity": "issues_broadcast"}'
# Два исправления:
# 1. ключ project_entity невалиден — TopicsType (src/enums.py) знает только
# assets / planning / issues / resources_updated / resources_deleted,
# на прочих валидатор check_topics_keys кидает ValueError при старте.
# Консьюмер лежит в project_entity.py, но подписан на TopicsType.issues.
# 2. planning был "pm", а django публикует в "message-hub-stage"
# (KAFKA_TOPICS, apps/django/d8-ugmk-prod/backend.yaml) — продюсер
# и консьюмер сидели на разных топиках.
- name: SETTINGS_TOPICS
value:
_default: '{"planning": "message-hub-stage", "assets": "assets_broadcast", "issues": "issues_broadcast"}'
# В base нет, дефолт True. S3 контура (s3.uralmine.com) отдаёт
# самоподписанный сертификат — тот же случай, что S3_VERIFY=False у pm.
# Флаг общий: гасит проверку TLS сразу и для S3, и для всех HTTP-клиентов.
- name: SETTINGS_VERIFY_SSL
value:
_default: "0"
# base: http://backend-service.pm.svc.cluster.local:8000 — сервис pm
# называется backend-svc (apps/pm/base/backend.yaml:91).
- name: SAREX_BASE_HOST
value:
_default: "http://backend-svc.pm.svc.cluster.local:8000"
# В base нет. Без него ServiceConfig с префиксом PM_ уходит
# в дефолт http://localhost:8001. В dsinv и brusnika задан.
- name: PM_HOST
value:
_default: "http://backend-svc.pm.svc.cluster.local:8000"
# Имена сверены с infrastructure/istio-config/d8-ugmk-prod/istio-config.yaml.
- name: EAV_HOST
value:
_default: "http://backend-svc.eav.svc.cluster.local:80"
- name: ISSUES_HOST
value:
_default: "http://backend-svc.issues.svc.cluster.local:80"
- name: CACHE_HOST
value:
_default: "redis.pm.svc.cluster.local"
- name: CACHE_PORT
value:
_default: "6379"
- name: CACHE_SSL
value:
_default: "0"
# ВНИМАНИЕ: значение не подтверждено. В base было захардкожено
# kafka-kafka-contour-controller-headless — имя из другого контура,
# здесь HelmRelease называется kafka (infrastructure/kafka/d8-ugmk-prod).
# Проверить: kubectl -n kafka get svc
# Задано переменной, а не vault-шаблоном, специально: ошибка в шаблоне
# блокирует старт пода (agent-init-first), ошибка в env — только логи.
- name: KAFKA_HOST
value:
_default: "kafka-controller-headless.kafka.svc.cluster.local"
- name: KAFKA_PORT
value:
_default: "9092"
# listeners.client.protocol: SASL_SSL — без CA соединение не поднимется.
- name: KAFKA_SSL_CAFILE
value:
_default: "/usr/local/share/ca-certificates/kafka.crt"
podAnnotations:
_default:
# Из base убраны KAFKA_HOST/KAFKA_PORT: файл /vault/secrets/message-hub-kafka
# подгружается через `set -a; . file`, то есть переписывает переменные
# окружения. Пока хост не подтверждён, держим его в envs.
vault.hashicorp.com/agent-inject-secret-message-hub-kafka: secrets/data/kafka/apps/pm
vault.hashicorp.com/agent-inject-template-message-hub-kafka: |-
{{- with secret "secrets/data/kafka/apps/pm" -}}
KAFKA_USERNAME={{ index .Data.data "username" }}
KAFKA_PASSWORD={{ index .Data.data "password" }}
KAFKA_SECURITY_PROTOCOL={{ index .Data.data.auth "security_protocol" }}
KAFKA_SASL_MECHANISM={{ index .Data.data.auth "sasl_mechanism" }}
{{- end -}}

View File

@ -246,7 +246,7 @@ spec:
S3_LOGIN={{ index .Data.data "access_key" }}
S3_PASSWORD={{ index .Data.data "secret_key" }}
{{- $buckets := index .Data.data "buckets" }}
S3_BUCKET={{- if gt (len $buckets) 0 -}}{{ index (index $buckets 0) "name" }}{{- else -}}pm-bucket{{- end -}}
S3_BUCKET={{- if gt (len $buckets) 0 -}}{{ index (index $buckets 0) "name" }}{{- else -}}sarex-media-storage{{- end -}}
S3_VERIFY=False
{{- end -}}

View File

@ -228,7 +228,7 @@ spec:
S3_LOGIN={{ index .Data.data "access_key" }}
S3_PASSWORD={{ index .Data.data "secret_key" }}
{{- $buckets := index .Data.data "buckets" }}
S3_BUCKET={{- if gt (len $buckets) 0 -}}{{ index (index $buckets 0) "name" }}{{- else -}}pm-bucket{{- end -}}
S3_BUCKET={{- if gt (len $buckets) 0 -}}{{ index (index $buckets 0) "name" }}{{- else -}}sarex-media-storage{{- end -}}
S3_VERIFY=False
{{- end -}}

View File

@ -8,3 +8,4 @@ resources:
- celery.yaml
- frontend.yaml
- backend-configmap.yaml
- resources-static.yaml

View File

@ -0,0 +1,90 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: resources-static
namespace: pm
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:
resources-static:
enabled: true
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/resources-frontend:ugok_7f38a9ce
pullPolicy:
_default: IfNotPresent
deployment:
enabled: true
name:
_default: resources-static
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: resources-static-svc
type:
_default: ClusterIP
port:
_default: 80
targetPort:
_default: 80
portName:
_default: http
imagePullSecrets:
enabled:
_default: true
name:
_default: regcred

View File

@ -0,0 +1,170 @@
---
# Патч backend для контура УГМК.
#
# ВНИМАНИЕ: args — список, kustomize заменяет его ЦЕЛИКОМ (JSON merge patch),
# поэтому здесь продублирован весь скрипт из apps/pm/base/backend.yaml.
# При правке args в base их нужно продублировать и сюда.
# podAnnotations — map, мержится по ключам, поэтому переопределён только
# один ключ agent-inject-template-pm-s3; остальные vault-аннотации берутся из base.
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: backend
namespace: pm
spec:
values:
services:
backend:
# base: production_a889f6a3 (релиз 1.14.1, 13.07.2026).
# Здесь 1.14.7 — pipeline 72144, зелёный.
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/pm-backend:production_fa0f1551
deployment:
args:
_default:
- |
set -a
[ -f /vault/secrets/pm-db ] && . /vault/secrets/pm-db
[ -f /vault/secrets/pm-rabbitmq ] && . /vault/secrets/pm-rabbitmq
[ -f /vault/secrets/pm-s3 ] && . /vault/secrets/pm-s3
set +a
python manage.py makemigrations pm --noinput
python manage.py migrate
exec /opt/sarex/entrypoint.sh
# ВНИМАНИЕ: envs — список, kustomize заменяет его ЦЕЛИКОМ,
# поэтому здесь продублирован весь набор из apps/pm/base/backend.yaml.
# Отличия от base помечены комментариями.
envs:
- name: USERS_INTERNAL_HOST
value:
_default: "http://backend-svc.django.svc.cluster.local:80"
- name: CELERY_REDIS_HOST
value:
_default: "redis.pm.svc.cluster.local"
- name: RESOURCES_INTERNAL_HOST
value:
_default: "http://iam-backend.iam.svc.cluster.local:8000"
- name: EAV_HOST
value:
_default: "http://backend-svc.eav.svc.cluster.local:80"
- name: EAV_API_PREFIX
value:
_default: "/api/v0"
- name: EAV_API_PREFIX_V1
value:
_default: "/api/v1"
- name: TRACING_INSECURE
value:
_default: "False"
- name: SERVER_ENABLE_SYNC_RESOURCES
value:
_default: "True"
- name: SERVER_DELETED_TASK_MAX_AGE_DAYS
value:
_default: "1"
- name: SERVER_EXPIRED_TASK_NOTIFICATION_HOUR
value:
_default: "17"
- name: LANG
value:
_default: "C.UTF-8"
- name: LC_ALL
value:
_default: "C.UTF-8"
- name: PYTHONUTF8
value:
_default: "1"
- name: CACHE_SSL
value:
_default: "False"
- name: CACHE_SSL_CA_CERTS
value:
_default: ""
# base: "False". При False CACHE_CLIENT = None (config/settings/base.py:190),
# и GET /api/pm/msp/external-task-info/ падает с
# AttributeError: 'NoneType' object has no attribute 'get' —
# sarex/pm/utils/broker_producer.py:38 дёргает .get() без проверки на None.
- name: CACHE_ENABLE
value:
_default: "True"
# Новые: в base их нет. Дефолт CacheSettings.host — localhost,
# т.е. без них включённый кэш стучится в собственный под.
# Redis разворачивается тут же — apps/pm/d8-ugmk-prod/redis.yaml.
- name: CACHE_HOST
value:
_default: "redis.pm.svc.cluster.local"
- name: CACHE_PORT
value:
_default: "6379"
- name: CLICKHOUSE_ENABLE
value:
_default: "False"
- name: KAFKA_ENABLE
value:
_default: "False"
- name: AUTH_PUBLIC_TOKEN_URL
value:
_default: "https://sarex.uralmine.com/api/token/public/"
- name: SERVER_HOST
value:
_default: "https://sarex.uralmine.com"
- name: SERVER_API_HOST
value:
_default: "https://sarex.uralmine.com"
- name: SERVER_DEBUG
value:
_default: "False"
- name: SERVER_ALLOWED_HOSTS
value:
_default: '["*"]'
- name: SERVER_USE_OTEL
value:
_default: "False"
- name: SERVER_VERIFY_SSL
value:
_default: "False"
- name: SERVER_LOG_LEVEL
value:
_default: "INFO"
podAnnotations:
_default:
vault.hashicorp.com/agent-inject-template-pm-s3: |-
{{- with secret "secrets/data/minio/apps/pm" -}}
S3_HOST={{ index .Data.data.client "endpoint" }}
S3_LOGIN={{ index .Data.data "access_key" }}
S3_PASSWORD={{ index .Data.data "secret_key" }}
S3_VERIFY=False
{{- $buckets := index .Data.data "buckets" }}
S3_BUCKET={{ if gt (len $buckets) 0 }}{{ index (index $buckets 0) "name" }}{{ else }}sarex-media-storage{{ end }}
{{- end -}}

View File

@ -0,0 +1,160 @@
---
# Патч celery для контура УГМК.
#
# ВНИМАНИЕ: envs — список, kustomize заменяет его ЦЕЛИКОМ (JSON merge patch),
# поэтому здесь продублирован весь набор из apps/pm/base/celery.yaml.
# При добавлении переменной в base её нужно продублировать и сюда.
# podAnnotations — map, мержится по ключам, поэтому переопределён только
# один ключ agent-inject-template-pm-s3; остальные vault-аннотации берутся из base.
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: celery
namespace: pm
spec:
values:
services:
celery:
# Образ общий с backend — держать в одной версии обязательно,
# иначе воркер разъедется с API по схеме задач и моделям.
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/pm-backend:production_fa0f1551
envs:
# base: http://backend-service.sarex.svc.cluster.local:8000 — ns sarex не существует
- name: USERS_INTERNAL_HOST
value:
_default: "http://backend-svc.django.svc.cluster.local:80"
- name: CELERY_REDIS_HOST
value:
_default: "redis.pm.svc.cluster.local"
# base: http://sarex-resources-service.resources — ns resources не развёрнут в контуре
- name: RESOURCES_INTERNAL_HOST
value:
_default: "http://iam-backend.iam.svc.cluster.local:8000"
# base: http://eav-service.eav — сервис называется backend-svc и слушает 80
- name: EAV_HOST
value:
_default: "http://backend-svc.eav.svc.cluster.local:80"
- name: EAV_API_PREFIX
value:
_default: "/api/v0"
- name: EAV_API_PREFIX_V1
value:
_default: "/api/v1"
- name: TRACING_INSECURE
value:
_default: "False"
- name: SERVER_ENABLE_SYNC_RESOURCES
value:
_default: "True"
- name: SERVER_DELETED_TASK_MAX_AGE_DAYS
value:
_default: "1"
- name: SERVER_EXPIRED_TASK_NOTIFICATION_HOUR
value:
_default: "17"
- name: LANG
value:
_default: "C.UTF-8"
- name: LC_ALL
value:
_default: "C.UTF-8"
- name: PYTHONUTF8
value:
_default: "1"
- name: CACHE_SSL
value:
_default: "False"
- name: CACHE_SSL_CA_CERTS
value:
_default: ""
# base: "False". Держим в одном значении с backend: при enable
# config/celery.py включает периодическую синхронизацию ресурсов,
# которая пишет ключи service_accounts / resources:* — их читает
# backend в sarex/pm/utils/resources.py.
- name: CACHE_ENABLE
value:
_default: "True"
# Новые: в base их нет, дефолт CacheSettings.host — localhost.
- name: CACHE_HOST
value:
_default: "redis.pm.svc.cluster.local"
- name: CACHE_PORT
value:
_default: "6379"
- name: CLICKHOUSE_ENABLE
value:
_default: "False"
- name: KAFKA_ENABLE
value:
_default: "False"
# base: https://lk.sarex.io/api/token/public/
- name: AUTH_PUBLIC_TOKEN_URL
value:
_default: "https://sarex.uralmine.com/api/token/public/"
# base: https://lk.sarex.io
- name: SERVER_HOST
value:
_default: "https://sarex.uralmine.com"
# base: https://api.sarex.io
- name: SERVER_API_HOST
value:
_default: "https://sarex.uralmine.com"
- name: SERVER_DEBUG
value:
_default: "False"
- name: SERVER_ALLOWED_HOSTS
value:
_default: '["*"]'
- name: SERVER_USE_OTEL
value:
_default: "False"
- name: SERVER_VERIFY_SSL
value:
_default: "False"
- name: SERVER_LOG_LEVEL
value:
_default: "INFO"
podAnnotations:
_default:
# base склеивал S3_BUCKET с S3_VERIFY: {{- end -}} съедал перевод строки.
# S3_VERIFY поднят выше блока if, у {{ end }} убран хвостовой дефис.
vault.hashicorp.com/agent-inject-template-pm-s3: |-
{{- with secret "secrets/data/minio/apps/pm" -}}
S3_HOST={{ index .Data.data.client "endpoint" }}
S3_LOGIN={{ index .Data.data "access_key" }}
S3_PASSWORD={{ index .Data.data "secret_key" }}
S3_VERIFY=False
{{- $buckets := index .Data.data "buckets" }}
S3_BUCKET={{ if gt (len $buckets) 0 }}{{ index (index $buckets 0) "name" }}{{ else }}sarex-media-storage{{ end }}
{{- end -}}

View File

@ -0,0 +1,22 @@
---
# Патч frontend для контура УГМК.
#
# ВНИМАНИЕ: тег обязан быть contour_*, НЕ production_*.
# Сборка prod-варианта тянет remoteEntry.js модулей с https://modules.sarex.io,
# который в закрытом контуре недоступен (configWebpack/config/endpoints.ts).
# В contour-сборке пути к remoteEntry относительные — только она здесь работает.
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: frontend
namespace: pm
spec:
values:
services:
frontend:
# TODO(Дмитрий): подставить тег новой contour-сборки, когда pipeline
# добежит. Пока продублирован тег из base (contour_e5c3d387,
# 16.07.2026) — то есть патч сейчас ничего не меняет.
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/pm-frontend:contour_fc00e54f

View File

@ -3,8 +3,21 @@ apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../base
- redis.yaml
patches:
- path: namespace.yaml
target:
kind: Namespace
name: pm
- path: backend.yaml
target:
kind: HelmRelease
name: backend
- path: celery.yaml
target:
kind: HelmRelease
name: celery
- path: frontend.yaml
target:
kind: HelmRelease
name: frontend

View File

@ -0,0 +1,98 @@
---
# Redis для celery в ns pm. В base его нет — там CELERY_REDIS_HOST указывает
# на redis.pm.svc.cluster.local, но сам сервис не разворачивается.
#
# Имя Service обязано быть ровно "redis" (не redis-svc, как принято в остальных
# релизах), иначе не сойдётся с CELERY_REDIS_HOST в backend.yaml и celery.yaml.
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: redis
namespace: pm
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:
redis:
enabled: true
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/redis:latest
pullPolicy:
_default: Always
deployment:
enabled: true
name:
_default: redis
replicaCount:
_default: 1
port:
_default: 6379
resources:
requests:
cpu:
_default: 25m
memory:
_default: 64Mi
probes:
liveness:
enabled: false
readiness:
enabled: false
service:
enabled: true
name:
_default: redis
type:
_default: ClusterIP
port:
_default: 6379
targetPort:
_default: 6379
# НЕ http: чарт по умолчанию подставляет "http", и тогда Istio навесит
# на 6379 HTTP-фильтры и сломает RESP. Префикс tcp- переводит порт
# в режим обычного TCP-проксирования.
portName:
_default: tcp-redis
imagePullSecrets:
enabled:
_default: true
name:
_default: regcred

View File

@ -42,7 +42,8 @@ spec:
image:
name:
_default: cr.yandex/crp3ccidau046kdj8g9q/workflows-engine:contour_3ef5b462
_default: cr.yandex/crp3ccidau046kdj8g9q/workflows-engine:contour_a03d37da-dirty2
pullPolicy:
_default: IfNotPresent
@ -161,23 +162,25 @@ spec:
- name: INTERNAL_PDM_URL
value:
_default: "http://documentations-api.documentations.svc.cluster.local:8080"
_default: "http://backend-api-svc.documentations.svc.cluster.local:80"
- name: INTERNAL_FILESTREAM_URL
value:
_default: "http://documentations-filestream.documentations.svc.cluster.local:8080"
_default: "http://backend-filestream-svc.documentations.svc.cluster.local:80"
- name: IGNORE_TAINTS_AND_NODE_SELECTOR
value:
_default: "true"
- name: EXTERNAL_PDM_URL
value:
_default: "http://documentations-api.documentations.svc.cluster.local:8080"
_default: "http://backend-api-svc.documentations.svc.cluster.local:80"
- name: EXTERNAL_FILESTREAM_URL
value:
_default: "http://documentations-filestream-service.documentations.svc.cluster.local:8080"
_default: "http://backend-filestream-svc.documentations.svc.cluster.local:80"
- name: RESOURCES_API_INTERNAL_HOST
value:
_default: "http://resources-service.resources.svc.cluster.local:8000"
_default: "http://iam-backend.iam.svc.cluster.local:8000"
- name: ENABLE_SQL_QUERY
value:

View File

@ -165,7 +165,7 @@ spec:
- name: INTERNAL_FILESTREAM_URL
value:
_default: "http://documentations-filestream.documentations.svc.cluster.local:8080"
_default: "http://backend-filestream-svc.documentations.svc.cluster.local:80"
- name: EXTERNAL_PDM_URL
value:

View File

@ -0,0 +1,20 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: backend
namespace: rfi
spec:
values:
services:
backend:
podAnnotations:
_default:
vault.hashicorp.com/agent-inject-secret-rfi-s3: secrets/data/minio/apps/rfi
vault.hashicorp.com/agent-inject-template-rfi-s3: |-
{{- with secret "secrets/data/minio/apps/rfi" -}}
YC_S3_ENDPOINT_URL=https://s3.uralmine.com
YC_S3_BUCKET_NAME=sarex-rfi
YC_S3_ACCESS_KEY_ID={{ index .Data.data "access_key" }}
YC_S3_SECRET_ACCESS_KEY={{ index .Data.data "secret_key" }}
{{- end -}}

View File

@ -0,0 +1,20 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: celery
namespace: rfi
spec:
values:
services:
celery:
podAnnotations:
_default:
vault.hashicorp.com/agent-inject-secret-rfi-s3: secrets/data/minio/apps/rfi
vault.hashicorp.com/agent-inject-template-rfi-s3: |-
{{- with secret "secrets/data/minio/apps/rfi" -}}
YC_S3_ENDPOINT_URL=https://s3.uralmine.com
YC_S3_BUCKET_NAME=sarex-rfi
YC_S3_ACCESS_KEY_ID={{ index .Data.data "access_key" }}
YC_S3_SECRET_ACCESS_KEY={{ index .Data.data "secret_key" }}
{{- end -}}

View File

@ -9,3 +9,11 @@ patches:
target:
kind: HelmRelease
name: frontend
- path: backend-s3.yaml
target:
kind: HelmRelease
name: backend
- path: celery-s3.yaml
target:
kind: HelmRelease
name: celery

View File

@ -50,7 +50,7 @@ spec:
_default: 1
port:
_default: 80
_default: 8080
resources:
requests:
@ -78,7 +78,7 @@ spec:
_default: 80
targetPort:
_default: 80
_default: 8080
portName:
_default: http

View File

@ -253,7 +253,7 @@ spec:
- name: TRANSMITTAL_SERVICE_DOCUMENTATIONS_REPOSITORY__BASE_URL
value:
_default: "http://documentations-api.documentations.svc.cluster.local:8080"
_default: "http://backend-api-svc.documentations.svc.cluster.local:80"
- name: TRANSMITTAL_SERVICE_DOCUMENTATIONS_REPOSITORY__MAX_CONNECTIONS
value:

View File

@ -238,7 +238,7 @@ spec:
- name: TRANSMITTAL_SERVICE_DOCUMENTATIONS_REPOSITORY__BASE_URL
value:
_default: "http://documentations-api.documentations.svc.cluster.local:8080"
_default: "http://backend-api-svc.documentations.svc.cluster.local:80"
- name: TRANSMITTAL_SERVICE_DOCUMENTATIONS_REPOSITORY__MAX_CONNECTIONS
value:

View File

@ -0,0 +1,256 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: backend
namespace: transmittal
spec:
values:
services:
backend:
envs:
- name: TRANSMITTAL_SERVICE_APP__NAME
value:
_default: "Transmittal Service"
- name: TRANSMITTAL_SERVICE_APP__LOG_LEVEL
value:
_default: "ERROR"
- name: TRANSMITTAL_SERVICE_FLOWS_REPOSITORY__BASE_URL
value:
_default: "http://backend-svc.flows.svc.cluster.local:80"
- name: TRANSMITTAL_SERVICE_FLOWS_REPOSITORY__MAX_CONNECTIONS
value:
_default: "10"
- name: TRANSMITTAL_SERVICE_FLOWS_REPOSITORY__MAX_KEEPALIVE_CONNECTIONS
value:
_default: "5"
- name: TRANSMITTAL_SERVICE_FLOWS_REPOSITORY__TIMEOUT
value:
_default: "30"
- name: TRANSMITTAL_SERVICE_APP__HOST
value:
_default: "https://sarex.contour.infra.sarex.tech/transmittal"
- name: TRANSMITTAL_SERVICE_APP__ENVIRONMENT
value:
_default: "prod"
- name: TRANSMITTAL_SERVICE_CORS__ALLOW_ORIGINS
value:
_default: '["*"]'
- name: TRANSMITTAL_SERVICE_CORS__ALLOW_METHODS
value:
_default: '["*"]'
- name: TRANSMITTAL_SERVICE_CORS__ALLOW_HEADERS
value:
_default: '["*"]'
- name: TRANSMITTAL_SERVICE_CORS__ALLOW_CREDENTIALS
value:
_default: "true"
- name: TRANSMITTAL_SERVICE_UVICORN__HOST
value:
_default: "0.0.0.0"
- name: TRANSMITTAL_SERVICE_UVICORN__PORT
value:
_default: "8000"
- name: TRANSMITTAL_SERVICE_UVICORN__ENABLE_AUTO_RELOAD
value:
_default: "false"
- name: TRANSMITTAL_SERVICE_OTEL__ENABLE
value:
_default: "false"
- name: TRANSMITTAL_SERVICE_OTEL__HOST
value:
_default: "http://signoz-otel-collector-external.signoz.svc.cluster.local:4317"
- name: TRANSMITTAL_SERVICE_OTEL__SERVICE_NAME
value:
_default: "backend.transmittals-prod"
- name: TRANSMITTAL_SERVICE_OTEL__INSECURE
value:
_default: "false"
- name: TRANSMITTAL_SERVICE_DATABASE__SSL_MODE
value:
_default: "verify-full"
- name: TRANSMITTAL_SERVICE_DATABASE__SSL_ROOT_CERT_PATH
value:
_default: "/opt/.postgresql/root.crt"
- name: TRANSMITTAL_SERVICE_UVICORN__LOG_LEVEL
value:
_default: "info"
- name: TRANSMITTAL_SERVICE_UVICORN__NUM_WORKERS
value:
_default: "2"
- name: TRANSMITTAL_SERVICE_UVICORN__ROOT_PATH
value:
_default: ""
- name: TRANSMITTAL_SERVICE_DATABASE__ENABLE_SSL
value:
_default: "false"
- name: TRANSMITTAL_SERVICE_RABBITMQ__HOST
value:
_default: "rabbitmq.rabbitmq.svc.cluster.local"
- name: TRANSMITTAL_SERVICE_RABBITMQ__PORT
value:
_default: "5672"
- name: TRANSMITTAL_SERVICE_SAREX_BACKEND_REPOSITORY__BASE_URL
value:
_default: "http://backend-svc.django.svc.cluster.local:80"
- name: TRANSMITTAL_SERVICE_SAREX_BACKEND_REPOSITORY__MAX_CONNECTIONS
value:
_default: "10"
- name: TRANSMITTAL_SERVICE_SAREX_BACKEND_REPOSITORY__MAX_KEEPALIVE_CONNECTIONS
value:
_default: "5"
- name: TRANSMITTAL_SERVICE_SAREX_BACKEND_REPOSITORY__TIMEOUT
value:
_default: "15"
- name: TRANSMITTAL_SERVICE_RESOURCE_REPOSITORY__BASE_URL
value:
_default: "http://iam-backend.iam.svc.cluster.local:8000"
- name: TRANSMITTAL_SERVICE_RESOURCE_REPOSITORY__MAX_CONNECTIONS
value:
_default: "10"
- name: TRANSMITTAL_SERVICE_RESOURCE_REPOSITORY__MAX_KEEPALIVE_CONNECTIONS
value:
_default: "5"
- name: TRANSMITTAL_SERVICE_RESOURCE_REPOSITORY__TIMEOUT
value:
_default: "15"
- name: TRANSMITTAL_SERVICE_DOCUMENTATIONS_REPOSITORY__BASE_URL
value:
_default: "http://backend-api-svc.documentations.svc.cluster.local:80"
- name: TRANSMITTAL_SERVICE_DOCUMENTATIONS_REPOSITORY__MAX_CONNECTIONS
value:
_default: "10"
- name: TRANSMITTAL_SERVICE_DOCUMENTATIONS_REPOSITORY__MAX_KEEPALIVE_CONNECTIONS
value:
_default: "5"
- name: TRANSMITTAL_SERVICE_DOCUMENTATIONS_REPOSITORY__TIMEOUT
value:
_default: "15"
- name: TRANSMITTAL_SERVICE_S3_CLIENT__MAX_POOL_CONNECTIONS
value:
_default: "10"
- name: TRANSMITTAL_SERVICE_S3_CLIENT__CONNECT_TIMEOUT
value:
_default: "10"
- name: TRANSMITTAL_SERVICE_S3_CLIENT__READ_TIMEOUT
value:
_default: "50"
- name: TRANSMITTAL_SERVICE_S3_CLIENT__REGION_NAME
value:
_default: "ru-central1"
- name: TRANSMITTAL_SERVICE_S3_CLIENT__VERIFY
value:
_default: "true"
- name: TRANSMITTAL_SERVICE_S3_CLIENT__ENDPOINT
value:
_default: "s3.uralmine.com"
- name: TRANSMITTAL_SERVICE_S3_CLIENT__USE_SSL
value:
_default: "true"
- name: TRANSMITTAL_SERVICE_HTML_TO_PDF_CONVERTER__BASE_URL
value:
_default: "http://export-project-service.django.svc.cluster.local:8000"
- name: TRANSMITTAL_SERVICE_HTML_TO_PDF_CONVERTER__MAX_CONNECTIONS
value:
_default: "10"
- name: TRANSMITTAL_SERVICE_HTML_TO_PDF_CONVERTER__MAX_KEEPALIVE_CONNECTIONS
value:
_default: "5"
- name: TRANSMITTAL_SERVICE_HTML_TO_PDF_CONVERTER__TIMEOUT
value:
_default: "50"
- name: TRANSMITTAL_SERVICE_MARKINGS__BASE_URL
value:
_default: "http://marks-service.documentations.svc.cluster.local:8000"
- name: TRANSMITTAL_SERVICE_MARKINGS__MAX_CONNECTIONS
value:
_default: "10"
- name: TRANSMITTAL_SERVICE_MARKINGS__MAX_KEEPALIVE_CONNECTIONS
value:
_default: "5"
- name: TRANSMITTAL_SERVICE_MARKINGS__TIMEOUT
value:
_default: "50"
- name: TRANSMITTAL_SERVICE_MAILGUN__BASE_URL
value:
_default: "https://api.mailgun.net/v3/mg.sarex.io"
- name: TRANSMITTAL_SERVICE_MAILGUN__MAX_CONNECTIONS
value:
_default: "10"
- name: TRANSMITTAL_SERVICE_MAILGUN__MAX_KEEPALIVE_CONNECTIONS
value:
_default: "5"
- name: TRANSMITTAL_SERVICE_MAILGUN__TIMEOUT
value:
_default: "15"
- name: TRANSMITTAL_SERVICE_MAILGUN__EMAIL
value:
_default: "hello@wb.io"
podAnnotations:
_default:
vault.hashicorp.com/agent-inject-secret-transmittal-s3: secrets/data/minio/apps/transmittal
vault.hashicorp.com/agent-inject-template-transmittal-s3: |-
{{- with secret "secrets/data/minio/apps/transmittal" -}}
TRANSMITTAL_SERVICE_S3_CLIENT__ACCESS_KEY={{ index .Data.data "access_key" }}
TRANSMITTAL_SERVICE_S3_CLIENT__SECRET_KEY={{ index .Data.data "secret_key" }}
TRANSMITTAL_SERVICE_S3_CLIENT__DEFAULT_BUCKET=sarex-tf-state
{{- end -}}

View File

@ -8,3 +8,11 @@ patches:
target:
kind: Namespace
name: transmittal
- path: backend-s3.yaml
target:
kind: HelmRelease
name: backend
- path: worker-s3.yaml
target:
kind: HelmRelease
name: worker

View File

@ -0,0 +1,256 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: worker
namespace: transmittal
spec:
values:
services:
worker:
envs:
- name: TRANSMITTAL_SERVICE_FLOWS_REPOSITORY__BASE_URL
value:
_default: "http://backend-svc.flows.svc.cluster.local:8000"
- name: TRANSMITTAL_SERVICE_FLOWS_REPOSITORY__MAX_CONNECTIONS
value:
_default: "10"
- name: TRANSMITTAL_SERVICE_FLOWS_REPOSITORY__MAX_KEEPALIVE_CONNECTIONS
value:
_default: "5"
- name: TRANSMITTAL_SERVICE_FLOWS_REPOSITORY__TIMEOUT
value:
_default: "30"
- name: TRANSMITTAL_SERVICE_APP__NAME
value:
_default: "Transmittal Service"
- name: TRANSMITTAL_SERVICE_APP__LOG_LEVEL
value:
_default: "ERROR"
- name: TRANSMITTAL_SERVICE_APP__HOST
value:
_default: "https://lk.srx.wb.ru:30443/transmittal"
- name: TRANSMITTAL_SERVICE_APP__ENVIRONMENT
value:
_default: "prod"
- name: TRANSMITTAL_SERVICE_CORS__ALLOW_ORIGINS
value:
_default: '["*"]'
- name: TRANSMITTAL_SERVICE_CORS__ALLOW_METHODS
value:
_default: '["*"]'
- name: TRANSMITTAL_SERVICE_CORS__ALLOW_HEADERS
value:
_default: '["*"]'
- name: TRANSMITTAL_SERVICE_CORS__ALLOW_CREDENTIALS
value:
_default: "true"
- name: TRANSMITTAL_SERVICE_UVICORN__HOST
value:
_default: "0.0.0.0"
- name: TRANSMITTAL_SERVICE_UVICORN__PORT
value:
_default: "8000"
- name: TRANSMITTAL_SERVICE_UVICORN__ENABLE_AUTO_RELOAD
value:
_default: "false"
- name: TRANSMITTAL_SERVICE_OTEL__ENABLE
value:
_default: "false"
- name: TRANSMITTAL_SERVICE_OTEL__HOST
value:
_default: "http://signoz-otel-collector-external.signoz.svc.cluster.local:4317"
- name: TRANSMITTAL_SERVICE_OTEL__SERVICE_NAME
value:
_default: "backend.transmittals-prod"
- name: TRANSMITTAL_SERVICE_OTEL__INSECURE
value:
_default: "false"
- name: TRANSMITTAL_SERVICE_DATABASE__SSL_MODE
value:
_default: "verify-full"
- name: TRANSMITTAL_SERVICE_DATABASE__SSL_ROOT_CERT_PATH
value:
_default: "/opt/.postgresql/root.crt"
- name: TRANSMITTAL_SERVICE_UVICORN__LOG_LEVEL
value:
_default: "info"
- name: TRANSMITTAL_SERVICE_UVICORN__NUM_WORKERS
value:
_default: "2"
- name: TRANSMITTAL_SERVICE_UVICORN__ROOT_PATH
value:
_default: ""
- name: TRANSMITTAL_SERVICE_DATABASE__ENABLE_SSL
value:
_default: "false"
- name: TRANSMITTAL_SERVICE_RABBITMQ__HOST
value:
_default: "rabbitmq.rabbitmq.svc.cluster.local"
- name: TRANSMITTAL_SERVICE_RABBITMQ__PORT
value:
_default: "5672"
- name: TRANSMITTAL_SERVICE_SAREX_BACKEND_REPOSITORY__BASE_URL
value:
_default: "http://backend.django.svc.cluster.local:8000"
- name: TRANSMITTAL_SERVICE_SAREX_BACKEND_REPOSITORY__MAX_CONNECTIONS
value:
_default: "10"
- name: TRANSMITTAL_SERVICE_SAREX_BACKEND_REPOSITORY__MAX_KEEPALIVE_CONNECTIONS
value:
_default: "5"
- name: TRANSMITTAL_SERVICE_SAREX_BACKEND_REPOSITORY__TIMEOUT
value:
_default: "15"
- name: TRANSMITTAL_SERVICE_RESOURCE_REPOSITORY__BASE_URL
value:
_default: "http://resources-service.resources.svc.cluster.local:8000"
- name: TRANSMITTAL_SERVICE_RESOURCE_REPOSITORY__MAX_CONNECTIONS
value:
_default: "10"
- name: TRANSMITTAL_SERVICE_RESOURCE_REPOSITORY__MAX_KEEPALIVE_CONNECTIONS
value:
_default: "5"
- name: TRANSMITTAL_SERVICE_RESOURCE_REPOSITORY__TIMEOUT
value:
_default: "15"
- name: TRANSMITTAL_SERVICE_DOCUMENTATIONS_REPOSITORY__BASE_URL
value:
_default: "http://backend-api-svc.documentations.svc.cluster.local:80"
- name: TRANSMITTAL_SERVICE_DOCUMENTATIONS_REPOSITORY__MAX_CONNECTIONS
value:
_default: "10"
- name: TRANSMITTAL_SERVICE_DOCUMENTATIONS_REPOSITORY__MAX_KEEPALIVE_CONNECTIONS
value:
_default: "5"
- name: TRANSMITTAL_SERVICE_DOCUMENTATIONS_REPOSITORY__TIMEOUT
value:
_default: "15"
- name: TRANSMITTAL_SERVICE_S3_CLIENT__MAX_POOL_CONNECTIONS
value:
_default: "10"
- name: TRANSMITTAL_SERVICE_S3_CLIENT__CONNECT_TIMEOUT
value:
_default: "10"
- name: TRANSMITTAL_SERVICE_S3_CLIENT__READ_TIMEOUT
value:
_default: "50"
- name: TRANSMITTAL_SERVICE_S3_CLIENT__REGION_NAME
value:
_default: "ru-central1"
- name: TRANSMITTAL_SERVICE_S3_CLIENT__VERIFY
value:
_default: "true"
- name: TRANSMITTAL_SERVICE_S3_CLIENT__ENDPOINT
value:
_default: "s3.uralmine.com"
- name: TRANSMITTAL_SERVICE_S3_CLIENT__USE_SSL
value:
_default: "true"
- name: TRANSMITTAL_SERVICE_HTML_TO_PDF_CONVERTER__BASE_URL
value:
_default: "http://export-project-service.django.svc.cluster.local:8000"
- name: TRANSMITTAL_SERVICE_HTML_TO_PDF_CONVERTER__MAX_CONNECTIONS
value:
_default: "10"
- name: TRANSMITTAL_SERVICE_HTML_TO_PDF_CONVERTER__MAX_KEEPALIVE_CONNECTIONS
value:
_default: "5"
- name: TRANSMITTAL_SERVICE_HTML_TO_PDF_CONVERTER__TIMEOUT
value:
_default: "50"
- name: TRANSMITTAL_SERVICE_MARKINGS__BASE_URL
value:
_default: "http://marks-service.documentations.svc.cluster.local:8000"
- name: TRANSMITTAL_SERVICE_MARKINGS__MAX_CONNECTIONS
value:
_default: "10"
- name: TRANSMITTAL_SERVICE_MARKINGS__MAX_KEEPALIVE_CONNECTIONS
value:
_default: "5"
- name: TRANSMITTAL_SERVICE_MARKINGS__TIMEOUT
value:
_default: "50"
- name: TRANSMITTAL_SERVICE_MAILGUN__BASE_URL
value:
_default: "https://api.mailgun.net/v3/mg.sarex.io"
- name: TRANSMITTAL_SERVICE_MAILGUN__MAX_CONNECTIONS
value:
_default: "10"
- name: TRANSMITTAL_SERVICE_MAILGUN__MAX_KEEPALIVE_CONNECTIONS
value:
_default: "5"
- name: TRANSMITTAL_SERVICE_MAILGUN__TIMEOUT
value:
_default: "15"
- name: TRANSMITTAL_SERVICE_MAILGUN__EMAIL
value:
_default: "hello@wb.io"
podAnnotations:
_default:
vault.hashicorp.com/agent-inject-secret-transmittal-s3: secrets/data/minio/apps/transmittal
vault.hashicorp.com/agent-inject-template-transmittal-s3: |-
{{- with secret "secrets/data/minio/apps/transmittal" -}}
TRANSMITTAL_SERVICE_S3_CLIENT__ACCESS_KEY={{ index .Data.data "access_key" }}
TRANSMITTAL_SERVICE_S3_CLIENT__SECRET_KEY={{ index .Data.data "secret_key" }}
TRANSMITTAL_SERVICE_S3_CLIENT__DEFAULT_BUCKET=sarex-tf-state
{{- end -}}

View File

@ -9,15 +9,6 @@ spec:
name: letsencrypt
server: https://acme-v02.api.letsencrypt.org/directory
solvers:
- selector:
dnsNames:
- zitadel.test.sarex.brusnika.tech
- grafana.test.sarex.brusnika.tech
- openobserve.test.sarex.brusnika.tech
- vmalert.test.sarex.brusnika.tech
http01:
ingress:
class: istio
- http01:
ingress:
class: nginx
class: istio

View File

@ -4,8 +4,9 @@ metadata:
name: sarex-wildcard
namespace: d8-ingress-istio
spec:
commonName: "*.uralmine.com"
commonName: "*.sarex-k8s.uralmine.com"
dnsNames:
- "*.sarex-k8s.uralmine.com"
- "*.uralmine.com"
issuerRef:
group: cert-manager.io

View File

@ -1,57 +0,0 @@
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: gitea-cert
namespace: istio-system
spec:
dnsNames:
- gitea.invest.cps.sarex.lonsdaleites.ru
issuerRef:
kind: ClusterIssuer
name: letsencrypt-prod
secretName: gitea-tls-secret
---
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: gitea-gateway
namespace: gateway
spec:
selector:
istio: ingressgateway
servers:
- hosts:
- gitea.invest.cps.sarex.lonsdaleites.ru
port:
name: http
number: 80
protocol: HTTP
- hosts:
- gitea.invest.cps.sarex.lonsdaleites.ru
port:
name: https
number: 443
protocol: HTTPS
tls:
credentialName: gitea-tls-secret
mode: SIMPLE
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: gitea-virt-service
namespace: gitea
spec:
gateways:
- gateway/gitea-gateway
hosts:
- gitea.invest.cps.sarex.lonsdaleites.ru
http:
- match:
- uri:
prefix: /
route:
- destination:
host: gitea
port:
number: 3000

View File

@ -1,14 +0,0 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../../infrastructure/vault
- ./gitea-istio.yaml
- ./vault-istio.yaml
patches:
- path: ./patches/vault.yaml
target:
group: helm.toolkit.fluxcd.io
version: v2
kind: HelmRelease
name: vault
namespace: vault

View File

@ -1,57 +0,0 @@
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: vault-cert
namespace: istio-system
spec:
dnsNames:
- vault.invest.cps.sarex.lonsdaleites.ru
issuerRef:
kind: ClusterIssuer
name: letsencrypt-prod
secretName: vault-tls
---
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: vault-gateway
namespace: gateway
spec:
selector:
istio: ingressgateway
servers:
- hosts:
- vault.invest.cps.sarex.lonsdaleites.ru
port:
name: http
number: 80
protocol: HTTP
- hosts:
- vault.invest.cps.sarex.lonsdaleites.ru
port:
name: https
number: 443
protocol: HTTPS
tls:
credentialName: vault-tls
mode: SIMPLE
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: vault-virt-service
namespace: vault
spec:
gateways:
- gateway/vault-gateway
hosts:
- vault.invest.cps.sarex.lonsdaleites.ru
http:
- match:
- uri:
prefix: /
route:
- destination:
host: vault-vault-contour.vault.svc.cluster.local
port:
number: 8200

View File

@ -3,4 +3,13 @@ kind: Kustomization
resources:
- ./flux-system
- ./helm-repositories.yaml
- ./infrastructure
# infrastructure
- ../../infrastructure/cert-manager/yc-ecp
- ../../infrastructure/istio-config/yc-ecp
- ../../infrastructure/dashboard/yc-ecp
- ../../infrastructure/vault/yc-ecp
# apps
- ../../apps/measurements/yc-ecp
- ../../apps/django/yc-ecp

View File

@ -164,15 +164,15 @@ spec:
- name: regcred
identity:
auth:
publicIssuerUrl: "https://sarex-camunda-keycloak.uralmine.com/auth/realms/camunda-platform"
publicIssuerUrl: "https://camunda-keycloak.sarex-k8s.uralmine.com/auth/realms/camunda-platform"
identity:
redirectUrl: "https://sarex-camunda-identity.uralmine.com"
redirectUrl: "https://camunda-identity.sarex-k8s.uralmine.com"
operate:
redirectUrl: "https://sarex-camunda-operate.uralmine.com"
redirectUrl: "https://camunda-operate.sarex-k8s.uralmine.com"
tasklist:
redirectUrl: "https://sarex-camunda-tasklist.uralmine.com"
redirectUrl: "https://camunda-tasklist.sarex-k8s.uralmine.com"
optimize:
redirectUrl: "https://sarex-camunda-optimize.uralmine.com"
redirectUrl: "https://camunda-optimize.sarex-k8s.uralmine.com"
webModeler:
redirectUrl: "https://camunda-web-modeler.contour.infra.sarex.tech"
console:

View File

@ -0,0 +1,12 @@
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: cert-manager
namespace: cert-manager
spec:
interval: 5m
timeout: 10m
values:
global:
imagePullSecrets:
- dockerhub

View File

@ -0,0 +1,5 @@
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-issuer
$patch: delete

View File

@ -0,0 +1,5 @@
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-issuer-istio
$patch: delete

View File

@ -0,0 +1,10 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../base
patches:
- path: cert-manager.yaml
# ClusterIssuer/letsencrypt-prod создаёт istio-config; issuer'ы из base здесь
# не нужны и вдобавок делят один privateKeySecretRef, затирая ACME-ключ друг друга
- path: clusterissuer-letsencrypt-delete.yaml
- path: clusterissuer-letsencrypt-istio-delete.yaml

View File

@ -0,0 +1,29 @@
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: dashboard
namespace: kubernetes-dashboard
spec:
# istio в yc-ecp поставлен istio-operator, HelmRelease istio-base/istiod
# в кластере нет — с зависимостями из base релиз никогда не станет Ready
dependsOn: []
interval: 5m
timeout: 10m
values:
destinationRule:
enabled: true
host: "dashboard-kong-proxy"
tlsMode: "DISABLE"
# Gateway, Certificate и VirtualService описаны в istio-config
virtualService:
enabled: false
gateway:
enabled: false
app:
image:
pullSecrets:
- dockerhub
kong:
image:
pullSecrets:
- dockerhub

View File

@ -0,0 +1,6 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../base
patches:
- path: dashboard.yaml

View File

@ -23,12 +23,14 @@ spec:
- hosts:
- sarex.uralmine.com
- sarex-login.uralmine.com
- sarex-rabbitmq.uralmine.com
- sarex-camunda-keycloak.uralmine.com
- sarex-camunda-identity.uralmine.com
- sarex-camunda-operate.uralmine.com
- sarex-camunda-tasklist.uralmine.com
- sarex-camunda-optimize.uralmine.com
- rabbitmq.sarex-k8s.uralmine.com
- camunda-keycloak.sarex-k8s.uralmine.com
- camunda-identity.sarex-k8s.uralmine.com
- camunda-operate.sarex-k8s.uralmine.com
- camunda-tasklist.sarex-k8s.uralmine.com
- camunda-optimize.sarex-k8s.uralmine.com
- sarex-stamp-verification.uralmine.com
- sarex-document-link.uralmine.com
tls:
credentialName: istio-ingress-tls
virtualServices:
@ -189,6 +191,32 @@ spec:
rewrite: /api/
service: backend-svc.issues.svc.cluster.local
port: 80
checklists-api:
name: checklists-api-virt-service
namespace: default
hosts:
- sarex.uralmine.com
gateways:
- default/platform-gateway
routes:
- path:
prefix: /checklists/api/
rewrite: /api/
service: backend-svc.checklists.svc.cluster.local
port: 80
bim-api:
name: bim-api-virt-service
namespace: default
hosts:
- sarex.uralmine.com
gateways:
- default/platform-gateway
routes:
- path:
prefix: /bimv2/api/
rewrite: /api/
service: backend-svc.bim.svc.cluster.local
port: 80
flows-api:
name: flows-api-virt-service
namespace: default
@ -215,6 +243,32 @@ spec:
rewrite: /
service: frontend-svc.issues.svc.cluster.local
port: 80
remarks-frontend:
name: remarks-frontend-virt-service
namespace: default
hosts:
- sarex.uralmine.com
gateways:
- default/platform-gateway
routes:
- path:
prefix: /remarks/static/
rewrite: /
service: frontend-service.remarks.svc.cluster.local
port: 80
resources-frontend:
name: resources-frontend-virt-service
namespace: default
hosts:
- sarex.uralmine.com
gateways:
- default/platform-gateway
routes:
- path:
prefix: /resources/static/
rewrite: /
service: resources-static-svc.pm.svc.cluster.local
port: 80
auth-frontend:
name: auth-frontend-virt-service
namespace: default
@ -380,10 +434,28 @@ spec:
rewrite: /
service: frontend-svc.control-interface.svc.cluster.local
port: 8080
s3-proxy:
# Отдача файлов из MinIO наружу. Бэкенды кладут в бакет и возвращают
# фронту ссылку вида /media/<key> — без этого маршрута она уходит
# в catch-all `/` на frontend-svc.django и отдаёт index.html.
# Префикс /media/ — тот же, что в yc-ecp и dsinv, менять нельзя:
# он зашит в ссылки, которые уже сохранены в БД.
name: s3-proxy-virt-service
namespace: default
hosts:
- sarex.uralmine.com
gateways:
- default/platform-gateway
routes:
- path:
prefix: /media/
rewrite: /
service: s3-proxy-svc.django.svc.cluster.local
port: 80
camunda-keycloak:
namespace: default
hosts:
- sarex-camunda-keycloak.uralmine.com
- camunda-keycloak.sarex-k8s.uralmine.com
gateways:
- default/platform-gateway
routes:
@ -394,7 +466,7 @@ spec:
camunda-identity:
namespace: default
hosts:
- sarex-camunda-identity.uralmine.com
- camunda-identity.sarex-k8s.uralmine.com
gateways:
- default/platform-gateway
routes:
@ -405,7 +477,7 @@ spec:
camunda-operate:
namespace: default
hosts:
- sarex-camunda-operate.uralmine.com
- camunda-operate.sarex-k8s.uralmine.com
gateways:
- default/platform-gateway
routes:
@ -416,7 +488,7 @@ spec:
camunda-tasklist:
namespace: default
hosts:
- sarex-camunda-tasklist.uralmine.com
- camunda-tasklist.sarex-k8s.uralmine.com
gateways:
- default/platform-gateway
routes:
@ -427,7 +499,7 @@ spec:
camunda-optimize:
namespace: default
hosts:
- sarex-camunda-optimize.uralmine.com
- camunda-optimize.sarex-k8s.uralmine.com
gateways:
- default/platform-gateway
routes:
@ -438,7 +510,7 @@ spec:
rabbitmq:
namespace: default
hosts:
- sarex-rabbitmq.uralmine.com
- rabbitmq.sarex-k8s.uralmine.com
gateways:
- default/platform-gateway
routes:
@ -457,3 +529,25 @@ spec:
prefix: /
service: zitadel-idp-contour.zitadel.svc.cluster.local
port: 8080
stamp-verification:
namespace: default
hosts:
- sarex-stamp-verification.uralmine.com
gateways:
- default/platform-gateway
routes:
- path:
prefix: /
service: frontend-service.stamp-verification.svc.cluster.local
port: 80
document-link:
namespace: default
hosts:
- sarex-document-link.uralmine.com
gateways:
- default/platform-gateway
routes:
- path:
prefix: /
service: frontend-service.document-link.svc.cluster.local
port: 80

View File

@ -0,0 +1,359 @@
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: istio-config
namespace: default
spec:
# istio в yc-ecp поставлен istio-operator, HelmRelease istio-base/istiod/ingressgateway
# в кластере нет — с зависимостями из base релиз никогда не станет Ready.
# cert-manager нужен: этот релиз создаёт ClusterIssuer и Certificate
dependsOn:
- name: cert-manager
namespace: cert-manager
interval: 5m
timeout: 10m
values:
global:
env: yc-ecp
environments:
yc-ecp:
namespaces: []
certManager:
# чарт рендерит ClusterIssuer как `spec: {{ toYaml $ci.spec }}`,
# поэтому спека обязана лежать под ключом spec
clusterIssuers:
letsencrypt-prod:
spec:
acme:
email: "sarex@sarex.io"
server: "https://acme-v02.api.letsencrypt.org/directory"
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: istio
# solver-под создаётся контроллером в namespace
# сертификата, values чарта cert-manager на него
# не действуют — pull-секрет задаётся здесь
podTemplate:
spec:
imagePullSecrets:
- name: dockerhub
# ключ = имя Certificate И имя секрета: версия чарта в OCI-репозитории
# поле secretName не читает, а берёт имя ключа
certificates:
gitea-tls-secret:
namespace: istio-system
dnsNames:
- gitea.invest.cps.sarex.lonsdaleites.ru
issuerRef:
name: letsencrypt-prod
kind: ClusterIssuer
vault-tls:
namespace: istio-system
dnsNames:
- vault.invest.cps.sarex.lonsdaleites.ru
issuerRef:
name: letsencrypt-prod
kind: ClusterIssuer
dashboard-tls:
namespace: istio-system
dnsNames:
- dashboard.invest.cps.sarex.lonsdaleites.ru
issuerRef:
name: letsencrypt-prod
kind: ClusterIssuer
aero-invest-tls-secret:
namespace: istio-system
dnsNames:
- aero.invest.sarex.io
issuerRef:
name: letsencrypt-prod
kind: ClusterIssuer
istio:
gateways:
gitea:
name: gitea-gateway
namespace: gateway
servers:
- hosts:
- gitea.invest.cps.sarex.lonsdaleites.ru
httpPortName: http
httpsPortName: https
tls:
credentialName: gitea-tls-secret
vault:
name: vault-gateway
namespace: gateway
servers:
- hosts:
- vault.invest.cps.sarex.lonsdaleites.ru
httpPortName: http
httpsPortName: https
tls:
credentialName: vault-tls
main:
name: main-gateway
namespace: gateway
servers:
- hosts:
- aero.invest.sarex.io
httpPortName: http
httpsPortName: https
tls:
credentialName: aero-invest-tls-secret
dashboard:
name: dashboard-gateway
namespace: gateway
servers:
- hosts:
- dashboard.invest.cps.sarex.lonsdaleites.ru
# без http-сервера порт 80 для этого хоста остаётся
# автогенерируемому ingress-шлюзу, через который
# cert-manager отдаёт HTTP-01 challenge
onlyHttps: true
httpsPortName: https
tls:
credentialName: dashboard-tls
# имя VirtualService = ключ, поле name чарт игнорирует.
# noCors: чарт иначе навешивает corsPolicy с дефолтными origins sarex.io
virtualServices:
gitea-virt-service:
namespace: gateway
noCors: true
hosts:
- gitea.invest.cps.sarex.lonsdaleites.ru
gateways:
- gateway/gitea-gateway
routes:
- path:
prefix: /
service: gitea.gitea.svc.cluster.local
port: 3000
vault-virt-service:
namespace: gateway
noCors: true
hosts:
- vault.invest.cps.sarex.lonsdaleites.ru
gateways:
- gateway/vault-gateway
routes:
- path:
prefix: /
service: vault-vault-contour.vault.svc.cluster.local
port: 8200
dashboard-virt-service:
namespace: gateway
noCors: true
hosts:
- dashboard.invest.cps.sarex.lonsdaleites.ru
gateways:
- gateway/dashboard-gateway
routes:
- path:
prefix: /
service: dashboard-kong-proxy.kubernetes-dashboard.svc.cluster.local
port: 80
# --- aero.invest.sarex.io / main-gateway ---
backend-service-virt-service:
namespace: gateway
hosts:
- aero.invest.sarex.io
gateways:
- gateway/main-gateway
cors:
allowHeaders:
- Authorization
- Content-Type
allowMethods:
- GET
- POST
- PUT
- PATCH
- HEAD
- DELETE
routes:
- path:
prefix: /admin/
service: backend-service.django.svc.cluster.local
port: 8000
- path:
prefix: /api
service: backend-service.django.svc.cluster.local
port: 8000
s3-proxy-virt-service:
namespace: gateway
hosts:
- aero.invest.sarex.io
gateways:
- gateway/main-gateway
cors:
allowHeaders:
- Authorization
- Content-Type
allowMethods:
- GET
- POST
- PUT
- PATCH
- HEAD
- DELETE
routes:
- path:
prefix: /s3/
rewrite: /
service: s3-bim-service.django.svc.cluster.local
port: 80
- path:
prefix: /media/
rewrite: /
service: s3-service.django.svc.cluster.local
port: 80
frontend-vs:
namespace: gateway
noCors: true
hosts:
- aero.invest.sarex.io
gateways:
- gateway/main-gateway
routes:
# без path — маршрут без match, catch-all, как в кластере;
# он должен оставаться последним по порядку сопоставления
- service: frontend-service.django.svc.cluster.local
port: 80
bim-api-gazpromcps-api-virt-service:
namespace: gateway
hosts:
- aero.invest.sarex.io
gateways:
- gateway/main-gateway
cors:
allowHeaders:
- Authorization
- Content-Type
allowMethods:
- GET
- POST
- PUT
- PATCH
- HEAD
- DELETE
routes:
- path:
prefix: /bim-gazpromcps/api/
rewrite: /api/
service: bim-api-gazpromcps-service.bim.svc.cluster.local
port: 80
- path:
prefix: /bim-gazpromcps/files/
rewrite: /files/
service: bim-api-gazpromcps-service.bim.svc.cluster.local
port: 80
bim-backend-v2-api-virt-service:
namespace: gateway
hosts:
- aero.invest.sarex.io
gateways:
- gateway/main-gateway
cors:
allowHeaders:
- Authorization
- Content-Type
allowMethods:
- GET
- POST
- PUT
- PATCH
- HEAD
- DELETE
routes:
- path:
prefix: /bim2-gazpromcps/api/
rewrite: /api/
service: bim-backend-v2-service.bim.svc.cluster.local
port: 80
eav-virt-service:
namespace: gateway
hosts:
- aero.invest.sarex.io
gateways:
- gateway/main-gateway
cors:
allowHeaders:
- Authorization
- Content-Type
allowMethods:
- POST
- GET
- PATCH
- DELETE
- HEAD
- PUT
- OPTIONS
routes:
- path:
prefix: /eav/api/
rewrite: /api/
service: eav-service.eav.svc.cluster.local
port: 8000
noCors: true
- path:
prefix: /eav/admin/
rewrite: /eav/admin/
service: eav-service.eav.svc.cluster.local
port: 8000
api-virt-service:
namespace: gateway
hosts:
- aero.invest.sarex.io
gateways:
- gateway/main-gateway
cors:
allowHeaders:
- Authorization
- Content-Type
allowMethods:
- GET
- POST
- PUT
- PATCH
- HEAD
- DELETE
routes:
- path:
prefix: /workflows/api/
rewrite: /api/
service: workflows-backend-service.processing.svc.cluster.local
port: 80
projects-frontend-static-virt-service:
namespace: gateway
hosts:
- aero.invest.sarex.io
gateways:
- gateway/main-gateway
cors:
allowHeaders:
- Authorization
- Content-Type
allowMethods:
- GET
- POST
- PUT
- PATCH
- HEAD
- DELETE
routes:
- path:
prefix: /projects/static/
rewrite: /
service: projects-frontend-static-service.projects.svc.cluster.local
port: 80

View File

@ -0,0 +1,6 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../base
patches:
- path: istio-config.yaml

View File

@ -0,0 +1,6 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../base
patches:
- path: vault.yaml