Remove UGMK technology layer scripts, JSON matrix, and Archimate model from the repository

This commit is contained in:
emelinda 2026-08-20 13:09:47 +03:00
parent dab050c6ed
commit 4b15a60589
9 changed files with 1017 additions and 1023 deletions

View File

@ -1,47 +1,55 @@
# Модель архитектуры в нотации ArchiMate
Модель контура **УГМК** (`d8-ugmk-prod`) в двух форматах — содержимое одинаковое:
Модель технологического слоя типового контура платформы. **Все данные, зависящие от конкретной инсталляции — имя кластера, узлы, домены, реестр — заменены на примеры.** Реальные значения в репозиторий не попадают: они задаются профилем контура, который держится отдельно.
Прикладной слой присутствует только как потребители технологических сервисов. Межсервисные REST-связи приложений и бизнес-слой будут добавлены отдельно.
## Файлы
| Файл | Формат | Чем открывать |
|---|---|---|
| `ugmk-technology.archimate` | нативный формат [Archi](https://www.archimatetool.com/) | десктопный Archi: File → Open |
| `ugmk-technology.xml` | The Open Group ArchiMate Model Exchange File Format 3.1 | любой инструмент с импортом Open Exchange, в том числе archi-online.com: кнопка **Import, save, and create models** → Open Exchange |
| `example-technology.archimate` | нативный формат [Archi](https://www.archimatetool.com/) | десктопный Archi: File → Open |
| `example-technology.xml` | The Open Group ArchiMate Model Exchange File Format 3.1 | любой инструмент с импортом Open Exchange, в том числе archi-online.com: **Import, save, and create models** → Open Exchange |
| `preview.html` | SVG-рендер всех представлений | любой браузер, без установки чего-либо |
`ugmk-technology.xml` проверен на соответствие официальной схеме `archimate3_Diagram.xsd` — валидатор ошибок не нашёл. Если сторонний инструмент не берёт нативный `.archimate`, используйте его.
Отличие обменной версии: вложенность узлов на схемах развёрнута в плоский список с абсолютными координатами (в обменном формате трактовка координат вложенного узла неоднозначна между реализациями). Визуально раскладка та же, но компоненты внутри кластера не будут «вложены» в него как дочерние — при перетаскивании контейнера содержимое останется на месте.
Сейчас в модели проработан **технологический слой**. Прикладной слой присутствует только как потребители технологических сервисов — межсервисные REST-связи приложений и бизнес-слой будут добавлены отдельно.
## Состав
70 элементов, 153 отношения, 9 представлений.
| Представление | Что показывает |
|---|---|
| T1 | Кластер, ПО внутри него, внешние узлы, технологические сервисы. Без приложений — обзорная схема |
| T2 | Маршрутизация HTTPS — 21 приложение |
| T3 | Аутентификация OIDC — 10 |
| T4 | Управление секретами — 25 |
| T5 | Реляционное хранилище — 23 |
| T6 | Кэш — 3 |
| T7 | Событийная шина — 12 |
| T8 | Очередь сообщений AMQP — 11 |
| T9 | Объектное хранилище — 13 |
| T2T9 | По одному представлению на технологический сервис: кто им пользуется |
Разбиение на представления по сервисам сделано осознанно: все 118 связей «сервис → приложение» на одной схеме нечитаемы. В модели они лежат одним набором, представления — это срезы.
Разбиение по сервисам сделано осознанно: все 118 связей «сервис → приложение» на одной схеме нечитаемы. В модели они лежат одним набором, представления — это срезы.
Метамодель намеренно урезана. Технологический слой: `Node`, `SystemSoftware`, `TechnologyService`, `Artifact`. Прикладной: `ApplicationComponent`. Отношения: `Composition`, `Realization`, `Serving`, `Assignment`. Не используются `Device`, `Path`, `CommunicationNetwork`, `TechnologyFunction` — в этом контуре они не несут информации.
Метамодель намеренно урезана. Технологический слой: `Node`, `SystemSoftware`, `TechnologyService`, `Artifact`. Прикладной: `ApplicationComponent`. Отношения: `Composition`, `Realization`, `Serving`, `Assignment`. Не используются `Device`, `Path`, `CommunicationNetwork`, `TechnologyFunction` — они не несут информации на этом уровне.
## Как собрать модель для реального контура
1. Снять матрицу связей с нужного кластера:
```
py scan_contour.py <имя-кластера> matrix.json
```
2. Скопировать `contour-profile.example.json`, подставить настоящие имена кластера, узлов, доменов и реестра. **Копию хранить вне репозитория.**
3. Собрать модель и производные форматы:
```
py build_archimate.py <профиль.json> matrix.json out.archimate
py to_open_exchange.py out.archimate out.xml
py render_preview.py out.archimate out.html
```
Результат шага 3 в репозиторий не коммитить — он содержит данные контура.
## Откуда взяты связи
Не нарисованы от руки. Выведены из манифестов, поэтому проверяемы:
Не нарисованы от руки, а выведены из манифестов, поэтому проверяемы.
| Связь | Источник |
|---|---|
| Состав кластера | `clusters/d8-ugmk-prod/kustomization.yaml` |
| Версии чартов | `infrastructure/<comp>/base/helmrelease.yaml` |
| Состав кластера, версии чартов | `clusters/<контур>/kustomization.yaml`, `infrastructure/<comp>/base/helmrelease.yaml` |
| Приложение → PostgreSQL | env `POSTGRES_*`, `DB__HOST` или путь Vault `secrets/data/apps/<app>/postgres` |
| Приложение → RabbitMQ | env `RABBITMQ*`, `AMQP__*` |
| Приложение → Kafka | env `KAFKA*`, `BOOTSTRAP_SERVERS` |
@ -49,46 +57,29 @@
| Приложение → Redis | env `REDIS_HOST`, `REDIS__*` |
| Приложение → Vault | аннотации `vault.hashicorp.com/agent-inject*` |
| Приложение → Zitadel | env `ZITADEL*`, `JWKS`, `OIDC`, секрет `jwt-public` |
| Приложение → Istio | `service:` в маршрутах `infrastructure/istio-config/d8-ugmk-prod/istio-config.yaml` (закомментированные не считаются) |
| Приложение → Istio | `service:` в маршрутах `infrastructure/istio-config/<контур>/istio-config.yaml` (закомментированные не считаются) |
Сканируются `*.yaml` в `apps/<app>/base/` и `apps/<app>/d8-ugmk-prod/`; документация (`*.md`) игнорируется, иначе прозаические упоминания переменных дают ложные срабатывания.
Сканируются `*.yaml` в `apps/<app>/base/` и `apps/<app>/<контур>/`; документация `*.md` игнорируется, иначе прозаические упоминания переменных дают ложные срабатывания.
## Что вскрылось при построении
`matrix.example.json` — снимок такой матрицы. Он содержит только имена приложений и флаги использования сервисов; идентификаторов контура в нём нет.
- **Camunda развёрнута, но потребителей нет.** `camunda-contour` 11.0.14 в контуре есть, наружу опубликованы Operate, Tasklist, Optimize, Identity, Keycloak — но ни одно приложение не сконфигурировано на Zeebe. Единственные ссылки на Camunda в `apps/` — оверлеи `cde/brusnika-prod` и `cde/brusnika-stage`.
- **Четыре приложения ни к чему не подключены**: `projects`, `prescriptions`, `cross-section`, `faas` — не используют ни один технологический сервис и не имеют маршрута в `istio-config`. В модели они есть, но ни в одно представление не попали. Для сравнения: в `yc-ecp` маршрут `/projects/static/` существует.
- **Наблюдаемости в контуре нет** — ни vmstack, ни prometheus-stack, ни openobserve, ни otel, в отличие от Brusnika и WB. Если мониторинг там есть, он живёт вне этого репозитория.
- **Сертификаты самоподписанные**`ClusterIssuer sarex-selfsigned`, не Let's Encrypt.
- **Redis только у `pm`.** В остальных приложениях `REDIS_HOST` встречается лишь в текстах `CONFIGURATION.md`.
- **Ingress прибит к одному узлу** `um-sarex-k8s-frontend-01` через `nodeSelector` — единственная точка отказа внешнего трафика.
- **S3 внешний** (`s3.uralmine.com`), MinIO в контуре не разворачивается.
## Про формат файлов
Нативный `.archimate` нигде не стандартизирован, и его словарь неочевиден: объекты схем сериализуются как `<child xsi:type="archimate:DiagramObject">`, соединения — через атрибут `relationship`. Имена EClass из метамодели (`DiagramModelArchimateObject`, `archimateRelationship`) в XML **не используются** — на них легко попасться, модель тогда открывается с пустыми представлениями.
Эталон для сверки — любая модель из [archimatetool/ArchiModels](https://github.com/archimatetool/ArchiModels), созданная самим Archi.
`example-technology.xml` проверен на соответствие официальной схеме `archimate3_Diagram.xsd`. Если сторонний инструмент не берёт нативный формат, используйте его. Отличие обменной версии: вложенность узлов развёрнута в плоский список с абсолютными координатами (в обменном формате трактовка координат вложенного узла неоднозначна между реализациями). Визуально раскладка та же, но компоненты внутри кластера не будут его дочерними элементами.
## Скрипты
`scan_ugmk.py` — строит матрицу «приложение → технологический сервис» и кладёт в `matrix.json`. Полезен, когда состав контура изменился: перезапустить и сравнить.
Требуется Python 3, внешних зависимостей нет. На Windows запускать через `py`, а не `python`.
```
py scan_ugmk.py matrix.json
```
| Скрипт | Назначение |
|---|---|
| `scan_contour.py` | матрица «приложение → технологический сервис» по кластеру |
| `build_archimate.py` | сборка модели из профиля и матрицы |
| `to_open_exchange.py` | конвертация в обменный формат |
| `render_preview.py` | рендер представлений в HTML со встроенным SVG |
`build_archimate.py` — одноразовая генерация модели из `matrix.json`.
```
py build_archimate.py ugmk-technology.archimate
```
`to_open_exchange.py` — конвертирует нативный файл в обменный формат. Запускать после каждой правки модели, иначе `.xml` разъедется с `.archimate`.
```
py to_open_exchange.py ugmk-technology.archimate ugmk-technology.xml
```
`render_preview.py` — рисует все представления в один HTML со встроенным SVG. Пересобирать вместе с обменным форматом.
```
py render_preview.py ugmk-technology.archimate preview.html
```
**Внимание:** после того как модель отредактирована в Archi, источником истины становится `.archimate`, а повторный запуск генератора затрёт расстановку элементов. Пересобирать целиком имеет смысл только при перестройке модели с нуля.
Требуется Python 3, внешних зависимостей нет. На этой машине запускать через `py`, а не `python`.
**Внимание:** после ручной правки модели в Archi источником истины становится `.archimate`, а повторный запуск `build_archimate.py` затрёт расстановку элементов. Производные форматы (`to_open_exchange.py`, `render_preview.py`) пересобирать после каждой правки, иначе они разъедутся с моделью.

View File

@ -1,126 +1,100 @@
"""Собирает .archimate (формат Archi 5) для технологического слоя контура УГМК."""
"""Собирает .archimate (нативный формат Archi) из профиля контура и матрицы связей.
py build_archimate.py <профиль.json> <матрица.json> <выход.archimate>
Все имена, зависящие от конкретной инсталляции (кластер, узлы, домены, реестр),
приходят из профиля в самом скрипте их нет. См. contour-profile.example.json.
"""
import json, pathlib, sys, io
from xml.sax.saxutils import escape, quoteattr
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8")
HERE = pathlib.Path(__file__).parent
DATA = json.loads((HERE / "matrix.json").read_text(encoding="utf-8"))
OUT = pathlib.Path(sys.argv[1])
if len(sys.argv) != 4:
sys.exit(__doc__)
PROFILE = json.loads(pathlib.Path(sys.argv[1]).read_text(encoding="utf-8"))
DATA = json.loads(pathlib.Path(sys.argv[2]).read_text(encoding="utf-8"))
OUT = pathlib.Path(sys.argv[3])
elements = [] # (folder, id, type, name, doc)
relations = [] # (id, type, src, tgt)
_rc = [0]
elements, relations, _rc = [], [], [0]
REL_INDEX = {}
def el(folder, eid, etype, name, doc=""):
elements.append((folder, eid, etype, name, doc)); return eid
def rel(rtype, src, tgt):
def R(rtype, src, tgt):
_rc[0] += 1
rid = f"rel-{_rc[0]:03d}"
relations.append((rid, rtype, src, tgt)); return rid
REL_INDEX = {}
def R(rtype, src, tgt):
REL_INDEX[(rtype, src, tgt)] = rel(rtype, src, tgt); return REL_INDEX[(rtype, src, tgt)]
relations.append((rid, rtype, src, tgt))
REL_INDEX[(rtype, src, tgt)] = rid
return rid
# ---------------------------------------------------------------- технологический слой
T = "technology"
nd_cluster = el(T, "nd-cluster", "Node", "Кластер d8-ugmk-prod (Deckhouse)",
"clusters/d8-ugmk-prod/kustomization.yaml. GitOps через FluxCD v2.")
nd_front = el(T, "nd-frontend", "Node", "um-sarex-k8s-frontend-01",
"Выделенный frontend-узел. К нему прибит ingress-gateway через nodeSelector: "
"clusters/d8-ugmk-prod/istio-ingress/ingress-controller.yaml")
nd_s3 = el(T, "nd-s3", "Node", "s3.uralmine.com — объектное хранилище УГМК",
"Внешнее по отношению к кластеру. MinIO в контуре не разворачивается.")
nd_nfs = el(T, "nd-nfs", "Node", "NFS-хранилище (StorageClass nfs01)",
"Единственный storageClass в контуре, 9 упоминаний в манифестах.")
nd_gitea = el(T, "nd-gitea", "Node", "Gitea 10.222.255.165:3000 (infra/iac)",
"Источник для Flux: clusters/d8-ugmk-prod/flux-system/gotk-sync.yaml")
nd_cr = el(T, "nd-cr", "Node", "cr.yandex/crp3ccidau046kdj8g9q",
"Реестр чартов (OCI) и образов контейнеров.")
nd_cluster = el(T, "nd-cluster", "Node", PROFILE["cluster"]["name"], PROFILE["cluster"].get("doc", ""))
SS = [
("ss-istio-gw", "Istio Ingress Gateway", "Deckhouse IngressIstioController «sarex», inlet NodePort 30080/30443. clusters/d8-ugmk-prod/istio-ingress/ingress-controller.yaml"),
("ss-istio-mesh", "Istio Service Mesh", "chart istio-config-contour 0.1.0. Gateway, VirtualService, RequestAuthentication."),
("ss-certmanager", "cert-manager", "ClusterIssuer sarex-selfsigned — сертификаты самоподписанные, не Let's Encrypt. Wildcard *.uralmine.com и *.sarex-k8s.uralmine.com."),
("ss-zitadel", "Zitadel", "chart idp-contour 4.12.13, ns zitadel."),
("ss-vault", "Vault + Agent Injector", "chart vault-contour 0.2.3, ns vault. Единственный механизм доставки секретов, путь secrets/data/apps/<app>/postgres."),
("ss-postgres", "PostgreSQL", "chart postgresql-contour 17.0.7, ns postgresql. PVC 20Gi на nfs01."),
("ss-redis", "Redis", "Разворачивается только в ns pm: apps/pm/d8-ugmk-prod/redis.yaml."),
("ss-kafka", "Kafka", "chart kafka-contour 0.1.15, ns kafka."),
("ss-rabbit", "RabbitMQ", "chart rabbitmq-contour 15.2.4, ns rabbitmq. Публикуется наружу на rabbitmq.sarex-k8s.uralmine.com."),
("ss-camunda", "Camunda Platform", "chart camunda-contour 11.0.14, ns camunda. ВНИМАНИЕ: ни одно приложение контура на неё не сконфигурировано — потребителей нет."),
]
for sid, name, doc in SS:
el(T, sid, "SystemSoftware", name, doc); R("Composition", nd_cluster, sid)
for s in PROFILE["software"]:
el(T, s["id"], "SystemSoftware", s["name"], s.get("doc", ""))
R("Composition", nd_cluster, s["id"])
CAMUNDA_SUB = ["Zeebe", "Zeebe Gateway", "Operate", "Tasklist", "Optimize", "Identity", "Connectors"]
cam_ids = []
for n in CAMUNDA_SUB:
for n in PROFILE.get("camunda_sub", []):
cid = "ss-cam-" + n.lower().replace(" ", "-")
el(T, cid, "SystemSoftware", n, "infrastructure/camunda/d8-ugmk-prod/camunda.yaml")
el(T, cid, "SystemSoftware", n)
R("Composition", "ss-camunda", cid); cam_ids.append(cid)
ar_charts = el(T, "ar-charts", "Artifact", "Helm-чарты *-contour (OCI)")
ar_images = el(T, "ar-images", "Artifact", "Образы контейнеров")
R("Composition", nd_cr, ar_charts); R("Composition", nd_cr, ar_images)
for x in PROFILE["external"]:
el(T, x["id"], "Node", x["name"], x.get("doc", ""))
for a in x.get("artifacts", []):
el(T, a["id"], "Artifact", a["name"])
R("Composition", x["id"], a["id"])
if x.get("serves") == "cluster":
R("Serving", x["id"], nd_cluster)
elif x.get("serves"):
R("Serving", x["id"], x["serves"])
# технологические сервисы: id -> (имя, кто реализует, ключ в матрице)
TS = [
("ts-ingress", "Маршрутизация HTTPS-трафика", ["ss-istio-gw", "ss-istio-mesh"], "istio"),
("ts-tls", "Выпуск TLS-сертификатов", ["ss-certmanager"], None),
("ts-oidc", "Аутентификация OIDC", ["ss-zitadel"], "oidc"),
("ts-secrets", "Управление секретами", ["ss-vault"], "vault"),
("ts-rdbms", "Реляционное хранилище", ["ss-postgres"], "postgres"),
("ts-cache", "Кэш", ["ss-redis"], "redis"),
("ts-events", "Событийная шина", ["ss-kafka"], "kafka"),
("ts-amqp", "Очередь сообщений AMQP", ["ss-rabbit"], "rabbitmq"),
("ts-bpmn", "Оркестрация процессов BPMN", ["ss-camunda"], "camunda"),
("ts-object", "Объектное хранилище", ["nd-s3"], "s3"),
]
for tid, name, realizers, _ in TS:
el(T, tid, "TechnologyService", name)
for r in realizers:
R("Realization", r, tid)
fn = PROFILE["frontend_node"]
el(T, fn["id"], "Node", fn["name"], fn.get("doc", ""))
R("Assignment", fn["id"], fn["assigned_to"])
R("Assignment", nd_front, "ss-istio-gw")
R("Serving", "ts-tls", "ss-istio-gw")
R("Serving", nd_nfs, "ss-postgres")
R("Serving", nd_gitea, nd_cluster)
R("Serving", nd_cr, nd_cluster)
for ts in PROFILE["services"]:
el(T, ts["id"], "TechnologyService", ts["name"])
for r in ts["realizers"]:
R("Realization", r, ts["id"])
if ts.get("serves_software"):
R("Serving", ts["id"], ts["serves_software"])
# ---------------------------------------------------------------- прикладной слой
app_id = {a: "ac-" + a for a in DATA["apps"]}
for a in DATA["apps"]:
el("application", app_id[a], "ApplicationComponent", a, f"apps/{a}/d8-ugmk-prod/")
el("application", app_id[a], "ApplicationComponent", a, f"apps/{a}/<contour>/")
consumers = {}
for tid, _, _, key in TS:
if key is None:
consumers[tid] = []; continue
for ts in PROFILE["services"]:
key = ts.get("key")
if not key:
consumers[ts["id"]] = []; continue
if key == "istio":
lst = [a for a in DATA["apps"] if a in DATA["exposed"]]
else:
lst = [a for a in DATA["apps"] if DATA["matrix"][a][key]]
consumers[tid] = lst
lst = [a for a in DATA["apps"] if DATA["matrix"][a].get(key)]
consumers[ts["id"]] = lst
for a in lst:
R("Serving", tid, app_id[a])
R("Serving", ts["id"], app_id[a])
# ---------------------------------------------------------------- представления
views = []
views, _oc = [], [0]
def view(name, doc=""):
v = {"id": f"view-{len(views)+1}", "name": name, "doc": doc, "objects": [], "conns": []}
v = {"id": f"view-{len(views)+1}", "name": name, "doc": doc, "objects": []}
views.append(v); return v
_oc = [0]
def obj(v, eid, x, y, w, h, parent=None):
_oc[0] += 1
o = {"id": f"do-{_oc[0]:04d}", "el": eid, "b": (x, y, w, h), "children": [], "src": [], "tgt": []}
(parent["children"] if parent else v["objects"]).append(o)
return o
def conn(v, rtype, so, to):
def conn(rtype, so, to):
key = (rtype, so["el"], to["el"])
if key not in REL_INDEX:
raise KeyError(f"нет отношения в модели: {key}")
@ -129,61 +103,59 @@ def conn(v, rtype, so, to):
so["src"].append({"id": cid, "rel": REL_INDEX[key], "tgt": to["id"]})
to["tgt"].append(cid)
# --- T1: инфраструктура без приложений
v1 = view("T1. Технологический слой — контур УГМК",
"Что развёрнуто в кластере d8-ugmk-prod и какие технологические сервисы это даёт. "
"Приложения-потребители вынесены в отдельные представления T2T9.")
o_ts = {}
for i, (tid, _, _, _) in enumerate(TS):
o_ts[tid] = obj(v1, tid, 20 + i * 165, 30, 150, 60)
SERVICES = PROFILE["services"]
SW = {s["id"]: s for s in PROFILE["software"]}
v1 = view("T1. Технологический слой",
"Что развёрнуто в кластере и какие технологические сервисы это даёт. "
"Приложения-потребители вынесены в отдельные представления T2 и далее.")
o_ts = {ts["id"]: obj(v1, ts["id"], 20 + i * 165, 30, 150, 60) for i, ts in enumerate(SERVICES)}
o_cluster = obj(v1, nd_cluster, 20, 140, 1270, 400)
o_ss = {}
row1 = ["ss-istio-gw", "ss-istio-mesh", "ss-certmanager", "ss-zitadel", "ss-vault"]
for i, sid in enumerate(row1):
o_ss, ids = {}, [s["id"] for s in PROFILE["software"]]
for i, sid in enumerate(ids[:5]):
o_ss[sid] = obj(v1, sid, 20 + i * 240, 45, 220, 70, o_cluster)
row2 = ["ss-postgres", "ss-redis", "ss-kafka", "ss-rabbit"]
for i, sid in enumerate(row2):
for i, sid in enumerate(ids[5:9]):
o_ss[sid] = obj(v1, sid, 20 + i * 240, 145, 220, 70, o_cluster)
o_ss["ss-camunda"] = obj(v1, "ss-camunda", 20, 245, 1230, 130, o_cluster)
for i, cid in enumerate(cam_ids):
obj(v1, cid, 10 + i * 174, 50, 162, 60, o_ss["ss-camunda"])
if len(ids) > 9:
o_ss[ids[9]] = obj(v1, ids[9], 20, 245, 1230, 130, o_cluster)
for i, cid in enumerate(cam_ids):
obj(v1, cid, 10 + i * 174, 50, 162, 60, o_ss[ids[9]])
o_s3 = obj(v1, nd_s3, 1320, 140, 330, 70)
o_nfs = obj(v1, nd_nfs, 1320, 230, 330, 70)
o_gitea = obj(v1, nd_gitea, 1320, 320, 330, 70)
o_cr = obj(v1, nd_cr, 1320, 410, 330, 130)
obj(v1, ar_charts, 15, 50, 145, 60, o_cr)
obj(v1, ar_images, 170, 50, 145, 60, o_cr)
o_front = obj(v1, nd_front, 20, 570, 300, 60)
o_ext = {}
for i, x in enumerate(PROFILE["external"]):
h = 130 if x.get("artifacts") else 70
o_ext[x["id"]] = obj(v1, x["id"], 1320, 140 + i * 90, 330, h)
for j, a in enumerate(x.get("artifacts", [])):
obj(v1, a["id"], 15 + j * 155, 50, 145, 60, o_ext[x["id"]])
o_front = obj(v1, fn["id"], 20, 570, 300, 60)
for tid, _, realizers, _ in TS:
for r in realizers:
conn(v1, "Realization", o_ss.get(r) or o_s3, o_ts[tid])
conn(v1, "Assignment", o_front, o_ss["ss-istio-gw"])
conn(v1, "Serving", o_ts["ts-tls"], o_ss["ss-istio-gw"])
conn(v1, "Serving", o_nfs, o_ss["ss-postgres"])
conn(v1, "Serving", o_gitea, o_cluster)
conn(v1, "Serving", o_cr, o_cluster)
for ts in SERVICES:
for r in ts["realizers"]:
conn("Realization", o_ss.get(r) or o_ext[r], o_ts[ts["id"]])
if ts.get("serves_software"):
conn("Serving", o_ts[ts["id"]], o_ss[ts["serves_software"]])
conn("Assignment", o_front, o_ss[fn["assigned_to"]])
for x in PROFILE["external"]:
if x.get("serves") == "cluster":
conn("Serving", o_ext[x["id"]], o_cluster)
elif x.get("serves"):
conn("Serving", o_ext[x["id"]], o_ss[x["serves"]])
# --- T2..T9: потребители каждого сервиса
PER_ROW = 6
for tid, tname, realizers, key in TS:
lst = consumers[tid]
for ts in SERVICES:
lst = consumers[ts["id"]]
if not lst:
continue
v = view(f"T{len(views)+1}. Потребители: {tname}",
f"{len(lst)} из {len(DATA['apps'])} приложений контура. Связи выведены из манифестов "
f"apps/*/base и apps/*/d8-ugmk-prod.")
ots = obj(v, tid, 20, 20, 260, 60)
oss = [obj(v, r, 320 + i * 280, 20, 260, 60) for i, r in enumerate(realizers)]
for o in oss:
conn(v, "Realization", o, ots)
oapps = []
v = view(f"T{len(views)+1}. Потребители: {ts['name']}",
f"{len(lst)} из {len(DATA['apps'])} приложений контура. "
f"Связи выведены из манифестов приложений.")
ots = obj(v, ts["id"], 20, 20, 260, 60)
for i, r in enumerate(ts["realizers"]):
conn("Realization", obj(v, r, 320 + i * 280, 20, 260, 60), ots)
for i, a in enumerate(lst):
oapps.append(obj(v, app_id[a], 20 + (i % PER_ROW) * 190, 150 + (i // PER_ROW) * 80, 170, 55))
for oa in oapps:
conn(v, "Serving", ots, oa)
conn("Serving", ots,
obj(v, app_id[a], 20 + (i % PER_ROW) * 190, 150 + (i // PER_ROW) * 80, 170, 55))
# ---------------------------------------------------------------- сериализация
FOLDERS = [("Strategy", "strategy"), ("Business", "business"), ("Application", "application"),
@ -192,12 +164,12 @@ FOLDERS = [("Strategy", "strategy"), ("Business", "business"), ("Application", "
("Relations", "relations"), ("Views", "diagrams")]
def emit_obj(o, ind):
# Имена тегов — как их пишет сам Archi: <child xsi:type="archimate:DiagramObject">,
# соединение через атрибут relationship. Имена EClass из метамодели
# (DiagramModelArchimateObject) в XML не используются.
p = " " * ind
tgt = f' targetConnections={quoteattr(" ".join(o["tgt"]))}' if o["tgt"] else ""
x, y, w, h = o["b"]
# Порядок и имена — как их пишет сам Archi: <child>, затем bounds,
# sourceConnection, вложенные <child>. Имена EClass в метамодели
# (DiagramModelArchimateObject) в XML не используются.
s = f'{p}<child xsi:type="archimate:DiagramObject" id="{o["id"]}" archimateElement="{o["el"]}"{tgt}>\n'
s += f'{p} <bounds x="{x}" y="{y}" width="{w}" height="{h}"/>\n'
for c in o["src"]:
@ -205,16 +177,13 @@ def emit_obj(o, ind):
f'source="{o["id"]}" target="{c["tgt"]}" relationship="{c["rel"]}"/>\n')
for c in o["children"]:
s += emit_obj(c, ind + 2)
s += f'{p}</child>\n'
return s
return s + f'{p}</child>\n'
out = ['<?xml version="1.0" encoding="UTF-8"?>',
'<archimate:model xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" '
'xmlns:archimate="http://www.archimatetool.com/archimate" '
'name="СДЕ Sarex — контур УГМК" id="model-ugmk" version="5.0.0">',
' <purpose>Технологический слой контура d8-ugmk-prod, выведенный из репозитория infra/iac. '
'Прикладной слой присутствует только как потребители технологических сервисов — '
'межсервисные связи приложений моделируются отдельно.</purpose>']
f'name={quoteattr(PROFILE["model"]["name"])} id="model-contour" version="5.0.0">',
f' <purpose>{escape(PROFILE["model"]["purpose"])}</purpose>']
for fname, ftype in FOLDERS:
inner = ""
@ -224,8 +193,7 @@ for fname, ftype in FOLDERS:
continue
if doc:
inner += (f' <element xsi:type="archimate:{etype}" name={quoteattr(name)} id="{eid}">\n'
f' <documentation>{escape(doc)}</documentation>\n'
f' </element>\n')
f' <documentation>{escape(doc)}</documentation>\n </element>\n')
else:
inner += f' <element xsi:type="archimate:{etype}" name={quoteattr(name)} id="{eid}"/>\n'
elif ftype == "relations":
@ -240,16 +208,13 @@ for fname, ftype in FOLDERS:
for o in v["objects"]:
inner += emit_obj(o, 6)
inner += ' </element>\n'
if inner:
out.append(f' <folder name={quoteattr(fname)} id="folder-{ftype}" type="{ftype}">\n{inner} </folder>')
else:
out.append(f' <folder name={quoteattr(fname)} id="folder-{ftype}" type="{ftype}"/>')
out.append(f' <folder name={quoteattr(fname)} id="folder-{ftype}" type="{ftype}">\n{inner} </folder>'
if inner else f' <folder name={quoteattr(fname)} id="folder-{ftype}" type="{ftype}"/>')
out.append('</archimate:model>')
OUT.write_text("\n".join(out) + "\n", encoding="utf-8")
OUT.write_text("\n".join(out) + "\n", encoding="utf-8", newline="\n")
print(f"записано: {OUT}")
print(f"элементов: {len(elements)} отношений: {len(relations)} представлений: {len(views)}")
for v in views:
n_obj = sum(1 + len(o["children"]) + sum(len(c["children"]) for c in o["children"]) for o in v["objects"])
print(f" {v['name']} ({n_obj} объектов)")
print(f" {v['name']}")

View File

@ -0,0 +1,59 @@
{
"_комментарий": "Профиль контура: всё, что зависит от конкретной инсталляции. Значения здесь — ПРИМЕР. Для реального контура скопируйте файл, подставьте настоящие имена и держите копию вне репозитория.",
"model": {
"name": "СДЕ Sarex — типовой контур (пример)",
"purpose": "Технологический слой типового контура. Имена кластера, узлов, доменов и реестра заменены на примеры. Прикладной слой присутствует только как потребители технологических сервисов — межсервисные связи приложений моделируются отдельно."
},
"cluster": {
"name": "Кластер k8s-prod",
"doc": "clusters/<contour>/kustomization.yaml. Развёртывание через FluxCD v2 (GitOps)."
},
"software": [
{ "id": "ss-istio-gw", "name": "Istio Ingress Gateway", "doc": "Ingress-контроллер, публикует контур наружу через NodePort." },
{ "id": "ss-istio-mesh", "name": "Istio Service Mesh", "doc": "chart istio-config-contour. Gateway, VirtualService, RequestAuthentication." },
{ "id": "ss-certmanager", "name": "cert-manager", "doc": "Выпуск сертификатов. В примере — самоподписанный ClusterIssuer, wildcard на домен контура." },
{ "id": "ss-zitadel", "name": "Zitadel", "doc": "chart idp-contour, ns zitadel. Основной поставщик идентичности." },
{ "id": "ss-vault", "name": "Vault + Agent Injector", "doc": "chart vault-contour, ns vault. Единственный механизм доставки секретов, путь secrets/data/apps/<app>/postgres." },
{ "id": "ss-postgres", "name": "PostgreSQL", "doc": "chart postgresql-contour, ns postgresql. PVC на сетевом хранилище." },
{ "id": "ss-redis", "name": "Redis", "doc": "Разворачивается не во всех контурах и не для всех приложений." },
{ "id": "ss-kafka", "name": "Kafka", "doc": "chart kafka-contour, ns kafka." },
{ "id": "ss-rabbit", "name": "RabbitMQ", "doc": "chart rabbitmq-contour, ns rabbitmq." },
{ "id": "ss-camunda", "name": "Camunda Platform", "doc": "chart camunda-contour, ns camunda. В этом примере потребителей не показано." }
],
"camunda_sub": ["Zeebe", "Zeebe Gateway", "Operate", "Tasklist", "Optimize", "Identity", "Connectors"],
"external": [
{ "id": "nd-s3", "name": "s3.example.com — объектное хранилище", "doc": "Внешнее по отношению к кластеру.", "realizes": "ts-object" },
{ "id": "nd-nfs", "name": "Сетевое хранилище (StorageClass)", "doc": "Класс хранения для PVC.", "serves": "ss-postgres" },
{ "id": "nd-gitea", "name": "Git-сервер контура", "doc": "Источник манифестов для Flux.", "serves": "cluster" },
{ "id": "nd-cr", "name": "registry.example.com", "doc": "Реестр Helm-чартов (OCI) и образов контейнеров.", "serves": "cluster",
"artifacts": [
{ "id": "ar-charts", "name": "Helm-чарты (OCI)" },
{ "id": "ar-images", "name": "Образы контейнеров" }
] }
],
"frontend_node": {
"id": "nd-frontend",
"name": "frontend-node-01",
"doc": "Выделенный узел, к которому ingress-gateway прибит через nodeSelector.",
"assigned_to": "ss-istio-gw"
},
"services": [
{ "id": "ts-ingress", "name": "Маршрутизация HTTPS-трафика", "realizers": ["ss-istio-gw", "ss-istio-mesh"], "key": "istio" },
{ "id": "ts-tls", "name": "Выпуск TLS-сертификатов", "realizers": ["ss-certmanager"], "key": null, "serves_software": "ss-istio-gw" },
{ "id": "ts-oidc", "name": "Аутентификация OIDC", "realizers": ["ss-zitadel"], "key": "oidc" },
{ "id": "ts-secrets", "name": "Управление секретами", "realizers": ["ss-vault"], "key": "vault" },
{ "id": "ts-rdbms", "name": "Реляционное хранилище", "realizers": ["ss-postgres"], "key": "postgres" },
{ "id": "ts-cache", "name": "Кэш", "realizers": ["ss-redis"], "key": "redis" },
{ "id": "ts-events", "name": "Событийная шина", "realizers": ["ss-kafka"], "key": "kafka" },
{ "id": "ts-amqp", "name": "Очередь сообщений AMQP", "realizers": ["ss-rabbit"], "key": "rabbitmq" },
{ "id": "ts-bpmn", "name": "Оркестрация процессов BPMN", "realizers": ["ss-camunda"], "key": "camunda" },
{ "id": "ts-object", "name": "Объектное хранилище", "realizers": ["nd-s3"], "key": "s3" }
]
}

View File

@ -1,248 +1,241 @@
<?xml version="1.0" encoding="UTF-8"?>
<model xmlns="http://www.opengroup.org/xsd/archimate/3.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.opengroup.org/xsd/archimate/3.0/ https://www.opengroup.org/xsd/archimate/3.1/archimate3_Diagram.xsd"
identifier="model-ugmk">
<name xml:lang="ru">СДЕ Sarex — контур УГМК</name>
<documentation xml:lang="ru">Технологический слой контура d8-ugmk-prod, выведенный из репозитория infra/iac. Прикладной слой присутствует только как потребители технологических сервисов — межсервисные связи приложений моделируются отдельно.</documentation>
identifier="model-contour">
<name xml:lang="ru">СДЕ Sarex — типовой контур (пример)</name>
<documentation xml:lang="ru">Технологический слой типового контура. Имена кластера, узлов, доменов и реестра заменены на примеры. Прикладной слой присутствует только как потребители технологических сервисов — межсервисные связи приложений моделируются отдельно.</documentation>
<elements>
<element identifier="ac-attachments" xsi:type="ApplicationComponent">
<name xml:lang="ru">attachments</name>
<documentation xml:lang="ru">apps/attachments/d8-ugmk-prod/</documentation>
<documentation xml:lang="ru">apps/attachments/&lt;contour&gt;/</documentation>
</element>
<element identifier="ac-auth-flow" xsi:type="ApplicationComponent">
<name xml:lang="ru">auth-flow</name>
<documentation xml:lang="ru">apps/auth-flow/d8-ugmk-prod/</documentation>
<documentation xml:lang="ru">apps/auth-flow/&lt;contour&gt;/</documentation>
</element>
<element identifier="ac-bim" xsi:type="ApplicationComponent">
<name xml:lang="ru">bim</name>
<documentation xml:lang="ru">apps/bim/d8-ugmk-prod/</documentation>
<documentation xml:lang="ru">apps/bim/&lt;contour&gt;/</documentation>
</element>
<element identifier="ac-cde" xsi:type="ApplicationComponent">
<name xml:lang="ru">cde</name>
<documentation xml:lang="ru">apps/cde/d8-ugmk-prod/</documentation>
<documentation xml:lang="ru">apps/cde/&lt;contour&gt;/</documentation>
</element>
<element identifier="ac-checklists" xsi:type="ApplicationComponent">
<name xml:lang="ru">checklists</name>
<documentation xml:lang="ru">apps/checklists/d8-ugmk-prod/</documentation>
<documentation xml:lang="ru">apps/checklists/&lt;contour&gt;/</documentation>
</element>
<element identifier="ac-comparisons" xsi:type="ApplicationComponent">
<name xml:lang="ru">comparisons</name>
<documentation xml:lang="ru">apps/comparisons/d8-ugmk-prod/</documentation>
<documentation xml:lang="ru">apps/comparisons/&lt;contour&gt;/</documentation>
</element>
<element identifier="ac-contracts" xsi:type="ApplicationComponent">
<name xml:lang="ru">contracts</name>
<documentation xml:lang="ru">apps/contracts/d8-ugmk-prod/</documentation>
<documentation xml:lang="ru">apps/contracts/&lt;contour&gt;/</documentation>
</element>
<element identifier="ac-control-interface" xsi:type="ApplicationComponent">
<name xml:lang="ru">control-interface</name>
<documentation xml:lang="ru">apps/control-interface/d8-ugmk-prod/</documentation>
<documentation xml:lang="ru">apps/control-interface/&lt;contour&gt;/</documentation>
</element>
<element identifier="ac-cross-section" xsi:type="ApplicationComponent">
<name xml:lang="ru">cross-section</name>
<documentation xml:lang="ru">apps/cross-section/d8-ugmk-prod/</documentation>
<documentation xml:lang="ru">apps/cross-section/&lt;contour&gt;/</documentation>
</element>
<element identifier="ac-django" xsi:type="ApplicationComponent">
<name xml:lang="ru">django</name>
<documentation xml:lang="ru">apps/django/d8-ugmk-prod/</documentation>
<documentation xml:lang="ru">apps/django/&lt;contour&gt;/</documentation>
</element>
<element identifier="ac-document-link" xsi:type="ApplicationComponent">
<name xml:lang="ru">document-link</name>
<documentation xml:lang="ru">apps/document-link/d8-ugmk-prod/</documentation>
<documentation xml:lang="ru">apps/document-link/&lt;contour&gt;/</documentation>
</element>
<element identifier="ac-documentations" xsi:type="ApplicationComponent">
<name xml:lang="ru">documentations</name>
<documentation xml:lang="ru">apps/documentations/d8-ugmk-prod/</documentation>
<documentation xml:lang="ru">apps/documentations/&lt;contour&gt;/</documentation>
</element>
<element identifier="ac-drawings" xsi:type="ApplicationComponent">
<name xml:lang="ru">drawings</name>
<documentation xml:lang="ru">apps/drawings/d8-ugmk-prod/</documentation>
<documentation xml:lang="ru">apps/drawings/&lt;contour&gt;/</documentation>
</element>
<element identifier="ac-eav" xsi:type="ApplicationComponent">
<name xml:lang="ru">eav</name>
<documentation xml:lang="ru">apps/eav/d8-ugmk-prod/</documentation>
<documentation xml:lang="ru">apps/eav/&lt;contour&gt;/</documentation>
</element>
<element identifier="ac-faas" xsi:type="ApplicationComponent">
<name xml:lang="ru">faas</name>
<documentation xml:lang="ru">apps/faas/d8-ugmk-prod/</documentation>
<documentation xml:lang="ru">apps/faas/&lt;contour&gt;/</documentation>
</element>
<element identifier="ac-flows" xsi:type="ApplicationComponent">
<name xml:lang="ru">flows</name>
<documentation xml:lang="ru">apps/flows/d8-ugmk-prod/</documentation>
<documentation xml:lang="ru">apps/flows/&lt;contour&gt;/</documentation>
</element>
<element identifier="ac-iam" xsi:type="ApplicationComponent">
<name xml:lang="ru">iam</name>
<documentation xml:lang="ru">apps/iam/d8-ugmk-prod/</documentation>
<documentation xml:lang="ru">apps/iam/&lt;contour&gt;/</documentation>
</element>
<element identifier="ac-inspections" xsi:type="ApplicationComponent">
<name xml:lang="ru">inspections</name>
<documentation xml:lang="ru">apps/inspections/d8-ugmk-prod/</documentation>
<documentation xml:lang="ru">apps/inspections/&lt;contour&gt;/</documentation>
</element>
<element identifier="ac-issues" xsi:type="ApplicationComponent">
<name xml:lang="ru">issues</name>
<documentation xml:lang="ru">apps/issues/d8-ugmk-prod/</documentation>
<documentation xml:lang="ru">apps/issues/&lt;contour&gt;/</documentation>
</element>
<element identifier="ac-mapper" xsi:type="ApplicationComponent">
<name xml:lang="ru">mapper</name>
<documentation xml:lang="ru">apps/mapper/d8-ugmk-prod/</documentation>
<documentation xml:lang="ru">apps/mapper/&lt;contour&gt;/</documentation>
</element>
<element identifier="ac-measurements" xsi:type="ApplicationComponent">
<name xml:lang="ru">measurements</name>
<documentation xml:lang="ru">apps/measurements/d8-ugmk-prod/</documentation>
<documentation xml:lang="ru">apps/measurements/&lt;contour&gt;/</documentation>
</element>
<element identifier="ac-message-hub" xsi:type="ApplicationComponent">
<name xml:lang="ru">message-hub</name>
<documentation xml:lang="ru">apps/message-hub/d8-ugmk-prod/</documentation>
<documentation xml:lang="ru">apps/message-hub/&lt;contour&gt;/</documentation>
</element>
<element identifier="ac-notes" xsi:type="ApplicationComponent">
<name xml:lang="ru">notes</name>
<documentation xml:lang="ru">apps/notes/d8-ugmk-prod/</documentation>
<documentation xml:lang="ru">apps/notes/&lt;contour&gt;/</documentation>
</element>
<element identifier="ac-pm" xsi:type="ApplicationComponent">
<name xml:lang="ru">pm</name>
<documentation xml:lang="ru">apps/pm/d8-ugmk-prod/</documentation>
<documentation xml:lang="ru">apps/pm/&lt;contour&gt;/</documentation>
</element>
<element identifier="ac-prescriptions" xsi:type="ApplicationComponent">
<name xml:lang="ru">prescriptions</name>
<documentation xml:lang="ru">apps/prescriptions/d8-ugmk-prod/</documentation>
<documentation xml:lang="ru">apps/prescriptions/&lt;contour&gt;/</documentation>
</element>
<element identifier="ac-processing" xsi:type="ApplicationComponent">
<name xml:lang="ru">processing</name>
<documentation xml:lang="ru">apps/processing/d8-ugmk-prod/</documentation>
<documentation xml:lang="ru">apps/processing/&lt;contour&gt;/</documentation>
</element>
<element identifier="ac-projects" xsi:type="ApplicationComponent">
<name xml:lang="ru">projects</name>
<documentation xml:lang="ru">apps/projects/d8-ugmk-prod/</documentation>
<documentation xml:lang="ru">apps/projects/&lt;contour&gt;/</documentation>
</element>
<element identifier="ac-remarks" xsi:type="ApplicationComponent">
<name xml:lang="ru">remarks</name>
<documentation xml:lang="ru">apps/remarks/d8-ugmk-prod/</documentation>
<documentation xml:lang="ru">apps/remarks/&lt;contour&gt;/</documentation>
</element>
<element identifier="ac-reviews" xsi:type="ApplicationComponent">
<name xml:lang="ru">reviews</name>
<documentation xml:lang="ru">apps/reviews/d8-ugmk-prod/</documentation>
<documentation xml:lang="ru">apps/reviews/&lt;contour&gt;/</documentation>
</element>
<element identifier="ac-rfi" xsi:type="ApplicationComponent">
<name xml:lang="ru">rfi</name>
<documentation xml:lang="ru">apps/rfi/d8-ugmk-prod/</documentation>
<documentation xml:lang="ru">apps/rfi/&lt;contour&gt;/</documentation>
</element>
<element identifier="ac-stamp-verification" xsi:type="ApplicationComponent">
<name xml:lang="ru">stamp-verification</name>
<documentation xml:lang="ru">apps/stamp-verification/d8-ugmk-prod/</documentation>
<documentation xml:lang="ru">apps/stamp-verification/&lt;contour&gt;/</documentation>
</element>
<element identifier="ac-subscriptions" xsi:type="ApplicationComponent">
<name xml:lang="ru">subscriptions</name>
<documentation xml:lang="ru">apps/subscriptions/d8-ugmk-prod/</documentation>
<documentation xml:lang="ru">apps/subscriptions/&lt;contour&gt;/</documentation>
</element>
<element identifier="ac-system-log" xsi:type="ApplicationComponent">
<name xml:lang="ru">system-log</name>
<documentation xml:lang="ru">apps/system-log/d8-ugmk-prod/</documentation>
<documentation xml:lang="ru">apps/system-log/&lt;contour&gt;/</documentation>
</element>
<element identifier="ac-transmittal" xsi:type="ApplicationComponent">
<name xml:lang="ru">transmittal</name>
<documentation xml:lang="ru">apps/transmittal/d8-ugmk-prod/</documentation>
<documentation xml:lang="ru">apps/transmittal/&lt;contour&gt;/</documentation>
</element>
<element identifier="ac-workspaces" xsi:type="ApplicationComponent">
<name xml:lang="ru">workspaces</name>
<documentation xml:lang="ru">apps/workspaces/d8-ugmk-prod/</documentation>
<documentation xml:lang="ru">apps/workspaces/&lt;contour&gt;/</documentation>
</element>
<element identifier="nd-cluster" xsi:type="Node">
<name xml:lang="ru">Кластер d8-ugmk-prod (Deckhouse)</name>
<documentation xml:lang="ru">clusters/d8-ugmk-prod/kustomization.yaml. GitOps через FluxCD v2.</documentation>
</element>
<element identifier="nd-frontend" xsi:type="Node">
<name xml:lang="ru">um-sarex-k8s-frontend-01</name>
<documentation xml:lang="ru">Выделенный frontend-узел. К нему прибит ingress-gateway через nodeSelector: clusters/d8-ugmk-prod/istio-ingress/ingress-controller.yaml</documentation>
</element>
<element identifier="nd-s3" xsi:type="Node">
<name xml:lang="ru">s3.uralmine.com — объектное хранилище УГМК</name>
<documentation xml:lang="ru">Внешнее по отношению к кластеру. MinIO в контуре не разворачивается.</documentation>
</element>
<element identifier="nd-nfs" xsi:type="Node">
<name xml:lang="ru">NFS-хранилище (StorageClass nfs01)</name>
<documentation xml:lang="ru">Единственный storageClass в контуре, 9 упоминаний в манифестах.</documentation>
</element>
<element identifier="nd-gitea" xsi:type="Node">
<name xml:lang="ru">Gitea 10.222.255.165:3000 (infra/iac)</name>
<documentation xml:lang="ru">Источник для Flux: clusters/d8-ugmk-prod/flux-system/gotk-sync.yaml</documentation>
</element>
<element identifier="nd-cr" xsi:type="Node">
<name xml:lang="ru">cr.yandex/crp3ccidau046kdj8g9q</name>
<documentation xml:lang="ru">Реестр чартов (OCI) и образов контейнеров.</documentation>
<name xml:lang="ru">Кластер k8s-prod</name>
<documentation xml:lang="ru">clusters/&lt;contour&gt;/kustomization.yaml. Развёртывание через FluxCD v2 (GitOps).</documentation>
</element>
<element identifier="ss-istio-gw" xsi:type="SystemSoftware">
<name xml:lang="ru">Istio Ingress Gateway</name>
<documentation xml:lang="ru">Deckhouse IngressIstioController «sarex», inlet NodePort 30080/30443. clusters/d8-ugmk-prod/istio-ingress/ingress-controller.yaml</documentation>
<documentation xml:lang="ru">Ingress-контроллер, публикует контур наружу через NodePort.</documentation>
</element>
<element identifier="ss-istio-mesh" xsi:type="SystemSoftware">
<name xml:lang="ru">Istio Service Mesh</name>
<documentation xml:lang="ru">chart istio-config-contour 0.1.0. Gateway, VirtualService, RequestAuthentication.</documentation>
<documentation xml:lang="ru">chart istio-config-contour. Gateway, VirtualService, RequestAuthentication.</documentation>
</element>
<element identifier="ss-certmanager" xsi:type="SystemSoftware">
<name xml:lang="ru">cert-manager</name>
<documentation xml:lang="ru">ClusterIssuer sarex-selfsigned — сертификаты самоподписанные, не Let's Encrypt. Wildcard *.uralmine.com и *.sarex-k8s.uralmine.com.</documentation>
<documentation xml:lang="ru">Выпуск сертификатов. В примере — самоподписанный ClusterIssuer, wildcard на домен контура.</documentation>
</element>
<element identifier="ss-zitadel" xsi:type="SystemSoftware">
<name xml:lang="ru">Zitadel</name>
<documentation xml:lang="ru">chart idp-contour 4.12.13, ns zitadel.</documentation>
<documentation xml:lang="ru">chart idp-contour, ns zitadel. Основной поставщик идентичности.</documentation>
</element>
<element identifier="ss-vault" xsi:type="SystemSoftware">
<name xml:lang="ru">Vault + Agent Injector</name>
<documentation xml:lang="ru">chart vault-contour 0.2.3, ns vault. Единственный механизм доставки секретов, путь secrets/data/apps/&lt;app&gt;/postgres.</documentation>
<documentation xml:lang="ru">chart vault-contour, ns vault. Единственный механизм доставки секретов, путь secrets/data/apps/&lt;app&gt;/postgres.</documentation>
</element>
<element identifier="ss-postgres" xsi:type="SystemSoftware">
<name xml:lang="ru">PostgreSQL</name>
<documentation xml:lang="ru">chart postgresql-contour 17.0.7, ns postgresql. PVC 20Gi на nfs01.</documentation>
<documentation xml:lang="ru">chart postgresql-contour, ns postgresql. PVC на сетевом хранилище.</documentation>
</element>
<element identifier="ss-redis" xsi:type="SystemSoftware">
<name xml:lang="ru">Redis</name>
<documentation xml:lang="ru">Разворачивается только в ns pm: apps/pm/d8-ugmk-prod/redis.yaml.</documentation>
<documentation xml:lang="ru">Разворачивается не во всех контурах и не для всех приложений.</documentation>
</element>
<element identifier="ss-kafka" xsi:type="SystemSoftware">
<name xml:lang="ru">Kafka</name>
<documentation xml:lang="ru">chart kafka-contour 0.1.15, ns kafka.</documentation>
<documentation xml:lang="ru">chart kafka-contour, ns kafka.</documentation>
</element>
<element identifier="ss-rabbit" xsi:type="SystemSoftware">
<name xml:lang="ru">RabbitMQ</name>
<documentation xml:lang="ru">chart rabbitmq-contour 15.2.4, ns rabbitmq. Публикуется наружу на rabbitmq.sarex-k8s.uralmine.com.</documentation>
<documentation xml:lang="ru">chart rabbitmq-contour, ns rabbitmq.</documentation>
</element>
<element identifier="ss-camunda" xsi:type="SystemSoftware">
<name xml:lang="ru">Camunda Platform</name>
<documentation xml:lang="ru">chart camunda-contour 11.0.14, ns camunda. ВНИМАНИЕ: ни одно приложение контура на неё не сконфигурировано — потребителей нет.</documentation>
<documentation xml:lang="ru">chart camunda-contour, ns camunda. В этом примере потребителей не показано.</documentation>
</element>
<element identifier="ss-cam-zeebe" xsi:type="SystemSoftware">
<name xml:lang="ru">Zeebe</name>
<documentation xml:lang="ru">infrastructure/camunda/d8-ugmk-prod/camunda.yaml</documentation>
</element>
<element identifier="ss-cam-zeebe-gateway" xsi:type="SystemSoftware">
<name xml:lang="ru">Zeebe Gateway</name>
<documentation xml:lang="ru">infrastructure/camunda/d8-ugmk-prod/camunda.yaml</documentation>
</element>
<element identifier="ss-cam-operate" xsi:type="SystemSoftware">
<name xml:lang="ru">Operate</name>
<documentation xml:lang="ru">infrastructure/camunda/d8-ugmk-prod/camunda.yaml</documentation>
</element>
<element identifier="ss-cam-tasklist" xsi:type="SystemSoftware">
<name xml:lang="ru">Tasklist</name>
<documentation xml:lang="ru">infrastructure/camunda/d8-ugmk-prod/camunda.yaml</documentation>
</element>
<element identifier="ss-cam-optimize" xsi:type="SystemSoftware">
<name xml:lang="ru">Optimize</name>
<documentation xml:lang="ru">infrastructure/camunda/d8-ugmk-prod/camunda.yaml</documentation>
</element>
<element identifier="ss-cam-identity" xsi:type="SystemSoftware">
<name xml:lang="ru">Identity</name>
<documentation xml:lang="ru">infrastructure/camunda/d8-ugmk-prod/camunda.yaml</documentation>
</element>
<element identifier="ss-cam-connectors" xsi:type="SystemSoftware">
<name xml:lang="ru">Connectors</name>
<documentation xml:lang="ru">infrastructure/camunda/d8-ugmk-prod/camunda.yaml</documentation>
</element>
<element identifier="nd-s3" xsi:type="Node">
<name xml:lang="ru">s3.example.com — объектное хранилище</name>
<documentation xml:lang="ru">Внешнее по отношению к кластеру.</documentation>
</element>
<element identifier="nd-nfs" xsi:type="Node">
<name xml:lang="ru">Сетевое хранилище (StorageClass)</name>
<documentation xml:lang="ru">Класс хранения для PVC.</documentation>
</element>
<element identifier="nd-gitea" xsi:type="Node">
<name xml:lang="ru">Git-сервер контура</name>
<documentation xml:lang="ru">Источник манифестов для Flux.</documentation>
</element>
<element identifier="nd-cr" xsi:type="Node">
<name xml:lang="ru">registry.example.com</name>
<documentation xml:lang="ru">Реестр Helm-чартов (OCI) и образов контейнеров.</documentation>
</element>
<element identifier="ar-charts" xsi:type="Artifact">
<name xml:lang="ru">Helm-чарты *-contour (OCI)</name>
<name xml:lang="ru">Helm-чарты (OCI)</name>
</element>
<element identifier="ar-images" xsi:type="Artifact">
<name xml:lang="ru">Образы контейнеров</name>
</element>
<element identifier="nd-frontend" xsi:type="Node">
<name xml:lang="ru">frontend-node-01</name>
<documentation xml:lang="ru">Выделенный узел, к которому ingress-gateway прибит через nodeSelector.</documentation>
</element>
<element identifier="ts-ingress" xsi:type="TechnologyService">
<name xml:lang="ru">Маршрутизация HTTPS-трафика</name>
</element>
@ -292,24 +285,24 @@
<relationship identifier="rel-015" source="ss-camunda" target="ss-cam-optimize" xsi:type="Composition"/>
<relationship identifier="rel-016" source="ss-camunda" target="ss-cam-identity" xsi:type="Composition"/>
<relationship identifier="rel-017" source="ss-camunda" target="ss-cam-connectors" xsi:type="Composition"/>
<relationship identifier="rel-018" source="nd-cr" target="ar-charts" xsi:type="Composition"/>
<relationship identifier="rel-019" source="nd-cr" target="ar-images" xsi:type="Composition"/>
<relationship identifier="rel-020" source="ss-istio-gw" target="ts-ingress" xsi:type="Realization"/>
<relationship identifier="rel-021" source="ss-istio-mesh" target="ts-ingress" xsi:type="Realization"/>
<relationship identifier="rel-022" source="ss-certmanager" target="ts-tls" xsi:type="Realization"/>
<relationship identifier="rel-023" source="ss-zitadel" target="ts-oidc" xsi:type="Realization"/>
<relationship identifier="rel-024" source="ss-vault" target="ts-secrets" xsi:type="Realization"/>
<relationship identifier="rel-025" source="ss-postgres" target="ts-rdbms" xsi:type="Realization"/>
<relationship identifier="rel-026" source="ss-redis" target="ts-cache" xsi:type="Realization"/>
<relationship identifier="rel-027" source="ss-kafka" target="ts-events" xsi:type="Realization"/>
<relationship identifier="rel-028" source="ss-rabbit" target="ts-amqp" xsi:type="Realization"/>
<relationship identifier="rel-029" source="ss-camunda" target="ts-bpmn" xsi:type="Realization"/>
<relationship identifier="rel-030" source="nd-s3" target="ts-object" xsi:type="Realization"/>
<relationship identifier="rel-031" source="nd-frontend" target="ss-istio-gw" xsi:type="Assignment"/>
<relationship identifier="rel-032" source="ts-tls" target="ss-istio-gw" xsi:type="Serving"/>
<relationship identifier="rel-033" source="nd-nfs" target="ss-postgres" xsi:type="Serving"/>
<relationship identifier="rel-034" source="nd-gitea" target="nd-cluster" xsi:type="Serving"/>
<relationship identifier="rel-035" source="nd-cr" target="nd-cluster" xsi:type="Serving"/>
<relationship identifier="rel-018" source="nd-nfs" target="ss-postgres" xsi:type="Serving"/>
<relationship identifier="rel-019" source="nd-gitea" target="nd-cluster" xsi:type="Serving"/>
<relationship identifier="rel-020" source="nd-cr" target="ar-charts" xsi:type="Composition"/>
<relationship identifier="rel-021" source="nd-cr" target="ar-images" xsi:type="Composition"/>
<relationship identifier="rel-022" source="nd-cr" target="nd-cluster" xsi:type="Serving"/>
<relationship identifier="rel-023" source="nd-frontend" target="ss-istio-gw" xsi:type="Assignment"/>
<relationship identifier="rel-024" source="ss-istio-gw" target="ts-ingress" xsi:type="Realization"/>
<relationship identifier="rel-025" source="ss-istio-mesh" target="ts-ingress" xsi:type="Realization"/>
<relationship identifier="rel-026" source="ss-certmanager" target="ts-tls" xsi:type="Realization"/>
<relationship identifier="rel-027" source="ts-tls" target="ss-istio-gw" xsi:type="Serving"/>
<relationship identifier="rel-028" source="ss-zitadel" target="ts-oidc" xsi:type="Realization"/>
<relationship identifier="rel-029" source="ss-vault" target="ts-secrets" xsi:type="Realization"/>
<relationship identifier="rel-030" source="ss-postgres" target="ts-rdbms" xsi:type="Realization"/>
<relationship identifier="rel-031" source="ss-redis" target="ts-cache" xsi:type="Realization"/>
<relationship identifier="rel-032" source="ss-kafka" target="ts-events" xsi:type="Realization"/>
<relationship identifier="rel-033" source="ss-rabbit" target="ts-amqp" xsi:type="Realization"/>
<relationship identifier="rel-034" source="ss-camunda" target="ts-bpmn" xsi:type="Realization"/>
<relationship identifier="rel-035" source="nd-s3" target="ts-object" xsi:type="Realization"/>
<relationship identifier="rel-036" source="ts-ingress" target="ac-auth-flow" xsi:type="Serving"/>
<relationship identifier="rel-037" source="ts-ingress" target="ac-bim" xsi:type="Serving"/>
<relationship identifier="rel-038" source="ts-ingress" target="ac-cde" xsi:type="Serving"/>
@ -432,8 +425,8 @@
<views>
<diagrams>
<view identifier="view-1" xsi:type="Diagram">
<name xml:lang="ru">T1. Технологический слой — контур УГМК</name>
<documentation xml:lang="ru">Что развёрнуто в кластере d8-ugmk-prod и какие технологические сервисы это даёт. Приложения-потребители вынесены в отдельные представления T2T9.</documentation>
<name xml:lang="ru">T1. Технологический слой</name>
<documentation xml:lang="ru">Что развёрнуто в кластере и какие технологические сервисы это даёт. Приложения-потребители вынесены в отдельные представления T2 и далее.</documentation>
<node identifier="do-0001" elementRef="ts-ingress" xsi:type="Element" x="20" y="30" w="150" h="60"/>
<node identifier="do-0002" elementRef="ts-tls" xsi:type="Element" x="185" y="30" w="150" h="60"/>
<node identifier="do-0003" elementRef="ts-oidc" xsi:type="Element" x="350" y="30" w="150" h="60"/>
@ -469,316 +462,316 @@
<node identifier="do-0033" elementRef="ar-charts" xsi:type="Element" x="1335" y="460" w="145" h="60"/>
<node identifier="do-0034" elementRef="ar-images" xsi:type="Element" x="1490" y="460" w="145" h="60"/>
<node identifier="do-0035" elementRef="nd-frontend" xsi:type="Element" x="20" y="570" w="300" h="60"/>
<connection identifier="cn-0048" relationshipRef="rel-032" xsi:type="Relationship" source="do-0002" target="do-0012"/>
<connection identifier="cn-0036" relationshipRef="rel-020" xsi:type="Relationship" source="do-0012" target="do-0001"/>
<connection identifier="cn-0037" relationshipRef="rel-021" xsi:type="Relationship" source="do-0013" target="do-0001"/>
<connection identifier="cn-0038" relationshipRef="rel-022" xsi:type="Relationship" source="do-0014" target="do-0002"/>
<connection identifier="cn-0039" relationshipRef="rel-023" xsi:type="Relationship" source="do-0015" target="do-0003"/>
<connection identifier="cn-0040" relationshipRef="rel-024" xsi:type="Relationship" source="do-0016" target="do-0004"/>
<connection identifier="cn-0041" relationshipRef="rel-025" xsi:type="Relationship" source="do-0017" target="do-0005"/>
<connection identifier="cn-0042" relationshipRef="rel-026" xsi:type="Relationship" source="do-0018" target="do-0006"/>
<connection identifier="cn-0043" relationshipRef="rel-027" xsi:type="Relationship" source="do-0019" target="do-0007"/>
<connection identifier="cn-0044" relationshipRef="rel-028" xsi:type="Relationship" source="do-0020" target="do-0008"/>
<connection identifier="cn-0045" relationshipRef="rel-029" xsi:type="Relationship" source="do-0021" target="do-0009"/>
<connection identifier="cn-0046" relationshipRef="rel-030" xsi:type="Relationship" source="do-0029" target="do-0010"/>
<connection identifier="cn-0049" relationshipRef="rel-033" xsi:type="Relationship" source="do-0030" target="do-0017"/>
<connection identifier="cn-0050" relationshipRef="rel-034" xsi:type="Relationship" source="do-0031" target="do-0011"/>
<connection identifier="cn-0051" relationshipRef="rel-035" xsi:type="Relationship" source="do-0032" target="do-0011"/>
<connection identifier="cn-0047" relationshipRef="rel-031" xsi:type="Relationship" source="do-0035" target="do-0012"/>
<connection identifier="cn-0039" relationshipRef="rel-027" xsi:type="Relationship" source="do-0002" target="do-0012"/>
<connection identifier="cn-0036" relationshipRef="rel-024" xsi:type="Relationship" source="do-0012" target="do-0001"/>
<connection identifier="cn-0037" relationshipRef="rel-025" xsi:type="Relationship" source="do-0013" target="do-0001"/>
<connection identifier="cn-0038" relationshipRef="rel-026" xsi:type="Relationship" source="do-0014" target="do-0002"/>
<connection identifier="cn-0040" relationshipRef="rel-028" xsi:type="Relationship" source="do-0015" target="do-0003"/>
<connection identifier="cn-0041" relationshipRef="rel-029" xsi:type="Relationship" source="do-0016" target="do-0004"/>
<connection identifier="cn-0042" relationshipRef="rel-030" xsi:type="Relationship" source="do-0017" target="do-0005"/>
<connection identifier="cn-0043" relationshipRef="rel-031" xsi:type="Relationship" source="do-0018" target="do-0006"/>
<connection identifier="cn-0044" relationshipRef="rel-032" xsi:type="Relationship" source="do-0019" target="do-0007"/>
<connection identifier="cn-0045" relationshipRef="rel-033" xsi:type="Relationship" source="do-0020" target="do-0008"/>
<connection identifier="cn-0046" relationshipRef="rel-034" xsi:type="Relationship" source="do-0021" target="do-0009"/>
<connection identifier="cn-0047" relationshipRef="rel-035" xsi:type="Relationship" source="do-0029" target="do-0010"/>
<connection identifier="cn-0049" relationshipRef="rel-018" xsi:type="Relationship" source="do-0030" target="do-0017"/>
<connection identifier="cn-0050" relationshipRef="rel-019" xsi:type="Relationship" source="do-0031" target="do-0011"/>
<connection identifier="cn-0051" relationshipRef="rel-022" xsi:type="Relationship" source="do-0032" target="do-0011"/>
<connection identifier="cn-0048" relationshipRef="rel-023" xsi:type="Relationship" source="do-0035" target="do-0012"/>
</view>
<view identifier="view-2" xsi:type="Diagram">
<name xml:lang="ru">T2. Потребители: Маршрутизация HTTPS-трафика</name>
<documentation xml:lang="ru">21 из 35 приложений контура. Связи выведены из манифестов apps/*/base и apps/*/d8-ugmk-prod.</documentation>
<documentation xml:lang="ru">21 из 35 приложений контура. Связи выведены из манифестов приложений.</documentation>
<node identifier="do-0052" elementRef="ts-ingress" xsi:type="Element" x="20" y="20" w="260" h="60"/>
<node identifier="do-0053" elementRef="ss-istio-gw" xsi:type="Element" x="320" y="20" w="260" h="60"/>
<node identifier="do-0054" elementRef="ss-istio-mesh" xsi:type="Element" x="600" y="20" w="260" h="60"/>
<node identifier="do-0055" elementRef="ss-istio-mesh" xsi:type="Element" x="600" y="20" w="260" h="60"/>
<node identifier="do-0057" elementRef="ac-auth-flow" xsi:type="Element" x="20" y="150" w="170" h="55"/>
<node identifier="do-0058" elementRef="ac-bim" xsi:type="Element" x="210" y="150" w="170" h="55"/>
<node identifier="do-0059" elementRef="ac-cde" xsi:type="Element" x="400" y="150" w="170" h="55"/>
<node identifier="do-0060" elementRef="ac-checklists" xsi:type="Element" x="590" y="150" w="170" h="55"/>
<node identifier="do-0061" elementRef="ac-control-interface" xsi:type="Element" x="780" y="150" w="170" h="55"/>
<node identifier="do-0062" elementRef="ac-django" xsi:type="Element" x="970" y="150" w="170" h="55"/>
<node identifier="do-0063" elementRef="ac-document-link" xsi:type="Element" x="20" y="230" w="170" h="55"/>
<node identifier="do-0064" elementRef="ac-documentations" xsi:type="Element" x="210" y="230" w="170" h="55"/>
<node identifier="do-0065" elementRef="ac-eav" xsi:type="Element" x="400" y="230" w="170" h="55"/>
<node identifier="do-0066" elementRef="ac-flows" xsi:type="Element" x="590" y="230" w="170" h="55"/>
<node identifier="do-0067" elementRef="ac-iam" xsi:type="Element" x="780" y="230" w="170" h="55"/>
<node identifier="do-0068" elementRef="ac-inspections" xsi:type="Element" x="970" y="230" w="170" h="55"/>
<node identifier="do-0069" elementRef="ac-issues" xsi:type="Element" x="20" y="310" w="170" h="55"/>
<node identifier="do-0070" elementRef="ac-pm" xsi:type="Element" x="210" y="310" w="170" h="55"/>
<node identifier="do-0071" elementRef="ac-processing" xsi:type="Element" x="400" y="310" w="170" h="55"/>
<node identifier="do-0072" elementRef="ac-remarks" xsi:type="Element" x="590" y="310" w="170" h="55"/>
<node identifier="do-0073" elementRef="ac-reviews" xsi:type="Element" x="780" y="310" w="170" h="55"/>
<node identifier="do-0074" elementRef="ac-rfi" xsi:type="Element" x="970" y="310" w="170" h="55"/>
<node identifier="do-0075" elementRef="ac-stamp-verification" xsi:type="Element" x="20" y="390" w="170" h="55"/>
<node identifier="do-0076" elementRef="ac-transmittal" xsi:type="Element" x="210" y="390" w="170" h="55"/>
<node identifier="do-0077" elementRef="ac-workspaces" xsi:type="Element" x="400" y="390" w="170" h="55"/>
<connection identifier="cn-0078" relationshipRef="rel-036" xsi:type="Relationship" source="do-0052" target="do-0057"/>
<connection identifier="cn-0079" relationshipRef="rel-037" xsi:type="Relationship" source="do-0052" target="do-0058"/>
<connection identifier="cn-0080" relationshipRef="rel-038" xsi:type="Relationship" source="do-0052" target="do-0059"/>
<connection identifier="cn-0081" relationshipRef="rel-039" xsi:type="Relationship" source="do-0052" target="do-0060"/>
<connection identifier="cn-0082" relationshipRef="rel-040" xsi:type="Relationship" source="do-0052" target="do-0061"/>
<connection identifier="cn-0083" relationshipRef="rel-041" xsi:type="Relationship" source="do-0052" target="do-0062"/>
<connection identifier="cn-0084" relationshipRef="rel-042" xsi:type="Relationship" source="do-0052" target="do-0063"/>
<connection identifier="cn-0085" relationshipRef="rel-043" xsi:type="Relationship" source="do-0052" target="do-0064"/>
<connection identifier="cn-0086" relationshipRef="rel-044" xsi:type="Relationship" source="do-0052" target="do-0065"/>
<connection identifier="cn-0087" relationshipRef="rel-045" xsi:type="Relationship" source="do-0052" target="do-0066"/>
<connection identifier="cn-0088" relationshipRef="rel-046" xsi:type="Relationship" source="do-0052" target="do-0067"/>
<connection identifier="cn-0089" relationshipRef="rel-047" xsi:type="Relationship" source="do-0052" target="do-0068"/>
<connection identifier="cn-0090" relationshipRef="rel-048" xsi:type="Relationship" source="do-0052" target="do-0069"/>
<connection identifier="cn-0091" relationshipRef="rel-049" xsi:type="Relationship" source="do-0052" target="do-0070"/>
<connection identifier="cn-0092" relationshipRef="rel-050" xsi:type="Relationship" source="do-0052" target="do-0071"/>
<connection identifier="cn-0093" relationshipRef="rel-051" xsi:type="Relationship" source="do-0052" target="do-0072"/>
<connection identifier="cn-0094" relationshipRef="rel-052" xsi:type="Relationship" source="do-0052" target="do-0073"/>
<connection identifier="cn-0095" relationshipRef="rel-053" xsi:type="Relationship" source="do-0052" target="do-0074"/>
<connection identifier="cn-0096" relationshipRef="rel-054" xsi:type="Relationship" source="do-0052" target="do-0075"/>
<connection identifier="cn-0097" relationshipRef="rel-055" xsi:type="Relationship" source="do-0052" target="do-0076"/>
<connection identifier="cn-0098" relationshipRef="rel-056" xsi:type="Relationship" source="do-0052" target="do-0077"/>
<connection identifier="cn-0055" relationshipRef="rel-020" xsi:type="Relationship" source="do-0053" target="do-0052"/>
<connection identifier="cn-0056" relationshipRef="rel-021" xsi:type="Relationship" source="do-0054" target="do-0052"/>
<node identifier="do-0059" elementRef="ac-bim" xsi:type="Element" x="210" y="150" w="170" h="55"/>
<node identifier="do-0061" elementRef="ac-cde" xsi:type="Element" x="400" y="150" w="170" h="55"/>
<node identifier="do-0063" elementRef="ac-checklists" xsi:type="Element" x="590" y="150" w="170" h="55"/>
<node identifier="do-0065" elementRef="ac-control-interface" xsi:type="Element" x="780" y="150" w="170" h="55"/>
<node identifier="do-0067" elementRef="ac-django" xsi:type="Element" x="970" y="150" w="170" h="55"/>
<node identifier="do-0069" elementRef="ac-document-link" xsi:type="Element" x="20" y="230" w="170" h="55"/>
<node identifier="do-0071" elementRef="ac-documentations" xsi:type="Element" x="210" y="230" w="170" h="55"/>
<node identifier="do-0073" elementRef="ac-eav" xsi:type="Element" x="400" y="230" w="170" h="55"/>
<node identifier="do-0075" elementRef="ac-flows" xsi:type="Element" x="590" y="230" w="170" h="55"/>
<node identifier="do-0077" elementRef="ac-iam" xsi:type="Element" x="780" y="230" w="170" h="55"/>
<node identifier="do-0079" elementRef="ac-inspections" xsi:type="Element" x="970" y="230" w="170" h="55"/>
<node identifier="do-0081" elementRef="ac-issues" xsi:type="Element" x="20" y="310" w="170" h="55"/>
<node identifier="do-0083" elementRef="ac-pm" xsi:type="Element" x="210" y="310" w="170" h="55"/>
<node identifier="do-0085" elementRef="ac-processing" xsi:type="Element" x="400" y="310" w="170" h="55"/>
<node identifier="do-0087" elementRef="ac-remarks" xsi:type="Element" x="590" y="310" w="170" h="55"/>
<node identifier="do-0089" elementRef="ac-reviews" xsi:type="Element" x="780" y="310" w="170" h="55"/>
<node identifier="do-0091" elementRef="ac-rfi" xsi:type="Element" x="970" y="310" w="170" h="55"/>
<node identifier="do-0093" elementRef="ac-stamp-verification" xsi:type="Element" x="20" y="390" w="170" h="55"/>
<node identifier="do-0095" elementRef="ac-transmittal" xsi:type="Element" x="210" y="390" w="170" h="55"/>
<node identifier="do-0097" elementRef="ac-workspaces" xsi:type="Element" x="400" y="390" w="170" h="55"/>
<connection identifier="cn-0058" relationshipRef="rel-036" xsi:type="Relationship" source="do-0052" target="do-0057"/>
<connection identifier="cn-0060" relationshipRef="rel-037" xsi:type="Relationship" source="do-0052" target="do-0059"/>
<connection identifier="cn-0062" relationshipRef="rel-038" xsi:type="Relationship" source="do-0052" target="do-0061"/>
<connection identifier="cn-0064" relationshipRef="rel-039" xsi:type="Relationship" source="do-0052" target="do-0063"/>
<connection identifier="cn-0066" relationshipRef="rel-040" xsi:type="Relationship" source="do-0052" target="do-0065"/>
<connection identifier="cn-0068" relationshipRef="rel-041" xsi:type="Relationship" source="do-0052" target="do-0067"/>
<connection identifier="cn-0070" relationshipRef="rel-042" xsi:type="Relationship" source="do-0052" target="do-0069"/>
<connection identifier="cn-0072" relationshipRef="rel-043" xsi:type="Relationship" source="do-0052" target="do-0071"/>
<connection identifier="cn-0074" relationshipRef="rel-044" xsi:type="Relationship" source="do-0052" target="do-0073"/>
<connection identifier="cn-0076" relationshipRef="rel-045" xsi:type="Relationship" source="do-0052" target="do-0075"/>
<connection identifier="cn-0078" relationshipRef="rel-046" xsi:type="Relationship" source="do-0052" target="do-0077"/>
<connection identifier="cn-0080" relationshipRef="rel-047" xsi:type="Relationship" source="do-0052" target="do-0079"/>
<connection identifier="cn-0082" relationshipRef="rel-048" xsi:type="Relationship" source="do-0052" target="do-0081"/>
<connection identifier="cn-0084" relationshipRef="rel-049" xsi:type="Relationship" source="do-0052" target="do-0083"/>
<connection identifier="cn-0086" relationshipRef="rel-050" xsi:type="Relationship" source="do-0052" target="do-0085"/>
<connection identifier="cn-0088" relationshipRef="rel-051" xsi:type="Relationship" source="do-0052" target="do-0087"/>
<connection identifier="cn-0090" relationshipRef="rel-052" xsi:type="Relationship" source="do-0052" target="do-0089"/>
<connection identifier="cn-0092" relationshipRef="rel-053" xsi:type="Relationship" source="do-0052" target="do-0091"/>
<connection identifier="cn-0094" relationshipRef="rel-054" xsi:type="Relationship" source="do-0052" target="do-0093"/>
<connection identifier="cn-0096" relationshipRef="rel-055" xsi:type="Relationship" source="do-0052" target="do-0095"/>
<connection identifier="cn-0098" relationshipRef="rel-056" xsi:type="Relationship" source="do-0052" target="do-0097"/>
<connection identifier="cn-0054" relationshipRef="rel-024" xsi:type="Relationship" source="do-0053" target="do-0052"/>
<connection identifier="cn-0056" relationshipRef="rel-025" xsi:type="Relationship" source="do-0055" target="do-0052"/>
</view>
<view identifier="view-3" xsi:type="Diagram">
<name xml:lang="ru">T3. Потребители: Аутентификация OIDC</name>
<documentation xml:lang="ru">10 из 35 приложений контура. Связи выведены из манифестов apps/*/base и apps/*/d8-ugmk-prod.</documentation>
<documentation xml:lang="ru">10 из 35 приложений контура. Связи выведены из манифестов приложений.</documentation>
<node identifier="do-0099" elementRef="ts-oidc" xsi:type="Element" x="20" y="20" w="260" h="60"/>
<node identifier="do-0100" elementRef="ss-zitadel" xsi:type="Element" x="320" y="20" w="260" h="60"/>
<node identifier="do-0102" elementRef="ac-checklists" xsi:type="Element" x="20" y="150" w="170" h="55"/>
<node identifier="do-0103" elementRef="ac-comparisons" xsi:type="Element" x="210" y="150" w="170" h="55"/>
<node identifier="do-0104" elementRef="ac-contracts" xsi:type="Element" x="400" y="150" w="170" h="55"/>
<node identifier="do-0105" elementRef="ac-django" xsi:type="Element" x="590" y="150" w="170" h="55"/>
<node identifier="do-0106" elementRef="ac-documentations" xsi:type="Element" x="780" y="150" w="170" h="55"/>
<node identifier="do-0107" elementRef="ac-eav" xsi:type="Element" x="970" y="150" w="170" h="55"/>
<node identifier="do-0108" elementRef="ac-flows" xsi:type="Element" x="20" y="230" w="170" h="55"/>
<node identifier="do-0109" elementRef="ac-iam" xsi:type="Element" x="210" y="230" w="170" h="55"/>
<node identifier="do-0110" elementRef="ac-issues" xsi:type="Element" x="400" y="230" w="170" h="55"/>
<node identifier="do-0111" elementRef="ac-processing" xsi:type="Element" x="590" y="230" w="170" h="55"/>
<connection identifier="cn-0112" relationshipRef="rel-057" xsi:type="Relationship" source="do-0099" target="do-0102"/>
<connection identifier="cn-0113" relationshipRef="rel-058" xsi:type="Relationship" source="do-0099" target="do-0103"/>
<connection identifier="cn-0114" relationshipRef="rel-059" xsi:type="Relationship" source="do-0099" target="do-0104"/>
<connection identifier="cn-0115" relationshipRef="rel-060" xsi:type="Relationship" source="do-0099" target="do-0105"/>
<connection identifier="cn-0116" relationshipRef="rel-061" xsi:type="Relationship" source="do-0099" target="do-0106"/>
<connection identifier="cn-0117" relationshipRef="rel-062" xsi:type="Relationship" source="do-0099" target="do-0107"/>
<connection identifier="cn-0118" relationshipRef="rel-063" xsi:type="Relationship" source="do-0099" target="do-0108"/>
<connection identifier="cn-0119" relationshipRef="rel-064" xsi:type="Relationship" source="do-0099" target="do-0109"/>
<connection identifier="cn-0120" relationshipRef="rel-065" xsi:type="Relationship" source="do-0099" target="do-0110"/>
<connection identifier="cn-0121" relationshipRef="rel-066" xsi:type="Relationship" source="do-0099" target="do-0111"/>
<connection identifier="cn-0101" relationshipRef="rel-023" xsi:type="Relationship" source="do-0100" target="do-0099"/>
<node identifier="do-0104" elementRef="ac-comparisons" xsi:type="Element" x="210" y="150" w="170" h="55"/>
<node identifier="do-0106" elementRef="ac-contracts" xsi:type="Element" x="400" y="150" w="170" h="55"/>
<node identifier="do-0108" elementRef="ac-django" xsi:type="Element" x="590" y="150" w="170" h="55"/>
<node identifier="do-0110" elementRef="ac-documentations" xsi:type="Element" x="780" y="150" w="170" h="55"/>
<node identifier="do-0112" elementRef="ac-eav" xsi:type="Element" x="970" y="150" w="170" h="55"/>
<node identifier="do-0114" elementRef="ac-flows" xsi:type="Element" x="20" y="230" w="170" h="55"/>
<node identifier="do-0116" elementRef="ac-iam" xsi:type="Element" x="210" y="230" w="170" h="55"/>
<node identifier="do-0118" elementRef="ac-issues" xsi:type="Element" x="400" y="230" w="170" h="55"/>
<node identifier="do-0120" elementRef="ac-processing" xsi:type="Element" x="590" y="230" w="170" h="55"/>
<connection identifier="cn-0103" relationshipRef="rel-057" xsi:type="Relationship" source="do-0099" target="do-0102"/>
<connection identifier="cn-0105" relationshipRef="rel-058" xsi:type="Relationship" source="do-0099" target="do-0104"/>
<connection identifier="cn-0107" relationshipRef="rel-059" xsi:type="Relationship" source="do-0099" target="do-0106"/>
<connection identifier="cn-0109" relationshipRef="rel-060" xsi:type="Relationship" source="do-0099" target="do-0108"/>
<connection identifier="cn-0111" relationshipRef="rel-061" xsi:type="Relationship" source="do-0099" target="do-0110"/>
<connection identifier="cn-0113" relationshipRef="rel-062" xsi:type="Relationship" source="do-0099" target="do-0112"/>
<connection identifier="cn-0115" relationshipRef="rel-063" xsi:type="Relationship" source="do-0099" target="do-0114"/>
<connection identifier="cn-0117" relationshipRef="rel-064" xsi:type="Relationship" source="do-0099" target="do-0116"/>
<connection identifier="cn-0119" relationshipRef="rel-065" xsi:type="Relationship" source="do-0099" target="do-0118"/>
<connection identifier="cn-0121" relationshipRef="rel-066" xsi:type="Relationship" source="do-0099" target="do-0120"/>
<connection identifier="cn-0101" relationshipRef="rel-028" xsi:type="Relationship" source="do-0100" target="do-0099"/>
</view>
<view identifier="view-4" xsi:type="Diagram">
<name xml:lang="ru">T4. Потребители: Управление секретами</name>
<documentation xml:lang="ru">25 из 35 приложений контура. Связи выведены из манифестов apps/*/base и apps/*/d8-ugmk-prod.</documentation>
<documentation xml:lang="ru">25 из 35 приложений контура. Связи выведены из манифестов приложений.</documentation>
<node identifier="do-0122" elementRef="ts-secrets" xsi:type="Element" x="20" y="20" w="260" h="60"/>
<node identifier="do-0123" elementRef="ss-vault" xsi:type="Element" x="320" y="20" w="260" h="60"/>
<node identifier="do-0125" elementRef="ac-attachments" xsi:type="Element" x="20" y="150" w="170" h="55"/>
<node identifier="do-0126" elementRef="ac-bim" xsi:type="Element" x="210" y="150" w="170" h="55"/>
<node identifier="do-0127" elementRef="ac-cde" xsi:type="Element" x="400" y="150" w="170" h="55"/>
<node identifier="do-0128" elementRef="ac-checklists" xsi:type="Element" x="590" y="150" w="170" h="55"/>
<node identifier="do-0129" elementRef="ac-comparisons" xsi:type="Element" x="780" y="150" w="170" h="55"/>
<node identifier="do-0130" elementRef="ac-contracts" xsi:type="Element" x="970" y="150" w="170" h="55"/>
<node identifier="do-0131" elementRef="ac-django" xsi:type="Element" x="20" y="230" w="170" h="55"/>
<node identifier="do-0132" elementRef="ac-documentations" xsi:type="Element" x="210" y="230" w="170" h="55"/>
<node identifier="do-0133" elementRef="ac-drawings" xsi:type="Element" x="400" y="230" w="170" h="55"/>
<node identifier="do-0134" elementRef="ac-eav" xsi:type="Element" x="590" y="230" w="170" h="55"/>
<node identifier="do-0135" elementRef="ac-flows" xsi:type="Element" x="780" y="230" w="170" h="55"/>
<node identifier="do-0136" elementRef="ac-iam" xsi:type="Element" x="970" y="230" w="170" h="55"/>
<node identifier="do-0137" elementRef="ac-inspections" xsi:type="Element" x="20" y="310" w="170" h="55"/>
<node identifier="do-0138" elementRef="ac-issues" xsi:type="Element" x="210" y="310" w="170" h="55"/>
<node identifier="do-0139" elementRef="ac-mapper" xsi:type="Element" x="400" y="310" w="170" h="55"/>
<node identifier="do-0140" elementRef="ac-measurements" xsi:type="Element" x="590" y="310" w="170" h="55"/>
<node identifier="do-0141" elementRef="ac-message-hub" xsi:type="Element" x="780" y="310" w="170" h="55"/>
<node identifier="do-0142" elementRef="ac-notes" xsi:type="Element" x="970" y="310" w="170" h="55"/>
<node identifier="do-0143" elementRef="ac-pm" xsi:type="Element" x="20" y="390" w="170" h="55"/>
<node identifier="do-0144" elementRef="ac-processing" xsi:type="Element" x="210" y="390" w="170" h="55"/>
<node identifier="do-0145" elementRef="ac-rfi" xsi:type="Element" x="400" y="390" w="170" h="55"/>
<node identifier="do-0146" elementRef="ac-subscriptions" xsi:type="Element" x="590" y="390" w="170" h="55"/>
<node identifier="do-0147" elementRef="ac-system-log" xsi:type="Element" x="780" y="390" w="170" h="55"/>
<node identifier="do-0148" elementRef="ac-transmittal" xsi:type="Element" x="970" y="390" w="170" h="55"/>
<node identifier="do-0149" elementRef="ac-workspaces" xsi:type="Element" x="20" y="470" w="170" h="55"/>
<connection identifier="cn-0150" relationshipRef="rel-067" xsi:type="Relationship" source="do-0122" target="do-0125"/>
<connection identifier="cn-0151" relationshipRef="rel-068" xsi:type="Relationship" source="do-0122" target="do-0126"/>
<connection identifier="cn-0152" relationshipRef="rel-069" xsi:type="Relationship" source="do-0122" target="do-0127"/>
<connection identifier="cn-0153" relationshipRef="rel-070" xsi:type="Relationship" source="do-0122" target="do-0128"/>
<connection identifier="cn-0154" relationshipRef="rel-071" xsi:type="Relationship" source="do-0122" target="do-0129"/>
<connection identifier="cn-0155" relationshipRef="rel-072" xsi:type="Relationship" source="do-0122" target="do-0130"/>
<connection identifier="cn-0156" relationshipRef="rel-073" xsi:type="Relationship" source="do-0122" target="do-0131"/>
<connection identifier="cn-0157" relationshipRef="rel-074" xsi:type="Relationship" source="do-0122" target="do-0132"/>
<connection identifier="cn-0158" relationshipRef="rel-075" xsi:type="Relationship" source="do-0122" target="do-0133"/>
<connection identifier="cn-0159" relationshipRef="rel-076" xsi:type="Relationship" source="do-0122" target="do-0134"/>
<connection identifier="cn-0160" relationshipRef="rel-077" xsi:type="Relationship" source="do-0122" target="do-0135"/>
<connection identifier="cn-0161" relationshipRef="rel-078" xsi:type="Relationship" source="do-0122" target="do-0136"/>
<connection identifier="cn-0162" relationshipRef="rel-079" xsi:type="Relationship" source="do-0122" target="do-0137"/>
<connection identifier="cn-0163" relationshipRef="rel-080" xsi:type="Relationship" source="do-0122" target="do-0138"/>
<connection identifier="cn-0164" relationshipRef="rel-081" xsi:type="Relationship" source="do-0122" target="do-0139"/>
<connection identifier="cn-0165" relationshipRef="rel-082" xsi:type="Relationship" source="do-0122" target="do-0140"/>
<connection identifier="cn-0166" relationshipRef="rel-083" xsi:type="Relationship" source="do-0122" target="do-0141"/>
<connection identifier="cn-0167" relationshipRef="rel-084" xsi:type="Relationship" source="do-0122" target="do-0142"/>
<connection identifier="cn-0168" relationshipRef="rel-085" xsi:type="Relationship" source="do-0122" target="do-0143"/>
<connection identifier="cn-0169" relationshipRef="rel-086" xsi:type="Relationship" source="do-0122" target="do-0144"/>
<connection identifier="cn-0170" relationshipRef="rel-087" xsi:type="Relationship" source="do-0122" target="do-0145"/>
<connection identifier="cn-0171" relationshipRef="rel-088" xsi:type="Relationship" source="do-0122" target="do-0146"/>
<connection identifier="cn-0172" relationshipRef="rel-089" xsi:type="Relationship" source="do-0122" target="do-0147"/>
<connection identifier="cn-0173" relationshipRef="rel-090" xsi:type="Relationship" source="do-0122" target="do-0148"/>
<connection identifier="cn-0174" relationshipRef="rel-091" xsi:type="Relationship" source="do-0122" target="do-0149"/>
<connection identifier="cn-0124" relationshipRef="rel-024" xsi:type="Relationship" source="do-0123" target="do-0122"/>
<node identifier="do-0127" elementRef="ac-bim" xsi:type="Element" x="210" y="150" w="170" h="55"/>
<node identifier="do-0129" elementRef="ac-cde" xsi:type="Element" x="400" y="150" w="170" h="55"/>
<node identifier="do-0131" elementRef="ac-checklists" xsi:type="Element" x="590" y="150" w="170" h="55"/>
<node identifier="do-0133" elementRef="ac-comparisons" xsi:type="Element" x="780" y="150" w="170" h="55"/>
<node identifier="do-0135" elementRef="ac-contracts" xsi:type="Element" x="970" y="150" w="170" h="55"/>
<node identifier="do-0137" elementRef="ac-django" xsi:type="Element" x="20" y="230" w="170" h="55"/>
<node identifier="do-0139" elementRef="ac-documentations" xsi:type="Element" x="210" y="230" w="170" h="55"/>
<node identifier="do-0141" elementRef="ac-drawings" xsi:type="Element" x="400" y="230" w="170" h="55"/>
<node identifier="do-0143" elementRef="ac-eav" xsi:type="Element" x="590" y="230" w="170" h="55"/>
<node identifier="do-0145" elementRef="ac-flows" xsi:type="Element" x="780" y="230" w="170" h="55"/>
<node identifier="do-0147" elementRef="ac-iam" xsi:type="Element" x="970" y="230" w="170" h="55"/>
<node identifier="do-0149" elementRef="ac-inspections" xsi:type="Element" x="20" y="310" w="170" h="55"/>
<node identifier="do-0151" elementRef="ac-issues" xsi:type="Element" x="210" y="310" w="170" h="55"/>
<node identifier="do-0153" elementRef="ac-mapper" xsi:type="Element" x="400" y="310" w="170" h="55"/>
<node identifier="do-0155" elementRef="ac-measurements" xsi:type="Element" x="590" y="310" w="170" h="55"/>
<node identifier="do-0157" elementRef="ac-message-hub" xsi:type="Element" x="780" y="310" w="170" h="55"/>
<node identifier="do-0159" elementRef="ac-notes" xsi:type="Element" x="970" y="310" w="170" h="55"/>
<node identifier="do-0161" elementRef="ac-pm" xsi:type="Element" x="20" y="390" w="170" h="55"/>
<node identifier="do-0163" elementRef="ac-processing" xsi:type="Element" x="210" y="390" w="170" h="55"/>
<node identifier="do-0165" elementRef="ac-rfi" xsi:type="Element" x="400" y="390" w="170" h="55"/>
<node identifier="do-0167" elementRef="ac-subscriptions" xsi:type="Element" x="590" y="390" w="170" h="55"/>
<node identifier="do-0169" elementRef="ac-system-log" xsi:type="Element" x="780" y="390" w="170" h="55"/>
<node identifier="do-0171" elementRef="ac-transmittal" xsi:type="Element" x="970" y="390" w="170" h="55"/>
<node identifier="do-0173" elementRef="ac-workspaces" xsi:type="Element" x="20" y="470" w="170" h="55"/>
<connection identifier="cn-0126" relationshipRef="rel-067" xsi:type="Relationship" source="do-0122" target="do-0125"/>
<connection identifier="cn-0128" relationshipRef="rel-068" xsi:type="Relationship" source="do-0122" target="do-0127"/>
<connection identifier="cn-0130" relationshipRef="rel-069" xsi:type="Relationship" source="do-0122" target="do-0129"/>
<connection identifier="cn-0132" relationshipRef="rel-070" xsi:type="Relationship" source="do-0122" target="do-0131"/>
<connection identifier="cn-0134" relationshipRef="rel-071" xsi:type="Relationship" source="do-0122" target="do-0133"/>
<connection identifier="cn-0136" relationshipRef="rel-072" xsi:type="Relationship" source="do-0122" target="do-0135"/>
<connection identifier="cn-0138" relationshipRef="rel-073" xsi:type="Relationship" source="do-0122" target="do-0137"/>
<connection identifier="cn-0140" relationshipRef="rel-074" xsi:type="Relationship" source="do-0122" target="do-0139"/>
<connection identifier="cn-0142" relationshipRef="rel-075" xsi:type="Relationship" source="do-0122" target="do-0141"/>
<connection identifier="cn-0144" relationshipRef="rel-076" xsi:type="Relationship" source="do-0122" target="do-0143"/>
<connection identifier="cn-0146" relationshipRef="rel-077" xsi:type="Relationship" source="do-0122" target="do-0145"/>
<connection identifier="cn-0148" relationshipRef="rel-078" xsi:type="Relationship" source="do-0122" target="do-0147"/>
<connection identifier="cn-0150" relationshipRef="rel-079" xsi:type="Relationship" source="do-0122" target="do-0149"/>
<connection identifier="cn-0152" relationshipRef="rel-080" xsi:type="Relationship" source="do-0122" target="do-0151"/>
<connection identifier="cn-0154" relationshipRef="rel-081" xsi:type="Relationship" source="do-0122" target="do-0153"/>
<connection identifier="cn-0156" relationshipRef="rel-082" xsi:type="Relationship" source="do-0122" target="do-0155"/>
<connection identifier="cn-0158" relationshipRef="rel-083" xsi:type="Relationship" source="do-0122" target="do-0157"/>
<connection identifier="cn-0160" relationshipRef="rel-084" xsi:type="Relationship" source="do-0122" target="do-0159"/>
<connection identifier="cn-0162" relationshipRef="rel-085" xsi:type="Relationship" source="do-0122" target="do-0161"/>
<connection identifier="cn-0164" relationshipRef="rel-086" xsi:type="Relationship" source="do-0122" target="do-0163"/>
<connection identifier="cn-0166" relationshipRef="rel-087" xsi:type="Relationship" source="do-0122" target="do-0165"/>
<connection identifier="cn-0168" relationshipRef="rel-088" xsi:type="Relationship" source="do-0122" target="do-0167"/>
<connection identifier="cn-0170" relationshipRef="rel-089" xsi:type="Relationship" source="do-0122" target="do-0169"/>
<connection identifier="cn-0172" relationshipRef="rel-090" xsi:type="Relationship" source="do-0122" target="do-0171"/>
<connection identifier="cn-0174" relationshipRef="rel-091" xsi:type="Relationship" source="do-0122" target="do-0173"/>
<connection identifier="cn-0124" relationshipRef="rel-029" xsi:type="Relationship" source="do-0123" target="do-0122"/>
</view>
<view identifier="view-5" xsi:type="Diagram">
<name xml:lang="ru">T5. Потребители: Реляционное хранилище</name>
<documentation xml:lang="ru">23 из 35 приложений контура. Связи выведены из манифестов apps/*/base и apps/*/d8-ugmk-prod.</documentation>
<documentation xml:lang="ru">23 из 35 приложений контура. Связи выведены из манифестов приложений.</documentation>
<node identifier="do-0175" elementRef="ts-rdbms" xsi:type="Element" x="20" y="20" w="260" h="60"/>
<node identifier="do-0176" elementRef="ss-postgres" xsi:type="Element" x="320" y="20" w="260" h="60"/>
<node identifier="do-0178" elementRef="ac-attachments" xsi:type="Element" x="20" y="150" w="170" h="55"/>
<node identifier="do-0179" elementRef="ac-bim" xsi:type="Element" x="210" y="150" w="170" h="55"/>
<node identifier="do-0180" elementRef="ac-checklists" xsi:type="Element" x="400" y="150" w="170" h="55"/>
<node identifier="do-0181" elementRef="ac-comparisons" xsi:type="Element" x="590" y="150" w="170" h="55"/>
<node identifier="do-0182" elementRef="ac-contracts" xsi:type="Element" x="780" y="150" w="170" h="55"/>
<node identifier="do-0183" elementRef="ac-django" xsi:type="Element" x="970" y="150" w="170" h="55"/>
<node identifier="do-0184" elementRef="ac-documentations" xsi:type="Element" x="20" y="230" w="170" h="55"/>
<node identifier="do-0185" elementRef="ac-drawings" xsi:type="Element" x="210" y="230" w="170" h="55"/>
<node identifier="do-0186" elementRef="ac-eav" xsi:type="Element" x="400" y="230" w="170" h="55"/>
<node identifier="do-0187" elementRef="ac-flows" xsi:type="Element" x="590" y="230" w="170" h="55"/>
<node identifier="do-0188" elementRef="ac-iam" xsi:type="Element" x="780" y="230" w="170" h="55"/>
<node identifier="do-0189" elementRef="ac-inspections" xsi:type="Element" x="970" y="230" w="170" h="55"/>
<node identifier="do-0190" elementRef="ac-issues" xsi:type="Element" x="20" y="310" w="170" h="55"/>
<node identifier="do-0191" elementRef="ac-mapper" xsi:type="Element" x="210" y="310" w="170" h="55"/>
<node identifier="do-0192" elementRef="ac-message-hub" xsi:type="Element" x="400" y="310" w="170" h="55"/>
<node identifier="do-0193" elementRef="ac-notes" xsi:type="Element" x="590" y="310" w="170" h="55"/>
<node identifier="do-0194" elementRef="ac-pm" xsi:type="Element" x="780" y="310" w="170" h="55"/>
<node identifier="do-0195" elementRef="ac-processing" xsi:type="Element" x="970" y="310" w="170" h="55"/>
<node identifier="do-0196" elementRef="ac-rfi" xsi:type="Element" x="20" y="390" w="170" h="55"/>
<node identifier="do-0197" elementRef="ac-subscriptions" xsi:type="Element" x="210" y="390" w="170" h="55"/>
<node identifier="do-0198" elementRef="ac-system-log" xsi:type="Element" x="400" y="390" w="170" h="55"/>
<node identifier="do-0199" elementRef="ac-transmittal" xsi:type="Element" x="590" y="390" w="170" h="55"/>
<node identifier="do-0200" elementRef="ac-workspaces" xsi:type="Element" x="780" y="390" w="170" h="55"/>
<connection identifier="cn-0201" relationshipRef="rel-092" xsi:type="Relationship" source="do-0175" target="do-0178"/>
<connection identifier="cn-0202" relationshipRef="rel-093" xsi:type="Relationship" source="do-0175" target="do-0179"/>
<connection identifier="cn-0203" relationshipRef="rel-094" xsi:type="Relationship" source="do-0175" target="do-0180"/>
<connection identifier="cn-0204" relationshipRef="rel-095" xsi:type="Relationship" source="do-0175" target="do-0181"/>
<connection identifier="cn-0205" relationshipRef="rel-096" xsi:type="Relationship" source="do-0175" target="do-0182"/>
<connection identifier="cn-0206" relationshipRef="rel-097" xsi:type="Relationship" source="do-0175" target="do-0183"/>
<connection identifier="cn-0207" relationshipRef="rel-098" xsi:type="Relationship" source="do-0175" target="do-0184"/>
<connection identifier="cn-0208" relationshipRef="rel-099" xsi:type="Relationship" source="do-0175" target="do-0185"/>
<connection identifier="cn-0209" relationshipRef="rel-100" xsi:type="Relationship" source="do-0175" target="do-0186"/>
<connection identifier="cn-0210" relationshipRef="rel-101" xsi:type="Relationship" source="do-0175" target="do-0187"/>
<connection identifier="cn-0211" relationshipRef="rel-102" xsi:type="Relationship" source="do-0175" target="do-0188"/>
<connection identifier="cn-0212" relationshipRef="rel-103" xsi:type="Relationship" source="do-0175" target="do-0189"/>
<connection identifier="cn-0213" relationshipRef="rel-104" xsi:type="Relationship" source="do-0175" target="do-0190"/>
<connection identifier="cn-0214" relationshipRef="rel-105" xsi:type="Relationship" source="do-0175" target="do-0191"/>
<connection identifier="cn-0215" relationshipRef="rel-106" xsi:type="Relationship" source="do-0175" target="do-0192"/>
<connection identifier="cn-0216" relationshipRef="rel-107" xsi:type="Relationship" source="do-0175" target="do-0193"/>
<connection identifier="cn-0217" relationshipRef="rel-108" xsi:type="Relationship" source="do-0175" target="do-0194"/>
<connection identifier="cn-0218" relationshipRef="rel-109" xsi:type="Relationship" source="do-0175" target="do-0195"/>
<connection identifier="cn-0219" relationshipRef="rel-110" xsi:type="Relationship" source="do-0175" target="do-0196"/>
<connection identifier="cn-0220" relationshipRef="rel-111" xsi:type="Relationship" source="do-0175" target="do-0197"/>
<connection identifier="cn-0221" relationshipRef="rel-112" xsi:type="Relationship" source="do-0175" target="do-0198"/>
<connection identifier="cn-0222" relationshipRef="rel-113" xsi:type="Relationship" source="do-0175" target="do-0199"/>
<connection identifier="cn-0223" relationshipRef="rel-114" xsi:type="Relationship" source="do-0175" target="do-0200"/>
<connection identifier="cn-0177" relationshipRef="rel-025" xsi:type="Relationship" source="do-0176" target="do-0175"/>
<node identifier="do-0180" elementRef="ac-bim" xsi:type="Element" x="210" y="150" w="170" h="55"/>
<node identifier="do-0182" elementRef="ac-checklists" xsi:type="Element" x="400" y="150" w="170" h="55"/>
<node identifier="do-0184" elementRef="ac-comparisons" xsi:type="Element" x="590" y="150" w="170" h="55"/>
<node identifier="do-0186" elementRef="ac-contracts" xsi:type="Element" x="780" y="150" w="170" h="55"/>
<node identifier="do-0188" elementRef="ac-django" xsi:type="Element" x="970" y="150" w="170" h="55"/>
<node identifier="do-0190" elementRef="ac-documentations" xsi:type="Element" x="20" y="230" w="170" h="55"/>
<node identifier="do-0192" elementRef="ac-drawings" xsi:type="Element" x="210" y="230" w="170" h="55"/>
<node identifier="do-0194" elementRef="ac-eav" xsi:type="Element" x="400" y="230" w="170" h="55"/>
<node identifier="do-0196" elementRef="ac-flows" xsi:type="Element" x="590" y="230" w="170" h="55"/>
<node identifier="do-0198" elementRef="ac-iam" xsi:type="Element" x="780" y="230" w="170" h="55"/>
<node identifier="do-0200" elementRef="ac-inspections" xsi:type="Element" x="970" y="230" w="170" h="55"/>
<node identifier="do-0202" elementRef="ac-issues" xsi:type="Element" x="20" y="310" w="170" h="55"/>
<node identifier="do-0204" elementRef="ac-mapper" xsi:type="Element" x="210" y="310" w="170" h="55"/>
<node identifier="do-0206" elementRef="ac-message-hub" xsi:type="Element" x="400" y="310" w="170" h="55"/>
<node identifier="do-0208" elementRef="ac-notes" xsi:type="Element" x="590" y="310" w="170" h="55"/>
<node identifier="do-0210" elementRef="ac-pm" xsi:type="Element" x="780" y="310" w="170" h="55"/>
<node identifier="do-0212" elementRef="ac-processing" xsi:type="Element" x="970" y="310" w="170" h="55"/>
<node identifier="do-0214" elementRef="ac-rfi" xsi:type="Element" x="20" y="390" w="170" h="55"/>
<node identifier="do-0216" elementRef="ac-subscriptions" xsi:type="Element" x="210" y="390" w="170" h="55"/>
<node identifier="do-0218" elementRef="ac-system-log" xsi:type="Element" x="400" y="390" w="170" h="55"/>
<node identifier="do-0220" elementRef="ac-transmittal" xsi:type="Element" x="590" y="390" w="170" h="55"/>
<node identifier="do-0222" elementRef="ac-workspaces" xsi:type="Element" x="780" y="390" w="170" h="55"/>
<connection identifier="cn-0179" relationshipRef="rel-092" xsi:type="Relationship" source="do-0175" target="do-0178"/>
<connection identifier="cn-0181" relationshipRef="rel-093" xsi:type="Relationship" source="do-0175" target="do-0180"/>
<connection identifier="cn-0183" relationshipRef="rel-094" xsi:type="Relationship" source="do-0175" target="do-0182"/>
<connection identifier="cn-0185" relationshipRef="rel-095" xsi:type="Relationship" source="do-0175" target="do-0184"/>
<connection identifier="cn-0187" relationshipRef="rel-096" xsi:type="Relationship" source="do-0175" target="do-0186"/>
<connection identifier="cn-0189" relationshipRef="rel-097" xsi:type="Relationship" source="do-0175" target="do-0188"/>
<connection identifier="cn-0191" relationshipRef="rel-098" xsi:type="Relationship" source="do-0175" target="do-0190"/>
<connection identifier="cn-0193" relationshipRef="rel-099" xsi:type="Relationship" source="do-0175" target="do-0192"/>
<connection identifier="cn-0195" relationshipRef="rel-100" xsi:type="Relationship" source="do-0175" target="do-0194"/>
<connection identifier="cn-0197" relationshipRef="rel-101" xsi:type="Relationship" source="do-0175" target="do-0196"/>
<connection identifier="cn-0199" relationshipRef="rel-102" xsi:type="Relationship" source="do-0175" target="do-0198"/>
<connection identifier="cn-0201" relationshipRef="rel-103" xsi:type="Relationship" source="do-0175" target="do-0200"/>
<connection identifier="cn-0203" relationshipRef="rel-104" xsi:type="Relationship" source="do-0175" target="do-0202"/>
<connection identifier="cn-0205" relationshipRef="rel-105" xsi:type="Relationship" source="do-0175" target="do-0204"/>
<connection identifier="cn-0207" relationshipRef="rel-106" xsi:type="Relationship" source="do-0175" target="do-0206"/>
<connection identifier="cn-0209" relationshipRef="rel-107" xsi:type="Relationship" source="do-0175" target="do-0208"/>
<connection identifier="cn-0211" relationshipRef="rel-108" xsi:type="Relationship" source="do-0175" target="do-0210"/>
<connection identifier="cn-0213" relationshipRef="rel-109" xsi:type="Relationship" source="do-0175" target="do-0212"/>
<connection identifier="cn-0215" relationshipRef="rel-110" xsi:type="Relationship" source="do-0175" target="do-0214"/>
<connection identifier="cn-0217" relationshipRef="rel-111" xsi:type="Relationship" source="do-0175" target="do-0216"/>
<connection identifier="cn-0219" relationshipRef="rel-112" xsi:type="Relationship" source="do-0175" target="do-0218"/>
<connection identifier="cn-0221" relationshipRef="rel-113" xsi:type="Relationship" source="do-0175" target="do-0220"/>
<connection identifier="cn-0223" relationshipRef="rel-114" xsi:type="Relationship" source="do-0175" target="do-0222"/>
<connection identifier="cn-0177" relationshipRef="rel-030" xsi:type="Relationship" source="do-0176" target="do-0175"/>
</view>
<view identifier="view-6" xsi:type="Diagram">
<name xml:lang="ru">T6. Потребители: Кэш</name>
<documentation xml:lang="ru">3 из 35 приложений контура. Связи выведены из манифестов apps/*/base и apps/*/d8-ugmk-prod.</documentation>
<documentation xml:lang="ru">3 из 35 приложений контура. Связи выведены из манифестов приложений.</documentation>
<node identifier="do-0224" elementRef="ts-cache" xsi:type="Element" x="20" y="20" w="260" h="60"/>
<node identifier="do-0225" elementRef="ss-redis" xsi:type="Element" x="320" y="20" w="260" h="60"/>
<node identifier="do-0227" elementRef="ac-django" xsi:type="Element" x="20" y="150" w="170" h="55"/>
<node identifier="do-0228" elementRef="ac-message-hub" xsi:type="Element" x="210" y="150" w="170" h="55"/>
<node identifier="do-0229" elementRef="ac-pm" xsi:type="Element" x="400" y="150" w="170" h="55"/>
<connection identifier="cn-0230" relationshipRef="rel-115" xsi:type="Relationship" source="do-0224" target="do-0227"/>
<connection identifier="cn-0231" relationshipRef="rel-116" xsi:type="Relationship" source="do-0224" target="do-0228"/>
<connection identifier="cn-0232" relationshipRef="rel-117" xsi:type="Relationship" source="do-0224" target="do-0229"/>
<connection identifier="cn-0226" relationshipRef="rel-026" xsi:type="Relationship" source="do-0225" target="do-0224"/>
<node identifier="do-0229" elementRef="ac-message-hub" xsi:type="Element" x="210" y="150" w="170" h="55"/>
<node identifier="do-0231" elementRef="ac-pm" xsi:type="Element" x="400" y="150" w="170" h="55"/>
<connection identifier="cn-0228" relationshipRef="rel-115" xsi:type="Relationship" source="do-0224" target="do-0227"/>
<connection identifier="cn-0230" relationshipRef="rel-116" xsi:type="Relationship" source="do-0224" target="do-0229"/>
<connection identifier="cn-0232" relationshipRef="rel-117" xsi:type="Relationship" source="do-0224" target="do-0231"/>
<connection identifier="cn-0226" relationshipRef="rel-031" xsi:type="Relationship" source="do-0225" target="do-0224"/>
</view>
<view identifier="view-7" xsi:type="Diagram">
<name xml:lang="ru">T7. Потребители: Событийная шина</name>
<documentation xml:lang="ru">12 из 35 приложений контура. Связи выведены из манифестов apps/*/base и apps/*/d8-ugmk-prod.</documentation>
<documentation xml:lang="ru">12 из 35 приложений контура. Связи выведены из манифестов приложений.</documentation>
<node identifier="do-0233" elementRef="ts-events" xsi:type="Element" x="20" y="20" w="260" h="60"/>
<node identifier="do-0234" elementRef="ss-kafka" xsi:type="Element" x="320" y="20" w="260" h="60"/>
<node identifier="do-0236" elementRef="ac-contracts" xsi:type="Element" x="20" y="150" w="170" h="55"/>
<node identifier="do-0237" elementRef="ac-django" xsi:type="Element" x="210" y="150" w="170" h="55"/>
<node identifier="do-0238" elementRef="ac-eav" xsi:type="Element" x="400" y="150" w="170" h="55"/>
<node identifier="do-0239" elementRef="ac-flows" xsi:type="Element" x="590" y="150" w="170" h="55"/>
<node identifier="do-0240" elementRef="ac-iam" xsi:type="Element" x="780" y="150" w="170" h="55"/>
<node identifier="do-0241" elementRef="ac-inspections" xsi:type="Element" x="970" y="150" w="170" h="55"/>
<node identifier="do-0242" elementRef="ac-issues" xsi:type="Element" x="20" y="230" w="170" h="55"/>
<node identifier="do-0243" elementRef="ac-mapper" xsi:type="Element" x="210" y="230" w="170" h="55"/>
<node identifier="do-0244" elementRef="ac-message-hub" xsi:type="Element" x="400" y="230" w="170" h="55"/>
<node identifier="do-0245" elementRef="ac-notes" xsi:type="Element" x="590" y="230" w="170" h="55"/>
<node identifier="do-0246" elementRef="ac-pm" xsi:type="Element" x="780" y="230" w="170" h="55"/>
<node identifier="do-0247" elementRef="ac-system-log" xsi:type="Element" x="970" y="230" w="170" h="55"/>
<connection identifier="cn-0248" relationshipRef="rel-118" xsi:type="Relationship" source="do-0233" target="do-0236"/>
<connection identifier="cn-0249" relationshipRef="rel-119" xsi:type="Relationship" source="do-0233" target="do-0237"/>
<connection identifier="cn-0250" relationshipRef="rel-120" xsi:type="Relationship" source="do-0233" target="do-0238"/>
<connection identifier="cn-0251" relationshipRef="rel-121" xsi:type="Relationship" source="do-0233" target="do-0239"/>
<connection identifier="cn-0252" relationshipRef="rel-122" xsi:type="Relationship" source="do-0233" target="do-0240"/>
<connection identifier="cn-0253" relationshipRef="rel-123" xsi:type="Relationship" source="do-0233" target="do-0241"/>
<connection identifier="cn-0254" relationshipRef="rel-124" xsi:type="Relationship" source="do-0233" target="do-0242"/>
<connection identifier="cn-0255" relationshipRef="rel-125" xsi:type="Relationship" source="do-0233" target="do-0243"/>
<connection identifier="cn-0256" relationshipRef="rel-126" xsi:type="Relationship" source="do-0233" target="do-0244"/>
<connection identifier="cn-0257" relationshipRef="rel-127" xsi:type="Relationship" source="do-0233" target="do-0245"/>
<connection identifier="cn-0258" relationshipRef="rel-128" xsi:type="Relationship" source="do-0233" target="do-0246"/>
<connection identifier="cn-0259" relationshipRef="rel-129" xsi:type="Relationship" source="do-0233" target="do-0247"/>
<connection identifier="cn-0235" relationshipRef="rel-027" xsi:type="Relationship" source="do-0234" target="do-0233"/>
<node identifier="do-0238" elementRef="ac-django" xsi:type="Element" x="210" y="150" w="170" h="55"/>
<node identifier="do-0240" elementRef="ac-eav" xsi:type="Element" x="400" y="150" w="170" h="55"/>
<node identifier="do-0242" elementRef="ac-flows" xsi:type="Element" x="590" y="150" w="170" h="55"/>
<node identifier="do-0244" elementRef="ac-iam" xsi:type="Element" x="780" y="150" w="170" h="55"/>
<node identifier="do-0246" elementRef="ac-inspections" xsi:type="Element" x="970" y="150" w="170" h="55"/>
<node identifier="do-0248" elementRef="ac-issues" xsi:type="Element" x="20" y="230" w="170" h="55"/>
<node identifier="do-0250" elementRef="ac-mapper" xsi:type="Element" x="210" y="230" w="170" h="55"/>
<node identifier="do-0252" elementRef="ac-message-hub" xsi:type="Element" x="400" y="230" w="170" h="55"/>
<node identifier="do-0254" elementRef="ac-notes" xsi:type="Element" x="590" y="230" w="170" h="55"/>
<node identifier="do-0256" elementRef="ac-pm" xsi:type="Element" x="780" y="230" w="170" h="55"/>
<node identifier="do-0258" elementRef="ac-system-log" xsi:type="Element" x="970" y="230" w="170" h="55"/>
<connection identifier="cn-0237" relationshipRef="rel-118" xsi:type="Relationship" source="do-0233" target="do-0236"/>
<connection identifier="cn-0239" relationshipRef="rel-119" xsi:type="Relationship" source="do-0233" target="do-0238"/>
<connection identifier="cn-0241" relationshipRef="rel-120" xsi:type="Relationship" source="do-0233" target="do-0240"/>
<connection identifier="cn-0243" relationshipRef="rel-121" xsi:type="Relationship" source="do-0233" target="do-0242"/>
<connection identifier="cn-0245" relationshipRef="rel-122" xsi:type="Relationship" source="do-0233" target="do-0244"/>
<connection identifier="cn-0247" relationshipRef="rel-123" xsi:type="Relationship" source="do-0233" target="do-0246"/>
<connection identifier="cn-0249" relationshipRef="rel-124" xsi:type="Relationship" source="do-0233" target="do-0248"/>
<connection identifier="cn-0251" relationshipRef="rel-125" xsi:type="Relationship" source="do-0233" target="do-0250"/>
<connection identifier="cn-0253" relationshipRef="rel-126" xsi:type="Relationship" source="do-0233" target="do-0252"/>
<connection identifier="cn-0255" relationshipRef="rel-127" xsi:type="Relationship" source="do-0233" target="do-0254"/>
<connection identifier="cn-0257" relationshipRef="rel-128" xsi:type="Relationship" source="do-0233" target="do-0256"/>
<connection identifier="cn-0259" relationshipRef="rel-129" xsi:type="Relationship" source="do-0233" target="do-0258"/>
<connection identifier="cn-0235" relationshipRef="rel-032" xsi:type="Relationship" source="do-0234" target="do-0233"/>
</view>
<view identifier="view-8" xsi:type="Diagram">
<name xml:lang="ru">T8. Потребители: Очередь сообщений AMQP</name>
<documentation xml:lang="ru">11 из 35 приложений контура. Связи выведены из манифестов apps/*/base и apps/*/d8-ugmk-prod.</documentation>
<documentation xml:lang="ru">11 из 35 приложений контура. Связи выведены из манифестов приложений.</documentation>
<node identifier="do-0260" elementRef="ts-amqp" xsi:type="Element" x="20" y="20" w="260" h="60"/>
<node identifier="do-0261" elementRef="ss-rabbit" xsi:type="Element" x="320" y="20" w="260" h="60"/>
<node identifier="do-0263" elementRef="ac-contracts" xsi:type="Element" x="20" y="150" w="170" h="55"/>
<node identifier="do-0264" elementRef="ac-django" xsi:type="Element" x="210" y="150" w="170" h="55"/>
<node identifier="do-0265" elementRef="ac-documentations" xsi:type="Element" x="400" y="150" w="170" h="55"/>
<node identifier="do-0266" elementRef="ac-flows" xsi:type="Element" x="590" y="150" w="170" h="55"/>
<node identifier="do-0267" elementRef="ac-issues" xsi:type="Element" x="780" y="150" w="170" h="55"/>
<node identifier="do-0268" elementRef="ac-mapper" xsi:type="Element" x="970" y="150" w="170" h="55"/>
<node identifier="do-0269" elementRef="ac-notes" xsi:type="Element" x="20" y="230" w="170" h="55"/>
<node identifier="do-0270" elementRef="ac-pm" xsi:type="Element" x="210" y="230" w="170" h="55"/>
<node identifier="do-0271" elementRef="ac-processing" xsi:type="Element" x="400" y="230" w="170" h="55"/>
<node identifier="do-0272" elementRef="ac-rfi" xsi:type="Element" x="590" y="230" w="170" h="55"/>
<node identifier="do-0273" elementRef="ac-transmittal" xsi:type="Element" x="780" y="230" w="170" h="55"/>
<connection identifier="cn-0274" relationshipRef="rel-130" xsi:type="Relationship" source="do-0260" target="do-0263"/>
<connection identifier="cn-0275" relationshipRef="rel-131" xsi:type="Relationship" source="do-0260" target="do-0264"/>
<connection identifier="cn-0276" relationshipRef="rel-132" xsi:type="Relationship" source="do-0260" target="do-0265"/>
<connection identifier="cn-0277" relationshipRef="rel-133" xsi:type="Relationship" source="do-0260" target="do-0266"/>
<connection identifier="cn-0278" relationshipRef="rel-134" xsi:type="Relationship" source="do-0260" target="do-0267"/>
<connection identifier="cn-0279" relationshipRef="rel-135" xsi:type="Relationship" source="do-0260" target="do-0268"/>
<connection identifier="cn-0280" relationshipRef="rel-136" xsi:type="Relationship" source="do-0260" target="do-0269"/>
<connection identifier="cn-0281" relationshipRef="rel-137" xsi:type="Relationship" source="do-0260" target="do-0270"/>
<connection identifier="cn-0282" relationshipRef="rel-138" xsi:type="Relationship" source="do-0260" target="do-0271"/>
<connection identifier="cn-0283" relationshipRef="rel-139" xsi:type="Relationship" source="do-0260" target="do-0272"/>
<connection identifier="cn-0284" relationshipRef="rel-140" xsi:type="Relationship" source="do-0260" target="do-0273"/>
<connection identifier="cn-0262" relationshipRef="rel-028" xsi:type="Relationship" source="do-0261" target="do-0260"/>
<node identifier="do-0265" elementRef="ac-django" xsi:type="Element" x="210" y="150" w="170" h="55"/>
<node identifier="do-0267" elementRef="ac-documentations" xsi:type="Element" x="400" y="150" w="170" h="55"/>
<node identifier="do-0269" elementRef="ac-flows" xsi:type="Element" x="590" y="150" w="170" h="55"/>
<node identifier="do-0271" elementRef="ac-issues" xsi:type="Element" x="780" y="150" w="170" h="55"/>
<node identifier="do-0273" elementRef="ac-mapper" xsi:type="Element" x="970" y="150" w="170" h="55"/>
<node identifier="do-0275" elementRef="ac-notes" xsi:type="Element" x="20" y="230" w="170" h="55"/>
<node identifier="do-0277" elementRef="ac-pm" xsi:type="Element" x="210" y="230" w="170" h="55"/>
<node identifier="do-0279" elementRef="ac-processing" xsi:type="Element" x="400" y="230" w="170" h="55"/>
<node identifier="do-0281" elementRef="ac-rfi" xsi:type="Element" x="590" y="230" w="170" h="55"/>
<node identifier="do-0283" elementRef="ac-transmittal" xsi:type="Element" x="780" y="230" w="170" h="55"/>
<connection identifier="cn-0264" relationshipRef="rel-130" xsi:type="Relationship" source="do-0260" target="do-0263"/>
<connection identifier="cn-0266" relationshipRef="rel-131" xsi:type="Relationship" source="do-0260" target="do-0265"/>
<connection identifier="cn-0268" relationshipRef="rel-132" xsi:type="Relationship" source="do-0260" target="do-0267"/>
<connection identifier="cn-0270" relationshipRef="rel-133" xsi:type="Relationship" source="do-0260" target="do-0269"/>
<connection identifier="cn-0272" relationshipRef="rel-134" xsi:type="Relationship" source="do-0260" target="do-0271"/>
<connection identifier="cn-0274" relationshipRef="rel-135" xsi:type="Relationship" source="do-0260" target="do-0273"/>
<connection identifier="cn-0276" relationshipRef="rel-136" xsi:type="Relationship" source="do-0260" target="do-0275"/>
<connection identifier="cn-0278" relationshipRef="rel-137" xsi:type="Relationship" source="do-0260" target="do-0277"/>
<connection identifier="cn-0280" relationshipRef="rel-138" xsi:type="Relationship" source="do-0260" target="do-0279"/>
<connection identifier="cn-0282" relationshipRef="rel-139" xsi:type="Relationship" source="do-0260" target="do-0281"/>
<connection identifier="cn-0284" relationshipRef="rel-140" xsi:type="Relationship" source="do-0260" target="do-0283"/>
<connection identifier="cn-0262" relationshipRef="rel-033" xsi:type="Relationship" source="do-0261" target="do-0260"/>
</view>
<view identifier="view-9" xsi:type="Diagram">
<name xml:lang="ru">T9. Потребители: Объектное хранилище</name>
<documentation xml:lang="ru">13 из 35 приложений контура. Связи выведены из манифестов apps/*/base и apps/*/d8-ugmk-prod.</documentation>
<documentation xml:lang="ru">13 из 35 приложений контура. Связи выведены из манифестов приложений.</documentation>
<node identifier="do-0285" elementRef="ts-object" xsi:type="Element" x="20" y="20" w="260" h="60"/>
<node identifier="do-0286" elementRef="nd-s3" xsi:type="Element" x="320" y="20" w="260" h="60"/>
<node identifier="do-0288" elementRef="ac-attachments" xsi:type="Element" x="20" y="150" w="170" h="55"/>
<node identifier="do-0289" elementRef="ac-contracts" xsi:type="Element" x="210" y="150" w="170" h="55"/>
<node identifier="do-0290" elementRef="ac-django" xsi:type="Element" x="400" y="150" w="170" h="55"/>
<node identifier="do-0291" elementRef="ac-documentations" xsi:type="Element" x="590" y="150" w="170" h="55"/>
<node identifier="do-0292" elementRef="ac-eav" xsi:type="Element" x="780" y="150" w="170" h="55"/>
<node identifier="do-0293" elementRef="ac-iam" xsi:type="Element" x="970" y="150" w="170" h="55"/>
<node identifier="do-0294" elementRef="ac-issues" xsi:type="Element" x="20" y="230" w="170" h="55"/>
<node identifier="do-0295" elementRef="ac-mapper" xsi:type="Element" x="210" y="230" w="170" h="55"/>
<node identifier="do-0296" elementRef="ac-message-hub" xsi:type="Element" x="400" y="230" w="170" h="55"/>
<node identifier="do-0297" elementRef="ac-notes" xsi:type="Element" x="590" y="230" w="170" h="55"/>
<node identifier="do-0298" elementRef="ac-pm" xsi:type="Element" x="780" y="230" w="170" h="55"/>
<node identifier="do-0299" elementRef="ac-rfi" xsi:type="Element" x="970" y="230" w="170" h="55"/>
<node identifier="do-0300" elementRef="ac-subscriptions" xsi:type="Element" x="20" y="310" w="170" h="55"/>
<connection identifier="cn-0301" relationshipRef="rel-141" xsi:type="Relationship" source="do-0285" target="do-0288"/>
<connection identifier="cn-0302" relationshipRef="rel-142" xsi:type="Relationship" source="do-0285" target="do-0289"/>
<connection identifier="cn-0303" relationshipRef="rel-143" xsi:type="Relationship" source="do-0285" target="do-0290"/>
<connection identifier="cn-0304" relationshipRef="rel-144" xsi:type="Relationship" source="do-0285" target="do-0291"/>
<connection identifier="cn-0305" relationshipRef="rel-145" xsi:type="Relationship" source="do-0285" target="do-0292"/>
<connection identifier="cn-0306" relationshipRef="rel-146" xsi:type="Relationship" source="do-0285" target="do-0293"/>
<connection identifier="cn-0307" relationshipRef="rel-147" xsi:type="Relationship" source="do-0285" target="do-0294"/>
<connection identifier="cn-0308" relationshipRef="rel-148" xsi:type="Relationship" source="do-0285" target="do-0295"/>
<connection identifier="cn-0309" relationshipRef="rel-149" xsi:type="Relationship" source="do-0285" target="do-0296"/>
<connection identifier="cn-0310" relationshipRef="rel-150" xsi:type="Relationship" source="do-0285" target="do-0297"/>
<connection identifier="cn-0311" relationshipRef="rel-151" xsi:type="Relationship" source="do-0285" target="do-0298"/>
<connection identifier="cn-0312" relationshipRef="rel-152" xsi:type="Relationship" source="do-0285" target="do-0299"/>
<connection identifier="cn-0313" relationshipRef="rel-153" xsi:type="Relationship" source="do-0285" target="do-0300"/>
<connection identifier="cn-0287" relationshipRef="rel-030" xsi:type="Relationship" source="do-0286" target="do-0285"/>
<node identifier="do-0290" elementRef="ac-contracts" xsi:type="Element" x="210" y="150" w="170" h="55"/>
<node identifier="do-0292" elementRef="ac-django" xsi:type="Element" x="400" y="150" w="170" h="55"/>
<node identifier="do-0294" elementRef="ac-documentations" xsi:type="Element" x="590" y="150" w="170" h="55"/>
<node identifier="do-0296" elementRef="ac-eav" xsi:type="Element" x="780" y="150" w="170" h="55"/>
<node identifier="do-0298" elementRef="ac-iam" xsi:type="Element" x="970" y="150" w="170" h="55"/>
<node identifier="do-0300" elementRef="ac-issues" xsi:type="Element" x="20" y="230" w="170" h="55"/>
<node identifier="do-0302" elementRef="ac-mapper" xsi:type="Element" x="210" y="230" w="170" h="55"/>
<node identifier="do-0304" elementRef="ac-message-hub" xsi:type="Element" x="400" y="230" w="170" h="55"/>
<node identifier="do-0306" elementRef="ac-notes" xsi:type="Element" x="590" y="230" w="170" h="55"/>
<node identifier="do-0308" elementRef="ac-pm" xsi:type="Element" x="780" y="230" w="170" h="55"/>
<node identifier="do-0310" elementRef="ac-rfi" xsi:type="Element" x="970" y="230" w="170" h="55"/>
<node identifier="do-0312" elementRef="ac-subscriptions" xsi:type="Element" x="20" y="310" w="170" h="55"/>
<connection identifier="cn-0289" relationshipRef="rel-141" xsi:type="Relationship" source="do-0285" target="do-0288"/>
<connection identifier="cn-0291" relationshipRef="rel-142" xsi:type="Relationship" source="do-0285" target="do-0290"/>
<connection identifier="cn-0293" relationshipRef="rel-143" xsi:type="Relationship" source="do-0285" target="do-0292"/>
<connection identifier="cn-0295" relationshipRef="rel-144" xsi:type="Relationship" source="do-0285" target="do-0294"/>
<connection identifier="cn-0297" relationshipRef="rel-145" xsi:type="Relationship" source="do-0285" target="do-0296"/>
<connection identifier="cn-0299" relationshipRef="rel-146" xsi:type="Relationship" source="do-0285" target="do-0298"/>
<connection identifier="cn-0301" relationshipRef="rel-147" xsi:type="Relationship" source="do-0285" target="do-0300"/>
<connection identifier="cn-0303" relationshipRef="rel-148" xsi:type="Relationship" source="do-0285" target="do-0302"/>
<connection identifier="cn-0305" relationshipRef="rel-149" xsi:type="Relationship" source="do-0285" target="do-0304"/>
<connection identifier="cn-0307" relationshipRef="rel-150" xsi:type="Relationship" source="do-0285" target="do-0306"/>
<connection identifier="cn-0309" relationshipRef="rel-151" xsi:type="Relationship" source="do-0285" target="do-0308"/>
<connection identifier="cn-0311" relationshipRef="rel-152" xsi:type="Relationship" source="do-0285" target="do-0310"/>
<connection identifier="cn-0313" relationshipRef="rel-153" xsi:type="Relationship" source="do-0285" target="do-0312"/>
<connection identifier="cn-0287" relationshipRef="rel-035" xsi:type="Relationship" source="do-0286" target="do-0285"/>
</view>
</diagrams>
</views>

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,69 @@
"""Строит матрицу «приложение -> используемый технологический сервис» для контура.
py scan_contour.py <имя-кластера> <выход.json>
Имя кластера директория в clusters/, например любая из перечисленных
в корневом CLAUDE.md. Сканируются только *.yaml в apps/<app>/base и
apps/<app>/<кластер>; документация (*.md) игнорируется, иначе прозаические
упоминания переменных дают ложные срабатывания.
"""
import re, pathlib, json, sys, io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8")
if len(sys.argv) != 3:
sys.exit(__doc__)
CLUSTER, OUT = sys.argv[1], pathlib.Path(sys.argv[2])
ROOT = pathlib.Path(__file__).resolve().parents[2]
kust = (ROOT / "clusters" / CLUSTER / "kustomization.yaml").read_text(encoding="utf-8")
apps = sorted(set(re.findall(r"\.\./\.\./apps/([a-z0-9-]+)/" + re.escape(CLUSTER), kust)))
if not apps:
sys.exit(f"в clusters/{CLUSTER}/kustomization.yaml не найдено ни одного приложения")
MARKERS = {
"postgres": [r"POSTGRES_[A-Z]", r"DB__HOST", r"postgresql\.postgresql\.svc",
r"secrets/data/apps/[a-z0-9-]+/postgres"],
"rabbitmq": [r"RABBITMQ", r"AMQP__", r"rabbitmq\.rabbitmq\.svc"],
"kafka": [r"KAFKA", r"kafka\.kafka\.svc", r"BOOTSTRAP_SERVERS"],
"camunda": [r"ZEEBE", r"CAMUNDA"],
"s3": [r"S3__", r"S3_ENDPOINT", r"S3_ACCESS", r"S3_BUCKET"],
"redis": [r"REDIS_HOST", r"REDIS__", r"redis\.[a-z-]+\.svc"],
"vault": [r"vault\.hashicorp\.com/agent-inject"],
"oidc": [r"ZITADEL", r"JWKS", r"OIDC", r"jwt-public"],
}
def scan(app):
blob = []
for sub in ("base", CLUSTER):
d = ROOT / "apps" / app / sub
if d.is_dir():
blob += [f.read_text(encoding="utf-8", errors="replace") for f in d.rglob("*.yaml")]
blob = "\n".join(blob)
return {svc: any(re.search(p, blob) for p in pats) for svc, pats in MARKERS.items()}
matrix = {a: scan(a) for a in apps}
istio_path = ROOT / "infrastructure" / "istio-config" / CLUSTER / "istio-config.yaml"
exposed_ns = []
if istio_path.is_file():
raw = istio_path.read_text(encoding="utf-8")
body = "\n".join(l for l in raw.splitlines() if not l.lstrip().startswith("#"))
exposed_ns = sorted({ns for _, ns in re.findall(r"service:\s*([a-z0-9-]+)\.([a-z0-9-]+)\.svc", body)})
hdr = ["app"] + list(MARKERS) + ["istio"]
print(f"приложений: {len(apps)}\n")
print(" | ".join(h.ljust(9) for h in hdr))
print("-" * 112)
for app, row in matrix.items():
cells = [app.ljust(17)] + ["+".ljust(9) if row[s] else "".ljust(9) for s in MARKERS]
cells.append("+".ljust(9) if app in exposed_ns else "".ljust(9))
print(" | ".join(cells))
print("\nпотребителей на сервис:")
for s in MARKERS:
print(f" {s:10s} {sum(1 for r in matrix.values() if r[s]):2d}")
print(f" {'istio':10s} {len([a for a in apps if a in exposed_ns]):2d}")
OUT.write_text(json.dumps({"apps": apps, "matrix": matrix, "exposed": exposed_ns},
ensure_ascii=False, indent=2), encoding="utf-8")
print(f"\nзаписано: {OUT}")

View File

@ -1,69 +0,0 @@
"""Собирает матрицу «приложение UGMK -> используемый технологический сервис»
из манифестов base + d8-ugmk-prod. Только *.yaml, документацию не читаем."""
import re, pathlib, json, sys, io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8")
ROOT = pathlib.Path(r"C:\Users\user\PycharmProjects\infra\iac")
CLUSTER = "d8-ugmk-prod"
# 1. какие приложения подключены к кластеру
kust = (ROOT / "clusters" / CLUSTER / "kustomization.yaml").read_text(encoding="utf-8")
apps = sorted(set(re.findall(r"\.\./\.\./apps/([a-z0-9-]+)/" + CLUSTER, kust)))
# 2. маркеры использования технологических сервисов
MARKERS = {
"postgres": [r"POSTGRES_[A-Z]", r"DB__HOST", r"postgresql\.postgresql\.svc",
r"secrets/data/apps/[a-z0-9-]+/postgres"],
"rabbitmq": [r"RABBITMQ", r"AMQP__", r"rabbitmq\.rabbitmq\.svc"],
"kafka": [r"KAFKA", r"kafka\.kafka\.svc", r"BOOTSTRAP_SERVERS"],
"camunda": [r"ZEEBE", r"CAMUNDA"],
"s3": [r"S3__", r"S3_ENDPOINT", r"S3_ACCESS", r"S3_BUCKET"],
"redis": [r"REDIS_HOST", r"REDIS__", r"redis\.[a-z-]+\.svc"],
"vault": [r"vault\.hashicorp\.com/agent-inject"],
"oidc": [r"ZITADEL", r"JWKS", r"OIDC", r"jwt-public"],
}
def scan(app):
text = []
for sub in ("base", CLUSTER):
d = ROOT / "apps" / app / sub
if not d.is_dir():
continue
for f in d.rglob("*.yaml"):
text.append(f.read_text(encoding="utf-8", errors="replace"))
blob = "\n".join(text)
return {svc: any(re.search(p, blob) for p in pats) for svc, pats in MARKERS.items()}
matrix = {app: scan(app) for app in apps}
# 3. кто опубликован наружу через istio (destination host -> namespace)
istio_raw = (ROOT / "infrastructure" / "istio-config" / CLUSTER / "istio-config.yaml").read_text(encoding="utf-8")
# закомментированные маршруты не считаем развёрнутыми
istio = "\n".join(l for l in istio_raw.splitlines() if not l.lstrip().startswith("#"))
exposed = sorted(set(re.findall(r"service:\s*([a-z0-9-]+)\.([a-z0-9-]+)\.svc", istio)))
exposed_ns = sorted({ns for _, ns in exposed})
print("ПРИЛОЖЕНИЙ В КОНТУРЕ:", len(apps))
print()
hdr = ["app"] + list(MARKERS) + ["istio"]
print(" | ".join(h.ljust(9) for h in hdr))
print("-" * 110)
for app, row in matrix.items():
cells = [app.ljust(9)] + ["+".ljust(9) if row[s] else "".ljust(9) for s in MARKERS]
cells.append("+".ljust(9) if app in exposed_ns else "".ljust(9))
print(" | ".join(cells))
print()
print("ИТОГО потребителей на сервис:")
for s in MARKERS:
n = sum(1 for r in matrix.values() if r[s])
print(f" {s:10s} {n:2d}")
print(f" {'istio':10s} {len([a for a in apps if a in exposed_ns]):2d}")
print()
print("namespace, опубликованные через istio:", ", ".join(exposed_ns))
print()
print("ВСЕГО SERVING-СВЯЗЕЙ:", sum(sum(r.values()) for r in matrix.values()) + len([a for a in apps if a in exposed_ns]))
(pathlib.Path(sys.argv[1] if len(sys.argv) > 1 else "matrix.json")).write_text(
json.dumps({"apps": apps, "matrix": matrix, "exposed": exposed_ns}, ensure_ascii=False, indent=2),
encoding="utf-8")