name: postgres service_id: 90 service_display_name: PostgreSQL service_short_name: postgres service_man: '# Инструкция по развертыванию PostgreSQL через платформу

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

PostgreSQL — это надёжная объектно-реляционная СУБД с открытым исходным кодом, поддерживающая расширенный набор функций, транзакции и хранение сложных типов данных. Развёртывание полностью автоматизировано платформой на базе Zalando Postgres Operator с использованием Kubernetes.

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

- **create** — Создание кластера
- **delete** — Удаление кластера
- **modify** — Модификация кластера
- **suspend** — Остановка кластера
- **resume** — Запуск кластера
- **restart** — Перезапуск кластера
- **recovery** — Восстановление из резервной копии

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

- **create_database** — Создание базы данных
- **delete_database** — Удаление базы данных


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

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

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

* **Количество узлов в сети:**
Количество инстансов (реплик) в кластере PostgreSQL. Пример: `2` (master + slave).

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

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

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

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

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

* **Выделяет внешний IP для доступа к slave:**
Флаг для выделения внешнего IP для slave (реплики чтения). Работает, если slave присутствует в кластере.

* **Имя ipSpace для публикации внешнего IP slave:**
Если включен параметр для slave, то поле необходимо заполнить.

* **UUID экземпляра услуги S3:**
UUID экземпляра S3 для хранения резервных копий.

* **Версия PostgreSQL:**
Версия PostgreSQL для развертывания. Пример: `16`

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

* **Количество сохраняемых бэкапов (ext_BACKUP_NUM_TO_RETAIN):**
Необязательный. Количество сохраняемых бэкапов. По умолчанию: `7`

* **PgPooler (master / slave):**
Флаги включения PgBouncer для подключений на запись и чтение. При включении создаётся отдельный под.

* **Разрешить подключение без SSL (allowNoSSL):**
По умолчанию подключение с sslmode=require. При `true` разрешается подключение без SSL.

* **Автоскейлинг PV (autoScale):**
Включает автоскейлинг тома. Требует настройки autoScalePercentage, autoScaleTechWindow, autoScaleQuotaGb.

* **Дополнительные параметры PostgreSQL (jsonParameters):**
JSON с переменными конфигурации PostgreSQL. Документация: https://www.postgresql.org/docs/current/runtime-config.html

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

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

#### externalConnect

Внешние эндпоинты для подключения к кластеру:
- **master** — для операций записи (host: `write.${namespace}`, port: 5432)
- **slave** — для операций чтения (host: `read.${namespace}`, port: 5432)

Пример ответа платформы:

```json
{
"slave": {
"ip": "",
"fqdn": "",
"uuid": "",
"isExternal": false
},
"master": {
"ip": "",
"fqdn": "write..",
"uuid": "",
"isExternal": false
}
}
```

Поля: `ip` — внешний IP; `fqdn` — полное имя хоста; `uuid` — идентификатор; `isExternal` — признак внешнего доступа.

#### internalConnect

Внутренние эндпоинты (FQDN) для подключения из других сервисов внутри той же сети Kubernetes.

Пример ответа платформы:

```json
{
"slave": "",
"master": {
"slave": "",
"master": {
"slave": "",
"master": "postgresqlk8s-master..svc.cluster.local"
}
}
}
```

Для подключения используйте значение `master.master.master` (host для записи) или соответствующее значение slave (host для чтения).

Для подключения используется порт **5432**.

---
## 4. Управление пользователями

### create_user — Создание пользователя

* **Имя пользователя (username):**
Имя создаваемого пользователя. Используется для подключения к базе и настройки прав.
Пример: `myapp_user`

* **Роль (role):**
Тип роли пользователя. Допустимые значения:
- `app_user` — базовые права для DML-операций (SELECT, INSERT, UPDATE, DELETE)
- `ddl_user` — расширенные права: createdb, createrole (управление базами и ролями)

Защищённые имена, которые нельзя использовать: `admin`, `postgres`, `standby`.

### delete_user — Удаление пользователя

* **Имя пользователя (username):**
Имя удаляемого пользователя. Пример: `myapp_user`

Пользователя нельзя удалить, если он является владельцем базы данных. Сначала удалите или передайте владение базами данных другому пользователю.

---
## 5. Управление базами данных

### create_database — Создание базы данных

* **Имя базы данных (dbName):**
Название создаваемой базы данных. Пример: `myapp_db`

* **Владелец базы данных (dbOwner):**
Имя пользователя-владельца базы. Должен существовать в кластере (создан через create_user). Пример: `myapp_user`

### delete_database — Удаление базы данных

* **Имя базы данных (dbName):**
Название удаляемой базы данных. Пример: `myapp_db`
' lifecycle: suspendOnDestroyDefault: true adoptExistingOnCreateDefault: false operations: - svcOperationId: 19 operation: create kind: instance action: create - svcOperationId: 264 operation: create_backup kind: subresource action: create - svcOperationId: 245 operation: create_database kind: subresource action: create - svcOperationId: 241 operation: create_user kind: subresource action: create - svcOperationId: 20 operation: delete kind: instance action: delete - svcOperationId: 246 operation: delete_database kind: subresource action: delete - svcOperationId: 244 operation: delete_user kind: subresource action: delete - svcOperationId: 48 operation: modify kind: instance action: modify - svcOperationId: 263 operation: reconcile kind: action action: reconcile - svcOperationId: 47 operation: recovery kind: action action: recovery - svcOperationId: 54 operation: restart kind: action action: restart - svcOperationId: 114 operation: resume kind: instance action: resume - svcOperationId: 115 operation: suspend kind: instance action: suspend stateOut: backups: {} databases: {} users: {} cfsParams: - svcOperationCfsParamId: 788 svcOperationCfsParam: clusterConfiguration dataType: map-fixed isRequired: true defaultValue: '' isModifiable: true dataDescriptor: replicas: dataType: integer > 0 defaultValue: '1' isRequired: true isModifiable: false valueList: - '1' - '3' - '5' - '7' disk: dataType: integer > 0 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 isRequired: true defaultValue: '' isModifiable: false dataDescriptor: resourceRealm: dataType: string defaultValue: '' isRequired: true isModifiable: false valueList: - iot-naeel - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - naeel-test-3 - svcOperationCfsParamId: 790 svcOperationCfsParam: accessConfiguration dataType: map-fixed isRequired: true defaultValue: '' isModifiable: true dataDescriptor: slaveAccessList: dataType: json defaultValue: '[]' isRequired: true isModifiable: false masterIpSpace: dataType: string defaultValue: '' isRequired: true isModifiable: false masterAccessList: dataType: json defaultValue: '[]' isRequired: true isModifiable: false slaveIpSpace: dataType: string defaultValue: '' isRequired: true isModifiable: false - svcOperationCfsParamId: 791 svcOperationCfsParam: postgresConfiguration dataType: map-fixed isRequired: true defaultValue: '' isModifiable: true dataDescriptor: version: dataType: string defaultValue: '17' isRequired: true isModifiable: false valueList: - '17' - '16' sslRequired: dataType: boolean defaultValue: 'true' isRequired: true isModifiable: false valueList: - 'false' - 'true' poolerMaster: dataType: boolean defaultValue: 'false' isRequired: true isModifiable: false valueList: - 'false' - 'true' poolerSlave: dataType: boolean defaultValue: 'false' isRequired: true isModifiable: false valueList: - 'false' - 'true' - svcOperationCfsParamId: 792 svcOperationCfsParam: postgresConf dataType: array-map-fixed isRequired: false defaultValue: '' isModifiable: true dataDescriptor: paramName: dataType: string defaultValue: '' isRequired: true isModifiable: false valueList: - log_connections - log_disconnections paramValue: dataType: string defaultValue: '' isRequired: true isModifiable: false - svcOperationCfsParamId: 793 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: 794 svcOperationCfsParam: autoscaleConfiguration dataType: map-fixed isRequired: true defaultValue: '' isModifiable: true dataDescriptor: percent: dataType: integer > 0 defaultValue: '10' isRequired: true isModifiable: false valueList: - '10' - '15' - '20' enabled: dataType: boolean defaultValue: 'false' isRequired: true isModifiable: false valueList: - 'false' - 'true' schedule: dataType: integer >= 0 defaultValue: '0' isRequired: true isModifiable: false valueList: - '0' - '5' - '12' - '23' quota: dataType: integer > 0 defaultValue: '100' isRequired: true isModifiable: false - svcOperationCfsParamId: 1094 svcOperationCfsParam: mtlsConfiguration dataType: map-fixed isRequired: true defaultValue: '{}' isModifiable: true dataDescriptor: certServer: dataType: string defaultValue: '' isRequired: false isModifiable: false 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 certCA: dataType: string defaultValue: '' isRequired: false isModifiable: false - svcOperationCfsParamId: 741 svcOperationCfsParam: dbName dataType: string isRequired: true defaultValue: '' isModifiable: false - svcOperationCfsParamId: 742 svcOperationCfsParam: dbOwner dataType: string isRequired: true defaultValue: '' isModifiable: false - svcOperationCfsParamId: 733 svcOperationCfsParam: username dataType: string isRequired: true defaultValue: '' isModifiable: false - svcOperationCfsParamId: 740 svcOperationCfsParam: role dataType: string isRequired: true defaultValue: '' isModifiable: false valueList: - app_user - ddl_user - svcOperationCfsParamId: 1096 svcOperationCfsParam: mtlsAccess dataType: boolean isRequired: true defaultValue: 'false' isModifiable: false valueList: - 'false' - 'true' - svcOperationCfsParamId: 457 svcOperationCfsParam: deleteS3Bucket dataType: boolean isRequired: true defaultValue: 'true' isModifiable: true valueList: - 'false' - 'true' - svcOperationCfsParamId: 743 svcOperationCfsParam: dbName dataType: string isRequired: true defaultValue: '' isModifiable: true - svcOperationCfsParamId: 739 svcOperationCfsParam: username dataType: string isRequired: true defaultValue: '' isModifiable: true - svcOperationCfsParamId: 795 svcOperationCfsParam: clusterConfiguration dataType: map-fixed isRequired: true 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: '' isRequired: true isModifiable: false valueList: - '1' - '3' - '5' - '7' disk: dataType: integer > 0 defaultValue: '' isRequired: true isModifiable: false - svcOperationCfsParamId: 796 svcOperationCfsParam: accessConfiguration dataType: map-fixed isRequired: true defaultValue: '' isModifiable: true dataDescriptor: masterIpSpace: dataType: string defaultValue: '' isRequired: true isModifiable: false masterAccessList: dataType: json defaultValue: '' isRequired: true isModifiable: false slaveIpSpace: dataType: string defaultValue: '' isRequired: true isModifiable: false slaveAccessList: dataType: json defaultValue: '' isRequired: true isModifiable: false - svcOperationCfsParamId: 797 svcOperationCfsParam: postgresConfiguration dataType: map-fixed isRequired: true defaultValue: '' isModifiable: true dataDescriptor: version: dataType: string defaultValue: '' isRequired: true isModifiable: false valueList: - '17' - '16' sslRequired: dataType: boolean defaultValue: false,true isRequired: true isModifiable: false poolerMaster: dataType: boolean defaultValue: '' isRequired: true isModifiable: false valueList: - 'false' - 'true' poolerSlave: dataType: boolean defaultValue: '' isRequired: true isModifiable: false valueList: - 'false' - 'true' - svcOperationCfsParamId: 798 svcOperationCfsParam: postgresConf dataType: array-map-fixed isRequired: false defaultValue: '' isModifiable: true dataDescriptor: paramValue: dataType: string defaultValue: '' isRequired: true isModifiable: false paramName: dataType: string defaultValue: '' isRequired: true isModifiable: false valueList: - log_connections - log_disconnections - svcOperationCfsParamId: 799 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: 0 0 * * * isRequired: true isModifiable: false - svcOperationCfsParamId: 800 svcOperationCfsParam: autoscaleConfiguration dataType: map-fixed isRequired: true 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: '' isRequired: true isModifiable: false valueList: - 'false' - 'true' schedule: dataType: integer >= 0 defaultValue: '' isRequired: true isModifiable: false valueList: - '0' - '5' - '12' - '23' - svcOperationCfsParamId: 1095 svcOperationCfsParam: mtlsConfiguration dataType: map-fixed isRequired: true defaultValue: '' isModifiable: true dataDescriptor: durationCA: dataType: integer > 0 defaultValue: '' isRequired: true isModifiable: false durationServer: dataType: integer > 0 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' type: dataType: string defaultValue: '' isRequired: true isModifiable: false valueList: - 'off' - manual - auto - svcOperationCfsParamId: 801 svcOperationCfsParam: startupConfiguration dataType: map-fixed isRequired: true defaultValue: '' isModifiable: true dataDescriptor: resourceRealm: dataType: string defaultValue: '' isRequired: true isModifiable: false valueList: - iot-naeel - k8s-3-sandbox-nubes-ru - k8s-4-sandbox-nubes-ru - naeel-test-3 recoveryPoint: dataType: string defaultValue: '' isRequired: true isModifiable: false - svcOperationCfsParamId: 802 svcOperationCfsParam: clusterConfiguration dataType: map-fixed isRequired: true defaultValue: '' isModifiable: true dataDescriptor: 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' disk: dataType: integer > 0 defaultValue: '10' isRequired: true isModifiable: false cpu: dataType: integer > 0 defaultValue: '500' isRequired: true isModifiable: false - svcOperationCfsParamId: 803 svcOperationCfsParam: accessConfiguration dataType: map-fixed isRequired: true defaultValue: '' isModifiable: true dataDescriptor: masterAccessList: dataType: json defaultValue: '[]' isRequired: true isModifiable: false slaveIpSpace: dataType: string defaultValue: '' isRequired: true isModifiable: false slaveAccessList: dataType: json defaultValue: '[]' isRequired: true isModifiable: false masterIpSpace: dataType: string defaultValue: '' isRequired: true isModifiable: false - svcOperationCfsParamId: 804 svcOperationCfsParam: postgresConfiguration dataType: map-fixed isRequired: true defaultValue: '' isModifiable: true dataDescriptor: version: dataType: string defaultValue: '17' isRequired: true isModifiable: false valueList: - '17' - '16' sslRequired: dataType: boolean defaultValue: 'true' isRequired: true isModifiable: false valueList: - 'false' - 'true' poolerMaster: dataType: boolean defaultValue: 'false' isRequired: true isModifiable: false valueList: - 'false' - 'true' poolerSlave: dataType: boolean defaultValue: 'false' isRequired: true isModifiable: false valueList: - 'false' - 'true' - svcOperationCfsParamId: 805 svcOperationCfsParam: postgresConf dataType: array-map-fixed isRequired: false defaultValue: '' isModifiable: true dataDescriptor: paramName: dataType: string defaultValue: '' isRequired: true isModifiable: false valueList: - log_connections - log_disconnections paramValue: dataType: string defaultValue: '' isRequired: true isModifiable: false - svcOperationCfsParamId: 806 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: 807 svcOperationCfsParam: autoscaleConfiguration dataType: map-fixed isRequired: true defaultValue: '' isModifiable: true dataDescriptor: enabled: dataType: boolean defaultValue: 'false' isRequired: true isModifiable: false valueList: - 'false' - 'true' schedule: dataType: integer >= 0 defaultValue: '0' isRequired: true isModifiable: false valueList: - '0' - '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' cfsParamsByOp: 19: - 788 - 789 - 790 - 791 - 792 - 793 - 794 - 1094 264: [] 245: - 741 - 742 241: - 733 - 740 - 1096 20: - 457 246: - 743 244: - 739 48: - 795 - 796 - 797 - 798 - 799 - 800 - 1095 263: [] 47: - 801 - 802 - 803 - 804 - 805 - 806 - 807 54: [] 114: [] 115: [] stateParams: clusterConfiguration: '{"replicas": 1, "disk": 10, "cpu": 500, "memory": 512}' 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": ""}'