# Самостоятельная установка {#self-host-installation}

Мы предлагаем версию сервера Tuist с возможностью самостоятельного размещения
для организаций, которым требуется больший контроль над своей инфраструктурой.
Эта версия позволяет размещать Tuist на собственной инфраструктуре, обеспечивая
безопасность и конфиденциальность данных.

> [!WARNING]
> **License Required**
>
> Для самостоятельного размещения Tuist требуется действующая платная лицензия.
> Местная версия Tuist доступна только для организаций на тарифном плане
> Enterprise. Если вы заинтересованы в этой версии, пожалуйста, свяжитесь с нами
> по адресу [contact@tuist.dev](mailto:contact@tuist.dev).


## Каденция выпуска {#release-cadence}

Мы выпускаем новые версии Tuist постоянно, по мере того как новые изменения,
которые можно выпустить, появляются на главной. Мы следуем [семантическому
версионированию](https://semver.org/), чтобы обеспечить предсказуемое
версионирование и совместимость.

Основной компонент используется для того, чтобы отмечать изменения в сервере
Tuist, которые потребуют согласования с локальными пользователями. Не стоит
ожидать, что мы будем его использовать, а если вдруг понадобится, будьте
уверены, мы будем работать с вами, чтобы сделать переход плавным.

## Непрерывное развертывание {#continuous-deployment}

Мы настоятельно рекомендуем настроить конвейер непрерывного развертывания,
который будет автоматически развертывать последнюю версию Tuist каждый день. Это
гарантирует, что вы всегда будете иметь доступ к последним функциям, улучшениям
и обновлениям безопасности.

Вот пример рабочего процесса GitHub Actions, который ежедневно проверяет наличие
и развертывает новые версии:

```yaml
name: Update Tuist Server
on:
  schedule:
    - cron: '0 3 * * *' # Run daily at 3 AM UTC
  workflow_dispatch: # Allow manual runs

jobs:
  update:
    runs-on: ubuntu-latest
    steps:
      - name: Check and deploy latest version
        run: |
          # Your deployment commands here
          # Example: docker pull ghcr.io/tuist/tuist:latest
          # Deploy to your infrastructure
```

## Требования к времени выполнения {#runtime-requirements}

В этом разделе описаны требования к размещению сервера Tuist на вашей
инфраструктуре.

### Матрица совместимости {#compatibility-matrix}

Сервер Tuist протестирован и совместим со следующими минимальными версиями:

| Компонент   | Минимальная версия | Примечания                                     |
| ----------- | ------------------ | ---------------------------------------------- |
| PostgreSQL  | 15                 | С расширением TimescaleDB                      |
| TimescaleDB | 2.16.1             | Необходимое расширение PostgreSQL (устаревшее) |
| ClickHouse  | 25                 | Требуется для аналитики                        |

> [!WARNING]
> **Timescaledb Deprecation**
>
> TimescaleDB в настоящее время является необходимым расширением PostgreSQL для
> сервера Tuist, используемым для хранения и запроса данных временных рядов.
> Однако **TimescaleDB устарел** и будет исключен из числа необходимых
> зависимостей в ближайшем будущем, когда мы перенесем всю функциональность
> временных рядов на ClickHouse. Пока же убедитесь, что на вашем экземпляре
> PostgreSQL установлена и включена TimescaleDB.


### Запуск виртуализированных образов Docker {#running-dockervirtualized-images}

Мы распространяем сервер в виде образа [Docker](https://www.docker.com/) через
[GitHub's Container
Registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry).

Чтобы запустить его, ваша инфраструктура должна поддерживать запуск образов
Docker. Обратите внимание, что большинство поставщиков инфраструктуры
поддерживают его, поскольку он стал стандартным контейнером для распространения
и запуска программного обеспечения в производственных средах.

### База данных Postgres {#postgres-database}

Помимо запуска образов Docker, вам понадобится база данных
[Postgres](https://www.postgresql.org/) с расширением
[TimescaleDB](https://www.timescale.com/) для хранения реляционных данных и
временных рядов. Большинство поставщиков инфраструктуры включают базы данных
Postgres в свои предложения (например,
[AWS](https://aws.amazon.com/rds/postgresql/) и [Google
Cloud](https://cloud.google.com/sql/docs/postgres)).

**Требуется расширение TimescaleDB:** Tuist требует расширения TimescaleDB для
эффективного хранения и запроса данных временных рядов. Это расширение
используется для командных событий, аналитики и других функций, основанных на
времени. Перед запуском Tuist убедитесь, что на вашем экземпляре PostgreSQL
установлено и включено расширение TimescaleDB.

> [!NOTE]
> **Migrations**
>
> Точка входа образа Docker автоматически запускает все ожидающие миграции схемы
> перед запуском службы. Если миграция не удалась из-за отсутствия расширения
> TimescaleDB, вам нужно будет сначала установить его в свою базу данных.


### База данных ClickHouse {#clickhouse-database}

Tuist использует [ClickHouse](https://clickhouse.com/) для хранения и запроса
больших объемов аналитических данных. ClickHouse - это **, необходимый** для
таких функций, как build insights, и он станет основной базой данных временных
рядов, когда мы откажемся от TimescaleDB. Вы можете выбрать, размещать
ClickHouse самостоятельно или использовать их хостинговый сервис.

> [!NOTE]
> **Migrations**
>
> Точка входа образа Docker автоматически запускает все предстоящие миграции схемы
> ClickHouse перед запуском службы.


### Хранение {#storage}

Вам также понадобится решение для хранения файлов (например, двоичных файлов
фреймворков и библиотек). В настоящее время мы поддерживаем любое хранилище,
совместимое с S3.

## Конфигурация {#configuration}

Конфигурация службы выполняется во время выполнения с помощью переменных
окружения. Учитывая конфиденциальный характер этих переменных, мы рекомендуем
шифровать и хранить их в надежных решениях для управления паролями. Будьте
уверены, Tuist работает с этими переменными очень осторожно, гарантируя, что они
никогда не будут отображаться в логах.

> [!NOTE]
> **Launch Checks**
>
> При запуске проверяются все необходимые переменные. Если какие-либо из них
> отсутствуют, запуск завершится неудачей, а в сообщении об ошибке будут подробно
> указаны отсутствующие переменные.


### Конфигурация лицензии {#license-configuration}

Как пользователь локального сервиса, вы получите лицензионный ключ, который
нужно будет указать в качестве переменной окружения. Этот ключ используется для
проверки лицензии и обеспечения работы службы в соответствии с условиями
соглашения.

| Переменная среды                   | Описание                                                                                                                                                                                                                                                                                       | Требуется | По умолчанию | Пример                                    |
| ---------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- | ------------ | ----------------------------------------- |
| `TUIST_LICENSE`                    | Лицензия, предоставляемая после подписания соглашения об уровне обслуживания                                                                                                                                                                                                                   | Да*       |              | `******`                                  |
| `TUIST_LICENSE_CERTIFICATE_BASE64` | **Исключительная альтернатива `TUIST_LICENSE`**. Публичный сертификат в кодировке Base64 для автономной проверки лицензии в средах с воздушной завесой, где сервер не может связаться с внешними службами. Используется только в тех случаях, когда `TUIST_LICENSE` не может быть использован. | Да*       |              | `LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0t...` |

\* Должны быть указаны либо `TUIST_LICENSE`, либо
`TUIST_LICENSE_CERTIFICATE_BASE64`, но не оба. Используйте `TUIST_LICENSE` для
стандартных развертываний.

> [!WARNING]
> **Expiration Date**
>
> Лицензии имеют срок действия. Пользователи получат предупреждение при
> использовании команд Tuist, взаимодействующих с сервером, если срок действия
> лицензии истекает менее чем через 30 дней. Если вы заинтересованы в продлении
> лицензии, пожалуйста, свяжитесь с [contact@tuist.dev](mailto:contact@tuist.dev).


### Конфигурация базовой среды {#base-environment-configuration}

| Переменная среды                      | Описание                                                                                                                                                                                                                                                      | Требуется | По умолчанию                       | Пример                                                                       |                                                                                                                                    |
| ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- | ---------------------------------- | ---------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| `TUIST_APP_URL`                       | Базовый URL-адрес для доступа к экземпляру из Интернета                                                                                                                                                                                                       | Да        |                                    | https://tuist.dev                                                            |                                                                                                                                    |
| `TUIST_SECRET_KEY_BASE`               | Ключ, используемый для шифрования информации (например, сеансов в файле cookie).                                                                                                                                                                              | Да        |                                    |                                                                              | `c5786d9f869239cbddeca645575349a570ffebb332b64400c37256e1c9cb7ec831345d03dc0188edd129d09580d8cbf3ceaf17768e2048c037d9c31da5dcacfa` |
| `TUIST_SECRET_KEY_PASSWORD`           | Перец для генерации хэшированных паролей                                                                                                                                                                                                                      | Нет       | `$TUIST_SECRET_KEY_BASE`           |                                                                              |                                                                                                                                    |
| `TUIST_SECRET_KEY_TOKENS`             | Секретный ключ для генерации случайных жетонов                                                                                                                                                                                                                | Нет       | `$TUIST_SECRET_KEY_BASE`           |                                                                              |                                                                                                                                    |
| `TUIST_SECRET_KEY_ENCRYPTION`         | 32-байтный ключ для шифрования конфиденциальных данных по алгоритму AES-GCM                                                                                                                                                                                   | Нет       | `$TUIST_SECRET_KEY_BASE`           |                                                                              |                                                                                                                                    |
| `TUIST_USE_IPV6`                      | Когда `1`, он настраивает приложение на использование IPv6-адресов.                                                                                                                                                                                           | Нет       | `0`                                | `1`                                                                          |                                                                                                                                    |
| `TUIST_LOG_LEVEL`                     | Уровень журнала, который будет использоваться для приложения                                                                                                                                                                                                  | Нет       | `информация`                       | [Уровни журнала](https://hexdocs.pm/logger/1.12.3/Logger.html#module-levels) |                                                                                                                                    |
| `TUIST_GITHUB_APP_NAME`               | URL-версия имени вашего приложения на GitHub                                                                                                                                                                                                                  | Нет       |                                    | `my-app`                                                                     |                                                                                                                                    |
| `TUIST_GITHUB_APP_PRIVATE_KEY_BASE64` | Закрытый ключ в кодировке base64, используемый в приложении GitHub для разблокировки дополнительных функций, таких как автоматическая публикация комментариев к PR.                                                                                           | Нет       | `LS0tLS1CRUdJTiBSU0EgUFJJVkFUR...` |                                                                              |                                                                                                                                    |
| `TUIST_GITHUB_APP_PRIVATE_KEY`        | Закрытый ключ, используемый в приложении GitHub для разблокировки дополнительных функций, таких как автоматическая публикация комментариев к PR. **Мы рекомендуем использовать base64-кодированную версию, чтобы избежать проблем со специальными символами** | Нет       | `-----BEGIN RSA...`                |                                                                              |                                                                                                                                    |
| `TUIST_OPS_USER_HANDLES`              | Список дескрипторов пользователей, имеющих доступ к URL-адресам операций, разделенный запятыми                                                                                                                                                                | Нет       |                                    | `пользователь1,пользователь2`                                                |                                                                                                                                    |
| `TUIST_WEB`                           | Включите конечную точку веб-сервера                                                                                                                                                                                                                           | Нет       | `1`                                | `1` или `0`                                                                  |                                                                                                                                    |

### Конфигурация базы данных {#database-configuration}

Для настройки подключения к базе данных используются следующие переменные
окружения:

| Переменная среды                     | Описание                                                                                                                                                                                                                                                | Требуется | По умолчанию | Пример                                                                 |
| ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- | ------------ | ---------------------------------------------------------------------- |
| `DATABASE_URL`                       | URL-адрес для доступа к базе данных Postgres. Обратите внимание, что URL должен содержать информацию об аутентификации                                                                                                                                  | Да        |              | `postgres://username:password@cloud.us-east-2.aws.test.com/production` |
| `TUIST_CLICKHOUSE_URL`               | URL-адрес для доступа к базе данных ClickHouse. Обратите внимание, что URL должен содержать информацию об аутентификации                                                                                                                                | Нет       |              | `http://username:password@cloud.us-east-2.aws.test.com/production`     |
| `TUIST_USE_SSL_FOR_DATABASE`         | Если значение равно true, то для подключения к базе данных используется [SSL](https://en.wikipedia.org/wiki/Transport_Layer_Security).                                                                                                                  | Нет       | `1`          | `1`                                                                    |
| `TUIST_DATABASE_POOL_SIZE`           | Количество соединений, которые необходимо держать открытыми в пуле соединений                                                                                                                                                                           | Нет       | `10`         | `10`                                                                   |
| `TUIST_DATABASE_QUEUE_TARGET`        | Интервал (в милисекундах) для проверки того, что все соединения, извлеченные из пула, заняли больше интервала очереди [(Дополнительная информация)](https://hexdocs.pm/db_connection/DBConnection.html#start_link/2-queue-config)                       | Нет       | `300`        | `300`                                                                  |
| `TUIST_DATABASE_QUEUE_INTERVAL`      | Пороговое время (в милисекундах) в очереди, которое пул использует для определения того, следует ли ему начать отбрасывать новые соединения [(Дополнительная информация)](https://hexdocs.pm/db_connection/DBConnection.html#start_link/2-queue-config) | Нет       | `1000`       | `1000`                                                                 |
| `TUIST_CLICKHOUSE_FLUSH_INTERVAL_MS` | Интервал времени в миллисекундах между очистками буфера ClickHouse                                                                                                                                                                                      | Нет       | `5000`       | `5000`                                                                 |
| `TUIST_CLICKHOUSE_MAX_BUFFER_SIZE`   | Максимальный размер буфера ClickHouse в байтах перед принудительной очисткой                                                                                                                                                                            | Нет       | `1000000`    | `1000000`                                                              |
| `TUIST_CLICKHOUSE_BUFFER_POOL_SIZE`  | Количество запускаемых буферных процессов ClickHouse                                                                                                                                                                                                    | Нет       | `5`          | `5`                                                                    |

### Настройка среды аутентификации {#authentication-environment-configuration}

Мы поддерживаем аутентификацию через [провайдеров идентификации
(IdP)](https://en.wikipedia.org/wiki/Identity_provider). Чтобы воспользоваться
этим, убедитесь, что все необходимые переменные окружения для выбранного
провайдера присутствуют в окружении сервера. **Отсутствие переменных** приведет
к тому, что Tuist обойдет этого провайдера.

#### GitHub {#github}

Мы рекомендуем аутентифицироваться с помощью [GitHub
App](https://docs.github.com/en/apps/creating-github-apps/about-creating-github-apps/about-creating-github-apps),
но вы также можете использовать [OAuth
App](https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/creating-an-oauth-app).
Убедитесь, что в окружение сервера включены все необходимые переменные
окружения, указанные GitHub. Отсутствие переменных приведет к тому, что Tuist не
примет во внимание аутентификацию GitHub. Чтобы правильно настроить приложение
GitHub:
- В общих настройках приложения GitHub:
    - Скопируйте идентификатор клиента `` и установите его как
      `TUIST_GITHUB_APP_CLIENT_ID.`
    - Создайте и скопируйте новый клиентский секрет `` и установите его как
      `TUIST_GITHUB_APP_CLIENT_SECRET.`
    - Установите URL-адрес обратного вызова `` как
      `http://YOUR_APP_URL/users/auth/github/callback`. `YOUR_APP_URL` также
      может быть IP-адресом вашего сервера.
- Требуются следующие разрешения:
  - Репозитории:
    - Заявки на перетяжку: Чтение и запись
  - Счета:
    - Адреса электронной почты: Только для чтения

В разделе `Разрешения и события`'s `Account permissions` установите для
разрешения `Email addresses` значение `Read-only`.

Затем вам нужно будет выставить следующие переменные окружения в среде, в
которой запущен сервер Tuist:

| Переменная среды                 | Описание                                | Требуется | По умолчанию | Пример                                     |
| -------------------------------- | --------------------------------------- | --------- | ------------ | ------------------------------------------ |
| `TUIST_GITHUB_APP_CLIENT_ID`     | Идентификатор клиента приложения GitHub | Да        |              | `Iv1.a629723000043722`                     |
| `TUIST_GITHUB_APP_CLIENT_SECRET` | Секрет клиента приложения               | Да        |              | `232f972951033b89799b0fd24566a04d83f44ccc` |

#### Google {#google}

Вы можете настроить аутентификацию в Google с помощью [OAuth
2](https://developers.google.com/identity/protocols/oauth2). Для этого вам нужно
будет создать новый мандат типа OAuth client ID. При создании учетных данных
выберите тип приложения "Веб-приложение", назовите его `Tuist`, а URI
перенаправления установите на `{base_url}/users/auth/google/callback`, где
`base_url` - это URL, на котором работает ваш хостинг-сервис. После создания
приложения скопируйте идентификатор и секрет клиента и установите их в качестве
переменных окружения `GOOGLE_CLIENT_ID` и `GOOGLE_CLIENT_SECRET` соответственно.

> [!NOTE]
> **Consent Screen Scopes**
>
> Возможно, вам потребуется создать экран согласия. При этом обязательно добавьте
> диапазоны `userinfo.email` и `openid` и отметьте приложение как внутреннее.


#### Okta {#okta}

Вы можете включить аутентификацию с помощью Okta по протоколу [OAuth
2.0](https://oauth.net/2/). Вам нужно будет [создать
приложение](https://developer.okta.com/docs/en/guides/implement-oauth-for-okta/main/#create-an-oauth-2-0-app-in-okta)
на Okta, следуя <LocalizedLink href="/guides/integrations/sso#okta">этим инструкциям</LocalizedLink>.

После получения идентификатора и секрета клиента в процессе настройки приложения
Okta вам нужно будет установить следующие переменные окружения:

| Переменная среды             | Описание                                                                                             | Требуется | По умолчанию | Пример |
| ---------------------------- | ---------------------------------------------------------------------------------------------------- | --------- | ------------ | ------ |
| `TUIST_OKTA_1_CLIENT_ID`     | Идентификатор клиента для аутентификации в Okta. Номер должен быть идентификатором вашей организации | Да        |              |        |
| `TUIST_OKTA_1_CLIENT_SECRET` | Секрет клиента для аутентификации в Okta                                                             | Да        |              |        |

Число `1` необходимо заменить на идентификатор вашей организации. Обычно это 1,
но проверьте в своей базе данных.

### Настройка среды хранения данных {#storage-environment-configuration}

Tuist нуждается в хранилище для хранения артефактов, загружаемых через API. Для
эффективной работы Tuist необходимо **настроить одно из поддерживаемых решений
для хранения**.

#### Хранилища, совместимые с S3 {#s3compliant-storages}

Для хранения артефактов можно использовать любого поставщика услуг хранения,
совместимого с S3. Для аутентификации и настройки интеграции с поставщиком
хранилища необходимы следующие переменные среды:

| Переменная среды                                         | Описание                                                                                                                                                                     | Требуется | По умолчанию                       | Пример                                                        |
| -------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- | ---------------------------------- | ------------------------------------------------------------- |
| `TUIST_S3_ACCESS_KEY_ID` или `AWS_ACCESS_KEY_ID`         | Идентификатор ключа доступа для аутентификации у поставщика услуг хранения данных                                                                                            | Да        |                                    | `AKIAIOSFOD`                                                  |
| `TUIST_S3_SECRET_ACCESS_KEY` или `AWS_SECRET_ACCESS_KEY` | Секретный ключ доступа для аутентификации у поставщика услуг хранения данных                                                                                                 | Да        |                                    | `wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY`                    |
| `TUIST_S3_REGION` или `AWS_REGION`                       | Регион, в котором находится ведро                                                                                                                                            | Нет       | `авто`                             | `запад-2`                                                     |
| `TUIST_S3_ENDPOINT` или `AWS_ENDPOINT`                   | Конечная точка поставщика услуг хранения                                                                                                                                     | Да        |                                    | `https://s3.us-west-2.amazonaws.com`                          |
| `TUIST_S3_BUCKET_NAME`                                   | Имя ведра, в котором будут храниться артефакты                                                                                                                               | Да        |                                    | `tuist-artifacts`                                             |
| `TUIST_S3_CA_CERT_PEM`                                   | Сертификат ЦС в кодировке PEM для проверки HTTPS-соединений S3. Полезно для сред с воздушной завесой с самоподписанными сертификатами или внутренними центрами сертификации. | Нет       | Пакет системного ЦС                | `-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----` |
| `TUIST_S3_CONNECT_TIMEOUT`                               | Таймаут (в миллисекундах) для установления соединения с провайдером хранилища                                                                                                | Нет       | `3000`                             | `3000`                                                        |
| `TUIST_S3_RECEIVE_TIMEOUT`                               | Таймаут (в миллисекундах) для получения данных от провайдера хранилища                                                                                                       | Нет       | `5000`                             | `5000`                                                        |
| `TUIST_S3_POOL_TIMEOUT`                                  | Таймаут (в миллисекундах) для пула соединений с провайдером хранилища. Используйте `infinity` для отсутствия таймаута.                                                       | Нет       | `5000`                             | `5000`                                                        |
| `TUIST_S3_POOL_MAX_IDLE_TIME`                            | Максимальное время простоя (в миллисекундах) для соединений в пуле. Используйте `infinity`, чтобы поддерживать соединения неограниченное время.                              | Нет       | `Бесконечность`                    | `60000`                                                       |
| `TUIST_S3_POOL_SIZE`                                     | Максимальное количество соединений в одном пуле                                                                                                                              | Нет       | `500`                              | `500`                                                         |
| `TUIST_S3_POOL_COUNT`                                    | Количество используемых пулов соединений                                                                                                                                     | Нет       | Количество системных планировщиков | `4`                                                           |
| `TUIST_S3_PROTOCOL`                                      | Протокол, используемый при подключении к провайдеру хранилища (`http1` или `http2`).                                                                                         | Нет       | `http1`                            | `http1`                                                       |
| `TUIST_S3_VIRTUAL_HOST`                                  | Следует ли строить URL с именем ведра в качестве поддомена (виртуального хоста).                                                                                             | Нет       | `ложь`                             | `1`                                                           |

> [!NOTE]
> **Aws Authentication With Web Identity Token From Environment Variables**
>
> Если ваш поставщик хранилища - AWS и вы хотите аутентифицироваться с помощью
> токена веб-идентификации, вы можете установить переменную окружения
> `TUIST_S3_AUTHENTICATION_METHOD` на `aws_web_identity_token_from_env_vars`, и
> Tuist будет использовать этот метод, используя обычные переменные окружения AWS.


#### Облачное хранилище Google {#google-cloud-storage}
Для Google Cloud Storage следуйте [этим
документам](https://cloud.google.com/storage/docs/authentication/managing-hmackeys),
чтобы получить пару `AWS_ACCESS_KEY_ID` и `AWS_SECRET_ACCESS_KEY`. Переменная
`AWS_ENDPOINT` должна быть установлена на `https://storage.googleapis.com`.
Остальные переменные окружения такие же, как и для любого другого
S3-совместимого хранилища.

### Конфигурация электронной почты {#email-configuration}

Tuist требует функциональности электронной почты для аутентификации
пользователей и транзакционных уведомлений (например, сброс пароля, уведомления
об учетной записи). В настоящее время **поддерживает только Mailgun** в качестве
почтового провайдера.

| Переменная среды                 | Описание                                                                                                                                                                                                        | Требуется | По умолчанию                                                                            | Пример                    |
| -------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- | --------------------------------------------------------------------------------------- | ------------------------- |
| `TUIST_MAILGUN_API_KEY`          | Ключ API для аутентификации в Mailgun                                                                                                                                                                           | Да*       |                                                                                         | `ключ-1234567890abcdef`   |
| `TUIST_MAILING_DOMAIN`           | Домен, с которого будут отправляться электронные письма                                                                                                                                                         | Да*       |                                                                                         | `mg.tuist.io`             |
| `TUIST_MAILING_FROM_ADDRESS`     | Адрес электронной почты, который будет отображаться в поле "От".                                                                                                                                                | Да*       |                                                                                         | `noreply@tuist.io`        |
| `TUIST_MAILING_REPLY_TO_ADDRESS` | Необязательный адрес для ответов пользователей                                                                                                                                                                  | Нет       |                                                                                         | `support@tuist.dev`       |
| `TUIST_SKIP_EMAIL_CONFIRMATION`  | Пропускать подтверждение по электронной почте при регистрации новых пользователей. Если эта функция включена, пользователи автоматически получают подтверждение и могут войти в систему сразу после регистрации | Нет       | `true`, если электронная почта не настроена, `false`, если электронная почта настроена. | `true`, `false`, `1`, `0` |

\* Переменные конфигурации электронной почты необходимы только в том случае,
если вы хотите отправлять электронные письма. Если они не настроены,
подтверждение электронной почты автоматически пропускается

> [!NOTE]
> **Smtp Support**
>
> Поддержка общего SMTP в настоящее время недоступна. Если вам нужна поддержка
> SMTP для вашего локального развертывания, свяжитесь с
> [contact@tuist.dev](mailto:contact@tuist.dev), чтобы обсудить ваши требования.


> [!NOTE]
> **Air-gapped Deployments**
>
> Для локальных установок, не имеющих доступа в Интернет или настроек почтового
> провайдера, подтверждение по электронной почте автоматически пропускается по
> умолчанию. Пользователи могут войти в систему сразу после регистрации. Если у
> вас настроена электронная почта, но вы хотите пропустить подтверждение,
> установите `TUIST_SKIP_EMAIL_CONFIRMATION=true`. Чтобы потребовать подтверждения
> электронной почты, если она настроена, установите
> `TUIST_SKIP_EMAIL_CONFIRMATION=false`.


### Настройка платформы Git {#git-platform-configuration}

Tuist может <LocalizedLink href="/guides/server/authentication">интегрироваться с Git-платформами</LocalizedLink>, чтобы предоставить дополнительные
возможности, такие как автоматическая публикация комментариев в ваших запросах
на вытягивание.

#### GitHub {#platform-github}

Вам нужно будет [создать приложение
GitHub](https://docs.github.com/en/apps/creating-github-apps/about-creating-github-apps/about-creating-github-apps).
Вы можете использовать созданное вами приложение для аутентификации, если вы не
создали приложение GitHub с OAuth. В разделе `Разрешения и события`'s
`Repository permissions` вам нужно дополнительно установить разрешение `Pull
requests` на `Read and write`.

Помимо `TUIST_GITHUB_APP_CLIENT_ID` и `TUIST_GITHUB_APP_CLIENT_SECRET`, вам
понадобятся следующие переменные окружения:

| Переменная среды               | Описание                        | Требуется | По умолчанию | Пример                                |
| ------------------------------ | ------------------------------- | --------- | ------------ | ------------------------------------- |
| `TUIST_GITHUB_APP_PRIVATE_KEY` | Закрытый ключ приложения GitHub | Да        |              | `----- BEGIN RSA PRIVATE KEY-----...` |

## Тестирование на месте {#testing-locally}

Мы предоставляем комплексную конфигурацию Docker Compose, включающую все
необходимые зависимости для тестирования сервера Tuist на локальной машине перед
развертыванием в вашей инфраструктуре:

- PostgreSQL 15 с расширением TimescaleDB 2.16 (устаревшее)
- ClickHouse 25 для аналитики
- ClickHouse Keeper для координации
- MinIO для S3-совместимого хранилища
- Redis для постоянного хранения KV во всех развертываниях (необязательно).
- pgweb для администрирования баз данных

> [!CAUTION]
> **License Required**
>
> Для запуска сервера Tuist, включая локальные экземпляры разработки, требуется
> действительная переменная окружения `TUIST_LICENSE`. Если вам нужна лицензия,
> пожалуйста, свяжитесь с [contact@tuist.dev](mailto:contact@tuist.dev).


**Быстрый старт:**

1. Загрузите файлы конфигурации:
   ```bash
   curl -O https://docs.tuist.io/server/self-host/docker-compose.yml
   curl -O https://docs.tuist.io/server/self-host/clickhouse-config.xml
   curl -O https://docs.tuist.io/server/self-host/clickhouse-keeper-config.xml
   curl -O https://docs.tuist.io/server/self-host/.env.example
   ```

2. Настройте переменные окружения:
   ```bash
   cp .env.example .env
   # Edit .env and add your TUIST_LICENSE and authentication credentials
   ```

3. Запустите все службы:
   ```bash
   docker compose up -d
   # or with podman:
   podman compose up -d
   ```

4. Зайдите на сервер по адресу http://localhost:8080.

**Конечные точки обслуживания:**
- Сервер Tuist: http://localhost:8080
- Консоль MinIO: http://localhost:9003 (учетные данные: `tuist` /
  `tuist_dev_password`)
- API MinIO: http://localhost:9002
- pgweb (пользовательский интерфейс PostgreSQL): http://localhost:8081
- Метрика "Прометея": http://localhost:9091/metrics
- ClickHouse HTTP: http://localhost:8124

**Общие команды:**

Проверьте состояние обслуживания:
```bash
docker compose ps
# or: podman compose ps
```

Просмотр журналов:
```bash
docker compose logs -f tuist
```

Услуги по остановке:
```bash
docker compose down
```

Сброс всех настроек (удаление всех данных):
```bash
docker compose down -v
```

**Файлы конфигурации:**
- [docker-compose.yml](/server/self-host/docker-compose.yml) - Полная
  конфигурация Docker Compose
- [clickhouse-config.xml](/server/self-host/clickhouse-config.xml) -
  Конфигурация ClickHouse
- [clickhouse-keeper-config.xml](/server/self-host/clickhouse-keeper-config.xml)
  - Конфигурация ClickHouse Keeper
- [.env.example](/server/self-host/.env.example) - Пример файла переменных
  окружения

## Развертывание {#deployment}

Официальный образ Tuist Docker доступен по адресу:
```
ghcr.io/tuist/tuist
```

### Извлечение образа Docker {#pulling-the-docker-image}

Вы можете получить изображение, выполнив следующую команду:

```bash
docker pull ghcr.io/tuist/tuist:latest
```

Или выберите конкретную версию:
```bash
docker pull ghcr.io/tuist/tuist:0.1.0
```

### Развертывание образа Docker {#deploying-the-docker-image}

Процесс развертывания образа Docker будет отличаться в зависимости от выбранного
вами облачного провайдера и подхода к непрерывному развертыванию в вашей
организации. Поскольку большинство облачных решений и инструментов, таких как
[Kubernetes](https://kubernetes.io/), используют образы Docker в качестве
фундаментальных единиц, примеры, приведенные в этом разделе, должны хорошо
сочетаться с существующими настройками.

> [!WARNING]
> Если вашему конвейеру развертывания необходимо подтвердить, что сервер работает,
> вы можете отправить HTTP-запрос `GET` по адресу `/ready` и подтвердить код
> состояния `200` в ответе.


#### Fly {#fly}

Чтобы развернуть приложение на [Fly](https://fly.io/), вам потребуется
конфигурационный файл `fly.toml`. Рассмотрите возможность его динамической
генерации в рамках конвейера непрерывного развертывания (CD). Ниже приведен
эталонный пример для использования:

```toml
app = "tuist"
primary_region = "fra"
kill_signal = "SIGINT"
kill_timeout = "5s"

[experimental]
  auto_rollback = true

[env]
  # Your environment configuration goes here
  # Or exposed through Fly secrets

[processes]
  app = "/usr/local/bin/hivemind /app/Procfile"

[[services]]
  protocol = "tcp"
  internal_port = 8080
  auto_stop_machines = false
  auto_start_machines = false
  processes = ["app"]
  http_options = { h2_backend = true }

  [[services.ports]]
    port = 80
    handlers = ["http"]
    force_https = true

  [[services.ports]]
    port = 443
    handlers = ["tls", "http"]
  [services.concurrency]
    type = "connections"
    hard_limit = 100
    soft_limit = 80

  [[services.http_checks]]
    interval = 10000
    grace_period = "10s"
    method = "get"
    path = "/ready"
    protocol = "http"
    timeout = 2000
    tls_skip_verify = false
    [services.http_checks.headers]

[[statics]]
  guest_path = "/app/public"
  url_prefix = "/"
```

Затем вы можете выполнить `fly launch --local-only --no-deploy` для запуска
приложения. При последующих развертываниях вместо `fly launch --local-only`
нужно будет выполнить `fly deploy --local-only`. Fly.io не позволяет получать
приватные Docker-образы, поэтому нам нужно использовать флаг `--local-only`.


## Метрики Прометея {#prometheus-metrics}

Tuist предоставляет метрики Prometheus по адресу `/metrics`, чтобы помочь вам
следить за вашим самораспространяющимся экземпляром. Эти метрики включают в
себя:

### Метрики HTTP-клиента Finch {#finch-metrics}

Tuist использует [Finch](https://github.com/sneako/finch) в качестве
HTTP-клиента и выдает подробные метрики о HTTP-запросах:

#### Метрики запроса
- `tuist_prom_ex_finch_request_count_total` - Общее количество запросов Finch
  (счетчик).
  - Метки: `finch_name`, `method`, `scheme`, `host`, `port`, `status`
- `tuist_prom_ex_finch_request_duration_milliseconds` - Продолжительность
  HTTP-запросов (гистограмма).
  - Метки: `finch_name`, `method`, `scheme`, `host`, `port`, `status`
  - Ведра: 10 мс, 50 мс, 100 мс, 250 мс, 500 мс, 1 с, 2,5 с, 5 с, 10 с
- `tuist_prom_ex_finch_request_exception_count_total` - Общее количество
  исключений из запросов Finch (счетчик).
  - Ярлыки: `finch_name`, `method`, `scheme`, `host`, `port`, `kind`, `reason`

#### Метрики очереди пула подключений
- `tuist_prom_ex_finch_queue_duration_milliseconds` - Время ожидания в очереди
  пула соединений (гистограмма).
  - Метки: `finch_name`, `scheme`, `host`, `port`, `pool`
  - Ведра: 1 мс, 5 мс, 10 мс, 25 мс, 50 мс, 100 мс, 250 мс, 500 мс, 1 с
- `tuist_prom_ex_finch_queue_idle_time_milliseconds` - Время, в течение которого
  соединение простаивало перед использованием (гистограмма).
  - Метки: `finch_name`, `scheme`, `host`, `port`, `pool`
  - Ведра: 10 мс, 50 мс, 100 мс, 250 мс, 500 мс, 1 с, 5 с, 10 с
- `tuist_prom_ex_finch_queue_exception_count_total` - Общее количество
  исключений из очереди Finch (счетчик).
  - Ярлыки: `finch_name`, `scheme`, `host`, `port`, `kind`, `reason`

#### Метрики подключения
- `tuist_prom_ex_finch_connect_duration_milliseconds` - Время установления
  соединения (гистограмма).
  - Ярлыки: `finch_name`, `scheme`, `host`, `port`, `error`
  - Ведра: 10 мс, 50 мс, 100 мс, 250 мс, 500 мс, 1 с, 2,5 с, 5 с
- `tuist_prom_ex_finch_connect_count_total` - Общее количество попыток
  соединения (счетчик).
  - Ярлыки: `finch_name`, `scheme`, `host`, `port`

#### Отправить метрики
- `tuist_prom_ex_finch_send_duration_milliseconds` - Время, затраченное на
  отправку запроса (гистограмма).
  - Метки: `finch_name`, `method`, `scheme`, `host`, `port`, `error`
  - Ведра: 1 мс, 5 мс, 10 мс, 25 мс, 50 мс, 100 мс, 250 мс, 500 мс, 1 с
- `tuist_prom_ex_finch_send_idle_time_milliseconds` - Время простоя соединения
  перед отправкой (гистограмма).
  - Метки: `finch_name`, `method`, `scheme`, `host`, `port`, `error`
  - Ведра: 1 мс, 5 мс, 10 мс, 25 мс, 50 мс, 100 мс, 250 мс, 500 мс

Все метрики гистограмм предоставляют варианты `_bucket`, `_sum`, и `_count` для
детального анализа.

### Другие показатели

В дополнение к метрикам Finch, Tuist предоставляет метрики для:
- Производительность виртуальной машины BEAM
- Пользовательские метрики бизнес-логики (хранилища, учетные записи, проекты и
  т. д.)
- Производительность базы данных (при использовании инфраструктуры Tuist-hosted)

## Операции {#operations}

Tuist предоставляет набор утилит по адресу `/ops/`, которые вы можете
использовать для управления своим экземпляром.

> [!WARNING]
> **Authorization**
>
> Доступ к конечным точкам `/ops/` могут получить только те, чьи дескрипторы
> указаны в переменной окружения `TUIST_OPS_USER_HANDLES`.


- **Ошибки (`/ops/errors`):** Вы можете просмотреть неожиданные ошибки,
  возникшие в приложении. Это полезно для отладки и понимания того, что пошло не
  так, и мы можем попросить вас поделиться этой информацией с нами, если вы
  столкнулись с проблемами.
- **Приборная панель (`/ops/dashboard`):** Вы можете просмотреть приборную
  панель, которая дает представление о производительности и состоянии приложения
  (например, потребление памяти, запущенные процессы, количество запросов). Эта
  панель может быть очень полезна, чтобы понять, достаточно ли используемого
  вами оборудования для дескриптора нагрузки.
