[Документация Yandex Cloud](../../index.md) > [Yandex Cloud Marketplace](../index.md) > Партнерам > Практические руководства > Создание демонстрационного продукта Cloud Apps

# Создание демонстрационного продукта Cloud Apps

В этом руководстве вы создадите простой продукт Cloud Apps, состоящий из [кластера](../../managed-postgresql/concepts/index.md) Yandex Managed Service for PostgreSQL и [виртуальной машины](../../compute/concepts/vm.md) Yandex Compute Cloud с доступом к кластеру, установите _приложение_ (экземпляр продукта) и протестируете его работу.

## Перед началом работы {#before-you-begin}

1. [Загрузите](../../compute/operations/image-create/upload.md) образ диска в Yandex Compute Cloud. Для примера можно использовать [образ Ubuntu](https://ubuntu.com/download/desktop). Во время установки приложения Cloud Apps из этого образа будет автоматически создаваться виртуальная машина.

   {% note tip %}

   Для демонстрационного приложения вы можете [создать ВМ из публичного образа Cloud Marketplace](../../compute/operations/images-with-pre-installed-software/create.md), например [Ubuntu 22.04 LTS](https://yandex.cloud/ru-kz/marketplace/products/yc/ubuntu-22-04-lts), и [создать образ из диска](../../compute/operations/image-create/create-from-disk.md) этой ВМ. Смотрите также [Начало работы с Packer](../../tutorials/infrastructure-management/packer-quickstart.md).

   {% endnote %}

1. Заполните анкету на [странице Yandex Cloud Marketplace](https://yandex.cloud/ru-kz/marketplace).
1. [Зарегистрируйте](../operations/registration.md) аккаунт.
1. [Создайте](../operations/create-product.md) продукт типа **Cloud Apps**.

## Создайте конфигурацию {#create-configuration}

1. Перейдите в продукт, для которого хотите создать конфигурацию.
1. Перейдите на вкладку **Конфигурации**.
1. Нажмите ![image](../../_assets/console-icons/plus.svg) **Создать конфигурацию**.
1. На вкладке **С нуля**:
    1. Укажите:
        * каталог, в который сохранится конфигурация. У вас должна быть роль `cloudapps.editor` на этот каталог.
        * имя конфигурации, например `demo`.
    1. Нажмите кнопку **Создать**. На вкладке **Конфигурации** появится конфигурация `demo` в статусе `Черновик`.

## Настройте конфигурацию {#configure}

### Добавьте артефакт {#artifact}

1. Выберите конфигурацию `demo`.
1. На вкладке **Выбор артефактов** нажмите **Добавить артефакт**.
1. Выберите **Тип артефакта** — `Образ диска`.
1. Укажите **Название**, например `ubuntu`.
1. Выберите образ диска, созданный на шаге [Перед началом работы](#before-you-begin).
1. Нажмите **Добавить**.

### Создайте форму {#form}

1. Перейдите на вкладку **Параметры запуска**.
1. Нажимая кнопку ![image](../../_assets/console-icons/plus.svg) **Добавить поле**, последовательно добавьте следующие поля:

    * Поле **Имя пользователя БД**:<br>

        Параметр | Значение | Описание
        --- | --- | ---
        Тип переменной | `Строка` |
        Вид поля | `Base` | Простая строка.
        Имя переменной | `pg_username` | Имя переменной можно использовать при создании ресурсов для того, чтобы получить значение, введенное пользователем в поле.
        Обязательное поле | Выбрано | Поле обязательно для заполнения.
        Паттерн | `^[a-z][a-z0-9]*$` | Регулярное выражение, которому должно соответствовать имя пользователя БД.
        Ошибка паттерна | `Wrong name` | Текст ошибки, которую увидит пользователь, если введенное имя пользователя БД не будет соответствовать указанному паттерну.
        Заголовок поля (RU) | `Имя пользователя БД` | Имя поля, которое увидит пользователь в русскоязычном интерфейсе.
        Заголовок поля (EN) | `DB username` | Имя поля, которое увидит пользователь в англоязычном интерфейсе.

    * Поле **Секрет с паролем пользователя БД**:<br>

        Параметр | Значение | Описание
        --- | --- | ---
        Тип переменной | `Строка` |
        Вид поля | `Lockbox Secret` | [Секрет](../../lockbox/concepts/secret.md) Yandex Lockbox, в котором хранится пароль пользователя БД.
        Имя переменной | `pg_password_secret` | Имя переменной можно использовать при создании ресурсов для того, чтобы получить значение, введенное пользователем в поле.
        Обязательное поле | Выбрано | Поле обязательно для заполнения.
        Заголовок поля (RU) | `Секрет с паролем пользователя БД` | Имя поля, которое увидит пользователь в русскоязычном интерфейсе.
        Заголовок поля (EN) | `Secret with DB user password` | Имя поля, которое увидит пользователь в англоязычном интерфейсе.

    * Поле **Облачная сеть**:<br>

        Параметр | Значение | Описание
        --- | --- | ---
        Тип переменной | `Строка` |
        Вид поля | `VPC network` | [Облачная сеть](../../vpc/concepts/network.md#network) Yandex Virtual Private Cloud, в которой будет развернуто приложение Cloud Apps.
        Имя переменной | `vpc_network` | Имя переменной можно использовать при создании ресурсов для того, чтобы получить значение, введенное пользователем в поле.
        Обязательное поле | Выбрано | Поле обязательно для заполнения.
        Заголовок поля (RU) | `Облачная сеть` | Имя поля, которое увидит пользователь в русскоязычном интерфейсе.
        Заголовок поля (EN) | `Cloud network` | Имя поля, которое увидит пользователь в англоязычном интерфейсе.

    * Поле **Подсеть 1**:<br>

        Параметр | Значение | Описание
        --- | --- | ---
        Тип переменной | `Строка` |
        Вид поля | `VPC subnet` | [Подсеть](../../vpc/concepts/network.md#subnet) Yandex Virtual Private Cloud.
        Имя переменной | `vpc_subnet_0` | Имя переменной можно использовать при создании ресурсов для того, чтобы получить значение, введенное пользователем в поле.
        Обязательное поле | Выбрано | Поле обязательно для заполнения.
        Заголовок поля (RU) | `Подсеть 1` | Имя поля, которое увидит пользователь в русскоязычном интерфейсе.
        Заголовок поля (EN) | `Subnet 1` | Имя поля, которое увидит пользователь в англоязычном интерфейсе.

    * Поле **Подсеть 2**:<br>

        Параметр | Значение | Описание
        --- | --- | ---
        Тип переменной | `Строка` |
        Вид поля | `VPC subnet` | [Подсеть](../../vpc/concepts/network.md#subnet) Yandex Virtual Private Cloud.
        Имя переменной | `vpc_subnet_1` | Имя переменной можно использовать при создании ресурсов для того, чтобы получить значение, введенное пользователем в поле.
        Обязательное поле | Выбрано | Поле обязательно для заполнения.
        Заголовок поля (RU) | `Подсеть 2` | Имя поля, которое увидит пользователь в русскоязычном интерфейсе.
        Заголовок поля (EN) | `Subnet 2` | Имя поля, которое увидит пользователь в англоязычном интерфейсе.

### Добавьте ресурсы {#resources}

1. Перейдите на вкладку **Ресурсы**.
1. Нажимая кнопку ![image](../../_assets/console-icons/plus.svg) **Добавить ресурс**, последовательно добавьте следующие ресурсы:

    {% note info %}

    _Ресурсы пользователя_ — это ресурсы, которые пользователь создает самостоятельно перед установкой приложения.
    
    _Новые ресурсы_ — это ресурсы, которые автоматически создаются в каталоге пользователя при установке приложения.

    {% endnote %}

    * `Ресурс пользователя` → `VPC облачная сеть`:<br>

        Параметр | Значение | Описание
        --- | --- | ---
        Имя | `vpc-network` | Чтобы изменить имя, нажмите ![image](../../_assets/console-icons/pencil.svg) рядом с именем облачной сети, которое было сгенерировано автоматически. Имя ресурса должно быть уникальным в рамках конфигурации. Пользователь увидит его при установке приложения.
        Network id | `Поле ввода` → `vpc_network` | Идентификатор облачной сети будет получен из поля **Облачная сеть**, пользователь укажет облачную сеть при заполнении формы.

    * `Ресурс пользователя` → `VPC подсеть`:

        **Подсеть 1**

        Параметр | Значение | Описание
        --- | --- | ---
        Имя | `vpc-subnet-0` | Чтобы изменить имя, нажмите ![image](../../_assets/console-icons/pencil.svg) рядом с именем подсети, которое было сгенерировано автоматически. Имя ресурса должно быть уникальным в рамках конфигурации. Пользователь увидит его при установке приложения.
        Subnet id | `Поле ввода` → `vpc_subnet_0` | Идентификатор подсети будет получен из поля **Подсеть 1**, пользователь укажет подсеть при заполнении формы.

        **Подсеть 2**

        Параметр | Значение | Описание
        --- | --- | ---
        Имя | `vpc-subnet-1` | Чтобы изменить имя, нажмите ![image](../../_assets/console-icons/pencil.svg) рядом с именем подсети, которое было сгенерировано автоматически. Имя ресурса должно быть уникальным в рамках конфигурации. Пользователь увидит его при установке приложения.
        Subnet id | `Поле ввода` → `vpc_subnet_1` | Идентификатор облачной сети будет получен из поля **Подсеть 2**, пользователь укажет подсеть при заполнении формы.

    * `Ресурс пользователя` → `Версия секрета Lockbox`:<br>

        Параметр | Значение | Описание
        --- | --- | ---
        Имя | `lockbox-secret-with-db-password` | Чтобы изменить имя, нажмите ![image](../../_assets/console-icons/pencil.svg) рядом с именем версии секрета Yandex Lockbox, которое было сгенерировано автоматически. Имя ресурса должно быть уникальным в рамках конфигурации. Пользователь увидит его при установке приложения.
        Secret id | `Поле ввода` → `pg_password_secret` | Идентификатор секрета Lockbox будет получен из поля **Секрет с паролем пользователя БД**, пользователь укажет секрет при заполнении формы.

    * `Новый ресурс` → `Сервисный аккаунт`:<br>

        Параметр | Значение | Описание
        --- | --- | ---
        Имя | `service-account` | Чтобы изменить имя, нажмите ![image](../../_assets/console-icons/pencil.svg) рядом с именем сервисного аккаунта, которое было сгенерировано автоматически. Имя ресурса должно быть уникальным в рамках конфигурации. Пользователь увидит его при установке приложения.
        Folder id | `Атрибут приложения` → `ID каталога` | Сервисный аккаунт, от имени которого будет развертываться приложение, автоматически создастся в том же каталоге, в котором пользователь будет устанавливать приложение.
        Name | `Значение` → `my-best-app` | Имя автоматически созданного сервисного аккаунта будет `my-best-app`.

    * `Новый ресурс` → `Пользователь каталога`:<br>

        Параметр | Значение | Описание
        --- | --- | ---
        Имя | `lockbox-payload-viewer` | Чтобы изменить имя, нажмите ![image](../../_assets/console-icons/pencil.svg) рядом с именем пользователя каталога, которое было сгенерировано автоматически. Имя ресурса должно быть уникальным в рамках конфигурации. Пользователь увидит его при установке приложения.
        Folder id | `Атрибут приложения` → `ID каталога` | Указанные роли будут назначены сервисному аккаунту на каталог, в котором пользователь будет устанавливать приложение.
        Member | `Значение` → `Сервисный аккаунт` → `Референс` → `service-account` → `id` | Указанные роли будут назначены сервисному аккаунту `my-best-app`.
        Role |  `Значение` → `lockbox.payloadViewer` | Сервисному аккаунту будет назначена роль [lockbox.payloadViewer](../../lockbox/security/index.md#lockbox-payloadViewer). Она нужна ему для доступа к секрету Lockbox, в котором хранится пароль пользователя БД.

    * `Новый ресурс` → `Кластер PostgreSQL`:<br>

        Параметр | Значение | Описание
        --- | --- | ---
        Имя | `postgres-cluster` | Чтобы изменить имя, нажмите ![image](../../_assets/console-icons/pencil.svg) рядом с именем [кластера](../../managed-postgresql/concepts/index.md) Yandex Managed Service for PostgreSQL, которое было сгенерировано автоматически. Имя ресурса должно быть уникальным в рамках конфигурации. Пользователь увидит его при установке приложения.
        Environment | `Значение` → `PRODUCTION` | Окружение, в котором нужно создать кластер. PRODUCTION-окружение используется для стабильных версий приложений.
        Folder id | `Атрибут приложения` → `ID каталога` | Кластер автоматически создастся в том же каталоге, в котором пользователь будет устанавливать приложение.
        Name |  `Значение` → `my-best-app-pg-cluster` | Имя созданного кластера будет `my-best-app-pg-cluster`.
        Network id | `Ресурс` → `vpc-network` | Кластер автоматически создастся в облачной сети `vpc-network`.
        Config | `Значение` → `Ключ: Version` → `Значение` → `16` | Версия СУБД.
        Config | `Значение` → `Ключ: Resources` → `Значение` → `Ключ: Disk size` → `Значение` → `10` | Размер диска.
        Config | `Значение` → `Ключ: Resources` → `Значение` → `Ключ: Disk type id` → `Значение` → `network-ssd` | [Тип](../../managed-postgresql/concepts/storage.md) диска.
        Config | `Значение` → `Ключ: Resources` → `Значение` → `Ключ: Resource preset id` → `Значение` → `c3-c2-m4` | [Класс](../../managed-postgresql/concepts/instance-types.md) хоста.
        Host | `Значение` → `Элемент 1` → `Значение` → `Ключ: Subnet id` → `Ресурс` → `vpc-subnet-0` | Кластер будет состоять из двух хостов. Первый хост будет расположен в подсети `vpc-subnet-0`.
        Host | `Значение` → `Элемент 1` → `Значение` → `Ключ: Zone` → `Референс` → `vpc-subnet-0` → `zone` | Первый хост будет расположен в той же [зоне доступности](../../overview/concepts/geo-scope.md), что и подсеть `vpc-subnet-0`.
        Host | `Значение` → `Элемент 2` → `Значение` → `Ключ: Subnet id` → `Ресурс` → `vpc-subnet-1` | Кластер будет состоять из двух хостов. Второй хост будет расположен в подсети `vpc-subnet-1`.
        Host | `Значение` → `Элемент 2` → `Значение` → `Ключ: Zone` → `Референс` → `vpc-subnet-1` → `zone` | Второй хост будет расположен в той же [зоне доступности](../../overview/concepts/geo-scope.md), что и подсеть `vpc-subnet-1`.

    * `Новый ресурс` → `Пользователь PostgreSQL`:<br>

        Параметр | Значение | Описание
        --- | --- | ---
        Имя | `postgresql-user` | Чтобы изменить имя, нажмите ![image](../../_assets/console-icons/pencil.svg) рядом с именем пользователя PostgreSQL, которое было сгенерировано автоматически. Имя ресурса должно быть уникальным в рамках конфигурации. Пользователь увидит его при установке приложения.
        Cluster id | `Ресурс` → `postgres-cluster` | Кластер, к которому пользователь `pg_username` будет иметь доступ.
        Name | `Поле ввода` → `pg_username` | Имя пользователя будет получено из поля **Имя пользователя БД**, пользователь укажет его при заполнении формы.
        Password |  `Референс` → `lockbox-secret-with-db-password` → `entries[0].text_value` | Для доступа к кластеру пользователь `pg_username` будет использовать пароль, полученный из секрета Lockbox `lockbox-secret-with-db-password`.

    * `Новый ресурс` → `База данных PostgreSQL`:<br>

        Параметр | Значение | Описание
        --- | --- | ---
        Имя | `postgresql-db` | Чтобы изменить имя, нажмите ![image](../../_assets/console-icons/pencil.svg) рядом с именем базы данных PostgreSQL, которое было сгенерировано автоматически. Имя ресурса должно быть уникальным в рамках конфигурации. Пользователь увидит его при установке приложения.
        Cluster id | `Ресурс` → `postgres-cluster` | Кластер, в котором автоматически создастся база данных `pg_username`.
        Name | `Поле ввода` → `pg_username` | Имя базы данных будет получено из поля **Имя пользователя БД**, пользователь укажет его при заполнении формы. Имя пользователя БД и имя БД в демонстрационном примере совпадают.
        Owner |  `Референс` → `postgresql-user` → `name` | Имя владельца базы данных будет именем пользователя PostgreSQL `postgresql-user`.

    * `Новый ресурс` → `Виртуальная машина`:<br>

        Параметр | Значение | Описание
        --- | --- | ---
        Имя | `instance` | Чтобы изменить имя, нажмите ![image](../../_assets/console-icons/pencil.svg) рядом с именем виртуальной машины, которое было сгенерировано автоматически. Имя ресурса должно быть уникальным в рамках конфигурации. Пользователь увидит его при установке приложения.
        Folder id | `Атрибут приложения` → `ID каталога` | [Виртуальная машина](../../compute/concepts/vm.md) Compute Cloud автоматически создастся в том же каталоге, в котором пользователь будет устанавливать приложение.
        Boot disk | `Значение` → `Ключ: Initialize params` → `Значение` → `Ключ: Image id` → `Значение` → `ubuntu` | Образ диска, из которого будет создана ВМ. Вы добавили его на шаге [Добавьте артефакт](#artifact).
        Boot disk | `Значение` → `Ключ: Initialize params` → `Значение` → `Ключ: Size` → `Значение` → `32` | Размер диска. 
        Boot disk | `Значение` → `Ключ: Initialize params` → `Значение` → `Ключ: Type` → `Значение` → `network-ssd` | [Тип](../../compute/concepts/disk.md#disks-types) диска.
        Network interface | `Значение` → `Элемент 1` → `Значение` → `Ключ: Subnet id` → `Ресурс` → `vpc-subnet-0` | Виртуальная машина будет расположена в подсети `vpc-subnet-0`.
        Resources | `Значение` → `Ключ: Cores` → `Значение` → `2` | Количество vCPU.
        Resources | `Значение` → `Ключ: Memory` → `Значение` → `8` | Объем RAM.
        Metadata | `Значение` → `Элемент 1` → `Ключ: pg-host-0` → `Референс` → `postgres-cluster` → `host[0].fqdn` | Параметры подключения из ВМ к БД. Первый хост кластера.
        Metadata | `Значение` → `Элемент 2` → `Ключ: pg-host-1` → `Референс` → `postgres-cluster` → `host[1].fqdn` | Параметры подключения из ВМ к БД. Второй хост кластера.
        Metadata | `Значение` → `Элемент 3` → `Ключ: pg-username` → `Референс` → `postgres-user` → `name` | Параметры подключения из ВМ к БД. Имя пользователя БД.
        Metadata | `Значение` → `Элемент 4` → `Ключ: pg-password-lockbox-secret-id` → `Поле ввода` → `postgres_password_secret` | Параметры подключения из ВМ к БД. Пароль пользователя БД.
        Platform id | `Значение` → `standard-v3` | [Платформа](../../compute/concepts/vm-platforms.md), на которой будет работать ВМ.
        Service account id | `Ресурс` → `service-account` | Сервисный аккаунт, у которого есть права на чтение секрета Lockbox, в котором хранится пароль пользователя БД.
        Zone | `Референс` → `vpc-subnet-0` → `zone` | ВМ будет расположена в той же [зоне доступности](../../overview/concepts/geo-scope.md), что и подсеть `vpc-subnet-0`.
        Зависит от | `lockbox-payload-viewer` | ВМ будет создана после ресурса `lockbox-payload-viewer`.

1. Нажмите **Сохранить**, чтобы сохранить конфигурацию.

## Установите приложение {#install}

1. В правом верхнем углу нажмите **Запустить**.
1. Заполните форму.
1. Нажмите **Установить**.
1. Дождитесь, когда сервис проверит, какие ресурсы будут созданы, и нажмите **Подтвердить**.
1. В списке приложений появится приложение `demo-app` в статусе `Deploying`. Дождитесь, когда статус изменится на `Deployed`. Это может занять несколько минут.
1. Убедитесь, что все ресурсы созданы. [Подключитесь](../../compute/operations/vm-connect/ssh.md) к ВМ и [проверьте](../../managed-postgresql/operations/connect/index.md), что с нее есть доступ к кластеру Yandex Managed Service for PostgreSQL.