[Документация Yandex Cloud](../../index.md) > [Yandex Managed Service for PostgreSQL](../index.md) > [Пошаговые инструкции](index.md) > Кластеры > Создание кластера

# Создание кластера PostgreSQL


{% note info %}

В [регионе Казахстан](../../overview/concepts/region.md) доступна только [зона доступности](../../overview/concepts/geo-scope.md) `kz1-a`.

{% endnote %}

{% note info %}

В [регионе Казахстан](../../overview/concepts/region.md) доступны только [платформы](../../compute/concepts/vm-platforms.md#standard-platforms) `standard-v3` (Intel Ice Lake) и `standard-v3-t4i` (Intel Ice Lake with T4i). Другие типы платформ, кластеры GPU и выделенные хосты недоступны.

{% endnote %}



[Кластер](../../glossary/cluster.md) PostgreSQL — это один или несколько [хостов базы данных](../concepts/index.md), между которыми можно настроить [репликацию](../concepts/replication.md). Репликация работает по умолчанию в любом кластере из более чем одного хоста: хост-мастер принимает запросы на запись и дублирует изменения в репликах. Транзакция подтверждается, если данные записаны на [диск](../concepts/storage.md) и на хосте-мастере, и на определенном числе реплик, достаточном для формирования кворума.

{% note info %}

* Количество хостов, которые можно создать вместе с кластером PostgreSQL, зависит от выбранного [типа диска](../concepts/storage.md#storage-type-selection) и [класса хостов](../concepts/instance-types.md#available-flavors).
* Доступные типы диска зависят от выбранного [класса хостов](../concepts/instance-types.md#available-flavors).
* Если хранилище БД заполнится на 97%, кластер перейдет в режим только чтения. Рассчитывайте и увеличивайте необходимый размер хранилища заранее или [настройте автоматическое увеличение его размера](storage-space.md#disk-size-autoscale).

{% endnote %}

По умолчанию Managed Service for PostgreSQL выставляет максимально возможное количество подключений к каждому хосту кластера PostgreSQL. Этот максимум не может быть больше значения настройки [Max connections](../concepts/settings-list.md#setting-max-connections).

{% note warning %}

Managed Service for PostgreSQL резервирует 15 подключений для служебных пользователей на каждом PostgreSQL-хосте. Например, если для кластера выставлено значение настройки [Max connections](../concepts/settings-list.md#setting-max-connections) `100`, то вы можете зарезервировать не больше 85 подключений для пользователей кластера.

{% endnote %}


## Роли для создания кластера {#roles}

Для создания кластера Managed Service for PostgreSQL и работы с ним вашему аккаунту в Yandex Cloud нужны роли:

* [managed-postgresql.editor](../security/index.md#managed-postgresql-editor) или выше — чтобы создать кластер;
* [vpc.user](../../vpc/security/index.md#vpc-user) — чтобы работать с [сетью](../../vpc/concepts/network.md#network) кластера;
* [mdb.viewer](../../iam/roles-reference.md#mdb-viewer) — чтобы просматривать кластеры управляемых баз данных (MDB) на дашборде в [консоли управления](https://kz.console.yandex.cloud).

О назначении ролей читайте в [документации Yandex Identity and Access Management](../../iam/operations/roles/grant.md).


## Создать кластер {#create-cluster}


{% list tabs group=instructions %}

- Консоль управления {#console}


  
  @[youtube](https://www.youtube.com/watch?v=UByUvah7lDU&list=PL1x4ET76A10bW1KU3twrdm7hH376z8G5R&index=6&pp=iAQB)

  [Смотреть видео в Yandex Cloud Video](https://runtime.strm.yandex.ru/player/video/vplvhanaqkgdchwzk7xu?autoplay=0&mute=0).


  Чтобы создать кластер Managed Service for PostgreSQL:

  1. В [консоли управления](https://kz.console.yandex.cloud) выберите [каталог](../../resource-manager/concepts/resources-hierarchy.md#folder), в котором нужно создать кластер БД.
  1. Перейдите в сервис **Managed Service for&nbsp;PostgreSQL**.
  1. Нажмите кнопку **Создать кластер**.
  1. Введите имя кластера в поле **Имя кластера**. Имя кластера должно быть уникальным в рамках каталога.
  1. Выберите окружение, в котором нужно создать кластер (после создания кластера окружение изменить невозможно):
     * `PRODUCTION` — для стабильных версий ваших приложений.
     * `PRESTABLE` — для тестирования. Prestable-окружение аналогично Production-окружению и на него также распространяется SLA, но при этом на нем раньше появляются новые функциональные возможности, улучшения и исправления ошибок. В Prestable-окружении вы можете протестировать совместимость новых версий с вашим приложением.
  1. Из выпадающего списка **Версия** выберите версию СУБД или оставьте версию по умолчанию — `17`.
  1. Выберите класс хостов — он определяет технические характеристики [виртуальных машин](../../compute/concepts/vm.md), на которых будут развернуты хосты БД. Все доступные варианты перечислены в разделе [Классы хостов](../concepts/instance-types.md). При изменении класса хостов для кластера меняются характеристики всех уже созданных хостов.
  1. В блоке **Размер хранилища**:

     * Выберите тип диска.

     
       От выбранного типа зависит, с каким шагом можно будет изменить размер диска:
       
       * Сетевые HDD- и SSD-диски — с шагом 1 ГБ.
       * Локальные SSD-диски:
           * для платформ **Intel Broadwell** и **Intel Cascade Lake** — с шагом 100 ГБ;
           * для платформ **Intel Ice Lake** и **AMD Zen 4** — с шагом 368 ГБ.
       * Нереплицируемые SSD-диски и cверхбыстрые сетевые SSD-диски с тремя репликами — с шагом 93 ГБ.


       {% note info %}
       
       Локальные SSD-диски могут незначительно увеличивать нагрузку на процессорные ядра хостов кластера.
       
       {% endnote %}

     * Выберите размер хранилища, который будет использоваться для данных и резервных копий. Подробнее о том, как занимают пространство резервные копии, читайте в разделе [Резервные копии](../concepts/backup.md).

     
     * (Опционально) Выберите опцию **Зашифрованный диск**, чтобы зашифровать диск [пользовательским ключом KMS](../../kms/concepts/key.md).

       * Чтобы [создать](../../kms/operations/key.md#create) новый ключ, нажмите кнопку **Создать**.

       * Чтобы использовать созданный ранее ключ, выберите его в поле **Ключ KMS**.

       Подробнее о шифровании дисков в разделе [Хранилище](../concepts/storage.md#disk-encryption).


  1. (Опционально) В блоке **Автоматическое увеличение размера хранилища** укажите желаемые настройки:

      * В поле **Увеличивать размер** задайте соответствующие условия, чтобы:

          * Размер хранилища увеличился в следующее [окно обслуживания](../concepts/maintenance.md#maintenance-window), когда хранилище окажется заполнено более чем на указанную долю (%).
          * Размер хранилища увеличился незамедлительно, когда хранилище окажется заполнено более чем на указанную долю (%).

          Можно задать оба условия, но порог для незамедлительного увеличения должен быть выше порога для увеличения в окно обслуживания. 
          
          Подробнее об условиях для увеличения хранилища в [соответствующем разделе](../concepts/storage.md#auto-rescale).

      * В поле **Максимальный размер хранилища** укажите максимальный размер хранилища, который может быть установлен при автоматическом увеличении размера хранилища.

      Если заданный процент заполнения достигнут, размер хранилища увеличивается по-разному в зависимости от типа диска:
      
      * Для сетевых HDD- и SSD-дисков — на большее из двух значений: 20 ГБ или 20% от текущего размера диска.
      * Для нереплицируемых SSD-дисков и сверхбыстрых сетевых SSD-дисков с тремя репликами — на 93 ГБ.
      * Для локальных SSD-дисков:
      
          * В кластере на платформе **Intel Broadwell** или **Intel Cascade Lake** — на 100 ГБ.
          * В кластере на платформе **Intel Ice Lake** или **AMD Zen 4** — на 368 ГБ.
      
      
      Если заданный процент заполнения достигнут повторно, размер хранилища будет автоматически увеличиваться, пока не достигнет заданного максимума. После этого вы можете задать новый максимальный размер хранилища вручную.

      Когда размер хранилища изменяется, хосты кластера обновляются по одному в случайном порядке. Если во время обновления потребуется перезагрузка хоста, он станет недоступным на это время.
      
      Перед обновлением хоста-мастера его роль берет на себя одна из реплик. Если вы используете для доступа к кластеру [FQDN](connect/fqdn.md) хоста-мастера, такой кластер может стать недоступным. Чтобы обеспечить бесперебойную работу приложения, при подключении перечислите все хосты кластера и укажите параметр `target_session_attrs=primary` или подключайтесь через [особый FQDN](connect/fqdn.md), всегда указывающий на текущий хост-мастер.

      
      {% note warning %}
      
      Размер хранилища нельзя уменьшить после автоматического увеличения.
      
      {% endnote %}


      {% note info %}
      
      Некоторые настройки PostgreSQL [зависят от размера хранилища](../concepts/settings-list.md#settings-instance-dependent).
      
      {% endnote %}

      Если настроено увеличение хранилища в окно обслуживания, настройте расписание окна обслуживания.

  1. В блоке **База данных** укажите атрибуты БД:

     * Имя БД. Это имя должно быть уникальным в рамках каталога.

       Имя базы может содержать латинские буквы, цифры, подчеркивание и дефис. Максимальная длина имени 63 символа. Имена `postgres`, `template0`, `template1` зарезервированы для собственных нужд Managed Service for PostgreSQL. Создавать базы с этими именами нельзя.

     * Имя пользователя — владельца БД. По умолчанию новому пользователю выделяется 50 подключений к каждому хосту кластера. Изменить допустимое количество подключений можно с помощью настройки [Conn limit](../concepts/settings-list.md#setting-conn-limit).

       Имя пользователя может содержать латинские буквы, цифры, дефис и подчеркивание, но должно начинаться с буквы (кроме сочетания `pg_`), цифры или подчеркивания. Максимальная длина имени 63 символа.
       
       Имена `admin`, `repl`, `monitor`, `postgres`, `mdb_admin`, `mdb_monitor`, `mdb_replication` зарезервированы для собственных нужд Managed Service for PostgreSQL. Создавать пользователей с этими именами нельзя.

     
     * Пароль пользователя. Длина пароля — от 8 до 128 символов.


     * Локаль сортировки и локаль набора символов. Эти настройки определяют правила, по которым производится сортировка строк (`LC_COLLATE`) и классификация символов (`LC_CTYPE`). В Managed Service for PostgreSQL настройки локали действуют на уровне отдельно взятой БД.

       PostgreSQL использует локали для поддержки различных языковых стандартов. Выбор локали влияет на:
       
       - Порядок сортировки в запросах с использованием оператора `ORDER BY` или стандартных операторов сравнения текстовых данных.
       - Функции `upper`, `lower`, `initcap`, а также семейство функций `to_char`.
       - Операторы поиска по шаблону (`LIKE`, `ILIKE`, `SIMILAR TO`, регулярные выражения).
       - Возможность использовать индексы с оператором `LIKE`.
       
       По умолчанию используется локаль `C`. При использовании кодировки `C` для текстовых данных с нелатинскими (например, кириллическими) символами возможны ошибки в порядке сортировки данных и отображении данных при поиске по шаблону. Если эта локаль не подходит для корректной обработки таблиц в базе данных, выберите другую из списка. Однако учитывайте, что использование нестандартной локали может снизить скорость выполнения запросов к базе данных.
       
       Подробнее о настройках локали читайте в [документации PostgreSQL](https://www.postgresql.org/docs/current/locale.html).
       
       Настройки локали нельзя изменить после создания базы данных. Но вы можете задать локаль сортировки для столбцов при создании и изменении отдельных таблиц. Подробнее читайте в  [документации PostgreSQL](https://www.postgresql.org/docs/current/sql-createtable.html).

  
  1. В блоке **Сетевые настройки** выберите:
     * [Облачную сеть](../../vpc/concepts/network.md#network) для размещения кластера. Если сети нет, нажмите **Создать сеть** и создайте ее:

       1. В открывшемся окне укажите имя сети и выберите каталог, в котором она будет создана.
       1. (Опционально) Выберите опцию **Создать подсети**, чтобы автоматически создать подсети во всех зонах доступности.
       1. Нажмите кнопку **Создать сеть**.

       {% note warning %}
       
       Выбранную для размещения кластера облачную сеть нельзя будет изменить. Если в дальнейшем вам потребуется переместить кластер в другую облачную сеть, воспользуйтесь функцией [восстановления из резервной копии](cluster-backups.md) и укажите необходимую сеть для копии кластера.
       
       {% endnote %}

     * [Группы безопасности](../../vpc/concepts/security-groups.md) для сетевого трафика кластера. Может потребоваться дополнительная [настройка групп безопасности](connect/index.md#configuring-security-groups) для того, чтобы можно было подключаться к кластеру.


  1. В блоке **Хосты** выберите параметры хостов БД, создаваемых вместе с кластером. По умолчанию каждый хост создается в отдельной [подсети](../../vpc/concepts/network.md#subnet). Чтобы выбрать для хоста конкретную подсеть, в строке этого хоста нажмите значок ![image](../../_assets/console-icons/pencil.svg).

     Минимальное количество хостов в кластере зависит от выбранного [типа диска](../concepts/storage.md). Конфигурация кластера по умолчанию, предлагаемая в консоли управления, включает:

      * два хоста, если выбран тип диска `network-ssd`, `network-hdd` или `network-ssd-io-m3`.
      * три хоста, если выбран тип диска `local-ssd` или `network-ssd-nonreplicated`.

     {% note warning %}

     Не рекомендуется создавать кластер из одного хоста. Такой кластер обходится дешевле, но не обеспечивает [высокую доступность](../concepts/high-availability.md#host-configuration).

     {% endnote %}

     После создания кластера Managed Service for PostgreSQL в него можно добавить дополнительные хосты, если для этого достаточно [ресурсов каталога](../concepts/limits.md).

     
     Чтобы к хосту можно было подключаться из интернета, включите настройку **Публичный доступ**.


  
  1. (Опционально) В блоке **DB Proxy** включите [балансировщик DB Proxy](../concepts/load-balancer.md) с помощью опции **Балансировка DB Proxy**, чтобы Managed Service for PostgreSQL автоматически распределял нагрузку по хостам БД в зависимости от их роли и доступности. При включенном балансировщике все хосты кластера автоматически добавляются в балансировку.

     Укажите параметры балансировки по репликам в блоке **Настройки портов**:

     * **Лаг** — максимальное отставание реплик, в секундах. При превышении этого отставания реплика не попадет в балансировку.
     * **Политика балансировки**:
         * `Round Robin` — выбор реплики в соответствии с политикой [Round-Robin](https://ru.wikipedia.org/wiki/Round-robin_(алгоритм)).
         * `Least connections` — выбор реплики с наименьшим числом соединений.

     {% note warning %}

     Включить балансировщик DB Proxy можно только при создании кластера.

     {% endnote %}



  1. При необходимости задайте дополнительные настройки кластера:

     - **Начало резервного копирования (UTC)** — промежуток времени, в течение которого начинается резервное копирование кластера. Время указывается по UTC в 24-часовом формате. По умолчанию — `22:00 - 23:00` UTC.
     
     - **Срок хранения автоматических резервных копий, дней** — время, в течение которого нужно хранить созданные автоматически резервные копии. Если для такой копии истекает срок хранения, то она удаляется. Значение по умолчанию — 7 дней. Подробнее читайте в разделе [Резервные копии](../concepts/backup.md).
     
         Изменение срока хранения затрагивает как новые автоматические резервные копии, так и уже существующие. Например, изначальный срок хранения был 7 дней. Оставшееся время жизни отдельной автоматической резервной копии при таком сроке — 1 день. При увеличении срока хранения до 9 дней оставшееся время жизни этой резервной копии будет уже 3 дня.
     
         Автоматические резервные копии кластера хранятся заданное количество дней, а созданные вручную — бессрочно. После удаления кластера все копии хранятся 7 дней.
     
     - **Обслуживание** — настройки времени [технического обслуживания](../concepts/maintenance.md):
     
         * Чтобы разрешить проведение технического обслуживания в любое время, выберите пункт **В любое время** (по умолчанию).
         * Чтобы указать предпочтительное время начала обслуживания, выберите пункт **По расписанию** и укажите день недели и интервал времени по UTC. Например, можно выбрать время, когда кластер наименее загружен.
         
         Операции по техническому обслуживанию проводятся для включенных и выключенных кластеров. Они могут включать в себя: обновление СУБД, применение патчей и т. д.
     
     - **Доступ из DataLens** — опция разрешает анализировать данные из кластера в сервисе [Yandex DataLens](../../datalens/concepts/index.md).
     
     
     - **Доступ из консоли управления** — опция разрешает [выполнять SQL-запросы](web-sql-query.md) к базам данных кластера из консоли управления Yandex Cloud.
     
     
     
     
     - **Доступ из Yandex Query** — опция разрешает выполнять YQL-запросы к базам данных кластера из сервиса [Yandex Query](../../query/concepts/index.md).
     
     - **Доступ из Serverless** — включите эту опцию, чтобы разрешить доступ к кластеру из сервиса [Yandex Cloud Functions](../../functions/concepts/index.md). Подробнее о настройке доступа читайте в документации [Cloud Functions](../../functions/operations/database-connection.md).
     
     
     
     - **Режим работы менеджера подключений** — выберите один из [режимов работы менеджера подключений](../concepts/pooling.md).
     
     - **Защита от удаления** — защита от удаления кластера, его баз данных и пользователей.
     
         По умолчанию при создании пользователей и БД значение параметра наследуется от кластера. Значение также можно задать вручную, подробнее читайте в разделах [Управление пользователями](cluster-users.md) и [Управление БД](databases.md).
         
         Если параметр изменен на работающем кластере, новое значение унаследуют только пользователи и БД с защитой **Как у кластера**.
     
         Включенная защита кластера от удаления не помешает подключиться к нему вручную и удалить данные.

  1. При необходимости задайте [настройки СУБД уровня кластера](../concepts/settings-list.md#dbms-cluster-settings).

     {% note info %}

     Некоторые настройки PostgreSQL [зависят от выбранного класса хостов или от размера хранилища](../concepts/settings-list.md#settings-instance-dependent).

     {% endnote %}

  1. Нажмите кнопку **Создать кластер**.

- CLI {#cli}

  Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), [установите и инициализируйте его](../../cli/quickstart.md#install).

  По умолчанию используется каталог, указанный при [создании](../../cli/operations/profile/profile-create.md) профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду `yc config set folder-id <идентификатор_каталога>`. Также для любой команды вы можете указать другой каталог с помощью параметров `--folder-name` или `--folder-id`. Если вы обращаетесь к ресурсу по имени, поиск будет выполнен в каталоге по умолчанию. Если вы обращаетесь к ресурсу по идентификатору, поиск будет выполнен глобально — во всех каталогах с учетом прав доступа.

  Чтобы создать кластер Managed Service for PostgreSQL:

  
  1. Проверьте, есть ли в [каталоге](../../resource-manager/concepts/resources-hierarchy.md#folder) [подсети](../../vpc/concepts/network.md#subnet) для хостов кластера:

     ```bash
     yc vpc subnet list
     ```

     Если ни одной подсети в каталоге нет, [создайте нужные подсети](../../vpc/operations/subnet-create.md) в [сервисе Yandex Virtual Private Cloud](../../vpc/index.md).


  1. Посмотрите описание команды CLI для создания кластера:

     ```bash
     yc managed-postgresql cluster create --help
     ```

  1. Укажите параметры кластера в команде создания (в примере приведены не все доступные параметры):

     
     ```bash
     yc managed-postgresql cluster create \
       --name <имя_кластера> \
       --environment <окружение> \
       --network-name <имя_сети> \
       --host zone-id=<зона_доступности>,`
             `subnet-id=<идентификатор_подсети>,`
             `assign-public-ip=<разрешить_публичный_доступ_к_хосту> \
       --resource-preset <класс_хоста> \
       --user name=<имя_пользователя>,password=<пароль_пользователя> \
       --database name=<имя_БД>,owner=<имя_владельца_БД> \
       --disk-size <размер_хранилища_ГБ> \
       --disk-type <network-hdd|network-ssd|network-ssd-nonreplicated|local-ssd> \
       --security-group-ids <список_идентификаторов_групп_безопасности> \
       --connection-pooling-mode=<режим_работы_менеджера_подключений> \
       --deletion-protection \
       --performance-diagnostics enabled=<активировать_сбор_статистики>,`
                                `sessions-sampling-interval=<интервал_сбора_сессий>,`
                                `statements-sampling-interval=<интервал_сбора_запросов>
     ```


     Где:

     * `environment` — окружение: `prestable` или `production`.
     * `disk-type` — тип диска.

        {% note info %}
        
        Локальные SSD-диски могут незначительно увеличивать нагрузку на процессорные ядра хостов кластера.
        
        {% endnote %}

     
     * `assign-public-ip` — доступ к хосту из интернета: `true` или `false`.


     * `deletion-protection` — защита от удаления кластера, его баз данных и пользователей.

       По умолчанию при создании пользователей и БД значение параметра наследуется от кластера. Значение также можно задать вручную, подробнее в разделах [Управление пользователями](cluster-users.md) и [Управление БД](databases.md).

       Если параметр изменен на работающем кластере, новое значение унаследуют только пользователи и БД с защитой **Как у кластера**.

       Включенная защита кластера от удаления не помешает подключиться к нему вручную и удалить данные.


     
     Идентификатор подсети `subnet-id` необходимо указывать, если в выбранной [зоне доступности](../../overview/concepts/geo-scope.md) создано две и больше подсетей.

     {% note warning %}
     
     Выбранную для размещения кластера облачную сеть нельзя будет изменить. Если в дальнейшем вам потребуется переместить кластер в другую облачную сеть, воспользуйтесь функцией [восстановления из резервной копии](cluster-backups.md) и укажите необходимую сеть для копии кластера.
     
     {% endnote %}


     Имя базы может содержать латинские буквы, цифры, подчеркивание и дефис. Максимальная длина имени 63 символа. Имена `postgres`, `template0`, `template1` зарезервированы для собственных нужд Managed Service for PostgreSQL. Создавать базы с этими именами нельзя.

     Длина пароля — от 8 до 128 символов.


     Доступные [режимы работы менеджера подключений](../concepts/pooling.md): `SESSION`, `TRANSACTION` или `STATEMENT`.

     Также вы можете указать дополнительную опцию `replication-source` в параметре `--host` для того, чтобы [вручную управлять потоками репликации](../concepts/replication.md#replication-manual).

     Чтобы настроить время [технического обслуживания](../concepts/maintenance.md) (в т. ч. для выключенных кластеров), передайте параметр `--maintenance-window type=<тип_технического_обслуживания>`, где `type` принимает следующие значения:

     * `anytime` (по умолчанию) — в любое время.
     * `weekly` — по расписанию. Для этого значения дополнительно укажите:
         * `day` — день недели: `MON`, `TUE`, `WED`, `THU`, `FRI`, `SAT` или `SUN`.
         * `hour` — порядковый номер часового интервала по UTC: от `1` до `24`.
     
           > Например, `1` соответствует интервалу с `00:00` до `01:00`, `5` — с `04:00` до `05:00`.

     
     Чтобы зашифровать диск [пользовательским ключом KMS](../../kms/concepts/key.md), передайте параметр `--disk-encryption-key-id <идентификатор_ключа_KMS>`. Подробнее о шифровании дисков в разделе [Хранилище](../concepts/storage.md#disk-encryption).

     Чтобы разрешить доступ к кластеру из сервиса [Yandex Cloud Functions](../../functions/index.md), передайте параметр `--serverless-access`. Подробнее о настройке доступа в документации [Cloud Functions](../../functions/operations/database-connection.md).

     Чтобы разрешить доступ к кластеру из сервиса [Yandex Query](../../query/index.md), передайте параметр `--yandexquery-access=true`. Функциональность находится на стадии [Preview](../../overview/concepts/launch-stages.md) и предоставляется по запросу.


- Terraform {#tf}

  [Terraform](https://www.terraform.io/) позволяет быстро создать облачную инфраструктуру в Yandex Cloud и управлять ею с помощью файлов конфигураций. В файлах конфигураций хранится описание инфраструктуры на языке HCL (HashiCorp Configuration Language). При изменении файлов конфигураций Terraform автоматически определяет, какая часть вашей конфигурации уже развернута, что следует добавить или удалить.
  
  Terraform распространяется под лицензией [Business Source License](https://github.com/hashicorp/terraform/blob/main/LICENSE), а [провайдер Yandex Cloud для Terraform](https://github.com/yandex-cloud/terraform-provider-yandex) — под лицензией [MPL-2.0](https://www.mozilla.org/en-US/MPL/2.0/).
  
  Подробная информация о ресурсах провайдера в документации на сайте [Terraform](https://www.terraform.io/docs/providers/yandex/index.html) или в [зеркале](../../terraform/index.md).

  Если у вас еще нет Terraform, [установите его и настройте провайдер Yandex Cloud](../../tutorials/infrastructure-management/terraform-quickstart.md#install-terraform).
  
  
  Чтобы управлять инфраструктурой с помощью Terraform от имени сервисного аккаунта или пользовательских аккаунтов: аккаунта на Яндексе, федеративного аккаунта и локального пользователя, [аутентифицируйтесь](../../terraform/authentication.md) соответствующим способом.

  Чтобы создать кластер Managed Service for PostgreSQL:
  1. Опишите в конфигурационном файле параметры ресурсов, которые необходимо создать:
     * Кластер БД — описание кластера и его хостов.
     * База данных — описание БД кластера.
     * Пользователь — описание пользователя кластера.

     * Сеть — описание [облачной сети](../../vpc/concepts/network.md#network), в которой будет расположен кластер. Если подходящая сеть у вас уже есть, описывать ее повторно не нужно.

     * Подсети — описание [подсетей](../../vpc/concepts/network.md#subnet), к которым будут подключены хосты кластера. Если подходящие подсети у вас уже есть, описывать их повторно не нужно.

     {% note warning %}
     
     Выбранную для размещения кластера облачную сеть нельзя будет изменить. Если в дальнейшем вам потребуется переместить кластер в другую облачную сеть, воспользуйтесь функцией [восстановления из резервной копии](cluster-backups.md) и укажите необходимую сеть для копии кластера.
     
     {% endnote %}

     Пример структуры конфигурационного файла:

     
     ```hcl
     resource "yandex_mdb_postgresql_cluster" "<имя_кластера>" {
       name                = "<имя_кластера>"
       environment         = "<окружение>"
       network_id          = "<идентификатор_сети>"
       security_group_ids  = [ "<список_идентификаторов_групп_безопасности>" ]
       deletion_protection = <защитить_кластер_от_удаления>

       config {
         version = "<версия_PostgreSQL>"
         resources {
           resource_preset_id = "<класс_хоста>"
           disk_type_id       = "<тип_диска>"
           disk_size          = <размер_хранилища_ГБ>
         }
         pooler_config {
           pool_discard = <параметр_Odyssey>
           pooling_mode = "<режим_работы>"
         }
         ...
       }

       host {
         zone             = "<зона_доступности>"
         name             = "<имя_хоста>"
         subnet_id        = "<идентификатор_подсети>"
         assign_public_ip = <разрешить_публичный_доступ_к_хосту>
       }
     }

     resource "yandex_mdb_postgresql_database" "<имя_БД>" {
       cluster_id = "<идентификатор_кластера>"
       name       = "<имя_БД>"
       owner      = "<имя_владельца_БД>"
       depends_on = [
         yandex_mdb_postgresql_user.<имя_пользователя>
       ]
     }

     resource "yandex_mdb_postgresql_user" "<имя_пользователя>" {
       cluster_id = "<идентификатор_кластера>"
       name       = "<имя_пользователя>"
       password   = "<пароль_пользователя>"
     }

     resource "yandex_vpc_network" "<имя_сети>" { name = "<имя_сети>" }

     resource "yandex_vpc_subnet" "<имя_подсети>" {
       name           = "<имя_подсети>"
       zone           = "<зона_доступности>"
       network_id     = "<идентификатор_сети>"
       v4_cidr_blocks = ["<диапазон>"]
     }
     ```


     Где:

     * `environment` — окружение: `PRESTABLE` или `PRODUCTION`.

     
     * `assign_public_ip` — доступ к хосту из интернета: `true` или `false`.


     * `deletion_protection` — защита от удаления кластера, его баз данных и пользователей: `true` или `false`.

       По умолчанию при создании пользователей и БД значение параметра наследуется от кластера. Значение также можно задать вручную по инструкциям в разделах [Управление пользователями](cluster-users.md) и [Управление БД](databases.md).

       Если параметр изменен на работающем кластере, новое значение унаследуют только пользователи и БД с защитой **Как у кластера**.

       Включенная защита кластера от удаления не помешает подключиться к нему вручную и удалить данные.

     * `version` — версия PostgreSQL: 14, 14-1c, 15, 15-1c, 16, 16-1c, 17, 17-1c, 18 и 18-1c.
     * `pool_discard`  — параметр Odyssey `pool_discard`: `true` или `false`.
     * `pooling_mode` — режим работы: `SESSION`, `TRANSACTION` или `STATEMENT`.

     Имя базы может содержать латинские буквы, цифры, подчеркивание и дефис. Максимальная длина имени 63 символа. Имена `postgres`, `template0`, `template1` зарезервированы для собственных нужд Managed Service for PostgreSQL. Создавать базы с этими именами нельзя.

     Длина пароля — от 8 до 128 символов.


     Чтобы настроить автоматическое увеличение размера хранилища, добавьте в блок `config` блок `disk_size_autoscaling`:

     ```hcl
       resource "yandex_mdb_postgresql_cluster" "<имя_кластера>" {
         ...
         config {
           ...
           disk_size_autoscaling {
             disk_size_limit           = <максимальный_размер_хранилища_ГиБ>
             emergency_usage_threshold = <порог_для_незамедлительного_увеличения_в_процентах>
             planned_usage_threshold   = <порог_для_планового_увеличения_в_процентах>
           }
           ...
         }
         ...
       }
     ```
     Где:
     
     * `disk_size_limit` — максимальный размер хранилища после увеличения, в гибибайтах.
     * `emergency_usage_threshold` (опционально) — порог заполнения хранилища в процентах, при достижении которого оно будет увеличено незамедлительно. По умолчанию — `0` (автоматическое расширение отключено).
     
       Допустимые значения: от `0` до `100`.
          
     * `planned_usage_threshold` (опционально) — порог заполнения хранилища в процентах, при достижении которого оно будет увеличено в следующее окно обслуживания. По умолчанию — `0` (автоматическое расширение отключено).
            
       Допустимые значения: от `0` до `100`.
     
     Подробнее об условиях для увеличения хранилища читайте в [соответствующем разделе](../concepts/storage.md#auto-rescale).

     {% note warning %}

     * При использовании параметра `planned_usage_threshold` необходимо настроить окно технического обслуживания в блоке `maintenance_window`.

     * Если заданы оба порога, значение `emergency_usage_threshold` должно быть не меньше `planned_usage_threshold`.

     {% endnote %}

     Чтобы настроить время [технического обслуживания](../concepts/maintenance.md) (в т. ч. для выключенных кластеров), добавьте к описанию кластера блок `maintenance_window`:
     
     ```hcl
     resource "yandex_mdb_postgresql_cluster" "<имя_кластера>" {
       ...
       maintenance_window {
         type = "<тип_технического_обслуживания>"
         day  = "<день_недели>"
         hour = <порядковый_номер_часового_интервала>
       }
       ...
     }
     ```
     
     Где:
     
     * `type` — тип технического обслуживания. Принимает значения:
         * `ANYTIME` — в любое время.
         * `WEEKLY` — по расписанию.
     * `day` — день недели для типа `WEEKLY`: `MON`, `TUE`, `WED`, `THU`, `FRI`, `SAT` или `SUN`.
     * `hour` — порядковый номер часового интервала по UTC для типа `WEEKLY`: от `1` до `24`.
     
       > Например, `1` соответствует интервалу с `00:00` до `01:00`, `5` — с `04:00` до `05:00`.

     
     Чтобы зашифровать диск [пользовательским ключом KMS](../../kms/concepts/key.md), добавьте параметр `disk_encryption_key_id`:

       ```hcl
       resource "yandex_mdb_postgresql_cluster" "<имя_кластера>" {
         ...
         disk_encryption_key_id = <идентификатор_ключа_KMS>
         ...
       }
       ```

       Подробнее о шифровании дисков в разделе [Хранилище](../concepts/storage.md#disk-encryption).


     Чтобы настроить сбор статистики, добавьте в блок `config` блок `performance_diagnostics`:
     
     ```hcl
     resource "yandex_mdb_postgresql_cluster" "<имя_кластера>" {
       ...
       config {
         ...
         performance_diagnostics {
           enabled                      = <активация_сбора_статистики>
           sessions_sampling_interval   = <интервал_сбора_сессий>
           statements_sampling_interval = <интервал_сбора_запросов>
         }
         ...
       }
       ...
     }
     ```
     
     Где:
     
     * `enabled` — активация сбора статистики: `true` или `false`.
     * `sessions_sampling_interval` — интервал сбора сессий от `5` до `86400` секунд.
     * `statements_sampling_interval` — интервал сбора запросов от `60` до `86400` секунд.

     Полный список доступных для изменения полей конфигурации кластера Managed Service for PostgreSQL вы найдете в [документации провайдера Terraform](../../terraform/resources/mdb_postgresql_cluster.md).
  1. Проверьте корректность настроек.

     1. В командной строке перейдите в каталог, в котором расположены актуальные конфигурационные файлы Terraform с планом инфраструктуры.
     1. Выполните команду:
     
        ```bash
        terraform validate
        ```
     
        Если в файлах конфигурации есть ошибки, Terraform на них укажет.

  1. Создайте кластер.

     1. Выполните команду для просмотра планируемых изменений:
     
        ```bash
        terraform plan
        ```
     
        Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
     
     1. Если вас устраивают планируемые изменения, внесите их:
        1. Выполните команду:
     
           ```bash
           terraform apply
           ```
     
        1. Подтвердите изменение ресурсов.
        1. Дождитесь завершения операции.

     {% note warning "Ограничения по времени" %}
     
     Провайдер Terraform ограничивает время на выполнение операций с кластером Managed Service for PostgreSQL:
     
     * создание, в том числе путем восстановления из резервной копии, — 30 минут;
     * изменение — 60 минут;
     * удаление — 15 минут.
     
     Операции, длящиеся дольше указанного времени, прерываются.
     
     {% cut "Как изменить эти ограничения?" %}
     
     Добавьте к описанию кластера блок `timeouts`, например:
     
     ```hcl
     resource "yandex_mdb_postgresql_cluster" "<имя_кластера>" {
       ...
       timeouts {
         create = "1h30m" # Полтора часа
         update = "2h"    # 2 часа
         delete = "30m"   # 30 минут
       }
     }
     ```
     
     {% endcut %}
     
     {% endnote %}

- REST API {#api}

  1. [Получите IAM-токен для аутентификации в API](../api-ref/authentication.md) и поместите токен в переменную среды окружения:

     ```bash
     export IAM_TOKEN="<IAM-токен>"
     ```

  1. Создайте файл `body.json` и добавьте в него следующее содержимое:

     
     ```json
     {
       "folderId": "<идентификатор_каталога>",
       "name": "<имя_кластера>",
       "environment": "<окружение>",
       "networkId": "<идентификатор_сети>",
       "securityGroupIds": [
         "<идентификатор_группы_безопасности_1>",
         "<идентификатор_группы_безопасности_2>",
         ...
         "<идентификатор_группы_безопасности_N>"
       ],
       "deletionProtection": <защитить_кластер_от_удаления>,
       "configSpec": {
         "version": "<версия_PostgreSQL>",
         "resources": {
           "resourcePresetId": "<класс_хостов>",
           "diskSize": "<размер_хранилища_в_байтах>",
           "diskTypeId": "<тип_диска>",
           "diskEncryptionKeyId": "<идентификатор_ключа_KMS>"
         },
         "access": {
           "dataLens": <разрешить_доступ_из_DataLens>,
           "webSql": <разрешить_доступ_из_WebSQL>,
           "serverless": <разрешить_доступ_из_Cloud_Functions>,
           "yandexQuery": <разрешить_доступ_из_Query>
         },
         "performanceDiagnostics": {
           "enabled": <активировать_сбор_статистики>,
           "sessionsSamplingInterval": "<интервал_сбора_сессий>",
           "statementsSamplingInterval": "<интервал_сбора_запросов>"
         },
         "diskSizeAutoscaling": {
           "plannedUsageThreshold": "<порог_для_планового_увеличения_в_процентах>",
           "emergencyUsageThreshold": "<порог_для_незамедлительного_увеличения_в_процентах>",
           "diskSizeLimit": "<максимальный_размер_хранилища_в_байтах>"
         }
       },
       "databaseSpecs": [
         {
           "name": "<имя_БД>",
           "owner": "<имя_владельца_БД>"
         },
         { <аналогичный_набор_настроек_для_БД_2> },
         { ... },
         { <аналогичный_набор_настроек_для_БД_N> }
       ],
       "userSpecs": [
         {
           "name": "<имя_пользователя>",
           "password": "<пароль_пользователя>",
           "permissions": [
             {
               "databaseName": "<имя_БД>"
             }
           ],
           "login": <разрешить_пользователю_подключение_к_БД>
         },
         { <аналогичный_набор_настроек_для_пользователя_2> },
         { ... },
         { <аналогичный_набор_настроек_для_пользователя_N> }
       ],
       "hostSpecs": [
         {
           "zoneId": "<зона_доступности>",
           "subnetId": "<идентификатор_подсети>",
           "assignPublicIp": <разрешить_публичный_доступ_к_хосту>
         },
         { <аналогичный_набор_настроек_для_хоста_2> },
         { ... },
         { <аналогичный_набор_настроек_для_хоста_N> }
       ],
       "maintenanceWindow": {
         "weeklyMaintenanceWindow": {
           "day": "<день_недели>",
           "hour": "<порядковый_номер_часового_интервала>"
         }
       }
     }
     ```


     Где:

     * `folderId` — идентификатор каталога. Его можно запросить со [списком каталогов в облаке](../../resource-manager/operations/folder/get-id.md).
     * `name` — имя кластера.
     * `environment` — окружение кластера: `PRODUCTION` или `PRESTABLE`.
     * `networkId` — идентификатор [сети](../../vpc/concepts/network.md#network), в которой будет размещен кластер.

       {% note warning %}
       
       Выбранную для размещения кластера облачную сеть нельзя будет изменить. Если в дальнейшем вам потребуется переместить кластер в другую облачную сеть, воспользуйтесь функцией [восстановления из резервной копии](cluster-backups.md) и укажите необходимую сеть для копии кластера.
       
       {% endnote %}

     
     * `securityGroupIds` — идентификаторы [групп безопасности](../concepts/network.md#security-groups).


     * `deletionProtection` — защита от удаления кластера, его баз данных и пользователей: `true` или `false`.

       По умолчанию при создании пользователей и БД значение параметра наследуется от кластера. Значение также можно задать вручную, подробнее в разделах [Управление пользователями](cluster-users.md) и [Управление БД](databases.md).

       Если параметр изменен на работающем кластере, новое значение унаследуют только пользователи и БД с защитой **Как у кластера**.

        Включенная защита кластера от удаления не помешает подключиться к нему вручную и удалить данные.

     * `configSpec` — настройки кластера:

       * `version` — версия PostgreSQL.
       * `resources` — ресурсы кластера:

         * `resourcePresetId` — [класс хостов](../concepts/instance-types.md);
         * `diskSize` — размер диска в байтах;
         * `diskTypeId` — [тип диска](../concepts/storage.md);
         * `diskEncryptionKeyId` — идентификатор ключа KMS для шифрования диска.

       
       * `access` — настройки доступа к кластеру из следующих сервисов Yandex Cloud:

         * `dataLens` — [Yandex DataLens](../../datalens/index.md);
         * `webSql` — [Yandex WebSQL](../../websql/index.md);
         * `serverless` — [Yandex Cloud Functions](../../functions/index.md);
         * `yandexQuery` — [Yandex Query](../../query/index.md).

         Возможные значения настроек: `true` или `false`.


       * `performanceDiagnostics` — настройки для сбора статистики:

         * `enabled` — активация сбора статистики: `true` или `false`.
         * `sessionsSamplingInterval` — интервал сбора сессий. Возможные значения: от `1` до `86400` секунд.
         * `statementsSamplingInterval` — интервал сбора запросов. Возможные значения: от `60` до `86400` секунд.

       * `diskSizeAutoscaling` — настройки автоматического увеличения размера хранилища:
         * `plannedUsageThreshold` (опционально) — порог заполнения хранилища в процентах, при достижении которого оно будет увеличено в следующее окно обслуживания. По умолчанию — `0` (автоматическое расширение отключено).
                  
           Допустимые значения: от `0` до `100`.
       
         * `emergencyUsageThreshold` (опционально) — порог заполнения хранилища в процентах, при достижении которого оно будет увеличено незамедлительно. По умолчанию — `0` (автоматическое расширение отключено).
                  
           Допустимые значения: от `0` до `100`. 
       
         * `diskSizeLimit` — максимальный размер хранилища после увеличения, в байтах. 
       
         {% note warning %}
         
         * При использовании параметра `plannedUsageThreshold` необходимо задать окно технического обслуживания в настройке `maintenanceWindow`.
               
         * Если заданы оба порога, значение `emergencyUsageThreshold` должно быть не меньше `plannedUsageThreshold`.
       
         {% endnote %}
       
           Подробнее об условиях для увеличения хранилища читайте в [соответствующем разделе](../concepts/storage.md#auto-rescale).

     * `databaseSpecs` — настройки баз данных в виде массива элементов. Каждый элемент соответствует отдельной БД и имеет следующую структуру:

       * `name` — имя БД.
       * `owner` — имя владельца БД. Должно совпадать с именем одного из пользователей, указанных в запросе.

     * `userSpecs` — настройки пользователей в виде массива элементов. Каждый элемент соответствует отдельному пользователю и имеет следующую структуру:

       * `name` — имя пользователя.
       * `password` — пароль пользователя. Длина пароля — от 8 до 128 символов.


       * `permissions.databaseName` — имя базы данных, к которой пользователь получает доступ.
       * `login` — разрешение для пользователя на подключение к БД: `true` или `false`.

     * `hostSpecs` — настройки хостов кластера в виде массива элементов. Каждый элемент соответствует отдельному хосту и имеет следующую структуру:

       * `zoneId` — [зона доступности](../../overview/concepts/geo-scope.md);

       
       * `subnetId` — идентификатор [подсети](../../vpc/concepts/network.md#subnet)
       * `assignPublicIp` — разрешение на [подключение](connect/index.md) к хосту из интернета: `true` или `false`.


     * `maintenanceWindow` — настройки времени [технического обслуживания](../concepts/maintenance.md) (в т. ч. для выключенных кластеров). Передайте один из двух параметров:

       * `anytime` — техническое обслуживание проводится в любое время.
       * `weeklyMaintenanceWindow` — техническое обслуживание проводится раз в неделю в указанное время:

         * `day` — день недели: `MON`, `TUE`, `WED`, `THU`, `FRI`, `SAT` или `SUN`.
         * `hour` — порядковый номер часового интервала по UTC: от `1` до `24`.

           > Например, `1` соответствует интервалу с `00:00` до `01:00`, `5` — с `04:00` до `05:00`.

  1. Воспользуйтесь методом [Cluster.Create](../api-ref/Cluster/create.md) и выполните запрос, например, с помощью [cURL](https://curl.se/):

     ```bash
     curl \
       --request POST \
       --header "Authorization: Bearer $IAM_TOKEN" \
       --header "Content-Type: application/json" \
       --url 'https://mdb.api.yandexcloud.kz/managed-postgresql/v1/clusters' \
       --data "@body.json"
     ```

  1. Убедитесь, что запрос был выполнен успешно, изучив [ответ сервера](../api-ref/Cluster/create.md#yandex.cloud.operation.Operation).

- gRPC API {#grpc-api}

  1. [Получите IAM-токен для аутентификации в API](../api-ref/authentication.md) и поместите токен в переменную среды окружения:

     ```bash
     export IAM_TOKEN="<IAM-токен>"
     ```

  1. Клонируйте репозиторий [cloudapi](https://github.com/yandex-cloud/cloudapi):
     
     ```bash
     cd ~/ && git clone --depth=1 https://github.com/yandex-cloud/cloudapi
     ```
     
     Далее предполагается, что содержимое репозитория находится в директории `~/cloudapi/`.
  1. Создайте файл `body.json` и добавьте в него следующее содержимое:

     
     ```json
     {
       "folder_id": "<идентификатор_каталога>",
       "name": "<имя_кластера>",
       "environment": "<окружение>",
       "network_id": "<идентификатор_сети>",
       "security_group_ids": [
         "<идентификатор_группы_безопасности_1>",
         "<идентификатор_группы_безопасности_2>",
         ...
         "<идентификатор_группы_безопасности_N>"
       ],
       "deletion_protection": <защитить_кластер_от_удаления>,
       "config_spec": {
         "version": "<версия_PostgreSQL>",
         "resources": {
           "resource_preset_id": "<класс_хостов>",
           "disk_size": "<размер_хранилища_в_байтах>",
           "disk_type_id": "<тип_диска>",
           "disk_encryption_key_id": "<идентификатор_ключа_KMS>"
         },
         "access": {
           "data_lens": <разрешить_доступ_из_DataLens>,
           "web_sql": <разрешить_доступ_из_WebSQL>,
           "serverless": <разрешить_доступ_из_Cloud_Functions>,
           "yandex_query": <разрешить_доступ_из_Query>
         },
         "performance_diagnostics": {
           "enabled": <активировать_сбор_статистики>,
           "sessions_sampling_interval": "<интервал_сбора_сессий>",
           "statements_sampling_interval": "<интервал_сбора_запросов>"
         },
         "disk_size_autoscaling": {
           "planned_usage_threshold": "<порог_для_планового_увеличения_в_процентах>",
           "emergency_usage_threshold": "<порог_для_незамедлительного_увеличения_в_процентах>",
           "disk_size_limit": "<максимальный_размер_хранилища_в_байтах>"
         }
       },
       "database_specs": [
         {
           "name": "<имя_БД>",
           "owner": "<имя_владельца_БД>"
         },
         { <аналогичный_набор_настроек_для_БД_2> },
         { ... },
         { <аналогичный_набор_настроек_для_БД_N> }
       ],
       "user_specs": [
         {
           "name": "<имя_пользователя>",
           "password": "<пароль_пользователя>",
           "permissions": [
             {
               "database_name": "<имя_БД>"
             }
           ],
           "login": <разрешить_пользователю_подключение_к_БД>
         },
         { <аналогичный_набор_настроек_для_пользователя_2> },
         { ... },
         { <аналогичный_набор_настроек_для_пользователя_N> }
       ],
       "host_specs": [
         {
           "zone_id": "<зона_доступности>",
           "subnet_id": "<идентификатор_подсети>",
           "assign_public_ip": <разрешить_публичный_доступ_к_хосту>
         },
         { <аналогичный_набор_настроек_для_хоста_2> },
         { ... },
         { <аналогичный_набор_настроек_для_хоста_N> }
       ],
       "maintenance_window": {
         "weekly_maintenance_window": {
           "day": "<день_недели>",
           "hour": "<порядковый_номер_часового_интервала>"
         }
       }
     }
     ```


     Где:

     * `folder_id` — идентификатор каталога. Его можно запросить со [списком каталогов в облаке](../../resource-manager/operations/folder/get-id.md).
     * `name` — имя кластера.
     * `environment` — окружение кластера: `PRODUCTION` или `PRESTABLE`.
     * `network_id` — идентификатор [сети](../../vpc/concepts/network.md#network), в которой будет размещен кластер.

       {% note warning %}
       
       Выбранную для размещения кластера облачную сеть нельзя будет изменить. Если в дальнейшем вам потребуется переместить кластер в другую облачную сеть, воспользуйтесь функцией [восстановления из резервной копии](cluster-backups.md) и укажите необходимую сеть для копии кластера.
       
       {% endnote %}

     
     * `security_group_ids` — идентификаторы [групп безопасности](../concepts/network.md#security-groups).


     * `deletion_protection` — защита от удаления кластера, его баз данных и пользователей: `true` или `false`.

        По умолчанию при создании пользователей и БД значение параметра наследуется от кластера. Значение также можно задать вручную, подробнее в разделах [Управление пользователями](cluster-users.md) и [Управление БД](databases.md).

        Если параметр изменен на работающем кластере, новое значение унаследуют только пользователи и БД с защитой **Как у кластера**.

        Включенная защита кластера от удаления не помешает подключиться к нему вручную и удалить данные.

     * `config_spec` — настройки кластера:

       * `version` — версия PostgreSQL.
       * `resources` — ресурсы кластера:

         * `resource_preset_id` — [класс хостов](../concepts/instance-types.md);
         * `disk_size` — размер диска в байтах;
         * `disk_type_id` — [тип диска](../concepts/storage.md);
         * `disk_encryption_key_id` — идентификатор ключа KMS для шифрования диска.

       
       * `access` — настройки доступа к кластеру из следующих сервисов Yandex Cloud:

         * `data_lens` — [Yandex DataLens](../../datalens/index.md);
         * `web_sql` — [Yandex WebSQL](../../websql/index.md);
         * `serverless` — [Yandex Cloud Functions](../../functions/index.md);
         * `yandex_query` — [Yandex Query](../../query/index.md).

         Возможные значения настроек: `true` или `false`.


       * `performance_diagnostics` — настройки для сбора статистики:

         * `enabled` — активация сбора статистики: `true` или `false`.
         * `sessions_sampling_interval` — интервал сбора сессий. Возможные значения: от `1` до `86400` секунд.
         * `statements_sampling_interval` — интервал сбора запросов. Возможные значения: от `60` до `86400` секунд.

       * `disk_size_autoscaling` — настройки автоматического увеличения размера хранилища:
                
         * `planned_usage_threshold` (опционально) — порог заполнения хранилища в процентах, при достижении которого оно будет увеличено в следующее окно обслуживания. По умолчанию — `0` (автоматическое расширение отключено).
                  
           Допустимые значения: от `0` до `100`.
       
         * `emergency_usage_threshold` (опционально) — порог заполнения хранилища в процентах, при достижении которого оно будет увеличено незамедлительно. По умолчанию — `0` (автоматическое расширение отключено).
                  
           Допустимые значения: от `0` до `100`.
       
         * `disk_size_limit` — максимальный размер хранилища после увеличения, в байтах. 
       
         {% note warning %}
         
         * При использовании параметра `planned_usage_threshold` необходимо задать окно технического обслуживания в настройке `maintenance_window`.
               
         * Если заданы оба порога, значение `emergency_usage_threshold` должно быть не меньше `planned_usage_threshold`.
       
         {% endnote %}
       
         Подробнее об условиях для увеличения хранилища читайте в [соответствующем разделе](../concepts/storage.md#auto-rescale).

     * `database_specs` — настройки баз данных в виде массива элементов. Каждый элемент соответствует отдельной БД и имеет следующую структуру:

       * `name` — имя БД.
       * `owner` — имя владельца БД. Должно совпадать с именем одного из пользователей, указанных в запросе.

     * `user_specs` — настройки пользователей в виде массива элементов. Каждый элемент соответствует отдельному пользователю и имеет следующую структуру:

       * `name` — имя пользователя.
       * `password` — пароль пользователя. Длина пароля — от 8 до 128 символов.


       * `permissions.database_name` — имя базы данных, к которой пользователь получает доступ.
       * `login` — разрешение для пользователя на подключение к БД: `true` или `false`.

     * `host_specs` — настройки хостов кластера в виде массива элементов. Каждый элемент соответствует отдельному хосту и имеет следующую структуру:

       * `zone_id` — [зона доступности](../../overview/concepts/geo-scope.md);

       
       * `subnet_id` — идентификатор [подсети](../../vpc/concepts/network.md#subnet);
       * `assign_public_ip` — разрешение на [подключение](connect/index.md) к хосту из интернета.


     * `maintenance_window` — настройки времени [технического обслуживания](../concepts/maintenance.md) (в т. ч. для выключенных кластеров). Передайте один из двух параметров:

       * `anytime` — техническое обслуживание проводится в любое время.
       * `weekly_maintenance_window` — техническое обслуживание проводится раз в неделю в указанное время:

         * `day` — день недели: `MON`, `TUE`, `WED`, `THU`, `FRI`, `SAT` или `SUN`.
         * `hour` — час по UTC: от `1` до `24`.

           > Например, `1` соответствует интервалу с `00:00` до `01:00`, `5` — с `04:00` до `05:00`.

  1. Воспользуйтесь вызовом [ClusterService.Create](../api-ref/grpc/Cluster/create.md) и выполните запрос, например, с помощью [gRPCurl](https://github.com/fullstorydev/grpcurl):

     ```bash
     grpcurl \
       -format json \
       -import-path ~/cloudapi/ \
       -import-path ~/cloudapi/third_party/googleapis/ \
       -proto ~/cloudapi/yandex/cloud/mdb/postgresql/v1/cluster_service.proto \
       -rpc-header "Authorization: Bearer $IAM_TOKEN" \
       -d @ \
       mdb.api.yandexcloud.kz:443 \
       yandex.cloud.mdb.postgresql.v1.ClusterService.Create \
       < body.json
     ```

  1. Убедитесь, что запрос был выполнен успешно, изучив [ответ сервера](../api-ref/grpc/Cluster/create.md#yandex.cloud.mdb.postgresql.v1.Cluster).

{% endlist %}


{% note warning %}

Если вы указали идентификаторы групп безопасности при создании кластера, для подключения к нему может потребоваться дополнительная [настройка групп безопасности](connect/index.md#configuring-security-groups).

{% endnote %}


## Создать копию кластера {#duplicate}

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

Чтобы создать копию кластера PostgreSQL:

{% list tabs group=instructions %}

- Terraform {#tf}

    1. Если у вас еще нет Terraform, [установите его](../../tutorials/infrastructure-management/terraform-quickstart.md#install-terraform).
    1. [Получите данные для аутентификации](../../tutorials/infrastructure-management/terraform-quickstart.md#get-credentials). Вы можете добавить их в переменные окружения или указать далее в файле с настройками провайдера.
    1. [Настройте и инициализируйте провайдер](../../tutorials/infrastructure-management/terraform-quickstart.md#configure-provider). Чтобы не создавать конфигурационный файл с настройками провайдера вручную, [скачайте его](https://github.com/yandex-cloud-examples/yc-terraform-provider-settings/blob/main/provider.tf).
    1. Поместите конфигурационный файл в отдельную рабочую директорию и [укажите значения параметров](../../tutorials/infrastructure-management/terraform-quickstart.md#configure-provider). Если данные для аутентификации не были добавлены в переменные окружения, укажите их в конфигурационном файле.

    1. В той же рабочей директории разместите файл с расширением `.tf` и содержимым:

        ```hcl
        resource "yandex_mdb_postgresql_cluster" "old" { }
        ```

    1. Запишите идентификатор первоначального кластера PostgreSQL в переменную окружения:

        ```bash
        export POSTGRESQL_CLUSTER_ID=<идентификатор_кластера>
        ```

        Идентификатор можно запросить вместе со [списком кластеров в каталоге](cluster-list.md#list-clusters).

    1. Импортируйте настройки первоначального кластера PostgreSQL в конфигурацию Terraform:

        ```bash
        terraform import yandex_mdb_postgresql_cluster.old ${POSTGRESQL_CLUSTER_ID}
        ```

    1. Получите импортированную конфигурацию:

        ```bash
        terraform show
        ```

    1. Скопируйте ее из терминала и вставьте в файл с расширением `.tf`.
    1. Расположите файл в новой директории `imported-cluster`.
    1. Измените скопированную конфигурацию так, чтобы из нее можно было создать новый кластер:

        * Укажите новое имя кластера в строке `resource` и параметре `name`.
        * Удалите параметры `created_at`, `health`, `id` и `status`.
        * В блоках `host` удалите параметры `fqdn` и `role`.
        * Если в блоке `disk_size_autoscaling` указано значение параметра `disk_size_limit = 0`, удалите этот блок.
        * Если в блоке `maintenance_window` указано значение параметра `type = "ANYTIME"`, удалите параметр `hour`.
        * (Опционально) Внесите дополнительные изменения, если вам нужна не идентичная, а кастомизированная копия.

    1. В директории `imported-cluster` [получите данные для аутентификации](../../tutorials/infrastructure-management/terraform-quickstart.md#get-credentials).

    1. В этой же директории [настройте и инициализируйте провайдер](../../tutorials/infrastructure-management/terraform-quickstart.md#configure-provider). Чтобы не создавать конфигурационный файл с настройками провайдера вручную, [скачайте его](https://github.com/yandex-cloud-examples/yc-terraform-provider-settings/blob/main/provider.tf).

    1. Поместите конфигурационный файл в директорию `imported-cluster` и [укажите значения параметров](../../tutorials/infrastructure-management/terraform-quickstart.md#configure-provider). Если данные для аутентификации не были добавлены в переменные окружения, укажите их в конфигурационном файле.

    1. Проверьте корректность файлов конфигурации Terraform:

        ```bash
        terraform validate
        ```

        Если в файлах конфигурации есть ошибки, Terraform на них укажет.

    1. Создайте необходимую инфраструктуру:

        1. Выполните команду для просмотра планируемых изменений:
        
           ```bash
           terraform plan
           ```
        
           Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
        
        1. Если вас устраивают планируемые изменения, внесите их:
           1. Выполните команду:
        
              ```bash
              terraform apply
              ```
        
           1. Подтвердите изменение ресурсов.
           1. Дождитесь завершения операции.

        В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в [консоли управления](https://kz.console.yandex.cloud).

    {% note warning "Ограничения по времени" %}
    
    Провайдер Terraform ограничивает время на выполнение операций с кластером Managed Service for PostgreSQL:
    
    * создание, в том числе путем восстановления из резервной копии, — 30 минут;
    * изменение — 60 минут;
    * удаление — 15 минут.
    
    Операции, длящиеся дольше указанного времени, прерываются.
    
    {% cut "Как изменить эти ограничения?" %}
    
    Добавьте к описанию кластера блок `timeouts`, например:
    
    ```hcl
    resource "yandex_mdb_postgresql_cluster" "<имя_кластера>" {
      ...
      timeouts {
        create = "1h30m" # Полтора часа
        update = "2h"    # 2 часа
        delete = "30m"   # 30 минут
      }
    }
    ```
    
    {% endcut %}
    
    {% endnote %}

{% endlist %}

## Примеры {#examples}

### Создание кластера с одним хостом {#creating-a-single-host-cluster}

{% list tabs group=instructions %}

- CLI {#cli}

  Чтобы создать кластер с одним хостом, передайте один параметр `--host`.

  Создайте кластер Managed Service for PostgreSQL с тестовыми характеристиками:

  
  * С именем `mypg`.
  * В окружении `production`.
  * В сети `default`.
  * В группе безопасности `enp6saqnq4ie********`.
  * С одним хостом класса `s2.micro` в подсети `b0rcctk2rvtr********`, в зоне доступности `kz1-a`.
  * С хранилищем на сетевых SSD-дисках (`network-ssd`) размером 20 ГБ.
  * С одним пользователем (`user1`), с паролем `user1user1`.
  * С одной БД `db1`, принадлежащей пользователю `user1`.
  * С защитой от случайного удаления кластера, его баз данных и пользователей.


  Выполните следующую команду:

  
  ```bash
  yc managed-postgresql cluster create \
     --name mypg \
     --environment production \
     --network-name default \
     --resource-preset s2.micro \
     --host zone-id=kz1-a,subnet-id=b0rcctk2rvtr******** \
     --disk-type network-ssd \
     --disk-size 20 \
     --user name=user1,password=user1user1 \
     --database name=db1,owner=user1 \
     --security-group-ids enp6saqnq4ie******** \
     --deletion-protection
  ```


- Terraform {#tf}

  Создайте кластер Managed Service for PostgreSQL и сеть для него с тестовыми характеристиками:

  * С именем `mypg`.
  * Версии `18`.
  * В окружении `PRESTABLE`.
  * В облаке с идентификатором `b1gq90dgh25********`.
  * В каталоге с идентификатором `b1gia87mbaom********`.
  * В новой сети `mynet`.

  
  * В новой группе безопасности `pgsql-sg`, разрешающей подключение к кластеру из интернета через порт `6432`.


  * С одним хостом класса `s2.micro` в новой подсети `mysubnet`, в зоне доступности `kz1-a`. Подсеть `mysubnet` будет иметь диапазон `10.5.0.0/24`.
  * С хранилищем на сетевых SSD-дисках (`network-ssd`) размером 20 ГБ.
  * С одним пользователем (`user1`), с паролем `user1user1`.
  * С одной БД `db1`, принадлежащей пользователю `user1`.
  * С защитой от случайного удаления кластера, его баз данных и пользователей.

  Конфигурационный файл для такого кластера выглядит так:

  
  ```hcl
  resource "yandex_mdb_postgresql_cluster" "mypg" {
    name                = "mypg"
    environment         = "PRESTABLE"
    network_id          = yandex_vpc_network.mynet.id
    security_group_ids  = [ yandex_vpc_security_group.pgsql-sg.id ]
    deletion_protection = true

    config {
      version = 18
      resources {
        resource_preset_id = "s2.micro"
        disk_type_id       = "network-ssd"
        disk_size          = "20"
      }
    }

    host {
      zone      = "kz1-a"
      name      = "mypg-host-a"
      subnet_id = yandex_vpc_subnet.mysubnet.id
    }
  }

  resource "yandex_mdb_postgresql_database" "db1" {
    cluster_id = yandex_mdb_postgresql_cluster.mypg.id
    name       = "db1"
    owner      = "user1"
    depends_on = [
      yandex_mdb_postgresql_user.user1
    ]
  }

  resource "yandex_mdb_postgresql_user" "user1" {
    cluster_id = yandex_mdb_postgresql_cluster.mypg.id
    name       = "user1"
    password   = "user1user1"
  }

  resource "yandex_vpc_network" "mynet" {
    name = "mynet"
  }

  resource "yandex_vpc_subnet" "mysubnet" {
    name           = "mysubnet"
    zone           = "kz1-a"
    network_id     = yandex_vpc_network.mynet.id
    v4_cidr_blocks = ["10.5.0.0/24"]
  }

  resource "yandex_vpc_security_group" "pgsql-sg" {
    name       = "pgsql-sg"
    network_id = yandex_vpc_network.mynet.id

    ingress {
      description    = "PostgreSQL"
      port           = 6432
      protocol       = "TCP"
      v4_cidr_blocks = [ "0.0.0.0/0" ]
    }
  }
  ```


{% endlist %}