# Самостоятельная установка {#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. ::: info MIGRATIONS Точка входа образа Docker автоматически запускает все ожидающие миграции схемы перед запуском службы. Если миграция не удалась из-за отсутствия расширения TimescaleDB, вам нужно будет сначала установить его в свою базу данных. ::: ### База данных ClickHouse {#clickhouse-database} Tuist использует [ClickHouse](https://clickhouse.com/) для хранения и запроса больших объемов аналитических данных. ClickHouse - это **, необходимый** для таких функций, как build insights, и он станет основной базой данных временных рядов, когда мы откажемся от TimescaleDB. Вы можете выбрать, размещать ClickHouse самостоятельно или использовать их хостинговый сервис. ::: info MIGRATIONS Точка входа образа Docker автоматически запускает все предстоящие миграции схемы ClickHouse перед запуском службы. ::: ### Хранение {#storage} Вам также понадобится решение для хранения файлов (например, двоичных файлов фреймворков и библиотек). В настоящее время мы поддерживаем любое хранилище, совместимое с S3. ## Конфигурация {#configuration} Конфигурация службы выполняется во время выполнения с помощью переменных окружения. Учитывая конфиденциальный характер этих переменных, мы рекомендуем шифровать и хранить их в надежных решениях для управления паролями. Будьте уверены, Tuist работает с этими переменными очень осторожно, гарантируя, что они никогда не будут отображаться в логах. ::: info 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` соответственно. ::: info 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, следуя этим инструкциям. После получения идентификатора и секрета клиента в процессе настройки приложения 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` | ::: info 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` | \* Переменные конфигурации электронной почты необходимы только в том случае, если вы хотите отправлять электронные письма. Если они не настроены, подтверждение электронной почты автоматически пропускается ::: info SMTP SUPPORT Поддержка общего SMTP в настоящее время недоступна. Если вам нужна поддержка SMTP для вашего локального развертывания, свяжитесь с [contact@tuist.dev](mailto:contact@tuist.dev), чтобы обсудить ваши требования. ::: ::: info AIR-GAPPED DEPLOYMENTS Для локальных установок, не имеющих доступа в Интернет или настроек почтового провайдера, подтверждение по электронной почте автоматически пропускается по умолчанию. Пользователи могут войти в систему сразу после регистрации. Если у вас настроена электронная почта, но вы хотите пропустить подтверждение, установите `TUIST_SKIP_EMAIL_CONFIRMATION=true`. Чтобы потребовать подтверждения электронной почты, если она настроена, установите `TUIST_SKIP_EMAIL_CONFIRMATION=false`. ::: ### Настройка платформы Git {#git-platform-configuration} Tuist может интегрироваться с Git-платформами, чтобы предоставить дополнительные возможности, такие как автоматическая публикация комментариев в ваших запросах на вытягивание. #### 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 для администрирования баз данных ::: danger 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`):** Вы можете просмотреть приборную панель, которая дает представление о производительности и состоянии приложения (например, потребление памяти, запущенные процессы, количество запросов). Эта панель может быть очень полезна, чтобы понять, достаточно ли используемого вами оборудования для дескриптора нагрузки.