diff --git a/DEPLOYMENT_DIAGNOSIS.md b/DEPLOYMENT_DIAGNOSIS.md index 85a8928..ebb8724 100644 --- a/DEPLOYMENT_DIAGNOSIS.md +++ b/DEPLOYMENT_DIAGNOSIS.md @@ -22,11 +22,11 @@ ### Относительный путь к YAML в Polygon -В [loader.py](site/config/loader.py) пути заданы относительно текущей рабочей директории: по умолчанию `services`, а в `POLYGON_STANDS` обычно `services/dev`, `services/test`, `services/prod`. Фактические каталоги находятся внутри `site/services/`. +Ранее [loader.py](site/config/loader.py) использовал пути относительно текущей рабочей директории: при запуске из корня репозитория это могло привести к поиску `/services` вместо `/site/services` и падению импорта до регистрации `/health`. -Инструкция Nubes Flask (`~/HowTo/howto-flask-nubes.md`) указывает запуск `python site/app.py` из корня репозитория. Если рабочая директория процесса действительно корень репозитория, загрузчик будет искать `/services`, а не `/site/services`; импорт конфигурации упадёт с `FileNotFoundError` до старта Flask и `/health`. Если платформа меняет рабочую директорию на `site`, этот путь работает. Фактический CWD деплоя и логи пода не проверены. +Исправление привязывает относительные значения по умолчанию и `POLYGON_STANDS` к каталогу `site/`, независимо от CWD. Регрессионные тесты импортируют полное Flask-приложение и проверяют `/health` с CWD корня репозитория и `site/`. Фактический CWD исторического деплоя и его логи не проверены, поэтому этот дефект не объявляется доказанной причиной инцидента. -Этот риск может объяснить неготовность приложения после создания, но сам по себе не создаёт `NXDOMAIN`: DNS-имя проверяется до соединения с Flask. +Этот дефект мог помешать запуску приложения, но сам по себе не создаёт `NXDOMAIN`: DNS-имя проверяется до соединения с Flask. ### Healthcheck @@ -36,21 +36,21 @@ `config/loader.py` перечисляет YAML только в каталогах, заданных `POLYGON_STANDS`, либо в `services/` при отсутствии этой переменной. Каждый файл открывается и разбирается один раз при импорте `config.loader`; обработчики API затем используют загруженные словари из памяти. Резервные каталоги `resources_yaml.bak-*` из `tf_provider` Polygon не сканирует. -Следовательно, старый YAML может оставить устаревший сервис или параметры в ответах API и способен помешать запуску, если файл невалиден или отсутствует ожидаемый каталог. Но в коде нет основания заключать, что чтение старых YAML вызвало заметную задержку, а тем более DNS `NXDOMAIN`. Время загрузки YAML отдельно не измерялось. +Следовательно, старый YAML может оставить устаревший сервис или параметры в ответах API и способен помешать запуску, если файл невалиден или отсутствует ожидаемый каталог. Генератор `from_stands.py` теперь удаляет YAML, отсутствующие в источнике, после полной успешной конвертации; если есть ошибки, очистка не выполняется. DEV, TEST и PROD копии были перегенерированы из текущих соответствующих каталогов `tf_provider`; fallback `services/` — из DEV. Время загрузки YAML отдельно не измерялось, и нет основания связывать чтение старых файлов с DNS `NXDOMAIN`. **Исправление прежнего ответа:** оценки размера и времени чтения YAML, а также предположение о конкретном negative-cache TTL DNS ранее были приведены без измерений и не являются установленными фактами. То, что адрес позднее открылся, доказывает только, что в момент повторной проверки он разрешался и отвечал; почему это изменилось, без DNS-диагностики и журналов Nubes неизвестно. -Локальные удаления YAML в Polygon не отправлялись в Gitea и не развёртывались, поэтому сами по себе не меняли работающий сервис. +Удаление четырёх старых копий `27_vc_vm_v2.yaml` не могло объяснить восстановление DNS: эти YAML влияют на содержимое API, а не на DNS-запись. ## Что проверить для точного диагноза 1. В карточке инстанса: фактические `startupConfiguration.resourceRealm`, `accessConfiguration.domain`, `appConfiguration.gitPath`, `appConfiguration.healthPath` и `state_out.connectionUrl`. 2. У операции `create`: список `stages`, результат каждой стадии и `errorLog`, особенно стадии DNS и запуска приложения. -3. В логах пода: статус контейнера и traceback. Ошибка `Services directory not found: services` подтвердит проблему CWD/YAML-пути. +3. В логах пода: статус контейнера и traceback. Для старой опубликованной версии ошибка `Services directory not found: services` указывала бы на проблему CWD/YAML-пути. 4. В DNS: существует ли A-запись для точного `state_out.connectionUrl` и указывает ли она на ingress выбранного resource realm. ## Вывод -Непосредственно `DNS_PROBE_FINISHED_NXDOMAIN` означает отсутствие разрешаемой DNS-записи для запрошенного имени. Наиболее важные проверки — сопоставить `domain` с `state_out.connectionUrl` и изучить DNS-стадию. Отдельно нужно проверить рабочую директорию процесса: текущий `loader.py` использует относительные пути и может не найти YAML при запуске из корня репозитория. +Непосредственно `DNS_PROBE_FINISHED_NXDOMAIN` означает отсутствие разрешаемой DNS-записи для запрошенного имени. Наиболее важные проверки — сопоставить `domain` с `state_out.connectionUrl` и изучить DNS-стадию. Риск CWD/YAML-путей исправлен в коде и покрыт регрессионными тестами, но точная причина исторического инцидента остаётся неизвестной. `tf_provider` — источник истины для схемы Flask; его YAML в рамках этого анализа не менялись. \ No newline at end of file diff --git a/README.md b/README.md index 356bc9b..5d55898 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,7 @@ Polygon эмулирует API Nubes. Чтобы знать какие серв неудобном для полигона. Поэтому есть двухэтапный процесс: ``` -~/tf_provider/generated/{dev,test,prod}/resources_yaml/*.yaml ← источник (терраформ) +~/TF/tf_provider/generated/{dev,test,prod}/resources_yaml/*.yaml ← источник истины │ │ from_stands.py — конвертация формата, дедупликация, нормализация │ Запускается ВРУЧНУЮ при изменении терраформ-репы @@ -67,7 +67,7 @@ polygon/site/services/{dev,test,prod}/*.yaml ← скоммичены в git- │ config/loader.py — загрузка ВСЕХ YAML в память при старте │ ▼ -Память Flask-процесса (~0.7 MB на 3 стенда) +Память Flask-процесса (конфиги загружаются один раз при старте) ``` ### Почему нельзя читать терраформ-формат напрямую? @@ -90,9 +90,9 @@ polygon/site/services/{dev,test,prod}/*.yaml ← скоммичены в git- ```bash cd site -python from_stands.py ~/tf_provider/generated/dev/resources_yaml services/dev -python from_stands.py ~/tf_provider/generated/test/resources_yaml services/test -python from_stands.py ~/tf_provider/generated/prod/resources_yaml services/prod +python from_stands.py ~/TF/tf_provider/generated/dev/resources_yaml services/dev +python from_stands.py ~/TF/tf_provider/generated/test/resources_yaml services/test +python from_stands.py ~/TF/tf_provider/generated/prod/resources_yaml services/prod cd .. git add services/ @@ -101,6 +101,8 @@ git push # → редеплоить polygon через Nubes UI ``` +После успешной конвертации генератор удаляет из целевого каталога YAML, которых больше нет в источнике. Если конвертация завершилась ошибками, устаревшие файлы не удаляются. + ### Как проверить что всё загрузилось? ```bash diff --git a/site/config/loader.py b/site/config/loader.py index a36b89e..80335e5 100644 --- a/site/config/loader.py +++ b/site/config/loader.py @@ -21,6 +21,14 @@ import yaml _YAML_EXTS = (".yaml", ".yml") _DEFAULT_SERVICES_DIR = "services" +_SITE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + + +def _resolve_services_dir(services_dir): + """Resolve configured relative paths from site/, independent of process CWD.""" + if not os.path.isabs(services_dir): + services_dir = os.path.join(_SITE_DIR, services_dir) + return os.path.abspath(services_dir) def _load_one(services_dir): @@ -69,7 +77,7 @@ else: STANDS = {} for _sid, _sdir in _stand_dirs.items(): - _svc, _ops = _load_one(_sdir) + _svc, _ops = _load_one(_resolve_services_dir(_sdir)) STANDS[_sid] = {"SERVICES": _svc, "OPS_INDEX": _ops} DEFAULT_STAND = next(iter(STANDS.keys())) diff --git a/site/from_stands.py b/site/from_stands.py index 1761e81..4527d4a 100644 --- a/site/from_stands.py +++ b/site/from_stands.py @@ -309,6 +309,7 @@ def main(): converted = 0 errors = 0 + converted_names = set() for fname in yaml_files: src = os.path.join(stands_dir, fname) @@ -328,6 +329,7 @@ def main(): sort_keys=False, width=200, ) + converted_names.add(fname) # Быстрая проверка результата svc_name = cfg.get("name", "?") @@ -343,6 +345,16 @@ def main(): print(f" FAIL {fname}: {e}") errors += 1 + if errors == 0: + stale_yaml = sorted( + fname + for fname in os.listdir(services_dir) + if fname.lower().endswith(YAML_EXTS) and fname not in converted_names + ) + for fname in stale_yaml: + os.remove(os.path.join(services_dir, fname)) + print(f" REMOVE {fname}: not present in source") + print() print(f"Done: {converted} converted, {errors} errors") diff --git a/site/services/109_zones_v2.yaml b/site/services/109_zones_v2.yaml index 4faae6c..57dab11 100644 --- a/site/services/109_zones_v2.yaml +++ b/site/services/109_zones_v2.yaml @@ -127,10 +127,16 @@ cfsParams: - SSHFP - svcOperationCfsParamId: 780 svcOperationCfsParam: recordInput - dataType: string + dataType: array-map-fixed isRequired: true - defaultValue: '' + defaultValue: '[{}]' isModifiable: false + dataDescriptor: + record: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 781 svcOperationCfsParam: recordName dataType: string @@ -144,16 +150,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - recordName: - dataType: string - defaultValue: '' - isRequired: true - isModifiable: false - recordTTL: - dataType: integer > 0 - defaultValue: '3600' - isRequired: true - isModifiable: false recordType: dataType: string defaultValue: A @@ -169,11 +165,22 @@ cfsParams: - LUA - NS - SSHFP + - CAA + recordName: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false recordInput: dataType: string defaultValue: '' isRequired: true isModifiable: false + recordTTL: + dataType: integer > 0 + defaultValue: '3600' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 783 svcOperationCfsParam: recordName dataType: string @@ -204,10 +211,16 @@ cfsParams: - SSHFP - svcOperationCfsParamId: 786 svcOperationCfsParam: recordInput - dataType: string + dataType: array-map-fixed isRequired: true - defaultValue: '' + defaultValue: '[{}]' isModifiable: true + dataDescriptor: + record: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false cfsParamsByOp: 254: - 761 diff --git a/site/services/115_mariadb.yaml b/site/services/115_mariadb.yaml index a18939b..ebe0886 100644 --- a/site/services/115_mariadb.yaml +++ b/site/services/115_mariadb.yaml @@ -2,7 +2,54 @@ name: mariadb service_id: 115 service_display_name: Mariadb service_short_name: mariadb -service_man: 'Mariadb кластер. Ресурсная платформа: k8s. Автоматизация: k8s operator.
Автоматическое резервное копирование, ручное восстановление.' +service_man: '# Инструкция по развертыванию MariaDB через платформу

## 1. Общая информация

MariaDB — реляционная база данных, совместимая с MySQL. Разворачивается через `mariadb-operator` + в Kubernetes.

### Доступные операции с кластером

* **create** — создание кластера
* **delete** — удаление кластера
* **suspend** — остановка кластера (под реально останавливается, + ресурсы не потребляются)
* **resume** — запуск ранее остановленного кластера
* **modify** — изменение параметров кластера
* **reconcile** — синхронизация состояния инстанса с платформой

### + Доступные операции с базами данных

* **create_database** — создание базы данных
* **delete_database** — удаление базы данных

### Доступные операции с пользователями

* **create_user** + — создание пользователя
* **delete_user** — удаление пользователя

---

## 2. Параметры создания кластера

### Платформа для развертывания (`startupConfiguration.resourceRealm`)

Среда, + в которой будет развёрнут кластер.

### Конфигурация ресурсов (`clusterConfiguration`)

JSON-объект:
* `cpu` — квота CPU пода в миликорах (1000 = 1 vCPU). Пример: `500`
* `memory` + — квота памяти пода в мегабайтах. Пример: `512`
* `disk` — размер диска в гигабайтах. Пример: `10`
* `replicas` — количество реплик. Сервис работает в режиме одного primary-узла (Galera выключена), + значение `0` эквивалентно остановке кластера.

### Версия MariaDB (`mariadbConfiguration.version`)

Поддерживаются только две версии: `8.4.0` и `9.4.0`.

### Внешний доступ (`accessConfiguration`)

JSON-объект:
* + `masterIpSpace` — имя ipSpace для выделения внешнего IP. Укажите `no-needed`, если внешний адрес не требуется.
* `masterAccessList` — список IP/подсетей, которым разрешён доступ к порту 3306 снаружи. + Пустой список — доступ не ограничен на уровне firewall (в рамках выделенного ipSpace).

### Резервное копирование (`backupConfiguration`)

JSON-объект:
* `s3Uid` — идентификатор S3-пользователя/квоты + для бэкапов.
* `schedule` — cron-выражение расписания бэкапов. По умолчанию `0 0 * * *` (раз в сутки в полночь).
* `retain` — время хранения бэкапов **в часах** (не в днях!). По умолчанию `7` + — то есть 7 часов. При суточном расписании этого значения обычно недостаточно, чтобы между двумя бэкапами всегда оставалась хотя бы одна валидная копия — рекомендуется указывать `retain` явно, с запасом + (например `720` = 30 суток).

> **Важно:** расписание и срок хранения бэкапов задаются **только при создании кластера**. Оператор MariaDB не позволяет изменить cron-расписание бэкапа после создания + (поле `spec.schedule.cron` неизменяемо на уровне admission-вебхука самого оператора) — поэтому эти параметры недоступны для изменения через `modify`.

> **Восстановление из бэкапа пока не реализовано + как самостоятельная операция платформы.** Бэкапы физически хранятся в S3-бакете инстанса (`technicals3backup-`, префикс `mariadb/backups/`). Если нужно восстановить данные из бэкапа — бэкап + нужно **скачать из S3 и применить к базе вручную** (например через `mariabackup`/`mariadb-backup` restore или соответствующий инструмент).

### Автомасштабирование диска (`autoscaleConfiguration`)

JSON-объект:
* + `enabled` — включить автоматическое расширение диска при исчерпании места.
* `quota` — максимальный размер диска, до которого разрешено автоматическое расширение (не может быть меньше `clusterConfiguration.disk`).
* + `percent`, `schedule` — параметры триггера автомасштабирования.

---

## 3. Параметры модификации кластера

Все параметры модификации, кроме версии, можно как увеличивать, так + и уменьшать (кроме диска — см. ниже) — система подставит текущие сохранённые значения, если их не менять.

### Конфигурация ресурсов (`clusterConfiguration`)

* `cpu`, `memory` — можно + менять в любую сторону.
* `disk` — можно **только увеличивать**, уменьшение уже выделенного размера не поддерживается.
* `replicas` — `0` останавливает кластер тем же образом, что и `suspend` + (альтернативный способ временной остановки через `modify`).

### Версия MariaDB (`mariadbConfiguration.version`)

Можно только повышать версию (`8.4.0 → 9.4.0`). Попытка понизить версию + будет отклонена с явной ошибкой ещё до применения изменений.

### Внешний доступ (`accessConfiguration`)

Можно включить внешний доступ (было `no-needed` → указали реальный `masterIpSpace`), + изменить список разрешённых IP, либо полностью отключить внешний доступ (`masterIpSpace: no-needed`) — в этом случае внешний Service, DNS-запись и правило firewall будут корректно откреплены и удалены.

### + Резервное копирование

Не передаётся при модификации — расписание и срок хранения бэкапов фиксируются на этапе `create` (см. п.2).

---

## 4. Параметры создания базы данных (`create_database`)

### + Имя базы данных (`dbName`)

Строка с именем новой базы. Не может совпадать с зарезервированными системными именами: `mysql`, `sys`, `information_schema`, `performance_schema`. База с таким же + именем не должна уже существовать в кластере.

---

## 5. Параметры удаления базы данных (`delete_database`)

### Имя базы данных (`dbName`)

База должна существовать в + кластере. Удаление будет отклонено, если к базе всё ещё привязаны пользователи — сначала нужно снять доступ (`delete_user`) у всех пользователей, ссылающихся на эту базу.

---

## 6. Параметры + создания пользователя (`create_user`)

### Имя пользователя (`username`)

Не может быть `root`, `healthcheck` или `mariadb.sys` — эти имена зарезервированы платформой/оператором. Пользователь + с таким именем не должен уже существовать в кластере — операция сверяется с текущим стейтом сервиса и отклоняется, если имя занято.

### Пароль (`password`)

Пароль для подключения от + имени создаваемого пользователя.

### Базы данных (`dbName`)

JSON-массив вида `[{"dbname": "имя_базы"}]` — список баз, к которым выдаётся полный доступ (`ALL PRIVILEGES`). Все перечисленные + базы должны уже существовать в кластере (создать заранее через `create_database`).

> Ограничения доступа по IP/подсети на уровне пользователя больше нет — `user@host` в самой MariaDB всегда `%`. + Доступ к порту 3306 контролируется только на уровне инстанса через `accessConfiguration.masterAccessList`, задаваемый при `create`/`modify` (см. п.2/п.3).

---

## 7. Параметры удаления + пользователя (`delete_user`)

### Имя пользователя (`username`)

Пользователь должен существовать в кластере. `root`/`healthcheck`/`mariadb.sys` удалить нельзя.

---

## + 8. Выходные параметры

### internalConnect

Внутренний адрес для подключения из сервисов, работающих в том же кластере Kubernetes:
```json
{
"master": {
"dns": "..svc.",
"ip": + null,
"port": 3306
}
}
```

### externalConnect

Присутствует в выходных данных, **только если** был запрошен внешний доступ (`accessConfiguration.masterIpSpace` + отличен от `no-needed`). Если внешний доступ не запрошен или был отключён через `modify` — этого блока не будет вовсе (пустой блок в состояние не пишется):
```json
{
"master": {
"dns": + "write..",
"ip": "<внешний IP>",
"port": 3306
}
}
```

---

## 9. Пример подключения

### 9.1 Изнутри кластера / того же namespace

```bash
mariadb + -h -P 3306 -u -p
```

### 9.2 Через port-forward

```bash
kubectl port-forward svc/ 3306:3306 -n
```

**Важно:** + после `port-forward` подключайтесь именно по `127.0.0.1`, а не `localhost`:

```bash
mariadb -h 127.0.0.1 -P 3306 -u -p
```

Клиент `mysql`/`mariadb` при указании `-h + localhost` **игнорирует TCP/порт** и всегда пытается подключиться через локальный unix-сокет (`/var/lib/mysql/mysql.sock`), которого на вашей машине нет — подключение упадёт с `ERROR 2002 (HY000): Can''t + connect to local server through socket`. `127.0.0.1` форсирует реальное TCP-подключение. Также не забывайте `-P` (порт) с заглавной буквы — строчная `-p` относится к паролю.

### 9.3 Снаружи (внешний + адрес)

```bash
mariadb -h -P 3306 -u -p
```

Доступно только если при создании/модификации был указан реальный `masterIpSpace` + и подключающийся IP входит в `accessConfiguration.masterAccessList` (или список пуст).

Где:
* `` — имя пользователя
* `` — пароль пользователя

---

## + 10. Дополнительная информация

* Расписание бэкапов (`backupConfiguration.schedule`/`retain`) задаётся один раз при создании и не может быть изменено позже — ограничение самого `mariadb-operator`, + а не платформы.
* Версию MariaDB можно только повышать, откат на более старую версию не поддерживается.
* Размер диска можно только увеличивать.
* `suspend` реально останавливает под (масштабирование + StatefulSet в 0 реплик), а не просто помечает кластер как приостановленный — расход ресурсов CPU/RAM/диска (кроме уже занятого диска) прекращается.
* При отключении внешнего доступа через `modify` + (`masterIpSpace: no-needed`) внешний Service, DNS-запись и правило firewall удаляются, а `externalConnect` пропадает из выходных данных.
* Самостоятельного восстановления из бэкапа (операции `restore`) + пока нет. Бэкапы лежат в S3 инстанса — восстановление данных в существующий кластер выполняется вручную, скачиванием и применением бэкапа самим владельцем инстанса.
' lifecycle: suspendOnDestroyDefault: true adoptExistingOnCreateDefault: false @@ -64,10 +111,9 @@ cfsParams: isRequired: true isModifiable: false valueList: - - iot-naeel + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 - svcOperationCfsParamId: 878 svcOperationCfsParam: clusterConfiguration dataType: map-fixed @@ -75,11 +121,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - disk: - dataType: integer > 0 - defaultValue: '10' - isRequired: true - isModifiable: false cpu: dataType: integer > 0 defaultValue: '500' @@ -97,6 +138,11 @@ cfsParams: isModifiable: false valueList: - '1' + disk: + dataType: integer > 0 + defaultValue: '10' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 879 svcOperationCfsParam: accessConfiguration dataType: map-fixed @@ -134,7 +180,7 @@ cfsParams: dataType: map-fixed isRequired: true defaultValue: '' - isModifiable: true + isModifiable: false dataDescriptor: s3Uid: dataType: uuid @@ -194,19 +240,19 @@ cfsParams: svcOperationCfsParam: dbName dataType: string isRequired: true - defaultValue: db-aah92zcm + defaultValue: db-nmdlrebb isModifiable: false - svcOperationCfsParamId: 735 svcOperationCfsParam: username dataType: string isRequired: true - defaultValue: usero6y8ruyp + defaultValue: useroxxeykhb isModifiable: false - svcOperationCfsParamId: 736 svcOperationCfsParam: password dataType: string isRequired: true - defaultValue: kgocowba + defaultValue: apsyfstb isModifiable: false - svcOperationCfsParamId: 737 svcOperationCfsParam: dbName @@ -220,12 +266,6 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false -- svcOperationCfsParamId: 738 - svcOperationCfsParam: accessHosts - dataType: string - isRequired: true - defaultValue: '%' - isModifiable: false - svcOperationCfsParamId: 456 svcOperationCfsParam: deleteS3Bucket dataType: boolean @@ -308,28 +348,6 @@ cfsParams: valueList: - 8.4.0 - 9.4.0 -- svcOperationCfsParamId: 886 - svcOperationCfsParam: backupConfiguration - dataType: map-fixed - isRequired: true - defaultValue: '' - isModifiable: true - dataDescriptor: - retain: - dataType: integer > 0 - defaultValue: '' - isRequired: true - isModifiable: false - schedule: - dataType: string - defaultValue: '' - isRequired: true - isModifiable: false - s3Uid: - dataType: uuid - defaultValue: '' - isRequired: true - isModifiable: false - svcOperationCfsParamId: 887 svcOperationCfsParam: autoscaleConfiguration dataType: map-fixed @@ -383,7 +401,6 @@ cfsParamsByOp: - 735 - 736 - 737 - - 738 139: - 456 248: @@ -394,14 +411,13 @@ cfsParamsByOp: - 883 - 884 - 885 - - 886 - 887 287: [] 141: [] 140: [] stateParams: startupConfiguration: '{"resourceRealm": ""}' - clusterConfiguration: '{"disk": 10, "cpu": 500, "memory": 512, "replicas": 1}' + clusterConfiguration: '{"cpu": 500, "memory": 512, "replicas": 1, "disk": 10}' accessConfiguration: '{"masterIpSpace": "", "masterAccessList": "[]"}' mariadbConfiguration: '{"version": "9.4.0"}' backupConfiguration: '{"s3Uid": "", "retain": 720, "schedule": "0 0 * * *"}' diff --git a/site/services/116_kafka.yaml b/site/services/116_kafka.yaml index eac596b..643dece 100644 --- a/site/services/116_kafka.yaml +++ b/site/services/116_kafka.yaml @@ -2,21 +2,24 @@ name: kafka service_id: 116 service_display_name: ApacheKafka service_short_name: kafka -service_man: '# Инструкция по развертыванию Организация в Cloud Director через платформу

## 1. Общая информация

Сервис **Организация в Cloud Director** предназначен для управления изолированными - организационными единицами (тенантами) внутри инфраструктуры Cloud Director. Он обеспечивает создание, модификацию и администрирование организаций, предоставление им облачных ресурсов, а также контроль - уровня доступа. Сервис используется для организации рабочих окружений потребителей, управления жизненным циклом организаций и их сетевой инфраструктурой.

### Доступные операции

**create** - — Создание новой организации с заданными характеристиками и типом доступа.
**delete** — Удаление организации после перехода в состояние suspend; приводит к удалению всех связанных сущностей.
**modify** - — Изменение параметров внутри организации (на текущий момент поддерживается изменение ipSpaces).
**suspend** — Заморозка организации, ограничение возможности изменения и добавления сущностей.
**resume** - — Разморозка организации, восстановление функций управления.

---

## 2. Параметры развертывания

Параметры входных данных операции **create**:

### Платформа для развертывания
Описание: - платформа, на которой будет создана организация.
Пример значения: `ngcloud.ru`.

### Тип организации
Описание: тип создаваемой организации.
Варианты:
- `iaas` — организация с прямым - доступом к облаку и авторизацией через Keycloak.
- `saas` — организация под управлением Nubes, без прямого доступа к облаку.

---

## 3. Рекомендованные характеристики

### - Тестовое окружение
- Тип организации: `iaas` для обеспечения полного доступа к облачным ресурсам и самостоятельного управления.

### Промышленное окружение
- Тип организации: `saas` (упрощённая - модель использования).

---

## 4. Выходные параметры

Услуга предоставляет следующие выходные параметры (формируются в процессе операций):

### Идентификатор организации
Уникальный - идентификатор созданной организации. Используется для всех дальнейших API-операций.

### Статус организации
Отражает текущее состояние: active, suspended, modifying, deleting.

### - Параметры сети
Выходные данные при наличии ipSpaces: список выделенных внешних IP, имя ip_space, количество IP.

---

## 5. Дополнительная информация

- Для конфигурации внешних - IP внутри организации необходимо предварительно создать:
-- хотя бы один **Виртуальный датацентр (VDC)**;
-- хотя бы один **Сетевой шлюз периметра (Edge Gateway)**, привязанный к этой организации.
- - Удаление организации возможно только через 14 дней после перевода в состояние suspend.
- Удаление организации приводит к удалению всех связанных сущностей: VDC, Edge Gateway, пулов IP, сетей, ВМок - и иных объектов.
- Операция suspend не останавливает виртуальные машины, но блокирует любые изменения инфраструктуры внутри организации.
- Для iaas-организаций доступ осуществляется через Keycloak.

' +service_man: "# Инструкция по развертыванию Apache Kafka через платформу

---
## 1. Общая информация
Брокер сообщений Apache Kafka — это отказоустойчивая распределённая платформа для обмена\ + \ сообщениями и потоковой обработки данных в реальном времени.
Позволяет надёжно передавать события между сервисами и системами, интегрироваться с внешними решениями и использовать как внутренние,\ + \ так и защищённые TLS-подключения. Развёртывание полностью автоматизировано платформой.

## Доступные операции
- **create** — Создание кластера
- **delete** — Удаление кластера
-\ + \ **suspend** — Остановка кластера
- **resume** — Запуск кластера

- **create_topic** — Создание топика
- **modify_topic** — Модификация топика
- **delete_topic** — Удаление\ + \ топика

- **create_user** — Создание пользователя
- **modify_user** — Модификация пользователя
- **delete_user** — Удаление пользователя


---
## 2. Параметры\ + \ развертывания кластера
Ниже перечислены параметры, которые необходимо указать при создании ресурса Kafka:

* **Платформа для развертывания:**
Платформа для развертывания (среда, в\ + \ которой будет развернут кластер). Пример: `\tk8s-3.ext.nubes.ru`.

* **Количество узлов в сети:**
Количество узлов (брокеров) в кластере Kafka

* **Квота (megabyte) памяти пода:**
\ + \ Квота памяти пода в мегабайтах. Пример: `2048`

* **Квота (millicore ) ядра пода:**
Квота CPU пода в миликорах (1000 mCPU = 1 vCPU). Пример: `1000`

* **Размер (gigabyte) диска\ + \ для базы данных:**
Размер диска для хранения данных в гигабайтах. Пример: `20`

* **Выделяет внешний IP для доступа к master:**
Флаг, определяющий, нужно ли выделять внешний IP для\ + \ доступа к master-брокеру. Пример: `true` или `false`

* **Имя ipSpace для публикации внешнего IP**
Если включен предыдущий параметр, то поле необходимо заполнить. Пример: `internet-no-antiddos-v1`

---
##\ + \ 4. Выходные параметры
После успешного развертывания ресурса Kafka платформа возвращает ряд параметров.
Ключевыми из них являются:

**internalConnect** (выдаётся только при работе кластера\ + \ по внутренним адресам)
Внутренние эндпоинты для подключения из сервисов, развёрнутых внутри того же Kubernetes-кластера.
```yaml
internalConnect:
bootstrap:
fqdn: \"-kafka-tls-bootstrap..svc.\"\ +
port: 9093
brokers:
broker-1:
fqdn: \"--pool-0.-kafka-brokers..svc.\"
port: 9093
```

**externalConnect**\ + \ (выдаётся только при выделении внешнего IP)
Внешние эндпоинты, зарегистрированные в DNS.
```yaml
externalConnect:
bootstrap:
fqdn: \"bootstrap..\"
\ + \ port: 9093
brokers:
broker-1:
fqdn: \"broker-1..\"
port: 9093
```

Заполняется **только один** из параметров:
- при внешней аллокации\ + \ (`loadbalancer`) — `externalConnect`, `internalConnect` остаётся пустым;
- при внутреннем режиме — `internalConnect`, `externalConnect` остаётся пустым.

Для подключения используются следующие\ + \ порты:

* 9092 — внутренний нешифрованный доступ (plain).
* 9093 — внутренний и внешний доступ по TLS, с обязательной TLS-аутентификацией.

---
## 5. Дополнительная информация
Для\ + \ создания топиков, пользователей и управления ими, а также для интеграции с кластерами Kafka используйте соответствующие сервисы и раздел \"Облачные сервисы\".
---" lifecycle: suspendOnDestroyDefault: true adoptExistingOnCreateDefault: false @@ -82,10 +85,9 @@ cfsParams: isRequired: true isModifiable: false valueList: - - iot-naeel + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 - svcOperationCfsParamId: 1085 svcOperationCfsParam: clusterConfiguration dataType: map-fixed diff --git a/site/services/119_akhq.yaml b/site/services/119_akhq.yaml index 3baecf1..f45c1af 100644 --- a/site/services/119_akhq.yaml +++ b/site/services/119_akhq.yaml @@ -47,10 +47,9 @@ cfsParams: defaultValue: '' isModifiable: false valueList: - - iot-naeel + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 - svcOperationCfsParamId: 551 svcOperationCfsParam: resourceMemory dataType: integer > 0 diff --git a/site/services/120_clickhouse.yaml b/site/services/120_clickhouse.yaml index 5330abd..d3a9324 100644 --- a/site/services/120_clickhouse.yaml +++ b/site/services/120_clickhouse.yaml @@ -85,10 +85,9 @@ cfsParams: isRequired: true isModifiable: false valueList: - - iot-naeel + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 - svcOperationCfsParamId: 838 svcOperationCfsParam: clusterConfiguration dataType: map-fixed @@ -116,6 +115,11 @@ cfsParams: - '3' - '5' - '7' + disk: + dataType: integer > 0 + defaultValue: '10' + isRequired: true + isModifiable: false shards: dataType: integer > 0 defaultValue: '1' @@ -125,11 +129,6 @@ cfsParams: - '1' - '2' - '3' - disk: - dataType: integer > 0 - defaultValue: '10' - isRequired: true - isModifiable: false - svcOperationCfsParamId: 839 svcOperationCfsParam: accessConfiguration dataType: map-fixed @@ -216,20 +215,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - quota: - dataType: integer > 0 - defaultValue: '100' - isRequired: true - isModifiable: false - percent: - dataType: integer > 0 - defaultValue: '10' - isRequired: true - isModifiable: false - valueList: - - '10' - - '15' - - '20' enabled: dataType: boolean defaultValue: 'false' @@ -248,6 +233,20 @@ cfsParams: - '5' - '12' - '23' + quota: + dataType: integer > 0 + defaultValue: '100' + isRequired: true + isModifiable: false + percent: + dataType: integer > 0 + defaultValue: '10' + isRequired: true + isModifiable: false + valueList: + - '10' + - '15' + - '20' - svcOperationCfsParamId: 851 svcOperationCfsParam: clickhouseFilesConfiguration dataType: array-map-fixed @@ -434,15 +433,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - percent: - dataType: integer > 0 - defaultValue: '' - isRequired: true - isModifiable: false - valueList: - - '10' - - '15' - - '20' enabled: dataType: boolean defaultValue: false,true @@ -463,6 +453,15 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false + percent: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - '10' + - '15' + - '20' - svcOperationCfsParamId: 850 svcOperationCfsParam: clickhouseFilesConfiguration dataType: array-map-fixed @@ -514,10 +513,10 @@ cfsParamsByOp: 182: [] stateParams: startupConfiguration: '{"resourceRealm": ""}' - clusterConfiguration: '{"cpu": 1000, "memory": 2048, "replicas": 1, "shards": 1, "disk": 10}' + clusterConfiguration: '{"cpu": 1000, "memory": 2048, "replicas": 1, "disk": 10, "shards": 1}' accessConfiguration: '{"masterIpSpace": "", "masterAccessList": "[]"}' clickhouseKeeperConfiguration: '{"cpu": 500, "memory": 512, "replicas": 0}' clickhouseConfiguration: '{"version": "25.10"}' backupConfiguration: '{"s3Uid": "", "retain": 7, "schedule": "0 0 * * *"}' - autoscaleConfiguration: '{"quota": 100, "percent": 10, "enabled": false, "schedule": 0}' + autoscaleConfiguration: '{"enabled": false, "schedule": 0, "quota": 100, "percent": 10}' clickhouseFilesConfiguration: '{"path": "something.xml", "xmlConfig": ""}' diff --git a/site/services/12_s3.yaml b/site/services/12_s3.yaml index bb27afb..f6ecdbd 100644 --- a/site/services/12_s3.yaml +++ b/site/services/12_s3.yaml @@ -2,7 +2,7 @@ name: s3 service_id: 12 service_display_name: S3 Object Storage service_short_name: s3 -service_man: Руководство доступно по ссылке:
https://docs.s3.msk-1.ngcloud.ru/s3/s3.description.html +service_man: Руководство доступно по ссылке:
https://docs.s3-website.msk-1.ngcloud.ru/ lifecycle: suspendOnDestroyDefault: true adoptExistingOnCreateDefault: false diff --git a/site/services/148_vc_mgmt_sthutrval_cluster.yaml b/site/services/148_vc_mgmt_sthutrval_cluster.yaml index 5b38d61..aa5e010 100644 --- a/site/services/148_vc_mgmt_sthutrval_cluster.yaml +++ b/site/services/148_vc_mgmt_sthutrval_cluster.yaml @@ -19,6 +19,11 @@ cfsParams: defaultValue: '' isModifiable: false dataDescriptor: + clusterName: + dataType: string + defaultValue: k8s-6sa9dyug + isRequired: true + isModifiable: false resourceRealm: dataType: string defaultValue: sandbox.nubes.ru @@ -26,9 +31,14 @@ cfsParams: isModifiable: false valueList: - sandbox.nubes.ru - clusterName: + providerVdc: dataType: string - defaultValue: example-ywasgmh6 + defaultValue: '' + isRequired: true + isModifiable: false + networkProvider: + dataType: string + defaultValue: '' isRequired: true isModifiable: false - svcOperationCfsParamId: 772 @@ -40,10 +50,11 @@ cfsParams: dataDescriptor: appVersion: dataType: string - defaultValue: 2.13.1 + defaultValue: 2.14.0 isRequired: true isModifiable: false valueList: + - 2.14.0 - 2.13.1 - 2.12.1 - 2.11.0 @@ -82,6 +93,18 @@ cfsParams: defaultValue: '[{}]' isModifiable: false dataDescriptor: + groupName: + dataType: string + defaultValue: workers-5tcvtwk4 + isRequired: true + isModifiable: false + sizingPolicy: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - '{}' sizingDisk: dataType: integer > 0 defaultValue: '50' @@ -92,18 +115,32 @@ cfsParams: defaultValue: '2' isRequired: true isModifiable: false - groupName: - dataType: string - defaultValue: workers-gj7zkkhv - isRequired: true - isModifiable: false - sizingPolicy: - dataType: string - defaultValue: '' + autoscale: + dataType: boolean + defaultValue: 'false' isRequired: true isModifiable: false valueList: - - '{}' + - 'false' + - 'true' + autoscaleMin: + dataType: integer > 0 + defaultValue: '2' + isRequired: true + isModifiable: false + autoscaleMax: + dataType: integer > 0 + defaultValue: '3' + isRequired: true + isModifiable: false + labelDeck: + dataType: boolean + defaultValue: 'true' + isRequired: true + isModifiable: false + valueList: + - 'true' + - 'false' - svcOperationCfsParamId: 775 svcOperationCfsParam: accessConfiguration dataType: map-fixed @@ -111,18 +148,6 @@ cfsParams: defaultValue: '' isModifiable: false dataDescriptor: - needExternalAddressIngress: - dataType: boolean - defaultValue: 'true' - isRequired: true - isModifiable: false - valueList: - - 'true' - accessIpListIngress: - dataType: json - defaultValue: '[]' - isRequired: true - isModifiable: false needExternalAddressAPI: dataType: boolean defaultValue: 'true' @@ -135,6 +160,18 @@ cfsParams: defaultValue: '[]' isRequired: true isModifiable: false + needExternalAddressIngress: + dataType: boolean + defaultValue: 'true' + isRequired: true + isModifiable: false + valueList: + - 'true' + accessIpListIngress: + dataType: json + defaultValue: '[]' + isRequired: true + isModifiable: false cfsParamsByOp: 258: - 771 @@ -143,8 +180,8 @@ cfsParamsByOp: - 774 - 775 stateParams: - startupConfiguration: '{"resourceRealm": "sandbox.nubes.ru", "clusterName": "example-ywasgmh6"}' - clusterConfiguration: '{"appVersion": "2.13.1"}' + startupConfiguration: '{"clusterName": "k8s-6sa9dyug", "resourceRealm": "sandbox.nubes.ru", "providerVdc": "", "networkProvider": ""}' + clusterConfiguration: '{"appVersion": "2.14.0"}' controlPlaneConfiguration: '{"sizingPolicy": "", "sizingDisk": 50, "count": 1}' - workerConfiguration: '{"sizingDisk": 50, "count": 2, "groupName": "workers-gj7zkkhv", "sizingPolicy": ""}' - accessConfiguration: '{"needExternalAddressIngress": true, "accessIpListIngress": "[]", "needExternalAddressAPI": true, "accessIpListAPI": "[]"}' + workerConfiguration: '{"groupName": "workers-5tcvtwk4", "sizingPolicy": "", "sizingDisk": 50, "count": 2, "autoscale": false, "autoscaleMin": 2, "autoscaleMax": 3, "labelDeck": true}' + accessConfiguration: '{"needExternalAddressAPI": true, "accessIpListAPI": "[]", "needExternalAddressIngress": true, "accessIpListIngress": "[]"}' diff --git a/site/services/149_valo_tenant.yaml b/site/services/149_valo_tenant.yaml index 92c5262..cba804b 100644 --- a/site/services/149_valo_tenant.yaml +++ b/site/services/149_valo_tenant.yaml @@ -62,19 +62,6 @@ cfsParams: defaultValue: '{}' isModifiable: true dataDescriptor: - ffLogging: - dataType: boolean - defaultValue: 'true' - isRequired: true - isModifiable: false - valueList: - - 'false' - - 'true' - userCount: - dataType: integer > 0 - defaultValue: '10' - isRequired: true - isModifiable: false requestApproveMaxPeriod: dataType: integer > 0 defaultValue: '2' @@ -120,6 +107,19 @@ cfsParams: valueList: - 'false' - 'true' + ffLogging: + dataType: boolean + defaultValue: 'true' + isRequired: true + isModifiable: false + valueList: + - 'false' + - 'true' + userCount: + dataType: integer > 0 + defaultValue: '10' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 658 svcOperationCfsParam: s3Storage dataType: integer > 0 @@ -133,6 +133,11 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: + userCount: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false requestApproveMaxPeriod: dataType: integer > 0 defaultValue: '' @@ -186,11 +191,6 @@ cfsParams: valueList: - 'false' - 'true' - userCount: - dataType: integer > 0 - defaultValue: '' - isRequired: true - isModifiable: false - svcOperationCfsParamId: 660 svcOperationCfsParam: s3Storage dataType: integer > 0 @@ -212,5 +212,5 @@ cfsParamsByOp: stateParams: resourceRealm: valo.ngcloud.ru domain: '' - valoOptions: '{"ffLogging": true, "userCount": 10, "requestApproveMaxPeriod": 2, "ffOnlineEditor": true, "ffWatermark": true, "ffUserImport": true, "ffThemes": true, "ffPublicLink": true}' + valoOptions: '{"requestApproveMaxPeriod": 2, "ffOnlineEditor": true, "ffWatermark": true, "ffUserImport": true, "ffThemes": true, "ffPublicLink": true, "ffLogging": true, "userCount": 10}' s3Storage: '10' diff --git a/site/services/150_k8s_sthutrval_cluster.yaml b/site/services/150_k8s_sthutrval_cluster.yaml index 77d7dfc..d8ceefd 100644 --- a/site/services/150_k8s_sthutrval_cluster.yaml +++ b/site/services/150_k8s_sthutrval_cluster.yaml @@ -2,7 +2,17 @@ name: k8s_sthutrval_cluster service_id: 150 service_display_name: Kubernetes кластер Штурвал service_short_name: k8sSthutrvalCluster -service_man: Перед разворачиванием убедиться, что в облаке есть 2 свободных невыделенных IP в пуле +service_man: '# Развёртывание Kubernetes: ограничения и предварительный чек-лист

> **Внимание:** перед началом развёртывания кластера Kubernetes убедитесь, что выполнены все описанные ниже условия. + Несоблюдение порядка шагов может привести к ошибкам при создании кластера.

---

## Ограничения при развёртывании

| Ограничение | Статус |
|---|---|
| 1 кластер = 1 vDC + | Действует (будет исправлено в ближайшее время) |

---

## Предварительный чек-лист

Перед установкой кластера Kubernetes необходимо последовательно выполнить следующие шаги.

### + 1. Создать организацию в Cloud Director

- Перейдите в услугу **Организация в Cloud Director**.
- Создайте организацию.

### 2. Создать виртуальный датацентр (vDC)

- Перейдите + в услугу **Виртуальный датацентр (vDC)**.
- Создайте vDC.
- Выделите **достаточно ресурсов для разворачивания _всех_ нод** кластера.

### 3. Создать Edge (сетевой шлюз периметра)

- + Перейдите в услугу **Сетевой шлюз периметра (Edge)**.
- Создайте Edge.
- Обязательно:
- Включить **ALB**.
- Установить **Кол-во VS на AVI ≥ 3**.

### 4. Добавить внешние адреса + в организации

- Вернитесь в **Организация в Cloud Director**.
- Выполните операцию **Modify**.
- Добавьте **3 внешних адреса**.
- Количество `ipSpaces` значения не имеет, важно чтобы + суммарно было 3 адреса.

### 5. Настроить SNAT для виртуальных машин

- Вернитесь в **Сетевой шлюз периметра (Edge)**.
- Выполните операцию **Modify**.
- Выберите доступный `ipSpaceName`.
- + Это будет **SNAT для виртуальных машин**.

### 6. Развернуть кластер Kubernetes

- Только **после выполнения всех шагов выше** переходите к услуге **Kubernetes кластер Штурвал**.
- + Начните разворачивание кластера.

---

## Минимальные требования к кластеру

| Параметр | Значение |
|---|---|
| Мастер-ноды | минимум **1** |
| Воркер-ноды | минимум + **1** |
| CPU (на ноду) | **4 vCPU** |
| RAM (на ноду) | **8 GB** |
| Диск (на ноду) | **50 GB** |

---' lifecycle: suspendOnDestroyDefault: true adoptExistingOnCreateDefault: false @@ -49,6 +59,11 @@ cfsParams: defaultValue: '' isModifiable: false dataDescriptor: + vdcUid: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false nsxtUid: dataType: string defaultValue: '' @@ -56,14 +71,65 @@ cfsParams: isModifiable: false clusterName: dataType: string - defaultValue: example-kcrwfrbd + defaultValue: example-ryatr2rx isRequired: true isModifiable: false - vdcUid: - dataType: string - defaultValue: '' - isRequired: true + exLogging: + dataType: boolean + defaultValue: 'true' + isRequired: false isModifiable: false + valueList: + - 'true' + - 'false' + exMonitoring: + dataType: boolean + defaultValue: 'true' + isRequired: false + isModifiable: false + valueList: + - 'true' + - 'false' + exLocalCsi: + dataType: boolean + defaultValue: 'true' + isRequired: false + isModifiable: false + valueList: + - 'true' + - 'false' + exVip: + dataType: boolean + defaultValue: 'true' + isRequired: false + isModifiable: false + valueList: + - 'true' + - 'false' + exUpdate: + dataType: boolean + defaultValue: 'true' + isRequired: false + isModifiable: false + valueList: + - 'true' + - 'false' + exIngress: + dataType: boolean + defaultValue: 'true' + isRequired: false + isModifiable: false + valueList: + - 'true' + - 'false' + exNamedCsi: + dataType: boolean + defaultValue: 'true' + isRequired: false + isModifiable: false + valueList: + - 'true' + - 'false' - svcOperationCfsParamId: 751 svcOperationCfsParam: controlPlaneConfiguration dataType: map-fixed @@ -71,6 +137,13 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: + sizingPolicy: + dataType: string + defaultValue: '[]' + isRequired: true + isModifiable: false + valueList: + - '{}' sizingDisk: dataType: integer > 0 defaultValue: '50' @@ -85,13 +158,6 @@ cfsParams: - '1' - '3' - '5' - sizingPolicy: - dataType: string - defaultValue: '[]' - isRequired: true - isModifiable: false - valueList: - - '{}' - svcOperationCfsParamId: 752 svcOperationCfsParam: workerConfiguration dataType: array-map-fixed @@ -101,7 +167,7 @@ cfsParams: dataDescriptor: groupName: dataType: string - defaultValue: workers-rbrr6za5 + defaultValue: workers-e6bfgpqf isRequired: true isModifiable: false sizingPolicy: @@ -121,6 +187,32 @@ cfsParams: defaultValue: '2' isRequired: true isModifiable: false + autoscale: + dataType: boolean + defaultValue: 'false' + isRequired: false + isModifiable: false + valueList: + - 'false' + - 'true' + autoscaleMin: + dataType: integer > 0 + defaultValue: '2' + isRequired: false + isModifiable: false + autoscaleMax: + dataType: integer > 0 + defaultValue: '3' + isRequired: false + isModifiable: false + labelDeck: + dataType: boolean + defaultValue: 'true' + isRequired: true + isModifiable: false + valueList: + - 'true' + - 'false' - svcOperationCfsParamId: 753 svcOperationCfsParam: accessConfiguration dataType: map-fixed @@ -161,10 +253,11 @@ cfsParams: dataDescriptor: appVersion: dataType: string - defaultValue: 2.13.1 + defaultValue: 2.14.0 isRequired: true isModifiable: false valueList: + - 2.14.0 - 2.13.1 - 2.12.1 - 2.11.0 @@ -205,6 +298,7 @@ cfsParams: isRequired: true isModifiable: false valueList: + - 2.14.0 - 2.13.1 - 2.12.1 - 2.11.0 @@ -245,7 +339,7 @@ cfsParams: dataDescriptor: groupName: dataType: string - defaultValue: workers-kk0fpv6w + defaultValue: workers-ohtgog3p isRequired: true isModifiable: false sizingPolicy: @@ -261,10 +355,36 @@ cfsParams: isRequired: true isModifiable: false count: - dataType: integer > 0 + dataType: integer >= 0 defaultValue: '' isRequired: true isModifiable: false + autoscale: + dataType: boolean + defaultValue: '' + isRequired: false + isModifiable: false + valueList: + - 'false' + - 'true' + autoscaleMin: + dataType: integer > 0 + defaultValue: '' + isRequired: false + isModifiable: false + autoscaleMax: + dataType: integer > 0 + defaultValue: '' + isRequired: false + isModifiable: false + labelDeck: + dataType: boolean + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - 'true' + - 'false' - svcOperationCfsParamId: 759 svcOperationCfsParam: accessConfiguration dataType: map-fixed @@ -317,8 +437,9 @@ cfsParamsByOp: 174: [] 173: [] stateParams: - startupConfiguration: '{"nsxtUid": "", "clusterName": "example-kcrwfrbd", "vdcUid": ""}' - controlPlaneConfiguration: '{"sizingDisk": 50, "count": 1, "sizingPolicy": "[]"}' - workerConfiguration: '{"groupName": "workers-rbrr6za5", "sizingPolicy": "", "sizingDisk": 50, "count": 2}' + startupConfiguration: '{"vdcUid": "", "nsxtUid": "", "clusterName": "example-ryatr2rx", "exLogging": true, "exMonitoring": true, "exLocalCsi": true, "exVip": true, "exUpdate": true, "exIngress": true, + "exNamedCsi": true}' + controlPlaneConfiguration: '{"sizingPolicy": "[]", "sizingDisk": 50, "count": 1}' + workerConfiguration: '{"groupName": "workers-e6bfgpqf", "sizingPolicy": "", "sizingDisk": 50, "count": 2, "autoscale": false, "autoscaleMin": 2, "autoscaleMax": 3, "labelDeck": true}' accessConfiguration: '{"needExternalAddressAPI": true, "accessIpListAPI": "[]", "needExternalAddressIngress": true, "accessIpListIngress": "[]"}' - clusterConfiguration: '{"appVersion": "2.13.1"}' + clusterConfiguration: '{"appVersion": "2.14.0"}' diff --git a/site/services/151_k8s_openbao.yaml b/site/services/151_k8s_openbao.yaml index 94de8e5..d71c624 100644 --- a/site/services/151_k8s_openbao.yaml +++ b/site/services/151_k8s_openbao.yaml @@ -71,10 +71,6 @@ operations: operation: recovery_secrets kind: subresource action: recovery -- svcOperationId: 234 - operation: restart - kind: action - action: restart - svcOperationId: 216 operation: resume kind: instance @@ -103,10 +99,9 @@ cfsParams: defaultValue: '' isModifiable: false valueList: - - iot-naeel + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 - svcOperationCfsParamId: 664 svcOperationCfsParam: resourceCPU dataType: integer > 0 @@ -143,13 +138,13 @@ cfsParams: svcOperationCfsParam: domain dataType: string isRequired: true - defaultValue: bao-ovkw1qbi + defaultValue: bao-nosgzjqe isModifiable: false - svcOperationCfsParamId: 675 svcOperationCfsParam: kvName dataType: string isRequired: true - defaultValue: kvname-bbycmhbz + defaultValue: kvname-ps9az5f9 isModifiable: false - svcOperationCfsParamId: 728 svcOperationCfsParam: policySettings @@ -158,21 +153,21 @@ cfsParams: defaultValue: '' isModifiable: false dataDescriptor: - capabilities: - dataType: json - defaultValue: '["read", "list"]' - isRequired: true - isModifiable: false path: dataType: string defaultValue: '' isRequired: true isModifiable: false + capabilities: + dataType: json + defaultValue: '["read", "list"]' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 729 svcOperationCfsParam: policyName dataType: string isRequired: true - defaultValue: policy-xqjoiy6t + defaultValue: policy-kyvtdypv isModifiable: false - svcOperationCfsParamId: 677 svcOperationCfsParam: kvName @@ -279,12 +274,12 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - capabilities: + path: dataType: string defaultValue: '' isRequired: true isModifiable: false - path: + capabilities: dataType: string defaultValue: '' isRequired: true @@ -353,7 +348,6 @@ cfsParamsByOp: - 723 - 724 - 725 - 234: [] 216: [] 215: [] 238: @@ -371,4 +365,4 @@ stateParams: resourceMemory: '512' resourceDisk: '10' appVersion: 2.5.2 - domain: bao-ovkw1qbi + domain: bao-nosgzjqe diff --git a/site/services/153_nifi.yaml b/site/services/153_nifi.yaml new file mode 100644 index 0000000..bd0f842 --- /dev/null +++ b/site/services/153_nifi.yaml @@ -0,0 +1,100 @@ +name: nifi +service_id: 153 +service_display_name: Nifi +service_short_name: nifi +lifecycle: + suspendOnDestroyDefault: false + adoptExistingOnCreateDefault: false +operations: +- svcOperationId: 229 + operation: create + kind: instance + action: create +- svcOperationId: 235 + operation: delete + kind: instance + action: delete +stateOut: {} +cfsParams: +- svcOperationCfsParamId: 711 + svcOperationCfsParam: domain + dataType: string + isRequired: true + defaultValue: nifi-qmpqdalo + isModifiable: false +- svcOperationCfsParamId: 712 + svcOperationCfsParam: resourceCPU + dataType: integer > 0 + isRequired: true + defaultValue: '2000' + isModifiable: false +- svcOperationCfsParamId: 713 + svcOperationCfsParam: resourceMemory + dataType: integer > 0 + isRequired: true + defaultValue: '4096' + isModifiable: false +- svcOperationCfsParamId: 714 + svcOperationCfsParam: resourceInstances + dataType: integer > 0 + isRequired: true + defaultValue: '1' + isModifiable: false + valueList: + - '1' +- svcOperationCfsParamId: 715 + svcOperationCfsParam: resourceDisk + dataType: integer > 0 + isRequired: true + defaultValue: '10' + isModifiable: false +- svcOperationCfsParamId: 716 + svcOperationCfsParam: appVersion + dataType: string + isRequired: true + defaultValue: 2.6.0 + isModifiable: false + valueList: + - 2.6.0 +- svcOperationCfsParamId: 717 + svcOperationCfsParam: resourceRealm + dataType: string + isRequired: true + defaultValue: '' + isModifiable: false + valueList: + - devclustername + - k8s-3-sandbox-nubes-ru + - k8s-4-sandbox-nubes-ru +- svcOperationCfsParamId: 718 + svcOperationCfsParam: jdbcDrivers + dataType: array-map-fixed + isRequired: true + defaultValue: '' + isModifiable: false + dataDescriptor: + path: + dataType: string + defaultValue: https://jdbc.postgresql.org/download/postgresql-42.7.8.jar + isRequired: true + isModifiable: false +cfsParamsByOp: + 229: + - 711 + - 712 + - 713 + - 714 + - 715 + - 716 + - 717 + - 718 + 235: [] +stateParams: + domain: nifi-qmpqdalo + resourceCPU: '2000' + resourceMemory: '4096' + resourceInstances: '1' + resourceDisk: '10' + appVersion: 2.6.0 + resourceRealm: '' + jdbcDrivers: '{"path": "https://jdbc.postgresql.org/download/postgresql-42.7.8.jar"}' diff --git a/site/services/163_llm_ai.yaml b/site/services/163_llm_ai.yaml index 9036c7a..5251903 100644 --- a/site/services/163_llm_ai.yaml +++ b/site/services/163_llm_ai.yaml @@ -1,33 +1,39 @@ name: llm_ai service_id: 163 -service_display_name: LLM +service_display_name: ML Улей service_short_name: llmAi service_man: '## 1. Общая информация

LLMaaS (Large Language Model as a Service) — это сервис для доступа к языковым моделям через OpenAI-совместимое API.
Платформа позволяет создавать организации - (тенанты), команды, выпускать и управлять API-ключами, устанавливать лимиты на использование.

---

## Доступные операции

- **create** — Создание организации в LLMaaS
- - **delete** — Удаление организации

- **create_team** — Создание команды внутри организации
- **modify_team** — Редактирование команды (модели, RPM, TPM)
- **delete_team** — - Удаление команды

- **create_secrets** — Создание API-ключа
- **update_secrets** — Обновление параметров API-ключа
- **delete_secrets** — Удаление API-ключа

---

## + (тенанты), команды, выпускать и управлять API-ключами, устанавливать лимиты на использование.

### Ограничение: одна организация на контрагента

На одного контрагента может быть создана + **только одна организация** в LLMaaS.
Повторная попытка создать организацию для того же контрагента завершится ошибкой.

### Возможные ошибки и как их обрабатывать

При работе с сервисом + могут возникнуть типовые ошибки. Ниже описано, как их распознать и что делать.

| Ошибка | Когда возникает | Что делать |
|--------|-----------------|------------|
| `Организация в LLMaaS + уже привязана к контрагенту ` | При операции `create`, если организация для данного контрагента уже существует | На одного контрагента допускается только одна организация. Если нужно изменить + существующую организацию, используйте операции управления командами и ключами |
| `Не хватает нужного гранта. Примените реконсиляцию для данного инстанса` | При операциях `create_team`, `modify_team`, + если модель не выдана организации на Layer 1 | Запустите операцию `reconcile` для данного инстанса. Она обновит список моделей, доступных организации, после чего повторите исходную операцию |
| `Лимиты + API-ключа не могут превышать лимиты команды` | При операциях `create_secrets`, `update_secrets` | Уменьшите значения `RPM` и/или `TPM` ключа до уровня команды или увеличьте лимиты самой команды через + `modify_team` |

---

## Доступные операции

- **create** — Создание организации в LLMaaS
- **delete** — Удаление организации

- **create_team** — + Создание команды внутри организации
- **modify_team** — Редактирование команды (модели, RPM, TPM)
- **delete_team** — Удаление команды

- **create_secrets** — Создание API-ключа
- + **update_secrets** — Обновление параметров API-ключа
- **delete_secrets** — Удаление API-ключа

- **reconcile** — Обновление списка моделей, доступных организации

---

## 2. Параметры создания организации

Ниже перечислены параметры, которые необходимо указать при создании организации:

* **Платформа для развертывания**
Выбирается автоматически, изменять - не нужно.

* **Период бюджета**
Срок жизни организации в днях.
Пример: `30`


---

## 3. Параметры создания команды

* **Имя команды**
Уникальное - имя команды в рамках организации.
Пример: `production`

* **Модель**
Название модели, доступной для команды.
Пример: `gpt-oss-120b`

* **Лимит запросов в минуту (RPM)**
Максимальное - количество запросов к API в минуту.
Пример: `60`

* **Лимит токенов в минуту (TPM)**
Максимальное количество токенов (входящих + исходящих) в минуту.
Пример: `100000`

---

## - 4. Параметры редактирования команды

Для существующей команды можно изменить:

* **Модель**
Новая модель для команды.
Пример: `gpt-oss-20b`

* **Лимит запросов в минуту - (RPM)**
Новое значение RPM.
Пример: `120`

* **Лимит токенов в минуту (TPM)**
Новое значение TPM.
Пример: `200000`

---

## 5. Параметры создания API-ключа

Ниже - перечислены параметры, которые необходимо указать при создании API-ключа:

* **Имя ключа**
Уникальное имя ключа в рамках организации.
Пример: `prod-key`

* **Команда**
Имя - команды для привязки ключа. Если не указано — ключ привязывается к команде `main`.
Пример: `production`

* **Модель**
Название модели, доступной для данного ключа.
Пример: `gpt-oss-120b`

* - **Лимит запросов в минуту (RPM)**
Максимальное количество запросов к API в минуту.
Пример: `60`

* **Лимит токенов в минуту (TPM)**
Максимальное количество токенов (входящих - + исходящих) в минуту.
Пример: `100000`

**Важно:** Лимиты API-ключа не могут превышать лимиты команды, к которой он привязан.
При превышении операция будет отклонена с ошибкой.
Перед - созданием ключа убедитесь, что `RPM <= team.RPM` и `TPM <= team.TPM`.


---

## 6. Параметры обновления API-ключа

Для уже существующего ключа можно изменить параметры. Все - параметры являются опциональными:

* **Имя ключа**
Имя обновляемого ключа.
Пример: `prod-key`

* **Модель**
Новое название модели.
Пример: `gpt-oss-20b`

* - **Лимит запросов в минуту (RPM)**
Новое значение RPM.
Пример: `120`

* **Лимит токенов в минуту (TPM)**
Новое значение TPM.
Пример: `200000`

**Важно:** При обновлении - лимитов API-ключа новые значения не могут превышать лимиты команды.
Если указать значения выше командных, операция завершится ошибкой.
Указывайте `RPM <= team.RPM` и `TPM <= team.TPM`.

Команда - определяется автоматически по стейту услуги — изменить привязку к другой команде через эту операцию нельзя.

---

## 7. Параметры удаления API-ключа

* **Команда**
Имя команды, - к которой привязан ключ.
Пример: `production`

* **Имя ключа**
Имя удаляемого ключа.
Пример: `prod-key`

---

## 8. Параметры удаления команды

* **Имя - команды**
Имя удаляемой команды.
Пример: `production`

---

## 9. Параметры удаления организации

Удаление организации не требует дополнительных параметров — удаляется - вся организация со всеми командами и ключами.

---

## 10. Выходные параметры

После успешного создания организации платформа возвращает:

* **connectionUrl**
URL - для доступа к inference API (OpenAI-совместимый).
Пример: `https://api.aillm.ru`

---


## 12. Пример использования API

После получения API-ключа клиент может обращаться - к LLMaaS напрямую:

**Запрос к chat completions:**

```bash
curl https://api.aillm.ru/v1/chat/completions \
-H "Authorization: Bearer sk-..." \
-H "Content-Type: application/json" - \
-d ''{
"model": "gpt-oss-120b",
"messages": [
{"role": "user", "content": "Привет!"}
]
}''
```

**Получение списка доступных моделей:**

```bash
curl - https://api.aillm.ru/v1/models \
-H "Authorization: Bearer sk-..."
```
' + не нужно.

## 3. Параметры создания команды

* **Имя команды**
Уникальное имя команды в рамках организации.
Пример: `production`

* **Модель**
Название модели, + доступной для команды.
Пример: `gpt-oss-120b`

* **Лимит запросов в минуту (RPM)**
Максимальное количество запросов к API в минуту.
Пример: `60`

* **Лимит токенов в + минуту (TPM)**
Максимальное количество токенов (входящих + исходящих) в минуту.
Пример: `100000`

---

## 4. Параметры редактирования команды

Для существующей команды + можно изменить:

* **Модель**
Новая модель для команды.
Пример: `gpt-oss-20b`

* **Лимит запросов в минуту (RPM)**
Новое значение RPM.
Пример: `120`

* + **Лимит токенов в минуту (TPM)**
Новое значение TPM.
Пример: `200000`

---

## 5. Параметры создания API-ключа

Ниже перечислены параметры, которые необходимо указать + при создании API-ключа:

* **Имя ключа**
Уникальное имя ключа в рамках организации.
Пример: `prod-key`

* **Команда**
Имя команды для привязки ключа. Если не указано + — ключ привязывается к команде `main`.
Пример: `production`

* **Модель**
Название модели, доступной для данного ключа.
Пример: `gpt-oss-120b`

* **Лимит запросов в минуту + (RPM)**
Максимальное количество запросов к API в минуту.
Пример: `60`

* **Лимит токенов в минуту (TPM)**
Максимальное количество токенов (входящих + исходящих) в минуту.
Пример: + `100000`

**Важно:** Лимиты API-ключа не могут превышать лимиты команды, к которой он привязан.
При превышении операция будет отклонена с ошибкой.
Перед созданием ключа убедитесь, что + `RPM <= team.RPM` и `TPM <= team.TPM`.


---

## 6. Параметры обновления API-ключа

Для уже существующего ключа можно изменить параметры. Все параметры являются опциональными:

* + **Имя ключа**
Имя обновляемого ключа.
Пример: `prod-key`

* **Модель**
Новое название модели.
Пример: `gpt-oss-20b`

* **Лимит запросов в минуту (RPM)**
Новое + значение RPM.
Пример: `120`

* **Лимит токенов в минуту (TPM)**
Новое значение TPM.
Пример: `200000`

**Важно:** При обновлении лимитов API-ключа новые значения не могут + превышать лимиты команды.
Если указать значения выше командных, операция завершится ошибкой.
Указывайте `RPM <= team.RPM` и `TPM <= team.TPM`.

Команда определяется автоматически по стейту + услуги — изменить привязку к другой команде через эту операцию нельзя.

---

## 7. Параметры удаления API-ключа

* **Команда**
Имя команды, к которой привязан ключ.
Пример: + `production`

* **Имя ключа**
Имя удаляемого ключа.
Пример: `prod-key`

---

## 8. Параметры удаления команды

* **Имя команды**
Имя удаляемой команды.
Пример: + `production`

---

## 9. Параметры удаления организации

Удаление организации не требует дополнительных параметров — удаляется вся организация со всеми командами и ключами.

---

## + 10. Выходные параметры

После успешного создания организации платформа возвращает:

* **connectionUrl**
URL для доступа к inference API (OpenAI-совместимый).
Пример: `https://api.aillm.ru`

---


## + 11. Пример использования API

После получения API-ключа клиент может обращаться к LLMaaS напрямую:

**Запрос к chat completions:**

```bash
curl https://api.aillm.ru/v1/chat/completions + \
-H "Authorization: Bearer sk-..." \
-H "Content-Type: application/json" \
-d ''{
"model": "gpt-oss-120b",
"messages": [
{"role": "user", "content": "Привет!"}
]
}''
```

**Получение + списка доступных моделей:**

```bash
curl https://api.aillm.ru/v1/models \
-H "Authorization: Bearer sk-..."
```
' lifecycle: suspendOnDestroyDefault: false adoptExistingOnCreateDefault: false @@ -60,6 +66,10 @@ operations: operation: modify_team kind: subresource action: modify +- svcOperationId: 412 + operation: reconcile + kind: action + action: reconcile - svcOperationId: 277 operation: update_secrets kind: subresource @@ -202,6 +212,12 @@ cfsParams: isRequired: true defaultValue: '' isModifiable: true +- svcOperationCfsParamId: 1157 + svcOperationCfsParam: '' + dataType: map-fixed + isRequired: true + defaultValue: '' + isModifiable: true cfsParamsByOp: 271: - 826 @@ -227,11 +243,13 @@ cfsParamsByOp: - 865 - 873 - 874 + 412: [] 277: - 852 - 853 - 854 - 855 - 875 + - 1157 stateParams: resourceRealm: llmAi.aillm.ru diff --git a/site/services/19_vc_org.yaml b/site/services/19_vc_org.yaml index 95fea45..5a4c297 100644 --- a/site/services/19_vc_org.yaml +++ b/site/services/19_vc_org.yaml @@ -73,6 +73,12 @@ cfsParams: valueList: - iaas - saas +- svcOperationCfsParamId: 1125 + svcOperationCfsParam: organizationSuffix + dataType: string + isRequired: false + defaultValue: '' + isModifiable: false - svcOperationCfsParamId: 871 svcOperationCfsParam: admins dataType: array-map-fixed @@ -110,7 +116,7 @@ cfsParams: isRequired: true isModifiable: false count: - dataType: integer > 0 + dataType: integer >= 0 defaultValue: '' isRequired: true isModifiable: false @@ -118,6 +124,7 @@ cfsParamsByOp: 136: - 418 - 556 + - 1125 283: - 871 137: [] @@ -131,3 +138,4 @@ cfsParamsByOp: stateParams: resourceRealm: sandbox.nubes.ru organizationType: iaas + organizationSuffix: '' diff --git a/site/services/1_dummy.yaml b/site/services/1_dummy.yaml index ff91e5b..fc19816 100644 --- a/site/services/1_dummy.yaml +++ b/site/services/1_dummy.yaml @@ -100,12 +100,12 @@ cfsParams: defaultValue: '' isRequired: false isModifiable: false - secret: + subparam2: dataType: string defaultValue: '' isRequired: false isModifiable: false - subparam2: + secret: dataType: string defaultValue: '' isRequired: false @@ -129,6 +129,25 @@ cfsParams: defaultValue: '' isModifiable: false dataDescriptor: + param1: + dataType: integer > 0 + defaultValue: '1' + isRequired: true + isModifiable: false + param2: + dataType: string + defaultValue: '1' + isRequired: true + isModifiable: false + valueList: + - '["1"' + - '"2"' + - '"3"]' + param3: + dataType: integer > 0 + defaultValue: '1' + isRequired: true + isModifiable: false bol1: dataType: boolean defaultValue: 'false' @@ -140,18 +159,32 @@ cfsParams: minStr1: dataType: string defaultValue: abracadabra - isRequired: true + isRequired: false isModifiable: false valueList: - abracadabra + - incorr + - correctvalue + s3-inst: + dataType: string + defaultValue: '' + isRequired: false + isModifiable: false +- svcOperationCfsParamId: 654 + svcOperationCfsParam: arrayMapFixedExample + dataType: array-map-fixed + isRequired: false + defaultValue: '' + isModifiable: false + dataDescriptor: param1: dataType: integer > 0 - defaultValue: '1' + defaultValue: '' isRequired: true isModifiable: false param2: dataType: string - defaultValue: '1' + defaultValue: '' isRequired: true isModifiable: false valueList: @@ -163,13 +196,6 @@ cfsParams: defaultValue: '1' isRequired: true isModifiable: false -- svcOperationCfsParamId: 654 - svcOperationCfsParam: arrayMapFixedExample - dataType: array-map-fixed - isRequired: false - defaultValue: '' - isModifiable: false - dataDescriptor: bol1: dataType: boolean defaultValue: '' @@ -185,25 +211,6 @@ cfsParams: isModifiable: false valueList: - abracadabra - param1: - dataType: integer > 0 - defaultValue: '' - isRequired: true - isModifiable: false - param2: - dataType: string - defaultValue: '' - isRequired: true - isModifiable: false - valueList: - - '["1"' - - '"2"' - - '"3"]' - param3: - dataType: integer > 0 - defaultValue: '1' - isRequired: true - isModifiable: false - svcOperationCfsParamId: 863 svcOperationCfsParam: arr dataType: array @@ -214,6 +221,12 @@ cfsParams: - test - '2' - val1 +- svcOperationCfsParamId: 1131 + svcOperationCfsParam: s3-ref-root + dataType: string + isRequired: false + defaultValue: '' + isModifiable: false - svcOperationCfsParamId: 287 svcOperationCfsParam: durationMs dataType: integer >= 0 @@ -286,6 +299,7 @@ cfsParamsByOp: - 647 - 654 - 863 + - 1131 71: [] 92: - 287 @@ -306,9 +320,10 @@ stateParams: whereFail: '1' resourceRealm: dummy bodymessage: '' - mapExample: '{"subparam1": "", "secret": "", "subparam2": ""}' + mapExample: '{"subparam1": "", "subparam2": "", "secret": ""}' jsonExample: '' nestedRefExample: '' - mapFixed: '{"bol1": false, "minStr1": "abracadabra", "param1": 1, "param2": "1", "param3": 1}' - arrayMapFixedExample: '{"bol1": false, "minStr1": "", "param1": 0, "param2": "", "param3": 1}' + mapFixed: '{"param1": 1, "param2": "1", "param3": 1, "bol1": false, "minStr1": "abracadabra", "s3-inst": ""}' + arrayMapFixedExample: '{"param1": 0, "param2": "", "param3": 1, "bol1": false, "minStr1": ""}' arr: '' + s3-ref-root: '' diff --git a/site/services/21_vc_vdc.yaml b/site/services/21_vc_vdc.yaml index 662531f..afd9c83 100644 --- a/site/services/21_vc_vdc.yaml +++ b/site/services/21_vc_vdc.yaml @@ -84,12 +84,12 @@ cfsParams: isModifiable: false - svcOperationCfsParamId: 397 svcOperationCfsParam: cpuGuaranteed - dataType: integer > 0 + dataType: integer >= 0 isRequired: true - defaultValue: '20' + defaultValue: '0' isModifiable: false valueList: - - '20' + - '0' - '50' - '80' - svcOperationCfsParamId: 557 @@ -110,6 +110,12 @@ cfsParams: isRequired: true defaultValue: '' isModifiable: false +- svcOperationCfsParamId: 1130 + svcOperationCfsParam: suffixName + dataType: string + isRequired: false + defaultValue: 7uabwsgb + isModifiable: false - svcOperationCfsParamId: 560 svcOperationCfsParam: cpuAllocated dataType: integer > 0 @@ -148,6 +154,7 @@ cfsParamsByOp: - 557 - 558 - 746 + - 1130 24: [] 112: - 560 @@ -160,7 +167,8 @@ stateParams: organizationUid: '' providerVdc: '' storageConfig: '{"name": "", "size": 2000}' - cpuGuaranteed: '20' + cpuGuaranteed: '0' cpuAllocated: '80' memAllocated: '200' networkProvider: '' + suffixName: 7uabwsgb diff --git a/site/services/22_vc_nsxt.yaml b/site/services/22_vc_nsxt.yaml index 9988cbc..3ffc72f 100644 --- a/site/services/22_vc_nsxt.yaml +++ b/site/services/22_vc_nsxt.yaml @@ -88,6 +88,28 @@ cfsParams: isRequired: false defaultValue: '' isModifiable: true +- svcOperationCfsParamId: 1110 + svcOperationCfsParam: routedNetConfiguration + dataType: map-fixed + isRequired: true + defaultValue: '' + isModifiable: true + dataDescriptor: + ipAddrPool: + dataType: string + defaultValue: 10.10.102.0/24 + isRequired: true + isModifiable: false + mainDns: + dataType: string + defaultValue: 81.22.46.22 + isRequired: true + isModifiable: false + secondDns: + dataType: string + defaultValue: 185.247.187.77 + isRequired: true + isModifiable: false - svcOperationCfsParamId: 368 svcOperationCfsParam: needEnableAVI dataType: boolean @@ -115,6 +137,28 @@ cfsParams: isRequired: false defaultValue: '' isModifiable: true +- svcOperationCfsParamId: 1112 + svcOperationCfsParam: routedNetConfiguration + dataType: map-fixed + isRequired: true + defaultValue: '' + isModifiable: true + dataDescriptor: + ipAddrPool: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false + mainDns: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false + secondDns: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false cfsParamsByOp: 10: - 8 @@ -123,12 +167,14 @@ cfsParamsByOp: - 621 - 622 - 825 + - 1110 25: [] 111: - 368 - 369 - 372 - 856 + - 1112 252: [] stateParams: vdcUid: '' @@ -137,3 +183,4 @@ stateParams: vdcType: vdc vdcGroupUid: '' qosProfile: '' + routedNetConfiguration: '{"ipAddrPool": "10.10.102.0/24", "mainDns": "81.22.46.22", "secondDns": "185.247.187.77"}' diff --git a/site/services/25_vcexternalip.yaml b/site/services/25_vcexternalip.yaml index bbc2bde..1c4ba7f 100644 --- a/site/services/25_vcexternalip.yaml +++ b/site/services/25_vcexternalip.yaml @@ -1,6 +1,6 @@ name: vcexternalip service_id: 25 -service_display_name: Публичные IP адреса +service_display_name: '[DEPRECATED] Публичные IP адреса' service_short_name: vcexternalip service_man: '**Обычно эта услуга разворачивается автоматически при развёртывании более сложных услуг**
Вручную создавать можно, однако услуга требует много параметров, о которых можно просто не знать

Резервировать публичные IP адреса можно только после создания NGcloud Organization, NGcloud Виртуальный датацентр, NGcloud Каталог, Сетевой шлюз периметра.
Вы можете назначить IP адрес для существующего экземпляра diff --git a/site/services/26_vapp.yaml b/site/services/26_vapp.yaml index 140f01c..f9cedd1 100644 --- a/site/services/26_vapp.yaml +++ b/site/services/26_vapp.yaml @@ -52,7 +52,7 @@ cfsParams: svcOperationCfsParam: vappName dataType: string isRequired: true - defaultValue: hf1t7p5c + defaultValue: j8lanwbr isModifiable: false - svcOperationCfsParamId: 623 svcOperationCfsParam: vdcUid @@ -71,5 +71,5 @@ cfsParamsByOp: 208: [] stateParams: nsxtUid: '' - vappName: hf1t7p5c + vappName: j8lanwbr vdcUid: '' diff --git a/site/services/28_vc_vm_v3.yaml b/site/services/28_vc_vm_v3.yaml index a790017..e28850c 100644 --- a/site/services/28_vc_vm_v3.yaml +++ b/site/services/28_vc_vm_v3.yaml @@ -83,11 +83,22 @@ cfsParams: defaultValue: '1' isModifiable: true - svcOperationCfsParamId: 411 - svcOperationCfsParam: vmDisk - dataType: integer > 0 + svcOperationCfsParam: vmDisks + dataType: array-map-fixed isRequired: false - defaultValue: '' + defaultValue: '[{"busNum": 0, "size": "20"}]' isModifiable: true + dataDescriptor: + busNum: + dataType: integer >= 0 + defaultValue: '' + isRequired: true + isModifiable: false + size: + dataType: integer > 0 + defaultValue: '1' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 412 svcOperationCfsParam: ipSpaceName dataType: string @@ -96,9 +107,9 @@ cfsParams: isModifiable: true - svcOperationCfsParamId: 413 svcOperationCfsParam: accessIpList - dataType: json + dataType: array isRequired: false - defaultValue: '' + defaultValue: '["0.0.0.0/0"]' isModifiable: true - svcOperationCfsParamId: 414 svcOperationCfsParam: imageVm @@ -126,10 +137,34 @@ cfsParams: isModifiable: false - svcOperationCfsParamId: 448 svcOperationCfsParam: accessPortList - dataType: string + dataType: array-map-fixed isRequired: true - defaultValue: '["22"]' + defaultValue: '[{"port": "22", "type": "tcp"}, {"port": "10050", "type": "tcp"}]' isModifiable: true + dataDescriptor: + port: + dataType: string + defaultValue: '22' + isRequired: true + isModifiable: false + type: + dataType: string + defaultValue: all + isRequired: true + isModifiable: false + valueList: + - tcp + - udp + - all +- svcOperationCfsParamId: 1118 + svcOperationCfsParam: sameSnat + dataType: boolean + isRequired: false + defaultValue: 'false' + isModifiable: true + valueList: + - 'false' + - 'true' - svcOperationCfsParamId: 493 svcOperationCfsParam: vmCpu dataType: integer > 0 @@ -143,22 +178,28 @@ cfsParams: defaultValue: '' isModifiable: true - svcOperationCfsParamId: 495 - svcOperationCfsParam: vmDisk - dataType: integer > 0 + svcOperationCfsParam: vmDisks + dataType: array-map-fixed isRequired: false defaultValue: '' isModifiable: true + dataDescriptor: + busNum: + dataType: integer >= 0 + defaultValue: '' + isRequired: true + isModifiable: false + size: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 496 svcOperationCfsParam: ipSpaceName dataType: string isRequired: false defaultValue: '' isModifiable: true - valueList: - - no-needed - - internet-antiddos-v1 - - internet-no-antiddos-v1 - - internet-ipv4-v1 - svcOperationCfsParamId: 497 svcOperationCfsParam: accessIpList dataType: json @@ -167,10 +208,34 @@ cfsParams: isModifiable: true - svcOperationCfsParamId: 498 svcOperationCfsParam: accessPortList - dataType: json + dataType: array-map-fixed isRequired: false defaultValue: '' isModifiable: true + dataDescriptor: + port: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false + type: + dataType: string + defaultValue: all + isRequired: true + isModifiable: false + valueList: + - tcp + - udp + - all +- svcOperationCfsParamId: 1119 + svcOperationCfsParam: sameSnat + dataType: boolean + isRequired: true + defaultValue: '' + isModifiable: true + valueList: + - 'false' + - 'true' - svcOperationCfsParamId: 509 svcOperationCfsParam: vmName dataType: string @@ -201,11 +266,6 @@ cfsParams: isRequired: false defaultValue: '' isModifiable: true - valueList: - - no-needed - - internet-antiddos-v1 - - internet-no-antiddos-v1 - - internet-ipv4-v1 - svcOperationCfsParamId: 514 svcOperationCfsParam: accessIpList dataType: json @@ -242,10 +302,34 @@ cfsParams: isModifiable: true - svcOperationCfsParamId: 520 svcOperationCfsParam: accessPortList - dataType: json + dataType: array-map-fixed isRequired: false defaultValue: '' isModifiable: true + dataDescriptor: + port: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false + type: + dataType: string + defaultValue: all + isRequired: true + isModifiable: false + valueList: + - tcp + - udp + - all +- svcOperationCfsParamId: 1123 + svcOperationCfsParam: sameSnat + dataType: boolean + isRequired: true + defaultValue: '' + isModifiable: true + valueList: + - 'false' + - 'true' cfsParamsByOp: 132: - 407 @@ -260,6 +344,7 @@ cfsParamsByOp: - 416 - 417 - 448 + - 1118 133: [] 159: - 493 @@ -268,6 +353,7 @@ cfsParamsByOp: - 496 - 497 - 498 + - 1119 286: [] 164: - 509 @@ -281,6 +367,7 @@ cfsParamsByOp: - 517 - 518 - 520 + - 1123 135: [] 134: [] stateParams: @@ -288,11 +375,12 @@ stateParams: vmName: web01 vmCpu: '1' vmRam: '1' - vmDisk: '' + vmDisks: '{"busNum": 0, "size": 1}' ipSpaceName: '' - accessIpList: '' + accessIpList: '["0.0.0.0/0"]' imageVm: '' cloudInit: '' userLogin: myuser userPublicKey: '' - accessPortList: '["22"]' + accessPortList: '{"port": "22", "type": "all"}' + sameSnat: 'false' diff --git a/site/services/2_template.yaml b/site/services/2_template.yaml index 9b90b83..ab34703 100644 --- a/site/services/2_template.yaml +++ b/site/services/2_template.yaml @@ -44,11 +44,6 @@ cfsParams: defaultValue: '100' isRequired: true isModifiable: false - disk: - dataType: integer > 0 - defaultValue: '5' - isRequired: true - isModifiable: false memory: dataType: integer > 0 defaultValue: '128' @@ -59,6 +54,11 @@ cfsParams: defaultValue: '1' isRequired: true isModifiable: false + disk: + dataType: integer > 0 + defaultValue: '5' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 814 svcOperationCfsParam: startupConfiguration dataType: map-fixed @@ -72,10 +72,9 @@ cfsParams: isRequired: true isModifiable: false valueList: - - iot-naeel + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 - svcOperationCfsParamId: 815 svcOperationCfsParam: accessConfiguration dataType: map-fixed @@ -83,11 +82,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - slaveAccessList: - dataType: json - defaultValue: '[]' - isRequired: true - isModifiable: false type: dataType: string defaultValue: ingress @@ -98,7 +92,7 @@ cfsParams: - service domain: dataType: string - defaultValue: abracadabra-aoy3qnll + defaultValue: abracadabra-i5kntoh3 isRequired: true isModifiable: false masterIpSpace: @@ -116,6 +110,11 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false + slaveAccessList: + dataType: json + defaultValue: '[]' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 816 svcOperationCfsParam: clusterConfiguration dataType: map-fixed @@ -128,13 +127,13 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false - disk: - dataType: integer >= 0 + memory: + dataType: integer > 0 defaultValue: '' isRequired: true isModifiable: false - memory: - dataType: integer > 0 + disk: + dataType: integer >= 0 defaultValue: '' isRequired: true isModifiable: false @@ -168,13 +167,13 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false - masterAccessList: - dataType: json + slaveIpSpace: + dataType: string defaultValue: '' isRequired: true isModifiable: false - slaveIpSpace: - dataType: string + masterAccessList: + dataType: json defaultValue: '' isRequired: true isModifiable: false @@ -196,6 +195,6 @@ cfsParamsByOp: 98: [] 97: [] stateParams: - clusterConfiguration: '{"cpu": 100, "disk": 5, "memory": 128, "replicas": 1}' + clusterConfiguration: '{"cpu": 100, "memory": 128, "replicas": 1, "disk": 5}' startupConfiguration: '{"resourceRealm": ""}' - accessConfiguration: '{"slaveAccessList": "[]", "type": "ingress", "domain": "abracadabra-aoy3qnll", "masterIpSpace": "", "masterAccessList": "[]", "slaveIpSpace": ""}' + accessConfiguration: '{"type": "ingress", "domain": "abracadabra-i5kntoh3", "masterIpSpace": "", "masterAccessList": "[]", "slaveIpSpace": "", "slaveAccessList": "[]"}' diff --git a/site/services/50_nextcloud.yaml b/site/services/50_nextcloud.yaml index 38a9156..b478ac8 100644 --- a/site/services/50_nextcloud.yaml +++ b/site/services/50_nextcloud.yaml @@ -2,7 +2,49 @@ name: nextcloud service_id: 50 service_display_name: Nextcloud service_short_name: nextcloud -service_man: 'Ресурсная платформа: k8s. Автоматизация: helm chart' +service_man: '# Инструкция по развертыванию Nextcloud через платформу

## 1. Общая информация

Nextcloud — платформа для хранения и совместной работы с файлами. Разворачивается в K8s через + Helm-чарт `nextcloud/nextcloud`.

Сервис **не самодостаточен** — для создания необходимы заранее развёрнутые в той же ресурсной платформе:

* **PostgreSQL (k8s)** — база данных Nextcloud. + У СУБД должен быть выставлен параметр `sslRequired: false`.
* **Redis (k8s)** — используется как memcache/locking backend.

Резервное копирование выполняется через **Velero** (бэкапятся под + и PVC с данными), а не штатным S3-бэкапом СУБД.

### Доступные операции с сервисом

* **create** — создание сервиса
* **delete** — удаление сервиса
* **suspend** — + остановка сервиса (масштабирование реплик в 0)
* **resume** — запуск сервиса
* **restart** — перезапуск (`kubectl rollout restart`)
* **modify** — изменение настроек + сервиса
* **reconcile** — служебная операция синхронизации версии (запускается платформой автоматически)
* **create_backup** — создание резервной копии вручную (через Velero)
* **recovery** — + восстановление из резервной копии в **новый** инстанс

> **Примечание:** операций работы с пользователями Nextcloud (`create_user`/`modify_user`/`delete_user`) на уровне платформы нет — пользователи + приложения администрируются внутри самого Nextcloud.

---

## 2. Параметры создания сервиса

### Платформа для развертывания

Ресурсная платформа (`resourceRealm`), в которой + будет развёрнут сервис. PostgreSQL и Redis, указанные ниже, обязаны находиться в той же ресурсной платформе.

### СУБД PostgreSQL (psqlUid)

UID инстанса PostgreSQL (k8s), в котором будет + создана база и пользователь `nextcloud`.

* У выбранной СУБД должна отсутствовать база `nextcloud` и пользователь `nextcloud`.
* У СУБД обязан быть выключен `sslMode` (`false`).

### + СУБД Redis (redisUid)

UID инстанса Redis (k8s), который будет использоваться как memcache/locking backend.

### Количество реплик

Количество реплик Nextcloud (`clusterConfiguration.replicas`).

### + Квота памяти пода (MB)

Объём памяти для пода Nextcloud в мегабайтах.
Пример: `2048`

### Квота CPU пода (mCPU)

CPU-квота для пода Nextcloud в миликорах (1000 mCPU = 1 vCPU).
Пример: + `1000`

### Размер диска для данных (GB)

Объём диска под данные Nextcloud (`/var/www/html/data`) в гигабайтах.
Пример: `20`

### Домен

Домен, на котором будет доступен + Nextcloud (`accessConfiguration.domain`).

* Если указано **полное доменное имя** (содержит точку, например `cloud.company.ru`) — домен считается клиентским. Перед созданием клиент обязан сам + настроить DNS-запись, указывающую на адрес Ingress платформы, иначе создание завершится ошибкой.
* Если указано **короткое имя** (без точки, например `mycloud`) — платформа сама создаёт DNS-запись + вида `.nextcloudk8s` и настраивает сертификат.

### Версия

Версия приложения Nextcloud (`appConfiguration.version`, поле `appVersion` Helm-чарта). По ней автоматически подбирается + последняя подходящая версия Helm-чарта.

### Document Server

Параметр `appConfiguration.documentServer`. Если указать `collabora` — в кластер дополнительно разворачивается Collabora Online + (совместное редактирование офисных документов), доступный по пути `/collabora` на том же домене.
Оставьте пустым, если Document Server не нужен.

### Уровень логирования

Параметр + `appConfiguration.logLevel`. Одно из значений: `DEBUG`, `INFO`, `WARN`, `ERROR`, `FATAL`, либо `NONE` — чтобы не переопределять логирование Nextcloud.

---

## 3. Параметры модификации + сервиса

Изменению подлежат ресурсы, версия и часть `appConfiguration`. Параметры `psqlUid`/`redisUid` менять после создания не рекомендуется.

### Количество реплик

См. раздел + 2.

### Квота памяти пода (MB) / Квота CPU пода (mCPU) / Размер диска (GB)

См. раздел 2.

> **Примечание:** уменьшить уже выделенный размер диска нельзя.

### Версия

Обновление + версии разрешено только **на один патч** либо **на одну минорную версию вперёд** (с `patch=0`). Прыжок сразу через несколько минорных версий или через несколько мажорных версий запрещён — обновляться + нужно последовательно.

> **Примечание:** перед обновлением на новую minor/major-версию необходимо сначала выполнить `modify` на текущей версии, обновившись до последнего релиза этой версии (иначе + операция завершится ошибкой с описанием, до какой версии нужно обновиться сначала).

### Document Server / Уровень логирования

См. раздел 2.

---

## 4. Параметры удаления + сервиса

Специальных параметров нет — удаление сносит namespace целиком.

> **Примечание:** резервные копии, созданные через `create_backup`, хранятся в Velero отдельно от инстанса и **не + удаляются** вместе с сервисом — операции `delete_backup` для Nextcloud нет, копии нужно вычищать на стороне Velero отдельно.

---

## 5. Параметры создания бэкапа

Специальных + пользовательских параметров нет — имя бэкапа генерируется автоматически в формате `<дата>-<версия>-`.

> **Примечание:** создать бэкап можно только если сервис предварительно приостановлен + (`suspend`). Velero, в который создаётся бэкап, должен быть развёрнут в той же ресурсной платформе, что и Nextcloud, и не может быть сменён на другой Velero-инстанс в рамках одного сервиса.

Бэкапится + под с данными вместе с PVC/PV (файлы), метаданные и БД PostgreSQL бэкапом не затрагиваются — версия схемы БД фиксируется отдельно (см. раздел 6).

---

## 6. Параметры восстановления из + бэкапа (recovery)

В отличие от СУБД-сервисов, `recovery` у Nextcloud **не восстанавливает данные в текущий инстанс**, а создаёт **новый** инстанс сервиса (аналог `create`), в который переносятся + файлы из указанной резервной копии.

### Точка восстановления (recoveryPoint)

Имя резервной копии Velero, из которой будет выполнено восстановление.

### Домен нового инстанса

Обязан + отличаться от домена исходного (текущего) инстанса — восстановление на тот же домен не поддерживается.

### СУБД PostgreSQL нового инстанса

Если версия Nextcloud в бэкапе отличается от + текущей версии инстанса, для нового инстанса обязательно нужно указать **другую** СУБД PostgreSQL (нельзя восстанавливать бэкап со старой схемой БД поверх БД с более новой схемой).

---

## + 7. Выходные параметры

После успешного создания сервиса платформа возвращает:

### connectionUrl

Адрес для входа в Nextcloud: `https://<домен>`.

### namespace

Namespace + в K8s-кластере, в котором развёрнут сервис.

### Учётные данные (Vault)

В Vault сохраняется пароль администратора (`adminPass`) под логином `admin`.

---

## 8. Пример + подключения

Откройте `connectionUrl` в браузере и авторизуйтесь:

* **Логин:** `admin`
* **Пароль:** значение `adminPass` из блока «Учётные данные» в Vault

---

## + 9. Дополнительная информация

### Зависимости

Nextcloud нельзя создать без уже существующих в том же `resourceRealm` сервисов PostgreSQL (k8s, `sslRequired: false`) и Redis (k8s). При + `delete` зависимые СУБД и Redis не трогаются — удаляется только сам Nextcloud.

### suspend/resume

При `suspend` количество реплик Nextcloud, Collabora и exporter''а метрик принудительно + выставляется в `0` через `helm upgrade` (реальное масштабирование, а не просто пауза cron). При `resume` реплики возвращаются к значению из `clusterConfiguration.replicas`.

### Collabora

Собирается + из отдельного `image.repository: nexus-sa.tst.nubes.ru/collabora/code` и включается только при `appConfiguration.documentServer == ''collabora''`. Доступен на том же домене и том же TLS-сертификате, что + и сам Nextcloud, по пути `/collabora`.

### Бэкап/восстановление через Velero

Бэкап/восстановление файлов идёт через Velero с селектором `backup=-velero-backup` и включает + под, PVC и PV — то есть непосредственно файлы `/var/www/html/data`. Восстановление БД в новый инстанс выполняется штатным механизмом `create` с параметром `instanceUidFrom`, который проставляет `recovery`-джоба + автоматически.
' lifecycle: suspendOnDestroyDefault: true adoptExistingOnCreateDefault: false @@ -53,21 +95,15 @@ cfsParams: defaultValue: '' isModifiable: false dataDescriptor: - redisUid: - dataType: uuid - defaultValue: '' - isRequired: true - isModifiable: false resourceRealm: dataType: string defaultValue: '' isRequired: true isModifiable: false valueList: - - iot-naeel + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 psqlEnabled: dataType: boolean defaultValue: 'true' @@ -87,6 +123,11 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false + redisUid: + dataType: uuid + defaultValue: '' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 1056 svcOperationCfsParam: clusterConfiguration dataType: map-fixed @@ -94,19 +135,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - replicas: - dataType: integer > 0 - defaultValue: '1' - isRequired: true - isModifiable: false - valueList: - - '1' - - '2' - disk: - dataType: integer > 0 - defaultValue: '10' - isRequired: true - isModifiable: false cpu: dataType: integer > 0 defaultValue: '1000' @@ -131,6 +159,19 @@ cfsParams: - '6144' - '7168' - '8192' + replicas: + dataType: integer > 0 + defaultValue: '1' + isRequired: true + isModifiable: false + valueList: + - '1' + - '2' + disk: + dataType: integer > 0 + defaultValue: '10' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 1057 svcOperationCfsParam: accessConfiguration dataType: map-fixed @@ -140,7 +181,7 @@ cfsParams: dataDescriptor: domain: dataType: string - defaultValue: nextcloud-vjp2crbf + defaultValue: nextcloud-gsjkslra isRequired: true isModifiable: false - svcOperationCfsParamId: 1058 @@ -239,18 +280,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - logLevel: - dataType: string - defaultValue: '' - isRequired: true - isModifiable: false - valueList: - - DEBUG - - INFO - - WARN - - ERROR - - FATAL - - NONE version: dataType: string defaultValue: '' @@ -265,6 +294,18 @@ cfsParams: isModifiable: false valueList: - collabora + logLevel: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - DEBUG + - INFO + - WARN + - ERROR + - FATAL + - NONE - svcOperationCfsParamId: 1078 svcOperationCfsParam: startupConfiguration dataType: map-fixed @@ -278,20 +319,9 @@ cfsParams: isRequired: true isModifiable: false valueList: - - iot-naeel + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 - veleroUid: - dataType: string - defaultValue: '' - isRequired: true - isModifiable: false - recoveryPoint: - dataType: string - defaultValue: '' - isRequired: true - isModifiable: false psqlEnabled: dataType: boolean defaultValue: 'true' @@ -306,6 +336,11 @@ cfsParams: isModifiable: false valueList: - 'true' + recoveryPoint: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false psqlUid: dataType: uuid defaultValue: '' @@ -316,6 +351,11 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false + veleroUid: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 1079 svcOperationCfsParam: clusterConfiguration dataType: map-fixed @@ -366,7 +406,7 @@ cfsParams: dataDescriptor: domain: dataType: string - defaultValue: nextcloud-dcxz2gqv + defaultValue: nextcloud-cpp3zfhe isRequired: true isModifiable: false - svcOperationCfsParamId: 1081 @@ -376,6 +416,13 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: + documentServer: + dataType: string + defaultValue: collabora + isRequired: true + isModifiable: false + valueList: + - collabora logLevel: dataType: string defaultValue: NONE @@ -393,13 +440,6 @@ cfsParams: defaultValue: '' isRequired: false isModifiable: false - documentServer: - dataType: string - defaultValue: collabora - isRequired: true - isModifiable: false - valueList: - - collabora cfsParamsByOp: 16: - 1055 @@ -422,7 +462,7 @@ cfsParamsByOp: 129: [] 128: [] stateParams: - startupConfiguration: '{"redisUid": "", "resourceRealm": "", "psqlEnabled": true, "redisEnabled": true, "psqlUid": ""}' - clusterConfiguration: '{"replicas": 1, "disk": 10, "cpu": 1000, "memory": 1024}' - accessConfiguration: '{"domain": "nextcloud-vjp2crbf"}' + startupConfiguration: '{"resourceRealm": "", "psqlEnabled": true, "redisEnabled": true, "psqlUid": "", "redisUid": ""}' + clusterConfiguration: '{"cpu": 1000, "memory": 1024, "replicas": 1, "disk": 10}' + accessConfiguration: '{"domain": "nextcloud-gsjkslra"}' appConfiguration: '{"version": "33.0.4", "documentServer": "collabora", "logLevel": "INFO"}' diff --git a/site/services/81_superset.yaml b/site/services/81_superset.yaml index 5520a16..1ec2540 100644 --- a/site/services/81_superset.yaml +++ b/site/services/81_superset.yaml @@ -54,10 +54,9 @@ cfsParams: defaultValue: '' isModifiable: false valueList: - - iot-naeel + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 - svcOperationCfsParamId: 227 svcOperationCfsParam: resourceInstances dataType: integer > 0 diff --git a/site/services/82_harbor.yaml b/site/services/82_harbor.yaml index 7f928a2..3deb6e1 100644 --- a/site/services/82_harbor.yaml +++ b/site/services/82_harbor.yaml @@ -7,7 +7,7 @@ service_man: 'Расширенный реестр для управления Do процесса непрерывной интеграции. Контейнеры идеально подходят для запуска небольших, независимых и легко изменяемых сервисов.
Чтобы начать работу, создайте реестр и загрузите в него Docker-образ
Авторизация: keycloak' lifecycle: - suspendOnDestroyDefault: false + suspendOnDestroyDefault: true adoptExistingOnCreateDefault: false operations: - svcOperationId: 14 @@ -22,6 +22,18 @@ operations: operation: modify kind: instance action: modify +- svcOperationId: 405 + operation: reconcile + kind: action + action: reconcile +- svcOperationId: 415 + operation: resume + kind: instance + action: resume +- svcOperationId: 416 + operation: suspend + kind: instance + action: suspend stateOut: {} cfsParams: - svcOperationCfsParamId: 16 @@ -37,21 +49,20 @@ cfsParams: defaultValue: '' isModifiable: false valueList: - - iot-naeel + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 - svcOperationCfsParamId: 228 svcOperationCfsParam: resourceCPU dataType: integer > 0 isRequired: true - defaultValue: '100' + defaultValue: '1000' isModifiable: true - svcOperationCfsParamId: 229 svcOperationCfsParam: resourceMemory dataType: integer > 0 isRequired: true - defaultValue: '200' + defaultValue: '1024' isModifiable: true - svcOperationCfsParamId: 230 svcOperationCfsParam: resourceInstances @@ -62,9 +73,33 @@ cfsParams: - svcOperationCfsParamId: 231 svcOperationCfsParam: s3Uid dataType: uuid - isRequired: true + isRequired: false defaultValue: '' isModifiable: false +- svcOperationCfsParamId: 1126 + svcOperationCfsParam: pvType + dataType: string + isRequired: true + defaultValue: s3 + isModifiable: false + valueList: + - s3 + - local +- svcOperationCfsParamId: 1127 + svcOperationCfsParam: resourceDisk + dataType: integer > 0 + isRequired: false + defaultValue: '5' + isModifiable: true +- svcOperationCfsParamId: 1128 + svcOperationCfsParam: authType + dataType: string + isRequired: true + defaultValue: local + isModifiable: false + valueList: + - local + - keycloak - svcOperationCfsParamId: 822 svcOperationCfsParam: resourceInstances dataType: integer > 0 @@ -83,6 +118,12 @@ cfsParams: isRequired: true defaultValue: '' isModifiable: true +- svcOperationCfsParamId: 1129 + svcOperationCfsParam: resourceDisk + dataType: integer > 0 + isRequired: false + defaultValue: '' + isModifiable: true cfsParamsByOp: 14: - 16 @@ -91,15 +132,25 @@ cfsParamsByOp: - 229 - 230 - 231 + - 1126 + - 1127 + - 1128 15: [] 270: - 822 - 823 - 824 + - 1129 + 405: [] + 415: [] + 416: [] stateParams: domain: harbor-1 resourceRealm: '' - resourceCPU: '100' - resourceMemory: '200' + resourceCPU: '1000' + resourceMemory: '1024' resourceInstances: '1' s3Uid: '' + pvType: s3 + resourceDisk: '5' + authType: local diff --git a/site/services/86_k8s_velero.yaml b/site/services/86_k8s_velero.yaml index 48b874d..52f2d3a 100644 --- a/site/services/86_k8s_velero.yaml +++ b/site/services/86_k8s_velero.yaml @@ -71,10 +71,9 @@ cfsParams: isRequired: true isModifiable: false valueList: - - iot-naeel + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 - svcOperationCfsParamId: 964 svcOperationCfsParam: nodeAgentConfiguration dataType: map-fixed diff --git a/site/services/87_k8svalkey.yaml b/site/services/87_k8svalkey.yaml new file mode 100644 index 0000000..726d8c2 --- /dev/null +++ b/site/services/87_k8svalkey.yaml @@ -0,0 +1,254 @@ +name: k8svalkey +service_id: 87 +service_display_name: Valkey +service_short_name: k8svalkey +service_man: Valkey-кластер.
Пока в статусе EXPEREMENTAL +lifecycle: + suspendOnDestroyDefault: true + adoptExistingOnCreateDefault: false +operations: +- svcOperationId: 396 + operation: create + kind: instance + action: create +- svcOperationId: 401 + operation: create_user + kind: subresource + action: create +- svcOperationId: 395 + operation: delete + kind: instance + action: delete +- svcOperationId: 402 + operation: delete_user + kind: subresource + action: delete +- svcOperationId: 400 + operation: modify + kind: instance + action: modify +- svcOperationId: 397 + operation: reconcile + kind: action + action: reconcile +- svcOperationId: 399 + operation: resume + kind: instance + action: resume +- svcOperationId: 398 + operation: suspend + kind: instance + action: suspend +stateOut: + users: {} +cfsParams: +- svcOperationCfsParamId: 1066 + svcOperationCfsParam: startupConfiguration + dataType: map-fixed + isRequired: true + defaultValue: '' + isModifiable: false + dataDescriptor: + resourceRealm: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - devclustername + - k8s-3-sandbox-nubes-ru + - k8s-4-sandbox-nubes-ru +- svcOperationCfsParamId: 1067 + svcOperationCfsParam: clusterConfiguration + dataType: map-fixed + isRequired: true + defaultValue: '' + isModifiable: true + dataDescriptor: + cpu: + dataType: integer > 0 + defaultValue: '500' + isRequired: true + isModifiable: false + disk: + dataType: integer > 0 + defaultValue: '10' + isRequired: true + isModifiable: false + memory: + dataType: integer > 0 + defaultValue: '512' + isRequired: true + isModifiable: false + replicas: + dataType: integer > 0 + defaultValue: '1' + isRequired: true + isModifiable: false + valueList: + - '1' + - '3' + - '5' + - '7' + shards: + dataType: integer > 0 + defaultValue: '1' + isRequired: true + isModifiable: false + valueList: + - '1' + - '2' + - '3' + - '4' + - '5' +- svcOperationCfsParamId: 1068 + svcOperationCfsParam: accessConfiguration + dataType: map-fixed + isRequired: true + defaultValue: '' + isModifiable: true + dataDescriptor: + masterAccessList: + dataType: json + defaultValue: '[]' + isRequired: true + isModifiable: false + masterIpSpace: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false +- svcOperationCfsParamId: 1071 + svcOperationCfsParam: valkeyConfiguration + dataType: map-fixed + isRequired: true + defaultValue: '' + isModifiable: false + dataDescriptor: + version: + dataType: string + defaultValue: 0.1.0 + isRequired: true + isModifiable: false + valueList: + - 0.1.0 +- svcOperationCfsParamId: 1072 + svcOperationCfsParam: valkeyConf + dataType: array-map-fixed + isRequired: false + defaultValue: '' + isModifiable: false + dataDescriptor: + paramName: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false + paramValue: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false +- svcOperationCfsParamId: 1073 + svcOperationCfsParam: username + dataType: string + isRequired: true + defaultValue: '' + isModifiable: false +- svcOperationCfsParamId: 1074 + svcOperationCfsParam: permissions + dataType: string + isRequired: true + defaultValue: '' + isModifiable: false +- svcOperationCfsParamId: 1075 + svcOperationCfsParam: username + dataType: string + isRequired: true + defaultValue: '' + isModifiable: true +- svcOperationCfsParamId: 1069 + svcOperationCfsParam: clusterConfiguration + dataType: map-fixed + isRequired: true + defaultValue: '' + isModifiable: true + dataDescriptor: + cpu: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false + disk: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false + memory: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false + replicas: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - '1' + - '3' + - '5' + - '7' + shards: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - '1' + - '2' + - '3' + - '4' + - '5' +- svcOperationCfsParamId: 1070 + svcOperationCfsParam: accessConfiguration + dataType: map-fixed + isRequired: true + defaultValue: '' + isModifiable: true + dataDescriptor: + masterAccessList: + dataType: json + defaultValue: '' + isRequired: true + isModifiable: false + masterIpSpace: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false +cfsParamsByOp: + 396: + - 1066 + - 1067 + - 1068 + - 1071 + - 1072 + 401: + - 1073 + - 1074 + 395: [] + 402: + - 1075 + 400: + - 1069 + - 1070 + 397: [] + 399: [] + 398: [] +stateParams: + startupConfiguration: '{"resourceRealm": ""}' + clusterConfiguration: '{"cpu": 500, "disk": 10, "memory": 512, "replicas": 1, "shards": 1}' + accessConfiguration: '{"masterAccessList": "[]", "masterIpSpace": ""}' + valkeyConfiguration: '{"version": "0.1.0"}' + valkeyConf: '{"paramName": "", "paramValue": ""}' diff --git a/site/services/88_k8s_ziti_controller.yaml b/site/services/88_k8s_ziti_controller.yaml new file mode 100644 index 0000000..ebd9771 --- /dev/null +++ b/site/services/88_k8s_ziti_controller.yaml @@ -0,0 +1,74 @@ +name: k8s_ziti_controller +service_id: 88 +service_display_name: k8sZitiController +service_short_name: k8sZitiController +lifecycle: + suspendOnDestroyDefault: false + adoptExistingOnCreateDefault: false +operations: +- svcOperationId: 99 + operation: create + kind: instance + action: create +- svcOperationId: 105 + operation: delete + kind: instance + action: delete +stateOut: {} +cfsParams: +- svcOperationCfsParamId: 294 + svcOperationCfsParam: resourceCPU + dataType: integer > 0 + isRequired: true + defaultValue: '300' + isModifiable: false +- svcOperationCfsParamId: 295 + svcOperationCfsParam: resourceMemory + dataType: integer > 0 + isRequired: true + defaultValue: '512' + isModifiable: false +- svcOperationCfsParamId: 296 + svcOperationCfsParam: resourceDisk + dataType: integer > 0 + isRequired: true + defaultValue: '1' + isModifiable: false +- svcOperationCfsParamId: 297 + svcOperationCfsParam: resourceInstances + dataType: integer > 0 + isRequired: true + defaultValue: '1' + isModifiable: false +- svcOperationCfsParamId: 298 + svcOperationCfsParam: resourceRealm + dataType: string + isRequired: true + defaultValue: '' + isModifiable: false + valueList: + - devclustername + - k8s-3-sandbox-nubes-ru + - k8s-4-sandbox-nubes-ru +- svcOperationCfsParamId: 299 + svcOperationCfsParam: domain + dataType: string + isRequired: true + defaultValue: k8sZitiController-1 + isModifiable: false +cfsParamsByOp: + 99: + - 294 + - 295 + - 296 + - 297 + - 298 + - 299 + 105: [] +stateParams: + resourceCPU: '300' + resourceMemory: '512' + resourceDisk: '1' + resourceInstances: '1' + resourceRealm: '' + domain: k8sZitiController-1 diff --git a/site/services/89_flask.yaml b/site/services/89_flask.yaml index f3ccfb8..4d75f47 100644 --- a/site/services/89_flask.yaml +++ b/site/services/89_flask.yaml @@ -66,10 +66,9 @@ cfsParams: isRequired: true isModifiable: false valueList: - - iot-naeel + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 - svcOperationCfsParamId: 1038 svcOperationCfsParam: clusterConfiguration dataType: map-fixed @@ -106,7 +105,7 @@ cfsParams: dataDescriptor: domain: dataType: string - defaultValue: flask-ub0sbq5h + defaultValue: flask-67i6r0en isRequired: true isModifiable: false - svcOperationCfsParamId: 1040 @@ -116,13 +115,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - version: - dataType: string - defaultValue: '3.12' - isRequired: true - isModifiable: false - valueList: - - '3.12' gitPath: dataType: string defaultValue: https://github.com/Foxyhhd/Baldurs-Gate-test.git @@ -133,6 +125,13 @@ cfsParams: defaultValue: '' isRequired: false isModifiable: false + version: + dataType: string + defaultValue: '3.12' + isRequired: true + isModifiable: false + valueList: + - '3.12' - svcOperationCfsParamId: 1041 svcOperationCfsParam: jsonEnv dataType: map @@ -173,13 +172,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - version: - dataType: string - defaultValue: '' - isRequired: true - isModifiable: false - valueList: - - '3.12' gitPath: dataType: string defaultValue: '' @@ -190,6 +182,13 @@ cfsParams: defaultValue: '' isRequired: false isModifiable: false + version: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - '3.12' - svcOperationCfsParamId: 1044 svcOperationCfsParam: jsonEnv dataType: map @@ -209,10 +208,9 @@ cfsParams: isRequired: true isModifiable: false valueList: - - iot-naeel + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 cfsParamsByOp: 376: - 1037 @@ -233,6 +231,6 @@ cfsParamsByOp: stateParams: startupConfiguration: '{"resourceRealm": ""}' clusterConfiguration: '{"cpu": 200, "memory": 256, "replicas": 1}' - accessConfiguration: '{"domain": "flask-ub0sbq5h"}' - appConfiguration: '{"version": "3.12", "gitPath": "https://github.com/Foxyhhd/Baldurs-Gate-test.git", "healthPath": ""}' + accessConfiguration: '{"domain": "flask-67i6r0en"}' + appConfiguration: '{"gitPath": "https://github.com/Foxyhhd/Baldurs-Gate-test.git", "healthPath": "", "version": "3.12"}' jsonEnv: '{}' diff --git a/site/services/90_postgres.yaml b/site/services/90_postgres.yaml index 207f0aa..e7a7fd1 100644 --- a/site/services/90_postgres.yaml +++ b/site/services/90_postgres.yaml @@ -101,6 +101,16 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: + cpu: + dataType: integer > 0 + defaultValue: '500' + isRequired: true + isModifiable: false + memory: + dataType: integer > 0 + defaultValue: '512' + isRequired: true + isModifiable: false replicas: dataType: integer > 0 defaultValue: '1' @@ -116,16 +126,6 @@ cfsParams: defaultValue: '10' isRequired: true isModifiable: false - cpu: - dataType: integer > 0 - defaultValue: '500' - isRequired: true - isModifiable: false - memory: - dataType: integer > 0 - defaultValue: '512' - isRequired: true - isModifiable: false - svcOperationCfsParamId: 789 svcOperationCfsParam: startupConfiguration dataType: map-fixed @@ -139,10 +139,9 @@ cfsParams: isRequired: true isModifiable: false valueList: - - iot-naeel + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 - svcOperationCfsParamId: 790 svcOperationCfsParam: accessConfiguration dataType: map-fixed @@ -150,11 +149,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - slaveAccessList: - dataType: json - defaultValue: '[]' - isRequired: true - isModifiable: false masterIpSpace: dataType: string defaultValue: '' @@ -170,6 +164,11 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false + slaveAccessList: + dataType: json + defaultValue: '[]' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 791 svcOperationCfsParam: postgresConfiguration dataType: map-fixed @@ -183,16 +182,10 @@ cfsParams: isRequired: true isModifiable: false valueList: + - '18' - '17' - '16' - sslRequired: - dataType: boolean - defaultValue: 'true' - isRequired: true - isModifiable: false - valueList: - - 'false' - - 'true' + - '15' poolerMaster: dataType: boolean defaultValue: 'false' @@ -209,25 +202,41 @@ cfsParams: valueList: - 'false' - 'true' + sslRequired: + dataType: boolean + defaultValue: 'true' + isRequired: true + isModifiable: false + valueList: + - 'true' + - 'false' - svcOperationCfsParamId: 792 svcOperationCfsParam: postgresConf - dataType: array-map-fixed + dataType: map-fixed isRequired: false defaultValue: '' isModifiable: true dataDescriptor: - paramName: + log_disconnections: dataType: string - defaultValue: '' - isRequired: true + defaultValue: 'off' + isRequired: false isModifiable: false valueList: - - log_connections - - log_disconnections - paramValue: + - 'off' + - 'on' + log_connections: dataType: string - defaultValue: '' - isRequired: true + defaultValue: 'off' + isRequired: false + isModifiable: false + valueList: + - 'off' + - 'on' + max_connections: + dataType: integer > 0 + defaultValue: '100' + isRequired: false isModifiable: false - svcOperationCfsParamId: 793 svcOperationCfsParam: backupConfiguration @@ -237,9 +246,9 @@ cfsParams: isModifiable: true dataDescriptor: s3Uid: - dataType: uuid - defaultValue: '' - isRequired: true + dataType: string + defaultValue: 00000000-0000-0000-0000-000000000000 + isRequired: false isModifiable: false retain: dataType: integer > 0 @@ -251,6 +260,11 @@ cfsParams: defaultValue: 0 0 * * * isRequired: true isModifiable: false + incrementCount: + dataType: integer >= 0 + defaultValue: '0' + isRequired: false + isModifiable: false - svcOperationCfsParamId: 794 svcOperationCfsParam: autoscaleConfiguration dataType: map-fixed @@ -258,15 +272,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - percent: - dataType: integer > 0 - defaultValue: '10' - isRequired: true - isModifiable: false - valueList: - - '10' - - '15' - - '20' enabled: dataType: boolean defaultValue: 'false' @@ -290,6 +295,15 @@ cfsParams: defaultValue: '100' isRequired: true isModifiable: false + percent: + dataType: integer > 0 + defaultValue: '10' + isRequired: true + isModifiable: false + valueList: + - '10' + - '15' + - '20' - svcOperationCfsParamId: 1094 svcOperationCfsParam: mtlsConfiguration dataType: map-fixed @@ -297,11 +311,6 @@ cfsParams: defaultValue: '{}' isModifiable: true dataDescriptor: - certServer: - dataType: string - defaultValue: '' - isRequired: false - isModifiable: false type: dataType: string defaultValue: 'off' @@ -318,7 +327,7 @@ cfsParams: isModifiable: false durationServer: dataType: integer > 0 - defaultValue: '87600' + defaultValue: '43800' isRequired: true isModifiable: false certCA: @@ -326,6 +335,11 @@ cfsParams: defaultValue: '' isRequired: false isModifiable: false + certServer: + dataType: string + defaultValue: '' + isRequired: false + isModifiable: false - svcOperationCfsParamId: 741 svcOperationCfsParam: dbName dataType: string @@ -455,6 +469,7 @@ cfsParams: isRequired: true isModifiable: false valueList: + - '18' - '17' - '16' sslRequired: @@ -480,24 +495,32 @@ cfsParams: - 'true' - svcOperationCfsParamId: 798 svcOperationCfsParam: postgresConf - dataType: array-map-fixed + dataType: map-fixed isRequired: false defaultValue: '' isModifiable: true dataDescriptor: - paramValue: + log_connections: dataType: string defaultValue: '' - isRequired: true - isModifiable: false - paramName: - dataType: string - defaultValue: '' - isRequired: true + isRequired: false isModifiable: false valueList: - - log_connections - - log_disconnections + - 'off' + - 'on' + log_disconnections: + dataType: string + defaultValue: '' + isRequired: false + isModifiable: false + valueList: + - 'off' + - 'on' + max_connections: + dataType: integer > 0 + defaultValue: '' + isRequired: false + isModifiable: false - svcOperationCfsParamId: 799 svcOperationCfsParam: backupConfiguration dataType: map-fixed @@ -505,11 +528,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - s3Uid: - dataType: uuid - defaultValue: '' - isRequired: true - isModifiable: false retain: dataType: integer > 0 defaultValue: '' @@ -520,6 +538,16 @@ cfsParams: defaultValue: 0 0 * * * isRequired: true isModifiable: false + s3Uid: + dataType: uuid + defaultValue: '' + isRequired: true + isModifiable: false + incrementCount: + dataType: integer >= 0 + defaultValue: '' + isRequired: false + isModifiable: false - svcOperationCfsParamId: 800 svcOperationCfsParam: autoscaleConfiguration dataType: map-fixed @@ -527,20 +555,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - quota: - dataType: integer > 0 - defaultValue: '' - isRequired: true - isModifiable: false - percent: - dataType: integer > 0 - defaultValue: '' - isRequired: true - isModifiable: false - valueList: - - '10' - - '15' - - '20' enabled: dataType: boolean defaultValue: '' @@ -559,6 +573,20 @@ cfsParams: - '5' - '12' - '23' + quota: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false + percent: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - '10' + - '15' + - '20' - svcOperationCfsParamId: 1095 svcOperationCfsParam: mtlsConfiguration dataType: map-fixed @@ -566,6 +594,15 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: + type: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - 'off' + - manual + - auto durationCA: dataType: integer > 0 defaultValue: '' @@ -594,15 +631,6 @@ cfsParams: valueList: - 'false' - 'true' - type: - dataType: string - defaultValue: '' - isRequired: true - isModifiable: false - valueList: - - 'off' - - manual - - auto - svcOperationCfsParamId: 801 svcOperationCfsParam: startupConfiguration dataType: map-fixed @@ -616,10 +644,9 @@ cfsParams: isRequired: true isModifiable: false valueList: - - iot-naeel + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 recoveryPoint: dataType: string defaultValue: '' @@ -632,6 +659,11 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: + cpu: + dataType: integer > 0 + defaultValue: '500' + isRequired: true + isModifiable: false memory: dataType: integer > 0 defaultValue: '512' @@ -652,11 +684,6 @@ cfsParams: defaultValue: '10' isRequired: true isModifiable: false - cpu: - dataType: integer > 0 - defaultValue: '500' - isRequired: true - isModifiable: false - svcOperationCfsParamId: 803 svcOperationCfsParam: accessConfiguration dataType: map-fixed @@ -664,6 +691,11 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: + masterIpSpace: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false masterAccessList: dataType: json defaultValue: '[]' @@ -679,11 +711,6 @@ cfsParams: defaultValue: '[]' isRequired: true isModifiable: false - masterIpSpace: - dataType: string - defaultValue: '' - isRequired: true - isModifiable: false - svcOperationCfsParamId: 804 svcOperationCfsParam: postgresConfiguration dataType: map-fixed @@ -725,23 +752,31 @@ cfsParams: - 'true' - svcOperationCfsParamId: 805 svcOperationCfsParam: postgresConf - dataType: array-map-fixed + dataType: map-fixed isRequired: false defaultValue: '' isModifiable: true dataDescriptor: - paramName: + log_connections: dataType: string defaultValue: '' - isRequired: true + isRequired: false isModifiable: false valueList: - - log_connections - - log_disconnections - paramValue: + - 'off' + - 'on' + log_disconnections: dataType: string defaultValue: '' - isRequired: true + isRequired: false + isModifiable: false + valueList: + - 'off' + - 'on' + max_connections: + dataType: integer > 0 + defaultValue: '' + isRequired: false isModifiable: false - svcOperationCfsParamId: 806 svcOperationCfsParam: backupConfiguration @@ -765,6 +800,11 @@ cfsParams: defaultValue: 0 0 * * * isRequired: true isModifiable: false + incrementCount: + dataType: integer >= 0 + defaultValue: '' + isRequired: false + isModifiable: false - svcOperationCfsParamId: 807 svcOperationCfsParam: autoscaleConfiguration dataType: map-fixed @@ -804,6 +844,32 @@ cfsParams: - '10' - '15' - '20' +- svcOperationCfsParamId: 1106 + svcOperationCfsParam: mtlsConfiguration + dataType: map-fixed + isRequired: true + defaultValue: '' + isModifiable: true + dataDescriptor: + type: + dataType: string + defaultValue: 'off' + isRequired: true + isModifiable: false + valueList: + - 'off' + - manual + - auto + durationCA: + dataType: integer > 0 + defaultValue: '175200' + isRequired: true + isModifiable: false + durationServer: + dataType: integer > 0 + defaultValue: '87600' + isRequired: true + isModifiable: false cfsParamsByOp: 19: - 788 @@ -845,15 +911,16 @@ cfsParamsByOp: - 805 - 806 - 807 + - 1106 54: [] 114: [] 115: [] stateParams: - clusterConfiguration: '{"replicas": 1, "disk": 10, "cpu": 500, "memory": 512}' + clusterConfiguration: '{"cpu": 500, "memory": 512, "replicas": 1, "disk": 10}' startupConfiguration: '{"resourceRealm": ""}' - accessConfiguration: '{"slaveAccessList": "[]", "masterIpSpace": "", "masterAccessList": "[]", "slaveIpSpace": ""}' - postgresConfiguration: '{"version": "17", "sslRequired": true, "poolerMaster": false, "poolerSlave": false}' - postgresConf: '{"paramName": "", "paramValue": ""}' - backupConfiguration: '{"s3Uid": "", "retain": 7, "schedule": "0 0 * * *"}' - autoscaleConfiguration: '{"percent": 10, "enabled": false, "schedule": 0, "quota": 100}' - mtlsConfiguration: '{"certServer": "", "type": "off", "durationCA": 175200, "durationServer": 87600, "certCA": ""}' + accessConfiguration: '{"masterIpSpace": "", "masterAccessList": "[]", "slaveIpSpace": "", "slaveAccessList": "[]"}' + postgresConfiguration: '{"version": "17", "poolerMaster": false, "poolerSlave": false, "sslRequired": true}' + postgresConf: '{"log_disconnections": "off", "log_connections": "off", "max_connections": 100}' + backupConfiguration: '{"s3Uid": "00000000-0000-0000-0000-000000000000", "retain": 7, "schedule": "0 0 * * *", "incrementCount": 0}' + autoscaleConfiguration: '{"enabled": false, "schedule": 0, "quota": 100, "percent": 10}' + mtlsConfiguration: '{"type": "off", "durationCA": 175200, "durationServer": 43800, "certCA": "", "certServer": ""}' diff --git a/site/services/91_redis.yaml b/site/services/91_redis.yaml index 4b57253..a5d45dc 100644 --- a/site/services/91_redis.yaml +++ b/site/services/91_redis.yaml @@ -46,10 +46,9 @@ cfsParams: isRequired: true isModifiable: false valueList: - - iot-naeel + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 - svcOperationCfsParamId: 1062 svcOperationCfsParam: clusterConfiguration dataType: map-fixed @@ -116,6 +115,11 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: + cpu: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false memory: dataType: integer > 0 defaultValue: '' @@ -136,11 +140,6 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false - cpu: - dataType: integer > 0 - defaultValue: '' - isRequired: true - isModifiable: false - svcOperationCfsParamId: 1065 svcOperationCfsParam: accessConfiguration dataType: map-fixed diff --git a/site/services/92_mongodb.yaml b/site/services/92_mongodb.yaml index 875ae41..262e8a4 100644 --- a/site/services/92_mongodb.yaml +++ b/site/services/92_mongodb.yaml @@ -3,34 +3,65 @@ service_id: 92 service_display_name: MongoDB service_short_name: mongodb service_man: '# Инструкция по развертыванию MongoDB через платформу

## 1. Общая информация

MongoDB — документоориентированная распределённая база данных, обеспечивающая высокую доступность, - горизонтальное масштабирование и гибкую модель хранения.

### Доступные операции с кластером

* **create** — создание базы
* **delete** — удаление базы данных
* **suspend** — - остановка базы данных
* **resume** — запуск базы данных
* **modify** — изменение базы данных

### Доступные операции с пользователями

* **create_user** — создание пользователя
* - **modify_user** — модификация пользователя
* **delete_user** — удаление пользователя

---

## 2. Параметры развертывания базы данных

Эти параметры необходимо указать при создании - базы данных.

### Платформа для развертывания

Среда, в которой будет развернут кластер. Выбирается из предложенного списка.

### Количество узлов

Количество реплик в - кластере MongoDB.
Оптимально выбирать нечётное значение, так как это обеспечивает корректный процесс выбора ведущего узла и сохраняет работоспособность базы данных даже при отказе одной из нод.

> - **Примечание:** уменьшение количества узлов после создания кластера не рекомендуется.

### Квота памяти пода (MB)

Объём памяти для одного пода в мегабайтах.
Пример: `2048`

### - Квота CPU пода (mCPU)

CPU-квота для пода в миликорах (1000 mCPU = 1 vCPU).
Пример: `1000`

### Размер диска для базы данных (GB)

Объём диска для хранения данных в гигабайтах.
Пример: - `20`

### Имя ipSpace для публикации внешнего IP

Имя ipSpace, через который будет выделен внешний IP для доступа к master-узлу.
Укажите `no-needed`, если внешний адрес не требуется.
Пример: - `internet-no-antiddos-v1`

### Список разрешённых IP-адресов

Список IP-адресов или подсетей, с которых разрешён доступ к кластеру.
Если оставить пустым — доступ открыт для всех источников.
Пример: - `["10.0.0.0/24", "192.168.1.10/32"]`

---

## 3. Параметры модификации базы данных

Все параметры, которые вы указываете при модификации, являются необязательными — система автоматически - подставит ранее сохранённые значения, и при необходимости вы можете изменить их на нужные.

### Количество узлов

Количество реплик в кластере MongoDB.
Оптимально выбирать нечётное - значение, так как это обеспечивает корректный процесс выбора ведущего узла и сохраняет работоспособность базы данных даже при отказе одной из нод.

> **Примечание:** уменьшение количества узлов - после создания кластера не рекомендуется.

### Квота памяти пода (MB)

Объём памяти для одного пода в мегабайтах.
Пример: `2048`

### Квота CPU пода (mCPU)

CPU-квота + горизонтальное масштабирование и гибкую модель хранения.

### Доступные операции с кластером

* **create** — создание базы
* **delete** — удаление базы данных
* + **suspend** — остановка базы данных
* **resume** — запуск базы данных
* **modify** — изменение базы данных
* **create_backup** — создание бэкапа вручную
* **delete_backup** — + удаление бэкапов
* **rollback** — восстановление кластера из бэкапа

### Доступные операции с пользователями

* **create_user** — создание пользователя
* **modify_user** + — модификация пользователя
* **delete_user** — удаление пользователя

---

## 2. Параметры создания базы данных

Эти параметры необходимо указать при создании базы данных.

### + Платформа для развертывания

Среда, в которой будет развёрнут кластер. Выбирается из предложенного списка.

### Количество узлов

Количество реплик в кластере MongoDB.
Оптимально + выбирать нечётное значение, так как это обеспечивает корректный процесс выбора ведущего узла и сохраняет работоспособность базы данных даже при отказе одной из нод.

> **Примечание:** уменьшение + количества узлов после создания кластера не рекомендуется.

### Квота памяти пода (MB)

Объём памяти для одного пода в мегабайтах.
Пример: `2048`

### Квота CPU пода (mCPU)

CPU-квота + для пода в миликорах (1000 mCPU = 1 vCPU).
Пример: `1000`

### Размер диска для базы данных (GB)

Объём диска для хранения данных в гигабайтах.
Пример: `20`

### Расписание + резервного копирования

Cron-выражение (5 полей), по которому автоматически создаются резервные копии.
Пример: `0 0 * * *` (каждый день в 00:00)

### Хранить последних бэкапов

Сколько + последних успешных резервных копий хранить — более старые удаляются автоматически.
Пример: `7`

> **Примечание:** ротация применяется только к бэкапам, созданным по расписанию. Бэкапы,
> + созданные вручную операцией `create_backup`, в неё не входят и не удаляются автоматически —
> их нужно убирать вручную через `delete_backup`.

### Имя ipSpace для публикации внешнего IP

Имя + ipSpace, через который будет выделен внешний IP для доступа к master-узлу.
Укажите `no-needed`, если внешний адрес не требуется.
Пример: `internet-no-antiddos-v1`

### Список разрешённых + IP-адресов

Список IP-адресов или подсетей, с которых разрешён доступ к кластеру.
Если оставить пустым — доступ открыт для всех источников.
Пример: `["10.0.0.0/24", "192.168.1.10/32"]`

### + Включить TLS

Булевый параметр. Определяет режим работы TLS кластера.

- `true` — TLS включён (`tls.mode: allowTLS`). Сертификаты сохраняются в Vault.
- `false` — TLS выключен (`tls.mode: + disabled`).

По умолчанию: `false`.

---

## 3. Параметры модификации базы данных

Все параметры, которые вы указываете при модификации, являются необязательными — система + автоматически подставит ранее сохранённые значения, и при необходимости вы можете изменить их на нужные.

### Количество узлов

Количество реплик в кластере MongoDB.
Оптимально выбирать + нечётное значение, так как это обеспечивает корректный процесс выбора ведущего узла и сохраняет работоспособность базы данных даже при отказе одной из нод.

> **Примечание:** уменьшение количества + узлов после создания кластера не рекомендуется.

### Квота памяти пода (MB)

Объём памяти для одного пода в мегабайтах.
Пример: `2048`

### Квота CPU пода (mCPU)

CPU-квота для пода в миликорах (1000 mCPU = 1 vCPU).
Пример: `1000`

### Размер диска для базы данных (GB)

Объём диска для хранения данных указывается в гигабайтах. Его можно увеличить при - необходимости, однако уменьшить уже выделенный размер невозможно.
Пример: `20`

### Имя ipSpace для публикации внешнего IP

Имя ipSpace, через который будет выделен внешний IP для - доступа к master-узлу.
Укажите `no-needed`, если внешний адрес не требуется.
Пример: `internet-no-antiddos-v1`

### Список разрешённых IP-адресов

Список IP-адресов или подсетей, - с которых разрешён доступ к кластеру.
Если оставить пустым — доступ открыт для всех источников.
Пример: `["10.0.0.0/24", "192.168.1.10/32"]`

---

## 3. Параметры создания пользователя

### - Имя пользователя

Указывается имя пользователя (любой регистр).
Пример: `readApp`

### Имя базы данных

Название базы, в которой будет создан пользователь.
Если база отсутствует, - она будет создана автоматически.
Пример: `Apps_9392`

### Имя роли

* **read** — доступ только на чтение
* **readWrite** — чтение и изменение данных
* **dbOwner** — полный - контроль над базой данных

---

## 4. Параметры модификации пользователя

### Имя пользователя

Необходимо выбрать существующего пользователя.
Если список пуст, требуется - предварительно создать пользователя.

### Имя базы данных

База данных, к которой относится пользователь.
Если база отсутствует, она будет создана автоматически.
Пример: `Apps_9392`

### - Имя роли

* **read**
* **readWrite**
* **dbOwner**

---

## 5. Параметры удаления пользователя

### Имя пользователя

Выберите пользователя из списка для - удаления.

---

## 6. Выходные параметры

После успешного развертывания базы данных платформа возвращает ключевые параметры.

### internalConnect

Внутренний эндпоинт - для подключения к кластеру из сервисов, работающих в той же сети.
Используется для внутренних интеграций и системных сервисов.

### externalConnect

Внешний FQDN для подключения к - кластеру извне.
Порт подключения — **27017**.

---

## 7. Пример подключения

Перед подключением необходимо установить **mongosh**.

Команда подключения к базе данных:

```
mongosh - "mongodb://:@:27017/"
```

Где:

* `` — имя пользователя
* `` — пароль
* `` — internalConnect или - externalConnect
* `` — имя базы данных

## 8. Дополнительная информация

Сейчас соединение с базой работает без шифрования, и доступ к кластеру осуществляется только по логину - и паролю.' + необходимости, однако уменьшить уже выделенный размер невозможно.
Пример: `20`

### Расписание резервного копирования

Cron-выражение (5 полей), по которому автоматически создаются + резервные копии.
Пример: `0 0 * * *` (каждый день в 00:00)

### Хранить последних бэкапов

Сколько последних успешных резервных копий хранить — более старые удаляются автоматически.
Пример: + `7`

> **Примечание:** ротация применяется только к бэкапам, созданным по расписанию. Бэкапы,
> созданные вручную операцией `create_backup`, в неё не входят и не удаляются автоматически —
> + их нужно убирать вручную через `delete_backup`.

### Имя ipSpace для публикации внешнего IP

Имя ipSpace, через который будет выделен внешний IP для доступа к master-узлу.
Укажите + `no-needed`, если внешний адрес не требуется.
Пример: `internet-no-antiddos-v1`

### Список разрешённых IP-адресов

Список IP-адресов или подсетей, с которых разрешён доступ к кластеру.
Если + оставить пустым — доступ открыт для всех источников.
Пример: `["10.0.0.0/24", "192.168.1.10/32"]`

---

## 4. Параметры удаления базы данных

### Удалить бакет S3 с бэкапами

Булевый + параметр.

- `true` — вместе с кластером также будут удалены все резервные копии и бакет S3.
- `false` — бакет S3 и хранящиеся в нём бэкапы сохраняются после удаления кластера.

По + умолчанию: `false`.

---

## 5. Параметры создания бэкапа

### Имя бэкапа

Имя резервной копии, которое будет присвоено объекту бэкапа в кластере.
Должно соответствовать + требованиям Kubernetes к именам объектов (строчные буквы, цифры, дефисы).
Пример: `manual-20260904`

> **Примечание:** такой бэкап не участвует в автоматической ротации по параметру
> + "Хранить последних бэкапов" (она применяется только к бэкапам по расписанию) и не удаляется
> сам — при необходимости убрать его нужно вручную операцией `delete_backup`.

---

## 6. + Параметры восстановления из бэкапа

### Имя бэкапа

Имя существующей резервной копии кластера, из которой будет выполнено восстановление. Указывается один из бэкапов в состоянии `ready` + (созданных автоматически по расписанию или вручную через операцию create_backup).

---

## 7. Параметры удаления бэкапов

### Имена бэкапов

Список имён резервных копий + для удаления.
Пример: `["manual-20260904", "cron-mongok8s-...-20260903020000"]`

---

## 8. Параметры создания пользователя

### Имя пользователя

Указывается имя пользователя + (любой регистр).
Пример: `readApp`

> **Примечание:** имя пользователя должно быть уникальным в рамках кластера. Если пользователь
> с таким именем уже существует, операция завершится + ошибкой — используйте `modify_user` для
> изменения прав или `delete_user` + `create_user` для пересоздания.

### Имя базы данных

Название базы, в которой будет создан пользователь.
Если + база отсутствует, она будет создана автоматически.
Пример: `Apps_9392`

### Имя роли

* **read** — доступ только на чтение
* **readWrite** — чтение и изменение данных
* **dbOwner** + — полный контроль над базой данных
* **dbAdmin** — администрирование базы данных (индексы, статистика, схема) без доступа к чтению/записи данных

---

## 9. Параметры модификации пользователя

### + Имя пользователя

Необходимо выбрать существующего пользователя.
Если список пуст, требуется предварительно создать пользователя.

### Имя базы данных

База данных, к которой + относится пользователь.
Если база отсутствует, она будет создана автоматически.
Пример: `Apps_9392`

### Имя роли

* **read**
* **readWrite**
* **dbOwner**
* **dbAdmin**

---

## + 10. Параметры удаления пользователя

### Имя пользователя

Выберите пользователя из списка для удаления.

---

## 11. Выходные параметры

После успешного развертывания + базы данных платформа возвращает ключевые параметры.

### internalConnect

Внутренний эндпоинт для подключения к кластеру из сервисов, работающих в той же сети.
Используется для внутренних + интеграций и системных сервисов.

### externalConnect

Внешний FQDN для подключения к кластеру извне.
Порт подключения — **27017**.

> **Важно:** оба эндпоинта — это Kubernetes + Service на весь replset, а не адрес конкретно
> primary-узла. Kubernetes не отслеживает, кто из узлов сейчас primary, поэтому новое
> подключение без параметра `replicaSet` может попасть на secondary + и упасть с ошибкой записи
> `not writable primary`. Обязательно указывайте `replicaSet=rs0` в строке подключения (см.
> примеры ниже) — тогда драйвер сам обнаружит топологию кластера и всегда + направит запись на
> актуальный primary, независимо от количества реплик и от того, происходили ли выборы.

---

## 12. Пример подключения

Перед подключением необходимо установить + **mongosh**.

### 12.1 Подключение без TLS

Для внутреннего подключения из той же сети:

```
mongosh "mongodb://:@:27017/?authSource=admin&replicaSet=rs0"
```

### + 12.2 Подключение через внешний endpoint с TLS

Кластер требует клиентский TLS-сертификат (mutual TLS). Сертификаты сохраняются в Vault при создании кластера в блоке `cer` в полях `ca`, `cer`, + `key` в кодировке base64.

Подготовка файлов:

```bash
# Декодировать сертификаты из Vault
echo "" | base64 -d > ca.crt
echo " tls.crt
echo "" | base64 -d > tls.key

# Собрать клиентский PEM
cat tls.key tls.crt > client.pem
```

Подключение:

```
mongosh + "mongodb://:@:27017/?tls=true&tlsCAFile=ca.crt&tlsCertificateKeyFile=client.pem&authSource=admin&replicaSet=rs0"
```

Где:

* `` + — имя пользователя
* `` — пароль
* `` — internalConnect (для подключения без TLS)
* `` — externalConnect (для внешнего подключения с TLS)
* + `` — имя базы данных

## 13. Дополнительная информация

Режим TLS задаётся параметром `mongoConfiguration.tls` только при создании кластера.
После создания изменение TLS через + модификацию не поддерживается.

- При `true` кластер разворачивается с включённым TLS (`tls.mode: allowTLS`). Сервер принимает как обычные, так и TLS-соединения.
- При `false` TLS выключен + (`tls.mode: disabled`).

Для внешнего подключения (`externalConnect`) используется сертификат, выпущенный через cert-manager, с SAN, покрывающим внешний DNS-адрес кластера — поэтому `tlsAllowInvalidHostnames` + не требуется, хост проверяется как обычно.

Внутренние подключения TLS-сертификат не используют вообще: режим `allowTLS` допускает как TLS, так и обычные соединения, но для внутреннего трафика + применяется обычное (не TLS) подключение — см. пример 12.1.

### Почему обязателен `replicaSet=rs0` в строке подключения

Percona-оператор не проставляет на поды никакого динамического + лейбла роли (primary/secondary) —
у всех подов replset''а полностью одинаковые лейблы, различается только имя/индекс пода.
`master`-сервис — это обычный Kubernetes Service с фиксированным селектором + на весь replset, он
не знает и не может знать, какой под сейчас primary: k8s просто раздаёт новые TCP-подключения
по кругу между всеми узлами. Без `replicaSet=rs0` в URI подключение может закрепиться + на
secondary, и любая попытка записи будет падать с `not writable primary` — независимо от того,
происходили выборы недавно или нет. Указание `replicaSet=rs0` включает у драйвера обнаружение
топологии + реплики, и он сам направляет запись на актуальный primary при любом количестве узлов
и после любых переизбраний.
' lifecycle: suspendOnDestroyDefault: true adoptExistingOnCreateDefault: false @@ -39,6 +70,10 @@ operations: operation: create kind: instance action: create +- svcOperationId: 411 + operation: create_backup + kind: subresource + action: create - svcOperationId: 198 operation: create_user kind: subresource @@ -47,6 +82,10 @@ operations: operation: delete kind: instance action: delete +- svcOperationId: 414 + operation: delete_backup + kind: subresource + action: delete - svcOperationId: 199 operation: delete_user kind: subresource @@ -67,11 +106,16 @@ operations: operation: resume kind: instance action: resume +- svcOperationId: 413 + operation: rollback + kind: action + action: rollback - svcOperationId: 194 operation: suspend kind: instance action: suspend stateOut: + backups: {} users: {} cfsParams: - svcOperationCfsParamId: 1089 @@ -87,10 +131,9 @@ cfsParams: isRequired: true isModifiable: false valueList: - - iot-naeel + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 - svcOperationCfsParamId: 1090 svcOperationCfsParam: clusterConfiguration dataType: map-fixed @@ -130,16 +173,59 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - masterAccessList: - dataType: json - defaultValue: '[]' - isRequired: true - isModifiable: false masterIpSpace: dataType: string defaultValue: '' isRequired: true isModifiable: false + masterAccessList: + dataType: json + defaultValue: '[]' + isRequired: true + isModifiable: false +- svcOperationCfsParamId: 1102 + svcOperationCfsParam: backupConfiguration + dataType: map-fixed + isRequired: true + defaultValue: '' + isModifiable: true + dataDescriptor: + s3Uid: + dataType: uuid + defaultValue: '' + isRequired: true + isModifiable: false + retain: + dataType: integer > 0 + defaultValue: '7' + isRequired: true + isModifiable: false + schedule: + dataType: string + defaultValue: 0 0 * * * + isRequired: true + isModifiable: false +- svcOperationCfsParamId: 1116 + svcOperationCfsParam: mongoConfiguration + dataType: map-fixed + isRequired: true + defaultValue: '' + isModifiable: false + dataDescriptor: + tls: + dataType: boolean + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - 'true' + - 'false' +- svcOperationCfsParamId: 1109 + svcOperationCfsParam: backupName + dataType: string + isRequired: true + defaultValue: '' + isModifiable: false - svcOperationCfsParamId: 635 svcOperationCfsParam: username dataType: string @@ -159,12 +245,28 @@ cfsParams: defaultValue: '' isModifiable: false valueList: - - dbOwner - read - readWrite + - dbAdmin + - dbOwner +- svcOperationCfsParamId: 1103 + svcOperationCfsParam: deleteS3Bucket + dataType: boolean + isRequired: true + defaultValue: 'true' + isModifiable: true + valueList: + - 'false' + - 'true' +- svcOperationCfsParamId: 1111 + svcOperationCfsParam: backupName + dataType: array + isRequired: true + defaultValue: '' + isModifiable: true - svcOperationCfsParamId: 644 svcOperationCfsParam: username - dataType: string + dataType: array isRequired: true defaultValue: '' isModifiable: true @@ -217,6 +319,23 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false +- svcOperationCfsParamId: 1104 + svcOperationCfsParam: backupConfiguration + dataType: map-fixed + isRequired: true + defaultValue: '' + isModifiable: true + dataDescriptor: + retain: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false + schedule: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 640 svcOperationCfsParam: username dataType: string @@ -236,32 +355,51 @@ cfsParams: defaultValue: '' isModifiable: true valueList: - - dbOwner - read - readWrite + - dbAdmin + - dbOwner +- svcOperationCfsParamId: 1108 + svcOperationCfsParam: backupName + dataType: string + isRequired: true + defaultValue: '' + isModifiable: true cfsParamsByOp: 37: - 1089 - 1090 - 1091 + - 1102 + - 1116 + 411: + - 1109 198: - 635 - 636 - 643 - 190: [] + 190: + - 1103 + 414: + - 1111 199: - 644 201: - 1092 - 1093 + - 1104 200: - 640 - 641 - 642 409: [] 196: [] + 413: + - 1108 194: [] stateParams: startupConfiguration: '{"resourceRealm": ""}' clusterConfiguration: '{"cpu": 1000, "memory": 1024, "replicas": 1, "disk": 5}' - accessConfiguration: '{"masterAccessList": "[]", "masterIpSpace": ""}' + accessConfiguration: '{"masterIpSpace": "", "masterAccessList": "[]"}' + backupConfiguration: '{"s3Uid": "", "retain": 7, "schedule": "0 0 * * *"}' + mongoConfiguration: '{"tls": false}' diff --git a/site/services/93_rabbitmq.yaml b/site/services/93_rabbitmq.yaml index e272bee..7b92d13 100644 --- a/site/services/93_rabbitmq.yaml +++ b/site/services/93_rabbitmq.yaml @@ -76,10 +76,9 @@ cfsParams: isRequired: true isModifiable: false valueList: - - iot-naeel + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 - svcOperationCfsParamId: 1098 svcOperationCfsParam: clusterConfiguration dataType: map-fixed @@ -129,6 +128,18 @@ cfsParams: defaultValue: '[]' isRequired: true isModifiable: false +- svcOperationCfsParamId: 1113 + svcOperationCfsParam: mqConfiguration + dataType: map-fixed + isRequired: true + defaultValue: '' + isModifiable: true + dataDescriptor: + maxMessageSize: + dataType: integer > 0 + defaultValue: '4' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 1100 svcOperationCfsParam: clusterConfiguration dataType: map-fixed @@ -136,11 +147,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - disk: - dataType: integer > 0 - defaultValue: '' - isRequired: true - isModifiable: false cpu: dataType: integer > 0 defaultValue: '' @@ -161,6 +167,11 @@ cfsParams: - '3' - '5' - '7' + disk: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 1101 svcOperationCfsParam: accessConfiguration dataType: map-fixed @@ -178,15 +189,29 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false +- svcOperationCfsParamId: 1114 + svcOperationCfsParam: mqConfiguration + dataType: map-fixed + isRequired: true + defaultValue: '' + isModifiable: true + dataDescriptor: + maxMessageSize: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false cfsParamsByOp: 38: - 1097 - 1098 - 1099 + - 1113 39: [] 106: - 1100 - 1101 + - 1114 410: [] 117: [] 116: [] @@ -194,3 +219,4 @@ stateParams: startupConfiguration: '{"resourceRealm": ""}' clusterConfiguration: '{"cpu": 1000, "memory": 1024, "replicas": 1, "disk": 5}' accessConfiguration: '{"masterIpSpace": "", "masterAccessList": "[]"}' + mqConfiguration: '{"maxMessageSize": 4}' diff --git a/site/services/94_lucee.yaml b/site/services/94_lucee.yaml index 222671d..5a178ec 100644 --- a/site/services/94_lucee.yaml +++ b/site/services/94_lucee.yaml @@ -53,10 +53,9 @@ cfsParams: isRequired: true isModifiable: false valueList: - - iot-naeel + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 - svcOperationCfsParamId: 1020 svcOperationCfsParam: clusterConfiguration dataType: map-fixed @@ -93,7 +92,7 @@ cfsParams: dataDescriptor: domain: dataType: string - defaultValue: lucee-tepsq9jk + defaultValue: lucee-bpp5vpr5 isRequired: true isModifiable: false - svcOperationCfsParamId: 1022 @@ -161,11 +160,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - healthPath: - dataType: string - defaultValue: '' - isRequired: false - isModifiable: false version: dataType: string defaultValue: '' @@ -179,6 +173,11 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false + healthPath: + dataType: string + defaultValue: '' + isRequired: false + isModifiable: false - svcOperationCfsParamId: 1026 svcOperationCfsParam: jsonEnv dataType: map @@ -198,10 +197,9 @@ cfsParams: isRequired: true isModifiable: false valueList: - - iot-naeel + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 cfsParamsByOp: 49: - 1019 @@ -223,6 +221,6 @@ cfsParamsByOp: stateParams: startupConfiguration: '{"resourceRealm": ""}' clusterConfiguration: '{"cpu": 200, "memory": 256, "replicas": 1}' - accessConfiguration: '{"domain": "lucee-tepsq9jk"}' + accessConfiguration: '{"domain": "lucee-bpp5vpr5"}' appConfiguration: '{"version": "6.0", "gitPath": "https://github.com/xahys/testlucee", "healthPath": ""}' jsonEnv: '{}' diff --git a/site/services/95_nodejs.yaml b/site/services/95_nodejs.yaml index cde802c..6ad7491 100644 --- a/site/services/95_nodejs.yaml +++ b/site/services/95_nodejs.yaml @@ -51,10 +51,9 @@ cfsParams: isRequired: true isModifiable: false valueList: - - iot-naeel + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 - svcOperationCfsParamId: 1029 svcOperationCfsParam: clusterConfiguration dataType: map-fixed @@ -91,7 +90,7 @@ cfsParams: dataDescriptor: domain: dataType: string - defaultValue: node-btf263ja + defaultValue: node-zjkc4kir isRequired: true isModifiable: false - svcOperationCfsParamId: 1031 @@ -118,7 +117,7 @@ cfsParams: isModifiable: false healthPath: dataType: string - defaultValue: '' + defaultValue: '1' isRequired: false isModifiable: false - svcOperationCfsParamId: 1032 @@ -127,6 +126,12 @@ cfsParams: isRequired: false defaultValue: '{}' isModifiable: true + dataDescriptor: + DB_PASS: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 1033 svcOperationCfsParam: clusterConfiguration dataType: map-fixed @@ -200,10 +205,9 @@ cfsParams: isRequired: true isModifiable: false valueList: - - iot-naeel + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 cfsParamsByOp: 58: - 1028 @@ -224,6 +228,6 @@ cfsParamsByOp: stateParams: startupConfiguration: '{"resourceRealm": ""}' clusterConfiguration: '{"cpu": 200, "memory": 256, "replicas": 1}' - accessConfiguration: '{"domain": "node-btf263ja"}' - appConfiguration: '{"version": "23", "gitPath": "https://github.com/xahys/testnode.git", "healthPath": ""}' - jsonEnv: '{}' + accessConfiguration: '{"domain": "node-zjkc4kir"}' + appConfiguration: '{"version": "23", "gitPath": "https://github.com/xahys/testnode.git", "healthPath": "1"}' + jsonEnv: '{"DB_PASS": ""}' diff --git a/site/services/96_pgadmin.yaml b/site/services/96_pgadmin.yaml index 21b01b3..e1db420 100644 --- a/site/services/96_pgadmin.yaml +++ b/site/services/96_pgadmin.yaml @@ -64,10 +64,9 @@ cfsParams: defaultValue: '' isModifiable: false valueList: - - iot-naeel + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 - svcOperationCfsParamId: 170 svcOperationCfsParam: login dataType: string @@ -105,10 +104,9 @@ cfsParams: defaultValue: '' isModifiable: true valueList: - - iot-naeel + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 cfsParamsByOp: 62: - 164 diff --git a/site/services/97_nodered.yaml b/site/services/97_nodered.yaml new file mode 100644 index 0000000..ffa3eb3 --- /dev/null +++ b/site/services/97_nodered.yaml @@ -0,0 +1,74 @@ +name: nodered +service_id: 97 +service_display_name: NodeRed +service_short_name: nodered +lifecycle: + suspendOnDestroyDefault: false + adoptExistingOnCreateDefault: false +operations: +- svcOperationId: 72 + operation: create + kind: instance + action: create +- svcOperationId: 73 + operation: delete + kind: instance + action: delete +stateOut: {} +cfsParams: +- svcOperationCfsParamId: 193 + svcOperationCfsParam: resourceCPU + dataType: integer > 0 + isRequired: true + defaultValue: '500' + isModifiable: false +- svcOperationCfsParamId: 194 + svcOperationCfsParam: resourceMemory + dataType: integer > 0 + isRequired: true + defaultValue: '512' + isModifiable: false +- svcOperationCfsParamId: 195 + svcOperationCfsParam: resourceDisk + dataType: integer > 0 + isRequired: true + defaultValue: '1' + isModifiable: false +- svcOperationCfsParamId: 196 + svcOperationCfsParam: resourceRealm + dataType: string + isRequired: true + defaultValue: '' + isModifiable: false + valueList: + - devclustername + - k8s-3-sandbox-nubes-ru + - k8s-4-sandbox-nubes-ru +- svcOperationCfsParamId: 197 + svcOperationCfsParam: domain + dataType: string + isRequired: true + defaultValue: nodered-1 + isModifiable: false +- svcOperationCfsParamId: 323 + svcOperationCfsParam: resourceInstances + dataType: integer > 0 + isRequired: true + defaultValue: '1' + isModifiable: false +cfsParamsByOp: + 72: + - 193 + - 194 + - 195 + - 196 + - 197 + - 323 + 73: [] +stateParams: + resourceCPU: '500' + resourceMemory: '512' + resourceDisk: '1' + resourceRealm: '' + domain: nodered-1 + resourceInstances: '1' diff --git a/site/services/98_http.yaml b/site/services/98_http.yaml index bac88b4..c69dffb 100644 --- a/site/services/98_http.yaml +++ b/site/services/98_http.yaml @@ -67,28 +67,27 @@ cfsParams: defaultValue: '' isModifiable: false valueList: - - iot-naeel + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 - svcOperationCfsParamId: 217 svcOperationCfsParam: registryPath dataType: string isRequired: true defaultValue: nexus-sa.tst.nubes.ru/docker-nubes/jolt - isModifiable: false + isModifiable: true - svcOperationCfsParamId: 241 svcOperationCfsParam: jsonEnv dataType: map isRequired: false defaultValue: '' - isModifiable: false + isModifiable: true - svcOperationCfsParamId: 782 svcOperationCfsParam: ingressAnnotations dataType: map isRequired: false defaultValue: '{}' - isModifiable: false + isModifiable: true - svcOperationCfsParamId: 218 svcOperationCfsParam: resourceCPU dataType: integer > 0 @@ -107,6 +106,24 @@ cfsParams: isRequired: true defaultValue: '' isModifiable: true +- svcOperationCfsParamId: 1120 + svcOperationCfsParam: registryPath + dataType: string + isRequired: true + defaultValue: '' + isModifiable: true +- svcOperationCfsParamId: 1121 + svcOperationCfsParam: jsonEnv + dataType: map + isRequired: false + defaultValue: '' + isModifiable: true +- svcOperationCfsParamId: 1122 + svcOperationCfsParam: ingressAnnotations + dataType: map + isRequired: false + defaultValue: '' + isModifiable: true - svcOperationCfsParamId: 272 svcOperationCfsParam: resourceRealm dataType: string @@ -114,10 +131,9 @@ cfsParams: defaultValue: '' isModifiable: true valueList: - - iot-naeel + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 cfsParamsByOp: 77: - 212 @@ -133,6 +149,9 @@ cfsParamsByOp: - 218 - 219 - 220 + - 1120 + - 1121 + - 1122 403: [] 79: - 272 diff --git a/site/services/99_gitea.yaml b/site/services/99_gitea.yaml index 82f15db..35c8be4 100644 --- a/site/services/99_gitea.yaml +++ b/site/services/99_gitea.yaml @@ -97,6 +97,12 @@ cfsParams: isRequired: false defaultValue: '' isModifiable: true +- svcOperationCfsParamId: 1124 + svcOperationCfsParam: iniServiceParams + dataType: map + isRequired: false + defaultValue: DISABLE_REGISTRATION:true + isModifiable: false - svcOperationCfsParamId: 259 svcOperationCfsParam: resourceCPU dataType: integer > 0 @@ -143,6 +149,7 @@ cfsParamsByOp: - 238 - 818 - 821 + - 1124 83: [] 91: - 259 @@ -162,3 +169,4 @@ stateParams: psqlUid: '' ingressExtraAnnotations: '' iniServerParams: '' + iniServiceParams: DISABLE_REGISTRATION:true diff --git a/site/services/dev/109_zones_v2.yaml b/site/services/dev/109_zones_v2.yaml index 26c6972..57dab11 100644 --- a/site/services/dev/109_zones_v2.yaml +++ b/site/services/dev/109_zones_v2.yaml @@ -150,16 +150,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - recordName: - dataType: string - defaultValue: '' - isRequired: true - isModifiable: false - recordTTL: - dataType: integer > 0 - defaultValue: '3600' - isRequired: true - isModifiable: false recordType: dataType: string defaultValue: A @@ -176,11 +166,21 @@ cfsParams: - NS - SSHFP - CAA + recordName: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false recordInput: dataType: string defaultValue: '' isRequired: true isModifiable: false + recordTTL: + dataType: integer > 0 + defaultValue: '3600' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 783 svcOperationCfsParam: recordName dataType: string diff --git a/site/services/dev/115_mariadb.yaml b/site/services/dev/115_mariadb.yaml index 18f23c8..ebe0886 100644 --- a/site/services/dev/115_mariadb.yaml +++ b/site/services/dev/115_mariadb.yaml @@ -2,7 +2,54 @@ name: mariadb service_id: 115 service_display_name: Mariadb service_short_name: mariadb -service_man: 'Mariadb кластер. Ресурсная платформа: k8s. Автоматизация: k8s operator.
Автоматическое резервное копирование, ручное восстановление.' +service_man: '# Инструкция по развертыванию MariaDB через платформу

## 1. Общая информация

MariaDB — реляционная база данных, совместимая с MySQL. Разворачивается через `mariadb-operator` + в Kubernetes.

### Доступные операции с кластером

* **create** — создание кластера
* **delete** — удаление кластера
* **suspend** — остановка кластера (под реально останавливается, + ресурсы не потребляются)
* **resume** — запуск ранее остановленного кластера
* **modify** — изменение параметров кластера
* **reconcile** — синхронизация состояния инстанса с платформой

### + Доступные операции с базами данных

* **create_database** — создание базы данных
* **delete_database** — удаление базы данных

### Доступные операции с пользователями

* **create_user** + — создание пользователя
* **delete_user** — удаление пользователя

---

## 2. Параметры создания кластера

### Платформа для развертывания (`startupConfiguration.resourceRealm`)

Среда, + в которой будет развёрнут кластер.

### Конфигурация ресурсов (`clusterConfiguration`)

JSON-объект:
* `cpu` — квота CPU пода в миликорах (1000 = 1 vCPU). Пример: `500`
* `memory` + — квота памяти пода в мегабайтах. Пример: `512`
* `disk` — размер диска в гигабайтах. Пример: `10`
* `replicas` — количество реплик. Сервис работает в режиме одного primary-узла (Galera выключена), + значение `0` эквивалентно остановке кластера.

### Версия MariaDB (`mariadbConfiguration.version`)

Поддерживаются только две версии: `8.4.0` и `9.4.0`.

### Внешний доступ (`accessConfiguration`)

JSON-объект:
* + `masterIpSpace` — имя ipSpace для выделения внешнего IP. Укажите `no-needed`, если внешний адрес не требуется.
* `masterAccessList` — список IP/подсетей, которым разрешён доступ к порту 3306 снаружи. + Пустой список — доступ не ограничен на уровне firewall (в рамках выделенного ipSpace).

### Резервное копирование (`backupConfiguration`)

JSON-объект:
* `s3Uid` — идентификатор S3-пользователя/квоты + для бэкапов.
* `schedule` — cron-выражение расписания бэкапов. По умолчанию `0 0 * * *` (раз в сутки в полночь).
* `retain` — время хранения бэкапов **в часах** (не в днях!). По умолчанию `7` + — то есть 7 часов. При суточном расписании этого значения обычно недостаточно, чтобы между двумя бэкапами всегда оставалась хотя бы одна валидная копия — рекомендуется указывать `retain` явно, с запасом + (например `720` = 30 суток).

> **Важно:** расписание и срок хранения бэкапов задаются **только при создании кластера**. Оператор MariaDB не позволяет изменить cron-расписание бэкапа после создания + (поле `spec.schedule.cron` неизменяемо на уровне admission-вебхука самого оператора) — поэтому эти параметры недоступны для изменения через `modify`.

> **Восстановление из бэкапа пока не реализовано + как самостоятельная операция платформы.** Бэкапы физически хранятся в S3-бакете инстанса (`technicals3backup-`, префикс `mariadb/backups/`). Если нужно восстановить данные из бэкапа — бэкап + нужно **скачать из S3 и применить к базе вручную** (например через `mariabackup`/`mariadb-backup` restore или соответствующий инструмент).

### Автомасштабирование диска (`autoscaleConfiguration`)

JSON-объект:
* + `enabled` — включить автоматическое расширение диска при исчерпании места.
* `quota` — максимальный размер диска, до которого разрешено автоматическое расширение (не может быть меньше `clusterConfiguration.disk`).
* + `percent`, `schedule` — параметры триггера автомасштабирования.

---

## 3. Параметры модификации кластера

Все параметры модификации, кроме версии, можно как увеличивать, так + и уменьшать (кроме диска — см. ниже) — система подставит текущие сохранённые значения, если их не менять.

### Конфигурация ресурсов (`clusterConfiguration`)

* `cpu`, `memory` — можно + менять в любую сторону.
* `disk` — можно **только увеличивать**, уменьшение уже выделенного размера не поддерживается.
* `replicas` — `0` останавливает кластер тем же образом, что и `suspend` + (альтернативный способ временной остановки через `modify`).

### Версия MariaDB (`mariadbConfiguration.version`)

Можно только повышать версию (`8.4.0 → 9.4.0`). Попытка понизить версию + будет отклонена с явной ошибкой ещё до применения изменений.

### Внешний доступ (`accessConfiguration`)

Можно включить внешний доступ (было `no-needed` → указали реальный `masterIpSpace`), + изменить список разрешённых IP, либо полностью отключить внешний доступ (`masterIpSpace: no-needed`) — в этом случае внешний Service, DNS-запись и правило firewall будут корректно откреплены и удалены.

### + Резервное копирование

Не передаётся при модификации — расписание и срок хранения бэкапов фиксируются на этапе `create` (см. п.2).

---

## 4. Параметры создания базы данных (`create_database`)

### + Имя базы данных (`dbName`)

Строка с именем новой базы. Не может совпадать с зарезервированными системными именами: `mysql`, `sys`, `information_schema`, `performance_schema`. База с таким же + именем не должна уже существовать в кластере.

---

## 5. Параметры удаления базы данных (`delete_database`)

### Имя базы данных (`dbName`)

База должна существовать в + кластере. Удаление будет отклонено, если к базе всё ещё привязаны пользователи — сначала нужно снять доступ (`delete_user`) у всех пользователей, ссылающихся на эту базу.

---

## 6. Параметры + создания пользователя (`create_user`)

### Имя пользователя (`username`)

Не может быть `root`, `healthcheck` или `mariadb.sys` — эти имена зарезервированы платформой/оператором. Пользователь + с таким именем не должен уже существовать в кластере — операция сверяется с текущим стейтом сервиса и отклоняется, если имя занято.

### Пароль (`password`)

Пароль для подключения от + имени создаваемого пользователя.

### Базы данных (`dbName`)

JSON-массив вида `[{"dbname": "имя_базы"}]` — список баз, к которым выдаётся полный доступ (`ALL PRIVILEGES`). Все перечисленные + базы должны уже существовать в кластере (создать заранее через `create_database`).

> Ограничения доступа по IP/подсети на уровне пользователя больше нет — `user@host` в самой MariaDB всегда `%`. + Доступ к порту 3306 контролируется только на уровне инстанса через `accessConfiguration.masterAccessList`, задаваемый при `create`/`modify` (см. п.2/п.3).

---

## 7. Параметры удаления + пользователя (`delete_user`)

### Имя пользователя (`username`)

Пользователь должен существовать в кластере. `root`/`healthcheck`/`mariadb.sys` удалить нельзя.

---

## + 8. Выходные параметры

### internalConnect

Внутренний адрес для подключения из сервисов, работающих в том же кластере Kubernetes:
```json
{
"master": {
"dns": "..svc.",
"ip": + null,
"port": 3306
}
}
```

### externalConnect

Присутствует в выходных данных, **только если** был запрошен внешний доступ (`accessConfiguration.masterIpSpace` + отличен от `no-needed`). Если внешний доступ не запрошен или был отключён через `modify` — этого блока не будет вовсе (пустой блок в состояние не пишется):
```json
{
"master": {
"dns": + "write..",
"ip": "<внешний IP>",
"port": 3306
}
}
```

---

## 9. Пример подключения

### 9.1 Изнутри кластера / того же namespace

```bash
mariadb + -h -P 3306 -u -p
```

### 9.2 Через port-forward

```bash
kubectl port-forward svc/ 3306:3306 -n
```

**Важно:** + после `port-forward` подключайтесь именно по `127.0.0.1`, а не `localhost`:

```bash
mariadb -h 127.0.0.1 -P 3306 -u -p
```

Клиент `mysql`/`mariadb` при указании `-h + localhost` **игнорирует TCP/порт** и всегда пытается подключиться через локальный unix-сокет (`/var/lib/mysql/mysql.sock`), которого на вашей машине нет — подключение упадёт с `ERROR 2002 (HY000): Can''t + connect to local server through socket`. `127.0.0.1` форсирует реальное TCP-подключение. Также не забывайте `-P` (порт) с заглавной буквы — строчная `-p` относится к паролю.

### 9.3 Снаружи (внешний + адрес)

```bash
mariadb -h -P 3306 -u -p
```

Доступно только если при создании/модификации был указан реальный `masterIpSpace` + и подключающийся IP входит в `accessConfiguration.masterAccessList` (или список пуст).

Где:
* `` — имя пользователя
* `` — пароль пользователя

---

## + 10. Дополнительная информация

* Расписание бэкапов (`backupConfiguration.schedule`/`retain`) задаётся один раз при создании и не может быть изменено позже — ограничение самого `mariadb-operator`, + а не платформы.
* Версию MariaDB можно только повышать, откат на более старую версию не поддерживается.
* Размер диска можно только увеличивать.
* `suspend` реально останавливает под (масштабирование + StatefulSet в 0 реплик), а не просто помечает кластер как приостановленный — расход ресурсов CPU/RAM/диска (кроме уже занятого диска) прекращается.
* При отключении внешнего доступа через `modify` + (`masterIpSpace: no-needed`) внешний Service, DNS-запись и правило firewall удаляются, а `externalConnect` пропадает из выходных данных.
* Самостоятельного восстановления из бэкапа (операции `restore`) + пока нет. Бэкапы лежат в S3 инстанса — восстановление данных в существующий кластер выполняется вручную, скачиванием и применением бэкапа самим владельцем инстанса.
' lifecycle: suspendOnDestroyDefault: true adoptExistingOnCreateDefault: false @@ -64,6 +111,7 @@ cfsParams: isRequired: true isModifiable: false valueList: + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - svcOperationCfsParamId: 878 @@ -102,16 +150,16 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - masterAccessList: - dataType: json - defaultValue: '[]' - isRequired: true - isModifiable: false masterIpSpace: dataType: string defaultValue: '' isRequired: true isModifiable: false + masterAccessList: + dataType: json + defaultValue: '[]' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 880 svcOperationCfsParam: mariadbConfiguration dataType: map-fixed @@ -132,7 +180,7 @@ cfsParams: dataType: map-fixed isRequired: true defaultValue: '' - isModifiable: true + isModifiable: false dataDescriptor: s3Uid: dataType: uuid @@ -192,19 +240,19 @@ cfsParams: svcOperationCfsParam: dbName dataType: string isRequired: true - defaultValue: db-ebbjso21 + defaultValue: db-nmdlrebb isModifiable: false - svcOperationCfsParamId: 735 svcOperationCfsParam: username dataType: string isRequired: true - defaultValue: user3vanbmfy + defaultValue: useroxxeykhb isModifiable: false - svcOperationCfsParamId: 736 svcOperationCfsParam: password dataType: string isRequired: true - defaultValue: p4egnsar + defaultValue: apsyfstb isModifiable: false - svcOperationCfsParamId: 737 svcOperationCfsParam: dbName @@ -218,12 +266,6 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false -- svcOperationCfsParamId: 738 - svcOperationCfsParam: accessHosts - dataType: string - isRequired: true - defaultValue: '%' - isModifiable: false - svcOperationCfsParamId: 456 svcOperationCfsParam: deleteS3Bucket dataType: boolean @@ -306,28 +348,6 @@ cfsParams: valueList: - 8.4.0 - 9.4.0 -- svcOperationCfsParamId: 886 - svcOperationCfsParam: backupConfiguration - dataType: map-fixed - isRequired: true - defaultValue: '' - isModifiable: true - dataDescriptor: - schedule: - dataType: string - defaultValue: '' - isRequired: true - isModifiable: false - s3Uid: - dataType: uuid - defaultValue: '' - isRequired: true - isModifiable: false - retain: - dataType: integer > 0 - defaultValue: '' - isRequired: true - isModifiable: false - svcOperationCfsParamId: 887 svcOperationCfsParam: autoscaleConfiguration dataType: map-fixed @@ -335,15 +355,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - percent: - dataType: integer > 0 - defaultValue: '' - isRequired: true - isModifiable: false - valueList: - - '10' - - '15' - - '20' enabled: dataType: boolean defaultValue: '' @@ -367,6 +378,15 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false + percent: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - '10' + - '15' + - '20' cfsParamsByOp: 138: - 877 @@ -381,7 +401,6 @@ cfsParamsByOp: - 735 - 736 - 737 - - 738 139: - 456 248: @@ -392,7 +411,6 @@ cfsParamsByOp: - 883 - 884 - 885 - - 886 - 887 287: [] 141: [] @@ -400,7 +418,7 @@ cfsParamsByOp: stateParams: startupConfiguration: '{"resourceRealm": ""}' clusterConfiguration: '{"cpu": 500, "memory": 512, "replicas": 1, "disk": 10}' - accessConfiguration: '{"masterAccessList": "[]", "masterIpSpace": ""}' + accessConfiguration: '{"masterIpSpace": "", "masterAccessList": "[]"}' mariadbConfiguration: '{"version": "9.4.0"}' backupConfiguration: '{"s3Uid": "", "retain": 720, "schedule": "0 0 * * *"}' autoscaleConfiguration: '{"enabled": false, "schedule": 0, "quota": 100, "percent": 10}' diff --git a/site/services/dev/116_kafka.yaml b/site/services/dev/116_kafka.yaml index e6a93cb..643dece 100644 --- a/site/services/dev/116_kafka.yaml +++ b/site/services/dev/116_kafka.yaml @@ -2,21 +2,24 @@ name: kafka service_id: 116 service_display_name: ApacheKafka service_short_name: kafka -service_man: '# Инструкция по развертыванию Организация в Cloud Director через платформу

## 1. Общая информация

Сервис **Организация в Cloud Director** предназначен для управления изолированными - организационными единицами (тенантами) внутри инфраструктуры Cloud Director. Он обеспечивает создание, модификацию и администрирование организаций, предоставление им облачных ресурсов, а также контроль - уровня доступа. Сервис используется для организации рабочих окружений потребителей, управления жизненным циклом организаций и их сетевой инфраструктурой.

### Доступные операции

**create** - — Создание новой организации с заданными характеристиками и типом доступа.
**delete** — Удаление организации после перехода в состояние suspend; приводит к удалению всех связанных сущностей.
**modify** - — Изменение параметров внутри организации (на текущий момент поддерживается изменение ipSpaces).
**suspend** — Заморозка организации, ограничение возможности изменения и добавления сущностей.
**resume** - — Разморозка организации, восстановление функций управления.

---

## 2. Параметры развертывания

Параметры входных данных операции **create**:

### Платформа для развертывания
Описание: - платформа, на которой будет создана организация.
Пример значения: `ngcloud.ru`.

### Тип организации
Описание: тип создаваемой организации.
Варианты:
- `iaas` — организация с прямым - доступом к облаку и авторизацией через Keycloak.
- `saas` — организация под управлением Nubes, без прямого доступа к облаку.

---

## 3. Рекомендованные характеристики

### - Тестовое окружение
- Тип организации: `iaas` для обеспечения полного доступа к облачным ресурсам и самостоятельного управления.

### Промышленное окружение
- Тип организации: `saas` (упрощённая - модель использования).

---

## 4. Выходные параметры

Услуга предоставляет следующие выходные параметры (формируются в процессе операций):

### Идентификатор организации
Уникальный - идентификатор созданной организации. Используется для всех дальнейших API-операций.

### Статус организации
Отражает текущее состояние: active, suspended, modifying, deleting.

### - Параметры сети
Выходные данные при наличии ipSpaces: список выделенных внешних IP, имя ip_space, количество IP.

---

## 5. Дополнительная информация

- Для конфигурации внешних - IP внутри организации необходимо предварительно создать:
-- хотя бы один **Виртуальный датацентр (VDC)**;
-- хотя бы один **Сетевой шлюз периметра (Edge Gateway)**, привязанный к этой организации.
- - Удаление организации возможно только через 14 дней после перевода в состояние suspend.
- Удаление организации приводит к удалению всех связанных сущностей: VDC, Edge Gateway, пулов IP, сетей, ВМок - и иных объектов.
- Операция suspend не останавливает виртуальные машины, но блокирует любые изменения инфраструктуры внутри организации.
- Для iaas-организаций доступ осуществляется через Keycloak.

' +service_man: "# Инструкция по развертыванию Apache Kafka через платформу

---
## 1. Общая информация
Брокер сообщений Apache Kafka — это отказоустойчивая распределённая платформа для обмена\ + \ сообщениями и потоковой обработки данных в реальном времени.
Позволяет надёжно передавать события между сервисами и системами, интегрироваться с внешними решениями и использовать как внутренние,\ + \ так и защищённые TLS-подключения. Развёртывание полностью автоматизировано платформой.

## Доступные операции
- **create** — Создание кластера
- **delete** — Удаление кластера
-\ + \ **suspend** — Остановка кластера
- **resume** — Запуск кластера

- **create_topic** — Создание топика
- **modify_topic** — Модификация топика
- **delete_topic** — Удаление\ + \ топика

- **create_user** — Создание пользователя
- **modify_user** — Модификация пользователя
- **delete_user** — Удаление пользователя


---
## 2. Параметры\ + \ развертывания кластера
Ниже перечислены параметры, которые необходимо указать при создании ресурса Kafka:

* **Платформа для развертывания:**
Платформа для развертывания (среда, в\ + \ которой будет развернут кластер). Пример: `\tk8s-3.ext.nubes.ru`.

* **Количество узлов в сети:**
Количество узлов (брокеров) в кластере Kafka

* **Квота (megabyte) памяти пода:**
\ + \ Квота памяти пода в мегабайтах. Пример: `2048`

* **Квота (millicore ) ядра пода:**
Квота CPU пода в миликорах (1000 mCPU = 1 vCPU). Пример: `1000`

* **Размер (gigabyte) диска\ + \ для базы данных:**
Размер диска для хранения данных в гигабайтах. Пример: `20`

* **Выделяет внешний IP для доступа к master:**
Флаг, определяющий, нужно ли выделять внешний IP для\ + \ доступа к master-брокеру. Пример: `true` или `false`

* **Имя ipSpace для публикации внешнего IP**
Если включен предыдущий параметр, то поле необходимо заполнить. Пример: `internet-no-antiddos-v1`

---
##\ + \ 4. Выходные параметры
После успешного развертывания ресурса Kafka платформа возвращает ряд параметров.
Ключевыми из них являются:

**internalConnect** (выдаётся только при работе кластера\ + \ по внутренним адресам)
Внутренние эндпоинты для подключения из сервисов, развёрнутых внутри того же Kubernetes-кластера.
```yaml
internalConnect:
bootstrap:
fqdn: \"-kafka-tls-bootstrap..svc.\"\ +
port: 9093
brokers:
broker-1:
fqdn: \"--pool-0.-kafka-brokers..svc.\"
port: 9093
```

**externalConnect**\ + \ (выдаётся только при выделении внешнего IP)
Внешние эндпоинты, зарегистрированные в DNS.
```yaml
externalConnect:
bootstrap:
fqdn: \"bootstrap..\"
\ + \ port: 9093
brokers:
broker-1:
fqdn: \"broker-1..\"
port: 9093
```

Заполняется **только один** из параметров:
- при внешней аллокации\ + \ (`loadbalancer`) — `externalConnect`, `internalConnect` остаётся пустым;
- при внутреннем режиме — `internalConnect`, `externalConnect` остаётся пустым.

Для подключения используются следующие\ + \ порты:

* 9092 — внутренний нешифрованный доступ (plain).
* 9093 — внутренний и внешний доступ по TLS, с обязательной TLS-аутентификацией.

---
## 5. Дополнительная информация
Для\ + \ создания топиков, пользователей и управления ими, а также для интеграции с кластерами Kafka используйте соответствующие сервисы и раздел \"Облачные сервисы\".
---" lifecycle: suspendOnDestroyDefault: true adoptExistingOnCreateDefault: false @@ -82,6 +85,7 @@ cfsParams: isRequired: true isModifiable: false valueList: + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - svcOperationCfsParamId: 1085 diff --git a/site/services/dev/119_akhq.yaml b/site/services/dev/119_akhq.yaml index 129e0c3..f45c1af 100644 --- a/site/services/dev/119_akhq.yaml +++ b/site/services/dev/119_akhq.yaml @@ -47,6 +47,7 @@ cfsParams: defaultValue: '' isModifiable: false valueList: + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - svcOperationCfsParamId: 551 diff --git a/site/services/dev/120_clickhouse.yaml b/site/services/dev/120_clickhouse.yaml index a85941b..d3a9324 100644 --- a/site/services/dev/120_clickhouse.yaml +++ b/site/services/dev/120_clickhouse.yaml @@ -85,6 +85,7 @@ cfsParams: isRequired: true isModifiable: false valueList: + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - svcOperationCfsParamId: 838 @@ -114,6 +115,11 @@ cfsParams: - '3' - '5' - '7' + disk: + dataType: integer > 0 + defaultValue: '10' + isRequired: true + isModifiable: false shards: dataType: integer > 0 defaultValue: '1' @@ -123,11 +129,6 @@ cfsParams: - '1' - '2' - '3' - disk: - dataType: integer > 0 - defaultValue: '10' - isRequired: true - isModifiable: false - svcOperationCfsParamId: 839 svcOperationCfsParam: accessConfiguration dataType: map-fixed @@ -192,11 +193,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - schedule: - dataType: string - defaultValue: 0 0 * * * - isRequired: true - isModifiable: false s3Uid: dataType: uuid defaultValue: '' @@ -207,6 +203,11 @@ cfsParams: defaultValue: '7' isRequired: true isModifiable: false + schedule: + dataType: string + defaultValue: 0 0 * * * + isRequired: true + isModifiable: false - svcOperationCfsParamId: 843 svcOperationCfsParam: autoscaleConfiguration dataType: map-fixed @@ -214,6 +215,14 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: + enabled: + dataType: boolean + defaultValue: 'false' + isRequired: true + isModifiable: false + valueList: + - 'false' + - 'true' schedule: dataType: integer >= 0 defaultValue: '0' @@ -238,14 +247,6 @@ cfsParams: - '10' - '15' - '20' - enabled: - dataType: boolean - defaultValue: 'false' - isRequired: true - isModifiable: false - valueList: - - 'false' - - 'true' - svcOperationCfsParamId: 851 svcOperationCfsParam: clickhouseFilesConfiguration dataType: array-map-fixed @@ -312,20 +313,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - shards: - dataType: integer > 0 - defaultValue: '' - isRequired: true - isModifiable: false - valueList: - - '1' - - '2' - - '3' - disk: - dataType: integer > 0 - defaultValue: '' - isRequired: true - isModifiable: false cpu: dataType: integer > 0 defaultValue: '' @@ -346,6 +333,20 @@ cfsParams: - '3' - '5' - '7' + shards: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - '1' + - '2' + - '3' + disk: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 845 svcOperationCfsParam: clickhouseKeeperConfiguration dataType: map-fixed @@ -353,15 +354,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - replicas: - dataType: integer >= 0 - defaultValue: '' - isRequired: true - isModifiable: false - valueList: - - '0' - - '1' - - '3' cpu: dataType: integer > 0 defaultValue: '' @@ -372,6 +364,15 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false + replicas: + dataType: integer >= 0 + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - '0' + - '1' + - '3' - svcOperationCfsParamId: 846 svcOperationCfsParam: accessConfiguration dataType: map-fixed @@ -512,10 +513,10 @@ cfsParamsByOp: 182: [] stateParams: startupConfiguration: '{"resourceRealm": ""}' - clusterConfiguration: '{"cpu": 1000, "memory": 2048, "replicas": 1, "shards": 1, "disk": 10}' + clusterConfiguration: '{"cpu": 1000, "memory": 2048, "replicas": 1, "disk": 10, "shards": 1}' accessConfiguration: '{"masterIpSpace": "", "masterAccessList": "[]"}' clickhouseKeeperConfiguration: '{"cpu": 500, "memory": 512, "replicas": 0}' clickhouseConfiguration: '{"version": "25.10"}' - backupConfiguration: '{"schedule": "0 0 * * *", "s3Uid": "", "retain": 7}' - autoscaleConfiguration: '{"schedule": 0, "quota": 100, "percent": 10, "enabled": false}' + backupConfiguration: '{"s3Uid": "", "retain": 7, "schedule": "0 0 * * *"}' + autoscaleConfiguration: '{"enabled": false, "schedule": 0, "quota": 100, "percent": 10}' clickhouseFilesConfiguration: '{"path": "something.xml", "xmlConfig": ""}' diff --git a/site/services/dev/148_vc_mgmt_sthutrval_cluster.yaml b/site/services/dev/148_vc_mgmt_sthutrval_cluster.yaml index e583079..aa5e010 100644 --- a/site/services/dev/148_vc_mgmt_sthutrval_cluster.yaml +++ b/site/services/dev/148_vc_mgmt_sthutrval_cluster.yaml @@ -19,6 +19,11 @@ cfsParams: defaultValue: '' isModifiable: false dataDescriptor: + clusterName: + dataType: string + defaultValue: k8s-6sa9dyug + isRequired: true + isModifiable: false resourceRealm: dataType: string defaultValue: sandbox.nubes.ru @@ -26,9 +31,14 @@ cfsParams: isModifiable: false valueList: - sandbox.nubes.ru - clusterName: + providerVdc: dataType: string - defaultValue: example-brcyqrjr + defaultValue: '' + isRequired: true + isModifiable: false + networkProvider: + dataType: string + defaultValue: '' isRequired: true isModifiable: false - svcOperationCfsParamId: 772 @@ -40,10 +50,11 @@ cfsParams: dataDescriptor: appVersion: dataType: string - defaultValue: 2.13.1 + defaultValue: 2.14.0 isRequired: true isModifiable: false valueList: + - 2.14.0 - 2.13.1 - 2.12.1 - 2.11.0 @@ -82,6 +93,18 @@ cfsParams: defaultValue: '[{}]' isModifiable: false dataDescriptor: + groupName: + dataType: string + defaultValue: workers-5tcvtwk4 + isRequired: true + isModifiable: false + sizingPolicy: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - '{}' sizingDisk: dataType: integer > 0 defaultValue: '50' @@ -92,18 +115,32 @@ cfsParams: defaultValue: '2' isRequired: true isModifiable: false - groupName: - dataType: string - defaultValue: workers-jax0kk2f - isRequired: true - isModifiable: false - sizingPolicy: - dataType: string - defaultValue: '' + autoscale: + dataType: boolean + defaultValue: 'false' isRequired: true isModifiable: false valueList: - - '{}' + - 'false' + - 'true' + autoscaleMin: + dataType: integer > 0 + defaultValue: '2' + isRequired: true + isModifiable: false + autoscaleMax: + dataType: integer > 0 + defaultValue: '3' + isRequired: true + isModifiable: false + labelDeck: + dataType: boolean + defaultValue: 'true' + isRequired: true + isModifiable: false + valueList: + - 'true' + - 'false' - svcOperationCfsParamId: 775 svcOperationCfsParam: accessConfiguration dataType: map-fixed @@ -143,8 +180,8 @@ cfsParamsByOp: - 774 - 775 stateParams: - startupConfiguration: '{"resourceRealm": "sandbox.nubes.ru", "clusterName": "example-brcyqrjr"}' - clusterConfiguration: '{"appVersion": "2.13.1"}' + startupConfiguration: '{"clusterName": "k8s-6sa9dyug", "resourceRealm": "sandbox.nubes.ru", "providerVdc": "", "networkProvider": ""}' + clusterConfiguration: '{"appVersion": "2.14.0"}' controlPlaneConfiguration: '{"sizingPolicy": "", "sizingDisk": 50, "count": 1}' - workerConfiguration: '{"sizingDisk": 50, "count": 2, "groupName": "workers-jax0kk2f", "sizingPolicy": ""}' + workerConfiguration: '{"groupName": "workers-5tcvtwk4", "sizingPolicy": "", "sizingDisk": 50, "count": 2, "autoscale": false, "autoscaleMin": 2, "autoscaleMax": 3, "labelDeck": true}' accessConfiguration: '{"needExternalAddressAPI": true, "accessIpListAPI": "[]", "needExternalAddressIngress": true, "accessIpListIngress": "[]"}' diff --git a/site/services/dev/149_valo_tenant.yaml b/site/services/dev/149_valo_tenant.yaml index b23a975..cba804b 100644 --- a/site/services/dev/149_valo_tenant.yaml +++ b/site/services/dev/149_valo_tenant.yaml @@ -62,35 +62,6 @@ cfsParams: defaultValue: '{}' isModifiable: true dataDescriptor: - ffThemes: - dataType: boolean - defaultValue: 'true' - isRequired: true - isModifiable: false - valueList: - - 'false' - - 'true' - ffPublicLink: - dataType: boolean - defaultValue: 'true' - isRequired: true - isModifiable: false - valueList: - - 'false' - - 'true' - ffLogging: - dataType: boolean - defaultValue: 'true' - isRequired: true - isModifiable: false - valueList: - - 'false' - - 'true' - userCount: - dataType: integer > 0 - defaultValue: '10' - isRequired: true - isModifiable: false requestApproveMaxPeriod: dataType: integer > 0 defaultValue: '2' @@ -120,6 +91,35 @@ cfsParams: valueList: - 'false' - 'true' + ffThemes: + dataType: boolean + defaultValue: 'true' + isRequired: true + isModifiable: false + valueList: + - 'false' + - 'true' + ffPublicLink: + dataType: boolean + defaultValue: 'true' + isRequired: true + isModifiable: false + valueList: + - 'false' + - 'true' + ffLogging: + dataType: boolean + defaultValue: 'true' + isRequired: true + isModifiable: false + valueList: + - 'false' + - 'true' + userCount: + dataType: integer > 0 + defaultValue: '10' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 658 svcOperationCfsParam: s3Storage dataType: integer > 0 @@ -133,6 +133,24 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: + userCount: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false + requestApproveMaxPeriod: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false + ffOnlineEditor: + dataType: boolean + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - 'false' + - 'true' ffWatermark: dataType: boolean defaultValue: '' @@ -173,24 +191,6 @@ cfsParams: valueList: - 'false' - 'true' - userCount: - dataType: integer > 0 - defaultValue: '' - isRequired: true - isModifiable: false - requestApproveMaxPeriod: - dataType: integer > 0 - defaultValue: '' - isRequired: true - isModifiable: false - ffOnlineEditor: - dataType: boolean - defaultValue: '' - isRequired: true - isModifiable: false - valueList: - - 'false' - - 'true' - svcOperationCfsParamId: 660 svcOperationCfsParam: s3Storage dataType: integer > 0 @@ -212,5 +212,5 @@ cfsParamsByOp: stateParams: resourceRealm: valo.ngcloud.ru domain: '' - valoOptions: '{"ffThemes": true, "ffPublicLink": true, "ffLogging": true, "userCount": 10, "requestApproveMaxPeriod": 2, "ffOnlineEditor": true, "ffWatermark": true, "ffUserImport": true}' + valoOptions: '{"requestApproveMaxPeriod": 2, "ffOnlineEditor": true, "ffWatermark": true, "ffUserImport": true, "ffThemes": true, "ffPublicLink": true, "ffLogging": true, "userCount": 10}' s3Storage: '10' diff --git a/site/services/dev/150_k8s_sthutrval_cluster.yaml b/site/services/dev/150_k8s_sthutrval_cluster.yaml index 3222506..d8ceefd 100644 --- a/site/services/dev/150_k8s_sthutrval_cluster.yaml +++ b/site/services/dev/150_k8s_sthutrval_cluster.yaml @@ -2,7 +2,17 @@ name: k8s_sthutrval_cluster service_id: 150 service_display_name: Kubernetes кластер Штурвал service_short_name: k8sSthutrvalCluster -service_man: Перед разворачиванием убедиться, что в облаке есть 2 свободных невыделенных IP в пуле +service_man: '# Развёртывание Kubernetes: ограничения и предварительный чек-лист

> **Внимание:** перед началом развёртывания кластера Kubernetes убедитесь, что выполнены все описанные ниже условия. + Несоблюдение порядка шагов может привести к ошибкам при создании кластера.

---

## Ограничения при развёртывании

| Ограничение | Статус |
|---|---|
| 1 кластер = 1 vDC + | Действует (будет исправлено в ближайшее время) |

---

## Предварительный чек-лист

Перед установкой кластера Kubernetes необходимо последовательно выполнить следующие шаги.

### + 1. Создать организацию в Cloud Director

- Перейдите в услугу **Организация в Cloud Director**.
- Создайте организацию.

### 2. Создать виртуальный датацентр (vDC)

- Перейдите + в услугу **Виртуальный датацентр (vDC)**.
- Создайте vDC.
- Выделите **достаточно ресурсов для разворачивания _всех_ нод** кластера.

### 3. Создать Edge (сетевой шлюз периметра)

- + Перейдите в услугу **Сетевой шлюз периметра (Edge)**.
- Создайте Edge.
- Обязательно:
- Включить **ALB**.
- Установить **Кол-во VS на AVI ≥ 3**.

### 4. Добавить внешние адреса + в организации

- Вернитесь в **Организация в Cloud Director**.
- Выполните операцию **Modify**.
- Добавьте **3 внешних адреса**.
- Количество `ipSpaces` значения не имеет, важно чтобы + суммарно было 3 адреса.

### 5. Настроить SNAT для виртуальных машин

- Вернитесь в **Сетевой шлюз периметра (Edge)**.
- Выполните операцию **Modify**.
- Выберите доступный `ipSpaceName`.
- + Это будет **SNAT для виртуальных машин**.

### 6. Развернуть кластер Kubernetes

- Только **после выполнения всех шагов выше** переходите к услуге **Kubernetes кластер Штурвал**.
- + Начните разворачивание кластера.

---

## Минимальные требования к кластеру

| Параметр | Значение |
|---|---|
| Мастер-ноды | минимум **1** |
| Воркер-ноды | минимум + **1** |
| CPU (на ноду) | **4 vCPU** |
| RAM (на ноду) | **8 GB** |
| Диск (на ноду) | **50 GB** |

---' lifecycle: suspendOnDestroyDefault: true adoptExistingOnCreateDefault: false @@ -61,9 +71,65 @@ cfsParams: isModifiable: false clusterName: dataType: string - defaultValue: example-imhltbba + defaultValue: example-ryatr2rx isRequired: true isModifiable: false + exLogging: + dataType: boolean + defaultValue: 'true' + isRequired: false + isModifiable: false + valueList: + - 'true' + - 'false' + exMonitoring: + dataType: boolean + defaultValue: 'true' + isRequired: false + isModifiable: false + valueList: + - 'true' + - 'false' + exLocalCsi: + dataType: boolean + defaultValue: 'true' + isRequired: false + isModifiable: false + valueList: + - 'true' + - 'false' + exVip: + dataType: boolean + defaultValue: 'true' + isRequired: false + isModifiable: false + valueList: + - 'true' + - 'false' + exUpdate: + dataType: boolean + defaultValue: 'true' + isRequired: false + isModifiable: false + valueList: + - 'true' + - 'false' + exIngress: + dataType: boolean + defaultValue: 'true' + isRequired: false + isModifiable: false + valueList: + - 'true' + - 'false' + exNamedCsi: + dataType: boolean + defaultValue: 'true' + isRequired: false + isModifiable: false + valueList: + - 'true' + - 'false' - svcOperationCfsParamId: 751 svcOperationCfsParam: controlPlaneConfiguration dataType: map-fixed @@ -99,6 +165,11 @@ cfsParams: defaultValue: '[{}]' isModifiable: true dataDescriptor: + groupName: + dataType: string + defaultValue: workers-e6bfgpqf + isRequired: true + isModifiable: false sizingPolicy: dataType: string defaultValue: '' @@ -116,11 +187,32 @@ cfsParams: defaultValue: '2' isRequired: true isModifiable: false - groupName: - dataType: string - defaultValue: workers-0krz2kek + autoscale: + dataType: boolean + defaultValue: 'false' + isRequired: false + isModifiable: false + valueList: + - 'false' + - 'true' + autoscaleMin: + dataType: integer > 0 + defaultValue: '2' + isRequired: false + isModifiable: false + autoscaleMax: + dataType: integer > 0 + defaultValue: '3' + isRequired: false + isModifiable: false + labelDeck: + dataType: boolean + defaultValue: 'true' isRequired: true isModifiable: false + valueList: + - 'true' + - 'false' - svcOperationCfsParamId: 753 svcOperationCfsParam: accessConfiguration dataType: map-fixed @@ -161,10 +253,11 @@ cfsParams: dataDescriptor: appVersion: dataType: string - defaultValue: 2.13.1 + defaultValue: 2.14.0 isRequired: true isModifiable: false valueList: + - 2.14.0 - 2.13.1 - 2.12.1 - 2.11.0 @@ -205,6 +298,7 @@ cfsParams: isRequired: true isModifiable: false valueList: + - 2.14.0 - 2.13.1 - 2.12.1 - 2.11.0 @@ -245,7 +339,7 @@ cfsParams: dataDescriptor: groupName: dataType: string - defaultValue: workers-apak4rks + defaultValue: workers-ohtgog3p isRequired: true isModifiable: false sizingPolicy: @@ -265,6 +359,32 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false + autoscale: + dataType: boolean + defaultValue: '' + isRequired: false + isModifiable: false + valueList: + - 'false' + - 'true' + autoscaleMin: + dataType: integer > 0 + defaultValue: '' + isRequired: false + isModifiable: false + autoscaleMax: + dataType: integer > 0 + defaultValue: '' + isRequired: false + isModifiable: false + labelDeck: + dataType: boolean + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - 'true' + - 'false' - svcOperationCfsParamId: 759 svcOperationCfsParam: accessConfiguration dataType: map-fixed @@ -317,8 +437,9 @@ cfsParamsByOp: 174: [] 173: [] stateParams: - startupConfiguration: '{"vdcUid": "", "nsxtUid": "", "clusterName": "example-imhltbba"}' + startupConfiguration: '{"vdcUid": "", "nsxtUid": "", "clusterName": "example-ryatr2rx", "exLogging": true, "exMonitoring": true, "exLocalCsi": true, "exVip": true, "exUpdate": true, "exIngress": true, + "exNamedCsi": true}' controlPlaneConfiguration: '{"sizingPolicy": "[]", "sizingDisk": 50, "count": 1}' - workerConfiguration: '{"sizingPolicy": "", "sizingDisk": 50, "count": 2, "groupName": "workers-0krz2kek"}' + workerConfiguration: '{"groupName": "workers-e6bfgpqf", "sizingPolicy": "", "sizingDisk": 50, "count": 2, "autoscale": false, "autoscaleMin": 2, "autoscaleMax": 3, "labelDeck": true}' accessConfiguration: '{"needExternalAddressAPI": true, "accessIpListAPI": "[]", "needExternalAddressIngress": true, "accessIpListIngress": "[]"}' - clusterConfiguration: '{"appVersion": "2.13.1"}' + clusterConfiguration: '{"appVersion": "2.14.0"}' diff --git a/site/services/dev/151_k8s_openbao.yaml b/site/services/dev/151_k8s_openbao.yaml index 7f48128..d71c624 100644 --- a/site/services/dev/151_k8s_openbao.yaml +++ b/site/services/dev/151_k8s_openbao.yaml @@ -71,10 +71,6 @@ operations: operation: recovery_secrets kind: subresource action: recovery -- svcOperationId: 234 - operation: restart - kind: action - action: restart - svcOperationId: 216 operation: resume kind: instance @@ -103,6 +99,7 @@ cfsParams: defaultValue: '' isModifiable: false valueList: + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - svcOperationCfsParamId: 664 @@ -141,13 +138,13 @@ cfsParams: svcOperationCfsParam: domain dataType: string isRequired: true - defaultValue: bao-onbcvsgk + defaultValue: bao-nosgzjqe isModifiable: false - svcOperationCfsParamId: 675 svcOperationCfsParam: kvName dataType: string isRequired: true - defaultValue: kvname-9e9wvkt2 + defaultValue: kvname-ps9az5f9 isModifiable: false - svcOperationCfsParamId: 728 svcOperationCfsParam: policySettings @@ -156,21 +153,21 @@ cfsParams: defaultValue: '' isModifiable: false dataDescriptor: - capabilities: - dataType: json - defaultValue: '["read", "list"]' - isRequired: true - isModifiable: false path: dataType: string defaultValue: '' isRequired: true isModifiable: false + capabilities: + dataType: json + defaultValue: '["read", "list"]' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 729 svcOperationCfsParam: policyName dataType: string isRequired: true - defaultValue: policy-s0hfjfmn + defaultValue: policy-kyvtdypv isModifiable: false - svcOperationCfsParamId: 677 svcOperationCfsParam: kvName @@ -277,12 +274,12 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - capabilities: + path: dataType: string defaultValue: '' isRequired: true isModifiable: false - path: + capabilities: dataType: string defaultValue: '' isRequired: true @@ -351,7 +348,6 @@ cfsParamsByOp: - 723 - 724 - 725 - 234: [] 216: [] 215: [] 238: @@ -369,4 +365,4 @@ stateParams: resourceMemory: '512' resourceDisk: '10' appVersion: 2.5.2 - domain: bao-onbcvsgk + domain: bao-nosgzjqe diff --git a/site/services/dev/153_nifi.yaml b/site/services/dev/153_nifi.yaml new file mode 100644 index 0000000..bd0f842 --- /dev/null +++ b/site/services/dev/153_nifi.yaml @@ -0,0 +1,100 @@ +name: nifi +service_id: 153 +service_display_name: Nifi +service_short_name: nifi +lifecycle: + suspendOnDestroyDefault: false + adoptExistingOnCreateDefault: false +operations: +- svcOperationId: 229 + operation: create + kind: instance + action: create +- svcOperationId: 235 + operation: delete + kind: instance + action: delete +stateOut: {} +cfsParams: +- svcOperationCfsParamId: 711 + svcOperationCfsParam: domain + dataType: string + isRequired: true + defaultValue: nifi-qmpqdalo + isModifiable: false +- svcOperationCfsParamId: 712 + svcOperationCfsParam: resourceCPU + dataType: integer > 0 + isRequired: true + defaultValue: '2000' + isModifiable: false +- svcOperationCfsParamId: 713 + svcOperationCfsParam: resourceMemory + dataType: integer > 0 + isRequired: true + defaultValue: '4096' + isModifiable: false +- svcOperationCfsParamId: 714 + svcOperationCfsParam: resourceInstances + dataType: integer > 0 + isRequired: true + defaultValue: '1' + isModifiable: false + valueList: + - '1' +- svcOperationCfsParamId: 715 + svcOperationCfsParam: resourceDisk + dataType: integer > 0 + isRequired: true + defaultValue: '10' + isModifiable: false +- svcOperationCfsParamId: 716 + svcOperationCfsParam: appVersion + dataType: string + isRequired: true + defaultValue: 2.6.0 + isModifiable: false + valueList: + - 2.6.0 +- svcOperationCfsParamId: 717 + svcOperationCfsParam: resourceRealm + dataType: string + isRequired: true + defaultValue: '' + isModifiable: false + valueList: + - devclustername + - k8s-3-sandbox-nubes-ru + - k8s-4-sandbox-nubes-ru +- svcOperationCfsParamId: 718 + svcOperationCfsParam: jdbcDrivers + dataType: array-map-fixed + isRequired: true + defaultValue: '' + isModifiable: false + dataDescriptor: + path: + dataType: string + defaultValue: https://jdbc.postgresql.org/download/postgresql-42.7.8.jar + isRequired: true + isModifiable: false +cfsParamsByOp: + 229: + - 711 + - 712 + - 713 + - 714 + - 715 + - 716 + - 717 + - 718 + 235: [] +stateParams: + domain: nifi-qmpqdalo + resourceCPU: '2000' + resourceMemory: '4096' + resourceInstances: '1' + resourceDisk: '10' + appVersion: 2.6.0 + resourceRealm: '' + jdbcDrivers: '{"path": "https://jdbc.postgresql.org/download/postgresql-42.7.8.jar"}' diff --git a/site/services/dev/163_llm_ai.yaml b/site/services/dev/163_llm_ai.yaml index 10e515c..5251903 100644 --- a/site/services/dev/163_llm_ai.yaml +++ b/site/services/dev/163_llm_ai.yaml @@ -1,33 +1,39 @@ name: llm_ai service_id: 163 -service_display_name: LLM +service_display_name: ML Улей service_short_name: llmAi service_man: '## 1. Общая информация

LLMaaS (Large Language Model as a Service) — это сервис для доступа к языковым моделям через OpenAI-совместимое API.
Платформа позволяет создавать организации - (тенанты), команды, выпускать и управлять API-ключами, устанавливать лимиты на использование.

---

## Доступные операции

- **create** — Создание организации в LLMaaS
- - **delete** — Удаление организации

- **create_team** — Создание команды внутри организации
- **modify_team** — Редактирование команды (модели, RPM, TPM)
- **delete_team** — - Удаление команды

- **create_secrets** — Создание API-ключа
- **update_secrets** — Обновление параметров API-ключа
- **delete_secrets** — Удаление API-ключа

---

## + (тенанты), команды, выпускать и управлять API-ключами, устанавливать лимиты на использование.

### Ограничение: одна организация на контрагента

На одного контрагента может быть создана + **только одна организация** в LLMaaS.
Повторная попытка создать организацию для того же контрагента завершится ошибкой.

### Возможные ошибки и как их обрабатывать

При работе с сервисом + могут возникнуть типовые ошибки. Ниже описано, как их распознать и что делать.

| Ошибка | Когда возникает | Что делать |
|--------|-----------------|------------|
| `Организация в LLMaaS + уже привязана к контрагенту ` | При операции `create`, если организация для данного контрагента уже существует | На одного контрагента допускается только одна организация. Если нужно изменить + существующую организацию, используйте операции управления командами и ключами |
| `Не хватает нужного гранта. Примените реконсиляцию для данного инстанса` | При операциях `create_team`, `modify_team`, + если модель не выдана организации на Layer 1 | Запустите операцию `reconcile` для данного инстанса. Она обновит список моделей, доступных организации, после чего повторите исходную операцию |
| `Лимиты + API-ключа не могут превышать лимиты команды` | При операциях `create_secrets`, `update_secrets` | Уменьшите значения `RPM` и/или `TPM` ключа до уровня команды или увеличьте лимиты самой команды через + `modify_team` |

---

## Доступные операции

- **create** — Создание организации в LLMaaS
- **delete** — Удаление организации

- **create_team** — + Создание команды внутри организации
- **modify_team** — Редактирование команды (модели, RPM, TPM)
- **delete_team** — Удаление команды

- **create_secrets** — Создание API-ключа
- + **update_secrets** — Обновление параметров API-ключа
- **delete_secrets** — Удаление API-ключа

- **reconcile** — Обновление списка моделей, доступных организации

---

## 2. Параметры создания организации

Ниже перечислены параметры, которые необходимо указать при создании организации:

* **Платформа для развертывания**
Выбирается автоматически, изменять - не нужно.

* **Период бюджета**
Срок жизни организации в днях.
Пример: `30`


---

## 3. Параметры создания команды

* **Имя команды**
Уникальное - имя команды в рамках организации.
Пример: `production`

* **Модель**
Название модели, доступной для команды.
Пример: `gpt-oss-120b`

* **Лимит запросов в минуту (RPM)**
Максимальное - количество запросов к API в минуту.
Пример: `60`

* **Лимит токенов в минуту (TPM)**
Максимальное количество токенов (входящих + исходящих) в минуту.
Пример: `100000`

---

## - 4. Параметры редактирования команды

Для существующей команды можно изменить:

* **Модель**
Новая модель для команды.
Пример: `gpt-oss-20b`

* **Лимит запросов в минуту - (RPM)**
Новое значение RPM.
Пример: `120`

* **Лимит токенов в минуту (TPM)**
Новое значение TPM.
Пример: `200000`

---

## 5. Параметры создания API-ключа

Ниже - перечислены параметры, которые необходимо указать при создании API-ключа:

* **Имя ключа**
Уникальное имя ключа в рамках организации.
Пример: `prod-key`

* **Команда**
Имя - команды для привязки ключа. Если не указано — ключ привязывается к команде `main`.
Пример: `production`

* **Модель**
Название модели, доступной для данного ключа.
Пример: `gpt-oss-120b`

* - **Лимит запросов в минуту (RPM)**
Максимальное количество запросов к API в минуту.
Пример: `60`

* **Лимит токенов в минуту (TPM)**
Максимальное количество токенов (входящих - + исходящих) в минуту.
Пример: `100000`

**Важно:** Лимиты API-ключа не могут превышать лимиты команды, к которой он привязан.
При превышении операция будет отклонена с ошибкой.
Перед - созданием ключа убедитесь, что `RPM <= team.RPM` и `TPM <= team.TPM`.


---

## 6. Параметры обновления API-ключа

Для уже существующего ключа можно изменить параметры. Все - параметры являются опциональными:

* **Имя ключа**
Имя обновляемого ключа.
Пример: `prod-key`

* **Модель**
Новое название модели.
Пример: `gpt-oss-20b`

* - **Лимит запросов в минуту (RPM)**
Новое значение RPM.
Пример: `120`

* **Лимит токенов в минуту (TPM)**
Новое значение TPM.
Пример: `200000`

**Важно:** При обновлении - лимитов API-ключа новые значения не могут превышать лимиты команды.
Если указать значения выше командных, операция завершится ошибкой.
Указывайте `RPM <= team.RPM` и `TPM <= team.TPM`.

Команда - определяется автоматически по стейту услуги — изменить привязку к другой команде через эту операцию нельзя.

---

## 7. Параметры удаления API-ключа

* **Команда**
Имя команды, - к которой привязан ключ.
Пример: `production`

* **Имя ключа**
Имя удаляемого ключа.
Пример: `prod-key`

---

## 8. Параметры удаления команды

* **Имя - команды**
Имя удаляемой команды.
Пример: `production`

---

## 9. Параметры удаления организации

Удаление организации не требует дополнительных параметров — удаляется - вся организация со всеми командами и ключами.

---

## 10. Выходные параметры

После успешного создания организации платформа возвращает:

* **connectionUrl**
URL - для доступа к inference API (OpenAI-совместимый).
Пример: `https://api.aillm.ru`

---


## 12. Пример использования API

После получения API-ключа клиент может обращаться - к LLMaaS напрямую:

**Запрос к chat completions:**

```bash
curl https://api.aillm.ru/v1/chat/completions \
-H "Authorization: Bearer sk-..." \
-H "Content-Type: application/json" - \
-d ''{
"model": "gpt-oss-120b",
"messages": [
{"role": "user", "content": "Привет!"}
]
}''
```

**Получение списка доступных моделей:**

```bash
curl - https://api.aillm.ru/v1/models \
-H "Authorization: Bearer sk-..."
```
' + не нужно.

## 3. Параметры создания команды

* **Имя команды**
Уникальное имя команды в рамках организации.
Пример: `production`

* **Модель**
Название модели, + доступной для команды.
Пример: `gpt-oss-120b`

* **Лимит запросов в минуту (RPM)**
Максимальное количество запросов к API в минуту.
Пример: `60`

* **Лимит токенов в + минуту (TPM)**
Максимальное количество токенов (входящих + исходящих) в минуту.
Пример: `100000`

---

## 4. Параметры редактирования команды

Для существующей команды + можно изменить:

* **Модель**
Новая модель для команды.
Пример: `gpt-oss-20b`

* **Лимит запросов в минуту (RPM)**
Новое значение RPM.
Пример: `120`

* + **Лимит токенов в минуту (TPM)**
Новое значение TPM.
Пример: `200000`

---

## 5. Параметры создания API-ключа

Ниже перечислены параметры, которые необходимо указать + при создании API-ключа:

* **Имя ключа**
Уникальное имя ключа в рамках организации.
Пример: `prod-key`

* **Команда**
Имя команды для привязки ключа. Если не указано + — ключ привязывается к команде `main`.
Пример: `production`

* **Модель**
Название модели, доступной для данного ключа.
Пример: `gpt-oss-120b`

* **Лимит запросов в минуту + (RPM)**
Максимальное количество запросов к API в минуту.
Пример: `60`

* **Лимит токенов в минуту (TPM)**
Максимальное количество токенов (входящих + исходящих) в минуту.
Пример: + `100000`

**Важно:** Лимиты API-ключа не могут превышать лимиты команды, к которой он привязан.
При превышении операция будет отклонена с ошибкой.
Перед созданием ключа убедитесь, что + `RPM <= team.RPM` и `TPM <= team.TPM`.


---

## 6. Параметры обновления API-ключа

Для уже существующего ключа можно изменить параметры. Все параметры являются опциональными:

* + **Имя ключа**
Имя обновляемого ключа.
Пример: `prod-key`

* **Модель**
Новое название модели.
Пример: `gpt-oss-20b`

* **Лимит запросов в минуту (RPM)**
Новое + значение RPM.
Пример: `120`

* **Лимит токенов в минуту (TPM)**
Новое значение TPM.
Пример: `200000`

**Важно:** При обновлении лимитов API-ключа новые значения не могут + превышать лимиты команды.
Если указать значения выше командных, операция завершится ошибкой.
Указывайте `RPM <= team.RPM` и `TPM <= team.TPM`.

Команда определяется автоматически по стейту + услуги — изменить привязку к другой команде через эту операцию нельзя.

---

## 7. Параметры удаления API-ключа

* **Команда**
Имя команды, к которой привязан ключ.
Пример: + `production`

* **Имя ключа**
Имя удаляемого ключа.
Пример: `prod-key`

---

## 8. Параметры удаления команды

* **Имя команды**
Имя удаляемой команды.
Пример: + `production`

---

## 9. Параметры удаления организации

Удаление организации не требует дополнительных параметров — удаляется вся организация со всеми командами и ключами.

---

## + 10. Выходные параметры

После успешного создания организации платформа возвращает:

* **connectionUrl**
URL для доступа к inference API (OpenAI-совместимый).
Пример: `https://api.aillm.ru`

---


## + 11. Пример использования API

После получения API-ключа клиент может обращаться к LLMaaS напрямую:

**Запрос к chat completions:**

```bash
curl https://api.aillm.ru/v1/chat/completions + \
-H "Authorization: Bearer sk-..." \
-H "Content-Type: application/json" \
-d ''{
"model": "gpt-oss-120b",
"messages": [
{"role": "user", "content": "Привет!"}
]
}''
```

**Получение + списка доступных моделей:**

```bash
curl https://api.aillm.ru/v1/models \
-H "Authorization: Bearer sk-..."
```
' lifecycle: suspendOnDestroyDefault: false adoptExistingOnCreateDefault: false @@ -60,6 +66,10 @@ operations: operation: modify_team kind: subresource action: modify +- svcOperationId: 412 + operation: reconcile + kind: action + action: reconcile - svcOperationId: 277 operation: update_secrets kind: subresource @@ -106,45 +116,6 @@ cfsParams: isRequired: true defaultValue: '' isModifiable: false -- svcOperationCfsParamId: 1083 - svcOperationCfsParam: variablesKeys - dataType: array-map-fixed - isRequired: true - defaultValue: '' - isModifiable: false - dataDescriptor: - teamName: - dataType: string - defaultValue: '' - isRequired: true - isModifiable: false - keyName: - dataType: string - defaultValue: '' - isRequired: true - isModifiable: false - models: - dataType: string - defaultValue: '' - isRequired: true - isModifiable: false - valueList: - - '{}' - tpmLimit: - dataType: integer > 0 - defaultValue: '100000' - isRequired: true - isModifiable: false - rpmLimit: - dataType: integer > 0 - defaultValue: '60' - isRequired: true - isModifiable: false - count: - dataType: integer > 0 - defaultValue: '1' - isRequired: true - isModifiable: false - svcOperationCfsParamId: 858 svcOperationCfsParam: teamName dataType: string @@ -241,6 +212,12 @@ cfsParams: isRequired: true defaultValue: '' isModifiable: true +- svcOperationCfsParamId: 1157 + svcOperationCfsParam: '' + dataType: map-fixed + isRequired: true + defaultValue: '' + isModifiable: true cfsParamsByOp: 271: - 826 @@ -250,7 +227,6 @@ cfsParamsByOp: - 835 - 857 - 859 - - 1083 278: - 858 - 860 @@ -267,11 +243,13 @@ cfsParamsByOp: - 865 - 873 - 874 + 412: [] 277: - 852 - 853 - 854 - 855 - 875 + - 1157 stateParams: resourceRealm: llmAi.aillm.ru diff --git a/site/services/dev/19_vc_org.yaml b/site/services/dev/19_vc_org.yaml index 95fea45..5a4c297 100644 --- a/site/services/dev/19_vc_org.yaml +++ b/site/services/dev/19_vc_org.yaml @@ -73,6 +73,12 @@ cfsParams: valueList: - iaas - saas +- svcOperationCfsParamId: 1125 + svcOperationCfsParam: organizationSuffix + dataType: string + isRequired: false + defaultValue: '' + isModifiable: false - svcOperationCfsParamId: 871 svcOperationCfsParam: admins dataType: array-map-fixed @@ -110,7 +116,7 @@ cfsParams: isRequired: true isModifiable: false count: - dataType: integer > 0 + dataType: integer >= 0 defaultValue: '' isRequired: true isModifiable: false @@ -118,6 +124,7 @@ cfsParamsByOp: 136: - 418 - 556 + - 1125 283: - 871 137: [] @@ -131,3 +138,4 @@ cfsParamsByOp: stateParams: resourceRealm: sandbox.nubes.ru organizationType: iaas + organizationSuffix: '' diff --git a/site/services/dev/1_dummy.yaml b/site/services/dev/1_dummy.yaml index ea33cc8..fc19816 100644 --- a/site/services/dev/1_dummy.yaml +++ b/site/services/dev/1_dummy.yaml @@ -95,12 +95,12 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - subparam2: + subparam1: dataType: string defaultValue: '' isRequired: false isModifiable: false - subparam1: + subparam2: dataType: string defaultValue: '' isRequired: false @@ -159,10 +159,17 @@ cfsParams: minStr1: dataType: string defaultValue: abracadabra - isRequired: true + isRequired: false isModifiable: false valueList: - abracadabra + - incorr + - correctvalue + s3-inst: + dataType: string + defaultValue: '' + isRequired: false + isModifiable: false - svcOperationCfsParamId: 654 svcOperationCfsParam: arrayMapFixedExample dataType: array-map-fixed @@ -170,21 +177,6 @@ cfsParams: defaultValue: '' isModifiable: false dataDescriptor: - bol1: - dataType: boolean - defaultValue: '' - isRequired: true - isModifiable: false - valueList: - - 'false' - - 'true' - minStr1: - dataType: string - defaultValue: '' - isRequired: true - isModifiable: false - valueList: - - abracadabra param1: dataType: integer > 0 defaultValue: '' @@ -204,6 +196,21 @@ cfsParams: defaultValue: '1' isRequired: true isModifiable: false + bol1: + dataType: boolean + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - 'false' + - 'true' + minStr1: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - abracadabra - svcOperationCfsParamId: 863 svcOperationCfsParam: arr dataType: array @@ -214,6 +221,12 @@ cfsParams: - test - '2' - val1 +- svcOperationCfsParamId: 1131 + svcOperationCfsParam: s3-ref-root + dataType: string + isRequired: false + defaultValue: '' + isModifiable: false - svcOperationCfsParamId: 287 svcOperationCfsParam: durationMs dataType: integer >= 0 @@ -286,6 +299,7 @@ cfsParamsByOp: - 647 - 654 - 863 + - 1131 71: [] 92: - 287 @@ -306,9 +320,10 @@ stateParams: whereFail: '1' resourceRealm: dummy bodymessage: '' - mapExample: '{"subparam2": "", "subparam1": "", "secret": ""}' + mapExample: '{"subparam1": "", "subparam2": "", "secret": ""}' jsonExample: '' nestedRefExample: '' - mapFixed: '{"param1": 1, "param2": "1", "param3": 1, "bol1": false, "minStr1": "abracadabra"}' - arrayMapFixedExample: '{"bol1": false, "minStr1": "", "param1": 0, "param2": "", "param3": 1}' + mapFixed: '{"param1": 1, "param2": "1", "param3": 1, "bol1": false, "minStr1": "abracadabra", "s3-inst": ""}' + arrayMapFixedExample: '{"param1": 0, "param2": "", "param3": 1, "bol1": false, "minStr1": ""}' arr: '' + s3-ref-root: '' diff --git a/site/services/dev/21_vc_vdc.yaml b/site/services/dev/21_vc_vdc.yaml index 662531f..afd9c83 100644 --- a/site/services/dev/21_vc_vdc.yaml +++ b/site/services/dev/21_vc_vdc.yaml @@ -84,12 +84,12 @@ cfsParams: isModifiable: false - svcOperationCfsParamId: 397 svcOperationCfsParam: cpuGuaranteed - dataType: integer > 0 + dataType: integer >= 0 isRequired: true - defaultValue: '20' + defaultValue: '0' isModifiable: false valueList: - - '20' + - '0' - '50' - '80' - svcOperationCfsParamId: 557 @@ -110,6 +110,12 @@ cfsParams: isRequired: true defaultValue: '' isModifiable: false +- svcOperationCfsParamId: 1130 + svcOperationCfsParam: suffixName + dataType: string + isRequired: false + defaultValue: 7uabwsgb + isModifiable: false - svcOperationCfsParamId: 560 svcOperationCfsParam: cpuAllocated dataType: integer > 0 @@ -148,6 +154,7 @@ cfsParamsByOp: - 557 - 558 - 746 + - 1130 24: [] 112: - 560 @@ -160,7 +167,8 @@ stateParams: organizationUid: '' providerVdc: '' storageConfig: '{"name": "", "size": 2000}' - cpuGuaranteed: '20' + cpuGuaranteed: '0' cpuAllocated: '80' memAllocated: '200' networkProvider: '' + suffixName: 7uabwsgb diff --git a/site/services/dev/22_vc_nsxt.yaml b/site/services/dev/22_vc_nsxt.yaml index 9988cbc..3ffc72f 100644 --- a/site/services/dev/22_vc_nsxt.yaml +++ b/site/services/dev/22_vc_nsxt.yaml @@ -88,6 +88,28 @@ cfsParams: isRequired: false defaultValue: '' isModifiable: true +- svcOperationCfsParamId: 1110 + svcOperationCfsParam: routedNetConfiguration + dataType: map-fixed + isRequired: true + defaultValue: '' + isModifiable: true + dataDescriptor: + ipAddrPool: + dataType: string + defaultValue: 10.10.102.0/24 + isRequired: true + isModifiable: false + mainDns: + dataType: string + defaultValue: 81.22.46.22 + isRequired: true + isModifiable: false + secondDns: + dataType: string + defaultValue: 185.247.187.77 + isRequired: true + isModifiable: false - svcOperationCfsParamId: 368 svcOperationCfsParam: needEnableAVI dataType: boolean @@ -115,6 +137,28 @@ cfsParams: isRequired: false defaultValue: '' isModifiable: true +- svcOperationCfsParamId: 1112 + svcOperationCfsParam: routedNetConfiguration + dataType: map-fixed + isRequired: true + defaultValue: '' + isModifiable: true + dataDescriptor: + ipAddrPool: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false + mainDns: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false + secondDns: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false cfsParamsByOp: 10: - 8 @@ -123,12 +167,14 @@ cfsParamsByOp: - 621 - 622 - 825 + - 1110 25: [] 111: - 368 - 369 - 372 - 856 + - 1112 252: [] stateParams: vdcUid: '' @@ -137,3 +183,4 @@ stateParams: vdcType: vdc vdcGroupUid: '' qosProfile: '' + routedNetConfiguration: '{"ipAddrPool": "10.10.102.0/24", "mainDns": "81.22.46.22", "secondDns": "185.247.187.77"}' diff --git a/site/services/dev/25_vcexternalip.yaml b/site/services/dev/25_vcexternalip.yaml index bbc2bde..1c4ba7f 100644 --- a/site/services/dev/25_vcexternalip.yaml +++ b/site/services/dev/25_vcexternalip.yaml @@ -1,6 +1,6 @@ name: vcexternalip service_id: 25 -service_display_name: Публичные IP адреса +service_display_name: '[DEPRECATED] Публичные IP адреса' service_short_name: vcexternalip service_man: '**Обычно эта услуга разворачивается автоматически при развёртывании более сложных услуг**
Вручную создавать можно, однако услуга требует много параметров, о которых можно просто не знать

Резервировать публичные IP адреса можно только после создания NGcloud Organization, NGcloud Виртуальный датацентр, NGcloud Каталог, Сетевой шлюз периметра.
Вы можете назначить IP адрес для существующего экземпляра diff --git a/site/services/dev/26_vapp.yaml b/site/services/dev/26_vapp.yaml index 2eb0a76..f9cedd1 100644 --- a/site/services/dev/26_vapp.yaml +++ b/site/services/dev/26_vapp.yaml @@ -52,7 +52,7 @@ cfsParams: svcOperationCfsParam: vappName dataType: string isRequired: true - defaultValue: fgpdul5a + defaultValue: j8lanwbr isModifiable: false - svcOperationCfsParamId: 623 svcOperationCfsParam: vdcUid @@ -71,5 +71,5 @@ cfsParamsByOp: 208: [] stateParams: nsxtUid: '' - vappName: fgpdul5a + vappName: j8lanwbr vdcUid: '' diff --git a/site/services/dev/28_vc_vm_v3.yaml b/site/services/dev/28_vc_vm_v3.yaml index a790017..e28850c 100644 --- a/site/services/dev/28_vc_vm_v3.yaml +++ b/site/services/dev/28_vc_vm_v3.yaml @@ -83,11 +83,22 @@ cfsParams: defaultValue: '1' isModifiable: true - svcOperationCfsParamId: 411 - svcOperationCfsParam: vmDisk - dataType: integer > 0 + svcOperationCfsParam: vmDisks + dataType: array-map-fixed isRequired: false - defaultValue: '' + defaultValue: '[{"busNum": 0, "size": "20"}]' isModifiable: true + dataDescriptor: + busNum: + dataType: integer >= 0 + defaultValue: '' + isRequired: true + isModifiable: false + size: + dataType: integer > 0 + defaultValue: '1' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 412 svcOperationCfsParam: ipSpaceName dataType: string @@ -96,9 +107,9 @@ cfsParams: isModifiable: true - svcOperationCfsParamId: 413 svcOperationCfsParam: accessIpList - dataType: json + dataType: array isRequired: false - defaultValue: '' + defaultValue: '["0.0.0.0/0"]' isModifiable: true - svcOperationCfsParamId: 414 svcOperationCfsParam: imageVm @@ -126,10 +137,34 @@ cfsParams: isModifiable: false - svcOperationCfsParamId: 448 svcOperationCfsParam: accessPortList - dataType: string + dataType: array-map-fixed isRequired: true - defaultValue: '["22"]' + defaultValue: '[{"port": "22", "type": "tcp"}, {"port": "10050", "type": "tcp"}]' isModifiable: true + dataDescriptor: + port: + dataType: string + defaultValue: '22' + isRequired: true + isModifiable: false + type: + dataType: string + defaultValue: all + isRequired: true + isModifiable: false + valueList: + - tcp + - udp + - all +- svcOperationCfsParamId: 1118 + svcOperationCfsParam: sameSnat + dataType: boolean + isRequired: false + defaultValue: 'false' + isModifiable: true + valueList: + - 'false' + - 'true' - svcOperationCfsParamId: 493 svcOperationCfsParam: vmCpu dataType: integer > 0 @@ -143,22 +178,28 @@ cfsParams: defaultValue: '' isModifiable: true - svcOperationCfsParamId: 495 - svcOperationCfsParam: vmDisk - dataType: integer > 0 + svcOperationCfsParam: vmDisks + dataType: array-map-fixed isRequired: false defaultValue: '' isModifiable: true + dataDescriptor: + busNum: + dataType: integer >= 0 + defaultValue: '' + isRequired: true + isModifiable: false + size: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 496 svcOperationCfsParam: ipSpaceName dataType: string isRequired: false defaultValue: '' isModifiable: true - valueList: - - no-needed - - internet-antiddos-v1 - - internet-no-antiddos-v1 - - internet-ipv4-v1 - svcOperationCfsParamId: 497 svcOperationCfsParam: accessIpList dataType: json @@ -167,10 +208,34 @@ cfsParams: isModifiable: true - svcOperationCfsParamId: 498 svcOperationCfsParam: accessPortList - dataType: json + dataType: array-map-fixed isRequired: false defaultValue: '' isModifiable: true + dataDescriptor: + port: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false + type: + dataType: string + defaultValue: all + isRequired: true + isModifiable: false + valueList: + - tcp + - udp + - all +- svcOperationCfsParamId: 1119 + svcOperationCfsParam: sameSnat + dataType: boolean + isRequired: true + defaultValue: '' + isModifiable: true + valueList: + - 'false' + - 'true' - svcOperationCfsParamId: 509 svcOperationCfsParam: vmName dataType: string @@ -201,11 +266,6 @@ cfsParams: isRequired: false defaultValue: '' isModifiable: true - valueList: - - no-needed - - internet-antiddos-v1 - - internet-no-antiddos-v1 - - internet-ipv4-v1 - svcOperationCfsParamId: 514 svcOperationCfsParam: accessIpList dataType: json @@ -242,10 +302,34 @@ cfsParams: isModifiable: true - svcOperationCfsParamId: 520 svcOperationCfsParam: accessPortList - dataType: json + dataType: array-map-fixed isRequired: false defaultValue: '' isModifiable: true + dataDescriptor: + port: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false + type: + dataType: string + defaultValue: all + isRequired: true + isModifiable: false + valueList: + - tcp + - udp + - all +- svcOperationCfsParamId: 1123 + svcOperationCfsParam: sameSnat + dataType: boolean + isRequired: true + defaultValue: '' + isModifiable: true + valueList: + - 'false' + - 'true' cfsParamsByOp: 132: - 407 @@ -260,6 +344,7 @@ cfsParamsByOp: - 416 - 417 - 448 + - 1118 133: [] 159: - 493 @@ -268,6 +353,7 @@ cfsParamsByOp: - 496 - 497 - 498 + - 1119 286: [] 164: - 509 @@ -281,6 +367,7 @@ cfsParamsByOp: - 517 - 518 - 520 + - 1123 135: [] 134: [] stateParams: @@ -288,11 +375,12 @@ stateParams: vmName: web01 vmCpu: '1' vmRam: '1' - vmDisk: '' + vmDisks: '{"busNum": 0, "size": 1}' ipSpaceName: '' - accessIpList: '' + accessIpList: '["0.0.0.0/0"]' imageVm: '' cloudInit: '' userLogin: myuser userPublicKey: '' - accessPortList: '["22"]' + accessPortList: '{"port": "22", "type": "all"}' + sameSnat: 'false' diff --git a/site/services/dev/2_template.yaml b/site/services/dev/2_template.yaml index 1045c98..ab34703 100644 --- a/site/services/dev/2_template.yaml +++ b/site/services/dev/2_template.yaml @@ -39,6 +39,11 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: + cpu: + dataType: integer > 0 + defaultValue: '100' + isRequired: true + isModifiable: false memory: dataType: integer > 0 defaultValue: '128' @@ -49,11 +54,6 @@ cfsParams: defaultValue: '1' isRequired: true isModifiable: false - cpu: - dataType: integer > 0 - defaultValue: '100' - isRequired: true - isModifiable: false disk: dataType: integer > 0 defaultValue: '5' @@ -72,6 +72,7 @@ cfsParams: isRequired: true isModifiable: false valueList: + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - svcOperationCfsParamId: 815 @@ -91,7 +92,7 @@ cfsParams: - service domain: dataType: string - defaultValue: abracadabra-l9gtqv1m + defaultValue: abracadabra-i5kntoh3 isRequired: true isModifiable: false masterIpSpace: @@ -121,26 +122,26 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - memory: - dataType: integer > 0 - defaultValue: '' - isRequired: true - isModifiable: false - replicas: - dataType: integer > 0 - defaultValue: '' - isRequired: true - isModifiable: false cpu: dataType: integer > 0 defaultValue: '' isRequired: true isModifiable: false + memory: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false disk: dataType: integer >= 0 defaultValue: '' isRequired: true isModifiable: false + replicas: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 817 svcOperationCfsParam: accessConfiguration dataType: map-fixed @@ -148,16 +149,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - slaveIpSpace: - dataType: string - defaultValue: '' - isRequired: true - isModifiable: false - slaveAccessList: - dataType: json - defaultValue: '' - isRequired: true - isModifiable: false type: dataType: string defaultValue: '' @@ -176,11 +167,21 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false + slaveIpSpace: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false masterAccessList: dataType: json defaultValue: '' isRequired: true isModifiable: false + slaveAccessList: + dataType: json + defaultValue: '' + isRequired: true + isModifiable: false cfsParamsByOp: 74: - 813 @@ -194,6 +195,6 @@ cfsParamsByOp: 98: [] 97: [] stateParams: - clusterConfiguration: '{"memory": 128, "replicas": 1, "cpu": 100, "disk": 5}' + clusterConfiguration: '{"cpu": 100, "memory": 128, "replicas": 1, "disk": 5}' startupConfiguration: '{"resourceRealm": ""}' - accessConfiguration: '{"type": "ingress", "domain": "abracadabra-l9gtqv1m", "masterIpSpace": "", "masterAccessList": "[]", "slaveIpSpace": "", "slaveAccessList": "[]"}' + accessConfiguration: '{"type": "ingress", "domain": "abracadabra-i5kntoh3", "masterIpSpace": "", "masterAccessList": "[]", "slaveIpSpace": "", "slaveAccessList": "[]"}' diff --git a/site/services/dev/50_nextcloud.yaml b/site/services/dev/50_nextcloud.yaml index a6f58ee..b478ac8 100644 --- a/site/services/dev/50_nextcloud.yaml +++ b/site/services/dev/50_nextcloud.yaml @@ -2,7 +2,49 @@ name: nextcloud service_id: 50 service_display_name: Nextcloud service_short_name: nextcloud -service_man: 'Ресурсная платформа: k8s. Автоматизация: helm chart' +service_man: '# Инструкция по развертыванию Nextcloud через платформу

## 1. Общая информация

Nextcloud — платформа для хранения и совместной работы с файлами. Разворачивается в K8s через + Helm-чарт `nextcloud/nextcloud`.

Сервис **не самодостаточен** — для создания необходимы заранее развёрнутые в той же ресурсной платформе:

* **PostgreSQL (k8s)** — база данных Nextcloud. + У СУБД должен быть выставлен параметр `sslRequired: false`.
* **Redis (k8s)** — используется как memcache/locking backend.

Резервное копирование выполняется через **Velero** (бэкапятся под + и PVC с данными), а не штатным S3-бэкапом СУБД.

### Доступные операции с сервисом

* **create** — создание сервиса
* **delete** — удаление сервиса
* **suspend** — + остановка сервиса (масштабирование реплик в 0)
* **resume** — запуск сервиса
* **restart** — перезапуск (`kubectl rollout restart`)
* **modify** — изменение настроек + сервиса
* **reconcile** — служебная операция синхронизации версии (запускается платформой автоматически)
* **create_backup** — создание резервной копии вручную (через Velero)
* **recovery** — + восстановление из резервной копии в **новый** инстанс

> **Примечание:** операций работы с пользователями Nextcloud (`create_user`/`modify_user`/`delete_user`) на уровне платформы нет — пользователи + приложения администрируются внутри самого Nextcloud.

---

## 2. Параметры создания сервиса

### Платформа для развертывания

Ресурсная платформа (`resourceRealm`), в которой + будет развёрнут сервис. PostgreSQL и Redis, указанные ниже, обязаны находиться в той же ресурсной платформе.

### СУБД PostgreSQL (psqlUid)

UID инстанса PostgreSQL (k8s), в котором будет + создана база и пользователь `nextcloud`.

* У выбранной СУБД должна отсутствовать база `nextcloud` и пользователь `nextcloud`.
* У СУБД обязан быть выключен `sslMode` (`false`).

### + СУБД Redis (redisUid)

UID инстанса Redis (k8s), который будет использоваться как memcache/locking backend.

### Количество реплик

Количество реплик Nextcloud (`clusterConfiguration.replicas`).

### + Квота памяти пода (MB)

Объём памяти для пода Nextcloud в мегабайтах.
Пример: `2048`

### Квота CPU пода (mCPU)

CPU-квота для пода Nextcloud в миликорах (1000 mCPU = 1 vCPU).
Пример: + `1000`

### Размер диска для данных (GB)

Объём диска под данные Nextcloud (`/var/www/html/data`) в гигабайтах.
Пример: `20`

### Домен

Домен, на котором будет доступен + Nextcloud (`accessConfiguration.domain`).

* Если указано **полное доменное имя** (содержит точку, например `cloud.company.ru`) — домен считается клиентским. Перед созданием клиент обязан сам + настроить DNS-запись, указывающую на адрес Ingress платформы, иначе создание завершится ошибкой.
* Если указано **короткое имя** (без точки, например `mycloud`) — платформа сама создаёт DNS-запись + вида `.nextcloudk8s` и настраивает сертификат.

### Версия

Версия приложения Nextcloud (`appConfiguration.version`, поле `appVersion` Helm-чарта). По ней автоматически подбирается + последняя подходящая версия Helm-чарта.

### Document Server

Параметр `appConfiguration.documentServer`. Если указать `collabora` — в кластер дополнительно разворачивается Collabora Online + (совместное редактирование офисных документов), доступный по пути `/collabora` на том же домене.
Оставьте пустым, если Document Server не нужен.

### Уровень логирования

Параметр + `appConfiguration.logLevel`. Одно из значений: `DEBUG`, `INFO`, `WARN`, `ERROR`, `FATAL`, либо `NONE` — чтобы не переопределять логирование Nextcloud.

---

## 3. Параметры модификации + сервиса

Изменению подлежат ресурсы, версия и часть `appConfiguration`. Параметры `psqlUid`/`redisUid` менять после создания не рекомендуется.

### Количество реплик

См. раздел + 2.

### Квота памяти пода (MB) / Квота CPU пода (mCPU) / Размер диска (GB)

См. раздел 2.

> **Примечание:** уменьшить уже выделенный размер диска нельзя.

### Версия

Обновление + версии разрешено только **на один патч** либо **на одну минорную версию вперёд** (с `patch=0`). Прыжок сразу через несколько минорных версий или через несколько мажорных версий запрещён — обновляться + нужно последовательно.

> **Примечание:** перед обновлением на новую minor/major-версию необходимо сначала выполнить `modify` на текущей версии, обновившись до последнего релиза этой версии (иначе + операция завершится ошибкой с описанием, до какой версии нужно обновиться сначала).

### Document Server / Уровень логирования

См. раздел 2.

---

## 4. Параметры удаления + сервиса

Специальных параметров нет — удаление сносит namespace целиком.

> **Примечание:** резервные копии, созданные через `create_backup`, хранятся в Velero отдельно от инстанса и **не + удаляются** вместе с сервисом — операции `delete_backup` для Nextcloud нет, копии нужно вычищать на стороне Velero отдельно.

---

## 5. Параметры создания бэкапа

Специальных + пользовательских параметров нет — имя бэкапа генерируется автоматически в формате `<дата>-<версия>-`.

> **Примечание:** создать бэкап можно только если сервис предварительно приостановлен + (`suspend`). Velero, в который создаётся бэкап, должен быть развёрнут в той же ресурсной платформе, что и Nextcloud, и не может быть сменён на другой Velero-инстанс в рамках одного сервиса.

Бэкапится + под с данными вместе с PVC/PV (файлы), метаданные и БД PostgreSQL бэкапом не затрагиваются — версия схемы БД фиксируется отдельно (см. раздел 6).

---

## 6. Параметры восстановления из + бэкапа (recovery)

В отличие от СУБД-сервисов, `recovery` у Nextcloud **не восстанавливает данные в текущий инстанс**, а создаёт **новый** инстанс сервиса (аналог `create`), в который переносятся + файлы из указанной резервной копии.

### Точка восстановления (recoveryPoint)

Имя резервной копии Velero, из которой будет выполнено восстановление.

### Домен нового инстанса

Обязан + отличаться от домена исходного (текущего) инстанса — восстановление на тот же домен не поддерживается.

### СУБД PostgreSQL нового инстанса

Если версия Nextcloud в бэкапе отличается от + текущей версии инстанса, для нового инстанса обязательно нужно указать **другую** СУБД PostgreSQL (нельзя восстанавливать бэкап со старой схемой БД поверх БД с более новой схемой).

---

## + 7. Выходные параметры

После успешного создания сервиса платформа возвращает:

### connectionUrl

Адрес для входа в Nextcloud: `https://<домен>`.

### namespace

Namespace + в K8s-кластере, в котором развёрнут сервис.

### Учётные данные (Vault)

В Vault сохраняется пароль администратора (`adminPass`) под логином `admin`.

---

## 8. Пример + подключения

Откройте `connectionUrl` в браузере и авторизуйтесь:

* **Логин:** `admin`
* **Пароль:** значение `adminPass` из блока «Учётные данные» в Vault

---

## + 9. Дополнительная информация

### Зависимости

Nextcloud нельзя создать без уже существующих в том же `resourceRealm` сервисов PostgreSQL (k8s, `sslRequired: false`) и Redis (k8s). При + `delete` зависимые СУБД и Redis не трогаются — удаляется только сам Nextcloud.

### suspend/resume

При `suspend` количество реплик Nextcloud, Collabora и exporter''а метрик принудительно + выставляется в `0` через `helm upgrade` (реальное масштабирование, а не просто пауза cron). При `resume` реплики возвращаются к значению из `clusterConfiguration.replicas`.

### Collabora

Собирается + из отдельного `image.repository: nexus-sa.tst.nubes.ru/collabora/code` и включается только при `appConfiguration.documentServer == ''collabora''`. Доступен на том же домене и том же TLS-сертификате, что + и сам Nextcloud, по пути `/collabora`.

### Бэкап/восстановление через Velero

Бэкап/восстановление файлов идёт через Velero с селектором `backup=-velero-backup` и включает + под, PVC и PV — то есть непосредственно файлы `/var/www/html/data`. Восстановление БД в новый инстанс выполняется штатным механизмом `create` с параметром `instanceUidFrom`, который проставляет `recovery`-джоба + автоматически.
' lifecycle: suspendOnDestroyDefault: true adoptExistingOnCreateDefault: false @@ -53,6 +95,22 @@ cfsParams: defaultValue: '' isModifiable: false dataDescriptor: + resourceRealm: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - devclustername + - k8s-3-sandbox-nubes-ru + - k8s-4-sandbox-nubes-ru + psqlEnabled: + dataType: boolean + defaultValue: 'true' + isRequired: true + isModifiable: false + valueList: + - 'true' redisEnabled: dataType: boolean defaultValue: 'true' @@ -70,21 +128,6 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false - resourceRealm: - dataType: string - defaultValue: '' - isRequired: true - isModifiable: false - valueList: - - k8s-3-sandbox-nubes-ru - - k8s-4-sandbox-nubes-ru - psqlEnabled: - dataType: boolean - defaultValue: 'true' - isRequired: true - isModifiable: false - valueList: - - 'true' - svcOperationCfsParamId: 1056 svcOperationCfsParam: clusterConfiguration dataType: map-fixed @@ -138,7 +181,7 @@ cfsParams: dataDescriptor: domain: dataType: string - defaultValue: nextcloud-vbxjicr2 + defaultValue: nextcloud-gsjkslra isRequired: true isModifiable: false - svcOperationCfsParamId: 1058 @@ -193,19 +236,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - replicas: - dataType: integer > 0 - defaultValue: '' - isRequired: true - isModifiable: false - valueList: - - '1' - - '2' - disk: - dataType: integer > 0 - defaultValue: '' - isRequired: true - isModifiable: false cpu: dataType: integer > 0 defaultValue: '' @@ -230,6 +260,19 @@ cfsParams: - '6144' - '7168' - '8192' + replicas: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - '1' + - '2' + disk: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 1060 svcOperationCfsParam: appConfiguration dataType: map-fixed @@ -276,18 +319,9 @@ cfsParams: isRequired: true isModifiable: false valueList: + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - veleroUid: - dataType: string - defaultValue: '' - isRequired: true - isModifiable: false - recoveryPoint: - dataType: string - defaultValue: '' - isRequired: true - isModifiable: false psqlEnabled: dataType: boolean defaultValue: 'true' @@ -302,6 +336,11 @@ cfsParams: isModifiable: false valueList: - 'true' + recoveryPoint: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false psqlUid: dataType: uuid defaultValue: '' @@ -312,6 +351,11 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false + veleroUid: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 1079 svcOperationCfsParam: clusterConfiguration dataType: map-fixed @@ -319,16 +363,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - replicas: - dataType: integer > 0 - defaultValue: 1,2 - isRequired: true - isModifiable: false - disk: - dataType: integer > 0 - defaultValue: '10' - isRequired: true - isModifiable: false cpu: dataType: integer > 0 defaultValue: '' @@ -353,6 +387,16 @@ cfsParams: - '6144' - '7168' - '8192' + replicas: + dataType: integer > 0 + defaultValue: 1,2 + isRequired: true + isModifiable: false + disk: + dataType: integer > 0 + defaultValue: '10' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 1080 svcOperationCfsParam: accessConfiguration dataType: map-fixed @@ -362,7 +406,7 @@ cfsParams: dataDescriptor: domain: dataType: string - defaultValue: nextcloud-bcdguda1 + defaultValue: nextcloud-cpp3zfhe isRequired: true isModifiable: false - svcOperationCfsParamId: 1081 @@ -372,6 +416,13 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: + documentServer: + dataType: string + defaultValue: collabora + isRequired: true + isModifiable: false + valueList: + - collabora logLevel: dataType: string defaultValue: NONE @@ -389,13 +440,6 @@ cfsParams: defaultValue: '' isRequired: false isModifiable: false - documentServer: - dataType: string - defaultValue: collabora - isRequired: true - isModifiable: false - valueList: - - collabora cfsParamsByOp: 16: - 1055 @@ -418,7 +462,7 @@ cfsParamsByOp: 129: [] 128: [] stateParams: - startupConfiguration: '{"redisEnabled": true, "psqlUid": "", "redisUid": "", "resourceRealm": "", "psqlEnabled": true}' + startupConfiguration: '{"resourceRealm": "", "psqlEnabled": true, "redisEnabled": true, "psqlUid": "", "redisUid": ""}' clusterConfiguration: '{"cpu": 1000, "memory": 1024, "replicas": 1, "disk": 10}' - accessConfiguration: '{"domain": "nextcloud-vbxjicr2"}' + accessConfiguration: '{"domain": "nextcloud-gsjkslra"}' appConfiguration: '{"version": "33.0.4", "documentServer": "collabora", "logLevel": "INFO"}' diff --git a/site/services/dev/81_superset.yaml b/site/services/dev/81_superset.yaml index 3b025e3..1ec2540 100644 --- a/site/services/dev/81_superset.yaml +++ b/site/services/dev/81_superset.yaml @@ -54,6 +54,7 @@ cfsParams: defaultValue: '' isModifiable: false valueList: + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - svcOperationCfsParamId: 227 diff --git a/site/services/dev/82_harbor.yaml b/site/services/dev/82_harbor.yaml index 4ecbde7..3deb6e1 100644 --- a/site/services/dev/82_harbor.yaml +++ b/site/services/dev/82_harbor.yaml @@ -7,7 +7,7 @@ service_man: 'Расширенный реестр для управления Do процесса непрерывной интеграции. Контейнеры идеально подходят для запуска небольших, независимых и легко изменяемых сервисов.
Чтобы начать работу, создайте реестр и загрузите в него Docker-образ
Авторизация: keycloak' lifecycle: - suspendOnDestroyDefault: false + suspendOnDestroyDefault: true adoptExistingOnCreateDefault: false operations: - svcOperationId: 14 @@ -26,6 +26,14 @@ operations: operation: reconcile kind: action action: reconcile +- svcOperationId: 415 + operation: resume + kind: instance + action: resume +- svcOperationId: 416 + operation: suspend + kind: instance + action: suspend stateOut: {} cfsParams: - svcOperationCfsParamId: 16 @@ -41,6 +49,7 @@ cfsParams: defaultValue: '' isModifiable: false valueList: + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - svcOperationCfsParamId: 228 @@ -64,9 +73,33 @@ cfsParams: - svcOperationCfsParamId: 231 svcOperationCfsParam: s3Uid dataType: uuid - isRequired: true + isRequired: false defaultValue: '' isModifiable: false +- svcOperationCfsParamId: 1126 + svcOperationCfsParam: pvType + dataType: string + isRequired: true + defaultValue: s3 + isModifiable: false + valueList: + - s3 + - local +- svcOperationCfsParamId: 1127 + svcOperationCfsParam: resourceDisk + dataType: integer > 0 + isRequired: false + defaultValue: '5' + isModifiable: true +- svcOperationCfsParamId: 1128 + svcOperationCfsParam: authType + dataType: string + isRequired: true + defaultValue: local + isModifiable: false + valueList: + - local + - keycloak - svcOperationCfsParamId: 822 svcOperationCfsParam: resourceInstances dataType: integer > 0 @@ -85,6 +118,12 @@ cfsParams: isRequired: true defaultValue: '' isModifiable: true +- svcOperationCfsParamId: 1129 + svcOperationCfsParam: resourceDisk + dataType: integer > 0 + isRequired: false + defaultValue: '' + isModifiable: true cfsParamsByOp: 14: - 16 @@ -93,12 +132,18 @@ cfsParamsByOp: - 229 - 230 - 231 + - 1126 + - 1127 + - 1128 15: [] 270: - 822 - 823 - 824 + - 1129 405: [] + 415: [] + 416: [] stateParams: domain: harbor-1 resourceRealm: '' @@ -106,3 +151,6 @@ stateParams: resourceMemory: '1024' resourceInstances: '1' s3Uid: '' + pvType: s3 + resourceDisk: '5' + authType: local diff --git a/site/services/dev/86_k8s_velero.yaml b/site/services/dev/86_k8s_velero.yaml index 589298c..52f2d3a 100644 --- a/site/services/dev/86_k8s_velero.yaml +++ b/site/services/dev/86_k8s_velero.yaml @@ -71,6 +71,7 @@ cfsParams: isRequired: true isModifiable: false valueList: + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - svcOperationCfsParamId: 964 @@ -118,6 +119,11 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: + cpu: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false memory: dataType: integer > 0 defaultValue: '' @@ -132,11 +138,6 @@ cfsParams: - '1' - '2' - '3' - cpu: - dataType: integer > 0 - defaultValue: '' - isRequired: true - isModifiable: false - svcOperationCfsParamId: 966 svcOperationCfsParam: nodeAgentConfiguration dataType: map-fixed diff --git a/site/services/dev/87_k8svalkey.yaml b/site/services/dev/87_k8svalkey.yaml new file mode 100644 index 0000000..726d8c2 --- /dev/null +++ b/site/services/dev/87_k8svalkey.yaml @@ -0,0 +1,254 @@ +name: k8svalkey +service_id: 87 +service_display_name: Valkey +service_short_name: k8svalkey +service_man: Valkey-кластер.
Пока в статусе EXPEREMENTAL +lifecycle: + suspendOnDestroyDefault: true + adoptExistingOnCreateDefault: false +operations: +- svcOperationId: 396 + operation: create + kind: instance + action: create +- svcOperationId: 401 + operation: create_user + kind: subresource + action: create +- svcOperationId: 395 + operation: delete + kind: instance + action: delete +- svcOperationId: 402 + operation: delete_user + kind: subresource + action: delete +- svcOperationId: 400 + operation: modify + kind: instance + action: modify +- svcOperationId: 397 + operation: reconcile + kind: action + action: reconcile +- svcOperationId: 399 + operation: resume + kind: instance + action: resume +- svcOperationId: 398 + operation: suspend + kind: instance + action: suspend +stateOut: + users: {} +cfsParams: +- svcOperationCfsParamId: 1066 + svcOperationCfsParam: startupConfiguration + dataType: map-fixed + isRequired: true + defaultValue: '' + isModifiable: false + dataDescriptor: + resourceRealm: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - devclustername + - k8s-3-sandbox-nubes-ru + - k8s-4-sandbox-nubes-ru +- svcOperationCfsParamId: 1067 + svcOperationCfsParam: clusterConfiguration + dataType: map-fixed + isRequired: true + defaultValue: '' + isModifiable: true + dataDescriptor: + cpu: + dataType: integer > 0 + defaultValue: '500' + isRequired: true + isModifiable: false + disk: + dataType: integer > 0 + defaultValue: '10' + isRequired: true + isModifiable: false + memory: + dataType: integer > 0 + defaultValue: '512' + isRequired: true + isModifiable: false + replicas: + dataType: integer > 0 + defaultValue: '1' + isRequired: true + isModifiable: false + valueList: + - '1' + - '3' + - '5' + - '7' + shards: + dataType: integer > 0 + defaultValue: '1' + isRequired: true + isModifiable: false + valueList: + - '1' + - '2' + - '3' + - '4' + - '5' +- svcOperationCfsParamId: 1068 + svcOperationCfsParam: accessConfiguration + dataType: map-fixed + isRequired: true + defaultValue: '' + isModifiable: true + dataDescriptor: + masterAccessList: + dataType: json + defaultValue: '[]' + isRequired: true + isModifiable: false + masterIpSpace: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false +- svcOperationCfsParamId: 1071 + svcOperationCfsParam: valkeyConfiguration + dataType: map-fixed + isRequired: true + defaultValue: '' + isModifiable: false + dataDescriptor: + version: + dataType: string + defaultValue: 0.1.0 + isRequired: true + isModifiable: false + valueList: + - 0.1.0 +- svcOperationCfsParamId: 1072 + svcOperationCfsParam: valkeyConf + dataType: array-map-fixed + isRequired: false + defaultValue: '' + isModifiable: false + dataDescriptor: + paramName: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false + paramValue: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false +- svcOperationCfsParamId: 1073 + svcOperationCfsParam: username + dataType: string + isRequired: true + defaultValue: '' + isModifiable: false +- svcOperationCfsParamId: 1074 + svcOperationCfsParam: permissions + dataType: string + isRequired: true + defaultValue: '' + isModifiable: false +- svcOperationCfsParamId: 1075 + svcOperationCfsParam: username + dataType: string + isRequired: true + defaultValue: '' + isModifiable: true +- svcOperationCfsParamId: 1069 + svcOperationCfsParam: clusterConfiguration + dataType: map-fixed + isRequired: true + defaultValue: '' + isModifiable: true + dataDescriptor: + cpu: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false + disk: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false + memory: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false + replicas: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - '1' + - '3' + - '5' + - '7' + shards: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - '1' + - '2' + - '3' + - '4' + - '5' +- svcOperationCfsParamId: 1070 + svcOperationCfsParam: accessConfiguration + dataType: map-fixed + isRequired: true + defaultValue: '' + isModifiable: true + dataDescriptor: + masterAccessList: + dataType: json + defaultValue: '' + isRequired: true + isModifiable: false + masterIpSpace: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false +cfsParamsByOp: + 396: + - 1066 + - 1067 + - 1068 + - 1071 + - 1072 + 401: + - 1073 + - 1074 + 395: [] + 402: + - 1075 + 400: + - 1069 + - 1070 + 397: [] + 399: [] + 398: [] +stateParams: + startupConfiguration: '{"resourceRealm": ""}' + clusterConfiguration: '{"cpu": 500, "disk": 10, "memory": 512, "replicas": 1, "shards": 1}' + accessConfiguration: '{"masterAccessList": "[]", "masterIpSpace": ""}' + valkeyConfiguration: '{"version": "0.1.0"}' + valkeyConf: '{"paramName": "", "paramValue": ""}' diff --git a/site/services/dev/88_k8s_ziti_controller.yaml b/site/services/dev/88_k8s_ziti_controller.yaml new file mode 100644 index 0000000..ebd9771 --- /dev/null +++ b/site/services/dev/88_k8s_ziti_controller.yaml @@ -0,0 +1,74 @@ +name: k8s_ziti_controller +service_id: 88 +service_display_name: k8sZitiController +service_short_name: k8sZitiController +lifecycle: + suspendOnDestroyDefault: false + adoptExistingOnCreateDefault: false +operations: +- svcOperationId: 99 + operation: create + kind: instance + action: create +- svcOperationId: 105 + operation: delete + kind: instance + action: delete +stateOut: {} +cfsParams: +- svcOperationCfsParamId: 294 + svcOperationCfsParam: resourceCPU + dataType: integer > 0 + isRequired: true + defaultValue: '300' + isModifiable: false +- svcOperationCfsParamId: 295 + svcOperationCfsParam: resourceMemory + dataType: integer > 0 + isRequired: true + defaultValue: '512' + isModifiable: false +- svcOperationCfsParamId: 296 + svcOperationCfsParam: resourceDisk + dataType: integer > 0 + isRequired: true + defaultValue: '1' + isModifiable: false +- svcOperationCfsParamId: 297 + svcOperationCfsParam: resourceInstances + dataType: integer > 0 + isRequired: true + defaultValue: '1' + isModifiable: false +- svcOperationCfsParamId: 298 + svcOperationCfsParam: resourceRealm + dataType: string + isRequired: true + defaultValue: '' + isModifiable: false + valueList: + - devclustername + - k8s-3-sandbox-nubes-ru + - k8s-4-sandbox-nubes-ru +- svcOperationCfsParamId: 299 + svcOperationCfsParam: domain + dataType: string + isRequired: true + defaultValue: k8sZitiController-1 + isModifiable: false +cfsParamsByOp: + 99: + - 294 + - 295 + - 296 + - 297 + - 298 + - 299 + 105: [] +stateParams: + resourceCPU: '300' + resourceMemory: '512' + resourceDisk: '1' + resourceInstances: '1' + resourceRealm: '' + domain: k8sZitiController-1 diff --git a/site/services/dev/89_flask.yaml b/site/services/dev/89_flask.yaml index d7dbe59..4d75f47 100644 --- a/site/services/dev/89_flask.yaml +++ b/site/services/dev/89_flask.yaml @@ -66,6 +66,7 @@ cfsParams: isRequired: true isModifiable: false valueList: + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - svcOperationCfsParamId: 1038 @@ -104,7 +105,7 @@ cfsParams: dataDescriptor: domain: dataType: string - defaultValue: flask-4brtjmwm + defaultValue: flask-67i6r0en isRequired: true isModifiable: false - svcOperationCfsParamId: 1040 @@ -114,6 +115,11 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: + gitPath: + dataType: string + defaultValue: https://github.com/Foxyhhd/Baldurs-Gate-test.git + isRequired: true + isModifiable: false healthPath: dataType: string defaultValue: '' @@ -126,11 +132,6 @@ cfsParams: isModifiable: false valueList: - '3.12' - gitPath: - dataType: string - defaultValue: https://github.com/Foxyhhd/Baldurs-Gate-test.git - isRequired: true - isModifiable: false - svcOperationCfsParamId: 1041 svcOperationCfsParam: jsonEnv dataType: map @@ -171,13 +172,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - version: - dataType: string - defaultValue: '' - isRequired: true - isModifiable: false - valueList: - - '3.12' gitPath: dataType: string defaultValue: '' @@ -188,6 +182,13 @@ cfsParams: defaultValue: '' isRequired: false isModifiable: false + version: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - '3.12' - svcOperationCfsParamId: 1044 svcOperationCfsParam: jsonEnv dataType: map @@ -207,6 +208,7 @@ cfsParams: isRequired: true isModifiable: false valueList: + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru cfsParamsByOp: @@ -229,6 +231,6 @@ cfsParamsByOp: stateParams: startupConfiguration: '{"resourceRealm": ""}' clusterConfiguration: '{"cpu": 200, "memory": 256, "replicas": 1}' - accessConfiguration: '{"domain": "flask-4brtjmwm"}' - appConfiguration: '{"healthPath": "", "version": "3.12", "gitPath": "https://github.com/Foxyhhd/Baldurs-Gate-test.git"}' + accessConfiguration: '{"domain": "flask-67i6r0en"}' + appConfiguration: '{"gitPath": "https://github.com/Foxyhhd/Baldurs-Gate-test.git", "healthPath": "", "version": "3.12"}' jsonEnv: '{}' diff --git a/site/services/dev/90_postgres.yaml b/site/services/dev/90_postgres.yaml index c85f935..e7a7fd1 100644 --- a/site/services/dev/90_postgres.yaml +++ b/site/services/dev/90_postgres.yaml @@ -101,6 +101,16 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: + cpu: + dataType: integer > 0 + defaultValue: '500' + isRequired: true + isModifiable: false + memory: + dataType: integer > 0 + defaultValue: '512' + isRequired: true + isModifiable: false replicas: dataType: integer > 0 defaultValue: '1' @@ -116,16 +126,6 @@ cfsParams: defaultValue: '10' isRequired: true isModifiable: false - cpu: - dataType: integer > 0 - defaultValue: '500' - isRequired: true - isModifiable: false - memory: - dataType: integer > 0 - defaultValue: '512' - isRequired: true - isModifiable: false - svcOperationCfsParamId: 789 svcOperationCfsParam: startupConfiguration dataType: map-fixed @@ -139,6 +139,7 @@ cfsParams: isRequired: true isModifiable: false valueList: + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - svcOperationCfsParamId: 790 @@ -181,16 +182,10 @@ cfsParams: isRequired: true isModifiable: false valueList: + - '18' - '17' - '16' - sslRequired: - dataType: boolean - defaultValue: 'true' - isRequired: true - isModifiable: false - valueList: - - 'false' - - 'true' + - '15' poolerMaster: dataType: boolean defaultValue: 'false' @@ -207,25 +202,41 @@ cfsParams: valueList: - 'false' - 'true' + sslRequired: + dataType: boolean + defaultValue: 'true' + isRequired: true + isModifiable: false + valueList: + - 'true' + - 'false' - svcOperationCfsParamId: 792 svcOperationCfsParam: postgresConf - dataType: array-map-fixed + dataType: map-fixed isRequired: false defaultValue: '' isModifiable: true dataDescriptor: - paramName: + log_disconnections: dataType: string - defaultValue: '' - isRequired: true + defaultValue: 'off' + isRequired: false isModifiable: false valueList: - - log_connections - - log_disconnections - paramValue: + - 'off' + - 'on' + log_connections: dataType: string - defaultValue: '' - isRequired: true + defaultValue: 'off' + isRequired: false + isModifiable: false + valueList: + - 'off' + - 'on' + max_connections: + dataType: integer > 0 + defaultValue: '100' + isRequired: false isModifiable: false - svcOperationCfsParamId: 793 svcOperationCfsParam: backupConfiguration @@ -235,9 +246,9 @@ cfsParams: isModifiable: true dataDescriptor: s3Uid: - dataType: uuid - defaultValue: '' - isRequired: true + dataType: string + defaultValue: 00000000-0000-0000-0000-000000000000 + isRequired: false isModifiable: false retain: dataType: integer > 0 @@ -249,6 +260,11 @@ cfsParams: defaultValue: 0 0 * * * isRequired: true isModifiable: false + incrementCount: + dataType: integer >= 0 + defaultValue: '0' + isRequired: false + isModifiable: false - svcOperationCfsParamId: 794 svcOperationCfsParam: autoscaleConfiguration dataType: map-fixed @@ -311,7 +327,7 @@ cfsParams: isModifiable: false durationServer: dataType: integer > 0 - defaultValue: '87600' + defaultValue: '43800' isRequired: true isModifiable: false certCA: @@ -453,6 +469,7 @@ cfsParams: isRequired: true isModifiable: false valueList: + - '18' - '17' - '16' sslRequired: @@ -478,23 +495,31 @@ cfsParams: - 'true' - svcOperationCfsParamId: 798 svcOperationCfsParam: postgresConf - dataType: array-map-fixed + dataType: map-fixed isRequired: false defaultValue: '' isModifiable: true dataDescriptor: - paramName: + log_connections: dataType: string defaultValue: '' - isRequired: true + isRequired: false isModifiable: false valueList: - - log_connections - - log_disconnections - paramValue: + - 'off' + - 'on' + log_disconnections: dataType: string defaultValue: '' - isRequired: true + isRequired: false + isModifiable: false + valueList: + - 'off' + - 'on' + max_connections: + dataType: integer > 0 + defaultValue: '' + isRequired: false isModifiable: false - svcOperationCfsParamId: 799 svcOperationCfsParam: backupConfiguration @@ -503,6 +528,11 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: + retain: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false schedule: dataType: string defaultValue: 0 0 * * * @@ -513,10 +543,10 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false - retain: - dataType: integer > 0 + incrementCount: + dataType: integer >= 0 defaultValue: '' - isRequired: true + isRequired: false isModifiable: false - svcOperationCfsParamId: 800 svcOperationCfsParam: autoscaleConfiguration @@ -564,24 +594,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - certCA: - dataType: string - defaultValue: '' - isRequired: false - isModifiable: false - certServer: - dataType: string - defaultValue: '' - isRequired: false - isModifiable: false - refreshCert: - dataType: boolean - defaultValue: 'false' - isRequired: false - isModifiable: false - valueList: - - 'false' - - 'true' type: dataType: string defaultValue: '' @@ -601,6 +613,24 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false + certCA: + dataType: string + defaultValue: '' + isRequired: false + isModifiable: false + certServer: + dataType: string + defaultValue: '' + isRequired: false + isModifiable: false + refreshCert: + dataType: boolean + defaultValue: 'false' + isRequired: false + isModifiable: false + valueList: + - 'false' + - 'true' - svcOperationCfsParamId: 801 svcOperationCfsParam: startupConfiguration dataType: map-fixed @@ -614,6 +644,7 @@ cfsParams: isRequired: true isModifiable: false valueList: + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru recoveryPoint: @@ -628,11 +659,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - disk: - dataType: integer > 0 - defaultValue: '10' - isRequired: true - isModifiable: false cpu: dataType: integer > 0 defaultValue: '500' @@ -653,6 +679,11 @@ cfsParams: - '3' - '5' - '7' + disk: + dataType: integer > 0 + defaultValue: '10' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 803 svcOperationCfsParam: accessConfiguration dataType: map-fixed @@ -721,23 +752,31 @@ cfsParams: - 'true' - svcOperationCfsParamId: 805 svcOperationCfsParam: postgresConf - dataType: array-map-fixed + dataType: map-fixed isRequired: false defaultValue: '' isModifiable: true dataDescriptor: - paramName: + log_connections: dataType: string defaultValue: '' - isRequired: true + isRequired: false isModifiable: false valueList: - - log_connections - - log_disconnections - paramValue: + - 'off' + - 'on' + log_disconnections: dataType: string defaultValue: '' - isRequired: true + isRequired: false + isModifiable: false + valueList: + - 'off' + - 'on' + max_connections: + dataType: integer > 0 + defaultValue: '' + isRequired: false isModifiable: false - svcOperationCfsParamId: 806 svcOperationCfsParam: backupConfiguration @@ -761,6 +800,11 @@ cfsParams: defaultValue: 0 0 * * * isRequired: true isModifiable: false + incrementCount: + dataType: integer >= 0 + defaultValue: '' + isRequired: false + isModifiable: false - svcOperationCfsParamId: 807 svcOperationCfsParam: autoscaleConfiguration dataType: map-fixed @@ -768,6 +812,14 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: + enabled: + dataType: boolean + defaultValue: 'false' + isRequired: true + isModifiable: false + valueList: + - 'false' + - 'true' schedule: dataType: integer >= 0 defaultValue: '0' @@ -792,14 +844,32 @@ cfsParams: - '10' - '15' - '20' - enabled: - dataType: boolean - defaultValue: 'false' +- svcOperationCfsParamId: 1106 + svcOperationCfsParam: mtlsConfiguration + dataType: map-fixed + isRequired: true + defaultValue: '' + isModifiable: true + dataDescriptor: + type: + dataType: string + defaultValue: 'off' isRequired: true isModifiable: false valueList: - - 'false' - - 'true' + - 'off' + - manual + - auto + durationCA: + dataType: integer > 0 + defaultValue: '175200' + isRequired: true + isModifiable: false + durationServer: + dataType: integer > 0 + defaultValue: '87600' + isRequired: true + isModifiable: false cfsParamsByOp: 19: - 788 @@ -841,15 +911,16 @@ cfsParamsByOp: - 805 - 806 - 807 + - 1106 54: [] 114: [] 115: [] stateParams: - clusterConfiguration: '{"replicas": 1, "disk": 10, "cpu": 500, "memory": 512}' + clusterConfiguration: '{"cpu": 500, "memory": 512, "replicas": 1, "disk": 10}' startupConfiguration: '{"resourceRealm": ""}' accessConfiguration: '{"masterIpSpace": "", "masterAccessList": "[]", "slaveIpSpace": "", "slaveAccessList": "[]"}' - postgresConfiguration: '{"version": "17", "sslRequired": true, "poolerMaster": false, "poolerSlave": false}' - postgresConf: '{"paramName": "", "paramValue": ""}' - backupConfiguration: '{"s3Uid": "", "retain": 7, "schedule": "0 0 * * *"}' + postgresConfiguration: '{"version": "17", "poolerMaster": false, "poolerSlave": false, "sslRequired": true}' + postgresConf: '{"log_disconnections": "off", "log_connections": "off", "max_connections": 100}' + backupConfiguration: '{"s3Uid": "00000000-0000-0000-0000-000000000000", "retain": 7, "schedule": "0 0 * * *", "incrementCount": 0}' autoscaleConfiguration: '{"enabled": false, "schedule": 0, "quota": 100, "percent": 10}' - mtlsConfiguration: '{"type": "off", "durationCA": 175200, "durationServer": 87600, "certCA": "", "certServer": ""}' + mtlsConfiguration: '{"type": "off", "durationCA": 175200, "durationServer": 43800, "certCA": "", "certServer": ""}' diff --git a/site/services/dev/91_redis.yaml b/site/services/dev/91_redis.yaml index 799a3cf..a5d45dc 100644 --- a/site/services/dev/91_redis.yaml +++ b/site/services/dev/91_redis.yaml @@ -46,6 +46,7 @@ cfsParams: isRequired: true isModifiable: false valueList: + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - svcOperationCfsParamId: 1062 @@ -55,6 +56,11 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: + cpu: + dataType: integer > 0 + defaultValue: '500' + isRequired: true + isModifiable: false memory: dataType: integer > 0 defaultValue: '512' @@ -75,11 +81,6 @@ cfsParams: defaultValue: '10' isRequired: true isModifiable: false - cpu: - dataType: integer > 0 - defaultValue: '500' - isRequired: true - isModifiable: false - svcOperationCfsParamId: 1063 svcOperationCfsParam: accessConfiguration dataType: map-fixed @@ -146,6 +147,11 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: + masterIpSpace: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false masterAccessList: dataType: json defaultValue: '' @@ -161,11 +167,6 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false - masterIpSpace: - dataType: string - defaultValue: '' - isRequired: true - isModifiable: false cfsParamsByOp: 21: - 1061 @@ -180,5 +181,5 @@ cfsParamsByOp: 392: [] stateParams: startupConfiguration: '{"resourceRealm": ""}' - clusterConfiguration: '{"memory": 512, "replicas": 1, "disk": 10, "cpu": 500}' + clusterConfiguration: '{"cpu": 500, "memory": 512, "replicas": 1, "disk": 10}' accessConfiguration: '{"masterIpSpace": "", "masterAccessList": "[]", "slaveIpSpace": "", "slaveAccessList": "[]"}' diff --git a/site/services/dev/92_mongodb.yaml b/site/services/dev/92_mongodb.yaml index fd05d67..262e8a4 100644 --- a/site/services/dev/92_mongodb.yaml +++ b/site/services/dev/92_mongodb.yaml @@ -3,34 +3,65 @@ service_id: 92 service_display_name: MongoDB service_short_name: mongodb service_man: '# Инструкция по развертыванию MongoDB через платформу

## 1. Общая информация

MongoDB — документоориентированная распределённая база данных, обеспечивающая высокую доступность, - горизонтальное масштабирование и гибкую модель хранения.

### Доступные операции с кластером

* **create** — создание базы
* **delete** — удаление базы данных
* **suspend** — - остановка базы данных
* **resume** — запуск базы данных
* **modify** — изменение базы данных

### Доступные операции с пользователями

* **create_user** — создание пользователя
* - **modify_user** — модификация пользователя
* **delete_user** — удаление пользователя

---

## 2. Параметры развертывания базы данных

Эти параметры необходимо указать при создании - базы данных.

### Платформа для развертывания

Среда, в которой будет развернут кластер. Выбирается из предложенного списка.

### Количество узлов

Количество реплик в - кластере MongoDB.
Оптимально выбирать нечётное значение, так как это обеспечивает корректный процесс выбора ведущего узла и сохраняет работоспособность базы данных даже при отказе одной из нод.

> - **Примечание:** уменьшение количества узлов после создания кластера не рекомендуется.

### Квота памяти пода (MB)

Объём памяти для одного пода в мегабайтах.
Пример: `2048`

### - Квота CPU пода (mCPU)

CPU-квота для пода в миликорах (1000 mCPU = 1 vCPU).
Пример: `1000`

### Размер диска для базы данных (GB)

Объём диска для хранения данных в гигабайтах.
Пример: - `20`

### Имя ipSpace для публикации внешнего IP

Имя ipSpace, через который будет выделен внешний IP для доступа к master-узлу.
Укажите `no-needed`, если внешний адрес не требуется.
Пример: - `internet-no-antiddos-v1`

### Список разрешённых IP-адресов

Список IP-адресов или подсетей, с которых разрешён доступ к кластеру.
Если оставить пустым — доступ открыт для всех источников.
Пример: - `["10.0.0.0/24", "192.168.1.10/32"]`

---

## 3. Параметры модификации базы данных

Все параметры, которые вы указываете при модификации, являются необязательными — система автоматически - подставит ранее сохранённые значения, и при необходимости вы можете изменить их на нужные.

### Количество узлов

Количество реплик в кластере MongoDB.
Оптимально выбирать нечётное - значение, так как это обеспечивает корректный процесс выбора ведущего узла и сохраняет работоспособность базы данных даже при отказе одной из нод.

> **Примечание:** уменьшение количества узлов - после создания кластера не рекомендуется.

### Квота памяти пода (MB)

Объём памяти для одного пода в мегабайтах.
Пример: `2048`

### Квота CPU пода (mCPU)

CPU-квота + горизонтальное масштабирование и гибкую модель хранения.

### Доступные операции с кластером

* **create** — создание базы
* **delete** — удаление базы данных
* + **suspend** — остановка базы данных
* **resume** — запуск базы данных
* **modify** — изменение базы данных
* **create_backup** — создание бэкапа вручную
* **delete_backup** — + удаление бэкапов
* **rollback** — восстановление кластера из бэкапа

### Доступные операции с пользователями

* **create_user** — создание пользователя
* **modify_user** + — модификация пользователя
* **delete_user** — удаление пользователя

---

## 2. Параметры создания базы данных

Эти параметры необходимо указать при создании базы данных.

### + Платформа для развертывания

Среда, в которой будет развёрнут кластер. Выбирается из предложенного списка.

### Количество узлов

Количество реплик в кластере MongoDB.
Оптимально + выбирать нечётное значение, так как это обеспечивает корректный процесс выбора ведущего узла и сохраняет работоспособность базы данных даже при отказе одной из нод.

> **Примечание:** уменьшение + количества узлов после создания кластера не рекомендуется.

### Квота памяти пода (MB)

Объём памяти для одного пода в мегабайтах.
Пример: `2048`

### Квота CPU пода (mCPU)

CPU-квота + для пода в миликорах (1000 mCPU = 1 vCPU).
Пример: `1000`

### Размер диска для базы данных (GB)

Объём диска для хранения данных в гигабайтах.
Пример: `20`

### Расписание + резервного копирования

Cron-выражение (5 полей), по которому автоматически создаются резервные копии.
Пример: `0 0 * * *` (каждый день в 00:00)

### Хранить последних бэкапов

Сколько + последних успешных резервных копий хранить — более старые удаляются автоматически.
Пример: `7`

> **Примечание:** ротация применяется только к бэкапам, созданным по расписанию. Бэкапы,
> + созданные вручную операцией `create_backup`, в неё не входят и не удаляются автоматически —
> их нужно убирать вручную через `delete_backup`.

### Имя ipSpace для публикации внешнего IP

Имя + ipSpace, через который будет выделен внешний IP для доступа к master-узлу.
Укажите `no-needed`, если внешний адрес не требуется.
Пример: `internet-no-antiddos-v1`

### Список разрешённых + IP-адресов

Список IP-адресов или подсетей, с которых разрешён доступ к кластеру.
Если оставить пустым — доступ открыт для всех источников.
Пример: `["10.0.0.0/24", "192.168.1.10/32"]`

### + Включить TLS

Булевый параметр. Определяет режим работы TLS кластера.

- `true` — TLS включён (`tls.mode: allowTLS`). Сертификаты сохраняются в Vault.
- `false` — TLS выключен (`tls.mode: + disabled`).

По умолчанию: `false`.

---

## 3. Параметры модификации базы данных

Все параметры, которые вы указываете при модификации, являются необязательными — система + автоматически подставит ранее сохранённые значения, и при необходимости вы можете изменить их на нужные.

### Количество узлов

Количество реплик в кластере MongoDB.
Оптимально выбирать + нечётное значение, так как это обеспечивает корректный процесс выбора ведущего узла и сохраняет работоспособность базы данных даже при отказе одной из нод.

> **Примечание:** уменьшение количества + узлов после создания кластера не рекомендуется.

### Квота памяти пода (MB)

Объём памяти для одного пода в мегабайтах.
Пример: `2048`

### Квота CPU пода (mCPU)

CPU-квота для пода в миликорах (1000 mCPU = 1 vCPU).
Пример: `1000`

### Размер диска для базы данных (GB)

Объём диска для хранения данных указывается в гигабайтах. Его можно увеличить при - необходимости, однако уменьшить уже выделенный размер невозможно.
Пример: `20`

### Имя ipSpace для публикации внешнего IP

Имя ipSpace, через который будет выделен внешний IP для - доступа к master-узлу.
Укажите `no-needed`, если внешний адрес не требуется.
Пример: `internet-no-antiddos-v1`

### Список разрешённых IP-адресов

Список IP-адресов или подсетей, - с которых разрешён доступ к кластеру.
Если оставить пустым — доступ открыт для всех источников.
Пример: `["10.0.0.0/24", "192.168.1.10/32"]`

---

## 3. Параметры создания пользователя

### - Имя пользователя

Указывается имя пользователя (любой регистр).
Пример: `readApp`

### Имя базы данных

Название базы, в которой будет создан пользователь.
Если база отсутствует, - она будет создана автоматически.
Пример: `Apps_9392`

### Имя роли

* **read** — доступ только на чтение
* **readWrite** — чтение и изменение данных
* **dbOwner** — полный - контроль над базой данных

---

## 4. Параметры модификации пользователя

### Имя пользователя

Необходимо выбрать существующего пользователя.
Если список пуст, требуется - предварительно создать пользователя.

### Имя базы данных

База данных, к которой относится пользователь.
Если база отсутствует, она будет создана автоматически.
Пример: `Apps_9392`

### - Имя роли

* **read**
* **readWrite**
* **dbOwner**

---

## 5. Параметры удаления пользователя

### Имя пользователя

Выберите пользователя из списка для - удаления.

---

## 6. Выходные параметры

После успешного развертывания базы данных платформа возвращает ключевые параметры.

### internalConnect

Внутренний эндпоинт - для подключения к кластеру из сервисов, работающих в той же сети.
Используется для внутренних интеграций и системных сервисов.

### externalConnect

Внешний FQDN для подключения к - кластеру извне.
Порт подключения — **27017**.

---

## 7. Пример подключения

Перед подключением необходимо установить **mongosh**.

Команда подключения к базе данных:

```
mongosh - "mongodb://:@:27017/"
```

Где:

* `` — имя пользователя
* `` — пароль
* `` — internalConnect или - externalConnect
* `` — имя базы данных

## 8. Дополнительная информация

Сейчас соединение с базой работает без шифрования, и доступ к кластеру осуществляется только по логину - и паролю.' + необходимости, однако уменьшить уже выделенный размер невозможно.
Пример: `20`

### Расписание резервного копирования

Cron-выражение (5 полей), по которому автоматически создаются + резервные копии.
Пример: `0 0 * * *` (каждый день в 00:00)

### Хранить последних бэкапов

Сколько последних успешных резервных копий хранить — более старые удаляются автоматически.
Пример: + `7`

> **Примечание:** ротация применяется только к бэкапам, созданным по расписанию. Бэкапы,
> созданные вручную операцией `create_backup`, в неё не входят и не удаляются автоматически —
> + их нужно убирать вручную через `delete_backup`.

### Имя ipSpace для публикации внешнего IP

Имя ipSpace, через который будет выделен внешний IP для доступа к master-узлу.
Укажите + `no-needed`, если внешний адрес не требуется.
Пример: `internet-no-antiddos-v1`

### Список разрешённых IP-адресов

Список IP-адресов или подсетей, с которых разрешён доступ к кластеру.
Если + оставить пустым — доступ открыт для всех источников.
Пример: `["10.0.0.0/24", "192.168.1.10/32"]`

---

## 4. Параметры удаления базы данных

### Удалить бакет S3 с бэкапами

Булевый + параметр.

- `true` — вместе с кластером также будут удалены все резервные копии и бакет S3.
- `false` — бакет S3 и хранящиеся в нём бэкапы сохраняются после удаления кластера.

По + умолчанию: `false`.

---

## 5. Параметры создания бэкапа

### Имя бэкапа

Имя резервной копии, которое будет присвоено объекту бэкапа в кластере.
Должно соответствовать + требованиям Kubernetes к именам объектов (строчные буквы, цифры, дефисы).
Пример: `manual-20260904`

> **Примечание:** такой бэкап не участвует в автоматической ротации по параметру
> + "Хранить последних бэкапов" (она применяется только к бэкапам по расписанию) и не удаляется
> сам — при необходимости убрать его нужно вручную операцией `delete_backup`.

---

## 6. + Параметры восстановления из бэкапа

### Имя бэкапа

Имя существующей резервной копии кластера, из которой будет выполнено восстановление. Указывается один из бэкапов в состоянии `ready` + (созданных автоматически по расписанию или вручную через операцию create_backup).

---

## 7. Параметры удаления бэкапов

### Имена бэкапов

Список имён резервных копий + для удаления.
Пример: `["manual-20260904", "cron-mongok8s-...-20260903020000"]`

---

## 8. Параметры создания пользователя

### Имя пользователя

Указывается имя пользователя + (любой регистр).
Пример: `readApp`

> **Примечание:** имя пользователя должно быть уникальным в рамках кластера. Если пользователь
> с таким именем уже существует, операция завершится + ошибкой — используйте `modify_user` для
> изменения прав или `delete_user` + `create_user` для пересоздания.

### Имя базы данных

Название базы, в которой будет создан пользователь.
Если + база отсутствует, она будет создана автоматически.
Пример: `Apps_9392`

### Имя роли

* **read** — доступ только на чтение
* **readWrite** — чтение и изменение данных
* **dbOwner** + — полный контроль над базой данных
* **dbAdmin** — администрирование базы данных (индексы, статистика, схема) без доступа к чтению/записи данных

---

## 9. Параметры модификации пользователя

### + Имя пользователя

Необходимо выбрать существующего пользователя.
Если список пуст, требуется предварительно создать пользователя.

### Имя базы данных

База данных, к которой + относится пользователь.
Если база отсутствует, она будет создана автоматически.
Пример: `Apps_9392`

### Имя роли

* **read**
* **readWrite**
* **dbOwner**
* **dbAdmin**

---

## + 10. Параметры удаления пользователя

### Имя пользователя

Выберите пользователя из списка для удаления.

---

## 11. Выходные параметры

После успешного развертывания + базы данных платформа возвращает ключевые параметры.

### internalConnect

Внутренний эндпоинт для подключения к кластеру из сервисов, работающих в той же сети.
Используется для внутренних + интеграций и системных сервисов.

### externalConnect

Внешний FQDN для подключения к кластеру извне.
Порт подключения — **27017**.

> **Важно:** оба эндпоинта — это Kubernetes + Service на весь replset, а не адрес конкретно
> primary-узла. Kubernetes не отслеживает, кто из узлов сейчас primary, поэтому новое
> подключение без параметра `replicaSet` может попасть на secondary + и упасть с ошибкой записи
> `not writable primary`. Обязательно указывайте `replicaSet=rs0` в строке подключения (см.
> примеры ниже) — тогда драйвер сам обнаружит топологию кластера и всегда + направит запись на
> актуальный primary, независимо от количества реплик и от того, происходили ли выборы.

---

## 12. Пример подключения

Перед подключением необходимо установить + **mongosh**.

### 12.1 Подключение без TLS

Для внутреннего подключения из той же сети:

```
mongosh "mongodb://:@:27017/?authSource=admin&replicaSet=rs0"
```

### + 12.2 Подключение через внешний endpoint с TLS

Кластер требует клиентский TLS-сертификат (mutual TLS). Сертификаты сохраняются в Vault при создании кластера в блоке `cer` в полях `ca`, `cer`, + `key` в кодировке base64.

Подготовка файлов:

```bash
# Декодировать сертификаты из Vault
echo "" | base64 -d > ca.crt
echo " tls.crt
echo "" | base64 -d > tls.key

# Собрать клиентский PEM
cat tls.key tls.crt > client.pem
```

Подключение:

```
mongosh + "mongodb://:@:27017/?tls=true&tlsCAFile=ca.crt&tlsCertificateKeyFile=client.pem&authSource=admin&replicaSet=rs0"
```

Где:

* `` + — имя пользователя
* `` — пароль
* `` — internalConnect (для подключения без TLS)
* `` — externalConnect (для внешнего подключения с TLS)
* + `` — имя базы данных

## 13. Дополнительная информация

Режим TLS задаётся параметром `mongoConfiguration.tls` только при создании кластера.
После создания изменение TLS через + модификацию не поддерживается.

- При `true` кластер разворачивается с включённым TLS (`tls.mode: allowTLS`). Сервер принимает как обычные, так и TLS-соединения.
- При `false` TLS выключен + (`tls.mode: disabled`).

Для внешнего подключения (`externalConnect`) используется сертификат, выпущенный через cert-manager, с SAN, покрывающим внешний DNS-адрес кластера — поэтому `tlsAllowInvalidHostnames` + не требуется, хост проверяется как обычно.

Внутренние подключения TLS-сертификат не используют вообще: режим `allowTLS` допускает как TLS, так и обычные соединения, но для внутреннего трафика + применяется обычное (не TLS) подключение — см. пример 12.1.

### Почему обязателен `replicaSet=rs0` в строке подключения

Percona-оператор не проставляет на поды никакого динамического + лейбла роли (primary/secondary) —
у всех подов replset''а полностью одинаковые лейблы, различается только имя/индекс пода.
`master`-сервис — это обычный Kubernetes Service с фиксированным селектором + на весь replset, он
не знает и не может знать, какой под сейчас primary: k8s просто раздаёт новые TCP-подключения
по кругу между всеми узлами. Без `replicaSet=rs0` в URI подключение может закрепиться + на
secondary, и любая попытка записи будет падать с `not writable primary` — независимо от того,
происходили выборы недавно или нет. Указание `replicaSet=rs0` включает у драйвера обнаружение
топологии + реплики, и он сам направляет запись на актуальный primary при любом количестве узлов
и после любых переизбраний.
' lifecycle: suspendOnDestroyDefault: true adoptExistingOnCreateDefault: false @@ -39,6 +70,10 @@ operations: operation: create kind: instance action: create +- svcOperationId: 411 + operation: create_backup + kind: subresource + action: create - svcOperationId: 198 operation: create_user kind: subresource @@ -47,6 +82,10 @@ operations: operation: delete kind: instance action: delete +- svcOperationId: 414 + operation: delete_backup + kind: subresource + action: delete - svcOperationId: 199 operation: delete_user kind: subresource @@ -67,11 +106,16 @@ operations: operation: resume kind: instance action: resume +- svcOperationId: 413 + operation: rollback + kind: action + action: rollback - svcOperationId: 194 operation: suspend kind: instance action: suspend stateOut: + backups: {} users: {} cfsParams: - svcOperationCfsParamId: 1089 @@ -87,6 +131,7 @@ cfsParams: isRequired: true isModifiable: false valueList: + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - svcOperationCfsParamId: 1090 @@ -96,6 +141,16 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: + cpu: + dataType: integer > 0 + defaultValue: '1000' + isRequired: true + isModifiable: false + memory: + dataType: integer > 0 + defaultValue: '1024' + isRequired: true + isModifiable: false replicas: dataType: integer > 0 defaultValue: '1' @@ -111,16 +166,6 @@ cfsParams: defaultValue: '5' isRequired: true isModifiable: false - cpu: - dataType: integer > 0 - defaultValue: '1000' - isRequired: true - isModifiable: false - memory: - dataType: integer > 0 - defaultValue: '1024' - isRequired: true - isModifiable: false - svcOperationCfsParamId: 1091 svcOperationCfsParam: accessConfiguration dataType: map-fixed @@ -128,16 +173,59 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - masterAccessList: - dataType: json - defaultValue: '[]' - isRequired: true - isModifiable: false masterIpSpace: dataType: string defaultValue: '' isRequired: true isModifiable: false + masterAccessList: + dataType: json + defaultValue: '[]' + isRequired: true + isModifiable: false +- svcOperationCfsParamId: 1102 + svcOperationCfsParam: backupConfiguration + dataType: map-fixed + isRequired: true + defaultValue: '' + isModifiable: true + dataDescriptor: + s3Uid: + dataType: uuid + defaultValue: '' + isRequired: true + isModifiable: false + retain: + dataType: integer > 0 + defaultValue: '7' + isRequired: true + isModifiable: false + schedule: + dataType: string + defaultValue: 0 0 * * * + isRequired: true + isModifiable: false +- svcOperationCfsParamId: 1116 + svcOperationCfsParam: mongoConfiguration + dataType: map-fixed + isRequired: true + defaultValue: '' + isModifiable: false + dataDescriptor: + tls: + dataType: boolean + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - 'true' + - 'false' +- svcOperationCfsParamId: 1109 + svcOperationCfsParam: backupName + dataType: string + isRequired: true + defaultValue: '' + isModifiable: false - svcOperationCfsParamId: 635 svcOperationCfsParam: username dataType: string @@ -157,12 +245,28 @@ cfsParams: defaultValue: '' isModifiable: false valueList: - - dbOwner - read - readWrite + - dbAdmin + - dbOwner +- svcOperationCfsParamId: 1103 + svcOperationCfsParam: deleteS3Bucket + dataType: boolean + isRequired: true + defaultValue: 'true' + isModifiable: true + valueList: + - 'false' + - 'true' +- svcOperationCfsParamId: 1111 + svcOperationCfsParam: backupName + dataType: array + isRequired: true + defaultValue: '' + isModifiable: true - svcOperationCfsParamId: 644 svcOperationCfsParam: username - dataType: string + dataType: array isRequired: true defaultValue: '' isModifiable: true @@ -173,11 +277,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - disk: - dataType: integer > 0 - defaultValue: '' - isRequired: true - isModifiable: false cpu: dataType: integer > 0 defaultValue: '' @@ -198,6 +297,11 @@ cfsParams: - '3' - '5' - '7' + disk: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 1093 svcOperationCfsParam: accessConfiguration dataType: map-fixed @@ -215,6 +319,23 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false +- svcOperationCfsParamId: 1104 + svcOperationCfsParam: backupConfiguration + dataType: map-fixed + isRequired: true + defaultValue: '' + isModifiable: true + dataDescriptor: + retain: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false + schedule: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 640 svcOperationCfsParam: username dataType: string @@ -234,32 +355,51 @@ cfsParams: defaultValue: '' isModifiable: true valueList: - - dbOwner - read - readWrite + - dbAdmin + - dbOwner +- svcOperationCfsParamId: 1108 + svcOperationCfsParam: backupName + dataType: string + isRequired: true + defaultValue: '' + isModifiable: true cfsParamsByOp: 37: - 1089 - 1090 - 1091 + - 1102 + - 1116 + 411: + - 1109 198: - 635 - 636 - 643 - 190: [] + 190: + - 1103 + 414: + - 1111 199: - 644 201: - 1092 - 1093 + - 1104 200: - 640 - 641 - 642 409: [] 196: [] + 413: + - 1108 194: [] stateParams: startupConfiguration: '{"resourceRealm": ""}' - clusterConfiguration: '{"replicas": 1, "disk": 5, "cpu": 1000, "memory": 1024}' - accessConfiguration: '{"masterAccessList": "[]", "masterIpSpace": ""}' + clusterConfiguration: '{"cpu": 1000, "memory": 1024, "replicas": 1, "disk": 5}' + accessConfiguration: '{"masterIpSpace": "", "masterAccessList": "[]"}' + backupConfiguration: '{"s3Uid": "", "retain": 7, "schedule": "0 0 * * *"}' + mongoConfiguration: '{"tls": false}' diff --git a/site/services/dev/93_rabbitmq.yaml b/site/services/dev/93_rabbitmq.yaml index 915b166..7b92d13 100644 --- a/site/services/dev/93_rabbitmq.yaml +++ b/site/services/dev/93_rabbitmq.yaml @@ -76,6 +76,7 @@ cfsParams: isRequired: true isModifiable: false valueList: + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - svcOperationCfsParamId: 1098 @@ -127,6 +128,18 @@ cfsParams: defaultValue: '[]' isRequired: true isModifiable: false +- svcOperationCfsParamId: 1113 + svcOperationCfsParam: mqConfiguration + dataType: map-fixed + isRequired: true + defaultValue: '' + isModifiable: true + dataDescriptor: + maxMessageSize: + dataType: integer > 0 + defaultValue: '4' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 1100 svcOperationCfsParam: clusterConfiguration dataType: map-fixed @@ -134,11 +147,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - disk: - dataType: integer > 0 - defaultValue: '' - isRequired: true - isModifiable: false cpu: dataType: integer > 0 defaultValue: '' @@ -159,6 +167,11 @@ cfsParams: - '3' - '5' - '7' + disk: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 1101 svcOperationCfsParam: accessConfiguration dataType: map-fixed @@ -176,15 +189,29 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false +- svcOperationCfsParamId: 1114 + svcOperationCfsParam: mqConfiguration + dataType: map-fixed + isRequired: true + defaultValue: '' + isModifiable: true + dataDescriptor: + maxMessageSize: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false cfsParamsByOp: 38: - 1097 - 1098 - 1099 + - 1113 39: [] 106: - 1100 - 1101 + - 1114 410: [] 117: [] 116: [] @@ -192,3 +219,4 @@ stateParams: startupConfiguration: '{"resourceRealm": ""}' clusterConfiguration: '{"cpu": 1000, "memory": 1024, "replicas": 1, "disk": 5}' accessConfiguration: '{"masterIpSpace": "", "masterAccessList": "[]"}' + mqConfiguration: '{"maxMessageSize": 4}' diff --git a/site/services/dev/94_lucee.yaml b/site/services/dev/94_lucee.yaml index db6768a..5a178ec 100644 --- a/site/services/dev/94_lucee.yaml +++ b/site/services/dev/94_lucee.yaml @@ -53,6 +53,7 @@ cfsParams: isRequired: true isModifiable: false valueList: + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - svcOperationCfsParamId: 1020 @@ -91,7 +92,7 @@ cfsParams: dataDescriptor: domain: dataType: string - defaultValue: lucee-pzpvwkuk + defaultValue: lucee-bpp5vpr5 isRequired: true isModifiable: false - svcOperationCfsParamId: 1022 @@ -101,11 +102,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - healthPath: - dataType: string - defaultValue: '' - isRequired: false - isModifiable: false version: dataType: string defaultValue: '6.0' @@ -119,6 +115,11 @@ cfsParams: defaultValue: https://github.com/xahys/testlucee isRequired: true isModifiable: false + healthPath: + dataType: string + defaultValue: '' + isRequired: false + isModifiable: false - svcOperationCfsParamId: 1023 svcOperationCfsParam: jsonEnv dataType: map @@ -159,6 +160,14 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: + version: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - '6.0' + - '5.4' gitPath: dataType: string defaultValue: '' @@ -169,14 +178,6 @@ cfsParams: defaultValue: '' isRequired: false isModifiable: false - version: - dataType: string - defaultValue: '' - isRequired: true - isModifiable: false - valueList: - - '6.0' - - '5.4' - svcOperationCfsParamId: 1026 svcOperationCfsParam: jsonEnv dataType: map @@ -196,6 +197,7 @@ cfsParams: isRequired: true isModifiable: false valueList: + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru cfsParamsByOp: @@ -219,6 +221,6 @@ cfsParamsByOp: stateParams: startupConfiguration: '{"resourceRealm": ""}' clusterConfiguration: '{"cpu": 200, "memory": 256, "replicas": 1}' - accessConfiguration: '{"domain": "lucee-pzpvwkuk"}' - appConfiguration: '{"healthPath": "", "version": "6.0", "gitPath": "https://github.com/xahys/testlucee"}' + accessConfiguration: '{"domain": "lucee-bpp5vpr5"}' + appConfiguration: '{"version": "6.0", "gitPath": "https://github.com/xahys/testlucee", "healthPath": ""}' jsonEnv: '{}' diff --git a/site/services/dev/95_nodejs.yaml b/site/services/dev/95_nodejs.yaml index a351726..6ad7491 100644 --- a/site/services/dev/95_nodejs.yaml +++ b/site/services/dev/95_nodejs.yaml @@ -51,6 +51,7 @@ cfsParams: isRequired: true isModifiable: false valueList: + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - svcOperationCfsParamId: 1029 @@ -89,7 +90,7 @@ cfsParams: dataDescriptor: domain: dataType: string - defaultValue: node-ctkmt4iw + defaultValue: node-zjkc4kir isRequired: true isModifiable: false - svcOperationCfsParamId: 1031 @@ -125,6 +126,12 @@ cfsParams: isRequired: false defaultValue: '{}' isModifiable: true + dataDescriptor: + DB_PASS: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 1033 svcOperationCfsParam: clusterConfiguration dataType: map-fixed @@ -198,6 +205,7 @@ cfsParams: isRequired: true isModifiable: false valueList: + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru cfsParamsByOp: @@ -220,6 +228,6 @@ cfsParamsByOp: stateParams: startupConfiguration: '{"resourceRealm": ""}' clusterConfiguration: '{"cpu": 200, "memory": 256, "replicas": 1}' - accessConfiguration: '{"domain": "node-ctkmt4iw"}' + accessConfiguration: '{"domain": "node-zjkc4kir"}' appConfiguration: '{"version": "23", "gitPath": "https://github.com/xahys/testnode.git", "healthPath": "1"}' - jsonEnv: '{}' + jsonEnv: '{"DB_PASS": ""}' diff --git a/site/services/dev/96_pgadmin.yaml b/site/services/dev/96_pgadmin.yaml index 7c09014..e1db420 100644 --- a/site/services/dev/96_pgadmin.yaml +++ b/site/services/dev/96_pgadmin.yaml @@ -64,6 +64,7 @@ cfsParams: defaultValue: '' isModifiable: false valueList: + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - svcOperationCfsParamId: 170 @@ -103,6 +104,7 @@ cfsParams: defaultValue: '' isModifiable: true valueList: + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru cfsParamsByOp: diff --git a/site/services/dev/97_nodered.yaml b/site/services/dev/97_nodered.yaml new file mode 100644 index 0000000..ffa3eb3 --- /dev/null +++ b/site/services/dev/97_nodered.yaml @@ -0,0 +1,74 @@ +name: nodered +service_id: 97 +service_display_name: NodeRed +service_short_name: nodered +lifecycle: + suspendOnDestroyDefault: false + adoptExistingOnCreateDefault: false +operations: +- svcOperationId: 72 + operation: create + kind: instance + action: create +- svcOperationId: 73 + operation: delete + kind: instance + action: delete +stateOut: {} +cfsParams: +- svcOperationCfsParamId: 193 + svcOperationCfsParam: resourceCPU + dataType: integer > 0 + isRequired: true + defaultValue: '500' + isModifiable: false +- svcOperationCfsParamId: 194 + svcOperationCfsParam: resourceMemory + dataType: integer > 0 + isRequired: true + defaultValue: '512' + isModifiable: false +- svcOperationCfsParamId: 195 + svcOperationCfsParam: resourceDisk + dataType: integer > 0 + isRequired: true + defaultValue: '1' + isModifiable: false +- svcOperationCfsParamId: 196 + svcOperationCfsParam: resourceRealm + dataType: string + isRequired: true + defaultValue: '' + isModifiable: false + valueList: + - devclustername + - k8s-3-sandbox-nubes-ru + - k8s-4-sandbox-nubes-ru +- svcOperationCfsParamId: 197 + svcOperationCfsParam: domain + dataType: string + isRequired: true + defaultValue: nodered-1 + isModifiable: false +- svcOperationCfsParamId: 323 + svcOperationCfsParam: resourceInstances + dataType: integer > 0 + isRequired: true + defaultValue: '1' + isModifiable: false +cfsParamsByOp: + 72: + - 193 + - 194 + - 195 + - 196 + - 197 + - 323 + 73: [] +stateParams: + resourceCPU: '500' + resourceMemory: '512' + resourceDisk: '1' + resourceRealm: '' + domain: nodered-1 + resourceInstances: '1' diff --git a/site/services/dev/98_http.yaml b/site/services/dev/98_http.yaml index fa6348b..c69dffb 100644 --- a/site/services/dev/98_http.yaml +++ b/site/services/dev/98_http.yaml @@ -67,6 +67,7 @@ cfsParams: defaultValue: '' isModifiable: false valueList: + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - svcOperationCfsParamId: 217 @@ -74,19 +75,19 @@ cfsParams: dataType: string isRequired: true defaultValue: nexus-sa.tst.nubes.ru/docker-nubes/jolt - isModifiable: false + isModifiable: true - svcOperationCfsParamId: 241 svcOperationCfsParam: jsonEnv dataType: map isRequired: false defaultValue: '' - isModifiable: false + isModifiable: true - svcOperationCfsParamId: 782 svcOperationCfsParam: ingressAnnotations dataType: map isRequired: false defaultValue: '{}' - isModifiable: false + isModifiable: true - svcOperationCfsParamId: 218 svcOperationCfsParam: resourceCPU dataType: integer > 0 @@ -105,6 +106,24 @@ cfsParams: isRequired: true defaultValue: '' isModifiable: true +- svcOperationCfsParamId: 1120 + svcOperationCfsParam: registryPath + dataType: string + isRequired: true + defaultValue: '' + isModifiable: true +- svcOperationCfsParamId: 1121 + svcOperationCfsParam: jsonEnv + dataType: map + isRequired: false + defaultValue: '' + isModifiable: true +- svcOperationCfsParamId: 1122 + svcOperationCfsParam: ingressAnnotations + dataType: map + isRequired: false + defaultValue: '' + isModifiable: true - svcOperationCfsParamId: 272 svcOperationCfsParam: resourceRealm dataType: string @@ -112,6 +131,7 @@ cfsParams: defaultValue: '' isModifiable: true valueList: + - devclustername - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru cfsParamsByOp: @@ -129,6 +149,9 @@ cfsParamsByOp: - 218 - 219 - 220 + - 1120 + - 1121 + - 1122 403: [] 79: - 272 diff --git a/site/services/dev/99_gitea.yaml b/site/services/dev/99_gitea.yaml index 82f15db..35c8be4 100644 --- a/site/services/dev/99_gitea.yaml +++ b/site/services/dev/99_gitea.yaml @@ -97,6 +97,12 @@ cfsParams: isRequired: false defaultValue: '' isModifiable: true +- svcOperationCfsParamId: 1124 + svcOperationCfsParam: iniServiceParams + dataType: map + isRequired: false + defaultValue: DISABLE_REGISTRATION:true + isModifiable: false - svcOperationCfsParamId: 259 svcOperationCfsParam: resourceCPU dataType: integer > 0 @@ -143,6 +149,7 @@ cfsParamsByOp: - 238 - 818 - 821 + - 1124 83: [] 91: - 259 @@ -162,3 +169,4 @@ stateParams: psqlUid: '' ingressExtraAnnotations: '' iniServerParams: '' + iniServiceParams: DISABLE_REGISTRATION:true diff --git a/site/services/prod/109_zones_v2.yaml b/site/services/prod/109_zones_v2.yaml index 27b061a..57dab11 100644 --- a/site/services/prod/109_zones_v2.yaml +++ b/site/services/prod/109_zones_v2.yaml @@ -127,10 +127,16 @@ cfsParams: - SSHFP - svcOperationCfsParamId: 780 svcOperationCfsParam: recordInput - dataType: string + dataType: array-map-fixed isRequired: true - defaultValue: '' + defaultValue: '[{}]' isModifiable: false + dataDescriptor: + record: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 781 svcOperationCfsParam: recordName dataType: string @@ -160,12 +166,12 @@ cfsParams: - NS - SSHFP - CAA - recordInput: + recordName: dataType: string defaultValue: '' isRequired: true isModifiable: false - recordName: + recordInput: dataType: string defaultValue: '' isRequired: true @@ -205,10 +211,16 @@ cfsParams: - SSHFP - svcOperationCfsParamId: 786 svcOperationCfsParam: recordInput - dataType: string + dataType: array-map-fixed isRequired: true - defaultValue: '' + defaultValue: '[{}]' isModifiable: true + dataDescriptor: + record: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false cfsParamsByOp: 254: - 761 diff --git a/site/services/prod/115_mariadb.yaml b/site/services/prod/115_mariadb.yaml index 16509f2..46ade0f 100644 --- a/site/services/prod/115_mariadb.yaml +++ b/site/services/prod/115_mariadb.yaml @@ -2,7 +2,54 @@ name: mariadb service_id: 115 service_display_name: Mariadb service_short_name: mariadb -service_man: 'Mariadb кластер. Ресурсная платформа: k8s. Автоматизация: k8s operator.
Автоматическое резервное копирование, ручное восстановление.' +service_man: '# Инструкция по развертыванию MariaDB через платформу

## 1. Общая информация

MariaDB — реляционная база данных, совместимая с MySQL. Разворачивается через `mariadb-operator` + в Kubernetes.

### Доступные операции с кластером

* **create** — создание кластера
* **delete** — удаление кластера
* **suspend** — остановка кластера (под реально останавливается, + ресурсы не потребляются)
* **resume** — запуск ранее остановленного кластера
* **modify** — изменение параметров кластера
* **reconcile** — синхронизация состояния инстанса с платформой

### + Доступные операции с базами данных

* **create_database** — создание базы данных
* **delete_database** — удаление базы данных

### Доступные операции с пользователями

* **create_user** + — создание пользователя
* **delete_user** — удаление пользователя

---

## 2. Параметры создания кластера

### Платформа для развертывания (`startupConfiguration.resourceRealm`)

Среда, + в которой будет развёрнут кластер.

### Конфигурация ресурсов (`clusterConfiguration`)

JSON-объект:
* `cpu` — квота CPU пода в миликорах (1000 = 1 vCPU). Пример: `500`
* `memory` + — квота памяти пода в мегабайтах. Пример: `512`
* `disk` — размер диска в гигабайтах. Пример: `10`
* `replicas` — количество реплик. Сервис работает в режиме одного primary-узла (Galera выключена), + значение `0` эквивалентно остановке кластера.

### Версия MariaDB (`mariadbConfiguration.version`)

Поддерживаются только две версии: `8.4.0` и `9.4.0`.

### Внешний доступ (`accessConfiguration`)

JSON-объект:
* + `masterIpSpace` — имя ipSpace для выделения внешнего IP. Укажите `no-needed`, если внешний адрес не требуется.
* `masterAccessList` — список IP/подсетей, которым разрешён доступ к порту 3306 снаружи. + Пустой список — доступ не ограничен на уровне firewall (в рамках выделенного ipSpace).

### Резервное копирование (`backupConfiguration`)

JSON-объект:
* `s3Uid` — идентификатор S3-пользователя/квоты + для бэкапов.
* `schedule` — cron-выражение расписания бэкапов. По умолчанию `0 0 * * *` (раз в сутки в полночь).
* `retain` — время хранения бэкапов **в часах** (не в днях!). По умолчанию `7` + — то есть 7 часов. При суточном расписании этого значения обычно недостаточно, чтобы между двумя бэкапами всегда оставалась хотя бы одна валидная копия — рекомендуется указывать `retain` явно, с запасом + (например `720` = 30 суток).

> **Важно:** расписание и срок хранения бэкапов задаются **только при создании кластера**. Оператор MariaDB не позволяет изменить cron-расписание бэкапа после создания + (поле `spec.schedule.cron` неизменяемо на уровне admission-вебхука самого оператора) — поэтому эти параметры недоступны для изменения через `modify`.

> **Восстановление из бэкапа пока не реализовано + как самостоятельная операция платформы.** Бэкапы физически хранятся в S3-бакете инстанса (`technicals3backup-`, префикс `mariadb/backups/`). Если нужно восстановить данные из бэкапа — бэкап + нужно **скачать из S3 и применить к базе вручную** (например через `mariabackup`/`mariadb-backup` restore или соответствующий инструмент).

### Автомасштабирование диска (`autoscaleConfiguration`)

JSON-объект:
* + `enabled` — включить автоматическое расширение диска при исчерпании места.
* `quota` — максимальный размер диска, до которого разрешено автоматическое расширение (не может быть меньше `clusterConfiguration.disk`).
* + `percent`, `schedule` — параметры триггера автомасштабирования.

---

## 3. Параметры модификации кластера

Все параметры модификации, кроме версии, можно как увеличивать, так + и уменьшать (кроме диска — см. ниже) — система подставит текущие сохранённые значения, если их не менять.

### Конфигурация ресурсов (`clusterConfiguration`)

* `cpu`, `memory` — можно + менять в любую сторону.
* `disk` — можно **только увеличивать**, уменьшение уже выделенного размера не поддерживается.
* `replicas` — `0` останавливает кластер тем же образом, что и `suspend` + (альтернативный способ временной остановки через `modify`).

### Версия MariaDB (`mariadbConfiguration.version`)

Можно только повышать версию (`8.4.0 → 9.4.0`). Попытка понизить версию + будет отклонена с явной ошибкой ещё до применения изменений.

### Внешний доступ (`accessConfiguration`)

Можно включить внешний доступ (было `no-needed` → указали реальный `masterIpSpace`), + изменить список разрешённых IP, либо полностью отключить внешний доступ (`masterIpSpace: no-needed`) — в этом случае внешний Service, DNS-запись и правило firewall будут корректно откреплены и удалены.

### + Резервное копирование

Не передаётся при модификации — расписание и срок хранения бэкапов фиксируются на этапе `create` (см. п.2).

---

## 4. Параметры создания базы данных (`create_database`)

### + Имя базы данных (`dbName`)

Строка с именем новой базы. Не может совпадать с зарезервированными системными именами: `mysql`, `sys`, `information_schema`, `performance_schema`. База с таким же + именем не должна уже существовать в кластере.

---

## 5. Параметры удаления базы данных (`delete_database`)

### Имя базы данных (`dbName`)

База должна существовать в + кластере. Удаление будет отклонено, если к базе всё ещё привязаны пользователи — сначала нужно снять доступ (`delete_user`) у всех пользователей, ссылающихся на эту базу.

---

## 6. Параметры + создания пользователя (`create_user`)

### Имя пользователя (`username`)

Не может быть `root`, `healthcheck` или `mariadb.sys` — эти имена зарезервированы платформой/оператором.

### + Пароль (`password`)

Пароль для подключения от имени создаваемого пользователя.

### Базы данных (`dbName`)

JSON-массив вида `[{"dbname": "имя_базы"}]` — список баз, к которым + выдаётся полный доступ (`ALL PRIVILEGES`). Все перечисленные базы должны уже существовать в кластере (создать заранее через `create_database`).

### Разрешённые хосты (`accessHosts`)

MySQL + host-паттерн, с которого разрешено подключение под этим пользователем (например `%` — без ограничений, или конкретная подсеть). Определяет `user@host` в самой MariaDB — если указать слишком узкое значение, + подключение снаружи ожидаемого диапазона будет отклонено сервером на уровне аутентификации, даже если сеть/firewall пропускают трафик.

---

## 7. Параметры удаления пользователя (`delete_user`)

### + Имя пользователя (`username`)

Пользователь должен существовать в кластере. `root`/`healthcheck`/`mariadb.sys` удалить нельзя.

---

## 8. Выходные параметры

### internalConnect

Внутренний + адрес для подключения из сервисов, работающих в том же кластере Kubernetes:
```json
{
"master": {
"dns": "..svc.",
"ip": null,
"port": + 3306
}
}
```

### externalConnect

Присутствует в выходных данных, **только если** был запрошен внешний доступ (`accessConfiguration.masterIpSpace` отличен от `no-needed`). + Если внешний доступ не запрошен или был отключён через `modify` — этого блока не будет вовсе (пустой блок в состояние не пишется):
```json
{
"master": {
"dns": "write..",
"ip": + "<внешний IP>",
"port": 3306
}
}
```

---

## 9. Пример подключения

### 9.1 Изнутри кластера / того же namespace

```bash
mariadb -h + -P 3306 -u -p
```

### 9.2 Через port-forward

```bash
kubectl port-forward svc/ 3306:3306 -n
```

**Важно:** после `port-forward` + подключайтесь именно по `127.0.0.1`, а не `localhost`:

```bash
mariadb -h 127.0.0.1 -P 3306 -u -p
```

Клиент `mysql`/`mariadb` при указании `-h localhost` **игнорирует + TCP/порт** и всегда пытается подключиться через локальный unix-сокет (`/var/lib/mysql/mysql.sock`), которого на вашей машине нет — подключение упадёт с `ERROR 2002 (HY000): Can''t connect to local server + through socket`. `127.0.0.1` форсирует реальное TCP-подключение. Также не забывайте `-P` (порт) с заглавной буквы — строчная `-p` относится к паролю.

### 9.3 Снаружи (внешний адрес)

```bash
mariadb + -h -P 3306 -u -p
```

Доступно только если при создании/модификации был указан реальный `masterIpSpace` и подключающийся IP входит в + `accessConfiguration.masterAccessList` (или список пуст).

Где:
* `` — имя пользователя
* `` — пароль пользователя

---

## 10. Дополнительная информация

* + Расписание бэкапов (`backupConfiguration.schedule`/`retain`) задаётся один раз при создании и не может быть изменено позже — ограничение самого `mariadb-operator`, а не платформы.
* Версию MariaDB + можно только повышать, откат на более старую версию не поддерживается.
* Размер диска можно только увеличивать.
* `suspend` реально останавливает под (масштабирование StatefulSet в 0 реплик), + а не просто помечает кластер как приостановленный — расход ресурсов CPU/RAM/диска (кроме уже занятого диска) прекращается.
* При отключении внешнего доступа через `modify` (`masterIpSpace: no-needed`) + внешний Service, DNS-запись и правило firewall удаляются, а `externalConnect` пропадает из выходных данных.
* Самостоятельного восстановления из бэкапа (операции `restore`) пока нет. Бэкапы лежат + в S3 инстанса — восстановление данных в существующий кластер выполняется вручную, скачиванием и применением бэкапа самим владельцем инстанса.' lifecycle: suspendOnDestroyDefault: true adoptExistingOnCreateDefault: false @@ -101,16 +148,16 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - masterAccessList: - dataType: json - defaultValue: '[]' - isRequired: true - isModifiable: false masterIpSpace: dataType: string defaultValue: '' isRequired: true isModifiable: false + masterAccessList: + dataType: json + defaultValue: '[]' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 880 svcOperationCfsParam: mariadbConfiguration dataType: map-fixed @@ -131,7 +178,7 @@ cfsParams: dataType: map-fixed isRequired: true defaultValue: '' - isModifiable: true + isModifiable: false dataDescriptor: s3Uid: dataType: uuid @@ -155,6 +202,14 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: + enabled: + dataType: boolean + defaultValue: 'false' + isRequired: true + isModifiable: false + valueList: + - 'false' + - 'true' schedule: dataType: integer >= 0 defaultValue: '0' @@ -179,31 +234,23 @@ cfsParams: - '10' - '15' - '20' - enabled: - dataType: boolean - defaultValue: 'false' - isRequired: true - isModifiable: false - valueList: - - 'false' - - 'true' - svcOperationCfsParamId: 734 svcOperationCfsParam: dbName dataType: string isRequired: true - defaultValue: db-utkbjfp1 + defaultValue: db-wpm05duv isModifiable: false - svcOperationCfsParamId: 735 svcOperationCfsParam: username dataType: string isRequired: true - defaultValue: user4qtyx9eo + defaultValue: userhucihd6b isModifiable: false - svcOperationCfsParamId: 736 svcOperationCfsParam: password dataType: string isRequired: true - defaultValue: j84crbfp + defaultValue: oe063z3u isModifiable: false - svcOperationCfsParamId: 737 svcOperationCfsParam: dbName @@ -305,28 +352,6 @@ cfsParams: valueList: - 8.4.0 - 9.4.0 -- svcOperationCfsParamId: 886 - svcOperationCfsParam: backupConfiguration - dataType: map-fixed - isRequired: true - defaultValue: '' - isModifiable: true - dataDescriptor: - s3Uid: - dataType: uuid - defaultValue: '' - isRequired: true - isModifiable: false - retain: - dataType: integer > 0 - defaultValue: '' - isRequired: true - isModifiable: false - schedule: - dataType: string - defaultValue: '' - isRequired: true - isModifiable: false - svcOperationCfsParamId: 887 svcOperationCfsParam: autoscaleConfiguration dataType: map-fixed @@ -391,7 +416,6 @@ cfsParamsByOp: - 883 - 884 - 885 - - 886 - 887 287: [] 141: [] @@ -399,7 +423,7 @@ cfsParamsByOp: stateParams: startupConfiguration: '{"resourceRealm": "k8s-4-ext-nubes-ru"}' clusterConfiguration: '{"cpu": 500, "memory": 512, "replicas": 1, "disk": 10}' - accessConfiguration: '{"masterAccessList": "[]", "masterIpSpace": ""}' + accessConfiguration: '{"masterIpSpace": "", "masterAccessList": "[]"}' mariadbConfiguration: '{"version": "9.4.0"}' backupConfiguration: '{"s3Uid": "", "retain": 720, "schedule": "0 0 * * *"}' - autoscaleConfiguration: '{"schedule": 0, "quota": 100, "percent": 10, "enabled": false}' + autoscaleConfiguration: '{"enabled": false, "schedule": 0, "quota": 100, "percent": 10}' diff --git a/site/services/prod/116_kafka.yaml b/site/services/prod/116_kafka.yaml index b9fe91b..356fd53 100644 --- a/site/services/prod/116_kafka.yaml +++ b/site/services/prod/116_kafka.yaml @@ -2,21 +2,24 @@ name: kafka service_id: 116 service_display_name: ApacheKafka service_short_name: kafka -service_man: '# Инструкция по развертыванию Организация в Cloud Director через платформу

## 1. Общая информация

Сервис **Организация в Cloud Director** предназначен для управления изолированными - организационными единицами (тенантами) внутри инфраструктуры Cloud Director. Он обеспечивает создание, модификацию и администрирование организаций, предоставление им облачных ресурсов, а также контроль - уровня доступа. Сервис используется для организации рабочих окружений потребителей, управления жизненным циклом организаций и их сетевой инфраструктурой.

### Доступные операции

**create** - — Создание новой организации с заданными характеристиками и типом доступа.
**delete** — Удаление организации после перехода в состояние suspend; приводит к удалению всех связанных сущностей.
**modify** - — Изменение параметров внутри организации (на текущий момент поддерживается изменение ipSpaces).
**suspend** — Заморозка организации, ограничение возможности изменения и добавления сущностей.
**resume** - — Разморозка организации, восстановление функций управления.

---

## 2. Параметры развертывания

Параметры входных данных операции **create**:

### Платформа для развертывания
Описание: - платформа, на которой будет создана организация.
Пример значения: `ngcloud.ru`.

### Тип организации
Описание: тип создаваемой организации.
Варианты:
- `iaas` — организация с прямым - доступом к облаку и авторизацией через Keycloak.
- `saas` — организация под управлением Nubes, без прямого доступа к облаку.

---

## 3. Рекомендованные характеристики

### - Тестовое окружение
- Тип организации: `iaas` для обеспечения полного доступа к облачным ресурсам и самостоятельного управления.

### Промышленное окружение
- Тип организации: `saas` (упрощённая - модель использования).

---

## 4. Выходные параметры

Услуга предоставляет следующие выходные параметры (формируются в процессе операций):

### Идентификатор организации
Уникальный - идентификатор созданной организации. Используется для всех дальнейших API-операций.

### Статус организации
Отражает текущее состояние: active, suspended, modifying, deleting.

### - Параметры сети
Выходные данные при наличии ipSpaces: список выделенных внешних IP, имя ip_space, количество IP.

---

## 5. Дополнительная информация

- Для конфигурации внешних - IP внутри организации необходимо предварительно создать:
-- хотя бы один **Виртуальный датацентр (VDC)**;
-- хотя бы один **Сетевой шлюз периметра (Edge Gateway)**, привязанный к этой организации.
- - Удаление организации возможно только через 14 дней после перевода в состояние suspend.
- Удаление организации приводит к удалению всех связанных сущностей: VDC, Edge Gateway, пулов IP, сетей, ВМок - и иных объектов.
- Операция suspend не останавливает виртуальные машины, но блокирует любые изменения инфраструктуры внутри организации.
- Для iaas-организаций доступ осуществляется через Keycloak.

' +service_man: "# Инструкция по развертыванию Apache Kafka через платформу

---
## 1. Общая информация
Брокер сообщений Apache Kafka — это отказоустойчивая распределённая платформа для обмена\ + \ сообщениями и потоковой обработки данных в реальном времени.
Позволяет надёжно передавать события между сервисами и системами, интегрироваться с внешними решениями и использовать как внутренние,\ + \ так и защищённые TLS-подключения. Развёртывание полностью автоматизировано платформой.

## Доступные операции
- **create** — Создание кластера
- **delete** — Удаление кластера
-\ + \ **suspend** — Остановка кластера
- **resume** — Запуск кластера

- **create_topic** — Создание топика
- **modify_topic** — Модификация топика
- **delete_topic** — Удаление\ + \ топика

- **create_user** — Создание пользователя
- **modify_user** — Модификация пользователя
- **delete_user** — Удаление пользователя


---
## 2. Параметры\ + \ развертывания кластера
Ниже перечислены параметры, которые необходимо указать при создании ресурса Kafka:

* **Платформа для развертывания:**
Платформа для развертывания (среда, в\ + \ которой будет развернут кластер). Пример: `\tk8s-3.ext.nubes.ru`.

* **Количество узлов в сети:**
Количество узлов (брокеров) в кластере Kafka

* **Квота (megabyte) памяти пода:**
\ + \ Квота памяти пода в мегабайтах. Пример: `2048`

* **Квота (millicore ) ядра пода:**
Квота CPU пода в миликорах (1000 mCPU = 1 vCPU). Пример: `1000`

* **Размер (gigabyte) диска\ + \ для базы данных:**
Размер диска для хранения данных в гигабайтах. Пример: `20`

* **Выделяет внешний IP для доступа к master:**
Флаг, определяющий, нужно ли выделять внешний IP для\ + \ доступа к master-брокеру. Пример: `true` или `false`

* **Имя ipSpace для публикации внешнего IP**
Если включен предыдущий параметр, то поле необходимо заполнить. Пример: `internet-no-antiddos-v1`

---
##\ + \ 4. Выходные параметры
После успешного развертывания ресурса Kafka платформа возвращает ряд параметров.
Ключевыми из них являются:

**internalConnect** (выдаётся только при работе кластера\ + \ по внутренним адресам)
Внутренние эндпоинты для подключения из сервисов, развёрнутых внутри того же Kubernetes-кластера.
```yaml
internalConnect:
bootstrap:
fqdn: \"-kafka-tls-bootstrap..svc.\"\ +
port: 9093
brokers:
broker-1:
fqdn: \"--pool-0.-kafka-brokers..svc.\"
port: 9093
```

**externalConnect**\ + \ (выдаётся только при выделении внешнего IP)
Внешние эндпоинты, зарегистрированные в DNS.
```yaml
externalConnect:
bootstrap:
fqdn: \"bootstrap..\"
\ + \ port: 9093
brokers:
broker-1:
fqdn: \"broker-1..\"
port: 9093
```

Заполняется **только один** из параметров:
- при внешней аллокации\ + \ (`loadbalancer`) — `externalConnect`, `internalConnect` остаётся пустым;
- при внутреннем режиме — `internalConnect`, `externalConnect` остаётся пустым.

Для подключения используются следующие\ + \ порты:

* 9092 — внутренний нешифрованный доступ (plain).
* 9093 — внутренний и внешний доступ по TLS, с обязательной TLS-аутентификацией.

---
## 5. Дополнительная информация
Для\ + \ создания топиков, пользователей и управления ими, а также для интеграции с кластерами Kafka используйте соответствующие сервисы и раздел \"Облачные сервисы\".
---" lifecycle: suspendOnDestroyDefault: true adoptExistingOnCreateDefault: false @@ -209,17 +212,17 @@ cfsParams: dataDescriptor: cpu: dataType: integer > 0 - defaultValue: '' + defaultValue: '2000' isRequired: true isModifiable: false memory: dataType: integer > 0 - defaultValue: '' + defaultValue: '2048' isRequired: true isModifiable: false replicas: dataType: integer > 0 - defaultValue: '' + defaultValue: '1' isRequired: true isModifiable: false valueList: @@ -229,7 +232,7 @@ cfsParams: - '7' disk: dataType: integer > 0 - defaultValue: '' + defaultValue: '1' isRequired: true isModifiable: false - svcOperationCfsParamId: 1088 diff --git a/site/services/prod/120_clickhouse.yaml b/site/services/prod/120_clickhouse.yaml index e55fd4e..9fc700f 100644 --- a/site/services/prod/120_clickhouse.yaml +++ b/site/services/prod/120_clickhouse.yaml @@ -93,20 +93,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - shards: - dataType: integer > 0 - defaultValue: '1' - isRequired: true - isModifiable: false - valueList: - - '1' - - '2' - - '3' - disk: - dataType: integer > 0 - defaultValue: '10' - isRequired: true - isModifiable: false cpu: dataType: integer > 0 defaultValue: '1000' @@ -127,6 +113,20 @@ cfsParams: - '3' - '5' - '7' + disk: + dataType: integer > 0 + defaultValue: '10' + isRequired: true + isModifiable: false + shards: + dataType: integer > 0 + defaultValue: '1' + isRequired: true + isModifiable: false + valueList: + - '1' + - '2' + - '3' - svcOperationCfsParamId: 839 svcOperationCfsParam: accessConfiguration dataType: map-fixed @@ -134,16 +134,16 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - masterAccessList: - dataType: json - defaultValue: '[]' - isRequired: true - isModifiable: false masterIpSpace: dataType: string defaultValue: '' isRequired: true isModifiable: false + masterAccessList: + dataType: json + defaultValue: '[]' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 840 svcOperationCfsParam: clickhouseKeeperConfiguration dataType: map-fixed @@ -213,20 +213,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - quota: - dataType: integer > 0 - defaultValue: '100' - isRequired: true - isModifiable: false - percent: - dataType: integer > 0 - defaultValue: '10' - isRequired: true - isModifiable: false - valueList: - - '10' - - '15' - - '20' enabled: dataType: boolean defaultValue: 'false' @@ -245,6 +231,20 @@ cfsParams: - '5' - '12' - '23' + quota: + dataType: integer > 0 + defaultValue: '100' + isRequired: true + isModifiable: false + percent: + dataType: integer > 0 + defaultValue: '10' + isRequired: true + isModifiable: false + valueList: + - '10' + - '15' + - '20' - svcOperationCfsParamId: 851 svcOperationCfsParam: clickhouseFilesConfiguration dataType: array-map-fixed @@ -311,6 +311,16 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: + cpu: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false + memory: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false replicas: dataType: integer > 0 defaultValue: '' @@ -335,16 +345,6 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false - cpu: - dataType: integer > 0 - defaultValue: '' - isRequired: true - isModifiable: false - memory: - dataType: integer > 0 - defaultValue: '' - isRequired: true - isModifiable: false - svcOperationCfsParamId: 845 svcOperationCfsParam: clickhouseKeeperConfiguration dataType: map-fixed @@ -431,15 +431,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - percent: - dataType: integer > 0 - defaultValue: '' - isRequired: true - isModifiable: false - valueList: - - '10' - - '15' - - '20' enabled: dataType: boolean defaultValue: false,true @@ -460,6 +451,15 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false + percent: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - '10' + - '15' + - '20' - svcOperationCfsParamId: 850 svcOperationCfsParam: clickhouseFilesConfiguration dataType: array-map-fixed @@ -511,10 +511,10 @@ cfsParamsByOp: 182: [] stateParams: startupConfiguration: '{"resourceRealm": "k8s-4-ext-nubes-ru"}' - clusterConfiguration: '{"shards": 1, "disk": 10, "cpu": 1000, "memory": 2048, "replicas": 1}' - accessConfiguration: '{"masterAccessList": "[]", "masterIpSpace": ""}' + clusterConfiguration: '{"cpu": 1000, "memory": 2048, "replicas": 1, "disk": 10, "shards": 1}' + accessConfiguration: '{"masterIpSpace": "", "masterAccessList": "[]"}' clickhouseKeeperConfiguration: '{"cpu": 500, "memory": 512, "replicas": 0}' clickhouseConfiguration: '{"version": "25.10"}' backupConfiguration: '{"s3Uid": "", "retain": 7, "schedule": "0 0 * * *"}' - autoscaleConfiguration: '{"quota": 100, "percent": 10, "enabled": false, "schedule": 0}' + autoscaleConfiguration: '{"enabled": false, "schedule": 0, "quota": 100, "percent": 10}' clickhouseFilesConfiguration: '{"path": "something.xml", "xmlConfig": ""}' diff --git a/site/services/prod/148_vc_mgmt_sthutrval_cluster.yaml b/site/services/prod/148_vc_mgmt_sthutrval_cluster.yaml index 62d0228..8e463bc 100644 --- a/site/services/prod/148_vc_mgmt_sthutrval_cluster.yaml +++ b/site/services/prod/148_vc_mgmt_sthutrval_cluster.yaml @@ -19,6 +19,11 @@ cfsParams: defaultValue: '' isModifiable: false dataDescriptor: + clusterName: + dataType: string + defaultValue: k8s-8bpzagxw + isRequired: true + isModifiable: false resourceRealm: dataType: string defaultValue: ngcloud.ru @@ -26,9 +31,14 @@ cfsParams: isModifiable: false valueList: - ngcloud.ru - clusterName: + providerVdc: dataType: string - defaultValue: example-cgvxzckk + defaultValue: '' + isRequired: true + isModifiable: false + networkProvider: + dataType: string + defaultValue: '' isRequired: true isModifiable: false - svcOperationCfsParamId: 772 @@ -40,10 +50,11 @@ cfsParams: dataDescriptor: appVersion: dataType: string - defaultValue: 2.13.1 + defaultValue: 2.14.0 isRequired: true isModifiable: false valueList: + - 2.14.0 - 2.13.1 - 2.12.1 - 2.11.0 @@ -54,15 +65,6 @@ cfsParams: defaultValue: '' isModifiable: false dataDescriptor: - count: - dataType: integer > 0 - defaultValue: '1' - isRequired: true - isModifiable: false - valueList: - - '1' - - '3' - - '5' sizingPolicy: dataType: string defaultValue: '' @@ -75,6 +77,15 @@ cfsParams: defaultValue: '50' isRequired: true isModifiable: false + count: + dataType: integer > 0 + defaultValue: '1' + isRequired: true + isModifiable: false + valueList: + - '1' + - '3' + - '5' - svcOperationCfsParamId: 774 svcOperationCfsParam: workerConfiguration dataType: array-map-fixed @@ -82,6 +93,18 @@ cfsParams: defaultValue: '[{}]' isModifiable: false dataDescriptor: + groupName: + dataType: string + defaultValue: workers-wngkcnbs + isRequired: true + isModifiable: false + sizingPolicy: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - '{}' sizingDisk: dataType: integer > 0 defaultValue: '50' @@ -92,18 +115,32 @@ cfsParams: defaultValue: '2' isRequired: true isModifiable: false - groupName: - dataType: string - defaultValue: workers-wqtdfsen - isRequired: true - isModifiable: false - sizingPolicy: - dataType: string - defaultValue: '' + autoscale: + dataType: boolean + defaultValue: 'false' isRequired: true isModifiable: false valueList: - - '{}' + - 'false' + - 'true' + autoscaleMin: + dataType: integer > 0 + defaultValue: '2' + isRequired: true + isModifiable: false + autoscaleMax: + dataType: integer > 0 + defaultValue: '3' + isRequired: true + isModifiable: false + labelDeck: + dataType: boolean + defaultValue: 'true' + isRequired: true + isModifiable: false + valueList: + - 'true' + - 'false' - svcOperationCfsParamId: 775 svcOperationCfsParam: accessConfiguration dataType: map-fixed @@ -111,11 +148,6 @@ cfsParams: defaultValue: '' isModifiable: false dataDescriptor: - accessIpListIngress: - dataType: json - defaultValue: '[]' - isRequired: true - isModifiable: false needExternalAddressAPI: dataType: boolean defaultValue: 'true' @@ -135,6 +167,11 @@ cfsParams: isModifiable: false valueList: - 'true' + accessIpListIngress: + dataType: json + defaultValue: '[]' + isRequired: true + isModifiable: false cfsParamsByOp: 258: - 771 @@ -143,8 +180,8 @@ cfsParamsByOp: - 774 - 775 stateParams: - startupConfiguration: '{"resourceRealm": "ngcloud.ru", "clusterName": "example-cgvxzckk"}' - clusterConfiguration: '{"appVersion": "2.13.1"}' - controlPlaneConfiguration: '{"count": 1, "sizingPolicy": "", "sizingDisk": 50}' - workerConfiguration: '{"sizingDisk": 50, "count": 2, "groupName": "workers-wqtdfsen", "sizingPolicy": ""}' - accessConfiguration: '{"accessIpListIngress": "[]", "needExternalAddressAPI": true, "accessIpListAPI": "[]", "needExternalAddressIngress": true}' + startupConfiguration: '{"clusterName": "k8s-8bpzagxw", "resourceRealm": "ngcloud.ru", "providerVdc": "", "networkProvider": ""}' + clusterConfiguration: '{"appVersion": "2.14.0"}' + controlPlaneConfiguration: '{"sizingPolicy": "", "sizingDisk": 50, "count": 1}' + workerConfiguration: '{"groupName": "workers-wngkcnbs", "sizingPolicy": "", "sizingDisk": 50, "count": 2, "autoscale": false, "autoscaleMin": 2, "autoscaleMax": 3, "labelDeck": true}' + accessConfiguration: '{"needExternalAddressAPI": true, "accessIpListAPI": "[]", "needExternalAddressIngress": true, "accessIpListIngress": "[]"}' diff --git a/site/services/prod/149_valo_tenant.yaml b/site/services/prod/149_valo_tenant.yaml index 07be7b9..cba804b 100644 --- a/site/services/prod/149_valo_tenant.yaml +++ b/site/services/prod/149_valo_tenant.yaml @@ -133,22 +133,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - ffPublicLink: - dataType: boolean - defaultValue: '' - isRequired: true - isModifiable: false - valueList: - - 'false' - - 'true' - ffLogging: - dataType: boolean - defaultValue: 'true' - isRequired: true - isModifiable: false - valueList: - - 'false' - - 'true' userCount: dataType: integer > 0 defaultValue: '' @@ -191,6 +175,22 @@ cfsParams: valueList: - 'false' - 'true' + ffPublicLink: + dataType: boolean + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - 'false' + - 'true' + ffLogging: + dataType: boolean + defaultValue: 'true' + isRequired: true + isModifiable: false + valueList: + - 'false' + - 'true' - svcOperationCfsParamId: 660 svcOperationCfsParam: s3Storage dataType: integer > 0 diff --git a/site/services/prod/150_k8s_sthutrval_cluster.yaml b/site/services/prod/150_k8s_sthutrval_cluster.yaml index 22c0bce..9876afa 100644 --- a/site/services/prod/150_k8s_sthutrval_cluster.yaml +++ b/site/services/prod/150_k8s_sthutrval_cluster.yaml @@ -2,7 +2,17 @@ name: k8s_sthutrval_cluster service_id: 150 service_display_name: Kubernetes кластер Штурвал service_short_name: k8sSthutrvalCluster -service_man: Перед разворачиванием убедиться, что в облаке есть 2 свободных невыделенных IP в пуле +service_man: '# Развёртывание Kubernetes: ограничения и предварительный чек-лист

> **Внимание:** перед началом развёртывания кластера Kubernetes убедитесь, что выполнены все описанные ниже условия. + Несоблюдение порядка шагов может привести к ошибкам при создании кластера.

---

## Ограничения при развёртывании

| Ограничение | Статус |
|---|---|
| 1 кластер = 1 vDC + | Действует (будет исправлено в ближайшее время) |

---

## Предварительный чек-лист

Перед установкой кластера Kubernetes необходимо последовательно выполнить следующие шаги.

### + 1. Создать организацию в Cloud Director

- Перейдите в услугу **Организация в Cloud Director**.
- Создайте организацию.

### 2. Создать виртуальный датацентр (vDC)

- Перейдите + в услугу **Виртуальный датацентр (vDC)**.
- Создайте vDC.
- Выделите **достаточно ресурсов для разворачивания _всех_ нод** кластера.

### 3. Создать Edge (сетевой шлюз периметра)

- + Перейдите в услугу **Сетевой шлюз периметра (Edge)**.
- Создайте Edge.
- Обязательно:
- Включить **ALB**.
- Установить **Кол-во VS на AVI ≥ 3**.

### 4. Добавить внешние адреса + в организации

- Вернитесь в **Организация в Cloud Director**.
- Выполните операцию **Modify**.
- Добавьте **3 внешних адреса**.
- Количество `ipSpaces` значения не имеет, важно чтобы + суммарно было 3 адреса.

### 5. Настроить SNAT для виртуальных машин

- Вернитесь в **Сетевой шлюз периметра (Edge)**.
- Выполните операцию **Modify**.
- Выберите доступный `ipSpaceName`.
- + Это будет **SNAT для виртуальных машин**.

### 6. Развернуть кластер Kubernetes

- Только **после выполнения всех шагов выше** переходите к услуге **Kubernetes кластер Штурвал**.
- + Начните разворачивание кластера.

---

## Минимальные требования к кластеру

| Параметр | Значение |
|---|---|
| Мастер-ноды | минимум **1** |
| Воркер-ноды | минимум + **1** |
| CPU (на ноду) | **4 vCPU** |
| RAM (на ноду) | **8 GB** |
| Диск (на ноду) | **50 GB** |

---' lifecycle: suspendOnDestroyDefault: true adoptExistingOnCreateDefault: false @@ -61,9 +71,65 @@ cfsParams: isModifiable: false clusterName: dataType: string - defaultValue: example-umab2vgx + defaultValue: example-yn5ajpm3 isRequired: true isModifiable: false + exLogging: + dataType: boolean + defaultValue: 'true' + isRequired: false + isModifiable: false + valueList: + - 'true' + - 'false' + exMonitoring: + dataType: boolean + defaultValue: 'true' + isRequired: false + isModifiable: false + valueList: + - 'true' + - 'false' + exLocalCsi: + dataType: boolean + defaultValue: 'true' + isRequired: false + isModifiable: false + valueList: + - 'true' + - 'false' + exVip: + dataType: boolean + defaultValue: 'true' + isRequired: false + isModifiable: false + valueList: + - 'true' + - 'false' + exUpdate: + dataType: boolean + defaultValue: 'true' + isRequired: false + isModifiable: false + valueList: + - 'true' + - 'false' + exIngress: + dataType: boolean + defaultValue: 'true' + isRequired: false + isModifiable: false + valueList: + - 'true' + - 'false' + exNamedCsi: + dataType: boolean + defaultValue: 'true' + isRequired: false + isModifiable: false + valueList: + - 'true' + - 'false' - svcOperationCfsParamId: 751 svcOperationCfsParam: controlPlaneConfiguration dataType: map-fixed @@ -101,7 +167,7 @@ cfsParams: dataDescriptor: groupName: dataType: string - defaultValue: workers-dum0vgn5 + defaultValue: workers-smfsut8s isRequired: true isModifiable: false sizingPolicy: @@ -121,6 +187,32 @@ cfsParams: defaultValue: '2' isRequired: true isModifiable: false + autoscale: + dataType: boolean + defaultValue: 'false' + isRequired: false + isModifiable: false + valueList: + - 'false' + - 'true' + autoscaleMin: + dataType: integer > 0 + defaultValue: '2' + isRequired: false + isModifiable: false + autoscaleMax: + dataType: integer > 0 + defaultValue: '3' + isRequired: false + isModifiable: false + labelDeck: + dataType: boolean + defaultValue: 'true' + isRequired: true + isModifiable: false + valueList: + - 'true' + - 'false' - svcOperationCfsParamId: 753 svcOperationCfsParam: accessConfiguration dataType: map-fixed @@ -128,11 +220,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - accessIpListIngress: - dataType: json - defaultValue: '[]' - isRequired: true - isModifiable: false needExternalAddressAPI: dataType: boolean defaultValue: 'true' @@ -152,6 +239,11 @@ cfsParams: isModifiable: false valueList: - 'true' + accessIpListIngress: + dataType: json + defaultValue: '[]' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 755 svcOperationCfsParam: clusterConfiguration dataType: map-fixed @@ -161,10 +253,11 @@ cfsParams: dataDescriptor: appVersion: dataType: string - defaultValue: 2.13.1 + defaultValue: 2.14.0 isRequired: true isModifiable: false valueList: + - 2.14.0 - 2.13.1 - 2.12.1 - 2.11.0 @@ -205,6 +298,7 @@ cfsParams: isRequired: true isModifiable: false valueList: + - 2.14.0 - 2.13.1 - 2.12.1 - 2.11.0 @@ -243,14 +337,9 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - count: - dataType: integer > 0 - defaultValue: '' - isRequired: true - isModifiable: false groupName: dataType: string - defaultValue: workers-tr9wauz1 + defaultValue: workers-rhkpbeti isRequired: true isModifiable: false sizingPolicy: @@ -265,6 +354,37 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false + count: + dataType: integer >= 0 + defaultValue: '' + isRequired: true + isModifiable: false + autoscale: + dataType: boolean + defaultValue: '' + isRequired: false + isModifiable: false + valueList: + - 'false' + - 'true' + autoscaleMin: + dataType: integer > 0 + defaultValue: '' + isRequired: false + isModifiable: false + autoscaleMax: + dataType: integer > 0 + defaultValue: '' + isRequired: false + isModifiable: false + labelDeck: + dataType: boolean + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - 'true' + - 'false' - svcOperationCfsParamId: 759 svcOperationCfsParam: accessConfiguration dataType: map-fixed @@ -317,8 +437,9 @@ cfsParamsByOp: 174: [] 173: [] stateParams: - startupConfiguration: '{"vdcUid": "", "nsxtUid": "", "clusterName": "example-umab2vgx"}' + startupConfiguration: '{"vdcUid": "", "nsxtUid": "", "clusterName": "example-yn5ajpm3", "exLogging": true, "exMonitoring": true, "exLocalCsi": true, "exVip": true, "exUpdate": true, "exIngress": true, + "exNamedCsi": true}' controlPlaneConfiguration: '{"sizingPolicy": "[]", "sizingDisk": 50, "count": 1}' - workerConfiguration: '{"groupName": "workers-dum0vgn5", "sizingPolicy": "", "sizingDisk": 50, "count": 2}' - accessConfiguration: '{"accessIpListIngress": "[]", "needExternalAddressAPI": true, "accessIpListAPI": "[]", "needExternalAddressIngress": true}' - clusterConfiguration: '{"appVersion": "2.13.1"}' + workerConfiguration: '{"groupName": "workers-smfsut8s", "sizingPolicy": "", "sizingDisk": 50, "count": 2, "autoscale": false, "autoscaleMin": 2, "autoscaleMax": 3, "labelDeck": true}' + accessConfiguration: '{"needExternalAddressAPI": true, "accessIpListAPI": "[]", "needExternalAddressIngress": true, "accessIpListIngress": "[]"}' + clusterConfiguration: '{"appVersion": "2.14.0"}' diff --git a/site/services/prod/151_k8s_openbao.yaml b/site/services/prod/151_k8s_openbao.yaml new file mode 100644 index 0000000..f808a23 --- /dev/null +++ b/site/services/prod/151_k8s_openbao.yaml @@ -0,0 +1,366 @@ +name: k8s_openbao +service_id: 151 +service_display_name: Vault +service_short_name: k8sOpenbao +service_man: '# Инструкция по развертыванию Хранилища секретов через платформу

## 1. Общая информация
Хранилище секретов — сервис централизованного и защищённого хранения чувствительных данных + (секретов, ключей, конфигураций). Предназначен для использования приложениями и сервисами в Kubernetes с управлением доступом на основе ролей.
В качестве приложения используется открытый проект OpenBao + с поддержкой кластерного режима RAFT.

### Доступные операции
**create** — Создание хранилища секретов и инициализация кластера.
**delete** — Удаление хранилища секретов с полной очисткой + всех связанных сущностей.
**modify** — Изменение параметров развернутого хранилища секретов.
**suspend** — Приостановка работы кластера без удаления Persistent Volume.
**resume** — Возобновление + работы кластера с автоматическим unseal всех нод.
**restart** — Поочередный перезапуск нод с последующим подключением в кластер.
**create_kv** — Создание Key/Value хранилища версии V2.
**delete_kv** + — Удаление Key/Value хранилища со всеми содержащимися секретами.
**create_secrets** — Создание секрета внутри Key/Value хранилища.
**delete_secrets** — Удаление секрета из Key/Value хранилища.
**update_secrets** + — Обновление значения секрета.
**recovery_secrets** — Откат секрета к указанной версии.
**create_role** — Создание роли для управления Key/Value хранилищем или секретами.
**update_role** — + Обновление параметров роли.
**delete_role** — Удаление роли доступа.

---

## 2. Параметры развертывания

Параметры входных данных операции **create**:

### Платформа + для развертывания
Описание: Кластер Kubernetes, в котором будет развернуто приложение.
Формат значения: имя Kubernetes-кластера.

### Имя домена
Описание: Доменное имя сервиса. При + указании полного FQDN выполняется проверка DNS A-записи или добавляется А-запись в техническую зону.
Формат значения: secrets.domain.com / mysecretdomain.

### Кол-во реплик
Описание: + Количество узлов в кластере.
Формат значения: целое число.

### Квота ядра пода
Описание: Лимит CPU для одного узла. Указывается в milicores (1000 milicores = 1 CPU).
Формат значения: + целое число.

### Квота памяти пода
Описание: Лимит оперативной памяти для одного узла. Указывается в megabytes.
Формат значения: целое число.

### Размер диска под хранение секретов
Описание: + Объем диска для хранения данных. Фактический объем равен значению, умноженному на количество реплик. Указывается в Gigabytes
Формат значения: целое число.

### Версия OpenBao
Описание: + Версия OpenBao для развертывания сервиса.
Формат значения: выбор из предоставленного списка версий.

---

## 3. Рекомендованные характеристики

### Тестовое окружение
Кол-во + реплик: 2.
Квота ядра пода: 200.
Квота памяти пода: 256.
Размер диска под хранение секретов: 1.
Версия OpenBao: актуальная стабильная версия.

### Промышленное окружение
Кол-во + реплик: от 3.
Квота ядра пода: от 1000.
Квота памяти пода: от 1024.
Размер диска под хранение секретов: от 10.
Версия OpenBao: актуальная стабильная версия.

---

## 4. + Выходные параметры
Настройки внутри хранилища (kv/secrets/roles) — конфигурации Key/Value, секретов и ролей, созданные соответствующими операциями.
Настройки самого хранилище (сайзинг, объемы) + — параметры ресурсов и хранилища данных, примененные к сервису.
Статус кластера (running / suspended) — текущее состояние работы кластера.
url для подключения к веб — адрес веб-интерфейса сервиса.

---

## + 5. Дополнительная информация
При удалении хранилища все данные и настройки безвозвратно удаляются.
При использовании доменного имени требуется корректная настройка DNS.
Операции управления + секретами и ролями выполняются только после успешного создания хранилища.
Удаление кластера производится через операцию `suspend`, а удаление становится доступно через 14 дней после остановки кластера
Правило + выше не относится к операции `delete_kv` / `delete_secrets` / `delete_role`' +lifecycle: + suspendOnDestroyDefault: true + adoptExistingOnCreateDefault: false +operations: +- svcOperationId: 210 + operation: create + kind: instance + action: create +- svcOperationId: 212 + operation: create_kv + kind: subresource + action: create +- svcOperationId: 237 + operation: create_policy + kind: subresource + action: create +- svcOperationId: 214 + operation: create_secrets + kind: subresource + action: create +- svcOperationId: 231 + operation: delete + kind: instance + action: delete +- svcOperationId: 213 + operation: delete_kv + kind: subresource + action: delete +- svcOperationId: 239 + operation: delete_policy + kind: subresource + action: delete +- svcOperationId: 233 + operation: delete_secrets + kind: subresource + action: delete +- svcOperationId: 211 + operation: modify + kind: instance + action: modify +- svcOperationId: 236 + operation: reconcile + kind: action + action: reconcile +- svcOperationId: 232 + operation: recovery_secrets + kind: subresource + action: recovery +- svcOperationId: 216 + operation: resume + kind: instance + action: resume +- svcOperationId: 215 + operation: suspend + kind: instance + action: suspend +- svcOperationId: 238 + operation: update_policy + kind: subresource + action: update +- svcOperationId: 230 + operation: update_secrets + kind: subresource + action: update +stateOut: + kvs: {} + policies: {} + secrets: {} +cfsParams: +- svcOperationCfsParamId: 663 + svcOperationCfsParam: resourceRealm + dataType: string + isRequired: true + defaultValue: k8s-4-ext-nubes-ru + isModifiable: false + valueList: + - k8s-4-ext-nubes-ru +- svcOperationCfsParamId: 664 + svcOperationCfsParam: resourceCPU + dataType: integer > 0 + isRequired: true + defaultValue: '500' + isModifiable: true +- svcOperationCfsParamId: 665 + svcOperationCfsParam: resourceInstances + dataType: integer > 0 + isRequired: true + defaultValue: '3' + isModifiable: true +- svcOperationCfsParamId: 666 + svcOperationCfsParam: resourceMemory + dataType: integer > 0 + isRequired: true + defaultValue: '512' + isModifiable: true +- svcOperationCfsParamId: 667 + svcOperationCfsParam: resourceDisk + dataType: integer > 0 + isRequired: true + defaultValue: '10' + isModifiable: true +- svcOperationCfsParamId: 668 + svcOperationCfsParam: appVersion + dataType: string + isRequired: true + defaultValue: 2.5.2 + isModifiable: true + valueList: + - 2.5.2 +- svcOperationCfsParamId: 669 + svcOperationCfsParam: domain + dataType: string + isRequired: true + defaultValue: bao-ozea0nxy + isModifiable: false +- svcOperationCfsParamId: 675 + svcOperationCfsParam: kvName + dataType: string + isRequired: true + defaultValue: kvname-ljwxn20b + isModifiable: false +- svcOperationCfsParamId: 728 + svcOperationCfsParam: policySettings + dataType: array-map-fixed + isRequired: true + defaultValue: '' + isModifiable: false + dataDescriptor: + path: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false + capabilities: + dataType: json + defaultValue: '["read", "list"]' + isRequired: true + isModifiable: false +- svcOperationCfsParamId: 729 + svcOperationCfsParam: policyName + dataType: string + isRequired: true + defaultValue: policy-idnyeyeg + isModifiable: false +- svcOperationCfsParamId: 677 + svcOperationCfsParam: kvName + dataType: string + isRequired: true + defaultValue: '' + isModifiable: false +- svcOperationCfsParamId: 678 + svcOperationCfsParam: secretPath + dataType: string + isRequired: true + defaultValue: path/to/mysecret + isModifiable: false +- svcOperationCfsParamId: 679 + svcOperationCfsParam: secretData + dataType: map + isRequired: true + defaultValue: '' + isModifiable: false +- svcOperationCfsParamId: 676 + svcOperationCfsParam: kvName + dataType: string + isRequired: true + defaultValue: '' + isModifiable: true +- svcOperationCfsParamId: 732 + svcOperationCfsParam: policyName + dataType: string + isRequired: true + defaultValue: '' + isModifiable: true +- svcOperationCfsParamId: 726 + svcOperationCfsParam: kvName + dataType: string + isRequired: true + defaultValue: '' + isModifiable: true +- svcOperationCfsParamId: 727 + svcOperationCfsParam: secretPath + dataType: string + isRequired: true + defaultValue: '' + isModifiable: true +- svcOperationCfsParamId: 670 + svcOperationCfsParam: resourceInstances + dataType: integer > 0 + isRequired: true + defaultValue: '' + isModifiable: true +- svcOperationCfsParamId: 671 + svcOperationCfsParam: resourceCPU + dataType: integer > 0 + isRequired: true + defaultValue: '500' + isModifiable: true +- svcOperationCfsParamId: 672 + svcOperationCfsParam: resourceMemory + dataType: integer > 0 + isRequired: true + defaultValue: '512' + isModifiable: true +- svcOperationCfsParamId: 673 + svcOperationCfsParam: resourceDisk + dataType: integer > 0 + isRequired: true + defaultValue: '' + isModifiable: true +- svcOperationCfsParamId: 674 + svcOperationCfsParam: appVersion + dataType: string + isRequired: true + defaultValue: '' + isModifiable: true + valueList: + - 2.5.2 +- svcOperationCfsParamId: 723 + svcOperationCfsParam: kvName + dataType: string + isRequired: true + defaultValue: '' + isModifiable: true +- svcOperationCfsParamId: 724 + svcOperationCfsParam: secretPath + dataType: string + isRequired: true + defaultValue: '' + isModifiable: true +- svcOperationCfsParamId: 725 + svcOperationCfsParam: secretVersion + dataType: string + isRequired: true + defaultValue: '' + isModifiable: true +- svcOperationCfsParamId: 730 + svcOperationCfsParam: policyName + dataType: string + isRequired: true + defaultValue: '' + isModifiable: true +- svcOperationCfsParamId: 731 + svcOperationCfsParam: policySettings + dataType: array-map-fixed + isRequired: true + defaultValue: '' + isModifiable: true + dataDescriptor: + path: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false + capabilities: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false +- svcOperationCfsParamId: 719 + svcOperationCfsParam: kvName + dataType: string + isRequired: true + defaultValue: '' + isModifiable: true +- svcOperationCfsParamId: 720 + svcOperationCfsParam: secretPath + dataType: string + isRequired: true + defaultValue: '' + isModifiable: true +- svcOperationCfsParamId: 721 + svcOperationCfsParam: needFullUpdateSecret + dataType: boolean + isRequired: true + defaultValue: 'false' + isModifiable: true + valueList: + - 'false' + - 'true' +- svcOperationCfsParamId: 722 + svcOperationCfsParam: secretData + dataType: map + isRequired: true + defaultValue: '' + isModifiable: true +cfsParamsByOp: + 210: + - 663 + - 664 + - 665 + - 666 + - 667 + - 668 + - 669 + 212: + - 675 + 237: + - 728 + - 729 + 214: + - 677 + - 678 + - 679 + 231: [] + 213: + - 676 + 239: + - 732 + 233: + - 726 + - 727 + 211: + - 670 + - 671 + - 672 + - 673 + - 674 + 236: [] + 232: + - 723 + - 724 + - 725 + 216: [] + 215: [] + 238: + - 730 + - 731 + 230: + - 719 + - 720 + - 721 + - 722 +stateParams: + resourceRealm: k8s-4-ext-nubes-ru + resourceCPU: '500' + resourceInstances: '3' + resourceMemory: '512' + resourceDisk: '10' + appVersion: 2.5.2 + domain: bao-ozea0nxy diff --git a/site/services/prod/163_llm_ai.yaml b/site/services/prod/163_llm_ai.yaml new file mode 100644 index 0000000..c56b21a --- /dev/null +++ b/site/services/prod/163_llm_ai.yaml @@ -0,0 +1,248 @@ +name: llm_ai +service_id: 163 +service_display_name: ML Улей +service_short_name: llmAi +service_man: '## 1. Общая информация

LLMaaS (Large Language Model as a Service) — это сервис для доступа к языковым моделям через OpenAI-совместимое API.
Платформа позволяет создавать организации + (тенанты), команды, выпускать и управлять API-ключами, устанавливать лимиты на использование.

### Ограничение: одна организация на контрагента

На одного контрагента может быть создана + **только одна организация** в LLMaaS.
Повторная попытка создать организацию для того же контрагента завершится ошибкой.

### Возможные ошибки и как их обрабатывать

При работе с сервисом + могут возникнуть типовые ошибки. Ниже описано, как их распознать и что делать.

| Ошибка | Когда возникает | Что делать |
|--------|-----------------|------------|
| `Организация в LLMaaS + уже привязана к контрагенту ` | При операции `create`, если организация для данного контрагента уже существует | На одного контрагента допускается только одна организация. Если нужно изменить + существующую организацию, используйте операции управления командами и ключами |
| `Не хватает нужного гранта. Примените реконсиляцию для данного инстанса` | При операциях `create_team`, `modify_team`, + если модель не выдана организации на Layer 1 | Запустите операцию `reconcile` для данного инстанса. Она обновит список моделей, доступных организации, после чего повторите исходную операцию |
| `Лимиты + API-ключа не могут превышать лимиты команды` | При операциях `create_secrets`, `update_secrets` | Уменьшите значения `RPM` и/или `TPM` ключа до уровня команды или увеличьте лимиты самой команды через + `modify_team` |

---

## Доступные операции

- **create** — Создание организации в LLMaaS
- **delete** — Удаление организации

- **create_team** — + Создание команды внутри организации
- **modify_team** — Редактирование команды (модели, RPM, TPM)
- **delete_team** — Удаление команды

- **create_secrets** — Создание API-ключа
- + **update_secrets** — Обновление параметров API-ключа
- **delete_secrets** — Удаление API-ключа

- **reconcile** — Обновление списка моделей, доступных организации

---

## + 2. Параметры создания организации

Ниже перечислены параметры, которые необходимо указать при создании организации:

* **Платформа для развертывания**
Выбирается автоматически, изменять + не нужно.

## 3. Параметры создания команды

* **Имя команды**
Уникальное имя команды в рамках организации.
Пример: `production`

* **Модель**
Название модели, + доступной для команды.
Пример: `gpt-oss-120b`

* **Лимит запросов в минуту (RPM)**
Максимальное количество запросов к API в минуту.
Пример: `60`

* **Лимит токенов в + минуту (TPM)**
Максимальное количество токенов (входящих + исходящих) в минуту.
Пример: `100000`

---

## 4. Параметры редактирования команды

Для существующей команды + можно изменить:

* **Модель**
Новая модель для команды.
Пример: `gpt-oss-20b`

* **Лимит запросов в минуту (RPM)**
Новое значение RPM.
Пример: `120`

* + **Лимит токенов в минуту (TPM)**
Новое значение TPM.
Пример: `200000`

---

## 5. Параметры создания API-ключа

Ниже перечислены параметры, которые необходимо указать + при создании API-ключа:

* **Имя ключа**
Уникальное имя ключа в рамках организации.
Пример: `prod-key`

* **Команда**
Имя команды для привязки ключа. Если не указано + — ключ привязывается к команде `main`.
Пример: `production`

* **Модель**
Название модели, доступной для данного ключа.
Пример: `gpt-oss-120b`

* **Лимит запросов в минуту + (RPM)**
Максимальное количество запросов к API в минуту.
Пример: `60`

* **Лимит токенов в минуту (TPM)**
Максимальное количество токенов (входящих + исходящих) в минуту.
Пример: + `100000`

**Важно:** Лимиты API-ключа не могут превышать лимиты команды, к которой он привязан.
При превышении операция будет отклонена с ошибкой.
Перед созданием ключа убедитесь, что + `RPM <= team.RPM` и `TPM <= team.TPM`.


---

## 6. Параметры обновления API-ключа

Для уже существующего ключа можно изменить параметры. Все параметры являются опциональными:

* + **Имя ключа**
Имя обновляемого ключа.
Пример: `prod-key`

* **Модель**
Новое название модели.
Пример: `gpt-oss-20b`

* **Лимит запросов в минуту (RPM)**
Новое + значение RPM.
Пример: `120`

* **Лимит токенов в минуту (TPM)**
Новое значение TPM.
Пример: `200000`

**Важно:** При обновлении лимитов API-ключа новые значения не могут + превышать лимиты команды.
Если указать значения выше командных, операция завершится ошибкой.
Указывайте `RPM <= team.RPM` и `TPM <= team.TPM`.

Команда определяется автоматически по стейту + услуги — изменить привязку к другой команде через эту операцию нельзя.

---

## 7. Параметры удаления API-ключа

* **Команда**
Имя команды, к которой привязан ключ.
Пример: + `production`

* **Имя ключа**
Имя удаляемого ключа.
Пример: `prod-key`

---

## 8. Параметры удаления команды

* **Имя команды**
Имя удаляемой команды.
Пример: + `production`

---

## 9. Параметры удаления организации

Удаление организации не требует дополнительных параметров — удаляется вся организация со всеми командами и ключами.

---

## + 10. Выходные параметры

После успешного создания организации платформа возвращает:

* **connectionUrl**
URL для доступа к inference API (OpenAI-совместимый).
Пример: `https://api.aillm.ru`

---


## + 11. Пример использования API

После получения API-ключа клиент может обращаться к LLMaaS напрямую:

**Запрос к chat completions:**

```bash
curl https://api.aillm.ru/v1/chat/completions + \
-H "Authorization: Bearer sk-..." \
-H "Content-Type: application/json" \
-d ''{
"model": "gpt-oss-120b",
"messages": [
{"role": "user", "content": "Привет!"}
]
}''
```

**Получение + списка доступных моделей:**

```bash
curl https://api.aillm.ru/v1/models \
-H "Authorization: Bearer sk-..."
```
' +lifecycle: + suspendOnDestroyDefault: false + adoptExistingOnCreateDefault: false +operations: +- svcOperationId: 271 + operation: create + kind: instance + action: create +- svcOperationId: 274 + operation: create_secrets + kind: subresource + action: create +- svcOperationId: 278 + operation: create_team + kind: subresource + action: create +- svcOperationId: 273 + operation: delete + kind: instance + action: delete +- svcOperationId: 275 + operation: delete_secrets + kind: subresource + action: delete +- svcOperationId: 280 + operation: delete_team + kind: subresource + action: delete +- svcOperationId: 279 + operation: modify_team + kind: subresource + action: modify +- svcOperationId: 412 + operation: reconcile + kind: action + action: reconcile +- svcOperationId: 277 + operation: update_secrets + kind: subresource + action: update +stateOut: + secrets: {} + teams: {} +cfsParams: +- svcOperationCfsParamId: 826 + svcOperationCfsParam: resourceRealm + dataType: string + isRequired: true + defaultValue: llmAi.aillm.ru + isModifiable: false + valueList: + - llmAi.aillm.ru +- svcOperationCfsParamId: 833 + svcOperationCfsParam: models + dataType: array + isRequired: true + defaultValue: '' + isModifiable: false +- svcOperationCfsParamId: 834 + svcOperationCfsParam: rpmLimit + dataType: integer > 0 + isRequired: true + defaultValue: '60' + isModifiable: false +- svcOperationCfsParamId: 835 + svcOperationCfsParam: tpmLimit + dataType: integer > 0 + isRequired: true + defaultValue: '100000' + isModifiable: false +- svcOperationCfsParamId: 857 + svcOperationCfsParam: keyName + dataType: string + isRequired: true + defaultValue: '' + isModifiable: false +- svcOperationCfsParamId: 859 + svcOperationCfsParam: teamName + dataType: string + isRequired: true + defaultValue: '' + isModifiable: false +- svcOperationCfsParamId: 858 + svcOperationCfsParam: teamName + dataType: string + isRequired: true + defaultValue: '' + isModifiable: false +- svcOperationCfsParamId: 860 + svcOperationCfsParam: models + dataType: array + isRequired: true + defaultValue: '' + isModifiable: false +- svcOperationCfsParamId: 861 + svcOperationCfsParam: rpmLimit + dataType: integer > 0 + isRequired: true + defaultValue: '60' + isModifiable: false +- svcOperationCfsParamId: 862 + svcOperationCfsParam: tpmLimit + dataType: integer > 0 + isRequired: true + defaultValue: '100000' + isModifiable: false +- svcOperationCfsParamId: 836 + svcOperationCfsParam: keyName + dataType: string + isRequired: true + defaultValue: '' + isModifiable: true +- svcOperationCfsParamId: 876 + svcOperationCfsParam: teamName + dataType: string + isRequired: true + defaultValue: '' + isModifiable: true +- svcOperationCfsParamId: 868 + svcOperationCfsParam: teamName + dataType: string + isRequired: true + defaultValue: '' + isModifiable: true +- svcOperationCfsParamId: 864 + svcOperationCfsParam: teamName + dataType: string + isRequired: true + defaultValue: '' + isModifiable: true +- svcOperationCfsParamId: 865 + svcOperationCfsParam: models + dataType: array + isRequired: true + defaultValue: '' + isModifiable: true +- svcOperationCfsParamId: 873 + svcOperationCfsParam: rpmLimit + dataType: integer > 0 + isRequired: true + defaultValue: '60' + isModifiable: true +- svcOperationCfsParamId: 874 + svcOperationCfsParam: tpmLimit + dataType: integer > 0 + isRequired: true + defaultValue: '100000' + isModifiable: true +- svcOperationCfsParamId: 852 + svcOperationCfsParam: keyName + dataType: string + isRequired: true + defaultValue: '' + isModifiable: true +- svcOperationCfsParamId: 853 + svcOperationCfsParam: models + dataType: array + isRequired: true + defaultValue: '' + isModifiable: true +- svcOperationCfsParamId: 854 + svcOperationCfsParam: rpmLimit + dataType: integer > 0 + isRequired: true + defaultValue: '60' + isModifiable: true +- svcOperationCfsParamId: 855 + svcOperationCfsParam: tpmLimit + dataType: integer > 0 + isRequired: true + defaultValue: '100000' + isModifiable: true +- svcOperationCfsParamId: 875 + svcOperationCfsParam: teamName + dataType: string + isRequired: true + defaultValue: '' + isModifiable: true +cfsParamsByOp: + 271: + - 826 + 274: + - 833 + - 834 + - 835 + - 857 + - 859 + 278: + - 858 + - 860 + - 861 + - 862 + 273: [] + 275: + - 836 + - 876 + 280: + - 868 + 279: + - 864 + - 865 + - 873 + - 874 + 412: [] + 277: + - 852 + - 853 + - 854 + - 855 + - 875 +stateParams: + resourceRealm: llmAi.aillm.ru diff --git a/site/services/prod/19_vc_org.yaml b/site/services/prod/19_vc_org.yaml index 76fc6e2..abf2594 100644 --- a/site/services/prod/19_vc_org.yaml +++ b/site/services/prod/19_vc_org.yaml @@ -73,6 +73,12 @@ cfsParams: valueList: - iaas - saas +- svcOperationCfsParamId: 1125 + svcOperationCfsParam: organizationSuffix + dataType: string + isRequired: false + defaultValue: '' + isModifiable: false - svcOperationCfsParamId: 871 svcOperationCfsParam: admins dataType: array-map-fixed @@ -110,7 +116,7 @@ cfsParams: isRequired: true isModifiable: false count: - dataType: integer > 0 + dataType: integer >= 0 defaultValue: '' isRequired: true isModifiable: false @@ -118,6 +124,7 @@ cfsParamsByOp: 136: - 418 - 556 + - 1125 283: - 871 137: [] @@ -131,3 +138,4 @@ cfsParamsByOp: stateParams: resourceRealm: ngcloud.ru organizationType: iaas + organizationSuffix: '' diff --git a/site/services/prod/1_dummy.yaml b/site/services/prod/1_dummy.yaml index 7fbf991..bfeb641 100644 --- a/site/services/prod/1_dummy.yaml +++ b/site/services/prod/1_dummy.yaml @@ -98,12 +98,12 @@ cfsParams: defaultValue: '' isRequired: false isModifiable: false - secret: + subparam2: dataType: string defaultValue: '' isRequired: false isModifiable: false - subparam2: + secret: dataType: string defaultValue: '' isRequired: false @@ -127,13 +127,6 @@ cfsParams: defaultValue: '' isModifiable: false dataDescriptor: - minStr1: - dataType: string - defaultValue: abracadabra - isRequired: true - isModifiable: false - valueList: - - abracadabra param1: dataType: integer > 0 defaultValue: '1' @@ -161,6 +154,13 @@ cfsParams: valueList: - 'false' - 'true' + minStr1: + dataType: string + defaultValue: abracadabra + isRequired: true + isModifiable: false + valueList: + - abracadabra - svcOperationCfsParamId: 654 svcOperationCfsParam: arrayMapFixedExample dataType: array-map-fixed @@ -168,6 +168,20 @@ cfsParams: defaultValue: '' isModifiable: false dataDescriptor: + param1: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false + param2: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - '["1"' + - '"2"' + - '"3"]' param3: dataType: integer > 0 defaultValue: '1' @@ -188,20 +202,6 @@ cfsParams: isModifiable: false valueList: - abracadabra - param1: - dataType: integer > 0 - defaultValue: '' - isRequired: true - isModifiable: false - param2: - dataType: string - defaultValue: '' - isRequired: true - isModifiable: false - valueList: - - '["1"' - - '"2"' - - '"3"]' - svcOperationCfsParamId: 863 svcOperationCfsParam: arr dataType: array @@ -304,9 +304,9 @@ stateParams: whereFail: '1' resourceRealm: '' bodymessage: '' - mapExample: '{"subparam1": "", "secret": "", "subparam2": ""}' + mapExample: '{"subparam1": "", "subparam2": "", "secret": ""}' jsonExample: '' nestedRefExample: '' - mapFixed: '{"minStr1": "abracadabra", "param1": 1, "param2": "1", "param3": 1, "bol1": false}' - arrayMapFixedExample: '{"param3": 1, "bol1": false, "minStr1": "", "param1": 0, "param2": ""}' + mapFixed: '{"param1": 1, "param2": "1", "param3": 1, "bol1": false, "minStr1": "abracadabra"}' + arrayMapFixedExample: '{"param1": 0, "param2": "", "param3": 1, "bol1": false, "minStr1": ""}' arr: '' diff --git a/site/services/prod/21_vc_vdc.yaml b/site/services/prod/21_vc_vdc.yaml index e573655..044029b 100644 --- a/site/services/prod/21_vc_vdc.yaml +++ b/site/services/prod/21_vc_vdc.yaml @@ -58,13 +58,13 @@ cfsParams: dataType: uuid isRequired: true defaultValue: '' - isModifiable: false + isModifiable: true - svcOperationCfsParamId: 335 svcOperationCfsParam: providerVdc dataType: string isRequired: true defaultValue: '' - isModifiable: false + isModifiable: true - svcOperationCfsParamId: 361 svcOperationCfsParam: storageConfig dataType: array-map-fixed @@ -79,36 +79,50 @@ cfsParams: isModifiable: false size: dataType: integer > 0 - defaultValue: '100' + defaultValue: '2000' isRequired: true isModifiable: false + isDefaultStorageProfile: + dataType: boolean + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - 'false' + - 'true' - svcOperationCfsParamId: 397 svcOperationCfsParam: cpuGuaranteed - dataType: integer > 0 + dataType: integer >= 0 isRequired: true - defaultValue: '20' + defaultValue: '0' isModifiable: false valueList: - - '20' + - '0' - '50' - '80' - svcOperationCfsParamId: 557 svcOperationCfsParam: cpuAllocated dataType: integer > 0 isRequired: true - defaultValue: '10' + defaultValue: '80' isModifiable: true - svcOperationCfsParamId: 558 svcOperationCfsParam: memAllocated dataType: integer > 0 isRequired: true - defaultValue: '20' + defaultValue: '200' isModifiable: true - svcOperationCfsParamId: 746 svcOperationCfsParam: networkProvider dataType: string isRequired: true defaultValue: '' + isModifiable: true +- svcOperationCfsParamId: 1130 + svcOperationCfsParam: suffixName + dataType: string + isRequired: false + defaultValue: xobcwf4u isModifiable: false - svcOperationCfsParamId: 560 svcOperationCfsParam: cpuAllocated @@ -139,6 +153,32 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false + isDefaultStorageProfile: + dataType: boolean + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - 'false' + - 'true' +- svcOperationCfsParamId: 1158 + svcOperationCfsParam: organizationUid + dataType: uuid + isRequired: false + defaultValue: '' + isModifiable: true +- svcOperationCfsParamId: 1159 + svcOperationCfsParam: networkProvider + dataType: string + isRequired: false + defaultValue: '' + isModifiable: true +- svcOperationCfsParamId: 1160 + svcOperationCfsParam: providerVdc + dataType: string + isRequired: false + defaultValue: '' + isModifiable: true cfsParamsByOp: 9: - 30 @@ -148,19 +188,24 @@ cfsParamsByOp: - 557 - 558 - 746 + - 1130 24: [] 112: - 560 - 561 - 562 + - 1158 + - 1159 + - 1160 250: [] 172: [] 171: [] stateParams: organizationUid: '' providerVdc: '' - storageConfig: '{"name": "", "size": 100}' - cpuGuaranteed: '20' - cpuAllocated: '10' - memAllocated: '20' + storageConfig: '{"name": "", "size": 2000, "isDefaultStorageProfile": false}' + cpuGuaranteed: '0' + cpuAllocated: '80' + memAllocated: '200' networkProvider: '' + suffixName: xobcwf4u diff --git a/site/services/prod/22_vc_nsxt.yaml b/site/services/prod/22_vc_nsxt.yaml index 9988cbc..3ffc72f 100644 --- a/site/services/prod/22_vc_nsxt.yaml +++ b/site/services/prod/22_vc_nsxt.yaml @@ -88,6 +88,28 @@ cfsParams: isRequired: false defaultValue: '' isModifiable: true +- svcOperationCfsParamId: 1110 + svcOperationCfsParam: routedNetConfiguration + dataType: map-fixed + isRequired: true + defaultValue: '' + isModifiable: true + dataDescriptor: + ipAddrPool: + dataType: string + defaultValue: 10.10.102.0/24 + isRequired: true + isModifiable: false + mainDns: + dataType: string + defaultValue: 81.22.46.22 + isRequired: true + isModifiable: false + secondDns: + dataType: string + defaultValue: 185.247.187.77 + isRequired: true + isModifiable: false - svcOperationCfsParamId: 368 svcOperationCfsParam: needEnableAVI dataType: boolean @@ -115,6 +137,28 @@ cfsParams: isRequired: false defaultValue: '' isModifiable: true +- svcOperationCfsParamId: 1112 + svcOperationCfsParam: routedNetConfiguration + dataType: map-fixed + isRequired: true + defaultValue: '' + isModifiable: true + dataDescriptor: + ipAddrPool: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false + mainDns: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false + secondDns: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false cfsParamsByOp: 10: - 8 @@ -123,12 +167,14 @@ cfsParamsByOp: - 621 - 622 - 825 + - 1110 25: [] 111: - 368 - 369 - 372 - 856 + - 1112 252: [] stateParams: vdcUid: '' @@ -137,3 +183,4 @@ stateParams: vdcType: vdc vdcGroupUid: '' qosProfile: '' + routedNetConfiguration: '{"ipAddrPool": "10.10.102.0/24", "mainDns": "81.22.46.22", "secondDns": "185.247.187.77"}' diff --git a/site/services/prod/26_vapp.yaml b/site/services/prod/26_vapp.yaml index aa2d8ca..7a40519 100644 --- a/site/services/prod/26_vapp.yaml +++ b/site/services/prod/26_vapp.yaml @@ -48,7 +48,7 @@ cfsParams: svcOperationCfsParam: vappName dataType: string isRequired: true - defaultValue: es1fsp9q + defaultValue: 9zrw3ba0 isModifiable: false - svcOperationCfsParamId: 623 svcOperationCfsParam: vdcUid @@ -66,5 +66,5 @@ cfsParamsByOp: 208: [] stateParams: nsxtUid: '' - vappName: es1fsp9q + vappName: 9zrw3ba0 vdcUid: '' diff --git a/site/services/prod/28_vc_vm_v3.yaml b/site/services/prod/28_vc_vm_v3.yaml index a790017..64b9cf2 100644 --- a/site/services/prod/28_vc_vm_v3.yaml +++ b/site/services/prod/28_vc_vm_v3.yaml @@ -96,9 +96,9 @@ cfsParams: isModifiable: true - svcOperationCfsParamId: 413 svcOperationCfsParam: accessIpList - dataType: json + dataType: array isRequired: false - defaultValue: '' + defaultValue: '["0.0.0.0/0"]' isModifiable: true - svcOperationCfsParamId: 414 svcOperationCfsParam: imageVm @@ -126,10 +126,34 @@ cfsParams: isModifiable: false - svcOperationCfsParamId: 448 svcOperationCfsParam: accessPortList - dataType: string + dataType: array-map-fixed isRequired: true - defaultValue: '["22"]' + defaultValue: '' isModifiable: true + dataDescriptor: + port: + dataType: string + defaultValue: '22' + isRequired: true + isModifiable: false + type: + dataType: string + defaultValue: all + isRequired: true + isModifiable: false + valueList: + - tcp + - udp + - all +- svcOperationCfsParamId: 1118 + svcOperationCfsParam: sameSnat + dataType: boolean + isRequired: false + defaultValue: 'false' + isModifiable: true + valueList: + - 'false' + - 'true' - svcOperationCfsParamId: 493 svcOperationCfsParam: vmCpu dataType: integer > 0 @@ -154,11 +178,6 @@ cfsParams: isRequired: false defaultValue: '' isModifiable: true - valueList: - - no-needed - - internet-antiddos-v1 - - internet-no-antiddos-v1 - - internet-ipv4-v1 - svcOperationCfsParamId: 497 svcOperationCfsParam: accessIpList dataType: json @@ -167,10 +186,34 @@ cfsParams: isModifiable: true - svcOperationCfsParamId: 498 svcOperationCfsParam: accessPortList - dataType: json + dataType: array-map-fixed isRequired: false defaultValue: '' isModifiable: true + dataDescriptor: + port: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false + type: + dataType: string + defaultValue: all + isRequired: true + isModifiable: false + valueList: + - tcp + - udp + - all +- svcOperationCfsParamId: 1119 + svcOperationCfsParam: sameSnat + dataType: boolean + isRequired: true + defaultValue: '' + isModifiable: true + valueList: + - 'false' + - 'true' - svcOperationCfsParamId: 509 svcOperationCfsParam: vmName dataType: string @@ -201,11 +244,6 @@ cfsParams: isRequired: false defaultValue: '' isModifiable: true - valueList: - - no-needed - - internet-antiddos-v1 - - internet-no-antiddos-v1 - - internet-ipv4-v1 - svcOperationCfsParamId: 514 svcOperationCfsParam: accessIpList dataType: json @@ -242,10 +280,34 @@ cfsParams: isModifiable: true - svcOperationCfsParamId: 520 svcOperationCfsParam: accessPortList - dataType: json + dataType: array-map-fixed isRequired: false defaultValue: '' isModifiable: true + dataDescriptor: + port: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false + type: + dataType: string + defaultValue: all + isRequired: true + isModifiable: false + valueList: + - tcp + - udp + - all +- svcOperationCfsParamId: 1123 + svcOperationCfsParam: sameSnat + dataType: boolean + isRequired: true + defaultValue: '' + isModifiable: true + valueList: + - 'false' + - 'true' cfsParamsByOp: 132: - 407 @@ -260,6 +322,7 @@ cfsParamsByOp: - 416 - 417 - 448 + - 1118 133: [] 159: - 493 @@ -268,6 +331,7 @@ cfsParamsByOp: - 496 - 497 - 498 + - 1119 286: [] 164: - 509 @@ -281,6 +345,7 @@ cfsParamsByOp: - 517 - 518 - 520 + - 1123 135: [] 134: [] stateParams: @@ -290,9 +355,10 @@ stateParams: vmRam: '1' vmDisk: '' ipSpaceName: '' - accessIpList: '' + accessIpList: '["0.0.0.0/0"]' imageVm: '' cloudInit: '' userLogin: myuser userPublicKey: '' - accessPortList: '["22"]' + accessPortList: '{"port": "22", "type": "all"}' + sameSnat: 'false' diff --git a/site/services/prod/2_template.yaml b/site/services/prod/2_template.yaml index 31ee93e..5074274 100644 --- a/site/services/prod/2_template.yaml +++ b/site/services/prod/2_template.yaml @@ -44,11 +44,6 @@ cfsParams: defaultValue: '100' isRequired: true isModifiable: false - disk: - dataType: integer > 0 - defaultValue: '5' - isRequired: true - isModifiable: false memory: dataType: integer > 0 defaultValue: '128' @@ -59,6 +54,11 @@ cfsParams: defaultValue: '1' isRequired: true isModifiable: false + disk: + dataType: integer > 0 + defaultValue: '5' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 814 svcOperationCfsParam: startupConfiguration dataType: map-fixed @@ -90,7 +90,7 @@ cfsParams: - service domain: dataType: string - defaultValue: abracadabra-g2byllee + defaultValue: abracadabra-am1z2wlk isRequired: true isModifiable: false masterIpSpace: @@ -125,13 +125,13 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false - disk: - dataType: integer >= 0 + memory: + dataType: integer > 0 defaultValue: '' isRequired: true isModifiable: false - memory: - dataType: integer > 0 + disk: + dataType: integer >= 0 defaultValue: '' isRequired: true isModifiable: false @@ -165,13 +165,13 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false - masterAccessList: - dataType: json + slaveIpSpace: + dataType: string defaultValue: '' isRequired: true isModifiable: false - slaveIpSpace: - dataType: string + masterAccessList: + dataType: json defaultValue: '' isRequired: true isModifiable: false @@ -193,6 +193,6 @@ cfsParamsByOp: 98: [] 97: [] stateParams: - clusterConfiguration: '{"cpu": 100, "disk": 5, "memory": 128, "replicas": 1}' + clusterConfiguration: '{"cpu": 100, "memory": 128, "replicas": 1, "disk": 5}' startupConfiguration: '{"resourceRealm": "k8s-4-ext-nubes-ru"}' - accessConfiguration: '{"type": "ingress", "domain": "abracadabra-g2byllee", "masterIpSpace": "", "masterAccessList": "[]", "slaveIpSpace": "", "slaveAccessList": "[]"}' + accessConfiguration: '{"type": "ingress", "domain": "abracadabra-am1z2wlk", "masterIpSpace": "", "masterAccessList": "[]", "slaveIpSpace": "", "slaveAccessList": "[]"}' diff --git a/site/services/prod/50_nextcloud.yaml b/site/services/prod/50_nextcloud.yaml index d6d44d7..8daaf9e 100644 --- a/site/services/prod/50_nextcloud.yaml +++ b/site/services/prod/50_nextcloud.yaml @@ -2,7 +2,49 @@ name: nextcloud service_id: 50 service_display_name: Nextcloud service_short_name: nextcloud -service_man: 'Ресурсная платформа: k8s. Автоматизация: helm chart' +service_man: '# Инструкция по развертыванию Nextcloud через платформу

## 1. Общая информация

Nextcloud — платформа для хранения и совместной работы с файлами. Разворачивается в K8s через + Helm-чарт `nextcloud/nextcloud`.

Сервис **не самодостаточен** — для создания необходимы заранее развёрнутые в той же ресурсной платформе:

* **PostgreSQL (k8s)** — база данных Nextcloud. + У СУБД должен быть выставлен параметр `sslRequired: false`.
* **Redis (k8s)** — используется как memcache/locking backend.

Резервное копирование выполняется через **Velero** (бэкапятся под + и PVC с данными), а не штатным S3-бэкапом СУБД.

### Доступные операции с сервисом

* **create** — создание сервиса
* **delete** — удаление сервиса
* **suspend** — + остановка сервиса (масштабирование реплик в 0)
* **resume** — запуск сервиса
* **restart** — перезапуск (`kubectl rollout restart`)
* **modify** — изменение настроек + сервиса
* **reconcile** — служебная операция синхронизации версии (запускается платформой автоматически)
* **create_backup** — создание резервной копии вручную (через Velero)
* **recovery** — + восстановление из резервной копии в **новый** инстанс

> **Примечание:** операций работы с пользователями Nextcloud (`create_user`/`modify_user`/`delete_user`) на уровне платформы нет — пользователи + приложения администрируются внутри самого Nextcloud.

---

## 2. Параметры создания сервиса

### Платформа для развертывания

Ресурсная платформа (`resourceRealm`), в которой + будет развёрнут сервис. PostgreSQL и Redis, указанные ниже, обязаны находиться в той же ресурсной платформе.

### СУБД PostgreSQL (psqlUid)

UID инстанса PostgreSQL (k8s), в котором будет + создана база и пользователь `nextcloud`.

* У выбранной СУБД должна отсутствовать база `nextcloud` и пользователь `nextcloud`.
* У СУБД обязан быть выключен `sslRequired` (`false`).

### + СУБД Redis (redisUid)

UID инстанса Redis (k8s), который будет использоваться как memcache/locking backend.

### Количество реплик

Количество реплик Nextcloud (`clusterConfiguration.replicas`).

### + Квота памяти пода (MB)

Объём памяти для пода Nextcloud в мегабайтах.
Пример: `2048`

### Квота CPU пода (mCPU)

CPU-квота для пода Nextcloud в миликорах (1000 mCPU = 1 vCPU).
Пример: + `1000`

### Размер диска для данных (GB)

Объём диска под данные Nextcloud (`/var/www/html/data`) в гигабайтах.
Пример: `20`

### Домен

Домен, на котором будет доступен + Nextcloud (`accessConfiguration.domain`).

* Если указано **полное доменное имя** (содержит точку, например `cloud.company.ru`) — домен считается клиентским. Перед созданием клиент обязан сам + настроить DNS-запись, указывающую на адрес Ingress платформы, иначе создание завершится ошибкой.
* Если указано **короткое имя** (без точки, например `mycloud`) — платформа сама создаёт DNS-запись + вида `.nextcloudk8s` и настраивает сертификат.

### Версия

Версия приложения Nextcloud (`appConfiguration.version`, поле `appVersion` Helm-чарта). По ней автоматически подбирается + последняя подходящая версия Helm-чарта.

> **Примечание:** список поддерживаемых версий и допустимые шаги обновления заданы в `pipelines/stages/functions/helm.groovy` (см. раздел 13).

### + Document Server

Параметр `appConfiguration.documentServer`. Если указать `collabora` — в кластер дополнительно разворачивается Collabora Online (совместное редактирование офисных документов), + доступный по пути `/collabora` на том же домене.
Оставьте пустым, если Document Server не нужен.

### Уровень логирования

Параметр `appConfiguration.logLevel`. Одно из значений: `DEBUG`, + `INFO`, `WARN`, `ERROR`, `FATAL`, либо `NONE` — чтобы не переопределять логирование Nextcloud.

---

## 3. Параметры модификации сервиса

Изменению подлежат ресурсы, версия и часть + `appConfiguration`. Параметры `psqlUid`/`redisUid` менять после создания не рекомендуется.

### Количество реплик

См. раздел 2.

### Квота памяти пода (MB) / Квота CPU пода (mCPU) + / Размер диска (GB)

См. раздел 2.

> **Примечание:** уменьшить уже выделенный размер диска нельзя.

### Версия

Обновление версии разрешено только **на один патч** либо + **на одну минорную версию вперёд** (с `patch=0`). Прыжок сразу через несколько минорных версий или через несколько мажорных версий запрещён — обновляться нужно последовательно.

> **Примечание:** + перед обновлением на новую minor/major-версию необходимо сначала выполнить `modify` на текущей версии, обновившись до последнего релиза этой версии (иначе операция завершится ошибкой с описанием, до какой + версии нужно обновиться сначала).

### Document Server / Уровень логирования

См. раздел 2.

---

## 4. Параметры удаления сервиса

Специальных параметров нет — + удаление сносит namespace целиком.

> **Примечание:** резервные копии, созданные через `create_backup`, хранятся в Velero отдельно от инстанса и **не удаляются** вместе с сервисом — операции `delete_backup` + для Nextcloud нет, копии нужно вычищать на стороне Velero отдельно.

---

## 5. Параметры создания бэкапа

Специальных пользовательских параметров нет — имя бэкапа генерируется + автоматически в формате `<дата>-<версия>-`.

> **Примечание:** создать бэкап можно только если сервис предварительно приостановлен (`suspend`). Velero, в который создаётся бэкап, должен + быть развёрнут в той же ресурсной платформе, что и Nextcloud, и не может быть сменён на другой Velero-инстанс в рамках одного сервиса.

Бэкапится под с данными вместе с PVC/PV (файлы), метаданные + и БД PostgreSQL бэкапом не затрагиваются — версия схемы БД фиксируется отдельно (см. раздел 6).

---

## 6. Параметры восстановления из бэкапа (recovery)

В отличие от СУБД-сервисов, + `recovery` у Nextcloud **не восстанавливает данные в текущий инстанс**, а создаёт **новый** инстанс сервиса (аналог `create`), в который переносятся файлы из указанной резервной копии.

### Точка + восстановления (recoveryPoint)

Имя резервной копии Velero, из которой будет выполнено восстановление.

### Домен нового инстанса

Обязан отличаться от домена исходного (текущего) + инстанса — восстановление на тот же домен не поддерживается.

### СУБД PostgreSQL нового инстанса

Если версия Nextcloud в бэкапе отличается от текущей версии инстанса, для нового инстанса + обязательно нужно указать **другую** СУБД PostgreSQL (нельзя восстанавливать бэкап со старой схемой БД поверх БД с более новой схемой).

---

## 7. Выходные параметры

После успешного + создания сервиса платформа возвращает:

### connectionUrl

Адрес для входа в Nextcloud: `https://<домен>`.

### namespace

Namespace в K8s-кластере, в котором развёрнут + сервис.

### Учётные данные (Vault)

В Vault сохраняется пароль администратора (`adminPass`) под логином `admin`.

---

## 8. Пример подключения

Откройте `connectionUrl` + в браузере и авторизуйтесь:

* **Логин:** `admin`
* **Пароль:** значение `adminPass` из блока «Учётные данные» в Vault

---

## 9. Дополнительная информация

### Зависимости

Nextcloud + нельзя создать без уже существующих в том же `resourceRealm` сервисов PostgreSQL (k8s, `sslRequired: false`) и Redis (k8s). При `delete` зависимые СУБД и Redis не трогаются — удаляется только сам Nextcloud.

### + suspend/resume

При `suspend` количество реплик Nextcloud, Collabora и exporter''а метрик принудительно выставляется в `0` через `helm upgrade` (реальное масштабирование, а не просто пауза cron). + При `resume` реплики возвращаются к значению из `clusterConfiguration.replicas`.

### Collabora

Собирается из отдельного `image.repository: nexus-sa.tst.nubes.ru/collabora/code` и включается + только при `appConfiguration.documentServer == ''collabora''`. Доступен на том же домене и том же TLS-сертификате, что и сам Nextcloud, по пути `/collabora`.

### Бэкап/восстановление через Velero

Бэкап/восстановление + файлов идёт через Velero с селектором `backup=-velero-backup` и включает под, PVC и PV — то есть непосредственно файлы `/var/www/html/data`. Восстановление БД в новый инстанс выполняется + штатным механизмом `create` с параметром `instanceUidFrom`, который проставляет `recovery`-джоба автоматически.
' lifecycle: suspendOnDestroyDefault: true adoptExistingOnCreateDefault: false @@ -137,7 +179,7 @@ cfsParams: dataDescriptor: domain: dataType: string - defaultValue: nextcloud-6afmoouq + defaultValue: nextcloud-v9jbyta8 isRequired: true isModifiable: false - svcOperationCfsParamId: 1058 @@ -147,18 +189,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - logLevel: - dataType: string - defaultValue: INFO - isRequired: true - isModifiable: false - valueList: - - DEBUG - - INFO - - WARN - - ERROR - - FATAL - - NONE version: dataType: string defaultValue: 33.0.4 @@ -173,6 +203,18 @@ cfsParams: isModifiable: false valueList: - collabora + logLevel: + dataType: string + defaultValue: INFO + isRequired: true + isModifiable: false + valueList: + - DEBUG + - INFO + - WARN + - ERROR + - FATAL + - NONE - svcOperationCfsParamId: 1077 svcOperationCfsParam: startupConfiguration dataType: map-fixed @@ -192,19 +234,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - replicas: - dataType: integer > 0 - defaultValue: '' - isRequired: true - isModifiable: false - valueList: - - '1' - - '2' - disk: - dataType: integer > 0 - defaultValue: '' - isRequired: true - isModifiable: false cpu: dataType: integer > 0 defaultValue: '' @@ -229,6 +258,19 @@ cfsParams: - '6144' - '7168' - '8192' + replicas: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - '1' + - '2' + disk: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 1060 svcOperationCfsParam: appConfiguration dataType: map-fixed @@ -269,16 +311,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - psqlUid: - dataType: uuid - defaultValue: '' - isRequired: true - isModifiable: false - redisUid: - dataType: uuid - defaultValue: '' - isRequired: true - isModifiable: false resourceRealm: dataType: string defaultValue: k8s-4-ext-nubes-ru @@ -286,16 +318,6 @@ cfsParams: isModifiable: false valueList: - k8s-4-ext-nubes-ru - veleroUid: - dataType: string - defaultValue: '' - isRequired: true - isModifiable: false - recoveryPoint: - dataType: string - defaultValue: '' - isRequired: true - isModifiable: false psqlEnabled: dataType: boolean defaultValue: 'true' @@ -310,6 +332,26 @@ cfsParams: isModifiable: false valueList: - 'true' + recoveryPoint: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false + psqlUid: + dataType: uuid + defaultValue: '' + isRequired: true + isModifiable: false + redisUid: + dataType: uuid + defaultValue: '' + isRequired: true + isModifiable: false + veleroUid: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 1079 svcOperationCfsParam: clusterConfiguration dataType: map-fixed @@ -317,16 +359,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - replicas: - dataType: integer > 0 - defaultValue: 1,2 - isRequired: true - isModifiable: false - disk: - dataType: integer > 0 - defaultValue: '10' - isRequired: true - isModifiable: false cpu: dataType: integer > 0 defaultValue: '' @@ -351,6 +383,16 @@ cfsParams: - '6144' - '7168' - '8192' + replicas: + dataType: integer > 0 + defaultValue: 1,2 + isRequired: true + isModifiable: false + disk: + dataType: integer > 0 + defaultValue: '10' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 1080 svcOperationCfsParam: accessConfiguration dataType: map-fixed @@ -360,7 +402,7 @@ cfsParams: dataDescriptor: domain: dataType: string - defaultValue: nextcloud-ch6fvoz1 + defaultValue: nextcloud-zdaml6i9 isRequired: true isModifiable: false - svcOperationCfsParamId: 1081 @@ -418,5 +460,5 @@ cfsParamsByOp: stateParams: startupConfiguration: '{"resourceRealm": "k8s-4-ext-nubes-ru", "psqlEnabled": true, "redisEnabled": true, "psqlUid": "", "redisUid": ""}' clusterConfiguration: '{"cpu": 1000, "memory": 1024, "replicas": 1, "disk": 10}' - accessConfiguration: '{"domain": "nextcloud-6afmoouq"}' - appConfiguration: '{"logLevel": "INFO", "version": "33.0.4", "documentServer": "collabora"}' + accessConfiguration: '{"domain": "nextcloud-v9jbyta8"}' + appConfiguration: '{"version": "33.0.4", "documentServer": "collabora", "logLevel": "INFO"}' diff --git a/site/services/prod/82_harbor.yaml b/site/services/prod/82_harbor.yaml index 89d1842..5e2bd14 100644 --- a/site/services/prod/82_harbor.yaml +++ b/site/services/prod/82_harbor.yaml @@ -7,7 +7,7 @@ service_man: 'Расширенный реестр для управления Do процесса непрерывной интеграции. Контейнеры идеально подходят для запуска небольших, независимых и легко изменяемых сервисов.
Чтобы начать работу, создайте реестр и загрузите в него Docker-образ
Авторизация: keycloak' lifecycle: - suspendOnDestroyDefault: false + suspendOnDestroyDefault: true adoptExistingOnCreateDefault: false operations: - svcOperationId: 14 @@ -18,6 +18,22 @@ operations: operation: delete kind: instance action: delete +- svcOperationId: 270 + operation: modify + kind: instance + action: modify +- svcOperationId: 405 + operation: reconcile + kind: action + action: reconcile +- svcOperationId: 415 + operation: resume + kind: instance + action: resume +- svcOperationId: 416 + operation: suspend + kind: instance + action: suspend stateOut: {} cfsParams: - svcOperationCfsParamId: 16 @@ -38,26 +54,74 @@ cfsParams: svcOperationCfsParam: resourceCPU dataType: integer > 0 isRequired: true - defaultValue: '100' - isModifiable: false + defaultValue: '1000' + isModifiable: true - svcOperationCfsParamId: 229 svcOperationCfsParam: resourceMemory dataType: integer > 0 isRequired: true - defaultValue: '200' - isModifiable: false + defaultValue: '1024' + isModifiable: true - svcOperationCfsParamId: 230 svcOperationCfsParam: resourceInstances dataType: integer > 0 isRequired: true defaultValue: '1' - isModifiable: false + isModifiable: true - svcOperationCfsParamId: 231 svcOperationCfsParam: s3Uid dataType: uuid - isRequired: true + isRequired: false defaultValue: '' isModifiable: false +- svcOperationCfsParamId: 1126 + svcOperationCfsParam: pvType + dataType: string + isRequired: true + defaultValue: s3 + isModifiable: false + valueList: + - s3 + - local +- svcOperationCfsParamId: 1127 + svcOperationCfsParam: resourceDisk + dataType: integer > 0 + isRequired: false + defaultValue: '5' + isModifiable: true +- svcOperationCfsParamId: 1128 + svcOperationCfsParam: authType + dataType: string + isRequired: true + defaultValue: local + isModifiable: false + valueList: + - local + - keycloak +- svcOperationCfsParamId: 822 + svcOperationCfsParam: resourceInstances + dataType: integer > 0 + isRequired: true + defaultValue: '' + isModifiable: true +- svcOperationCfsParamId: 823 + svcOperationCfsParam: resourceCPU + dataType: integer > 0 + isRequired: false + defaultValue: '' + isModifiable: true +- svcOperationCfsParamId: 824 + svcOperationCfsParam: resourceMemory + dataType: integer > 0 + isRequired: true + defaultValue: '' + isModifiable: true +- svcOperationCfsParamId: 1129 + svcOperationCfsParam: resourceDisk + dataType: integer > 0 + isRequired: false + defaultValue: '' + isModifiable: true cfsParamsByOp: 14: - 16 @@ -66,11 +130,25 @@ cfsParamsByOp: - 229 - 230 - 231 + - 1126 + - 1127 + - 1128 15: [] + 270: + - 822 + - 823 + - 824 + - 1129 + 405: [] + 415: [] + 416: [] stateParams: domain: harbor-1 resourceRealm: k8s-4-ext-nubes-ru - resourceCPU: '100' - resourceMemory: '200' + resourceCPU: '1000' + resourceMemory: '1024' resourceInstances: '1' s3Uid: '' + pvType: s3 + resourceDisk: '5' + authType: local diff --git a/site/services/prod/89_flask.yaml b/site/services/prod/89_flask.yaml index f465e30..f90dbbe 100644 --- a/site/services/prod/89_flask.yaml +++ b/site/services/prod/89_flask.yaml @@ -103,7 +103,7 @@ cfsParams: dataDescriptor: domain: dataType: string - defaultValue: flask-raqv2ud7 + defaultValue: flask-mfcpbrbr isRequired: true isModifiable: false - svcOperationCfsParamId: 1040 @@ -113,13 +113,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - version: - dataType: string - defaultValue: '3.12' - isRequired: true - isModifiable: false - valueList: - - '3.12' gitPath: dataType: string defaultValue: https://github.com/Foxyhhd/Baldurs-Gate-test.git @@ -130,6 +123,13 @@ cfsParams: defaultValue: '' isRequired: false isModifiable: false + version: + dataType: string + defaultValue: '3.12' + isRequired: true + isModifiable: false + valueList: + - '3.12' - svcOperationCfsParamId: 1041 svcOperationCfsParam: jsonEnv dataType: map @@ -170,13 +170,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - version: - dataType: string - defaultValue: '' - isRequired: true - isModifiable: false - valueList: - - '3.12' gitPath: dataType: string defaultValue: '' @@ -187,6 +180,13 @@ cfsParams: defaultValue: '' isRequired: false isModifiable: false + version: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - '3.12' - svcOperationCfsParamId: 1044 svcOperationCfsParam: jsonEnv dataType: map @@ -227,6 +227,6 @@ cfsParamsByOp: stateParams: startupConfiguration: '{"resourceRealm": "k8s-4-ext-nubes-ru"}' clusterConfiguration: '{"cpu": 200, "memory": 256, "replicas": 1}' - accessConfiguration: '{"domain": "flask-raqv2ud7"}' - appConfiguration: '{"version": "3.12", "gitPath": "https://github.com/Foxyhhd/Baldurs-Gate-test.git", "healthPath": ""}' + accessConfiguration: '{"domain": "flask-mfcpbrbr"}' + appConfiguration: '{"gitPath": "https://github.com/Foxyhhd/Baldurs-Gate-test.git", "healthPath": "", "version": "3.12"}' jsonEnv: '{}' diff --git a/site/services/prod/90_postgres.yaml b/site/services/prod/90_postgres.yaml index 8f018f2..e2a4e2c 100644 --- a/site/services/prod/90_postgres.yaml +++ b/site/services/prod/90_postgres.yaml @@ -180,16 +180,10 @@ cfsParams: isRequired: true isModifiable: false valueList: + - '18' - '17' - '16' - sslRequired: - dataType: boolean - defaultValue: 'true' - isRequired: true - isModifiable: false - valueList: - - 'false' - - 'true' + - '15' poolerMaster: dataType: boolean defaultValue: 'false' @@ -206,25 +200,41 @@ cfsParams: valueList: - 'false' - 'true' + sslRequired: + dataType: boolean + defaultValue: 'true' + isRequired: true + isModifiable: false + valueList: + - 'true' + - 'false' - svcOperationCfsParamId: 792 svcOperationCfsParam: postgresConf - dataType: array-map-fixed + dataType: map-fixed isRequired: false defaultValue: '' isModifiable: true dataDescriptor: - paramName: + log_disconnections: dataType: string - defaultValue: '' - isRequired: true + defaultValue: 'off' + isRequired: false isModifiable: false valueList: - - log_connections - - log_disconnections - paramValue: + - 'off' + - 'on' + log_connections: dataType: string - defaultValue: '' - isRequired: true + defaultValue: 'off' + isRequired: false + isModifiable: false + valueList: + - 'off' + - 'on' + max_connections: + dataType: integer > 0 + defaultValue: '100' + isRequired: false isModifiable: false - svcOperationCfsParamId: 793 svcOperationCfsParam: backupConfiguration @@ -234,9 +244,9 @@ cfsParams: isModifiable: true dataDescriptor: s3Uid: - dataType: uuid - defaultValue: '' - isRequired: true + dataType: string + defaultValue: 00000000-0000-0000-0000-000000000000 + isRequired: false isModifiable: false retain: dataType: integer > 0 @@ -248,6 +258,11 @@ cfsParams: defaultValue: 0 0 * * * isRequired: true isModifiable: false + incrementCount: + dataType: integer >= 0 + defaultValue: '0' + isRequired: false + isModifiable: false - svcOperationCfsParamId: 794 svcOperationCfsParam: autoscaleConfiguration dataType: map-fixed @@ -310,7 +325,7 @@ cfsParams: isModifiable: false durationServer: dataType: integer > 0 - defaultValue: '87600' + defaultValue: '43800' isRequired: true isModifiable: false certCA: @@ -446,20 +461,13 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - poolerSlave: - dataType: boolean - defaultValue: '' - isRequired: true - isModifiable: false - valueList: - - 'false' - - 'true' version: dataType: string defaultValue: '' isRequired: true isModifiable: false valueList: + - '18' - '17' - '16' sslRequired: @@ -475,25 +483,41 @@ cfsParams: valueList: - 'false' - 'true' -- svcOperationCfsParamId: 798 - svcOperationCfsParam: postgresConf - dataType: array-map-fixed - isRequired: false - defaultValue: '' - isModifiable: true - dataDescriptor: - paramName: - dataType: string + poolerSlave: + dataType: boolean defaultValue: '' isRequired: true isModifiable: false valueList: - - log_connections - - log_disconnections - paramValue: + - 'false' + - 'true' +- svcOperationCfsParamId: 798 + svcOperationCfsParam: postgresConf + dataType: map-fixed + isRequired: false + defaultValue: '' + isModifiable: true + dataDescriptor: + log_connections: dataType: string defaultValue: '' - isRequired: true + isRequired: false + isModifiable: false + valueList: + - 'off' + - 'on' + log_disconnections: + dataType: string + defaultValue: '' + isRequired: false + isModifiable: false + valueList: + - 'off' + - 'on' + max_connections: + dataType: integer > 0 + defaultValue: '' + isRequired: false isModifiable: false - svcOperationCfsParamId: 799 svcOperationCfsParam: backupConfiguration @@ -502,11 +526,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - s3Uid: - dataType: uuid - defaultValue: '' - isRequired: true - isModifiable: false retain: dataType: integer > 0 defaultValue: '' @@ -517,6 +536,16 @@ cfsParams: defaultValue: 0 0 * * * isRequired: true isModifiable: false + s3Uid: + dataType: uuid + defaultValue: '' + isRequired: true + isModifiable: false + incrementCount: + dataType: integer >= 0 + defaultValue: '' + isRequired: false + isModifiable: false - svcOperationCfsParamId: 800 svcOperationCfsParam: autoscaleConfiguration dataType: map-fixed @@ -719,23 +748,31 @@ cfsParams: - 'true' - svcOperationCfsParamId: 805 svcOperationCfsParam: postgresConf - dataType: array-map-fixed + dataType: map-fixed isRequired: false defaultValue: '' isModifiable: true dataDescriptor: - paramName: + log_connections: dataType: string defaultValue: '' - isRequired: true + isRequired: false isModifiable: false valueList: - - log_connections - - log_disconnections - paramValue: + - 'off' + - 'on' + log_disconnections: dataType: string defaultValue: '' - isRequired: true + isRequired: false + isModifiable: false + valueList: + - 'off' + - 'on' + max_connections: + dataType: integer > 0 + defaultValue: '' + isRequired: false isModifiable: false - svcOperationCfsParamId: 806 svcOperationCfsParam: backupConfiguration @@ -759,6 +796,11 @@ cfsParams: defaultValue: 0 0 * * * isRequired: true isModifiable: false + incrementCount: + dataType: integer >= 0 + defaultValue: '' + isRequired: false + isModifiable: false - svcOperationCfsParamId: 807 svcOperationCfsParam: autoscaleConfiguration dataType: map-fixed @@ -798,6 +840,32 @@ cfsParams: - '10' - '15' - '20' +- svcOperationCfsParamId: 1106 + svcOperationCfsParam: mtlsConfiguration + dataType: map-fixed + isRequired: true + defaultValue: '' + isModifiable: true + dataDescriptor: + type: + dataType: string + defaultValue: 'off' + isRequired: true + isModifiable: false + valueList: + - 'off' + - manual + - auto + durationCA: + dataType: integer > 0 + defaultValue: '175200' + isRequired: true + isModifiable: false + durationServer: + dataType: integer > 0 + defaultValue: '87600' + isRequired: true + isModifiable: false cfsParamsByOp: 19: - 788 @@ -839,6 +907,7 @@ cfsParamsByOp: - 805 - 806 - 807 + - 1106 54: [] 114: [] 115: [] @@ -846,8 +915,8 @@ stateParams: clusterConfiguration: '{"cpu": 500, "memory": 512, "replicas": 1, "disk": 10}' startupConfiguration: '{"resourceRealm": "k8s-4-ext-nubes-ru"}' accessConfiguration: '{"masterIpSpace": "", "masterAccessList": "[]", "slaveIpSpace": "", "slaveAccessList": "[]"}' - postgresConfiguration: '{"version": "17", "sslRequired": true, "poolerMaster": false, "poolerSlave": false}' - postgresConf: '{"paramName": "", "paramValue": ""}' - backupConfiguration: '{"s3Uid": "", "retain": 7, "schedule": "0 0 * * *"}' + postgresConfiguration: '{"version": "17", "poolerMaster": false, "poolerSlave": false, "sslRequired": true}' + postgresConf: '{"log_disconnections": "off", "log_connections": "off", "max_connections": 100}' + backupConfiguration: '{"s3Uid": "00000000-0000-0000-0000-000000000000", "retain": 7, "schedule": "0 0 * * *", "incrementCount": 0}' autoscaleConfiguration: '{"enabled": false, "schedule": 0, "quota": 100, "percent": 10}' - mtlsConfiguration: '{"type": "off", "durationCA": 175200, "durationServer": 87600, "certCA": "", "certServer": ""}' + mtlsConfiguration: '{"type": "off", "durationCA": 175200, "durationServer": 43800, "certCA": "", "certServer": ""}' diff --git a/site/services/prod/91_redis.yaml b/site/services/prod/91_redis.yaml index f9d93b3..bddf9d2 100644 --- a/site/services/prod/91_redis.yaml +++ b/site/services/prod/91_redis.yaml @@ -86,16 +86,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - slaveIpSpace: - dataType: string - defaultValue: '' - isRequired: true - isModifiable: false - slaveAccessList: - dataType: json - defaultValue: '[]' - isRequired: true - isModifiable: false masterIpSpace: dataType: string defaultValue: '' @@ -106,6 +96,16 @@ cfsParams: defaultValue: '[]' isRequired: true isModifiable: false + slaveIpSpace: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false + slaveAccessList: + dataType: json + defaultValue: '[]' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 1064 svcOperationCfsParam: clusterConfiguration dataType: map-fixed @@ -113,6 +113,11 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: + cpu: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false memory: dataType: integer > 0 defaultValue: '' @@ -133,11 +138,6 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false - cpu: - dataType: integer > 0 - defaultValue: '' - isRequired: true - isModifiable: false - svcOperationCfsParamId: 1065 svcOperationCfsParam: accessConfiguration dataType: map-fixed @@ -145,11 +145,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - slaveAccessList: - dataType: json - defaultValue: '' - isRequired: true - isModifiable: false masterIpSpace: dataType: string defaultValue: '' @@ -165,6 +160,11 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false + slaveAccessList: + dataType: json + defaultValue: '' + isRequired: true + isModifiable: false cfsParamsByOp: 21: - 1061 @@ -180,4 +180,4 @@ cfsParamsByOp: stateParams: startupConfiguration: '{"resourceRealm": "k8s-4-ext-nubes-ru"}' clusterConfiguration: '{"cpu": 500, "memory": 512, "replicas": 1, "disk": 10}' - accessConfiguration: '{"slaveIpSpace": "", "slaveAccessList": "[]", "masterIpSpace": "", "masterAccessList": "[]"}' + accessConfiguration: '{"masterIpSpace": "", "masterAccessList": "[]", "slaveIpSpace": "", "slaveAccessList": "[]"}' diff --git a/site/services/prod/92_mongodb.yaml b/site/services/prod/92_mongodb.yaml index 9fe3df0..708e3ad 100644 --- a/site/services/prod/92_mongodb.yaml +++ b/site/services/prod/92_mongodb.yaml @@ -3,34 +3,65 @@ service_id: 92 service_display_name: MongoDB service_short_name: mongodb service_man: '# Инструкция по развертыванию MongoDB через платформу

## 1. Общая информация

MongoDB — документоориентированная распределённая база данных, обеспечивающая высокую доступность, - горизонтальное масштабирование и гибкую модель хранения.

### Доступные операции с кластером

* **create** — создание базы
* **delete** — удаление базы данных
* **suspend** — - остановка базы данных
* **resume** — запуск базы данных
* **modify** — изменение базы данных

### Доступные операции с пользователями

* **create_user** — создание пользователя
* - **modify_user** — модификация пользователя
* **delete_user** — удаление пользователя

---

## 2. Параметры развертывания базы данных

Эти параметры необходимо указать при создании - базы данных.

### Платформа для развертывания

Среда, в которой будет развернут кластер. Выбирается из предложенного списка.

### Количество узлов

Количество реплик в - кластере MongoDB.
Оптимально выбирать нечётное значение, так как это обеспечивает корректный процесс выбора ведущего узла и сохраняет работоспособность базы данных даже при отказе одной из нод.

> - **Примечание:** уменьшение количества узлов после создания кластера не рекомендуется.

### Квота памяти пода (MB)

Объём памяти для одного пода в мегабайтах.
Пример: `2048`

### - Квота CPU пода (mCPU)

CPU-квота для пода в миликорах (1000 mCPU = 1 vCPU).
Пример: `1000`

### Размер диска для базы данных (GB)

Объём диска для хранения данных в гигабайтах.
Пример: - `20`

### Имя ipSpace для публикации внешнего IP

Имя ipSpace, через который будет выделен внешний IP для доступа к master-узлу.
Укажите `no-needed`, если внешний адрес не требуется.
Пример: - `internet-no-antiddos-v1`

### Список разрешённых IP-адресов

Список IP-адресов или подсетей, с которых разрешён доступ к кластеру.
Если оставить пустым — доступ открыт для всех источников.
Пример: - `["10.0.0.0/24", "192.168.1.10/32"]`

---

## 3. Параметры модификации базы данных

Все параметры, которые вы указываете при модификации, являются необязательными — система автоматически - подставит ранее сохранённые значения, и при необходимости вы можете изменить их на нужные.

### Количество узлов

Количество реплик в кластере MongoDB.
Оптимально выбирать нечётное - значение, так как это обеспечивает корректный процесс выбора ведущего узла и сохраняет работоспособность базы данных даже при отказе одной из нод.

> **Примечание:** уменьшение количества узлов - после создания кластера не рекомендуется.

### Квота памяти пода (MB)

Объём памяти для одного пода в мегабайтах.
Пример: `2048`

### Квота CPU пода (mCPU)

CPU-квота + горизонтальное масштабирование и гибкую модель хранения.

### Доступные операции с кластером

* **create** — создание базы
* **delete** — удаление базы данных
* + **suspend** — остановка базы данных
* **resume** — запуск базы данных
* **modify** — изменение базы данных
* **create_backup** — создание бэкапа вручную
* **delete_backup** — + удаление бэкапов
* **rollback** — восстановление кластера из бэкапа

### Доступные операции с пользователями

* **create_user** — создание пользователя
* **modify_user** + — модификация пользователя
* **delete_user** — удаление пользователя

---

## 2. Параметры создания базы данных

Эти параметры необходимо указать при создании базы данных.

### + Платформа для развертывания

Среда, в которой будет развёрнут кластер. Выбирается из предложенного списка.

### Количество узлов

Количество реплик в кластере MongoDB.
Оптимально + выбирать нечётное значение, так как это обеспечивает корректный процесс выбора ведущего узла и сохраняет работоспособность базы данных даже при отказе одной из нод.

> **Примечание:** уменьшение + количества узлов после создания кластера не рекомендуется.

### Квота памяти пода (MB)

Объём памяти для одного пода в мегабайтах.
Пример: `2048`

### Квота CPU пода (mCPU)

CPU-квота + для пода в миликорах (1000 mCPU = 1 vCPU).
Пример: `1000`

### Размер диска для базы данных (GB)

Объём диска для хранения данных в гигабайтах.
Пример: `20`

### Расписание + резервного копирования

Cron-выражение (5 полей), по которому автоматически создаются резервные копии.
Пример: `0 0 * * *` (каждый день в 00:00)

### Хранить последних бэкапов

Сколько + последних успешных резервных копий хранить — более старые удаляются автоматически.
Пример: `7`

> **Примечание:** ротация применяется только к бэкапам, созданным по расписанию. Бэкапы,
> + созданные вручную операцией `create_backup`, в неё не входят и не удаляются автоматически —
> их нужно убирать вручную через `delete_backup`.

### Имя ipSpace для публикации внешнего IP

Имя + ipSpace, через который будет выделен внешний IP для доступа к master-узлу.
Укажите `no-needed`, если внешний адрес не требуется.
Пример: `internet-no-antiddos-v1`

### Список разрешённых + IP-адресов

Список IP-адресов или подсетей, с которых разрешён доступ к кластеру.
Если оставить пустым — доступ открыт для всех источников.
Пример: `["10.0.0.0/24", "192.168.1.10/32"]`

### + Включить TLS

Булевый параметр. Определяет режим работы TLS кластера.

- `true` — TLS включён (`tls.mode: allowTLS`). Сертификаты сохраняются в Vault.
- `false` — TLS выключен (`tls.mode: + disabled`).

По умолчанию: `false`.

---

## 3. Параметры модификации базы данных

Все параметры, которые вы указываете при модификации, являются необязательными — система + автоматически подставит ранее сохранённые значения, и при необходимости вы можете изменить их на нужные.

### Количество узлов

Количество реплик в кластере MongoDB.
Оптимально выбирать + нечётное значение, так как это обеспечивает корректный процесс выбора ведущего узла и сохраняет работоспособность базы данных даже при отказе одной из нод.

> **Примечание:** уменьшение количества + узлов после создания кластера не рекомендуется.

### Квота памяти пода (MB)

Объём памяти для одного пода в мегабайтах.
Пример: `2048`

### Квота CPU пода (mCPU)

CPU-квота для пода в миликорах (1000 mCPU = 1 vCPU).
Пример: `1000`

### Размер диска для базы данных (GB)

Объём диска для хранения данных указывается в гигабайтах. Его можно увеличить при - необходимости, однако уменьшить уже выделенный размер невозможно.
Пример: `20`

### Имя ipSpace для публикации внешнего IP

Имя ipSpace, через который будет выделен внешний IP для - доступа к master-узлу.
Укажите `no-needed`, если внешний адрес не требуется.
Пример: `internet-no-antiddos-v1`

### Список разрешённых IP-адресов

Список IP-адресов или подсетей, - с которых разрешён доступ к кластеру.
Если оставить пустым — доступ открыт для всех источников.
Пример: `["10.0.0.0/24", "192.168.1.10/32"]`

---

## 3. Параметры создания пользователя

### - Имя пользователя

Указывается имя пользователя (любой регистр).
Пример: `readApp`

### Имя базы данных

Название базы, в которой будет создан пользователь.
Если база отсутствует, - она будет создана автоматически.
Пример: `Apps_9392`

### Имя роли

* **read** — доступ только на чтение
* **readWrite** — чтение и изменение данных
* **dbOwner** — полный - контроль над базой данных

---

## 4. Параметры модификации пользователя

### Имя пользователя

Необходимо выбрать существующего пользователя.
Если список пуст, требуется - предварительно создать пользователя.

### Имя базы данных

База данных, к которой относится пользователь.
Если база отсутствует, она будет создана автоматически.
Пример: `Apps_9392`

### - Имя роли

* **read**
* **readWrite**
* **dbOwner**

---

## 5. Параметры удаления пользователя

### Имя пользователя

Выберите пользователя из списка для - удаления.

---

## 6. Выходные параметры

После успешного развертывания базы данных платформа возвращает ключевые параметры.

### internalConnect

Внутренний эндпоинт - для подключения к кластеру из сервисов, работающих в той же сети.
Используется для внутренних интеграций и системных сервисов.

### externalConnect

Внешний FQDN для подключения к - кластеру извне.
Порт подключения — **27017**.

---

## 7. Пример подключения

Перед подключением необходимо установить **mongosh**.

Команда подключения к базе данных:

```
mongosh - "mongodb://:@:27017/"
```

Где:

* `` — имя пользователя
* `` — пароль
* `` — internalConnect или - externalConnect
* `` — имя базы данных

## 8. Дополнительная информация

Сейчас соединение с базой работает без шифрования, и доступ к кластеру осуществляется только по логину - и паролю.' + необходимости, однако уменьшить уже выделенный размер невозможно.
Пример: `20`

### Расписание резервного копирования

Cron-выражение (5 полей), по которому автоматически создаются + резервные копии.
Пример: `0 0 * * *` (каждый день в 00:00)

### Хранить последних бэкапов

Сколько последних успешных резервных копий хранить — более старые удаляются автоматически.
Пример: + `7`

> **Примечание:** ротация применяется только к бэкапам, созданным по расписанию. Бэкапы,
> созданные вручную операцией `create_backup`, в неё не входят и не удаляются автоматически —
> + их нужно убирать вручную через `delete_backup`.

### Имя ipSpace для публикации внешнего IP

Имя ipSpace, через который будет выделен внешний IP для доступа к master-узлу.
Укажите + `no-needed`, если внешний адрес не требуется.
Пример: `internet-no-antiddos-v1`

### Список разрешённых IP-адресов

Список IP-адресов или подсетей, с которых разрешён доступ к кластеру.
Если + оставить пустым — доступ открыт для всех источников.
Пример: `["10.0.0.0/24", "192.168.1.10/32"]`

---

## 4. Параметры удаления базы данных

### Удалить бакет S3 с бэкапами

Булевый + параметр.

- `true` — вместе с кластером также будут удалены все резервные копии и бакет S3.
- `false` — бакет S3 и хранящиеся в нём бэкапы сохраняются после удаления кластера.

По + умолчанию: `false`.

---

## 5. Параметры создания бэкапа

### Имя бэкапа

Имя резервной копии, которое будет присвоено объекту бэкапа в кластере.
Должно соответствовать + требованиям Kubernetes к именам объектов (строчные буквы, цифры, дефисы).
Пример: `manual-20260904`

> **Примечание:** такой бэкап не участвует в автоматической ротации по параметру
> + "Хранить последних бэкапов" (она применяется только к бэкапам по расписанию) и не удаляется
> сам — при необходимости убрать его нужно вручную операцией `delete_backup`.

---

## 6. + Параметры восстановления из бэкапа

### Имя бэкапа

Имя существующей резервной копии кластера, из которой будет выполнено восстановление. Указывается один из бэкапов в состоянии `ready` + (созданных автоматически по расписанию или вручную через операцию create_backup).

---

## 7. Параметры удаления бэкапов

### Имена бэкапов

Список имён резервных копий + для удаления.
Пример: `["manual-20260904", "cron-mongok8s-...-20260903020000"]`

---

## 8. Параметры создания пользователя

### Имя пользователя

Указывается имя пользователя + (любой регистр).
Пример: `readApp`

> **Примечание:** имя пользователя должно быть уникальным в рамках кластера. Если пользователь
> с таким именем уже существует, операция завершится + ошибкой — используйте `modify_user` для
> изменения прав или `delete_user` + `create_user` для пересоздания.

### Имя базы данных

Название базы, в которой будет создан пользователь.
Если + база отсутствует, она будет создана автоматически.
Пример: `Apps_9392`

### Имя роли

* **read** — доступ только на чтение
* **readWrite** — чтение и изменение данных
* **dbOwner** + — полный контроль над базой данных
* **dbAdmin** — администрирование базы данных (индексы, статистика, схема) без доступа к чтению/записи данных

---

## 9. Параметры модификации пользователя

### + Имя пользователя

Необходимо выбрать существующего пользователя.
Если список пуст, требуется предварительно создать пользователя.

### Имя базы данных

База данных, к которой + относится пользователь.
Если база отсутствует, она будет создана автоматически.
Пример: `Apps_9392`

### Имя роли

* **read**
* **readWrite**
* **dbOwner**
* **dbAdmin**

---

## + 10. Параметры удаления пользователя

### Имя пользователя

Выберите пользователя из списка для удаления.

---

## 11. Выходные параметры

После успешного развертывания + базы данных платформа возвращает ключевые параметры.

### internalConnect

Внутренний эндпоинт для подключения к кластеру из сервисов, работающих в той же сети.
Используется для внутренних + интеграций и системных сервисов.

### externalConnect

Внешний FQDN для подключения к кластеру извне.
Порт подключения — **27017**.

> **Важно:** оба эндпоинта — это Kubernetes + Service на весь replset, а не адрес конкретно
> primary-узла. Kubernetes не отслеживает, кто из узлов сейчас primary, поэтому новое
> подключение без параметра `replicaSet` может попасть на secondary + и упасть с ошибкой записи
> `not writable primary`. Обязательно указывайте `replicaSet=rs0` в строке подключения (см.
> примеры ниже) — тогда драйвер сам обнаружит топологию кластера и всегда + направит запись на
> актуальный primary, независимо от количества реплик и от того, происходили ли выборы.

---

## 12. Пример подключения

Перед подключением необходимо установить + **mongosh**.

### 12.1 Подключение без TLS

Для внутреннего подключения из той же сети:

```
mongosh "mongodb://:@:27017/?authSource=admin&replicaSet=rs0"
```

### + 12.2 Подключение через внешний endpoint с TLS

Кластер требует клиентский TLS-сертификат (mutual TLS). Сертификаты сохраняются в Vault при создании кластера в блоке `cer` в полях `ca`, `cer`, + `key` в кодировке base64.

Подготовка файлов:

```bash
# Декодировать сертификаты из Vault
echo "" | base64 -d > ca.crt
echo " tls.crt
echo "" | base64 -d > tls.key

# Собрать клиентский PEM
cat tls.key tls.crt > client.pem
```

Подключение:

```
mongosh + "mongodb://:@:27017/?tls=true&tlsCAFile=ca.crt&tlsCertificateKeyFile=client.pem&authSource=admin&replicaSet=rs0"
```

Где:

* `` + — имя пользователя
* `` — пароль
* `` — internalConnect (для подключения без TLS)
* `` — externalConnect (для внешнего подключения с TLS)
* + `` — имя базы данных

## 13. Дополнительная информация

Режим TLS задаётся параметром `mongoConfiguration.tls` только при создании кластера.
После создания изменение TLS через + модификацию не поддерживается.

- При `true` кластер разворачивается с включённым TLS (`tls.mode: allowTLS`). Сервер принимает как обычные, так и TLS-соединения.
- При `false` TLS выключен + (`tls.mode: disabled`).

Для внешнего подключения (`externalConnect`) используется сертификат, выпущенный через cert-manager, с SAN, покрывающим внешний DNS-адрес кластера — поэтому `tlsAllowInvalidHostnames` + не требуется, хост проверяется как обычно.

Внутренние подключения TLS-сертификат не используют вообще: режим `allowTLS` допускает как TLS, так и обычные соединения, но для внутреннего трафика + применяется обычное (не TLS) подключение — см. пример 12.1.

### Почему обязателен `replicaSet=rs0` в строке подключения

Percona-оператор не проставляет на поды никакого динамического + лейбла роли (primary/secondary) —
у всех подов replset''а полностью одинаковые лейблы, различается только имя/индекс пода.
`master`-сервис — это обычный Kubernetes Service с фиксированным селектором + на весь replset, он
не знает и не может знать, какой под сейчас primary: k8s просто раздаёт новые TCP-подключения
по кругу между всеми узлами. Без `replicaSet=rs0` в URI подключение может закрепиться + на
secondary, и любая попытка записи будет падать с `not writable primary` — независимо от того,
происходили выборы недавно или нет. Указание `replicaSet=rs0` включает у драйвера обнаружение
топологии + реплики, и он сам направляет запись на актуальный primary при любом количестве узлов
и после любых переизбраний.
' lifecycle: suspendOnDestroyDefault: true adoptExistingOnCreateDefault: false @@ -39,6 +70,10 @@ operations: operation: create kind: instance action: create +- svcOperationId: 411 + operation: create_backup + kind: subresource + action: create - svcOperationId: 198 operation: create_user kind: subresource @@ -47,6 +82,10 @@ operations: operation: delete kind: instance action: delete +- svcOperationId: 414 + operation: delete_backup + kind: subresource + action: delete - svcOperationId: 199 operation: delete_user kind: subresource @@ -67,11 +106,16 @@ operations: operation: resume kind: instance action: resume +- svcOperationId: 413 + operation: rollback + kind: action + action: rollback - svcOperationId: 194 operation: suspend kind: instance action: suspend stateOut: + backups: {} users: {} cfsParams: - svcOperationCfsParamId: 1089 @@ -95,6 +139,16 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: + cpu: + dataType: integer > 0 + defaultValue: '1000' + isRequired: true + isModifiable: false + memory: + dataType: integer > 0 + defaultValue: '1024' + isRequired: true + isModifiable: false replicas: dataType: integer > 0 defaultValue: '1' @@ -110,16 +164,6 @@ cfsParams: defaultValue: '5' isRequired: true isModifiable: false - cpu: - dataType: integer > 0 - defaultValue: '1000' - isRequired: true - isModifiable: false - memory: - dataType: integer > 0 - defaultValue: '1024' - isRequired: true - isModifiable: false - svcOperationCfsParamId: 1091 svcOperationCfsParam: accessConfiguration dataType: map-fixed @@ -137,6 +181,49 @@ cfsParams: defaultValue: '[]' isRequired: true isModifiable: false +- svcOperationCfsParamId: 1102 + svcOperationCfsParam: backupConfiguration + dataType: map-fixed + isRequired: true + defaultValue: '' + isModifiable: true + dataDescriptor: + s3Uid: + dataType: uuid + defaultValue: '' + isRequired: true + isModifiable: false + retain: + dataType: integer > 0 + defaultValue: '7' + isRequired: true + isModifiable: false + schedule: + dataType: string + defaultValue: 0 0 * * * + isRequired: true + isModifiable: false +- svcOperationCfsParamId: 1116 + svcOperationCfsParam: mongoConfiguration + dataType: map-fixed + isRequired: true + defaultValue: '' + isModifiable: false + dataDescriptor: + tls: + dataType: boolean + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - 'true' + - 'false' +- svcOperationCfsParamId: 1109 + svcOperationCfsParam: backupName + dataType: string + isRequired: true + defaultValue: '' + isModifiable: false - svcOperationCfsParamId: 635 svcOperationCfsParam: username dataType: string @@ -156,12 +243,28 @@ cfsParams: defaultValue: '' isModifiable: false valueList: - - dbOwner - read - readWrite + - dbAdmin + - dbOwner +- svcOperationCfsParamId: 1103 + svcOperationCfsParam: deleteS3Bucket + dataType: boolean + isRequired: true + defaultValue: 'true' + isModifiable: true + valueList: + - 'false' + - 'true' +- svcOperationCfsParamId: 1111 + svcOperationCfsParam: backupName + dataType: array + isRequired: true + defaultValue: '' + isModifiable: true - svcOperationCfsParamId: 644 svcOperationCfsParam: username - dataType: string + dataType: array isRequired: true defaultValue: '' isModifiable: true @@ -214,6 +317,23 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false +- svcOperationCfsParamId: 1104 + svcOperationCfsParam: backupConfiguration + dataType: map-fixed + isRequired: true + defaultValue: '' + isModifiable: true + dataDescriptor: + retain: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false + schedule: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 640 svcOperationCfsParam: username dataType: string @@ -233,32 +353,51 @@ cfsParams: defaultValue: '' isModifiable: true valueList: - - dbOwner - read - readWrite + - dbAdmin + - dbOwner +- svcOperationCfsParamId: 1108 + svcOperationCfsParam: backupName + dataType: string + isRequired: true + defaultValue: '' + isModifiable: true cfsParamsByOp: 37: - 1089 - 1090 - 1091 + - 1102 + - 1116 + 411: + - 1109 198: - 635 - 636 - 643 - 190: [] + 190: + - 1103 + 414: + - 1111 199: - 644 201: - 1092 - 1093 + - 1104 200: - 640 - 641 - 642 409: [] 196: [] + 413: + - 1108 194: [] stateParams: startupConfiguration: '{"resourceRealm": "k8s-4-ext-nubes-ru"}' - clusterConfiguration: '{"replicas": 1, "disk": 5, "cpu": 1000, "memory": 1024}' + clusterConfiguration: '{"cpu": 1000, "memory": 1024, "replicas": 1, "disk": 5}' accessConfiguration: '{"masterIpSpace": "", "masterAccessList": "[]"}' + backupConfiguration: '{"s3Uid": "", "retain": 7, "schedule": "0 0 * * *"}' + mongoConfiguration: '{"tls": false}' diff --git a/site/services/prod/93_rabbitmq.yaml b/site/services/prod/93_rabbitmq.yaml index 394255f..b371106 100644 --- a/site/services/prod/93_rabbitmq.yaml +++ b/site/services/prod/93_rabbitmq.yaml @@ -49,6 +49,10 @@ operations: operation: modify kind: instance action: modify +- svcOperationId: 410 + operation: reconcile + kind: action + action: reconcile - svcOperationId: 117 operation: resume kind: instance @@ -59,116 +63,158 @@ operations: action: suspend stateOut: {} cfsParams: -- svcOperationCfsParamId: 116 - svcOperationCfsParam: resourceCPU - dataType: integer > 0 +- svcOperationCfsParamId: 1097 + svcOperationCfsParam: startupConfiguration + dataType: map-fixed isRequired: true - defaultValue: '1000' - isModifiable: true -- svcOperationCfsParamId: 117 - svcOperationCfsParam: resourceMemory - dataType: integer > 0 - isRequired: true - defaultValue: '1124' - isModifiable: true -- svcOperationCfsParamId: 118 - svcOperationCfsParam: resourceDisk - dataType: integer > 0 - isRequired: true - defaultValue: '30' - isModifiable: true -- svcOperationCfsParamId: 119 - svcOperationCfsParam: resourceRealm - dataType: string - isRequired: true - defaultValue: k8s-4-ext-nubes-ru + defaultValue: '' isModifiable: false - valueList: - - k8s-4-ext-nubes-ru -- svcOperationCfsParamId: 224 - svcOperationCfsParam: resourceInstances - dataType: integer > 0 - isRequired: true - defaultValue: '1' - isModifiable: true -- svcOperationCfsParamId: 225 - svcOperationCfsParam: needExternalAddressMaster - dataType: boolean - isRequired: true - defaultValue: 'false' - isModifiable: true - valueList: - - 'false' - - 'true' -- svcOperationCfsParamId: 543 - svcOperationCfsParam: ipSpaceNameMaster - dataType: string - isRequired: false - defaultValue: '' - isModifiable: true -- svcOperationCfsParamId: 304 - svcOperationCfsParam: resourceCPU - dataType: integer > 0 + dataDescriptor: + resourceRealm: + dataType: string + defaultValue: k8s-4-ext-nubes-ru + isRequired: true + isModifiable: false + valueList: + - k8s-4-ext-nubes-ru +- svcOperationCfsParamId: 1098 + svcOperationCfsParam: clusterConfiguration + dataType: map-fixed isRequired: true defaultValue: '' isModifiable: true -- svcOperationCfsParamId: 305 - svcOperationCfsParam: resourceMemory - dataType: integer > 0 + dataDescriptor: + cpu: + dataType: integer > 0 + defaultValue: '1000' + isRequired: true + isModifiable: false + memory: + dataType: integer > 0 + defaultValue: '1024' + isRequired: true + isModifiable: false + replicas: + dataType: integer > 0 + defaultValue: '1' + isRequired: true + isModifiable: false + valueList: + - '1' + - '3' + - '5' + - '7' + disk: + dataType: integer > 0 + defaultValue: '5' + isRequired: true + isModifiable: false +- svcOperationCfsParamId: 1099 + svcOperationCfsParam: accessConfiguration + dataType: map-fixed isRequired: true defaultValue: '' isModifiable: true -- svcOperationCfsParamId: 306 - svcOperationCfsParam: resourceDisk - dataType: integer > 0 + dataDescriptor: + masterIpSpace: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false + masterAccessList: + dataType: json + defaultValue: '[]' + isRequired: true + isModifiable: false +- svcOperationCfsParamId: 1113 + svcOperationCfsParam: mqConfiguration + dataType: map-fixed isRequired: true defaultValue: '' isModifiable: true -- svcOperationCfsParamId: 307 - svcOperationCfsParam: resourceInstances - dataType: integer > 0 + dataDescriptor: + maxMessageSize: + dataType: integer > 0 + defaultValue: '4' + isRequired: true + isModifiable: false +- svcOperationCfsParamId: 1100 + svcOperationCfsParam: clusterConfiguration + dataType: map-fixed isRequired: true defaultValue: '' isModifiable: true -- svcOperationCfsParamId: 308 - svcOperationCfsParam: needExternalAddressMaster - dataType: boolean + dataDescriptor: + cpu: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false + memory: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false + replicas: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - '1' + - '3' + - '5' + - '7' + disk: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false +- svcOperationCfsParamId: 1101 + svcOperationCfsParam: accessConfiguration + dataType: map-fixed isRequired: true defaultValue: '' isModifiable: true - valueList: - - 'false' - - 'true' -- svcOperationCfsParamId: 545 - svcOperationCfsParam: ipSpaceNameMaster - dataType: string - isRequired: false + dataDescriptor: + masterIpSpace: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false + masterAccessList: + dataType: json + defaultValue: '' + isRequired: true + isModifiable: false +- svcOperationCfsParamId: 1114 + svcOperationCfsParam: mqConfiguration + dataType: map-fixed + isRequired: true defaultValue: '' isModifiable: true + dataDescriptor: + maxMessageSize: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false cfsParamsByOp: 38: - - 116 - - 117 - - 118 - - 119 - - 224 - - 225 - - 543 + - 1097 + - 1098 + - 1099 + - 1113 39: [] 106: - - 304 - - 305 - - 306 - - 307 - - 308 - - 545 + - 1100 + - 1101 + - 1114 + 410: [] 117: [] 116: [] stateParams: - resourceCPU: '1000' - resourceMemory: '1124' - resourceDisk: '30' - resourceRealm: k8s-4-ext-nubes-ru - resourceInstances: '1' - needExternalAddressMaster: 'false' - ipSpaceNameMaster: '' + startupConfiguration: '{"resourceRealm": "k8s-4-ext-nubes-ru"}' + clusterConfiguration: '{"cpu": 1000, "memory": 1024, "replicas": 1, "disk": 5}' + accessConfiguration: '{"masterIpSpace": "", "masterAccessList": "[]"}' + mqConfiguration: '{"maxMessageSize": 4}' diff --git a/site/services/prod/94_lucee.yaml b/site/services/prod/94_lucee.yaml index 48d113c..662d304 100644 --- a/site/services/prod/94_lucee.yaml +++ b/site/services/prod/94_lucee.yaml @@ -61,16 +61,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - replicas: - dataType: integer > 0 - defaultValue: '1' - isRequired: true - isModifiable: false - valueList: - - '1' - - '3' - - '5' - - '7' cpu: dataType: string defaultValue: '200' @@ -81,6 +71,16 @@ cfsParams: defaultValue: '256' isRequired: true isModifiable: false + replicas: + dataType: integer > 0 + defaultValue: '1' + isRequired: true + isModifiable: false + valueList: + - '1' + - '3' + - '5' + - '7' - svcOperationCfsParamId: 1021 svcOperationCfsParam: accessConfiguration dataType: map-fixed @@ -90,7 +90,7 @@ cfsParams: dataDescriptor: domain: dataType: string - defaultValue: lucee-w8upcmma + defaultValue: lucee-gg7haavy isRequired: true isModifiable: false - svcOperationCfsParamId: 1022 @@ -131,16 +131,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - replicas: - dataType: integer > 0 - defaultValue: '' - isRequired: true - isModifiable: false - valueList: - - '1' - - '3' - - '5' - - '7' cpu: dataType: string defaultValue: '' @@ -151,6 +141,16 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false + replicas: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - '1' + - '3' + - '5' + - '7' - svcOperationCfsParamId: 1025 svcOperationCfsParam: appConfiguration dataType: map-fixed @@ -216,7 +216,7 @@ cfsParamsByOp: 96: [] stateParams: startupConfiguration: '{"resourceRealm": "k8s-4-ext-nubes-ru"}' - clusterConfiguration: '{"replicas": 1, "cpu": "200", "memory": 256}' - accessConfiguration: '{"domain": "lucee-w8upcmma"}' + clusterConfiguration: '{"cpu": "200", "memory": 256, "replicas": 1}' + accessConfiguration: '{"domain": "lucee-gg7haavy"}' appConfiguration: '{"version": "6.0", "gitPath": "https://github.com/xahys/testlucee", "healthPath": ""}' jsonEnv: '{}' diff --git a/site/services/prod/95_nodejs.yaml b/site/services/prod/95_nodejs.yaml index f6945c5..2d7fd30 100644 --- a/site/services/prod/95_nodejs.yaml +++ b/site/services/prod/95_nodejs.yaml @@ -88,7 +88,7 @@ cfsParams: dataDescriptor: domain: dataType: string - defaultValue: node-q0hjstq5 + defaultValue: node-wvuyerjy isRequired: true isModifiable: false - svcOperationCfsParamId: 1031 @@ -98,11 +98,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - healthPath: - dataType: string - defaultValue: '' - isRequired: false - isModifiable: false version: dataType: string defaultValue: '23' @@ -118,6 +113,11 @@ cfsParams: defaultValue: https://github.com/xahys/testnode.git isRequired: true isModifiable: false + healthPath: + dataType: string + defaultValue: '' + isRequired: false + isModifiable: false - svcOperationCfsParamId: 1032 svcOperationCfsParam: jsonEnv dataType: map @@ -131,6 +131,11 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: + cpu: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false memory: dataType: integer > 0 defaultValue: '' @@ -146,11 +151,6 @@ cfsParams: - '3' - '5' - '7' - cpu: - dataType: integer > 0 - defaultValue: '' - isRequired: true - isModifiable: false - svcOperationCfsParamId: 1034 svcOperationCfsParam: appConfiguration dataType: map-fixed @@ -218,6 +218,6 @@ cfsParamsByOp: stateParams: startupConfiguration: '{"resourceRealm": "k8s-4-ext-nubes-ru"}' clusterConfiguration: '{"cpu": 200, "memory": 256, "replicas": 1}' - accessConfiguration: '{"domain": "node-q0hjstq5"}' - appConfiguration: '{"healthPath": "", "version": "23", "gitPath": "https://github.com/xahys/testnode.git"}' + accessConfiguration: '{"domain": "node-wvuyerjy"}' + appConfiguration: '{"version": "23", "gitPath": "https://github.com/xahys/testnode.git", "healthPath": ""}' jsonEnv: '{}' diff --git a/site/services/prod/98_http.yaml b/site/services/prod/98_http.yaml index 440bf8c..5322ea6 100644 --- a/site/services/prod/98_http.yaml +++ b/site/services/prod/98_http.yaml @@ -18,6 +18,10 @@ operations: operation: modify kind: instance action: modify +- svcOperationId: 403 + operation: reconcile + kind: action + action: reconcile - svcOperationId: 79 operation: redeploy kind: action @@ -69,19 +73,19 @@ cfsParams: dataType: string isRequired: true defaultValue: nexus-sa.tst.nubes.ru/docker-nubes/jolt - isModifiable: false + isModifiable: true - svcOperationCfsParamId: 241 svcOperationCfsParam: jsonEnv dataType: map isRequired: false defaultValue: '' - isModifiable: false + isModifiable: true - svcOperationCfsParamId: 782 svcOperationCfsParam: ingressAnnotations dataType: map isRequired: false defaultValue: '{}' - isModifiable: false + isModifiable: true - svcOperationCfsParamId: 218 svcOperationCfsParam: resourceCPU dataType: integer > 0 @@ -100,6 +104,24 @@ cfsParams: isRequired: true defaultValue: '' isModifiable: true +- svcOperationCfsParamId: 1120 + svcOperationCfsParam: registryPath + dataType: string + isRequired: true + defaultValue: '' + isModifiable: true +- svcOperationCfsParamId: 1121 + svcOperationCfsParam: jsonEnv + dataType: map + isRequired: false + defaultValue: '' + isModifiable: true +- svcOperationCfsParamId: 1122 + svcOperationCfsParam: ingressAnnotations + dataType: map + isRequired: false + defaultValue: '' + isModifiable: true - svcOperationCfsParamId: 272 svcOperationCfsParam: resourceRealm dataType: string @@ -123,6 +145,10 @@ cfsParamsByOp: - 218 - 219 - 220 + - 1120 + - 1121 + - 1122 + 403: [] 79: - 272 130: [] diff --git a/site/services/test/109_zones_v2.yaml b/site/services/test/109_zones_v2.yaml index 4faae6c..57dab11 100644 --- a/site/services/test/109_zones_v2.yaml +++ b/site/services/test/109_zones_v2.yaml @@ -127,10 +127,16 @@ cfsParams: - SSHFP - svcOperationCfsParamId: 780 svcOperationCfsParam: recordInput - dataType: string + dataType: array-map-fixed isRequired: true - defaultValue: '' + defaultValue: '[{}]' isModifiable: false + dataDescriptor: + record: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 781 svcOperationCfsParam: recordName dataType: string @@ -144,16 +150,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - recordName: - dataType: string - defaultValue: '' - isRequired: true - isModifiable: false - recordTTL: - dataType: integer > 0 - defaultValue: '3600' - isRequired: true - isModifiable: false recordType: dataType: string defaultValue: A @@ -169,11 +165,22 @@ cfsParams: - LUA - NS - SSHFP + - CAA + recordName: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false recordInput: dataType: string defaultValue: '' isRequired: true isModifiable: false + recordTTL: + dataType: integer > 0 + defaultValue: '3600' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 783 svcOperationCfsParam: recordName dataType: string @@ -204,10 +211,16 @@ cfsParams: - SSHFP - svcOperationCfsParamId: 786 svcOperationCfsParam: recordInput - dataType: string + dataType: array-map-fixed isRequired: true - defaultValue: '' + defaultValue: '[{}]' isModifiable: true + dataDescriptor: + record: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false cfsParamsByOp: 254: - 761 diff --git a/site/services/test/115_mariadb.yaml b/site/services/test/115_mariadb.yaml index a18939b..1eae73e 100644 --- a/site/services/test/115_mariadb.yaml +++ b/site/services/test/115_mariadb.yaml @@ -2,7 +2,54 @@ name: mariadb service_id: 115 service_display_name: Mariadb service_short_name: mariadb -service_man: 'Mariadb кластер. Ресурсная платформа: k8s. Автоматизация: k8s operator.
Автоматическое резервное копирование, ручное восстановление.' +service_man: '# Инструкция по развертыванию MariaDB через платформу

## 1. Общая информация

MariaDB — реляционная база данных, совместимая с MySQL. Разворачивается через `mariadb-operator` + в Kubernetes.

### Доступные операции с кластером

* **create** — создание кластера
* **delete** — удаление кластера
* **suspend** — остановка кластера (под реально останавливается, + ресурсы не потребляются)
* **resume** — запуск ранее остановленного кластера
* **modify** — изменение параметров кластера
* **reconcile** — синхронизация состояния инстанса с платформой

### + Доступные операции с базами данных

* **create_database** — создание базы данных
* **delete_database** — удаление базы данных

### Доступные операции с пользователями

* **create_user** + — создание пользователя
* **delete_user** — удаление пользователя

---

## 2. Параметры создания кластера

### Платформа для развертывания (`startupConfiguration.resourceRealm`)

Среда, + в которой будет развёрнут кластер.

### Конфигурация ресурсов (`clusterConfiguration`)

JSON-объект:
* `cpu` — квота CPU пода в миликорах (1000 = 1 vCPU). Пример: `500`
* `memory` + — квота памяти пода в мегабайтах. Пример: `512`
* `disk` — размер диска в гигабайтах. Пример: `10`
* `replicas` — количество реплик. Сервис работает в режиме одного primary-узла (Galera выключена), + значение `0` эквивалентно остановке кластера.

### Версия MariaDB (`mariadbConfiguration.version`)

Поддерживаются только две версии: `8.4.0` и `9.4.0`.

### Внешний доступ (`accessConfiguration`)

JSON-объект:
* + `masterIpSpace` — имя ipSpace для выделения внешнего IP. Укажите `no-needed`, если внешний адрес не требуется.
* `masterAccessList` — список IP/подсетей, которым разрешён доступ к порту 3306 снаружи. + Пустой список — доступ не ограничен на уровне firewall (в рамках выделенного ipSpace).

### Резервное копирование (`backupConfiguration`)

JSON-объект:
* `s3Uid` — идентификатор S3-пользователя/квоты + для бэкапов.
* `schedule` — cron-выражение расписания бэкапов. По умолчанию `0 0 * * *` (раз в сутки в полночь).
* `retain` — время хранения бэкапов **в часах** (не в днях!). По умолчанию `7` + — то есть 7 часов. При суточном расписании этого значения обычно недостаточно, чтобы между двумя бэкапами всегда оставалась хотя бы одна валидная копия — рекомендуется указывать `retain` явно, с запасом + (например `720` = 30 суток).

> **Важно:** расписание и срок хранения бэкапов задаются **только при создании кластера**. Оператор MariaDB не позволяет изменить cron-расписание бэкапа после создания + (поле `spec.schedule.cron` неизменяемо на уровне admission-вебхука самого оператора) — поэтому эти параметры недоступны для изменения через `modify`.

> **Восстановление из бэкапа пока не реализовано + как самостоятельная операция платформы.** Бэкапы физически хранятся в S3-бакете инстанса (`technicals3backup-`, префикс `mariadb/backups/`). Если нужно восстановить данные из бэкапа — бэкап + нужно **скачать из S3 и применить к базе вручную** (например через `mariabackup`/`mariadb-backup` restore или соответствующий инструмент).

### Автомасштабирование диска (`autoscaleConfiguration`)

JSON-объект:
* + `enabled` — включить автоматическое расширение диска при исчерпании места.
* `quota` — максимальный размер диска, до которого разрешено автоматическое расширение (не может быть меньше `clusterConfiguration.disk`).
* + `percent`, `schedule` — параметры триггера автомасштабирования.

---

## 3. Параметры модификации кластера

Все параметры модификации, кроме версии, можно как увеличивать, так + и уменьшать (кроме диска — см. ниже) — система подставит текущие сохранённые значения, если их не менять.

### Конфигурация ресурсов (`clusterConfiguration`)

* `cpu`, `memory` — можно + менять в любую сторону.
* `disk` — можно **только увеличивать**, уменьшение уже выделенного размера не поддерживается.
* `replicas` — `0` останавливает кластер тем же образом, что и `suspend` + (альтернативный способ временной остановки через `modify`).

### Версия MariaDB (`mariadbConfiguration.version`)

Можно только повышать версию (`8.4.0 → 9.4.0`). Попытка понизить версию + будет отклонена с явной ошибкой ещё до применения изменений.

### Внешний доступ (`accessConfiguration`)

Можно включить внешний доступ (было `no-needed` → указали реальный `masterIpSpace`), + изменить список разрешённых IP, либо полностью отключить внешний доступ (`masterIpSpace: no-needed`) — в этом случае внешний Service, DNS-запись и правило firewall будут корректно откреплены и удалены.

### + Резервное копирование

Не передаётся при модификации — расписание и срок хранения бэкапов фиксируются на этапе `create` (см. п.2).

---

## 4. Параметры создания базы данных (`create_database`)

### + Имя базы данных (`dbName`)

Строка с именем новой базы. Не может совпадать с зарезервированными системными именами: `mysql`, `sys`, `information_schema`, `performance_schema`. База с таким же + именем не должна уже существовать в кластере.

---

## 5. Параметры удаления базы данных (`delete_database`)

### Имя базы данных (`dbName`)

База должна существовать в + кластере. Удаление будет отклонено, если к базе всё ещё привязаны пользователи — сначала нужно снять доступ (`delete_user`) у всех пользователей, ссылающихся на эту базу.

---

## 6. Параметры + создания пользователя (`create_user`)

### Имя пользователя (`username`)

Не может быть `root`, `healthcheck` или `mariadb.sys` — эти имена зарезервированы платформой/оператором. Пользователь + с таким именем не должен уже существовать в кластере — операция сверяется с текущим стейтом сервиса и отклоняется, если имя занято.

### Пароль (`password`)

Пароль для подключения от + имени создаваемого пользователя.

### Базы данных (`dbName`)

JSON-массив вида `[{"dbname": "имя_базы"}]` — список баз, к которым выдаётся полный доступ (`ALL PRIVILEGES`). Все перечисленные + базы должны уже существовать в кластере (создать заранее через `create_database`).

> Ограничения доступа по IP/подсети на уровне пользователя больше нет — `user@host` в самой MariaDB всегда `%`. + Доступ к порту 3306 контролируется только на уровне инстанса через `accessConfiguration.masterAccessList`, задаваемый при `create`/`modify` (см. п.2/п.3).

---

## 7. Параметры удаления + пользователя (`delete_user`)

### Имя пользователя (`username`)

Пользователь должен существовать в кластере. `root`/`healthcheck`/`mariadb.sys` удалить нельзя.

---

## + 8. Выходные параметры

### internalConnect

Внутренний адрес для подключения из сервисов, работающих в том же кластере Kubernetes:
```json
{
"master": {
"dns": "..svc.",
"ip": + null,
"port": 3306
}
}
```

### externalConnect

Присутствует в выходных данных, **только если** был запрошен внешний доступ (`accessConfiguration.masterIpSpace` + отличен от `no-needed`). Если внешний доступ не запрошен или был отключён через `modify` — этого блока не будет вовсе (пустой блок в состояние не пишется):
```json
{
"master": {
"dns": + "write..",
"ip": "<внешний IP>",
"port": 3306
}
}
```

---

## 9. Пример подключения

### 9.1 Изнутри кластера / того же namespace

```bash
mariadb + -h -P 3306 -u -p
```

### 9.2 Через port-forward

```bash
kubectl port-forward svc/ 3306:3306 -n
```

**Важно:** + после `port-forward` подключайтесь именно по `127.0.0.1`, а не `localhost`:

```bash
mariadb -h 127.0.0.1 -P 3306 -u -p
```

Клиент `mysql`/`mariadb` при указании `-h + localhost` **игнорирует TCP/порт** и всегда пытается подключиться через локальный unix-сокет (`/var/lib/mysql/mysql.sock`), которого на вашей машине нет — подключение упадёт с `ERROR 2002 (HY000): Can''t + connect to local server through socket`. `127.0.0.1` форсирует реальное TCP-подключение. Также не забывайте `-P` (порт) с заглавной буквы — строчная `-p` относится к паролю.

### 9.3 Снаружи (внешний + адрес)

```bash
mariadb -h -P 3306 -u -p
```

Доступно только если при создании/модификации был указан реальный `masterIpSpace` + и подключающийся IP входит в `accessConfiguration.masterAccessList` (или список пуст).

Где:
* `` — имя пользователя
* `` — пароль пользователя

---

## + 10. Дополнительная информация

* Расписание бэкапов (`backupConfiguration.schedule`/`retain`) задаётся один раз при создании и не может быть изменено позже — ограничение самого `mariadb-operator`, + а не платформы.
* Версию MariaDB можно только повышать, откат на более старую версию не поддерживается.
* Размер диска можно только увеличивать.
* `suspend` реально останавливает под (масштабирование + StatefulSet в 0 реплик), а не просто помечает кластер как приостановленный — расход ресурсов CPU/RAM/диска (кроме уже занятого диска) прекращается.
* При отключении внешнего доступа через `modify` + (`masterIpSpace: no-needed`) внешний Service, DNS-запись и правило firewall удаляются, а `externalConnect` пропадает из выходных данных.
* Самостоятельного восстановления из бэкапа (операции `restore`) + пока нет. Бэкапы лежат в S3 инстанса — восстановление данных в существующий кластер выполняется вручную, скачиванием и применением бэкапа самим владельцем инстанса.
' lifecycle: suspendOnDestroyDefault: true adoptExistingOnCreateDefault: false @@ -67,7 +114,6 @@ cfsParams: - iot-naeel - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 - svcOperationCfsParamId: 878 svcOperationCfsParam: clusterConfiguration dataType: map-fixed @@ -75,11 +121,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - disk: - dataType: integer > 0 - defaultValue: '10' - isRequired: true - isModifiable: false cpu: dataType: integer > 0 defaultValue: '500' @@ -97,6 +138,11 @@ cfsParams: isModifiable: false valueList: - '1' + disk: + dataType: integer > 0 + defaultValue: '10' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 879 svcOperationCfsParam: accessConfiguration dataType: map-fixed @@ -134,7 +180,7 @@ cfsParams: dataType: map-fixed isRequired: true defaultValue: '' - isModifiable: true + isModifiable: false dataDescriptor: s3Uid: dataType: uuid @@ -194,19 +240,19 @@ cfsParams: svcOperationCfsParam: dbName dataType: string isRequired: true - defaultValue: db-aah92zcm + defaultValue: db-u8hxuiin isModifiable: false - svcOperationCfsParamId: 735 svcOperationCfsParam: username dataType: string isRequired: true - defaultValue: usero6y8ruyp + defaultValue: userag8dd8qz isModifiable: false - svcOperationCfsParamId: 736 svcOperationCfsParam: password dataType: string isRequired: true - defaultValue: kgocowba + defaultValue: upnk0ifw isModifiable: false - svcOperationCfsParamId: 737 svcOperationCfsParam: dbName @@ -220,12 +266,6 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false -- svcOperationCfsParamId: 738 - svcOperationCfsParam: accessHosts - dataType: string - isRequired: true - defaultValue: '%' - isModifiable: false - svcOperationCfsParamId: 456 svcOperationCfsParam: deleteS3Bucket dataType: boolean @@ -308,28 +348,6 @@ cfsParams: valueList: - 8.4.0 - 9.4.0 -- svcOperationCfsParamId: 886 - svcOperationCfsParam: backupConfiguration - dataType: map-fixed - isRequired: true - defaultValue: '' - isModifiable: true - dataDescriptor: - retain: - dataType: integer > 0 - defaultValue: '' - isRequired: true - isModifiable: false - schedule: - dataType: string - defaultValue: '' - isRequired: true - isModifiable: false - s3Uid: - dataType: uuid - defaultValue: '' - isRequired: true - isModifiable: false - svcOperationCfsParamId: 887 svcOperationCfsParam: autoscaleConfiguration dataType: map-fixed @@ -383,7 +401,6 @@ cfsParamsByOp: - 735 - 736 - 737 - - 738 139: - 456 248: @@ -394,14 +411,13 @@ cfsParamsByOp: - 883 - 884 - 885 - - 886 - 887 287: [] 141: [] 140: [] stateParams: startupConfiguration: '{"resourceRealm": ""}' - clusterConfiguration: '{"disk": 10, "cpu": 500, "memory": 512, "replicas": 1}' + clusterConfiguration: '{"cpu": 500, "memory": 512, "replicas": 1, "disk": 10}' accessConfiguration: '{"masterIpSpace": "", "masterAccessList": "[]"}' mariadbConfiguration: '{"version": "9.4.0"}' backupConfiguration: '{"s3Uid": "", "retain": 720, "schedule": "0 0 * * *"}' diff --git a/site/services/test/116_kafka.yaml b/site/services/test/116_kafka.yaml index eac596b..d31474e 100644 --- a/site/services/test/116_kafka.yaml +++ b/site/services/test/116_kafka.yaml @@ -2,21 +2,24 @@ name: kafka service_id: 116 service_display_name: ApacheKafka service_short_name: kafka -service_man: '# Инструкция по развертыванию Организация в Cloud Director через платформу

## 1. Общая информация

Сервис **Организация в Cloud Director** предназначен для управления изолированными - организационными единицами (тенантами) внутри инфраструктуры Cloud Director. Он обеспечивает создание, модификацию и администрирование организаций, предоставление им облачных ресурсов, а также контроль - уровня доступа. Сервис используется для организации рабочих окружений потребителей, управления жизненным циклом организаций и их сетевой инфраструктурой.

### Доступные операции

**create** - — Создание новой организации с заданными характеристиками и типом доступа.
**delete** — Удаление организации после перехода в состояние suspend; приводит к удалению всех связанных сущностей.
**modify** - — Изменение параметров внутри организации (на текущий момент поддерживается изменение ipSpaces).
**suspend** — Заморозка организации, ограничение возможности изменения и добавления сущностей.
**resume** - — Разморозка организации, восстановление функций управления.

---

## 2. Параметры развертывания

Параметры входных данных операции **create**:

### Платформа для развертывания
Описание: - платформа, на которой будет создана организация.
Пример значения: `ngcloud.ru`.

### Тип организации
Описание: тип создаваемой организации.
Варианты:
- `iaas` — организация с прямым - доступом к облаку и авторизацией через Keycloak.
- `saas` — организация под управлением Nubes, без прямого доступа к облаку.

---

## 3. Рекомендованные характеристики

### - Тестовое окружение
- Тип организации: `iaas` для обеспечения полного доступа к облачным ресурсам и самостоятельного управления.

### Промышленное окружение
- Тип организации: `saas` (упрощённая - модель использования).

---

## 4. Выходные параметры

Услуга предоставляет следующие выходные параметры (формируются в процессе операций):

### Идентификатор организации
Уникальный - идентификатор созданной организации. Используется для всех дальнейших API-операций.

### Статус организации
Отражает текущее состояние: active, suspended, modifying, deleting.

### - Параметры сети
Выходные данные при наличии ipSpaces: список выделенных внешних IP, имя ip_space, количество IP.

---

## 5. Дополнительная информация

- Для конфигурации внешних - IP внутри организации необходимо предварительно создать:
-- хотя бы один **Виртуальный датацентр (VDC)**;
-- хотя бы один **Сетевой шлюз периметра (Edge Gateway)**, привязанный к этой организации.
- - Удаление организации возможно только через 14 дней после перевода в состояние suspend.
- Удаление организации приводит к удалению всех связанных сущностей: VDC, Edge Gateway, пулов IP, сетей, ВМок - и иных объектов.
- Операция suspend не останавливает виртуальные машины, но блокирует любые изменения инфраструктуры внутри организации.
- Для iaas-организаций доступ осуществляется через Keycloak.

' +service_man: "# Инструкция по развертыванию Apache Kafka через платформу

---
## 1. Общая информация
Брокер сообщений Apache Kafka — это отказоустойчивая распределённая платформа для обмена\ + \ сообщениями и потоковой обработки данных в реальном времени.
Позволяет надёжно передавать события между сервисами и системами, интегрироваться с внешними решениями и использовать как внутренние,\ + \ так и защищённые TLS-подключения. Развёртывание полностью автоматизировано платформой.

## Доступные операции
- **create** — Создание кластера
- **delete** — Удаление кластера
-\ + \ **suspend** — Остановка кластера
- **resume** — Запуск кластера

- **create_topic** — Создание топика
- **modify_topic** — Модификация топика
- **delete_topic** — Удаление\ + \ топика

- **create_user** — Создание пользователя
- **modify_user** — Модификация пользователя
- **delete_user** — Удаление пользователя


---
## 2. Параметры\ + \ развертывания кластера
Ниже перечислены параметры, которые необходимо указать при создании ресурса Kafka:

* **Платформа для развертывания:**
Платформа для развертывания (среда, в\ + \ которой будет развернут кластер). Пример: `\tk8s-3.ext.nubes.ru`.

* **Количество узлов в сети:**
Количество узлов (брокеров) в кластере Kafka

* **Квота (megabyte) памяти пода:**
\ + \ Квота памяти пода в мегабайтах. Пример: `2048`

* **Квота (millicore ) ядра пода:**
Квота CPU пода в миликорах (1000 mCPU = 1 vCPU). Пример: `1000`

* **Размер (gigabyte) диска\ + \ для базы данных:**
Размер диска для хранения данных в гигабайтах. Пример: `20`

* **Выделяет внешний IP для доступа к master:**
Флаг, определяющий, нужно ли выделять внешний IP для\ + \ доступа к master-брокеру. Пример: `true` или `false`

* **Имя ipSpace для публикации внешнего IP**
Если включен предыдущий параметр, то поле необходимо заполнить. Пример: `internet-no-antiddos-v1`

---
##\ + \ 4. Выходные параметры
После успешного развертывания ресурса Kafka платформа возвращает ряд параметров.
Ключевыми из них являются:

**internalConnect** (выдаётся только при работе кластера\ + \ по внутренним адресам)
Внутренние эндпоинты для подключения из сервисов, развёрнутых внутри того же Kubernetes-кластера.
```yaml
internalConnect:
bootstrap:
fqdn: \"-kafka-tls-bootstrap..svc.\"\ +
port: 9093
brokers:
broker-1:
fqdn: \"--pool-0.-kafka-brokers..svc.\"
port: 9093
```

**externalConnect**\ + \ (выдаётся только при выделении внешнего IP)
Внешние эндпоинты, зарегистрированные в DNS.
```yaml
externalConnect:
bootstrap:
fqdn: \"bootstrap..\"
\ + \ port: 9093
brokers:
broker-1:
fqdn: \"broker-1..\"
port: 9093
```

Заполняется **только один** из параметров:
- при внешней аллокации\ + \ (`loadbalancer`) — `externalConnect`, `internalConnect` остаётся пустым;
- при внутреннем режиме — `internalConnect`, `externalConnect` остаётся пустым.

Для подключения используются следующие\ + \ порты:

* 9092 — внутренний нешифрованный доступ (plain).
* 9093 — внутренний и внешний доступ по TLS, с обязательной TLS-аутентификацией.

---
## 5. Дополнительная информация
Для\ + \ создания топиков, пользователей и управления ими, а также для интеграции с кластерами Kafka используйте соответствующие сервисы и раздел \"Облачные сервисы\".
---" lifecycle: suspendOnDestroyDefault: true adoptExistingOnCreateDefault: false @@ -85,7 +88,6 @@ cfsParams: - iot-naeel - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 - svcOperationCfsParamId: 1085 svcOperationCfsParam: clusterConfiguration dataType: map-fixed diff --git a/site/services/test/119_akhq.yaml b/site/services/test/119_akhq.yaml index 3baecf1..d7e0c56 100644 --- a/site/services/test/119_akhq.yaml +++ b/site/services/test/119_akhq.yaml @@ -50,7 +50,6 @@ cfsParams: - iot-naeel - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 - svcOperationCfsParamId: 551 svcOperationCfsParam: resourceMemory dataType: integer > 0 diff --git a/site/services/test/120_clickhouse.yaml b/site/services/test/120_clickhouse.yaml index 5330abd..a86ea79 100644 --- a/site/services/test/120_clickhouse.yaml +++ b/site/services/test/120_clickhouse.yaml @@ -88,7 +88,6 @@ cfsParams: - iot-naeel - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 - svcOperationCfsParamId: 838 svcOperationCfsParam: clusterConfiguration dataType: map-fixed @@ -116,6 +115,11 @@ cfsParams: - '3' - '5' - '7' + disk: + dataType: integer > 0 + defaultValue: '10' + isRequired: true + isModifiable: false shards: dataType: integer > 0 defaultValue: '1' @@ -125,11 +129,6 @@ cfsParams: - '1' - '2' - '3' - disk: - dataType: integer > 0 - defaultValue: '10' - isRequired: true - isModifiable: false - svcOperationCfsParamId: 839 svcOperationCfsParam: accessConfiguration dataType: map-fixed @@ -216,20 +215,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - quota: - dataType: integer > 0 - defaultValue: '100' - isRequired: true - isModifiable: false - percent: - dataType: integer > 0 - defaultValue: '10' - isRequired: true - isModifiable: false - valueList: - - '10' - - '15' - - '20' enabled: dataType: boolean defaultValue: 'false' @@ -248,6 +233,20 @@ cfsParams: - '5' - '12' - '23' + quota: + dataType: integer > 0 + defaultValue: '100' + isRequired: true + isModifiable: false + percent: + dataType: integer > 0 + defaultValue: '10' + isRequired: true + isModifiable: false + valueList: + - '10' + - '15' + - '20' - svcOperationCfsParamId: 851 svcOperationCfsParam: clickhouseFilesConfiguration dataType: array-map-fixed @@ -434,15 +433,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - percent: - dataType: integer > 0 - defaultValue: '' - isRequired: true - isModifiable: false - valueList: - - '10' - - '15' - - '20' enabled: dataType: boolean defaultValue: false,true @@ -463,6 +453,15 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false + percent: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - '10' + - '15' + - '20' - svcOperationCfsParamId: 850 svcOperationCfsParam: clickhouseFilesConfiguration dataType: array-map-fixed @@ -514,10 +513,10 @@ cfsParamsByOp: 182: [] stateParams: startupConfiguration: '{"resourceRealm": ""}' - clusterConfiguration: '{"cpu": 1000, "memory": 2048, "replicas": 1, "shards": 1, "disk": 10}' + clusterConfiguration: '{"cpu": 1000, "memory": 2048, "replicas": 1, "disk": 10, "shards": 1}' accessConfiguration: '{"masterIpSpace": "", "masterAccessList": "[]"}' clickhouseKeeperConfiguration: '{"cpu": 500, "memory": 512, "replicas": 0}' clickhouseConfiguration: '{"version": "25.10"}' backupConfiguration: '{"s3Uid": "", "retain": 7, "schedule": "0 0 * * *"}' - autoscaleConfiguration: '{"quota": 100, "percent": 10, "enabled": false, "schedule": 0}' + autoscaleConfiguration: '{"enabled": false, "schedule": 0, "quota": 100, "percent": 10}' clickhouseFilesConfiguration: '{"path": "something.xml", "xmlConfig": ""}' diff --git a/site/services/test/148_vc_mgmt_sthutrval_cluster.yaml b/site/services/test/148_vc_mgmt_sthutrval_cluster.yaml index 5b38d61..9118fff 100644 --- a/site/services/test/148_vc_mgmt_sthutrval_cluster.yaml +++ b/site/services/test/148_vc_mgmt_sthutrval_cluster.yaml @@ -19,6 +19,11 @@ cfsParams: defaultValue: '' isModifiable: false dataDescriptor: + clusterName: + dataType: string + defaultValue: k8s-ojc3z9ba + isRequired: true + isModifiable: false resourceRealm: dataType: string defaultValue: sandbox.nubes.ru @@ -26,9 +31,14 @@ cfsParams: isModifiable: false valueList: - sandbox.nubes.ru - clusterName: + providerVdc: dataType: string - defaultValue: example-ywasgmh6 + defaultValue: '' + isRequired: true + isModifiable: false + networkProvider: + dataType: string + defaultValue: '' isRequired: true isModifiable: false - svcOperationCfsParamId: 772 @@ -40,10 +50,11 @@ cfsParams: dataDescriptor: appVersion: dataType: string - defaultValue: 2.13.1 + defaultValue: 2.14.0 isRequired: true isModifiable: false valueList: + - 2.14.0 - 2.13.1 - 2.12.1 - 2.11.0 @@ -82,6 +93,18 @@ cfsParams: defaultValue: '[{}]' isModifiable: false dataDescriptor: + groupName: + dataType: string + defaultValue: workers-5klcccvc + isRequired: true + isModifiable: false + sizingPolicy: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - '{}' sizingDisk: dataType: integer > 0 defaultValue: '50' @@ -92,18 +115,32 @@ cfsParams: defaultValue: '2' isRequired: true isModifiable: false - groupName: - dataType: string - defaultValue: workers-gj7zkkhv - isRequired: true - isModifiable: false - sizingPolicy: - dataType: string - defaultValue: '' + autoscale: + dataType: boolean + defaultValue: 'false' isRequired: true isModifiable: false valueList: - - '{}' + - 'false' + - 'true' + autoscaleMin: + dataType: integer > 0 + defaultValue: '2' + isRequired: true + isModifiable: false + autoscaleMax: + dataType: integer > 0 + defaultValue: '3' + isRequired: true + isModifiable: false + labelDeck: + dataType: boolean + defaultValue: 'true' + isRequired: true + isModifiable: false + valueList: + - 'true' + - 'false' - svcOperationCfsParamId: 775 svcOperationCfsParam: accessConfiguration dataType: map-fixed @@ -111,18 +148,6 @@ cfsParams: defaultValue: '' isModifiable: false dataDescriptor: - needExternalAddressIngress: - dataType: boolean - defaultValue: 'true' - isRequired: true - isModifiable: false - valueList: - - 'true' - accessIpListIngress: - dataType: json - defaultValue: '[]' - isRequired: true - isModifiable: false needExternalAddressAPI: dataType: boolean defaultValue: 'true' @@ -135,6 +160,18 @@ cfsParams: defaultValue: '[]' isRequired: true isModifiable: false + needExternalAddressIngress: + dataType: boolean + defaultValue: 'true' + isRequired: true + isModifiable: false + valueList: + - 'true' + accessIpListIngress: + dataType: json + defaultValue: '[]' + isRequired: true + isModifiable: false cfsParamsByOp: 258: - 771 @@ -143,8 +180,8 @@ cfsParamsByOp: - 774 - 775 stateParams: - startupConfiguration: '{"resourceRealm": "sandbox.nubes.ru", "clusterName": "example-ywasgmh6"}' - clusterConfiguration: '{"appVersion": "2.13.1"}' + startupConfiguration: '{"clusterName": "k8s-ojc3z9ba", "resourceRealm": "sandbox.nubes.ru", "providerVdc": "", "networkProvider": ""}' + clusterConfiguration: '{"appVersion": "2.14.0"}' controlPlaneConfiguration: '{"sizingPolicy": "", "sizingDisk": 50, "count": 1}' - workerConfiguration: '{"sizingDisk": 50, "count": 2, "groupName": "workers-gj7zkkhv", "sizingPolicy": ""}' - accessConfiguration: '{"needExternalAddressIngress": true, "accessIpListIngress": "[]", "needExternalAddressAPI": true, "accessIpListAPI": "[]"}' + workerConfiguration: '{"groupName": "workers-5klcccvc", "sizingPolicy": "", "sizingDisk": 50, "count": 2, "autoscale": false, "autoscaleMin": 2, "autoscaleMax": 3, "labelDeck": true}' + accessConfiguration: '{"needExternalAddressAPI": true, "accessIpListAPI": "[]", "needExternalAddressIngress": true, "accessIpListIngress": "[]"}' diff --git a/site/services/test/149_valo_tenant.yaml b/site/services/test/149_valo_tenant.yaml index 92c5262..cba804b 100644 --- a/site/services/test/149_valo_tenant.yaml +++ b/site/services/test/149_valo_tenant.yaml @@ -62,19 +62,6 @@ cfsParams: defaultValue: '{}' isModifiable: true dataDescriptor: - ffLogging: - dataType: boolean - defaultValue: 'true' - isRequired: true - isModifiable: false - valueList: - - 'false' - - 'true' - userCount: - dataType: integer > 0 - defaultValue: '10' - isRequired: true - isModifiable: false requestApproveMaxPeriod: dataType: integer > 0 defaultValue: '2' @@ -120,6 +107,19 @@ cfsParams: valueList: - 'false' - 'true' + ffLogging: + dataType: boolean + defaultValue: 'true' + isRequired: true + isModifiable: false + valueList: + - 'false' + - 'true' + userCount: + dataType: integer > 0 + defaultValue: '10' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 658 svcOperationCfsParam: s3Storage dataType: integer > 0 @@ -133,6 +133,11 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: + userCount: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false requestApproveMaxPeriod: dataType: integer > 0 defaultValue: '' @@ -186,11 +191,6 @@ cfsParams: valueList: - 'false' - 'true' - userCount: - dataType: integer > 0 - defaultValue: '' - isRequired: true - isModifiable: false - svcOperationCfsParamId: 660 svcOperationCfsParam: s3Storage dataType: integer > 0 @@ -212,5 +212,5 @@ cfsParamsByOp: stateParams: resourceRealm: valo.ngcloud.ru domain: '' - valoOptions: '{"ffLogging": true, "userCount": 10, "requestApproveMaxPeriod": 2, "ffOnlineEditor": true, "ffWatermark": true, "ffUserImport": true, "ffThemes": true, "ffPublicLink": true}' + valoOptions: '{"requestApproveMaxPeriod": 2, "ffOnlineEditor": true, "ffWatermark": true, "ffUserImport": true, "ffThemes": true, "ffPublicLink": true, "ffLogging": true, "userCount": 10}' s3Storage: '10' diff --git a/site/services/test/150_k8s_sthutrval_cluster.yaml b/site/services/test/150_k8s_sthutrval_cluster.yaml index 77d7dfc..561430e 100644 --- a/site/services/test/150_k8s_sthutrval_cluster.yaml +++ b/site/services/test/150_k8s_sthutrval_cluster.yaml @@ -2,7 +2,17 @@ name: k8s_sthutrval_cluster service_id: 150 service_display_name: Kubernetes кластер Штурвал service_short_name: k8sSthutrvalCluster -service_man: Перед разворачиванием убедиться, что в облаке есть 2 свободных невыделенных IP в пуле +service_man: '# Развёртывание Kubernetes: ограничения и предварительный чек-лист

> **Внимание:** перед началом развёртывания кластера Kubernetes убедитесь, что выполнены все описанные ниже условия. + Несоблюдение порядка шагов может привести к ошибкам при создании кластера.

---

## Ограничения при развёртывании

| Ограничение | Статус |
|---|---|
| 1 кластер = 1 vDC + | Действует (будет исправлено в ближайшее время) |

---

## Предварительный чек-лист

Перед установкой кластера Kubernetes необходимо последовательно выполнить следующие шаги.

### + 1. Создать организацию в Cloud Director

- Перейдите в услугу **Организация в Cloud Director**.
- Создайте организацию.

### 2. Создать виртуальный датацентр (vDC)

- Перейдите + в услугу **Виртуальный датацентр (vDC)**.
- Создайте vDC.
- Выделите **достаточно ресурсов для разворачивания _всех_ нод** кластера.

### 3. Создать Edge (сетевой шлюз периметра)

- + Перейдите в услугу **Сетевой шлюз периметра (Edge)**.
- Создайте Edge.
- Обязательно:
- Включить **ALB**.
- Установить **Кол-во VS на AVI ≥ 3**.

### 4. Добавить внешние адреса + в организации

- Вернитесь в **Организация в Cloud Director**.
- Выполните операцию **Modify**.
- Добавьте **3 внешних адреса**.
- Количество `ipSpaces` значения не имеет, важно чтобы + суммарно было 3 адреса.

### 5. Настроить SNAT для виртуальных машин

- Вернитесь в **Сетевой шлюз периметра (Edge)**.
- Выполните операцию **Modify**.
- Выберите доступный `ipSpaceName`.
- + Это будет **SNAT для виртуальных машин**.

### 6. Развернуть кластер Kubernetes

- Только **после выполнения всех шагов выше** переходите к услуге **Kubernetes кластер Штурвал**.
- + Начните разворачивание кластера.

---

## Минимальные требования к кластеру

| Параметр | Значение |
|---|---|
| Мастер-ноды | минимум **1** |
| Воркер-ноды | минимум + **1** |
| CPU (на ноду) | **4 vCPU** |
| RAM (на ноду) | **8 GB** |
| Диск (на ноду) | **50 GB** |

---' lifecycle: suspendOnDestroyDefault: true adoptExistingOnCreateDefault: false @@ -49,6 +59,11 @@ cfsParams: defaultValue: '' isModifiable: false dataDescriptor: + vdcUid: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false nsxtUid: dataType: string defaultValue: '' @@ -56,14 +71,65 @@ cfsParams: isModifiable: false clusterName: dataType: string - defaultValue: example-kcrwfrbd + defaultValue: example-64i38rha isRequired: true isModifiable: false - vdcUid: - dataType: string - defaultValue: '' - isRequired: true + exLogging: + dataType: boolean + defaultValue: 'true' + isRequired: false isModifiable: false + valueList: + - 'true' + - 'false' + exMonitoring: + dataType: boolean + defaultValue: 'true' + isRequired: false + isModifiable: false + valueList: + - 'true' + - 'false' + exLocalCsi: + dataType: boolean + defaultValue: 'true' + isRequired: false + isModifiable: false + valueList: + - 'true' + - 'false' + exVip: + dataType: boolean + defaultValue: 'true' + isRequired: false + isModifiable: false + valueList: + - 'true' + - 'false' + exUpdate: + dataType: boolean + defaultValue: 'true' + isRequired: false + isModifiable: false + valueList: + - 'true' + - 'false' + exIngress: + dataType: boolean + defaultValue: 'true' + isRequired: false + isModifiable: false + valueList: + - 'true' + - 'false' + exNamedCsi: + dataType: boolean + defaultValue: 'true' + isRequired: false + isModifiable: false + valueList: + - 'true' + - 'false' - svcOperationCfsParamId: 751 svcOperationCfsParam: controlPlaneConfiguration dataType: map-fixed @@ -71,6 +137,13 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: + sizingPolicy: + dataType: string + defaultValue: '[]' + isRequired: true + isModifiable: false + valueList: + - '{}' sizingDisk: dataType: integer > 0 defaultValue: '50' @@ -85,13 +158,6 @@ cfsParams: - '1' - '3' - '5' - sizingPolicy: - dataType: string - defaultValue: '[]' - isRequired: true - isModifiable: false - valueList: - - '{}' - svcOperationCfsParamId: 752 svcOperationCfsParam: workerConfiguration dataType: array-map-fixed @@ -101,7 +167,7 @@ cfsParams: dataDescriptor: groupName: dataType: string - defaultValue: workers-rbrr6za5 + defaultValue: workers-bixtunvv isRequired: true isModifiable: false sizingPolicy: @@ -121,6 +187,32 @@ cfsParams: defaultValue: '2' isRequired: true isModifiable: false + autoscale: + dataType: boolean + defaultValue: 'false' + isRequired: false + isModifiable: false + valueList: + - 'false' + - 'true' + autoscaleMin: + dataType: integer > 0 + defaultValue: '2' + isRequired: false + isModifiable: false + autoscaleMax: + dataType: integer > 0 + defaultValue: '3' + isRequired: false + isModifiable: false + labelDeck: + dataType: boolean + defaultValue: 'true' + isRequired: true + isModifiable: false + valueList: + - 'true' + - 'false' - svcOperationCfsParamId: 753 svcOperationCfsParam: accessConfiguration dataType: map-fixed @@ -161,10 +253,11 @@ cfsParams: dataDescriptor: appVersion: dataType: string - defaultValue: 2.13.1 + defaultValue: 2.14.0 isRequired: true isModifiable: false valueList: + - 2.14.0 - 2.13.1 - 2.12.1 - 2.11.0 @@ -205,6 +298,7 @@ cfsParams: isRequired: true isModifiable: false valueList: + - 2.14.0 - 2.13.1 - 2.12.1 - 2.11.0 @@ -245,7 +339,7 @@ cfsParams: dataDescriptor: groupName: dataType: string - defaultValue: workers-kk0fpv6w + defaultValue: workers-lbpbdrlp isRequired: true isModifiable: false sizingPolicy: @@ -261,10 +355,36 @@ cfsParams: isRequired: true isModifiable: false count: - dataType: integer > 0 + dataType: integer >= 0 defaultValue: '' isRequired: true isModifiable: false + autoscale: + dataType: boolean + defaultValue: '' + isRequired: false + isModifiable: false + valueList: + - 'false' + - 'true' + autoscaleMin: + dataType: integer > 0 + defaultValue: '' + isRequired: false + isModifiable: false + autoscaleMax: + dataType: integer > 0 + defaultValue: '' + isRequired: false + isModifiable: false + labelDeck: + dataType: boolean + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - 'true' + - 'false' - svcOperationCfsParamId: 759 svcOperationCfsParam: accessConfiguration dataType: map-fixed @@ -317,8 +437,9 @@ cfsParamsByOp: 174: [] 173: [] stateParams: - startupConfiguration: '{"nsxtUid": "", "clusterName": "example-kcrwfrbd", "vdcUid": ""}' - controlPlaneConfiguration: '{"sizingDisk": 50, "count": 1, "sizingPolicy": "[]"}' - workerConfiguration: '{"groupName": "workers-rbrr6za5", "sizingPolicy": "", "sizingDisk": 50, "count": 2}' + startupConfiguration: '{"vdcUid": "", "nsxtUid": "", "clusterName": "example-64i38rha", "exLogging": true, "exMonitoring": true, "exLocalCsi": true, "exVip": true, "exUpdate": true, "exIngress": true, + "exNamedCsi": true}' + controlPlaneConfiguration: '{"sizingPolicy": "[]", "sizingDisk": 50, "count": 1}' + workerConfiguration: '{"groupName": "workers-bixtunvv", "sizingPolicy": "", "sizingDisk": 50, "count": 2, "autoscale": false, "autoscaleMin": 2, "autoscaleMax": 3, "labelDeck": true}' accessConfiguration: '{"needExternalAddressAPI": true, "accessIpListAPI": "[]", "needExternalAddressIngress": true, "accessIpListIngress": "[]"}' - clusterConfiguration: '{"appVersion": "2.13.1"}' + clusterConfiguration: '{"appVersion": "2.14.0"}' diff --git a/site/services/test/151_k8s_openbao.yaml b/site/services/test/151_k8s_openbao.yaml index 94de8e5..09ffe3d 100644 --- a/site/services/test/151_k8s_openbao.yaml +++ b/site/services/test/151_k8s_openbao.yaml @@ -71,10 +71,6 @@ operations: operation: recovery_secrets kind: subresource action: recovery -- svcOperationId: 234 - operation: restart - kind: action - action: restart - svcOperationId: 216 operation: resume kind: instance @@ -106,7 +102,6 @@ cfsParams: - iot-naeel - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 - svcOperationCfsParamId: 664 svcOperationCfsParam: resourceCPU dataType: integer > 0 @@ -143,13 +138,13 @@ cfsParams: svcOperationCfsParam: domain dataType: string isRequired: true - defaultValue: bao-ovkw1qbi + defaultValue: bao-4ais52yr isModifiable: false - svcOperationCfsParamId: 675 svcOperationCfsParam: kvName dataType: string isRequired: true - defaultValue: kvname-bbycmhbz + defaultValue: kvname-ro5gbsoq isModifiable: false - svcOperationCfsParamId: 728 svcOperationCfsParam: policySettings @@ -158,21 +153,21 @@ cfsParams: defaultValue: '' isModifiable: false dataDescriptor: - capabilities: - dataType: json - defaultValue: '["read", "list"]' - isRequired: true - isModifiable: false path: dataType: string defaultValue: '' isRequired: true isModifiable: false + capabilities: + dataType: json + defaultValue: '["read", "list"]' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 729 svcOperationCfsParam: policyName dataType: string isRequired: true - defaultValue: policy-xqjoiy6t + defaultValue: policy-cxra9ogy isModifiable: false - svcOperationCfsParamId: 677 svcOperationCfsParam: kvName @@ -279,12 +274,12 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - capabilities: + path: dataType: string defaultValue: '' isRequired: true isModifiable: false - path: + capabilities: dataType: string defaultValue: '' isRequired: true @@ -353,7 +348,6 @@ cfsParamsByOp: - 723 - 724 - 725 - 234: [] 216: [] 215: [] 238: @@ -371,4 +365,4 @@ stateParams: resourceMemory: '512' resourceDisk: '10' appVersion: 2.5.2 - domain: bao-ovkw1qbi + domain: bao-4ais52yr diff --git a/site/services/test/163_llm_ai.yaml b/site/services/test/163_llm_ai.yaml index 9036c7a..c56b21a 100644 --- a/site/services/test/163_llm_ai.yaml +++ b/site/services/test/163_llm_ai.yaml @@ -1,33 +1,39 @@ name: llm_ai service_id: 163 -service_display_name: LLM +service_display_name: ML Улей service_short_name: llmAi service_man: '## 1. Общая информация

LLMaaS (Large Language Model as a Service) — это сервис для доступа к языковым моделям через OpenAI-совместимое API.
Платформа позволяет создавать организации - (тенанты), команды, выпускать и управлять API-ключами, устанавливать лимиты на использование.

---

## Доступные операции

- **create** — Создание организации в LLMaaS
- - **delete** — Удаление организации

- **create_team** — Создание команды внутри организации
- **modify_team** — Редактирование команды (модели, RPM, TPM)
- **delete_team** — - Удаление команды

- **create_secrets** — Создание API-ключа
- **update_secrets** — Обновление параметров API-ключа
- **delete_secrets** — Удаление API-ключа

---

## + (тенанты), команды, выпускать и управлять API-ключами, устанавливать лимиты на использование.

### Ограничение: одна организация на контрагента

На одного контрагента может быть создана + **только одна организация** в LLMaaS.
Повторная попытка создать организацию для того же контрагента завершится ошибкой.

### Возможные ошибки и как их обрабатывать

При работе с сервисом + могут возникнуть типовые ошибки. Ниже описано, как их распознать и что делать.

| Ошибка | Когда возникает | Что делать |
|--------|-----------------|------------|
| `Организация в LLMaaS + уже привязана к контрагенту ` | При операции `create`, если организация для данного контрагента уже существует | На одного контрагента допускается только одна организация. Если нужно изменить + существующую организацию, используйте операции управления командами и ключами |
| `Не хватает нужного гранта. Примените реконсиляцию для данного инстанса` | При операциях `create_team`, `modify_team`, + если модель не выдана организации на Layer 1 | Запустите операцию `reconcile` для данного инстанса. Она обновит список моделей, доступных организации, после чего повторите исходную операцию |
| `Лимиты + API-ключа не могут превышать лимиты команды` | При операциях `create_secrets`, `update_secrets` | Уменьшите значения `RPM` и/или `TPM` ключа до уровня команды или увеличьте лимиты самой команды через + `modify_team` |

---

## Доступные операции

- **create** — Создание организации в LLMaaS
- **delete** — Удаление организации

- **create_team** — + Создание команды внутри организации
- **modify_team** — Редактирование команды (модели, RPM, TPM)
- **delete_team** — Удаление команды

- **create_secrets** — Создание API-ключа
- + **update_secrets** — Обновление параметров API-ключа
- **delete_secrets** — Удаление API-ключа

- **reconcile** — Обновление списка моделей, доступных организации

---

## 2. Параметры создания организации

Ниже перечислены параметры, которые необходимо указать при создании организации:

* **Платформа для развертывания**
Выбирается автоматически, изменять - не нужно.

* **Период бюджета**
Срок жизни организации в днях.
Пример: `30`


---

## 3. Параметры создания команды

* **Имя команды**
Уникальное - имя команды в рамках организации.
Пример: `production`

* **Модель**
Название модели, доступной для команды.
Пример: `gpt-oss-120b`

* **Лимит запросов в минуту (RPM)**
Максимальное - количество запросов к API в минуту.
Пример: `60`

* **Лимит токенов в минуту (TPM)**
Максимальное количество токенов (входящих + исходящих) в минуту.
Пример: `100000`

---

## - 4. Параметры редактирования команды

Для существующей команды можно изменить:

* **Модель**
Новая модель для команды.
Пример: `gpt-oss-20b`

* **Лимит запросов в минуту - (RPM)**
Новое значение RPM.
Пример: `120`

* **Лимит токенов в минуту (TPM)**
Новое значение TPM.
Пример: `200000`

---

## 5. Параметры создания API-ключа

Ниже - перечислены параметры, которые необходимо указать при создании API-ключа:

* **Имя ключа**
Уникальное имя ключа в рамках организации.
Пример: `prod-key`

* **Команда**
Имя - команды для привязки ключа. Если не указано — ключ привязывается к команде `main`.
Пример: `production`

* **Модель**
Название модели, доступной для данного ключа.
Пример: `gpt-oss-120b`

* - **Лимит запросов в минуту (RPM)**
Максимальное количество запросов к API в минуту.
Пример: `60`

* **Лимит токенов в минуту (TPM)**
Максимальное количество токенов (входящих - + исходящих) в минуту.
Пример: `100000`

**Важно:** Лимиты API-ключа не могут превышать лимиты команды, к которой он привязан.
При превышении операция будет отклонена с ошибкой.
Перед - созданием ключа убедитесь, что `RPM <= team.RPM` и `TPM <= team.TPM`.


---

## 6. Параметры обновления API-ключа

Для уже существующего ключа можно изменить параметры. Все - параметры являются опциональными:

* **Имя ключа**
Имя обновляемого ключа.
Пример: `prod-key`

* **Модель**
Новое название модели.
Пример: `gpt-oss-20b`

* - **Лимит запросов в минуту (RPM)**
Новое значение RPM.
Пример: `120`

* **Лимит токенов в минуту (TPM)**
Новое значение TPM.
Пример: `200000`

**Важно:** При обновлении - лимитов API-ключа новые значения не могут превышать лимиты команды.
Если указать значения выше командных, операция завершится ошибкой.
Указывайте `RPM <= team.RPM` и `TPM <= team.TPM`.

Команда - определяется автоматически по стейту услуги — изменить привязку к другой команде через эту операцию нельзя.

---

## 7. Параметры удаления API-ключа

* **Команда**
Имя команды, - к которой привязан ключ.
Пример: `production`

* **Имя ключа**
Имя удаляемого ключа.
Пример: `prod-key`

---

## 8. Параметры удаления команды

* **Имя - команды**
Имя удаляемой команды.
Пример: `production`

---

## 9. Параметры удаления организации

Удаление организации не требует дополнительных параметров — удаляется - вся организация со всеми командами и ключами.

---

## 10. Выходные параметры

После успешного создания организации платформа возвращает:

* **connectionUrl**
URL - для доступа к inference API (OpenAI-совместимый).
Пример: `https://api.aillm.ru`

---


## 12. Пример использования API

После получения API-ключа клиент может обращаться - к LLMaaS напрямую:

**Запрос к chat completions:**

```bash
curl https://api.aillm.ru/v1/chat/completions \
-H "Authorization: Bearer sk-..." \
-H "Content-Type: application/json" - \
-d ''{
"model": "gpt-oss-120b",
"messages": [
{"role": "user", "content": "Привет!"}
]
}''
```

**Получение списка доступных моделей:**

```bash
curl - https://api.aillm.ru/v1/models \
-H "Authorization: Bearer sk-..."
```
' + не нужно.

## 3. Параметры создания команды

* **Имя команды**
Уникальное имя команды в рамках организации.
Пример: `production`

* **Модель**
Название модели, + доступной для команды.
Пример: `gpt-oss-120b`

* **Лимит запросов в минуту (RPM)**
Максимальное количество запросов к API в минуту.
Пример: `60`

* **Лимит токенов в + минуту (TPM)**
Максимальное количество токенов (входящих + исходящих) в минуту.
Пример: `100000`

---

## 4. Параметры редактирования команды

Для существующей команды + можно изменить:

* **Модель**
Новая модель для команды.
Пример: `gpt-oss-20b`

* **Лимит запросов в минуту (RPM)**
Новое значение RPM.
Пример: `120`

* + **Лимит токенов в минуту (TPM)**
Новое значение TPM.
Пример: `200000`

---

## 5. Параметры создания API-ключа

Ниже перечислены параметры, которые необходимо указать + при создании API-ключа:

* **Имя ключа**
Уникальное имя ключа в рамках организации.
Пример: `prod-key`

* **Команда**
Имя команды для привязки ключа. Если не указано + — ключ привязывается к команде `main`.
Пример: `production`

* **Модель**
Название модели, доступной для данного ключа.
Пример: `gpt-oss-120b`

* **Лимит запросов в минуту + (RPM)**
Максимальное количество запросов к API в минуту.
Пример: `60`

* **Лимит токенов в минуту (TPM)**
Максимальное количество токенов (входящих + исходящих) в минуту.
Пример: + `100000`

**Важно:** Лимиты API-ключа не могут превышать лимиты команды, к которой он привязан.
При превышении операция будет отклонена с ошибкой.
Перед созданием ключа убедитесь, что + `RPM <= team.RPM` и `TPM <= team.TPM`.


---

## 6. Параметры обновления API-ключа

Для уже существующего ключа можно изменить параметры. Все параметры являются опциональными:

* + **Имя ключа**
Имя обновляемого ключа.
Пример: `prod-key`

* **Модель**
Новое название модели.
Пример: `gpt-oss-20b`

* **Лимит запросов в минуту (RPM)**
Новое + значение RPM.
Пример: `120`

* **Лимит токенов в минуту (TPM)**
Новое значение TPM.
Пример: `200000`

**Важно:** При обновлении лимитов API-ключа новые значения не могут + превышать лимиты команды.
Если указать значения выше командных, операция завершится ошибкой.
Указывайте `RPM <= team.RPM` и `TPM <= team.TPM`.

Команда определяется автоматически по стейту + услуги — изменить привязку к другой команде через эту операцию нельзя.

---

## 7. Параметры удаления API-ключа

* **Команда**
Имя команды, к которой привязан ключ.
Пример: + `production`

* **Имя ключа**
Имя удаляемого ключа.
Пример: `prod-key`

---

## 8. Параметры удаления команды

* **Имя команды**
Имя удаляемой команды.
Пример: + `production`

---

## 9. Параметры удаления организации

Удаление организации не требует дополнительных параметров — удаляется вся организация со всеми командами и ключами.

---

## + 10. Выходные параметры

После успешного создания организации платформа возвращает:

* **connectionUrl**
URL для доступа к inference API (OpenAI-совместимый).
Пример: `https://api.aillm.ru`

---


## + 11. Пример использования API

После получения API-ключа клиент может обращаться к LLMaaS напрямую:

**Запрос к chat completions:**

```bash
curl https://api.aillm.ru/v1/chat/completions + \
-H "Authorization: Bearer sk-..." \
-H "Content-Type: application/json" \
-d ''{
"model": "gpt-oss-120b",
"messages": [
{"role": "user", "content": "Привет!"}
]
}''
```

**Получение + списка доступных моделей:**

```bash
curl https://api.aillm.ru/v1/models \
-H "Authorization: Bearer sk-..."
```
' lifecycle: suspendOnDestroyDefault: false adoptExistingOnCreateDefault: false @@ -60,6 +66,10 @@ operations: operation: modify_team kind: subresource action: modify +- svcOperationId: 412 + operation: reconcile + kind: action + action: reconcile - svcOperationId: 277 operation: update_secrets kind: subresource @@ -227,6 +237,7 @@ cfsParamsByOp: - 865 - 873 - 874 + 412: [] 277: - 852 - 853 diff --git a/site/services/test/19_vc_org.yaml b/site/services/test/19_vc_org.yaml index 95fea45..5a4c297 100644 --- a/site/services/test/19_vc_org.yaml +++ b/site/services/test/19_vc_org.yaml @@ -73,6 +73,12 @@ cfsParams: valueList: - iaas - saas +- svcOperationCfsParamId: 1125 + svcOperationCfsParam: organizationSuffix + dataType: string + isRequired: false + defaultValue: '' + isModifiable: false - svcOperationCfsParamId: 871 svcOperationCfsParam: admins dataType: array-map-fixed @@ -110,7 +116,7 @@ cfsParams: isRequired: true isModifiable: false count: - dataType: integer > 0 + dataType: integer >= 0 defaultValue: '' isRequired: true isModifiable: false @@ -118,6 +124,7 @@ cfsParamsByOp: 136: - 418 - 556 + - 1125 283: - 871 137: [] @@ -131,3 +138,4 @@ cfsParamsByOp: stateParams: resourceRealm: sandbox.nubes.ru organizationType: iaas + organizationSuffix: '' diff --git a/site/services/test/1_dummy.yaml b/site/services/test/1_dummy.yaml index ff91e5b..e3da8cd 100644 --- a/site/services/test/1_dummy.yaml +++ b/site/services/test/1_dummy.yaml @@ -100,12 +100,12 @@ cfsParams: defaultValue: '' isRequired: false isModifiable: false - secret: + subparam2: dataType: string defaultValue: '' isRequired: false isModifiable: false - subparam2: + secret: dataType: string defaultValue: '' isRequired: false @@ -129,6 +129,25 @@ cfsParams: defaultValue: '' isModifiable: false dataDescriptor: + param1: + dataType: integer > 0 + defaultValue: '1' + isRequired: true + isModifiable: false + param2: + dataType: string + defaultValue: '1' + isRequired: true + isModifiable: false + valueList: + - '["1"' + - '"2"' + - '"3"]' + param3: + dataType: integer > 0 + defaultValue: '1' + isRequired: true + isModifiable: false bol1: dataType: boolean defaultValue: 'false' @@ -144,14 +163,21 @@ cfsParams: isModifiable: false valueList: - abracadabra +- svcOperationCfsParamId: 654 + svcOperationCfsParam: arrayMapFixedExample + dataType: array-map-fixed + isRequired: false + defaultValue: '' + isModifiable: false + dataDescriptor: param1: dataType: integer > 0 - defaultValue: '1' + defaultValue: '' isRequired: true isModifiable: false param2: dataType: string - defaultValue: '1' + defaultValue: '' isRequired: true isModifiable: false valueList: @@ -163,13 +189,6 @@ cfsParams: defaultValue: '1' isRequired: true isModifiable: false -- svcOperationCfsParamId: 654 - svcOperationCfsParam: arrayMapFixedExample - dataType: array-map-fixed - isRequired: false - defaultValue: '' - isModifiable: false - dataDescriptor: bol1: dataType: boolean defaultValue: '' @@ -185,25 +204,6 @@ cfsParams: isModifiable: false valueList: - abracadabra - param1: - dataType: integer > 0 - defaultValue: '' - isRequired: true - isModifiable: false - param2: - dataType: string - defaultValue: '' - isRequired: true - isModifiable: false - valueList: - - '["1"' - - '"2"' - - '"3"]' - param3: - dataType: integer > 0 - defaultValue: '1' - isRequired: true - isModifiable: false - svcOperationCfsParamId: 863 svcOperationCfsParam: arr dataType: array @@ -306,9 +306,9 @@ stateParams: whereFail: '1' resourceRealm: dummy bodymessage: '' - mapExample: '{"subparam1": "", "secret": "", "subparam2": ""}' + mapExample: '{"subparam1": "", "subparam2": "", "secret": ""}' jsonExample: '' nestedRefExample: '' - mapFixed: '{"bol1": false, "minStr1": "abracadabra", "param1": 1, "param2": "1", "param3": 1}' - arrayMapFixedExample: '{"bol1": false, "minStr1": "", "param1": 0, "param2": "", "param3": 1}' + mapFixed: '{"param1": 1, "param2": "1", "param3": 1, "bol1": false, "minStr1": "abracadabra"}' + arrayMapFixedExample: '{"param1": 0, "param2": "", "param3": 1, "bol1": false, "minStr1": ""}' arr: '' diff --git a/site/services/test/21_vc_vdc.yaml b/site/services/test/21_vc_vdc.yaml index 662531f..59e9991 100644 --- a/site/services/test/21_vc_vdc.yaml +++ b/site/services/test/21_vc_vdc.yaml @@ -58,13 +58,13 @@ cfsParams: dataType: uuid isRequired: true defaultValue: '' - isModifiable: false + isModifiable: true - svcOperationCfsParamId: 335 svcOperationCfsParam: providerVdc dataType: string isRequired: true defaultValue: '' - isModifiable: false + isModifiable: true - svcOperationCfsParamId: 361 svcOperationCfsParam: storageConfig dataType: array-map-fixed @@ -82,14 +82,22 @@ cfsParams: defaultValue: '2000' isRequired: true isModifiable: false + isDefaultStorageProfile: + dataType: boolean + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - 'false' + - 'true' - svcOperationCfsParamId: 397 svcOperationCfsParam: cpuGuaranteed - dataType: integer > 0 + dataType: integer >= 0 isRequired: true - defaultValue: '20' + defaultValue: '0' isModifiable: false valueList: - - '20' + - '0' - '50' - '80' - svcOperationCfsParamId: 557 @@ -109,6 +117,12 @@ cfsParams: dataType: string isRequired: true defaultValue: '' + isModifiable: true +- svcOperationCfsParamId: 1130 + svcOperationCfsParam: suffixName + dataType: string + isRequired: false + defaultValue: jj94bkhm isModifiable: false - svcOperationCfsParamId: 560 svcOperationCfsParam: cpuAllocated @@ -139,6 +153,32 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false + isDefaultStorageProfile: + dataType: boolean + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - 'false' + - 'true' +- svcOperationCfsParamId: 1158 + svcOperationCfsParam: organizationUid + dataType: uuid + isRequired: false + defaultValue: '' + isModifiable: true +- svcOperationCfsParamId: 1159 + svcOperationCfsParam: networkProvider + dataType: string + isRequired: false + defaultValue: '' + isModifiable: true +- svcOperationCfsParamId: 1160 + svcOperationCfsParam: providerVdc + dataType: string + isRequired: false + defaultValue: '' + isModifiable: true cfsParamsByOp: 9: - 30 @@ -148,19 +188,24 @@ cfsParamsByOp: - 557 - 558 - 746 + - 1130 24: [] 112: - 560 - 561 - 562 + - 1158 + - 1159 + - 1160 250: [] 172: [] 171: [] stateParams: organizationUid: '' providerVdc: '' - storageConfig: '{"name": "", "size": 2000}' - cpuGuaranteed: '20' + storageConfig: '{"name": "", "size": 2000, "isDefaultStorageProfile": false}' + cpuGuaranteed: '0' cpuAllocated: '80' memAllocated: '200' networkProvider: '' + suffixName: jj94bkhm diff --git a/site/services/test/22_vc_nsxt.yaml b/site/services/test/22_vc_nsxt.yaml index 9988cbc..3ffc72f 100644 --- a/site/services/test/22_vc_nsxt.yaml +++ b/site/services/test/22_vc_nsxt.yaml @@ -88,6 +88,28 @@ cfsParams: isRequired: false defaultValue: '' isModifiable: true +- svcOperationCfsParamId: 1110 + svcOperationCfsParam: routedNetConfiguration + dataType: map-fixed + isRequired: true + defaultValue: '' + isModifiable: true + dataDescriptor: + ipAddrPool: + dataType: string + defaultValue: 10.10.102.0/24 + isRequired: true + isModifiable: false + mainDns: + dataType: string + defaultValue: 81.22.46.22 + isRequired: true + isModifiable: false + secondDns: + dataType: string + defaultValue: 185.247.187.77 + isRequired: true + isModifiable: false - svcOperationCfsParamId: 368 svcOperationCfsParam: needEnableAVI dataType: boolean @@ -115,6 +137,28 @@ cfsParams: isRequired: false defaultValue: '' isModifiable: true +- svcOperationCfsParamId: 1112 + svcOperationCfsParam: routedNetConfiguration + dataType: map-fixed + isRequired: true + defaultValue: '' + isModifiable: true + dataDescriptor: + ipAddrPool: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false + mainDns: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false + secondDns: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false cfsParamsByOp: 10: - 8 @@ -123,12 +167,14 @@ cfsParamsByOp: - 621 - 622 - 825 + - 1110 25: [] 111: - 368 - 369 - 372 - 856 + - 1112 252: [] stateParams: vdcUid: '' @@ -137,3 +183,4 @@ stateParams: vdcType: vdc vdcGroupUid: '' qosProfile: '' + routedNetConfiguration: '{"ipAddrPool": "10.10.102.0/24", "mainDns": "81.22.46.22", "secondDns": "185.247.187.77"}' diff --git a/site/services/test/26_vapp.yaml b/site/services/test/26_vapp.yaml index 140f01c..63c28d7 100644 --- a/site/services/test/26_vapp.yaml +++ b/site/services/test/26_vapp.yaml @@ -52,7 +52,7 @@ cfsParams: svcOperationCfsParam: vappName dataType: string isRequired: true - defaultValue: hf1t7p5c + defaultValue: pa1kkjwl isModifiable: false - svcOperationCfsParamId: 623 svcOperationCfsParam: vdcUid @@ -71,5 +71,5 @@ cfsParamsByOp: 208: [] stateParams: nsxtUid: '' - vappName: hf1t7p5c + vappName: pa1kkjwl vdcUid: '' diff --git a/site/services/test/28_vc_vm_v3.yaml b/site/services/test/28_vc_vm_v3.yaml index a790017..bd1c3e4 100644 --- a/site/services/test/28_vc_vm_v3.yaml +++ b/site/services/test/28_vc_vm_v3.yaml @@ -96,9 +96,9 @@ cfsParams: isModifiable: true - svcOperationCfsParamId: 413 svcOperationCfsParam: accessIpList - dataType: json + dataType: array isRequired: false - defaultValue: '' + defaultValue: '["0.0.0.0/0"]' isModifiable: true - svcOperationCfsParamId: 414 svcOperationCfsParam: imageVm @@ -126,10 +126,34 @@ cfsParams: isModifiable: false - svcOperationCfsParamId: 448 svcOperationCfsParam: accessPortList - dataType: string + dataType: array-map-fixed isRequired: true - defaultValue: '["22"]' + defaultValue: '[{"port": "22", "type": "tcp"}, {"port": "10050", "type": "tcp"}]' isModifiable: true + dataDescriptor: + port: + dataType: string + defaultValue: '22' + isRequired: true + isModifiable: false + type: + dataType: string + defaultValue: all + isRequired: true + isModifiable: false + valueList: + - tcp + - udp + - all +- svcOperationCfsParamId: 1118 + svcOperationCfsParam: sameSnat + dataType: boolean + isRequired: false + defaultValue: 'false' + isModifiable: true + valueList: + - 'false' + - 'true' - svcOperationCfsParamId: 493 svcOperationCfsParam: vmCpu dataType: integer > 0 @@ -154,11 +178,6 @@ cfsParams: isRequired: false defaultValue: '' isModifiable: true - valueList: - - no-needed - - internet-antiddos-v1 - - internet-no-antiddos-v1 - - internet-ipv4-v1 - svcOperationCfsParamId: 497 svcOperationCfsParam: accessIpList dataType: json @@ -167,10 +186,34 @@ cfsParams: isModifiable: true - svcOperationCfsParamId: 498 svcOperationCfsParam: accessPortList - dataType: json + dataType: array-map-fixed isRequired: false defaultValue: '' isModifiable: true + dataDescriptor: + port: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false + type: + dataType: string + defaultValue: all + isRequired: true + isModifiable: false + valueList: + - tcp + - udp + - all +- svcOperationCfsParamId: 1119 + svcOperationCfsParam: sameSnat + dataType: boolean + isRequired: true + defaultValue: '' + isModifiable: true + valueList: + - 'false' + - 'true' - svcOperationCfsParamId: 509 svcOperationCfsParam: vmName dataType: string @@ -201,11 +244,6 @@ cfsParams: isRequired: false defaultValue: '' isModifiable: true - valueList: - - no-needed - - internet-antiddos-v1 - - internet-no-antiddos-v1 - - internet-ipv4-v1 - svcOperationCfsParamId: 514 svcOperationCfsParam: accessIpList dataType: json @@ -242,10 +280,34 @@ cfsParams: isModifiable: true - svcOperationCfsParamId: 520 svcOperationCfsParam: accessPortList - dataType: json + dataType: array-map-fixed isRequired: false defaultValue: '' isModifiable: true + dataDescriptor: + port: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false + type: + dataType: string + defaultValue: all + isRequired: true + isModifiable: false + valueList: + - tcp + - udp + - all +- svcOperationCfsParamId: 1123 + svcOperationCfsParam: sameSnat + dataType: boolean + isRequired: true + defaultValue: '' + isModifiable: true + valueList: + - 'false' + - 'true' cfsParamsByOp: 132: - 407 @@ -260,6 +322,7 @@ cfsParamsByOp: - 416 - 417 - 448 + - 1118 133: [] 159: - 493 @@ -268,6 +331,7 @@ cfsParamsByOp: - 496 - 497 - 498 + - 1119 286: [] 164: - 509 @@ -281,6 +345,7 @@ cfsParamsByOp: - 517 - 518 - 520 + - 1123 135: [] 134: [] stateParams: @@ -290,9 +355,10 @@ stateParams: vmRam: '1' vmDisk: '' ipSpaceName: '' - accessIpList: '' + accessIpList: '["0.0.0.0/0"]' imageVm: '' cloudInit: '' userLogin: myuser userPublicKey: '' - accessPortList: '["22"]' + accessPortList: '{"port": "22", "type": "all"}' + sameSnat: 'false' diff --git a/site/services/test/2_template.yaml b/site/services/test/2_template.yaml index 9b90b83..e4b9cd1 100644 --- a/site/services/test/2_template.yaml +++ b/site/services/test/2_template.yaml @@ -44,11 +44,6 @@ cfsParams: defaultValue: '100' isRequired: true isModifiable: false - disk: - dataType: integer > 0 - defaultValue: '5' - isRequired: true - isModifiable: false memory: dataType: integer > 0 defaultValue: '128' @@ -59,6 +54,11 @@ cfsParams: defaultValue: '1' isRequired: true isModifiable: false + disk: + dataType: integer > 0 + defaultValue: '5' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 814 svcOperationCfsParam: startupConfiguration dataType: map-fixed @@ -75,7 +75,6 @@ cfsParams: - iot-naeel - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 - svcOperationCfsParamId: 815 svcOperationCfsParam: accessConfiguration dataType: map-fixed @@ -83,11 +82,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - slaveAccessList: - dataType: json - defaultValue: '[]' - isRequired: true - isModifiable: false type: dataType: string defaultValue: ingress @@ -98,7 +92,7 @@ cfsParams: - service domain: dataType: string - defaultValue: abracadabra-aoy3qnll + defaultValue: abracadabra-1jrzjeyu isRequired: true isModifiable: false masterIpSpace: @@ -116,6 +110,11 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false + slaveAccessList: + dataType: json + defaultValue: '[]' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 816 svcOperationCfsParam: clusterConfiguration dataType: map-fixed @@ -128,13 +127,13 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false - disk: - dataType: integer >= 0 + memory: + dataType: integer > 0 defaultValue: '' isRequired: true isModifiable: false - memory: - dataType: integer > 0 + disk: + dataType: integer >= 0 defaultValue: '' isRequired: true isModifiable: false @@ -168,13 +167,13 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false - masterAccessList: - dataType: json + slaveIpSpace: + dataType: string defaultValue: '' isRequired: true isModifiable: false - slaveIpSpace: - dataType: string + masterAccessList: + dataType: json defaultValue: '' isRequired: true isModifiable: false @@ -196,6 +195,6 @@ cfsParamsByOp: 98: [] 97: [] stateParams: - clusterConfiguration: '{"cpu": 100, "disk": 5, "memory": 128, "replicas": 1}' + clusterConfiguration: '{"cpu": 100, "memory": 128, "replicas": 1, "disk": 5}' startupConfiguration: '{"resourceRealm": ""}' - accessConfiguration: '{"slaveAccessList": "[]", "type": "ingress", "domain": "abracadabra-aoy3qnll", "masterIpSpace": "", "masterAccessList": "[]", "slaveIpSpace": ""}' + accessConfiguration: '{"type": "ingress", "domain": "abracadabra-1jrzjeyu", "masterIpSpace": "", "masterAccessList": "[]", "slaveIpSpace": "", "slaveAccessList": "[]"}' diff --git a/site/services/test/50_nextcloud.yaml b/site/services/test/50_nextcloud.yaml index 38a9156..552d8c2 100644 --- a/site/services/test/50_nextcloud.yaml +++ b/site/services/test/50_nextcloud.yaml @@ -2,7 +2,49 @@ name: nextcloud service_id: 50 service_display_name: Nextcloud service_short_name: nextcloud -service_man: 'Ресурсная платформа: k8s. Автоматизация: helm chart' +service_man: '# Инструкция по развертыванию Nextcloud через платформу

## 1. Общая информация

Nextcloud — платформа для хранения и совместной работы с файлами. Разворачивается в K8s через + Helm-чарт `nextcloud/nextcloud`.

Сервис **не самодостаточен** — для создания необходимы заранее развёрнутые в той же ресурсной платформе:

* **PostgreSQL (k8s)** — база данных Nextcloud. + У СУБД должен быть выставлен параметр `sslRequired: false`.
* **Redis (k8s)** — используется как memcache/locking backend.

Резервное копирование выполняется через **Velero** (бэкапятся под + и PVC с данными), а не штатным S3-бэкапом СУБД.

### Доступные операции с сервисом

* **create** — создание сервиса
* **delete** — удаление сервиса
* **suspend** — + остановка сервиса (масштабирование реплик в 0)
* **resume** — запуск сервиса
* **restart** — перезапуск (`kubectl rollout restart`)
* **modify** — изменение настроек + сервиса
* **reconcile** — служебная операция синхронизации версии (запускается платформой автоматически)
* **create_backup** — создание резервной копии вручную (через Velero)
* **recovery** — + восстановление из резервной копии в **новый** инстанс

> **Примечание:** операций работы с пользователями Nextcloud (`create_user`/`modify_user`/`delete_user`) на уровне платформы нет — пользователи + приложения администрируются внутри самого Nextcloud.

---

## 2. Параметры создания сервиса

### Платформа для развертывания

Ресурсная платформа (`resourceRealm`), в которой + будет развёрнут сервис. PostgreSQL и Redis, указанные ниже, обязаны находиться в той же ресурсной платформе.

### СУБД PostgreSQL (psqlUid)

UID инстанса PostgreSQL (k8s), в котором будет + создана база и пользователь `nextcloud`.

* У выбранной СУБД должна отсутствовать база `nextcloud` и пользователь `nextcloud`.
* У СУБД обязан быть выключен `sslRequired` (`false`).

### + СУБД Redis (redisUid)

UID инстанса Redis (k8s), который будет использоваться как memcache/locking backend.

### Количество реплик

Количество реплик Nextcloud (`clusterConfiguration.replicas`).

### + Квота памяти пода (MB)

Объём памяти для пода Nextcloud в мегабайтах.
Пример: `2048`

### Квота CPU пода (mCPU)

CPU-квота для пода Nextcloud в миликорах (1000 mCPU = 1 vCPU).
Пример: + `1000`

### Размер диска для данных (GB)

Объём диска под данные Nextcloud (`/var/www/html/data`) в гигабайтах.
Пример: `20`

### Домен

Домен, на котором будет доступен + Nextcloud (`accessConfiguration.domain`).

* Если указано **полное доменное имя** (содержит точку, например `cloud.company.ru`) — домен считается клиентским. Перед созданием клиент обязан сам + настроить DNS-запись, указывающую на адрес Ingress платформы, иначе создание завершится ошибкой.
* Если указано **короткое имя** (без точки, например `mycloud`) — платформа сама создаёт DNS-запись + вида `.nextcloudk8s` и настраивает сертификат.

### Версия

Версия приложения Nextcloud (`appConfiguration.version`, поле `appVersion` Helm-чарта). По ней автоматически подбирается + последняя подходящая версия Helm-чарта.

> **Примечание:** список поддерживаемых версий и допустимые шаги обновления заданы в `pipelines/stages/functions/helm.groovy` (см. раздел 13).

### + Document Server

Параметр `appConfiguration.documentServer`. Если указать `collabora` — в кластер дополнительно разворачивается Collabora Online (совместное редактирование офисных документов), + доступный по пути `/collabora` на том же домене.
Оставьте пустым, если Document Server не нужен.

### Уровень логирования

Параметр `appConfiguration.logLevel`. Одно из значений: `DEBUG`, + `INFO`, `WARN`, `ERROR`, `FATAL`, либо `NONE` — чтобы не переопределять логирование Nextcloud.

---

## 3. Параметры модификации сервиса

Изменению подлежат ресурсы, версия и часть + `appConfiguration`. Параметры `psqlUid`/`redisUid` менять после создания не рекомендуется.

### Количество реплик

См. раздел 2.

### Квота памяти пода (MB) / Квота CPU пода (mCPU) + / Размер диска (GB)

См. раздел 2.

> **Примечание:** уменьшить уже выделенный размер диска нельзя.

### Версия

Обновление версии разрешено только **на один патч** либо + **на одну минорную версию вперёд** (с `patch=0`). Прыжок сразу через несколько минорных версий или через несколько мажорных версий запрещён — обновляться нужно последовательно.

> **Примечание:** + перед обновлением на новую minor/major-версию необходимо сначала выполнить `modify` на текущей версии, обновившись до последнего релиза этой версии (иначе операция завершится ошибкой с описанием, до какой + версии нужно обновиться сначала).

### Document Server / Уровень логирования

См. раздел 2.

---

## 4. Параметры удаления сервиса

Специальных параметров нет — + удаление сносит namespace целиком.

> **Примечание:** резервные копии, созданные через `create_backup`, хранятся в Velero отдельно от инстанса и **не удаляются** вместе с сервисом — операции `delete_backup` + для Nextcloud нет, копии нужно вычищать на стороне Velero отдельно.

---

## 5. Параметры создания бэкапа

Специальных пользовательских параметров нет — имя бэкапа генерируется + автоматически в формате `<дата>-<версия>-`.

> **Примечание:** создать бэкап можно только если сервис предварительно приостановлен (`suspend`). Velero, в который создаётся бэкап, должен + быть развёрнут в той же ресурсной платформе, что и Nextcloud, и не может быть сменён на другой Velero-инстанс в рамках одного сервиса.

Бэкапится под с данными вместе с PVC/PV (файлы), метаданные + и БД PostgreSQL бэкапом не затрагиваются — версия схемы БД фиксируется отдельно (см. раздел 6).

---

## 6. Параметры восстановления из бэкапа (recovery)

В отличие от СУБД-сервисов, + `recovery` у Nextcloud **не восстанавливает данные в текущий инстанс**, а создаёт **новый** инстанс сервиса (аналог `create`), в который переносятся файлы из указанной резервной копии.

### Точка + восстановления (recoveryPoint)

Имя резервной копии Velero, из которой будет выполнено восстановление.

### Домен нового инстанса

Обязан отличаться от домена исходного (текущего) + инстанса — восстановление на тот же домен не поддерживается.

### СУБД PostgreSQL нового инстанса

Если версия Nextcloud в бэкапе отличается от текущей версии инстанса, для нового инстанса + обязательно нужно указать **другую** СУБД PostgreSQL (нельзя восстанавливать бэкап со старой схемой БД поверх БД с более новой схемой).

---

## 7. Выходные параметры

После успешного + создания сервиса платформа возвращает:

### connectionUrl

Адрес для входа в Nextcloud: `https://<домен>`.

### namespace

Namespace в K8s-кластере, в котором развёрнут + сервис.

### Учётные данные (Vault)

В Vault сохраняется пароль администратора (`adminPass`) под логином `admin`.

---

## 8. Пример подключения

Откройте `connectionUrl` + в браузере и авторизуйтесь:

* **Логин:** `admin`
* **Пароль:** значение `adminPass` из блока «Учётные данные» в Vault

---

## 9. Дополнительная информация

### Зависимости

Nextcloud + нельзя создать без уже существующих в том же `resourceRealm` сервисов PostgreSQL (k8s, `sslRequired: false`) и Redis (k8s). При `delete` зависимые СУБД и Redis не трогаются — удаляется только сам Nextcloud.

### + suspend/resume

При `suspend` количество реплик Nextcloud, Collabora и exporter''а метрик принудительно выставляется в `0` через `helm upgrade` (реальное масштабирование, а не просто пауза cron). + При `resume` реплики возвращаются к значению из `clusterConfiguration.replicas`.

### Collabora

Собирается из отдельного `image.repository: nexus-sa.tst.nubes.ru/collabora/code` и включается + только при `appConfiguration.documentServer == ''collabora''`. Доступен на том же домене и том же TLS-сертификате, что и сам Nextcloud, по пути `/collabora`.

### Бэкап/восстановление через Velero

Бэкап/восстановление + файлов идёт через Velero с селектором `backup=-velero-backup` и включает под, PVC и PV — то есть непосредственно файлы `/var/www/html/data`. Восстановление БД в новый инстанс выполняется + штатным механизмом `create` с параметром `instanceUidFrom`, который проставляет `recovery`-джоба автоматически.
' lifecycle: suspendOnDestroyDefault: true adoptExistingOnCreateDefault: false @@ -53,11 +95,6 @@ cfsParams: defaultValue: '' isModifiable: false dataDescriptor: - redisUid: - dataType: uuid - defaultValue: '' - isRequired: true - isModifiable: false resourceRealm: dataType: string defaultValue: '' @@ -67,7 +104,6 @@ cfsParams: - iot-naeel - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 psqlEnabled: dataType: boolean defaultValue: 'true' @@ -87,6 +123,11 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false + redisUid: + dataType: uuid + defaultValue: '' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 1056 svcOperationCfsParam: clusterConfiguration dataType: map-fixed @@ -94,19 +135,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - replicas: - dataType: integer > 0 - defaultValue: '1' - isRequired: true - isModifiable: false - valueList: - - '1' - - '2' - disk: - dataType: integer > 0 - defaultValue: '10' - isRequired: true - isModifiable: false cpu: dataType: integer > 0 defaultValue: '1000' @@ -131,6 +159,19 @@ cfsParams: - '6144' - '7168' - '8192' + replicas: + dataType: integer > 0 + defaultValue: '1' + isRequired: true + isModifiable: false + valueList: + - '1' + - '2' + disk: + dataType: integer > 0 + defaultValue: '10' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 1057 svcOperationCfsParam: accessConfiguration dataType: map-fixed @@ -140,7 +181,7 @@ cfsParams: dataDescriptor: domain: dataType: string - defaultValue: nextcloud-vjp2crbf + defaultValue: nextcloud-3szbprk2 isRequired: true isModifiable: false - svcOperationCfsParamId: 1058 @@ -239,18 +280,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - logLevel: - dataType: string - defaultValue: '' - isRequired: true - isModifiable: false - valueList: - - DEBUG - - INFO - - WARN - - ERROR - - FATAL - - NONE version: dataType: string defaultValue: '' @@ -265,6 +294,18 @@ cfsParams: isModifiable: false valueList: - collabora + logLevel: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - DEBUG + - INFO + - WARN + - ERROR + - FATAL + - NONE - svcOperationCfsParamId: 1078 svcOperationCfsParam: startupConfiguration dataType: map-fixed @@ -281,17 +322,6 @@ cfsParams: - iot-naeel - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 - veleroUid: - dataType: string - defaultValue: '' - isRequired: true - isModifiable: false - recoveryPoint: - dataType: string - defaultValue: '' - isRequired: true - isModifiable: false psqlEnabled: dataType: boolean defaultValue: 'true' @@ -306,6 +336,11 @@ cfsParams: isModifiable: false valueList: - 'true' + recoveryPoint: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false psqlUid: dataType: uuid defaultValue: '' @@ -316,6 +351,11 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false + veleroUid: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 1079 svcOperationCfsParam: clusterConfiguration dataType: map-fixed @@ -366,7 +406,7 @@ cfsParams: dataDescriptor: domain: dataType: string - defaultValue: nextcloud-dcxz2gqv + defaultValue: nextcloud-toakrhso isRequired: true isModifiable: false - svcOperationCfsParamId: 1081 @@ -376,6 +416,13 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: + documentServer: + dataType: string + defaultValue: collabora + isRequired: true + isModifiable: false + valueList: + - collabora logLevel: dataType: string defaultValue: NONE @@ -393,13 +440,6 @@ cfsParams: defaultValue: '' isRequired: false isModifiable: false - documentServer: - dataType: string - defaultValue: collabora - isRequired: true - isModifiable: false - valueList: - - collabora cfsParamsByOp: 16: - 1055 @@ -422,7 +462,7 @@ cfsParamsByOp: 129: [] 128: [] stateParams: - startupConfiguration: '{"redisUid": "", "resourceRealm": "", "psqlEnabled": true, "redisEnabled": true, "psqlUid": ""}' - clusterConfiguration: '{"replicas": 1, "disk": 10, "cpu": 1000, "memory": 1024}' - accessConfiguration: '{"domain": "nextcloud-vjp2crbf"}' + startupConfiguration: '{"resourceRealm": "", "psqlEnabled": true, "redisEnabled": true, "psqlUid": "", "redisUid": ""}' + clusterConfiguration: '{"cpu": 1000, "memory": 1024, "replicas": 1, "disk": 10}' + accessConfiguration: '{"domain": "nextcloud-3szbprk2"}' appConfiguration: '{"version": "33.0.4", "documentServer": "collabora", "logLevel": "INFO"}' diff --git a/site/services/test/81_superset.yaml b/site/services/test/81_superset.yaml index 5520a16..7a273ff 100644 --- a/site/services/test/81_superset.yaml +++ b/site/services/test/81_superset.yaml @@ -57,7 +57,6 @@ cfsParams: - iot-naeel - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 - svcOperationCfsParamId: 227 svcOperationCfsParam: resourceInstances dataType: integer > 0 diff --git a/site/services/test/82_harbor.yaml b/site/services/test/82_harbor.yaml index 7f928a2..95a4389 100644 --- a/site/services/test/82_harbor.yaml +++ b/site/services/test/82_harbor.yaml @@ -7,7 +7,7 @@ service_man: 'Расширенный реестр для управления Do процесса непрерывной интеграции. Контейнеры идеально подходят для запуска небольших, независимых и легко изменяемых сервисов.
Чтобы начать работу, создайте реестр и загрузите в него Docker-образ
Авторизация: keycloak' lifecycle: - suspendOnDestroyDefault: false + suspendOnDestroyDefault: true adoptExistingOnCreateDefault: false operations: - svcOperationId: 14 @@ -22,6 +22,18 @@ operations: operation: modify kind: instance action: modify +- svcOperationId: 405 + operation: reconcile + kind: action + action: reconcile +- svcOperationId: 415 + operation: resume + kind: instance + action: resume +- svcOperationId: 416 + operation: suspend + kind: instance + action: suspend stateOut: {} cfsParams: - svcOperationCfsParamId: 16 @@ -40,18 +52,17 @@ cfsParams: - iot-naeel - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 - svcOperationCfsParamId: 228 svcOperationCfsParam: resourceCPU dataType: integer > 0 isRequired: true - defaultValue: '100' + defaultValue: '1000' isModifiable: true - svcOperationCfsParamId: 229 svcOperationCfsParam: resourceMemory dataType: integer > 0 isRequired: true - defaultValue: '200' + defaultValue: '1024' isModifiable: true - svcOperationCfsParamId: 230 svcOperationCfsParam: resourceInstances @@ -62,9 +73,33 @@ cfsParams: - svcOperationCfsParamId: 231 svcOperationCfsParam: s3Uid dataType: uuid - isRequired: true + isRequired: false defaultValue: '' isModifiable: false +- svcOperationCfsParamId: 1126 + svcOperationCfsParam: pvType + dataType: string + isRequired: true + defaultValue: s3 + isModifiable: false + valueList: + - s3 + - local +- svcOperationCfsParamId: 1127 + svcOperationCfsParam: resourceDisk + dataType: integer > 0 + isRequired: false + defaultValue: '5' + isModifiable: true +- svcOperationCfsParamId: 1128 + svcOperationCfsParam: authType + dataType: string + isRequired: true + defaultValue: local + isModifiable: false + valueList: + - local + - keycloak - svcOperationCfsParamId: 822 svcOperationCfsParam: resourceInstances dataType: integer > 0 @@ -83,6 +118,12 @@ cfsParams: isRequired: true defaultValue: '' isModifiable: true +- svcOperationCfsParamId: 1129 + svcOperationCfsParam: resourceDisk + dataType: integer > 0 + isRequired: false + defaultValue: '' + isModifiable: true cfsParamsByOp: 14: - 16 @@ -91,15 +132,25 @@ cfsParamsByOp: - 229 - 230 - 231 + - 1126 + - 1127 + - 1128 15: [] 270: - 822 - 823 - 824 + - 1129 + 405: [] + 415: [] + 416: [] stateParams: domain: harbor-1 resourceRealm: '' - resourceCPU: '100' - resourceMemory: '200' + resourceCPU: '1000' + resourceMemory: '1024' resourceInstances: '1' s3Uid: '' + pvType: s3 + resourceDisk: '5' + authType: local diff --git a/site/services/test/86_k8s_velero.yaml b/site/services/test/86_k8s_velero.yaml index 48b874d..757ca8d 100644 --- a/site/services/test/86_k8s_velero.yaml +++ b/site/services/test/86_k8s_velero.yaml @@ -74,7 +74,6 @@ cfsParams: - iot-naeel - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 - svcOperationCfsParamId: 964 svcOperationCfsParam: nodeAgentConfiguration dataType: map-fixed diff --git a/site/services/test/89_flask.yaml b/site/services/test/89_flask.yaml index f3ccfb8..fe82110 100644 --- a/site/services/test/89_flask.yaml +++ b/site/services/test/89_flask.yaml @@ -69,7 +69,6 @@ cfsParams: - iot-naeel - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 - svcOperationCfsParamId: 1038 svcOperationCfsParam: clusterConfiguration dataType: map-fixed @@ -106,7 +105,7 @@ cfsParams: dataDescriptor: domain: dataType: string - defaultValue: flask-ub0sbq5h + defaultValue: flask-nvhm0w5n isRequired: true isModifiable: false - svcOperationCfsParamId: 1040 @@ -116,13 +115,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - version: - dataType: string - defaultValue: '3.12' - isRequired: true - isModifiable: false - valueList: - - '3.12' gitPath: dataType: string defaultValue: https://github.com/Foxyhhd/Baldurs-Gate-test.git @@ -133,6 +125,13 @@ cfsParams: defaultValue: '' isRequired: false isModifiable: false + version: + dataType: string + defaultValue: '3.12' + isRequired: true + isModifiable: false + valueList: + - '3.12' - svcOperationCfsParamId: 1041 svcOperationCfsParam: jsonEnv dataType: map @@ -173,13 +172,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - version: - dataType: string - defaultValue: '' - isRequired: true - isModifiable: false - valueList: - - '3.12' gitPath: dataType: string defaultValue: '' @@ -190,6 +182,13 @@ cfsParams: defaultValue: '' isRequired: false isModifiable: false + version: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - '3.12' - svcOperationCfsParamId: 1044 svcOperationCfsParam: jsonEnv dataType: map @@ -212,7 +211,6 @@ cfsParams: - iot-naeel - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 cfsParamsByOp: 376: - 1037 @@ -233,6 +231,6 @@ cfsParamsByOp: stateParams: startupConfiguration: '{"resourceRealm": ""}' clusterConfiguration: '{"cpu": 200, "memory": 256, "replicas": 1}' - accessConfiguration: '{"domain": "flask-ub0sbq5h"}' - appConfiguration: '{"version": "3.12", "gitPath": "https://github.com/Foxyhhd/Baldurs-Gate-test.git", "healthPath": ""}' + accessConfiguration: '{"domain": "flask-nvhm0w5n"}' + appConfiguration: '{"gitPath": "https://github.com/Foxyhhd/Baldurs-Gate-test.git", "healthPath": "", "version": "3.12"}' jsonEnv: '{}' diff --git a/site/services/test/90_postgres.yaml b/site/services/test/90_postgres.yaml index 207f0aa..20f34d2 100644 --- a/site/services/test/90_postgres.yaml +++ b/site/services/test/90_postgres.yaml @@ -101,6 +101,16 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: + cpu: + dataType: integer > 0 + defaultValue: '500' + isRequired: true + isModifiable: false + memory: + dataType: integer > 0 + defaultValue: '512' + isRequired: true + isModifiable: false replicas: dataType: integer > 0 defaultValue: '1' @@ -116,16 +126,6 @@ cfsParams: defaultValue: '10' isRequired: true isModifiable: false - cpu: - dataType: integer > 0 - defaultValue: '500' - isRequired: true - isModifiable: false - memory: - dataType: integer > 0 - defaultValue: '512' - isRequired: true - isModifiable: false - svcOperationCfsParamId: 789 svcOperationCfsParam: startupConfiguration dataType: map-fixed @@ -142,7 +142,6 @@ cfsParams: - iot-naeel - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 - svcOperationCfsParamId: 790 svcOperationCfsParam: accessConfiguration dataType: map-fixed @@ -150,11 +149,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - slaveAccessList: - dataType: json - defaultValue: '[]' - isRequired: true - isModifiable: false masterIpSpace: dataType: string defaultValue: '' @@ -170,6 +164,11 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false + slaveAccessList: + dataType: json + defaultValue: '[]' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 791 svcOperationCfsParam: postgresConfiguration dataType: map-fixed @@ -183,16 +182,10 @@ cfsParams: isRequired: true isModifiable: false valueList: + - '18' - '17' - '16' - sslRequired: - dataType: boolean - defaultValue: 'true' - isRequired: true - isModifiable: false - valueList: - - 'false' - - 'true' + - '15' poolerMaster: dataType: boolean defaultValue: 'false' @@ -209,25 +202,41 @@ cfsParams: valueList: - 'false' - 'true' + sslRequired: + dataType: boolean + defaultValue: 'true' + isRequired: true + isModifiable: false + valueList: + - 'true' + - 'false' - svcOperationCfsParamId: 792 svcOperationCfsParam: postgresConf - dataType: array-map-fixed + dataType: map-fixed isRequired: false defaultValue: '' isModifiable: true dataDescriptor: - paramName: + log_disconnections: dataType: string - defaultValue: '' - isRequired: true + defaultValue: 'off' + isRequired: false isModifiable: false valueList: - - log_connections - - log_disconnections - paramValue: + - 'off' + - 'on' + log_connections: dataType: string - defaultValue: '' - isRequired: true + defaultValue: 'off' + isRequired: false + isModifiable: false + valueList: + - 'off' + - 'on' + max_connections: + dataType: integer > 0 + defaultValue: '100' + isRequired: false isModifiable: false - svcOperationCfsParamId: 793 svcOperationCfsParam: backupConfiguration @@ -237,9 +246,9 @@ cfsParams: isModifiable: true dataDescriptor: s3Uid: - dataType: uuid - defaultValue: '' - isRequired: true + dataType: string + defaultValue: 00000000-0000-0000-0000-000000000000 + isRequired: false isModifiable: false retain: dataType: integer > 0 @@ -251,6 +260,11 @@ cfsParams: defaultValue: 0 0 * * * isRequired: true isModifiable: false + incrementCount: + dataType: integer >= 0 + defaultValue: '0' + isRequired: false + isModifiable: false - svcOperationCfsParamId: 794 svcOperationCfsParam: autoscaleConfiguration dataType: map-fixed @@ -258,15 +272,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - percent: - dataType: integer > 0 - defaultValue: '10' - isRequired: true - isModifiable: false - valueList: - - '10' - - '15' - - '20' enabled: dataType: boolean defaultValue: 'false' @@ -290,6 +295,15 @@ cfsParams: defaultValue: '100' isRequired: true isModifiable: false + percent: + dataType: integer > 0 + defaultValue: '10' + isRequired: true + isModifiable: false + valueList: + - '10' + - '15' + - '20' - svcOperationCfsParamId: 1094 svcOperationCfsParam: mtlsConfiguration dataType: map-fixed @@ -297,11 +311,6 @@ cfsParams: defaultValue: '{}' isModifiable: true dataDescriptor: - certServer: - dataType: string - defaultValue: '' - isRequired: false - isModifiable: false type: dataType: string defaultValue: 'off' @@ -318,7 +327,7 @@ cfsParams: isModifiable: false durationServer: dataType: integer > 0 - defaultValue: '87600' + defaultValue: '43800' isRequired: true isModifiable: false certCA: @@ -326,6 +335,11 @@ cfsParams: defaultValue: '' isRequired: false isModifiable: false + certServer: + dataType: string + defaultValue: '' + isRequired: false + isModifiable: false - svcOperationCfsParamId: 741 svcOperationCfsParam: dbName dataType: string @@ -455,6 +469,7 @@ cfsParams: isRequired: true isModifiable: false valueList: + - '18' - '17' - '16' sslRequired: @@ -480,24 +495,32 @@ cfsParams: - 'true' - svcOperationCfsParamId: 798 svcOperationCfsParam: postgresConf - dataType: array-map-fixed + dataType: map-fixed isRequired: false defaultValue: '' isModifiable: true dataDescriptor: - paramValue: + log_connections: dataType: string defaultValue: '' - isRequired: true - isModifiable: false - paramName: - dataType: string - defaultValue: '' - isRequired: true + isRequired: false isModifiable: false valueList: - - log_connections - - log_disconnections + - 'off' + - 'on' + log_disconnections: + dataType: string + defaultValue: '' + isRequired: false + isModifiable: false + valueList: + - 'off' + - 'on' + max_connections: + dataType: integer > 0 + defaultValue: '' + isRequired: false + isModifiable: false - svcOperationCfsParamId: 799 svcOperationCfsParam: backupConfiguration dataType: map-fixed @@ -505,11 +528,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - s3Uid: - dataType: uuid - defaultValue: '' - isRequired: true - isModifiable: false retain: dataType: integer > 0 defaultValue: '' @@ -520,6 +538,16 @@ cfsParams: defaultValue: 0 0 * * * isRequired: true isModifiable: false + s3Uid: + dataType: uuid + defaultValue: '' + isRequired: true + isModifiable: false + incrementCount: + dataType: integer >= 0 + defaultValue: '' + isRequired: false + isModifiable: false - svcOperationCfsParamId: 800 svcOperationCfsParam: autoscaleConfiguration dataType: map-fixed @@ -527,20 +555,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - quota: - dataType: integer > 0 - defaultValue: '' - isRequired: true - isModifiable: false - percent: - dataType: integer > 0 - defaultValue: '' - isRequired: true - isModifiable: false - valueList: - - '10' - - '15' - - '20' enabled: dataType: boolean defaultValue: '' @@ -559,6 +573,20 @@ cfsParams: - '5' - '12' - '23' + quota: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false + percent: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - '10' + - '15' + - '20' - svcOperationCfsParamId: 1095 svcOperationCfsParam: mtlsConfiguration dataType: map-fixed @@ -566,6 +594,15 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: + type: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - 'off' + - manual + - auto durationCA: dataType: integer > 0 defaultValue: '' @@ -594,15 +631,6 @@ cfsParams: valueList: - 'false' - 'true' - type: - dataType: string - defaultValue: '' - isRequired: true - isModifiable: false - valueList: - - 'off' - - manual - - auto - svcOperationCfsParamId: 801 svcOperationCfsParam: startupConfiguration dataType: map-fixed @@ -619,7 +647,6 @@ cfsParams: - iot-naeel - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 recoveryPoint: dataType: string defaultValue: '' @@ -632,6 +659,11 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: + cpu: + dataType: integer > 0 + defaultValue: '500' + isRequired: true + isModifiable: false memory: dataType: integer > 0 defaultValue: '512' @@ -652,11 +684,6 @@ cfsParams: defaultValue: '10' isRequired: true isModifiable: false - cpu: - dataType: integer > 0 - defaultValue: '500' - isRequired: true - isModifiable: false - svcOperationCfsParamId: 803 svcOperationCfsParam: accessConfiguration dataType: map-fixed @@ -664,6 +691,11 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: + masterIpSpace: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false masterAccessList: dataType: json defaultValue: '[]' @@ -679,11 +711,6 @@ cfsParams: defaultValue: '[]' isRequired: true isModifiable: false - masterIpSpace: - dataType: string - defaultValue: '' - isRequired: true - isModifiable: false - svcOperationCfsParamId: 804 svcOperationCfsParam: postgresConfiguration dataType: map-fixed @@ -725,23 +752,31 @@ cfsParams: - 'true' - svcOperationCfsParamId: 805 svcOperationCfsParam: postgresConf - dataType: array-map-fixed + dataType: map-fixed isRequired: false defaultValue: '' isModifiable: true dataDescriptor: - paramName: + log_connections: dataType: string defaultValue: '' - isRequired: true + isRequired: false isModifiable: false valueList: - - log_connections - - log_disconnections - paramValue: + - 'off' + - 'on' + log_disconnections: dataType: string defaultValue: '' - isRequired: true + isRequired: false + isModifiable: false + valueList: + - 'off' + - 'on' + max_connections: + dataType: integer > 0 + defaultValue: '' + isRequired: false isModifiable: false - svcOperationCfsParamId: 806 svcOperationCfsParam: backupConfiguration @@ -765,6 +800,11 @@ cfsParams: defaultValue: 0 0 * * * isRequired: true isModifiable: false + incrementCount: + dataType: integer >= 0 + defaultValue: '' + isRequired: false + isModifiable: false - svcOperationCfsParamId: 807 svcOperationCfsParam: autoscaleConfiguration dataType: map-fixed @@ -804,6 +844,32 @@ cfsParams: - '10' - '15' - '20' +- svcOperationCfsParamId: 1106 + svcOperationCfsParam: mtlsConfiguration + dataType: map-fixed + isRequired: true + defaultValue: '' + isModifiable: true + dataDescriptor: + type: + dataType: string + defaultValue: 'off' + isRequired: true + isModifiable: false + valueList: + - 'off' + - manual + - auto + durationCA: + dataType: integer > 0 + defaultValue: '175200' + isRequired: true + isModifiable: false + durationServer: + dataType: integer > 0 + defaultValue: '87600' + isRequired: true + isModifiable: false cfsParamsByOp: 19: - 788 @@ -845,15 +911,16 @@ cfsParamsByOp: - 805 - 806 - 807 + - 1106 54: [] 114: [] 115: [] stateParams: - clusterConfiguration: '{"replicas": 1, "disk": 10, "cpu": 500, "memory": 512}' + clusterConfiguration: '{"cpu": 500, "memory": 512, "replicas": 1, "disk": 10}' startupConfiguration: '{"resourceRealm": ""}' - accessConfiguration: '{"slaveAccessList": "[]", "masterIpSpace": "", "masterAccessList": "[]", "slaveIpSpace": ""}' - postgresConfiguration: '{"version": "17", "sslRequired": true, "poolerMaster": false, "poolerSlave": false}' - postgresConf: '{"paramName": "", "paramValue": ""}' - backupConfiguration: '{"s3Uid": "", "retain": 7, "schedule": "0 0 * * *"}' - autoscaleConfiguration: '{"percent": 10, "enabled": false, "schedule": 0, "quota": 100}' - mtlsConfiguration: '{"certServer": "", "type": "off", "durationCA": 175200, "durationServer": 87600, "certCA": ""}' + accessConfiguration: '{"masterIpSpace": "", "masterAccessList": "[]", "slaveIpSpace": "", "slaveAccessList": "[]"}' + postgresConfiguration: '{"version": "17", "poolerMaster": false, "poolerSlave": false, "sslRequired": true}' + postgresConf: '{"log_disconnections": "off", "log_connections": "off", "max_connections": 100}' + backupConfiguration: '{"s3Uid": "00000000-0000-0000-0000-000000000000", "retain": 7, "schedule": "0 0 * * *", "incrementCount": 0}' + autoscaleConfiguration: '{"enabled": false, "schedule": 0, "quota": 100, "percent": 10}' + mtlsConfiguration: '{"type": "off", "durationCA": 175200, "durationServer": 43800, "certCA": "", "certServer": ""}' diff --git a/site/services/test/91_redis.yaml b/site/services/test/91_redis.yaml index 4b57253..9079a26 100644 --- a/site/services/test/91_redis.yaml +++ b/site/services/test/91_redis.yaml @@ -49,7 +49,6 @@ cfsParams: - iot-naeel - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 - svcOperationCfsParamId: 1062 svcOperationCfsParam: clusterConfiguration dataType: map-fixed @@ -116,6 +115,11 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: + cpu: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false memory: dataType: integer > 0 defaultValue: '' @@ -136,11 +140,6 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false - cpu: - dataType: integer > 0 - defaultValue: '' - isRequired: true - isModifiable: false - svcOperationCfsParamId: 1065 svcOperationCfsParam: accessConfiguration dataType: map-fixed diff --git a/site/services/test/92_mongodb.yaml b/site/services/test/92_mongodb.yaml index 875ae41..f3e4527 100644 --- a/site/services/test/92_mongodb.yaml +++ b/site/services/test/92_mongodb.yaml @@ -3,34 +3,65 @@ service_id: 92 service_display_name: MongoDB service_short_name: mongodb service_man: '# Инструкция по развертыванию MongoDB через платформу

## 1. Общая информация

MongoDB — документоориентированная распределённая база данных, обеспечивающая высокую доступность, - горизонтальное масштабирование и гибкую модель хранения.

### Доступные операции с кластером

* **create** — создание базы
* **delete** — удаление базы данных
* **suspend** — - остановка базы данных
* **resume** — запуск базы данных
* **modify** — изменение базы данных

### Доступные операции с пользователями

* **create_user** — создание пользователя
* - **modify_user** — модификация пользователя
* **delete_user** — удаление пользователя

---

## 2. Параметры развертывания базы данных

Эти параметры необходимо указать при создании - базы данных.

### Платформа для развертывания

Среда, в которой будет развернут кластер. Выбирается из предложенного списка.

### Количество узлов

Количество реплик в - кластере MongoDB.
Оптимально выбирать нечётное значение, так как это обеспечивает корректный процесс выбора ведущего узла и сохраняет работоспособность базы данных даже при отказе одной из нод.

> - **Примечание:** уменьшение количества узлов после создания кластера не рекомендуется.

### Квота памяти пода (MB)

Объём памяти для одного пода в мегабайтах.
Пример: `2048`

### - Квота CPU пода (mCPU)

CPU-квота для пода в миликорах (1000 mCPU = 1 vCPU).
Пример: `1000`

### Размер диска для базы данных (GB)

Объём диска для хранения данных в гигабайтах.
Пример: - `20`

### Имя ipSpace для публикации внешнего IP

Имя ipSpace, через который будет выделен внешний IP для доступа к master-узлу.
Укажите `no-needed`, если внешний адрес не требуется.
Пример: - `internet-no-antiddos-v1`

### Список разрешённых IP-адресов

Список IP-адресов или подсетей, с которых разрешён доступ к кластеру.
Если оставить пустым — доступ открыт для всех источников.
Пример: - `["10.0.0.0/24", "192.168.1.10/32"]`

---

## 3. Параметры модификации базы данных

Все параметры, которые вы указываете при модификации, являются необязательными — система автоматически - подставит ранее сохранённые значения, и при необходимости вы можете изменить их на нужные.

### Количество узлов

Количество реплик в кластере MongoDB.
Оптимально выбирать нечётное - значение, так как это обеспечивает корректный процесс выбора ведущего узла и сохраняет работоспособность базы данных даже при отказе одной из нод.

> **Примечание:** уменьшение количества узлов - после создания кластера не рекомендуется.

### Квота памяти пода (MB)

Объём памяти для одного пода в мегабайтах.
Пример: `2048`

### Квота CPU пода (mCPU)

CPU-квота + горизонтальное масштабирование и гибкую модель хранения.

### Доступные операции с кластером

* **create** — создание базы
* **delete** — удаление базы данных
* + **suspend** — остановка базы данных
* **resume** — запуск базы данных
* **modify** — изменение базы данных
* **create_backup** — создание бэкапа вручную
* **delete_backup** — + удаление бэкапов
* **rollback** — восстановление кластера из бэкапа

### Доступные операции с пользователями

* **create_user** — создание пользователя
* **modify_user** + — модификация пользователя
* **delete_user** — удаление пользователя

---

## 2. Параметры создания базы данных

Эти параметры необходимо указать при создании базы данных.

### + Платформа для развертывания

Среда, в которой будет развёрнут кластер. Выбирается из предложенного списка.

### Количество узлов

Количество реплик в кластере MongoDB.
Оптимально + выбирать нечётное значение, так как это обеспечивает корректный процесс выбора ведущего узла и сохраняет работоспособность базы данных даже при отказе одной из нод.

> **Примечание:** уменьшение + количества узлов после создания кластера не рекомендуется.

### Квота памяти пода (MB)

Объём памяти для одного пода в мегабайтах.
Пример: `2048`

### Квота CPU пода (mCPU)

CPU-квота + для пода в миликорах (1000 mCPU = 1 vCPU).
Пример: `1000`

### Размер диска для базы данных (GB)

Объём диска для хранения данных в гигабайтах.
Пример: `20`

### Расписание + резервного копирования

Cron-выражение (5 полей), по которому автоматически создаются резервные копии.
Пример: `0 0 * * *` (каждый день в 00:00)

### Хранить последних бэкапов

Сколько + последних успешных резервных копий хранить — более старые удаляются автоматически.
Пример: `7`

> **Примечание:** ротация применяется только к бэкапам, созданным по расписанию. Бэкапы,
> + созданные вручную операцией `create_backup`, в неё не входят и не удаляются автоматически —
> их нужно убирать вручную через `delete_backup`.

### Имя ipSpace для публикации внешнего IP

Имя + ipSpace, через который будет выделен внешний IP для доступа к master-узлу.
Укажите `no-needed`, если внешний адрес не требуется.
Пример: `internet-no-antiddos-v1`

### Список разрешённых + IP-адресов

Список IP-адресов или подсетей, с которых разрешён доступ к кластеру.
Если оставить пустым — доступ открыт для всех источников.
Пример: `["10.0.0.0/24", "192.168.1.10/32"]`

### + Включить TLS

Булевый параметр. Определяет режим работы TLS кластера.

- `true` — TLS включён (`tls.mode: allowTLS`). Сертификаты сохраняются в Vault.
- `false` — TLS выключен (`tls.mode: + disabled`).

По умолчанию: `false`.

---

## 3. Параметры модификации базы данных

Все параметры, которые вы указываете при модификации, являются необязательными — система + автоматически подставит ранее сохранённые значения, и при необходимости вы можете изменить их на нужные.

### Количество узлов

Количество реплик в кластере MongoDB.
Оптимально выбирать + нечётное значение, так как это обеспечивает корректный процесс выбора ведущего узла и сохраняет работоспособность базы данных даже при отказе одной из нод.

> **Примечание:** уменьшение количества + узлов после создания кластера не рекомендуется.

### Квота памяти пода (MB)

Объём памяти для одного пода в мегабайтах.
Пример: `2048`

### Квота CPU пода (mCPU)

CPU-квота для пода в миликорах (1000 mCPU = 1 vCPU).
Пример: `1000`

### Размер диска для базы данных (GB)

Объём диска для хранения данных указывается в гигабайтах. Его можно увеличить при - необходимости, однако уменьшить уже выделенный размер невозможно.
Пример: `20`

### Имя ipSpace для публикации внешнего IP

Имя ipSpace, через который будет выделен внешний IP для - доступа к master-узлу.
Укажите `no-needed`, если внешний адрес не требуется.
Пример: `internet-no-antiddos-v1`

### Список разрешённых IP-адресов

Список IP-адресов или подсетей, - с которых разрешён доступ к кластеру.
Если оставить пустым — доступ открыт для всех источников.
Пример: `["10.0.0.0/24", "192.168.1.10/32"]`

---

## 3. Параметры создания пользователя

### - Имя пользователя

Указывается имя пользователя (любой регистр).
Пример: `readApp`

### Имя базы данных

Название базы, в которой будет создан пользователь.
Если база отсутствует, - она будет создана автоматически.
Пример: `Apps_9392`

### Имя роли

* **read** — доступ только на чтение
* **readWrite** — чтение и изменение данных
* **dbOwner** — полный - контроль над базой данных

---

## 4. Параметры модификации пользователя

### Имя пользователя

Необходимо выбрать существующего пользователя.
Если список пуст, требуется - предварительно создать пользователя.

### Имя базы данных

База данных, к которой относится пользователь.
Если база отсутствует, она будет создана автоматически.
Пример: `Apps_9392`

### - Имя роли

* **read**
* **readWrite**
* **dbOwner**

---

## 5. Параметры удаления пользователя

### Имя пользователя

Выберите пользователя из списка для - удаления.

---

## 6. Выходные параметры

После успешного развертывания базы данных платформа возвращает ключевые параметры.

### internalConnect

Внутренний эндпоинт - для подключения к кластеру из сервисов, работающих в той же сети.
Используется для внутренних интеграций и системных сервисов.

### externalConnect

Внешний FQDN для подключения к - кластеру извне.
Порт подключения — **27017**.

---

## 7. Пример подключения

Перед подключением необходимо установить **mongosh**.

Команда подключения к базе данных:

```
mongosh - "mongodb://:@:27017/"
```

Где:

* `` — имя пользователя
* `` — пароль
* `` — internalConnect или - externalConnect
* `` — имя базы данных

## 8. Дополнительная информация

Сейчас соединение с базой работает без шифрования, и доступ к кластеру осуществляется только по логину - и паролю.' + необходимости, однако уменьшить уже выделенный размер невозможно.
Пример: `20`

### Расписание резервного копирования

Cron-выражение (5 полей), по которому автоматически создаются + резервные копии.
Пример: `0 0 * * *` (каждый день в 00:00)

### Хранить последних бэкапов

Сколько последних успешных резервных копий хранить — более старые удаляются автоматически.
Пример: + `7`

> **Примечание:** ротация применяется только к бэкапам, созданным по расписанию. Бэкапы,
> созданные вручную операцией `create_backup`, в неё не входят и не удаляются автоматически —
> + их нужно убирать вручную через `delete_backup`.

### Имя ipSpace для публикации внешнего IP

Имя ipSpace, через который будет выделен внешний IP для доступа к master-узлу.
Укажите + `no-needed`, если внешний адрес не требуется.
Пример: `internet-no-antiddos-v1`

### Список разрешённых IP-адресов

Список IP-адресов или подсетей, с которых разрешён доступ к кластеру.
Если + оставить пустым — доступ открыт для всех источников.
Пример: `["10.0.0.0/24", "192.168.1.10/32"]`

---

## 4. Параметры удаления базы данных

### Удалить бакет S3 с бэкапами

Булевый + параметр.

- `true` — вместе с кластером также будут удалены все резервные копии и бакет S3.
- `false` — бакет S3 и хранящиеся в нём бэкапы сохраняются после удаления кластера.

По + умолчанию: `false`.

---

## 5. Параметры создания бэкапа

### Имя бэкапа

Имя резервной копии, которое будет присвоено объекту бэкапа в кластере.
Должно соответствовать + требованиям Kubernetes к именам объектов (строчные буквы, цифры, дефисы).
Пример: `manual-20260904`

> **Примечание:** такой бэкап не участвует в автоматической ротации по параметру
> + "Хранить последних бэкапов" (она применяется только к бэкапам по расписанию) и не удаляется
> сам — при необходимости убрать его нужно вручную операцией `delete_backup`.

---

## 6. + Параметры восстановления из бэкапа

### Имя бэкапа

Имя существующей резервной копии кластера, из которой будет выполнено восстановление. Указывается один из бэкапов в состоянии `ready` + (созданных автоматически по расписанию или вручную через операцию create_backup).

---

## 7. Параметры удаления бэкапов

### Имена бэкапов

Список имён резервных копий + для удаления.
Пример: `["manual-20260904", "cron-mongok8s-...-20260903020000"]`

---

## 8. Параметры создания пользователя

### Имя пользователя

Указывается имя пользователя + (любой регистр).
Пример: `readApp`

> **Примечание:** имя пользователя должно быть уникальным в рамках кластера. Если пользователь
> с таким именем уже существует, операция завершится + ошибкой — используйте `modify_user` для
> изменения прав или `delete_user` + `create_user` для пересоздания.

### Имя базы данных

Название базы, в которой будет создан пользователь.
Если + база отсутствует, она будет создана автоматически.
Пример: `Apps_9392`

### Имя роли

* **read** — доступ только на чтение
* **readWrite** — чтение и изменение данных
* **dbOwner** + — полный контроль над базой данных
* **dbAdmin** — администрирование базы данных (индексы, статистика, схема) без доступа к чтению/записи данных

---

## 9. Параметры модификации пользователя

### + Имя пользователя

Необходимо выбрать существующего пользователя.
Если список пуст, требуется предварительно создать пользователя.

### Имя базы данных

База данных, к которой + относится пользователь.
Если база отсутствует, она будет создана автоматически.
Пример: `Apps_9392`

### Имя роли

* **read**
* **readWrite**
* **dbOwner**
* **dbAdmin**

---

## + 10. Параметры удаления пользователя

### Имя пользователя

Выберите пользователя из списка для удаления.

---

## 11. Выходные параметры

После успешного развертывания + базы данных платформа возвращает ключевые параметры.

### internalConnect

Внутренний эндпоинт для подключения к кластеру из сервисов, работающих в той же сети.
Используется для внутренних + интеграций и системных сервисов.

### externalConnect

Внешний FQDN для подключения к кластеру извне.
Порт подключения — **27017**.

> **Важно:** оба эндпоинта — это Kubernetes + Service на весь replset, а не адрес конкретно
> primary-узла. Kubernetes не отслеживает, кто из узлов сейчас primary, поэтому новое
> подключение без параметра `replicaSet` может попасть на secondary + и упасть с ошибкой записи
> `not writable primary`. Обязательно указывайте `replicaSet=rs0` в строке подключения (см.
> примеры ниже) — тогда драйвер сам обнаружит топологию кластера и всегда + направит запись на
> актуальный primary, независимо от количества реплик и от того, происходили ли выборы.

---

## 12. Пример подключения

Перед подключением необходимо установить + **mongosh**.

### 12.1 Подключение без TLS

Для внутреннего подключения из той же сети:

```
mongosh "mongodb://:@:27017/?authSource=admin&replicaSet=rs0"
```

### + 12.2 Подключение через внешний endpoint с TLS

Кластер требует клиентский TLS-сертификат (mutual TLS). Сертификаты сохраняются в Vault при создании кластера в блоке `cer` в полях `ca`, `cer`, + `key` в кодировке base64.

Подготовка файлов:

```bash
# Декодировать сертификаты из Vault
echo "" | base64 -d > ca.crt
echo " tls.crt
echo "" | base64 -d > tls.key

# Собрать клиентский PEM
cat tls.key tls.crt > client.pem
```

Подключение:

```
mongosh + "mongodb://:@:27017/?tls=true&tlsCAFile=ca.crt&tlsCertificateKeyFile=client.pem&authSource=admin&replicaSet=rs0"
```

Где:

* `` + — имя пользователя
* `` — пароль
* `` — internalConnect (для подключения без TLS)
* `` — externalConnect (для внешнего подключения с TLS)
* + `` — имя базы данных

## 13. Дополнительная информация

Режим TLS задаётся параметром `mongoConfiguration.tls` только при создании кластера.
После создания изменение TLS через + модификацию не поддерживается.

- При `true` кластер разворачивается с включённым TLS (`tls.mode: allowTLS`). Сервер принимает как обычные, так и TLS-соединения.
- При `false` TLS выключен + (`tls.mode: disabled`).

Для внешнего подключения (`externalConnect`) используется сертификат, выпущенный через cert-manager, с SAN, покрывающим внешний DNS-адрес кластера — поэтому `tlsAllowInvalidHostnames` + не требуется, хост проверяется как обычно.

Внутренние подключения TLS-сертификат не используют вообще: режим `allowTLS` допускает как TLS, так и обычные соединения, но для внутреннего трафика + применяется обычное (не TLS) подключение — см. пример 12.1.

### Почему обязателен `replicaSet=rs0` в строке подключения

Percona-оператор не проставляет на поды никакого динамического + лейбла роли (primary/secondary) —
у всех подов replset''а полностью одинаковые лейблы, различается только имя/индекс пода.
`master`-сервис — это обычный Kubernetes Service с фиксированным селектором + на весь replset, он
не знает и не может знать, какой под сейчас primary: k8s просто раздаёт новые TCP-подключения
по кругу между всеми узлами. Без `replicaSet=rs0` в URI подключение может закрепиться + на
secondary, и любая попытка записи будет падать с `not writable primary` — независимо от того,
происходили выборы недавно или нет. Указание `replicaSet=rs0` включает у драйвера обнаружение
топологии + реплики, и он сам направляет запись на актуальный primary при любом количестве узлов
и после любых переизбраний.
' lifecycle: suspendOnDestroyDefault: true adoptExistingOnCreateDefault: false @@ -39,6 +70,10 @@ operations: operation: create kind: instance action: create +- svcOperationId: 411 + operation: create_backup + kind: subresource + action: create - svcOperationId: 198 operation: create_user kind: subresource @@ -47,6 +82,10 @@ operations: operation: delete kind: instance action: delete +- svcOperationId: 414 + operation: delete_backup + kind: subresource + action: delete - svcOperationId: 199 operation: delete_user kind: subresource @@ -67,11 +106,16 @@ operations: operation: resume kind: instance action: resume +- svcOperationId: 413 + operation: rollback + kind: action + action: rollback - svcOperationId: 194 operation: suspend kind: instance action: suspend stateOut: + backups: {} users: {} cfsParams: - svcOperationCfsParamId: 1089 @@ -90,7 +134,6 @@ cfsParams: - iot-naeel - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 - svcOperationCfsParamId: 1090 svcOperationCfsParam: clusterConfiguration dataType: map-fixed @@ -130,16 +173,59 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - masterAccessList: - dataType: json - defaultValue: '[]' - isRequired: true - isModifiable: false masterIpSpace: dataType: string defaultValue: '' isRequired: true isModifiable: false + masterAccessList: + dataType: json + defaultValue: '[]' + isRequired: true + isModifiable: false +- svcOperationCfsParamId: 1102 + svcOperationCfsParam: backupConfiguration + dataType: map-fixed + isRequired: true + defaultValue: '' + isModifiable: true + dataDescriptor: + s3Uid: + dataType: uuid + defaultValue: '' + isRequired: true + isModifiable: false + retain: + dataType: integer > 0 + defaultValue: '7' + isRequired: true + isModifiable: false + schedule: + dataType: string + defaultValue: 0 0 * * * + isRequired: true + isModifiable: false +- svcOperationCfsParamId: 1116 + svcOperationCfsParam: mongoConfiguration + dataType: map-fixed + isRequired: true + defaultValue: '' + isModifiable: false + dataDescriptor: + tls: + dataType: boolean + defaultValue: '' + isRequired: true + isModifiable: false + valueList: + - 'true' + - 'false' +- svcOperationCfsParamId: 1109 + svcOperationCfsParam: backupName + dataType: string + isRequired: true + defaultValue: '' + isModifiable: false - svcOperationCfsParamId: 635 svcOperationCfsParam: username dataType: string @@ -159,12 +245,28 @@ cfsParams: defaultValue: '' isModifiable: false valueList: - - dbOwner - read - readWrite + - dbAdmin + - dbOwner +- svcOperationCfsParamId: 1103 + svcOperationCfsParam: deleteS3Bucket + dataType: boolean + isRequired: true + defaultValue: 'true' + isModifiable: true + valueList: + - 'false' + - 'true' +- svcOperationCfsParamId: 1111 + svcOperationCfsParam: backupName + dataType: array + isRequired: true + defaultValue: '' + isModifiable: true - svcOperationCfsParamId: 644 svcOperationCfsParam: username - dataType: string + dataType: array isRequired: true defaultValue: '' isModifiable: true @@ -217,6 +319,23 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false +- svcOperationCfsParamId: 1104 + svcOperationCfsParam: backupConfiguration + dataType: map-fixed + isRequired: true + defaultValue: '' + isModifiable: true + dataDescriptor: + retain: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false + schedule: + dataType: string + defaultValue: '' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 640 svcOperationCfsParam: username dataType: string @@ -236,32 +355,51 @@ cfsParams: defaultValue: '' isModifiable: true valueList: - - dbOwner - read - readWrite + - dbAdmin + - dbOwner +- svcOperationCfsParamId: 1108 + svcOperationCfsParam: backupName + dataType: string + isRequired: true + defaultValue: '' + isModifiable: true cfsParamsByOp: 37: - 1089 - 1090 - 1091 + - 1102 + - 1116 + 411: + - 1109 198: - 635 - 636 - 643 - 190: [] + 190: + - 1103 + 414: + - 1111 199: - 644 201: - 1092 - 1093 + - 1104 200: - 640 - 641 - 642 409: [] 196: [] + 413: + - 1108 194: [] stateParams: startupConfiguration: '{"resourceRealm": ""}' clusterConfiguration: '{"cpu": 1000, "memory": 1024, "replicas": 1, "disk": 5}' - accessConfiguration: '{"masterAccessList": "[]", "masterIpSpace": ""}' + accessConfiguration: '{"masterIpSpace": "", "masterAccessList": "[]"}' + backupConfiguration: '{"s3Uid": "", "retain": 7, "schedule": "0 0 * * *"}' + mongoConfiguration: '{"tls": false}' diff --git a/site/services/test/93_rabbitmq.yaml b/site/services/test/93_rabbitmq.yaml index e272bee..2b49015 100644 --- a/site/services/test/93_rabbitmq.yaml +++ b/site/services/test/93_rabbitmq.yaml @@ -79,7 +79,6 @@ cfsParams: - iot-naeel - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 - svcOperationCfsParamId: 1098 svcOperationCfsParam: clusterConfiguration dataType: map-fixed @@ -129,6 +128,18 @@ cfsParams: defaultValue: '[]' isRequired: true isModifiable: false +- svcOperationCfsParamId: 1113 + svcOperationCfsParam: mqConfiguration + dataType: map-fixed + isRequired: true + defaultValue: '' + isModifiable: true + dataDescriptor: + maxMessageSize: + dataType: integer > 0 + defaultValue: '4' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 1100 svcOperationCfsParam: clusterConfiguration dataType: map-fixed @@ -136,11 +147,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - disk: - dataType: integer > 0 - defaultValue: '' - isRequired: true - isModifiable: false cpu: dataType: integer > 0 defaultValue: '' @@ -161,6 +167,11 @@ cfsParams: - '3' - '5' - '7' + disk: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false - svcOperationCfsParamId: 1101 svcOperationCfsParam: accessConfiguration dataType: map-fixed @@ -178,15 +189,29 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false +- svcOperationCfsParamId: 1114 + svcOperationCfsParam: mqConfiguration + dataType: map-fixed + isRequired: true + defaultValue: '' + isModifiable: true + dataDescriptor: + maxMessageSize: + dataType: integer > 0 + defaultValue: '' + isRequired: true + isModifiable: false cfsParamsByOp: 38: - 1097 - 1098 - 1099 + - 1113 39: [] 106: - 1100 - 1101 + - 1114 410: [] 117: [] 116: [] @@ -194,3 +219,4 @@ stateParams: startupConfiguration: '{"resourceRealm": ""}' clusterConfiguration: '{"cpu": 1000, "memory": 1024, "replicas": 1, "disk": 5}' accessConfiguration: '{"masterIpSpace": "", "masterAccessList": "[]"}' + mqConfiguration: '{"maxMessageSize": 4}' diff --git a/site/services/test/94_lucee.yaml b/site/services/test/94_lucee.yaml index 222671d..c654240 100644 --- a/site/services/test/94_lucee.yaml +++ b/site/services/test/94_lucee.yaml @@ -56,7 +56,6 @@ cfsParams: - iot-naeel - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 - svcOperationCfsParamId: 1020 svcOperationCfsParam: clusterConfiguration dataType: map-fixed @@ -93,7 +92,7 @@ cfsParams: dataDescriptor: domain: dataType: string - defaultValue: lucee-tepsq9jk + defaultValue: lucee-4qwtxc1y isRequired: true isModifiable: false - svcOperationCfsParamId: 1022 @@ -161,11 +160,6 @@ cfsParams: defaultValue: '' isModifiable: true dataDescriptor: - healthPath: - dataType: string - defaultValue: '' - isRequired: false - isModifiable: false version: dataType: string defaultValue: '' @@ -179,6 +173,11 @@ cfsParams: defaultValue: '' isRequired: true isModifiable: false + healthPath: + dataType: string + defaultValue: '' + isRequired: false + isModifiable: false - svcOperationCfsParamId: 1026 svcOperationCfsParam: jsonEnv dataType: map @@ -201,7 +200,6 @@ cfsParams: - iot-naeel - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 cfsParamsByOp: 49: - 1019 @@ -223,6 +221,6 @@ cfsParamsByOp: stateParams: startupConfiguration: '{"resourceRealm": ""}' clusterConfiguration: '{"cpu": 200, "memory": 256, "replicas": 1}' - accessConfiguration: '{"domain": "lucee-tepsq9jk"}' + accessConfiguration: '{"domain": "lucee-4qwtxc1y"}' appConfiguration: '{"version": "6.0", "gitPath": "https://github.com/xahys/testlucee", "healthPath": ""}' jsonEnv: '{}' diff --git a/site/services/test/95_nodejs.yaml b/site/services/test/95_nodejs.yaml index cde802c..bae6b73 100644 --- a/site/services/test/95_nodejs.yaml +++ b/site/services/test/95_nodejs.yaml @@ -54,7 +54,6 @@ cfsParams: - iot-naeel - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 - svcOperationCfsParamId: 1029 svcOperationCfsParam: clusterConfiguration dataType: map-fixed @@ -91,7 +90,7 @@ cfsParams: dataDescriptor: domain: dataType: string - defaultValue: node-btf263ja + defaultValue: node-lp8hzcus isRequired: true isModifiable: false - svcOperationCfsParamId: 1031 @@ -203,7 +202,6 @@ cfsParams: - iot-naeel - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 cfsParamsByOp: 58: - 1028 @@ -224,6 +222,6 @@ cfsParamsByOp: stateParams: startupConfiguration: '{"resourceRealm": ""}' clusterConfiguration: '{"cpu": 200, "memory": 256, "replicas": 1}' - accessConfiguration: '{"domain": "node-btf263ja"}' + accessConfiguration: '{"domain": "node-lp8hzcus"}' appConfiguration: '{"version": "23", "gitPath": "https://github.com/xahys/testnode.git", "healthPath": ""}' jsonEnv: '{}' diff --git a/site/services/test/96_pgadmin.yaml b/site/services/test/96_pgadmin.yaml index 21b01b3..6b02276 100644 --- a/site/services/test/96_pgadmin.yaml +++ b/site/services/test/96_pgadmin.yaml @@ -67,7 +67,6 @@ cfsParams: - iot-naeel - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 - svcOperationCfsParamId: 170 svcOperationCfsParam: login dataType: string @@ -108,7 +107,6 @@ cfsParams: - iot-naeel - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 cfsParamsByOp: 62: - 164 diff --git a/site/services/test/98_http.yaml b/site/services/test/98_http.yaml index bac88b4..ab95d6a 100644 --- a/site/services/test/98_http.yaml +++ b/site/services/test/98_http.yaml @@ -70,25 +70,24 @@ cfsParams: - iot-naeel - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 - svcOperationCfsParamId: 217 svcOperationCfsParam: registryPath dataType: string isRequired: true defaultValue: nexus-sa.tst.nubes.ru/docker-nubes/jolt - isModifiable: false + isModifiable: true - svcOperationCfsParamId: 241 svcOperationCfsParam: jsonEnv dataType: map isRequired: false defaultValue: '' - isModifiable: false + isModifiable: true - svcOperationCfsParamId: 782 svcOperationCfsParam: ingressAnnotations dataType: map isRequired: false defaultValue: '{}' - isModifiable: false + isModifiable: true - svcOperationCfsParamId: 218 svcOperationCfsParam: resourceCPU dataType: integer > 0 @@ -107,6 +106,24 @@ cfsParams: isRequired: true defaultValue: '' isModifiable: true +- svcOperationCfsParamId: 1120 + svcOperationCfsParam: registryPath + dataType: string + isRequired: true + defaultValue: '' + isModifiable: true +- svcOperationCfsParamId: 1121 + svcOperationCfsParam: jsonEnv + dataType: map + isRequired: false + defaultValue: '' + isModifiable: true +- svcOperationCfsParamId: 1122 + svcOperationCfsParam: ingressAnnotations + dataType: map + isRequired: false + defaultValue: '' + isModifiable: true - svcOperationCfsParamId: 272 svcOperationCfsParam: resourceRealm dataType: string @@ -117,7 +134,6 @@ cfsParams: - iot-naeel - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - - naeel-test-3 cfsParamsByOp: 77: - 212 @@ -133,6 +149,9 @@ cfsParamsByOp: - 218 - 219 - 220 + - 1120 + - 1121 + - 1122 403: [] 79: - 272 diff --git a/tests/test_converter.py b/tests/test_converter.py index cec5bdd..601e663 100644 --- a/tests/test_converter.py +++ b/tests/test_converter.py @@ -180,3 +180,45 @@ class TestFileRoundtrip: assert len(loaded["cfsParams"]) == 2 finally: os.unlink(fname) + + +class TestGenerationSync: + """The CLI output directory should match its source after a clean run.""" + + def test_main_removes_yaml_missing_from_source(self, tmp_path, monkeypatch, dummy_yaml): + source_dir = tmp_path / "source" + output_dir = tmp_path / "output" + source_dir.mkdir() + output_dir.mkdir() + with open(source_dir / "1_dummy.yaml", "w", encoding="utf-8") as source_file: + yaml.safe_dump(dummy_yaml, source_file, allow_unicode=True) + (output_dir / "27_obsolete.yaml").write_text("old: true\n", encoding="utf-8") + (output_dir / "keep.txt").write_text("not YAML\n", encoding="utf-8") + + monkeypatch.setattr( + sys, + "argv", + ["from_stands.py", str(source_dir), str(output_dir)], + ) + from_stands.main() + + assert (output_dir / "1_dummy.yaml").is_file() + assert not (output_dir / "27_obsolete.yaml").exists() + assert (output_dir / "keep.txt").is_file() + + def test_main_keeps_existing_yaml_when_conversion_fails(self, tmp_path, monkeypatch): + source_dir = tmp_path / "source" + output_dir = tmp_path / "output" + source_dir.mkdir() + output_dir.mkdir() + (source_dir / "broken.yaml").write_text("broken: [", encoding="utf-8") + (output_dir / "27_obsolete.yaml").write_text("old: true\n", encoding="utf-8") + + monkeypatch.setattr( + sys, + "argv", + ["from_stands.py", str(source_dir), str(output_dir)], + ) + from_stands.main() + + assert (output_dir / "27_obsolete.yaml").is_file() diff --git a/tests/test_loader.py b/tests/test_loader.py new file mode 100644 index 0000000..99d90a2 --- /dev/null +++ b/tests/test_loader.py @@ -0,0 +1,71 @@ +"""Regression tests for startup configuration path resolution.""" + +import os +import subprocess +import sys +from pathlib import Path + +import pytest + + +POLYGON_ROOT = Path(__file__).resolve().parents[1] +SITE_DIR = POLYGON_ROOT / "site" + + +@pytest.mark.parametrize("working_dir", [POLYGON_ROOT, SITE_DIR]) +def test_loader_finds_stand_yaml_independent_of_working_directory(working_dir): + """Exercise a fresh import from both documented launch directories. + + A subprocess isolates module-level environment parsing and import-time YAML + loading, which is the exact behavior used when the WSGI process starts. + """ + env = os.environ.copy() + env["POLYGON_STANDS"] = ( + "dev:services/dev,test:services/test,prod:services/prod" + ) + python_path = str(SITE_DIR) + if env.get("PYTHONPATH"): + python_path += os.pathsep + env["PYTHONPATH"] + env["PYTHONPATH"] = python_path + + subprocess.run( + [ + sys.executable, + "-c", + ( + "import app; " + "assert set(app._cfg.STANDS) == {'dev', 'test', 'prod'}; " + "assert app.app.test_client().get('/health').status_code == 200" + ), + ], + cwd=working_dir, + env=env, + check=True, + timeout=10, + ) + + +def test_loader_finds_default_services_from_repository_root(): + """The no-env default must also work with the platform's root CWD.""" + env = os.environ.copy() + env.pop("POLYGON_STANDS", None) + python_path = str(SITE_DIR) + if env.get("PYTHONPATH"): + python_path += os.pathsep + env["PYTHONPATH"] + env["PYTHONPATH"] = python_path + + subprocess.run( + [ + sys.executable, + "-c", + ( + "import app; " + "assert set(app._cfg.STANDS) == {'default'}; " + "assert app.app.test_client().get('/health').status_code == 200" + ), + ], + cwd=POLYGON_ROOT, + env=env, + check=True, + timeout=10, + ) \ No newline at end of file