Add Archimate model generation scripts, data, and HTML preview for UGMK technology layer

This commit is contained in:
emelinda 2026-08-20 13:06:32 +03:00
parent 390cf969d6
commit dab050c6ed
9 changed files with 3047 additions and 0 deletions

View File

@ -0,0 +1,94 @@
# Модель архитектуры в нотации ArchiMate
Модель контура **УГМК** (`d8-ugmk-prod`) в двух форматах — содержимое одинаковое:
| Файл | Формат | Чем открывать |
|---|---|---|
| `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 |
| `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 |
Разбиение на представления по сервисам сделано осознанно: все 118 связей «сервис → приложение» на одной схеме нечитаемы. В модели они лежат одним набором, представления — это срезы.
Метамодель намеренно урезана. Технологический слой: `Node`, `SystemSoftware`, `TechnologyService`, `Artifact`. Прикладной: `ApplicationComponent`. Отношения: `Composition`, `Realization`, `Serving`, `Assignment`. Не используются `Device`, `Path`, `CommunicationNetwork`, `TechnologyFunction` — в этом контуре они не несут информации.
## Откуда взяты связи
Не нарисованы от руки. Выведены из манифестов, поэтому проверяемы:
| Связь | Источник |
|---|---|
| Состав кластера | `clusters/d8-ugmk-prod/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` |
| Приложение → S3 | env `S3__*`, `S3_ENDPOINT`, `S3_ACCESS`, `S3_BUCKET` |
| Приложение → 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` (закомментированные не считаются) |
Сканируются `*.yaml` в `apps/<app>/base/` и `apps/<app>/d8-ugmk-prod/`; документация (`*.md`) игнорируется, иначе прозаические упоминания переменных дают ложные срабатывания.
## Что вскрылось при построении
- **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 в контуре не разворачивается.
## Скрипты
`scan_ugmk.py` — строит матрицу «приложение → технологический сервис» и кладёт в `matrix.json`. Полезен, когда состав контура изменился: перезапустить и сравнить.
```
py scan_ugmk.py matrix.json
```
`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`.

View File

@ -0,0 +1,255 @@
"""Собирает .archimate (формат Archi 5) для технологического слоя контура УГМК."""
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])
elements = [] # (folder, id, type, name, doc)
relations = [] # (id, type, src, tgt)
_rc = [0]
def el(folder, eid, etype, name, doc=""):
elements.append((folder, eid, etype, name, doc)); return eid
def rel(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)]
# ---------------------------------------------------------------- технологический слой
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) и образов контейнеров.")
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)
CAMUNDA_SUB = ["Zeebe", "Zeebe Gateway", "Operate", "Tasklist", "Optimize", "Identity", "Connectors"]
cam_ids = []
for n in CAMUNDA_SUB:
cid = "ss-cam-" + n.lower().replace(" ", "-")
el(T, cid, "SystemSoftware", n, "infrastructure/camunda/d8-ugmk-prod/camunda.yaml")
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)
# технологические сервисы: 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)
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)
# ---------------------------------------------------------------- прикладной слой
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/")
consumers = {}
for tid, _, _, key in TS:
if key is None:
consumers[tid] = []; 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
for a in lst:
R("Serving", tid, app_id[a])
# ---------------------------------------------------------------- представления
views = []
def view(name, doc=""):
v = {"id": f"view-{len(views)+1}", "name": name, "doc": doc, "objects": [], "conns": []}
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):
key = (rtype, so["el"], to["el"])
if key not in REL_INDEX:
raise KeyError(f"нет отношения в модели: {key}")
_oc[0] += 1
cid = f"cn-{_oc[0]:04d}"
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)
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[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):
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"])
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)
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)
# --- T2..T9: потребители каждого сервиса
PER_ROW = 6
for tid, tname, realizers, key in TS:
lst = consumers[tid]
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 = []
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)
# ---------------------------------------------------------------- сериализация
FOLDERS = [("Strategy", "strategy"), ("Business", "business"), ("Application", "application"),
("Technology & Physical", "technology"), ("Motivation", "motivation"),
("Implementation & Migration", "implementation_migration"), ("Other", "other"),
("Relations", "relations"), ("Views", "diagrams")]
def emit_obj(o, ind):
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"]:
s += (f'{p} <sourceConnection xsi:type="archimate:Connection" id="{c["id"]}" '
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
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>']
for fname, ftype in FOLDERS:
inner = ""
if ftype in ("technology", "application"):
for folder, eid, etype, name, doc in elements:
if folder != ftype:
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')
else:
inner += f' <element xsi:type="archimate:{etype}" name={quoteattr(name)} id="{eid}"/>\n'
elif ftype == "relations":
for rid, rtype, src, tgt in relations:
inner += (f' <element xsi:type="archimate:{rtype}Relationship" id="{rid}" '
f'source="{src}" target="{tgt}"/>\n')
elif ftype == "diagrams":
for v in views:
inner += f' <element xsi:type="archimate:ArchimateDiagramModel" name={quoteattr(v["name"])} id="{v["id"]}">\n'
if v["doc"]:
inner += f' <documentation>{escape(v["doc"])}</documentation>\n'
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('</archimate:model>')
OUT.write_text("\n".join(out) + "\n", encoding="utf-8")
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} объектов)")

View File

@ -0,0 +1,417 @@
{
"apps": [
"attachments",
"auth-flow",
"bim",
"cde",
"checklists",
"comparisons",
"contracts",
"control-interface",
"cross-section",
"django",
"document-link",
"documentations",
"drawings",
"eav",
"faas",
"flows",
"iam",
"inspections",
"issues",
"mapper",
"measurements",
"message-hub",
"notes",
"pm",
"prescriptions",
"processing",
"projects",
"remarks",
"reviews",
"rfi",
"stamp-verification",
"subscriptions",
"system-log",
"transmittal",
"workspaces"
],
"matrix": {
"attachments": {
"postgres": true,
"rabbitmq": false,
"kafka": false,
"camunda": false,
"s3": true,
"redis": false,
"vault": true,
"oidc": false
},
"auth-flow": {
"postgres": false,
"rabbitmq": false,
"kafka": false,
"camunda": false,
"s3": false,
"redis": false,
"vault": false,
"oidc": false
},
"bim": {
"postgres": true,
"rabbitmq": false,
"kafka": false,
"camunda": false,
"s3": false,
"redis": false,
"vault": true,
"oidc": false
},
"cde": {
"postgres": false,
"rabbitmq": false,
"kafka": false,
"camunda": false,
"s3": false,
"redis": false,
"vault": true,
"oidc": false
},
"checklists": {
"postgres": true,
"rabbitmq": false,
"kafka": false,
"camunda": false,
"s3": false,
"redis": false,
"vault": true,
"oidc": true
},
"comparisons": {
"postgres": true,
"rabbitmq": false,
"kafka": false,
"camunda": false,
"s3": false,
"redis": false,
"vault": true,
"oidc": true
},
"contracts": {
"postgres": true,
"rabbitmq": true,
"kafka": true,
"camunda": false,
"s3": true,
"redis": false,
"vault": true,
"oidc": true
},
"control-interface": {
"postgres": false,
"rabbitmq": false,
"kafka": false,
"camunda": false,
"s3": false,
"redis": false,
"vault": false,
"oidc": false
},
"cross-section": {
"postgres": false,
"rabbitmq": false,
"kafka": false,
"camunda": false,
"s3": false,
"redis": false,
"vault": false,
"oidc": false
},
"django": {
"postgres": true,
"rabbitmq": true,
"kafka": true,
"camunda": false,
"s3": true,
"redis": true,
"vault": true,
"oidc": true
},
"document-link": {
"postgres": false,
"rabbitmq": false,
"kafka": false,
"camunda": false,
"s3": false,
"redis": false,
"vault": false,
"oidc": false
},
"documentations": {
"postgres": true,
"rabbitmq": true,
"kafka": false,
"camunda": false,
"s3": true,
"redis": false,
"vault": true,
"oidc": true
},
"drawings": {
"postgres": true,
"rabbitmq": false,
"kafka": false,
"camunda": false,
"s3": false,
"redis": false,
"vault": true,
"oidc": false
},
"eav": {
"postgres": true,
"rabbitmq": false,
"kafka": true,
"camunda": false,
"s3": true,
"redis": false,
"vault": true,
"oidc": true
},
"faas": {
"postgres": false,
"rabbitmq": false,
"kafka": false,
"camunda": false,
"s3": false,
"redis": false,
"vault": false,
"oidc": false
},
"flows": {
"postgres": true,
"rabbitmq": true,
"kafka": true,
"camunda": false,
"s3": false,
"redis": false,
"vault": true,
"oidc": true
},
"iam": {
"postgres": true,
"rabbitmq": false,
"kafka": true,
"camunda": false,
"s3": true,
"redis": false,
"vault": true,
"oidc": true
},
"inspections": {
"postgres": true,
"rabbitmq": false,
"kafka": true,
"camunda": false,
"s3": false,
"redis": false,
"vault": true,
"oidc": false
},
"issues": {
"postgres": true,
"rabbitmq": true,
"kafka": true,
"camunda": false,
"s3": true,
"redis": false,
"vault": true,
"oidc": true
},
"mapper": {
"postgres": true,
"rabbitmq": true,
"kafka": true,
"camunda": false,
"s3": true,
"redis": false,
"vault": true,
"oidc": false
},
"measurements": {
"postgres": false,
"rabbitmq": false,
"kafka": false,
"camunda": false,
"s3": false,
"redis": false,
"vault": true,
"oidc": false
},
"message-hub": {
"postgres": true,
"rabbitmq": false,
"kafka": true,
"camunda": false,
"s3": true,
"redis": true,
"vault": true,
"oidc": false
},
"notes": {
"postgres": true,
"rabbitmq": true,
"kafka": true,
"camunda": false,
"s3": true,
"redis": false,
"vault": true,
"oidc": false
},
"pm": {
"postgres": true,
"rabbitmq": true,
"kafka": true,
"camunda": false,
"s3": true,
"redis": true,
"vault": true,
"oidc": false
},
"prescriptions": {
"postgres": false,
"rabbitmq": false,
"kafka": false,
"camunda": false,
"s3": false,
"redis": false,
"vault": false,
"oidc": false
},
"processing": {
"postgres": true,
"rabbitmq": true,
"kafka": false,
"camunda": false,
"s3": false,
"redis": false,
"vault": true,
"oidc": true
},
"projects": {
"postgres": false,
"rabbitmq": false,
"kafka": false,
"camunda": false,
"s3": false,
"redis": false,
"vault": false,
"oidc": false
},
"remarks": {
"postgres": false,
"rabbitmq": false,
"kafka": false,
"camunda": false,
"s3": false,
"redis": false,
"vault": false,
"oidc": false
},
"reviews": {
"postgres": false,
"rabbitmq": false,
"kafka": false,
"camunda": false,
"s3": false,
"redis": false,
"vault": false,
"oidc": false
},
"rfi": {
"postgres": true,
"rabbitmq": true,
"kafka": false,
"camunda": false,
"s3": true,
"redis": false,
"vault": true,
"oidc": false
},
"stamp-verification": {
"postgres": false,
"rabbitmq": false,
"kafka": false,
"camunda": false,
"s3": false,
"redis": false,
"vault": false,
"oidc": false
},
"subscriptions": {
"postgres": true,
"rabbitmq": false,
"kafka": false,
"camunda": false,
"s3": true,
"redis": false,
"vault": true,
"oidc": false
},
"system-log": {
"postgres": true,
"rabbitmq": false,
"kafka": true,
"camunda": false,
"s3": false,
"redis": false,
"vault": true,
"oidc": false
},
"transmittal": {
"postgres": true,
"rabbitmq": true,
"kafka": false,
"camunda": false,
"s3": false,
"redis": false,
"vault": true,
"oidc": false
},
"workspaces": {
"postgres": true,
"rabbitmq": false,
"kafka": false,
"camunda": false,
"s3": false,
"redis": false,
"vault": true,
"oidc": false
}
},
"exposed": [
"auth-flow",
"bim",
"camunda",
"cde",
"checklists",
"control-interface",
"django",
"document-link",
"documentations",
"eav",
"flows",
"iam",
"inspections",
"issues",
"pm",
"processing",
"rabbitmq",
"remarks",
"reviews",
"rfi",
"stamp-verification",
"transmittal",
"workspaces",
"zitadel"
]
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,157 @@
"""Рендерит представления из .archimate в один самодостаточный HTML со встроенным SVG.
Нужен, чтобы схемы можно было посмотреть без установки Archi."""
import sys, io, pathlib, html
import xml.etree.ElementTree as ET
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8")
XSI = "{http://www.w3.org/2001/XMLSchema-instance}type"
src, dst = pathlib.Path(sys.argv[1]), pathlib.Path(sys.argv[2])
root = ET.parse(src).getroot()
LAYER = { # цвета Archi по слоям
"ApplicationComponent": "#B5FFFF", "ApplicationService": "#B5FFFF",
"Node": "#C9E7B7", "SystemSoftware": "#C9E7B7",
"TechnologyService": "#C9E7B7", "Artifact": "#C9E7B7",
}
STROKE = {"Application": "#2a7f8f", "Technology": "#4a7f3a"}
concepts, rels = {}, {}
for folder in root.findall("folder"):
for e in folder.findall("element"):
et = (e.get(XSI) or "").split(":")[-1]
if et.endswith("Relationship"):
rels[e.get("id")] = (et[:-len("Relationship")], e.get("source"), e.get("target"))
elif et != "ArchimateDiagramModel":
concepts[e.get("id")] = (et, e.get("name") or "")
def collect(node, ox, oy, nodes, conns):
b = node.find("bounds")
x, y = ox + int(b.get("x", 0)), oy + int(b.get("y", 0))
w, h = int(b.get("width", 120)), int(b.get("height", 55))
nodes[node.get("id")] = (node.get("archimateElement"), x, y, w, h)
for c in node.findall("sourceConnection"):
conns.append((c.get("relationship"), c.get("source"), c.get("target")))
for ch in node.findall("child"):
collect(ch, x, y, nodes, conns)
def wrap(s, width):
out, line = [], ""
for word in s.split():
if len(line) + len(word) + 1 > width and line:
out.append(line); line = word
else:
line = f"{line} {word}".strip()
if line:
out.append(line)
return out[:4]
def edge_point(x, y, w, h, tx, ty):
"""Точка пересечения луча к (tx,ty) с границей прямоугольника."""
cx, cy = x + w / 2, y + h / 2
dx, dy = tx - cx, ty - cy
if dx == 0 and dy == 0:
return cx, cy
sx = (w / 2) / abs(dx) if dx else float("inf")
sy = (h / 2) / abs(dy) if dy else float("inf")
s = min(sx, sy)
return cx + dx * s, cy + dy * s
MARKERS = """
<defs>
<marker id="open" markerWidth="12" markerHeight="12" refX="10" refY="4" orient="auto">
<path d="M0,0 L10,4 L0,8" fill="none" stroke="#555" stroke-width="1.4"/></marker>
<marker id="hollow" markerWidth="14" markerHeight="14" refX="11" refY="5" orient="auto">
<path d="M0,0 L11,5 L0,10 Z" fill="#fff" stroke="#555" stroke-width="1.2"/></marker>
<marker id="filled" markerWidth="12" markerHeight="12" refX="10" refY="4" orient="auto">
<path d="M0,0 L10,4 L0,8 Z" fill="#555"/></marker>
<marker id="diamond" markerWidth="16" markerHeight="12" refX="1" refY="5" orient="auto">
<path d="M0,5 L6,1 L13,5 L6,9 Z" fill="#555"/></marker>
<marker id="ball" markerWidth="10" markerHeight="10" refX="2" refY="5" orient="auto">
<circle cx="4" cy="5" r="3.2" fill="#555"/></marker>
</defs>"""
STYLE = {
"Serving": ('stroke-dasharray="none"', 'marker-end="url(#open)"', ""),
"Realization": ('stroke-dasharray="6,4"', 'marker-end="url(#hollow)"', ""),
"Composition": ('stroke-dasharray="none"', "", 'marker-start="url(#diamond)"'),
"Assignment": ('stroke-dasharray="none"', 'marker-end="url(#filled)"', 'marker-start="url(#ball)"'),
}
parts = []
views = [e for f in root.findall("folder") for e in f.findall("element")
if (e.get(XSI) or "").endswith("ArchimateDiagramModel")]
for v in views:
nodes, conns = {}, []
for ch in v.findall("child"):
collect(ch, 0, 0, nodes, conns)
if not nodes:
continue
maxx = max(x + w for _, x, _, w, _ in nodes.values()) + 40
maxy = max(y + h for _, _, y, _, h in nodes.values()) + 40
svg = [f'<svg viewBox="0 0 {maxx} {maxy}" xmlns="http://www.w3.org/2000/svg" '
f'font-family="system-ui, sans-serif">', MARKERS]
# связи под блоками
for rid, so, to in conns:
if so not in nodes or to not in nodes or rid not in rels:
continue
rtype = rels[rid][0]
_, sx, sy, sw, sh = nodes[so]
_, tx, ty, tw, th = nodes[to]
x1, y1 = edge_point(sx, sy, sw, sh, tx + tw / 2, ty + th / 2)
x2, y2 = edge_point(tx, ty, tw, th, sx + sw / 2, sy + sh / 2)
dash, mend, mstart = STYLE.get(rtype, ('stroke-dasharray="none"', 'marker-end="url(#open)"', ""))
svg.append(f'<line x1="{x1:.0f}" y1="{y1:.0f}" x2="{x2:.0f}" y2="{y2:.0f}" '
f'stroke="#555" stroke-width="1.3" opacity="0.75" {dash} {mend} {mstart}/>')
# блоки: контейнеры раньше содержимого — сортируем по площади убыв.
for nid, (eref, x, y, w, h) in sorted(nodes.items(), key=lambda kv: -kv[1][3] * kv[1][4]):
etype, name = concepts.get(eref, ("", eref or "?"))
fill = LAYER.get(etype, "#EEEEEE")
stroke = STROKE["Application"] if etype.startswith("Application") else STROKE["Technology"]
big = w * h > 60000
svg.append(f'<rect x="{x}" y="{y}" width="{w}" height="{h}" rx="4" fill="{fill}" '
f'fill-opacity="{0.35 if big else 1}" stroke="{stroke}" stroke-width="1.2"/>')
lines = wrap(name, max(12, w // 7))
if big: # подпись контейнера — сверху слева
svg.append(f'<text x="{x+10}" y="{y+20}" font-size="13" font-weight="600" '
f'fill="#1a3a1a">{html.escape(name)}</text>')
else:
fs = 11 if len(lines) > 2 else 12
y0 = y + h / 2 - (len(lines) - 1) * fs * 0.62
for i, ln in enumerate(lines):
svg.append(f'<text x="{x + w/2}" y="{y0 + i*fs*1.25:.0f}" font-size="{fs}" '
f'text-anchor="middle" dominant-baseline="middle" fill="#111">'
f'{html.escape(ln)}</text>')
svg.append("</svg>")
doc = v.find("documentation")
parts.append(f'<section><h2>{html.escape(v.get("name") or "")}</h2>'
+ (f'<p class="doc">{html.escape(doc.text)}</p>' if doc is not None and doc.text else "")
+ "".join(svg) + "</section>")
page = f"""<!doctype html>
<html lang="ru"><meta charset="utf-8">
<title>{html.escape(root.get('name') or 'Модель')}</title>
<style>
body {{ font-family: system-ui, sans-serif; margin: 0 auto; padding: 24px; max-width: 1760px;
background:#fafafa; color:#111; }}
h1 {{ font-size: 22px; }} h2 {{ font-size: 16px; margin: 32px 0 4px; }}
.doc {{ color:#555; font-size:13px; margin:0 0 10px; max-width:900px; }}
section {{ background:#fff; border:1px solid #ddd; border-radius:6px; padding:14px; margin-bottom:18px;
overflow-x:auto; }}
svg {{ width:100%; height:auto; min-width:700px; }}
.legend {{ font-size:13px; color:#444; }}
.legend code {{ background:#eee; padding:1px 5px; border-radius:3px; }}
</style>
<h1>{html.escape(root.get('name') or '')}</h1>
<p class="legend">Автогенерация из <code>ugmk-technology.archimate</code>. Зелёный технологический слой,
голубой прикладной. Пунктир с полым треугольником realization, стрелка serving,
ромб composition, линия с шариком assignment.</p>
{''.join(parts)}
</html>"""
dst.write_text(page, encoding="utf-8", newline="\n")
print(f"записано: {dst} ({len(parts)} представлений)")

View File

@ -0,0 +1,69 @@
"""Собирает матрицу «приложение 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")

View File

@ -0,0 +1,106 @@
"""Конвертирует нативный .archimate (формат Archi) в The Open Group
ArchiMate Model Exchange File Format его понимают сторонние инструменты.
Вложенность узлов на схемах разворачивается в плоский список с абсолютными
координатами: в обменном формате трактовка координат вложенных узлов
неоднозначна, а плоская раскладка даёт одинаковый результат везде.
Контейнер выводится раньше содержимого, поэтому визуально вложенность
сохраняется.
"""
import sys, io, pathlib
import xml.etree.ElementTree as ET
from xml.sax.saxutils import escape, quoteattr
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8")
XSI = "{http://www.w3.org/2001/XMLSchema-instance}type"
NS = "http://www.opengroup.org/xsd/archimate/3.0/"
src, dst = pathlib.Path(sys.argv[1]), pathlib.Path(sys.argv[2])
root = ET.parse(src).getroot()
def t(e):
return (e.get(XSI) or "").split(":")[-1]
def text(e, tag):
c = e.find(tag)
return c.text if c is not None and c.text else ""
elements, relationships, views = [], [], []
for folder in root.findall("folder"):
ftype = folder.get("type")
for e in folder.findall("element"):
et = t(e)
if ftype == "diagrams":
views.append(e)
elif et.endswith("Relationship"):
relationships.append((e.get("id"), et[:-len("Relationship")],
e.get("source"), e.get("target")))
else:
elements.append((e.get("id"), et, e.get("name") or "", text(e, "documentation")))
def flatten(node, ox=0, oy=0, out=None, conns=None):
"""Возвращает плоский список узлов с абсолютными координатами и соединения."""
out = [] if out is None else out
conns = [] if conns is None else conns
b = node.find("bounds")
x = ox + int(b.get("x", 0)); y = oy + int(b.get("y", 0))
out.append((node.get("id"), node.get("archimateElement"),
x, y, int(b.get("width", 120)), int(b.get("height", 55))))
for c in node.findall("sourceConnection"):
conns.append((c.get("id"), c.get("relationship"),
c.get("source"), c.get("target")))
for ch in node.findall("child"):
flatten(ch, x, y, out, conns)
return out, conns
out = ['<?xml version="1.0" encoding="UTF-8"?>',
f'<model xmlns="{NS}" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"',
f' xsi:schemaLocation="{NS} https://www.opengroup.org/xsd/archimate/3.1/archimate3_Diagram.xsd"',
f' identifier="{root.get("id")}">',
f' <name xml:lang="ru">{escape(root.get("name") or "model")}</name>']
purpose = root.find("purpose")
if purpose is not None and purpose.text:
out.append(f' <documentation xml:lang="ru">{escape(purpose.text)}</documentation>')
out.append(" <elements>")
for eid, etype, name, doc in elements:
out.append(f' <element identifier="{eid}" xsi:type="{etype}">')
out.append(f' <name xml:lang="ru">{escape(name)}</name>')
if doc:
out.append(f' <documentation xml:lang="ru">{escape(doc)}</documentation>')
out.append(" </element>")
out.append(" </elements>")
out.append(" <relationships>")
for rid, rtype, s, tg in relationships:
out.append(f' <relationship identifier="{rid}" source="{s}" target="{tg}" xsi:type="{rtype}"/>')
out.append(" </relationships>")
out.append(" <views>")
out.append(" <diagrams>")
for v in views:
out.append(f' <view identifier="{v.get("id")}" xsi:type="Diagram">')
out.append(f' <name xml:lang="ru">{escape(v.get("name") or "")}</name>')
doc = text(v, "documentation")
if doc:
out.append(f' <documentation xml:lang="ru">{escape(doc)}</documentation>')
nodes, conns = [], []
for child in v.findall("child"):
flatten(child, 0, 0, nodes, conns)
for nid, eref, x, y, w, h in nodes:
out.append(f' <node identifier="{nid}" elementRef="{eref}" xsi:type="Element" '
f'x="{x}" y="{y}" w="{w}" h="{h}"/>')
for cid, rref, s, tg in conns:
out.append(f' <connection identifier="{cid}" relationshipRef="{rref}" '
f'xsi:type="Relationship" source="{s}" target="{tg}"/>')
out.append(" </view>")
out.append(" </diagrams>")
out.append(" </views>")
out.append("</model>")
dst.write_text("\n".join(out) + "\n", encoding="utf-8", newline="\n")
print(f"записано: {dst}")
print(f" элементов: {len(elements)}")
print(f" отношений: {len(relationships)}")
print(f" представлений: {len(views)}")

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,785 @@
<?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>
<elements>
<element identifier="ac-attachments" xsi:type="ApplicationComponent">
<name xml:lang="ru">attachments</name>
<documentation xml:lang="ru">apps/attachments/d8-ugmk-prod/</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>
</element>
<element identifier="ac-bim" xsi:type="ApplicationComponent">
<name xml:lang="ru">bim</name>
<documentation xml:lang="ru">apps/bim/d8-ugmk-prod/</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>
</element>
<element identifier="ac-checklists" xsi:type="ApplicationComponent">
<name xml:lang="ru">checklists</name>
<documentation xml:lang="ru">apps/checklists/d8-ugmk-prod/</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>
</element>
<element identifier="ac-contracts" xsi:type="ApplicationComponent">
<name xml:lang="ru">contracts</name>
<documentation xml:lang="ru">apps/contracts/d8-ugmk-prod/</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>
</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>
</element>
<element identifier="ac-django" xsi:type="ApplicationComponent">
<name xml:lang="ru">django</name>
<documentation xml:lang="ru">apps/django/d8-ugmk-prod/</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>
</element>
<element identifier="ac-documentations" xsi:type="ApplicationComponent">
<name xml:lang="ru">documentations</name>
<documentation xml:lang="ru">apps/documentations/d8-ugmk-prod/</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>
</element>
<element identifier="ac-eav" xsi:type="ApplicationComponent">
<name xml:lang="ru">eav</name>
<documentation xml:lang="ru">apps/eav/d8-ugmk-prod/</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>
</element>
<element identifier="ac-flows" xsi:type="ApplicationComponent">
<name xml:lang="ru">flows</name>
<documentation xml:lang="ru">apps/flows/d8-ugmk-prod/</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>
</element>
<element identifier="ac-inspections" xsi:type="ApplicationComponent">
<name xml:lang="ru">inspections</name>
<documentation xml:lang="ru">apps/inspections/d8-ugmk-prod/</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>
</element>
<element identifier="ac-mapper" xsi:type="ApplicationComponent">
<name xml:lang="ru">mapper</name>
<documentation xml:lang="ru">apps/mapper/d8-ugmk-prod/</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>
</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>
</element>
<element identifier="ac-notes" xsi:type="ApplicationComponent">
<name xml:lang="ru">notes</name>
<documentation xml:lang="ru">apps/notes/d8-ugmk-prod/</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>
</element>
<element identifier="ac-prescriptions" xsi:type="ApplicationComponent">
<name xml:lang="ru">prescriptions</name>
<documentation xml:lang="ru">apps/prescriptions/d8-ugmk-prod/</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>
</element>
<element identifier="ac-projects" xsi:type="ApplicationComponent">
<name xml:lang="ru">projects</name>
<documentation xml:lang="ru">apps/projects/d8-ugmk-prod/</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>
</element>
<element identifier="ac-reviews" xsi:type="ApplicationComponent">
<name xml:lang="ru">reviews</name>
<documentation xml:lang="ru">apps/reviews/d8-ugmk-prod/</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>
</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>
</element>
<element identifier="ac-subscriptions" xsi:type="ApplicationComponent">
<name xml:lang="ru">subscriptions</name>
<documentation xml:lang="ru">apps/subscriptions/d8-ugmk-prod/</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>
</element>
<element identifier="ac-transmittal" xsi:type="ApplicationComponent">
<name xml:lang="ru">transmittal</name>
<documentation xml:lang="ru">apps/transmittal/d8-ugmk-prod/</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>
</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>
</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>
</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>
</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>
</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>
</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>
</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>
</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>
</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>
</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>
</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>
</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="ar-charts" xsi:type="Artifact">
<name xml:lang="ru">Helm-чарты *-contour (OCI)</name>
</element>
<element identifier="ar-images" xsi:type="Artifact">
<name xml:lang="ru">Образы контейнеров</name>
</element>
<element identifier="ts-ingress" xsi:type="TechnologyService">
<name xml:lang="ru">Маршрутизация HTTPS-трафика</name>
</element>
<element identifier="ts-tls" xsi:type="TechnologyService">
<name xml:lang="ru">Выпуск TLS-сертификатов</name>
</element>
<element identifier="ts-oidc" xsi:type="TechnologyService">
<name xml:lang="ru">Аутентификация OIDC</name>
</element>
<element identifier="ts-secrets" xsi:type="TechnologyService">
<name xml:lang="ru">Управление секретами</name>
</element>
<element identifier="ts-rdbms" xsi:type="TechnologyService">
<name xml:lang="ru">Реляционное хранилище</name>
</element>
<element identifier="ts-cache" xsi:type="TechnologyService">
<name xml:lang="ru">Кэш</name>
</element>
<element identifier="ts-events" xsi:type="TechnologyService">
<name xml:lang="ru">Событийная шина</name>
</element>
<element identifier="ts-amqp" xsi:type="TechnologyService">
<name xml:lang="ru">Очередь сообщений AMQP</name>
</element>
<element identifier="ts-bpmn" xsi:type="TechnologyService">
<name xml:lang="ru">Оркестрация процессов BPMN</name>
</element>
<element identifier="ts-object" xsi:type="TechnologyService">
<name xml:lang="ru">Объектное хранилище</name>
</element>
</elements>
<relationships>
<relationship identifier="rel-001" source="nd-cluster" target="ss-istio-gw" xsi:type="Composition"/>
<relationship identifier="rel-002" source="nd-cluster" target="ss-istio-mesh" xsi:type="Composition"/>
<relationship identifier="rel-003" source="nd-cluster" target="ss-certmanager" xsi:type="Composition"/>
<relationship identifier="rel-004" source="nd-cluster" target="ss-zitadel" xsi:type="Composition"/>
<relationship identifier="rel-005" source="nd-cluster" target="ss-vault" xsi:type="Composition"/>
<relationship identifier="rel-006" source="nd-cluster" target="ss-postgres" xsi:type="Composition"/>
<relationship identifier="rel-007" source="nd-cluster" target="ss-redis" xsi:type="Composition"/>
<relationship identifier="rel-008" source="nd-cluster" target="ss-kafka" xsi:type="Composition"/>
<relationship identifier="rel-009" source="nd-cluster" target="ss-rabbit" xsi:type="Composition"/>
<relationship identifier="rel-010" source="nd-cluster" target="ss-camunda" xsi:type="Composition"/>
<relationship identifier="rel-011" source="ss-camunda" target="ss-cam-zeebe" xsi:type="Composition"/>
<relationship identifier="rel-012" source="ss-camunda" target="ss-cam-zeebe-gateway" xsi:type="Composition"/>
<relationship identifier="rel-013" source="ss-camunda" target="ss-cam-operate" xsi:type="Composition"/>
<relationship identifier="rel-014" source="ss-camunda" target="ss-cam-tasklist" xsi:type="Composition"/>
<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-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"/>
<relationship identifier="rel-039" source="ts-ingress" target="ac-checklists" xsi:type="Serving"/>
<relationship identifier="rel-040" source="ts-ingress" target="ac-control-interface" xsi:type="Serving"/>
<relationship identifier="rel-041" source="ts-ingress" target="ac-django" xsi:type="Serving"/>
<relationship identifier="rel-042" source="ts-ingress" target="ac-document-link" xsi:type="Serving"/>
<relationship identifier="rel-043" source="ts-ingress" target="ac-documentations" xsi:type="Serving"/>
<relationship identifier="rel-044" source="ts-ingress" target="ac-eav" xsi:type="Serving"/>
<relationship identifier="rel-045" source="ts-ingress" target="ac-flows" xsi:type="Serving"/>
<relationship identifier="rel-046" source="ts-ingress" target="ac-iam" xsi:type="Serving"/>
<relationship identifier="rel-047" source="ts-ingress" target="ac-inspections" xsi:type="Serving"/>
<relationship identifier="rel-048" source="ts-ingress" target="ac-issues" xsi:type="Serving"/>
<relationship identifier="rel-049" source="ts-ingress" target="ac-pm" xsi:type="Serving"/>
<relationship identifier="rel-050" source="ts-ingress" target="ac-processing" xsi:type="Serving"/>
<relationship identifier="rel-051" source="ts-ingress" target="ac-remarks" xsi:type="Serving"/>
<relationship identifier="rel-052" source="ts-ingress" target="ac-reviews" xsi:type="Serving"/>
<relationship identifier="rel-053" source="ts-ingress" target="ac-rfi" xsi:type="Serving"/>
<relationship identifier="rel-054" source="ts-ingress" target="ac-stamp-verification" xsi:type="Serving"/>
<relationship identifier="rel-055" source="ts-ingress" target="ac-transmittal" xsi:type="Serving"/>
<relationship identifier="rel-056" source="ts-ingress" target="ac-workspaces" xsi:type="Serving"/>
<relationship identifier="rel-057" source="ts-oidc" target="ac-checklists" xsi:type="Serving"/>
<relationship identifier="rel-058" source="ts-oidc" target="ac-comparisons" xsi:type="Serving"/>
<relationship identifier="rel-059" source="ts-oidc" target="ac-contracts" xsi:type="Serving"/>
<relationship identifier="rel-060" source="ts-oidc" target="ac-django" xsi:type="Serving"/>
<relationship identifier="rel-061" source="ts-oidc" target="ac-documentations" xsi:type="Serving"/>
<relationship identifier="rel-062" source="ts-oidc" target="ac-eav" xsi:type="Serving"/>
<relationship identifier="rel-063" source="ts-oidc" target="ac-flows" xsi:type="Serving"/>
<relationship identifier="rel-064" source="ts-oidc" target="ac-iam" xsi:type="Serving"/>
<relationship identifier="rel-065" source="ts-oidc" target="ac-issues" xsi:type="Serving"/>
<relationship identifier="rel-066" source="ts-oidc" target="ac-processing" xsi:type="Serving"/>
<relationship identifier="rel-067" source="ts-secrets" target="ac-attachments" xsi:type="Serving"/>
<relationship identifier="rel-068" source="ts-secrets" target="ac-bim" xsi:type="Serving"/>
<relationship identifier="rel-069" source="ts-secrets" target="ac-cde" xsi:type="Serving"/>
<relationship identifier="rel-070" source="ts-secrets" target="ac-checklists" xsi:type="Serving"/>
<relationship identifier="rel-071" source="ts-secrets" target="ac-comparisons" xsi:type="Serving"/>
<relationship identifier="rel-072" source="ts-secrets" target="ac-contracts" xsi:type="Serving"/>
<relationship identifier="rel-073" source="ts-secrets" target="ac-django" xsi:type="Serving"/>
<relationship identifier="rel-074" source="ts-secrets" target="ac-documentations" xsi:type="Serving"/>
<relationship identifier="rel-075" source="ts-secrets" target="ac-drawings" xsi:type="Serving"/>
<relationship identifier="rel-076" source="ts-secrets" target="ac-eav" xsi:type="Serving"/>
<relationship identifier="rel-077" source="ts-secrets" target="ac-flows" xsi:type="Serving"/>
<relationship identifier="rel-078" source="ts-secrets" target="ac-iam" xsi:type="Serving"/>
<relationship identifier="rel-079" source="ts-secrets" target="ac-inspections" xsi:type="Serving"/>
<relationship identifier="rel-080" source="ts-secrets" target="ac-issues" xsi:type="Serving"/>
<relationship identifier="rel-081" source="ts-secrets" target="ac-mapper" xsi:type="Serving"/>
<relationship identifier="rel-082" source="ts-secrets" target="ac-measurements" xsi:type="Serving"/>
<relationship identifier="rel-083" source="ts-secrets" target="ac-message-hub" xsi:type="Serving"/>
<relationship identifier="rel-084" source="ts-secrets" target="ac-notes" xsi:type="Serving"/>
<relationship identifier="rel-085" source="ts-secrets" target="ac-pm" xsi:type="Serving"/>
<relationship identifier="rel-086" source="ts-secrets" target="ac-processing" xsi:type="Serving"/>
<relationship identifier="rel-087" source="ts-secrets" target="ac-rfi" xsi:type="Serving"/>
<relationship identifier="rel-088" source="ts-secrets" target="ac-subscriptions" xsi:type="Serving"/>
<relationship identifier="rel-089" source="ts-secrets" target="ac-system-log" xsi:type="Serving"/>
<relationship identifier="rel-090" source="ts-secrets" target="ac-transmittal" xsi:type="Serving"/>
<relationship identifier="rel-091" source="ts-secrets" target="ac-workspaces" xsi:type="Serving"/>
<relationship identifier="rel-092" source="ts-rdbms" target="ac-attachments" xsi:type="Serving"/>
<relationship identifier="rel-093" source="ts-rdbms" target="ac-bim" xsi:type="Serving"/>
<relationship identifier="rel-094" source="ts-rdbms" target="ac-checklists" xsi:type="Serving"/>
<relationship identifier="rel-095" source="ts-rdbms" target="ac-comparisons" xsi:type="Serving"/>
<relationship identifier="rel-096" source="ts-rdbms" target="ac-contracts" xsi:type="Serving"/>
<relationship identifier="rel-097" source="ts-rdbms" target="ac-django" xsi:type="Serving"/>
<relationship identifier="rel-098" source="ts-rdbms" target="ac-documentations" xsi:type="Serving"/>
<relationship identifier="rel-099" source="ts-rdbms" target="ac-drawings" xsi:type="Serving"/>
<relationship identifier="rel-100" source="ts-rdbms" target="ac-eav" xsi:type="Serving"/>
<relationship identifier="rel-101" source="ts-rdbms" target="ac-flows" xsi:type="Serving"/>
<relationship identifier="rel-102" source="ts-rdbms" target="ac-iam" xsi:type="Serving"/>
<relationship identifier="rel-103" source="ts-rdbms" target="ac-inspections" xsi:type="Serving"/>
<relationship identifier="rel-104" source="ts-rdbms" target="ac-issues" xsi:type="Serving"/>
<relationship identifier="rel-105" source="ts-rdbms" target="ac-mapper" xsi:type="Serving"/>
<relationship identifier="rel-106" source="ts-rdbms" target="ac-message-hub" xsi:type="Serving"/>
<relationship identifier="rel-107" source="ts-rdbms" target="ac-notes" xsi:type="Serving"/>
<relationship identifier="rel-108" source="ts-rdbms" target="ac-pm" xsi:type="Serving"/>
<relationship identifier="rel-109" source="ts-rdbms" target="ac-processing" xsi:type="Serving"/>
<relationship identifier="rel-110" source="ts-rdbms" target="ac-rfi" xsi:type="Serving"/>
<relationship identifier="rel-111" source="ts-rdbms" target="ac-subscriptions" xsi:type="Serving"/>
<relationship identifier="rel-112" source="ts-rdbms" target="ac-system-log" xsi:type="Serving"/>
<relationship identifier="rel-113" source="ts-rdbms" target="ac-transmittal" xsi:type="Serving"/>
<relationship identifier="rel-114" source="ts-rdbms" target="ac-workspaces" xsi:type="Serving"/>
<relationship identifier="rel-115" source="ts-cache" target="ac-django" xsi:type="Serving"/>
<relationship identifier="rel-116" source="ts-cache" target="ac-message-hub" xsi:type="Serving"/>
<relationship identifier="rel-117" source="ts-cache" target="ac-pm" xsi:type="Serving"/>
<relationship identifier="rel-118" source="ts-events" target="ac-contracts" xsi:type="Serving"/>
<relationship identifier="rel-119" source="ts-events" target="ac-django" xsi:type="Serving"/>
<relationship identifier="rel-120" source="ts-events" target="ac-eav" xsi:type="Serving"/>
<relationship identifier="rel-121" source="ts-events" target="ac-flows" xsi:type="Serving"/>
<relationship identifier="rel-122" source="ts-events" target="ac-iam" xsi:type="Serving"/>
<relationship identifier="rel-123" source="ts-events" target="ac-inspections" xsi:type="Serving"/>
<relationship identifier="rel-124" source="ts-events" target="ac-issues" xsi:type="Serving"/>
<relationship identifier="rel-125" source="ts-events" target="ac-mapper" xsi:type="Serving"/>
<relationship identifier="rel-126" source="ts-events" target="ac-message-hub" xsi:type="Serving"/>
<relationship identifier="rel-127" source="ts-events" target="ac-notes" xsi:type="Serving"/>
<relationship identifier="rel-128" source="ts-events" target="ac-pm" xsi:type="Serving"/>
<relationship identifier="rel-129" source="ts-events" target="ac-system-log" xsi:type="Serving"/>
<relationship identifier="rel-130" source="ts-amqp" target="ac-contracts" xsi:type="Serving"/>
<relationship identifier="rel-131" source="ts-amqp" target="ac-django" xsi:type="Serving"/>
<relationship identifier="rel-132" source="ts-amqp" target="ac-documentations" xsi:type="Serving"/>
<relationship identifier="rel-133" source="ts-amqp" target="ac-flows" xsi:type="Serving"/>
<relationship identifier="rel-134" source="ts-amqp" target="ac-issues" xsi:type="Serving"/>
<relationship identifier="rel-135" source="ts-amqp" target="ac-mapper" xsi:type="Serving"/>
<relationship identifier="rel-136" source="ts-amqp" target="ac-notes" xsi:type="Serving"/>
<relationship identifier="rel-137" source="ts-amqp" target="ac-pm" xsi:type="Serving"/>
<relationship identifier="rel-138" source="ts-amqp" target="ac-processing" xsi:type="Serving"/>
<relationship identifier="rel-139" source="ts-amqp" target="ac-rfi" xsi:type="Serving"/>
<relationship identifier="rel-140" source="ts-amqp" target="ac-transmittal" xsi:type="Serving"/>
<relationship identifier="rel-141" source="ts-object" target="ac-attachments" xsi:type="Serving"/>
<relationship identifier="rel-142" source="ts-object" target="ac-contracts" xsi:type="Serving"/>
<relationship identifier="rel-143" source="ts-object" target="ac-django" xsi:type="Serving"/>
<relationship identifier="rel-144" source="ts-object" target="ac-documentations" xsi:type="Serving"/>
<relationship identifier="rel-145" source="ts-object" target="ac-eav" xsi:type="Serving"/>
<relationship identifier="rel-146" source="ts-object" target="ac-iam" xsi:type="Serving"/>
<relationship identifier="rel-147" source="ts-object" target="ac-issues" xsi:type="Serving"/>
<relationship identifier="rel-148" source="ts-object" target="ac-mapper" xsi:type="Serving"/>
<relationship identifier="rel-149" source="ts-object" target="ac-message-hub" xsi:type="Serving"/>
<relationship identifier="rel-150" source="ts-object" target="ac-notes" xsi:type="Serving"/>
<relationship identifier="rel-151" source="ts-object" target="ac-pm" xsi:type="Serving"/>
<relationship identifier="rel-152" source="ts-object" target="ac-rfi" xsi:type="Serving"/>
<relationship identifier="rel-153" source="ts-object" target="ac-subscriptions" xsi:type="Serving"/>
</relationships>
<views>
<diagrams>
<view identifier="view-1" xsi:type="Diagram">
<name xml:lang="ru">T1. Технологический слой — контур УГМК</name>
<documentation xml:lang="ru">Что развёрнуто в кластере d8-ugmk-prod и какие технологические сервисы это даёт. Приложения-потребители вынесены в отдельные представления T2T9.</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"/>
<node identifier="do-0004" elementRef="ts-secrets" xsi:type="Element" x="515" y="30" w="150" h="60"/>
<node identifier="do-0005" elementRef="ts-rdbms" xsi:type="Element" x="680" y="30" w="150" h="60"/>
<node identifier="do-0006" elementRef="ts-cache" xsi:type="Element" x="845" y="30" w="150" h="60"/>
<node identifier="do-0007" elementRef="ts-events" xsi:type="Element" x="1010" y="30" w="150" h="60"/>
<node identifier="do-0008" elementRef="ts-amqp" xsi:type="Element" x="1175" y="30" w="150" h="60"/>
<node identifier="do-0009" elementRef="ts-bpmn" xsi:type="Element" x="1340" y="30" w="150" h="60"/>
<node identifier="do-0010" elementRef="ts-object" xsi:type="Element" x="1505" y="30" w="150" h="60"/>
<node identifier="do-0011" elementRef="nd-cluster" xsi:type="Element" x="20" y="140" w="1270" h="400"/>
<node identifier="do-0012" elementRef="ss-istio-gw" xsi:type="Element" x="40" y="185" w="220" h="70"/>
<node identifier="do-0013" elementRef="ss-istio-mesh" xsi:type="Element" x="280" y="185" w="220" h="70"/>
<node identifier="do-0014" elementRef="ss-certmanager" xsi:type="Element" x="520" y="185" w="220" h="70"/>
<node identifier="do-0015" elementRef="ss-zitadel" xsi:type="Element" x="760" y="185" w="220" h="70"/>
<node identifier="do-0016" elementRef="ss-vault" xsi:type="Element" x="1000" y="185" w="220" h="70"/>
<node identifier="do-0017" elementRef="ss-postgres" xsi:type="Element" x="40" y="285" w="220" h="70"/>
<node identifier="do-0018" elementRef="ss-redis" xsi:type="Element" x="280" y="285" w="220" h="70"/>
<node identifier="do-0019" elementRef="ss-kafka" xsi:type="Element" x="520" y="285" w="220" h="70"/>
<node identifier="do-0020" elementRef="ss-rabbit" xsi:type="Element" x="760" y="285" w="220" h="70"/>
<node identifier="do-0021" elementRef="ss-camunda" xsi:type="Element" x="40" y="385" w="1230" h="130"/>
<node identifier="do-0022" elementRef="ss-cam-zeebe" xsi:type="Element" x="50" y="435" w="162" h="60"/>
<node identifier="do-0023" elementRef="ss-cam-zeebe-gateway" xsi:type="Element" x="224" y="435" w="162" h="60"/>
<node identifier="do-0024" elementRef="ss-cam-operate" xsi:type="Element" x="398" y="435" w="162" h="60"/>
<node identifier="do-0025" elementRef="ss-cam-tasklist" xsi:type="Element" x="572" y="435" w="162" h="60"/>
<node identifier="do-0026" elementRef="ss-cam-optimize" xsi:type="Element" x="746" y="435" w="162" h="60"/>
<node identifier="do-0027" elementRef="ss-cam-identity" xsi:type="Element" x="920" y="435" w="162" h="60"/>
<node identifier="do-0028" elementRef="ss-cam-connectors" xsi:type="Element" x="1094" y="435" w="162" h="60"/>
<node identifier="do-0029" elementRef="nd-s3" xsi:type="Element" x="1320" y="140" w="330" h="70"/>
<node identifier="do-0030" elementRef="nd-nfs" xsi:type="Element" x="1320" y="230" w="330" h="70"/>
<node identifier="do-0031" elementRef="nd-gitea" xsi:type="Element" x="1320" y="320" w="330" h="70"/>
<node identifier="do-0032" elementRef="nd-cr" xsi:type="Element" x="1320" y="410" w="330" h="130"/>
<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"/>
</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>
<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-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"/>
</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>
<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"/>
</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>
<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"/>
</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>
<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"/>
</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>
<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"/>
</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>
<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"/>
</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>
<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"/>
</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>
<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"/>
</view>
</diagrams>
</views>
</model>