---
title: 'Добавить приложение в ML-платформу'
sidebar_label: 'Добавить приложение в ML-платформу'
sidebar_position: 3
description: 'Как добавить новое приложение в ML-платформу, на стартовую страницу и подключить авторизацию'
---

import Formbricks from '@theme/MDXComponents/Formbricks'
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
import {TabItemLabel} from '@selectel/docux/components'

# Добавить приложение в ML-платформу

В ML-платформе вы можете [добавлять дополнительные приложения](#add-new-app-to-ml-platform) с помощью kubectl, helm, kustomize.

Можно открывать приложение по URL вида `https://myapp-yourdomain.mlops.selcloud.ru` или [добавить приложение на стартовую страницу ML-платформы](#add-app-to-start-page).

Для приложений, которые будут доступны в интернете, нужно [настроить авторизацию](#configure-authorization-for-app).

## Добавить новое приложение в ML-платформу \{#add-new-app-to-ml-platform}

Чтобы добавить новое приложение в ML-платформу, нужно создать объект вида [Ingress](https://kubernetes.io/docs/concepts/services-networking/ingress/). Ingress Controller создавать не нужно — в ML-платформе в кластерах Managed Kubernetes предустановлен контроллер Traefik.

Получать TLS-сертификаты непосредственно в ML-платформе не нужно, так как сертификат установлен на обратном прокси-сервере (reverse proxy).

1. [Подключитесь к кластеру Managed Kubernetes](/managed-kubernetes/clusters/connect-to-cluster.mdx), который был создан при [подключении ML-платформы](/ml-platform/about-ml-platform.mdx#order-platform).
2. Создайте yaml-файл с манифестом для объекта Ingress.

   Пример манифеста:

   ```yaml
   apiVersion: networking.k8s.io/v1
   kind: Ingress
   metadata:
     name: myapp
     namespace: <ml_platform_namespace>
     annotations:
       traefik.ingress.kubernetes.io/router.tls: "true"
   spec:
     tls:
       - hosts:
           - "myapp-<ml_platform_domain>"
         secretName: myapp-<ml_platform_domain>-cert
     rules:
       - host: "myapp-<ml_platform_domain>"
         http:
           paths:
             - path: /
               pathType: Prefix
               backend:
                 service:
                   name: myapp
                   port:
                     number: 80
   ```

   Укажите:

   * `<ml_platform_namespace>` — пространство имен (Namespace) ML-платформы;
   * `<ml_platform_domain>` — URL вида `yourdomain.mlops.selcloud.ru`, который был выдан после подключения ML-платформы.
3. Создайте Ingress:

   ```bash
   kubectl apply -f <ingress.yaml>
   ```

   Укажите `<ingress.yaml>` — имя yaml-файла с манифестом для Ingress.
4. Откройте приложение по адресу:

   ```bash
   https://myapp-<ml_platform_domain>
   ```

   Укажите `<ml_platform_domain>` — URL вида `yourdomain.mlops.selcloud.ru`, который был выдан после подключения ML-платформы.
5. [Настройте авторизацию для приложения](#configure-authorization-for-app).
6. Опционально: [добавьте приложение на стартовую страницу](#add-app-to-start-page).

## Добавить приложение на стартовую страницу ML-платформы \{#add-app-to-start-page}

Стартовая страница ML-платформы работает с помощью инструмента [Forecastle](https://github.com/stakater/Forecastle). На странице можно посмотреть все приложения, которые по умолчанию запущены в кластере Managed Kubernetes.

Если вы [добавили новое приложение](#add-new-app-to-ml-platform) в ML-платформу, его так же можно разместить на стартовой странице.

1. [Подключитесь к кластеру Managed Kubernetes](/managed-kubernetes/clusters/connect-to-cluster.mdx), который был создан при [подключении ML-платформы](/ml-platform/about-ml-platform.mdx#order-platform).
2. Откройте yaml-файл с манифестом для Ingress приложения и добавьте в него аннотации:

   ```yaml
   apiVersion: networking.k8s.io/v1
   kind: Ingress
   metadata:
     name: myapp
     namespace: <ml_platform_namespace>
     annotations:
       traefik.ingress.kubernetes.io/router.tls: "true"
       forecastle.stakater.com/expose: "true"
       forecastle.stakater.com/appName: MyApp # Название приложения, которое будет показано на стартовой странице
       forecastle.stakater.com/group: MyAppsGroup # Группа на стартовой странице, в которую добавится приложение
       forecastle.stakater.com/icon: <app_icon_url>
   ```

   Укажите:

   * `<ml_platform_namespace>` — пространство имен (Namespace) ML-платформы;
   * `<app_icon_url>` — опционально: URL изображения для иконки приложения.
3. Примените изменения для Ingress:

   ```bash
   kubectl apply -f <ingress.yaml>
   ```

   Укажите `<ingress.yaml>` — имя yaml-файла с манифестом для Ingress.
4. Откройте стартовую страницу ML-платформы и проверьте, что приложение добавилось:

   ```bash
   https://myapp-<ml_platform_domain>
   ```

   Укажите `<ml_platform_domain>` — URL вида `yourdomain.mlops.selcloud.ru`, который был выдан после подключения ML-платформы.

## Настроить авторизацию для приложения \{#configure-authorization-for-app}

Если вы добавили приложение в ML-платформу, обязательно настройте авторизацию.

Настройка авторизации зависит от протоколов, которые поддерживает приложение:

* если приложение поддерживает авторизацию при помощи протоколов OIDC/OAuth2/SAML, создайте клиента Keycloak;
* если приложение не поддерживает протоколы OIDC/OAuth2/SAML или у приложения нет механизмов авторизации, используйте gogatekeeper — это sidecar для Keycloak.

<Tabs queryString="autorization-for-app">
  <TabItem value="OIDC" default>
    <TabItemLabel>
      Авторизация при помощи OIDC
    </TabItemLabel>

    Создайте клиента Keycloak и настройте для приложения авторизацию через Keycloak ML-платформы. Когда пользователь авторизуется в приложении, клиенту Keycloak отправится запрос. Если он его провалидирует, пользователь сможет зайти в приложение. Подробнее об использовании Keycloak в ML-платформе в инструкции [Управление пользователями в Keycloak](/ml-platform/manage/manage-users.mdx).

    1. [Подключитесь к кластеру Managed Kubernetes](/managed-kubernetes/clusters/connect-to-cluster.mdx), который был создан при [подключении ML-платформы](/ml-platform/about-ml-platform.mdx#order-platform).
    2. Создайте клиента Keycloak через панель управления Keycloak по адресу `https://keycloak-<ml_platform_domain>/admin/cmlp/console/` или создайте yaml-файл с манифестом для объекта KeycloakClient.

       Пример манифеста:

       ```yaml
       apiVersion: keycloak.org/v1alpha1
       kind: KeycloakClient
       metadata:
         name: myapp-client
         namespace: <ml_platform_namespace>
       spec:
         client:
           # Settings
           enabled: true
           clientId: "<appclient_name>"
           name: ""
           description: ''
           secret: "<password>"
           protocol: "openid-connect"
           redirectUris:
             - "https://<appclient_name>-.<ml_platform_namespace>/*" # URI, с которого будет происходить редирект в Keycloak
           rootUrl: "${authBaseUrl}"
           baseUrl: "/"
           publicClient: false
           bearerOnly: false
           serviceAccountsEnabled: false
           consentRequired: false
           directAccessGrantsEnabled: true
           implicitFlowEnabled: false
           frontchannelLogout: false
           standardFlowEnabled: true
           surrogateAuthRequired: false
           useTemplateConfig: true
           useTemplateMappers: true
           # Scopes
           useTemplateScope: true
           fullScopeAllowed: false
           defaultClientScopes:
             - "profile"
             - "email"
           # Roles
           protocolMappers:
           - config:
               access.token.claim: "true"
               id.token.claim: "false"
               included.custom.audience: <appclient_name>
             consentRequired: false
             name: Audience-forecastle-cmlp
             protocol: openid-connect
             protocolMapper: oidc-audience-mapper
         realmSelector:
           matchLabels:
             app.kubernetes.io/name: keycloak-realm-cmlp
             app.kubernetes.io/instance: keycloak-operator
       ```

       Укажите:

       * `<ml_platform_namespace>` — пространство имен (Namespace) ML-платформы;
       * `<appclient_name>` — уникальное имя клиента Keycloak;
       * `<password>` — пароль для клиента Keycloak. Потребуется для настройки приложения.
    3. Создайте клиента Keycloak:

       ```bash
       kubectl apply -f <keycloakclient.yaml>
       ```

       Укажите `<keycloakclient.yaml>` — имя yaml-файла с манифестом для создания клиента Keycloak.
    4. Проверьте, что клиент создан: откройте приложение Security Admin Console и перейдите в раздел **Configure** → **Clients**.
    5. Настройте приложение на авторизацию через созданного клиента Keycloak:

       * используйте python-библиотеку [python-keycloak](https://pypi.org/project/python-keycloak/);
       * или используйте Grafana и измените конфигурационный файл по [примеру](https://grafana.com/docs/grafana/latest/setup-grafana/configure-security/configure-authentication/generic-oauth/) из документации Grafana.
  </TabItem>

  <TabItem value="gogatekeeper">
    <TabItemLabel>
      Авторизация при помощи gogatekeeper
    </TabItemLabel>

    Gogatekeeper работает как прокси между контейнером с приложением и сервисом, запрашивает JWT (JSON Web Token) и проверяет его, чтобы выдать доступ к приложению.

    В качестве Injector в ML-платформе установлен [gogatekeeper-operator](https://github.com/theEndBeta/gogatekeeper-operator).

    1. [Подключитесь к кластеру Managed Kubernetes](/managed-kubernetes/clusters/connect-to-cluster.mdx), который был создан при [подключении ML-платформы](/ml-platform/about-ml-platform.mdx#order-platform).
    2. Создайте yaml-файл с манифестом для объекта Gogatekeeper в любом пространстве имен.

       Пример манифеста:

       ```yaml
       apiVersion: gatekeeper.theendbeta.me/v1alpha1
       kind: Gogatekeeper
       metadata:
         name: gatekeeper-for-myapp
         namespace: mynamespace
       spec:
         defaultconfig: |-
           upstream-url:          http://127.0.0.1:80 # Порт, на котором слушает контейнер myapp
           listen:                :3000 # Порт gogatekeeper, на который нужно будет переключить трафик
           listen-admin:          :4000
           enable-refresh-tokens: true
           secure-cookie:         false
         oidcurl: https://keycloak-<ml_platform_domain>/auth/realms/CMLP # Ссылка на реалм
       ```

       Укажите `<ml_platform_domain>` — URL вида `yourdomain.mlops.selcloud.ru`, который был выдан после подключения ML-платформы.
    3. Создайте Gogatekeeper:

       ```bash
       kubectl apply -f <gogatekeeper.yaml>
       ```

       Укажите `<gogatekeeper.yaml>` — имя yaml-файла с манифестом для создания Gogatekeeper.
    4. Откройте yaml-файл с манифестом для пода (Pod) и добавьте в него аннотации:

       ```yaml
       apiVersion: v1
       kind: Pod
       metadata:
         annotations:
           gatekeeper.gogatekeeper: gatekeeper-for-myapp
           gatekeeper.gogatekeeper/client-id: myapp # ID из KeycloakClient
           gatekeeper.gogatekeeper/client-secret: <password>
           gatekeeper.gogatekeeper/encryption-key: <another_password>
           gatekeeper.gogatekeeper/redirection-url: https://myapp-<ml_platform_domain>
           gatekeeper.gogatekeeper/upstream-url: http://127.0.0.1:80
       ```

       Укажите:

       * `<password>` — пароль для клиента Keycloak. Потребуется для настройки приложения;
       * `<another_password>` — другой произвольный пароль;
       * `<ml_platform_domain>` — URL вида `yourdomain.mlops.selcloud.ru`, который был выдан после подключения ML-платформы.
    5. Примените изменения в манифесте:

       ```bash
       kubectl apply -f <pod.yaml>
       ```

       Укажите `<pod.yaml>` — имя yaml-файла с манифестом для пода.

       gogatekeeper-operator добавит контейнер `gogatekeeper` в запущенный под `myapp`. В поде будет два контейнера: оригинальный контейнер `myapp` и sidecar-контейнер `gogatekeeper`.
    6. Измените порт в myapp с 80 (порт приложения) на 3000 (порт gogatekeeper).
    7. Проверьте, что gogatekeeper работает:

       ```bash
       https://myapp-<ml_platform_domain>
       ```

       Укажите `<ml_platform_domain>` — URL вида `yourdomain.mlops.selcloud.ru`, который был выдан после подключения ML-платформы.

       В режиме инкогнито появится окно ввода логина Keycloak.
  </TabItem>
</Tabs>

<Formbricks />
