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": "<ip>",
"fqdn": "write.<namespace>.<cluster-domain>",
"uuid": "<uuid>",
"isExternal": false
}
}
```
Поля: `ip` — внешний IP; `fqdn` — полное имя хоста; `uuid` — идентификатор; `isExternal` — признак внешнего доступа.
#### internalConnect
Внутренние эндпоинты (FQDN) для подключения из других сервисов внутри той же сети Kubernetes.
Пример ответа платформы:
```json
{
"slave": "",
"master": {
"slave": "",
"master": {
"slave": "",
"master": "postgresqlk8s-master.<namespace>.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:
suspend_on_destroy_default: true
adopt_existing_on_create_default: false
outputs:
params:
- code: state_params
type: map
- code: state_out
type: map
- code: state_params_flat
type: map
- code: state_out_flat
type: map
- code: vault_secrets
type: map
sensitive: true
- code: vault_url
type: string
- code: vault_user_path
type: string
- code: vault_fields
type: list
operations:
- name: create
id: 19
kind: instance
action: create
man: руководство
params:
- id: 23
code: s3Uid
data_type: uuid
required: true
ref_svc_id: 12
descr: Экземпляр (учетная запись) S3 для резервного копирования. Резервное копирование обязательно
man: Экземпляр (учетная запись) S3 для резервного копирования. Резервное копирование обязательно
sort: 20
- id: 80
code: resourceInstances
data_type: integer > 0
required: true
default: "1"
regex: ^[1357]$
maxvalue: 7
minvalue: 1
descr: Количество узлов
man: Количество узлов в кластере. 1,3,5,7
sort: 60
is_modifiable: true
- id: 81
code: resourceMemory
data_type: integer > 0
required: true
default: "512"
maxvalue: 8192
minvalue: 128
descr: Квота памяти пода (MBytes)
man: Квота памяти пода (MBytes)
sort: 40
is_modifiable: true
- id: 82
code: resourceCPU
data_type: integer > 0
required: true
default: "500"
maxvalue: 4000
minvalue: 100
descr: Квота ядра пода (milicores)
man: Квота ядра пода (milicores)
sort: 30
is_modifiable: true
- id: 83
code: resourceDisk
required: true
default: "10"
maxvalue: 999
minvalue: 1
descr: Квота диска (Указывается в GIGAbytes)
man: Квота диска (Указывается в GIGAbytes)
sort: 50
is_modifiable: true
- id: 102
code: resourceRealm
data_type: string
required: true
func: getAvailableResourceRealms
descr: Платформа для развертывания
man: Кластер Kubernetes, на котором будет развернут экземпляр
sort: 10
- id: 145
code: needExternalAddressMaster
data_type: boolean
required: false
default: "false"
value_list:
- "false"
- "true"
descr: Выделяет внешний (белый) IP для доступа к master
man: Выделяет внешний (белый) IP для доступа к master
sort: 70
is_modifiable: true
- id: 146
code: needExternalAddressSlave
data_type: boolean
required: false
default: "false"
value_list:
- "false"
- "true"
descr: Выделяет внешний (белый) IP для доступа к slave. Будет работать, если slave в принципе есть
man: Выделяет внешний (белый) IP для доступа к slave. Будет работать, если slave в принципе есть
sort: 90
is_modifiable: true
- id: 265
code: ext_BACKUP_SCHEDULE
data_type: string
required: false
default: 0 0 * * *
regex: ^((((\d+,)+\d+|(\d+(\/|-|#)\d+)|(\d+L?)|(\*(\/\d+)?)|(L(-\d+)?)|(\?)|([A-Z]{3}(-[A-Z]{3})?)) ?){5,7})|(@(annually|yearly|monthly|weekly|daily|hourly|reboot))|(@every (\d+(ns|us|µs|ms|s|m|h))+)$
man: Не обязательный. Время запуска бекапа
sort: 150
is_modifiable: true
- id: 266
code: ext_BACKUP_NUM_TO_RETAIN
data_type: integer > 0
required: false
default: "7"
maxvalue: 99
minvalue: 1
man: Не обязательный. Количество сохраняемых бекапов
sort: 140
is_modifiable: true
- id: 310
code: appVersion
data_type: string
required: true
default: "17"
value_list:
- "17"
- "16"
descr: Версия PostgreSQL
sort: 160
is_modifiable: true
- id: 311
code: jsonParameters
data_type: json
required: true
default: '{ "log_connections": "off", "log_disconnections": "off" }'
maxlength: 2048
descr: Массив переменных, более подробнее про настройку можно посмотреть https://www.postgresql.org/docs/current/runtime-config.html
sort: 170
is_modifiable: true
- id: 312
code: enablePgPoolerMaster
data_type: boolean
required: true
default: "false"
value_list:
- "false"
- "true"
descr: Включает pgPooler (на запись). Будет создан новый под
sort: 180
is_modifiable: true
- id: 313
code: enablePgPoolerSlave
data_type: boolean
required: true
default: "false"
value_list:
- "false"
- "true"
descr: Включает pgPooler (на чтение). Будет создан новый под
sort: 190
is_modifiable: true
- id: 314
code: allowNoSSL
data_type: boolean
required: true
default: "false"
value_list:
- "false"
- "true"
descr: По умолчанию подключение обязательное (sslmode=require). Выставление в true отключит этот параметр
sort: 200
is_modifiable: true
- id: 329
code: autoScale
data_type: boolean
required: true
default: "false"
value_list:
- "false"
- "true"
descr: Включает автоскейлинг PV. При включении параметра необходимо настроить autoScalePercentage и autoScaleTechWindow. Алерт при срабатывании вызывает modify у текущей услуги
sort: 300
- id: 330
code: autoScalePercentage
data_type: integer > 0
required: true
default: "10"
value_list:
- "10"
- "15"
- "20"
descr: Требует включения autoScale. Позволяет указать в процентах расширение от текущего макс объема
sort: 310
- id: 331
code: autoScaleTechWindow
data_type: integer >= 0
required: true
default: "0"
value_list:
- "0"
- "5"
- "12"
- "23"
descr: Требует включения autoScale. Окно обновления (пока не реализовано). Указывается час в виде Integer (0 / 5 / 12 / 23)
sort: 320
- id: 337
code: ipSpaceNameMaster
data_type: string
required: false
descr: 'Имя ipSpace для публикации VIP master. Не может быть пустым, если включен needExternalAddressMaster. Пример: `internet-no-antiddos-v1`'
sort: 80
is_modifiable: true
- id: 338
code: ipSpaceNameSlave
data_type: string
required: false
descr: Имя ipSpace для публикации VIP slave. Не может быть пустым, если включен needExternalAddressSlave
sort: 100
is_modifiable: true
- id: 339
code: autoScaleQuotaGb
data_type: string
required: true
default: "1"
descr: Квота для autoScale
sort: 330
- name: create_database
id: 245
kind: subresource
action: create
subresource: database
params:
- id: 741
code: dbName
data_type: string
required: true
- id: 742
code: dbOwner
data_type: string
required: true
- name: create_user
id: 241
kind: subresource
action: create
subresource: user
params:
- id: 733
code: username
data_type: string
required: true
regex: ^(?![0-9_])[a-zA-Z_][a-zA-Z0-9_]{0,62}$
maxlength: 62
minlength: 2
- id: 740
code: role
data_type: string
required: true
value_list:
- app_user
- ddl_user
descr: Выбрать роль из списка
man: '`app_user` — стандартный пользователь с базовым набором прав
`ddl_user` — пользователь с расширенными правами, включая управление ролями и базами данных'
- name: delete
id: 20
kind: instance
action: delete
params:
- id: 457
code: deleteS3Bucket
data_type: boolean
required: true
default: "true"
value_list:
- "false"
- "true"
descr: Также удалить технический S3 Bucket с бэкапами?
sort: 10
- name: delete_database
id: 246
kind: subresource
action: delete
subresource: database
params:
- id: 743
code: dbName
data_type: string
required: true
- name: delete_user
id: 244
kind: subresource
action: delete
subresource: user
params:
- id: 739
code: username
data_type: string
required: true
descr: 'Пример: `username-admin`'
- name: modify
id: 48
kind: instance
action: modify
params:
- id: 91
code: resourceInstances
data_type: integer > 0
required: false
maxvalue: 7
minvalue: 1
descr: Количество узлов
man: Количество узлов в сети
sort: 40
- id: 92
code: resourceMemory
data_type: integer > 0
required: false
maxvalue: 8192
minvalue: 128
descr: Квота памяти пода (MBytes)
man: Квота памяти пода (MBytes)
sort: 20
- id: 93
code: resourceCPU
data_type: integer > 0
required: false
maxvalue: 4000
minvalue: 100
descr: Квота ядра пода (milicores)
man: Квота ядра пода (milicores)
sort: 10
- id: 94
code: resourceDisk
data_type: integer > 0
required: false
maxvalue: 999
minvalue: 1
descr: Квота диска (Указывается в GIGAbytes)
man: Квота диска (Указывается в GIGAbytes)
sort: 30
- id: 147
code: needExternalAddressMaster
data_type: boolean
required: true
value_list:
- "false"
- "true"
descr: Выделяет внешний IP для доступа к master
man: Выделяет внешний IP для доступа к master
sort: 50
- id: 148
code: needExternalAddressSlave
data_type: boolean
required: true
value_list:
- "false"
- "true"
descr: Выделяет внешний IP для доступа к slave. Действует, если slave в принципе есть
man: Выделяет внешний IP для доступа к slave. Действует, если slave в принципе есть
sort: 70
- id: 267
code: ext_BACKUP_SCHEDULE
data_type: string
required: false
regex: ^((((\d+,)+\d+|(\d+(\/|-|#)\d+)|(\d+L?)|(\*(\/\d+)?)|(L(-\d+)?)|(\?)|([A-Z]{3}(-[A-Z]{3})?)) ?){5,7})|(@(annually|yearly|monthly|weekly|daily|hourly|reboot))|(@every (\d+(ns|us|µs|ms|s|m|h))+)$
man: Не обязательный. Время запуска бекапа
sort: 90
- id: 268
code: ext_BACKUP_NUM_TO_RETAIN
data_type: integer > 0
required: false
maxvalue: 99
minvalue: 1
man: Не обязательный. Количество сохраняемых бекапов
sort: 100
- id: 315
code: appVersion
data_type: string
required: true
value_list:
- "17"
- "16"
descr: Версия PostgreSQL. Нельзя опускать вниз
sort: 110
- id: 316
code: jsonParameters
data_type: json
required: false
maxlength: 2048
descr: Массив переменных, более подробнее про настройку можно посмотреть https://www.postgresql.org/docs/current/runtime-config.html
sort: 120
- id: 317
code: enablePgPoolerMaster
data_type: boolean
required: true
default: "false"
value_list:
- "false"
- "true"
descr: Включает pgPooler (на запись). Будет создан новый под
sort: 130
- id: 318
code: enablePgPoolerSlave
data_type: boolean
required: true
default: "false"
value_list:
- "false"
- "true"
descr: Включает pgPooler (на чтение). Будет создан новый под
sort: 140
- id: 319
code: allowNoSSL
data_type: boolean
required: true
default: "false"
value_list:
- "false"
- "true"
descr: По умолчанию подключение обязательное (sslmode=require). Выставление в true отключит этот параметр
sort: 150
- id: 541
code: ipSpaceNameMaster
data_type: string
required: false
descr: 'Имя ipSpace для публикации VIP master. Не может быть пустым, если включен needExternalAddressMaster. Пример: `internet-no-antiddos-v1`'
sort: 60
- id: 542
code: ipSpaceNameSlave
data_type: string
required: false
descr: Имя ipSpace для публикации VIP slave. Не может быть пустым, если включен needExternalAddressSlave
sort: 80
- name: recovery
id: 47
kind: action
action: recovery
params:
- id: 86
code: resourceInstances
data_type: integer > 0
required: true
default: "1"
maxvalue: 7
minvalue: 1
descr: Количество узлов
man: Количество узлов в сети
sort: 50
- id: 87
code: resourceMemory
data_type: integer > 0
required: true
default: "512"
maxvalue: 8192
minvalue: 128
descr: Квота памяти пода (Указывается в Megabytes)
man: Квота памяти пода (Указывается в Megabytes)
sort: 30
- id: 88
code: resourceCPU
data_type: integer > 0
required: true
default: "500"
maxvalue: 4000
minvalue: 100
descr: Квота ядра пода (Указывается в mili)
man: Квота ядра пода (Указывается в mili)
sort: 20
- id: 89
code: resourceDisk
data_type: integer > 0
required: true
default: "1"
maxvalue: 999
minvalue: 1
descr: Квота диска (Указывается в GIGAbytes)
man: Квота диска (Указывается в GIGAbytes)
sort: 40
- id: 131
code: resourceRealm
data_type: string
required: true
func: getAvailableResourceRealms
descr: Платформа для развертывания
man: Наименование кластера Kubernetes для подключения
sort: 10
- name: restart
id: 54
kind: action
action: restart
man: ВНИМАНИЕ - Рестарт предполагает УДАЛЕНИЕ подов.
Может быть полная поломка. Крайне осторожно запускать при работе
params: []
- name: resume
id: 114
kind: instance
action: resume
params: []
- name: suspend
id: 115
kind: instance
action: suspend
params: []