# 셀프 호스트 설치 {#self-host-installation}
인프라에 대한 더 많은 제어가 필요한 조직을 위해 자체 호스팅 버전의 Tuist 서버를 제공합니다. 이 버전을 사용하면 자체 인프라에서
Tuist를 호스팅하여 데이터를 안전하게 비공개로 유지할 수 있습니다.
::: warning LICENSE REQUIRED
자체 호스팅 Tuist에는 법적으로 유효한 유료 라이선스가 필요합니다. 온프레미스 버전의 Tuist는 Enterprise 요금제를 사용하는
조직만 사용할 수 있습니다. 이 버전에 관심이 있으시면 [contact@tuist.dev](mailto:contact@tuist.dev)로
문의하시기 바랍니다.
:::
## 릴리스 케이던스 {#release-cadence}
새로운 릴리즈 가능한 변경 사항이 메인에 적용되면 지속적으로 새 버전을 출시합니다. 예측 가능한 버전 관리와 호환성을 보장하기 위해 [시맨틱
버전 관리](https://semver.org/)를 따릅니다.
주요 구성 요소는 온프레미스 사용자와의 조정이 필요한 Tuist 서버의 중대한 변경 사항을 알리는 데 사용됩니다. 당사가 이 기능을 사용할
필요는 없으며, 필요한 경우 당사는 원활한 전환을 위해 여러분과 협력할 것이니 안심하세요.
## 지속적인 배포 {#continuous-deployment}
매일 최신 버전의 Tuist를 자동으로 배포하는 지속적인 배포 파이프라인을 설정하는 것을 적극 권장합니다. 이렇게 하면 항상 최신 기능, 개선
사항 및 보안 업데이트에 액세스할 수 있습니다.
다음은 매일 새 버전을 확인하고 배포하는 GitHub 작업 워크플로 예시입니다:
```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 | 타임스케일DB 확장 사용 |
| 타임스케일DB | 2.16.1 | 필수 PostgreSQL 확장(더 이상 사용되지 않음) |
| ClickHouse | 25 | 분석에 필요 |
::: warning TIMESCALEDB DEPRECATION
타임스케일DB는 현재 시계열 데이터 저장 및 쿼리에 사용되는 Tuist 서버의 필수 PostgreSQL 확장 프로그램입니다. 그러나
**TimescaleDB는 더 이상 사용되지 않으며** 가까운 시일 내에 모든 시계열 기능을 ClickHouse로 마이그레이션함에 따라 필수
종속성에서 삭제될 예정입니다. 현재로서는 PostgreSQL 인스턴스에 타임스케일DB가 설치되어 있고 활성화되어 있는지 확인하세요.
:::
### Docker 가상화 이미지 실행 {#running-dockervirtualized-images}
GitHub의 컨테이너
레지스트리](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry)를
통해 [Docker](https://www.docker.com/) 이미지로 서버를 배포합니다.
이를 실행하려면 인프라가 Docker 이미지 실행을 지원해야 합니다. 프로덕션 환경에서 소프트웨어를 배포하고 실행하기 위한 표준 컨테이너가
되었기 때문에 대부분의 인프라 제공업체가 이를 지원합니다.
### Postgres 데이터베이스 {#postgres-database}
Docker 이미지를 실행하는 것 외에도 관계형 및 시계열 데이터를 저장하려면 [TimescaleDB
확장](https://www.timescale.com/)이 있는 [Postgres
데이터베이스](https://www.postgresql.org/)가 필요합니다. 대부분의 인프라 제공업체는
[AWS](https://aws.amazon.com/rds/postgresql/) 및 [Google
Cloud](https://cloud.google.com/sql/docs/postgres)와 같은 서비스 제공에 Postgres 데이터베이스를
포함합니다(예: [AWS](https://aws.amazon.com/rds/postgresql/) 및 [Google
Cloud](https://cloud.google.com/sql/docs/postgres)).
**타임스케일DB 확장이 필요합니다:** 효율적인 시계열 데이터 저장 및 쿼리를 위해 튜이스트에는 타임스케일DB 확장이 필요합니다. 이 확장은
명령 이벤트, 분석 및 기타 시간 기반 기능에 사용됩니다. 튜이스트를 실행하기 전에 PostgreSQL 인스턴스에 타임스케일DB가 설치되어 있고
활성화되어 있는지 확인하세요.
::: info MIGRATIONS
Docker 이미지의 엔트리포인트는 서비스를 시작하기 전에 보류 중인 모든 스키마 마이그레이션을 자동으로 실행합니다. 타임스케일DB 확장이
누락되어 마이그레이션이 실패하는 경우, 먼저 데이터베이스에 해당 확장을 설치해야 합니다.
:::
### ClickHouse 데이터베이스 {#clickhouse-database}
Tuist는 대량의 분석 데이터를 저장하고 쿼리하기 위해 [ClickHouse](https://clickhouse.com/)를 사용합니다.
ClickHouse는 인사이트 구축과 같은 기능에 **** 필요하며, 향후 타임스케일DB를 단계적으로 폐지함에 따라 기본 시계열 데이터베이스가
될 것입니다. ClickHouse를 자체 호스팅할지 아니면 호스팅된 서비스를 사용할지 선택할 수 있습니다.
::: info MIGRATIONS
Docker 이미지의 엔트리포인트는 서비스를 시작하기 전에 보류 중인 모든 ClickHouse 스키마 마이그레이션을 자동으로 실행합니다.
:::
### 스토리지 {#storage}
또한 파일(예: 프레임워크 및 라이브러리 바이너리)을 저장할 솔루션이 필요합니다. 현재는 S3와 호환되는 모든 스토리지를 지원합니다.
## 구성 {#configuration}
서비스 구성은 런타임에 환경 변수를 통해 이루어집니다. 이러한 변수의 민감한 특성을 고려할 때 안전한 비밀번호 관리 솔루션에 암호화하여 저장하는
것이 좋습니다. Tuist는 이러한 변수를 매우 신중하게 처리하여 로그에 절대 표시되지 않도록 하므로 안심하셔도 됩니다.
::: info LAUNCH CHECKS
시작 시 필요한 변수가 확인됩니다. 누락된 변수가 있으면 실행이 실패하고 오류 메시지에 누락된 변수가 자세히 표시됩니다.
:::
### 라이선스 구성 {#license-configuration}
온프레미스 사용자는 환경 변수로 노출해야 하는 라이선스 키를 받게 됩니다. 이 키는 라이선스의 유효성을 검사하고 서비스가 계약 조건 내에서
실행되고 있는지 확인하는 데 사용됩니다.
| 환경 변수 | 설명 | 필수 | 기본값 | 예 |
| --------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | --- | --- | ----------------------------------------- |
| `TUIST_LICENSE` | 서비스 수준 계약 체결 후 제공되는 라이선스 | 예* | | `******` |
| `튜이스트_라이센스_인증서_베이스64` | **튜이스트_라이센스`의 탁월한 대안**. 서버가 외부 서비스와 연결할 수 없는 에어 갭 환경에서 오프라인 라이선스 유효성 검사를 위한 Base64 인코딩된 공인 인증서입니다. ` TUIST_LICENSE` 를 사용할 수 없는 경우에만 사용 | 예* | | `LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0t...` |
\* `TUIST_LICENSE` 또는 `TUIST_LICENSE_CERTIFICATE_BASE64` 중 하나만 제공해야 하며, 둘 다 제공하면
안 됩니다. 표준 배포의 경우 `TUIST_LICENSE` 을 사용합니다.
::: warning EXPIRATION DATE
라이선스에는 만료일이 있습니다. 라이선스가 30일 이내에 만료되면 서버와 상호 작용하는 Tuist 명령을 사용하는 동안 사용자에게 경고 메시지가
표시됩니다. 라이선스 갱신에 관심이 있는 경우 [contact@tuist.dev](mailto:contact@tuist.dev)로 문의하시기
바랍니다.
:::
### 기본 환경 구성 {#base-environment-configuration}
| 환경 변수 | 설명 | 필수 | 기본값 | 예 | |
| ------------------------------ | ---------------------------------------------------------------------------------------------------------------- | --- | ---------------------------------- | ------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| `TUIST_APP_URL` | 인터넷에서 인스턴스에 액세스하기 위한 기본 URL입니다. | 예 | | https://tuist.dev | |
| `tuist_secret_key_base` | 정보를 암호화하는 데 사용할 키(예: 쿠키의 세션) | 예 | | | `c5786d9f869239cbddeca645575349a570ffebb332b64400c37256e1c9cb7ec831345d03dc0188edd129d09580d8cbf3ceaf17768e2048c037d9c31da5dcacfa` |
| `tuist_secret_key_password` | Pepper로 해시된 비밀번호 생성 | 아니요 | `튜리스트_시크릿_키_베이스` | | |
| `튜이스트_시크릿_키_토큰` | 랜덤 토큰을 생성하는 비밀 키 | 아니요 | `튜리스트_시크릿_키_베이스` | | |
| `튜이스트_시크릿_키_암호화` | 민감한 데이터의 AES-GCM 암호화를 위한 32바이트 키 | 아니요 | `튜리스트_시크릿_키_베이스` | | |
| `TUIST_USE_IPV6` | `1` 을 입력하면 앱이 IPv6 주소를 사용하도록 구성됩니다. | 아니요 | `0` | `1` | |
| `tuist_log_level` | 앱에 사용할 로그 수준 | 아니요 | `정보` | [로그 수준](https://hexdocs.pm/logger/1.12.3/Logger.html#module-levels) | |
| `튜이스트_구글_앱_이름` | GitHub 앱 이름의 URL 버전 | 아니요 | | `내 앱` | |
| `튜이스트_구글_앱_개인키_베이스64` | 자동 PR 댓글 게시와 같은 추가 기능을 잠금 해제하기 위해 GitHub 앱에 사용되는 base64로 인코딩된 개인 키입니다. | 아니요 | `LS0tLS1CRUdJTiBSU0EgUFJJVkFUR...` | | |
| `tuist_github_app_private_key` | GitHub 앱에서 자동 PR 댓글 게시와 같은 추가 기능을 잠금 해제하는 데 사용되는 비공개 키입니다. **특수 문자 관련 문제를 방지하려면 Base64로 인코딩된 버전을 사용하는 것이 좋습니다.** | 아니요 | `-----BEGIN RSA...` | | |
| `튜이스트_옵스_사용자_핸들` | 작업 URL에 액세스할 수 있는 사용자 핸들의 쉼표로 구분된 목록입니다. | 아니요 | | `user1,user2` | |
| `TUIST_WEB` | 웹 서버 엔드포인트 사용 | 아니요 | `1` | `1` 또는 `0` | |
### 데이터베이스 구성 {#database-configuration}
데이터베이스 연결을 구성하는 데 사용되는 환경 변수는 다음과 같습니다:
| 환경 변수 | 설명 | 필수 | 기본값 | 예 |
| ------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------- | --- | --------- | ---------------------------------------------------------------------- |
| `DATABASE_URL` | Postgres 데이터베이스에 액세스하기 위한 URL입니다. URL에는 인증 정보가 포함되어야 합니다. | 예 | | `postgres://username:password@cloud.us-east-2.aws.test.com/production` |
| `튜이스트_클릭하우스_URL` | ClickHouse 데이터베이스에 액세스하기 위한 URL입니다. 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` |
| `튜이스트_데이터베이스_풀_크기` | 연결 풀에서 계속 열어 둘 연결 수입니다. | 아니요 | `10` | `10` |
| `튜이스트_데이터베이스_큐_타겟` | 풀에서 체크 아웃된 모든 연결이 큐 간격보다 오래 걸렸는지 확인하는 간격(밀리초)입니다 [(자세한 정보)(https://hexdocs.pm/db_connection/DBConnection.html#start_link/2-queue-config). | 아니요 | `300` | `300` |
| `튜이스트_데이터베이스_큐_인터벌` | 풀에서 새 연결 드롭을 시작할지 여부를 결정하는 데 사용하는 큐의 임계값 시간(밀리초)입니다. [(자세한 정보)](https://hexdocs.pm/db_connection/DBConnection.html#start_link/2-queue-config) | 아니요 | `1000` | `1000` |
| `tuist_clickhouse_flush_interval_ms` | ClickHouse 버퍼 플러시 사이의 시간 간격(밀리초) | 아니요 | `5000` | `5000` |
| `튜이스트_클릭하우스_최대_버퍼_크기` | 강제 플러시 전 최대 ClickHouse 버퍼 크기(바이트) | 아니요 | `1000000` | `1000000` |
| `튜이스트_클릭하우스_버퍼_풀_크기` | 실행할 ClickHouse 버퍼 프로세스 수 | 아니요 | `5` | `5` |
### 인증 환경 구성 {#authentication-environment-configuration}
ID 공급자(IdP)(https://en.wikipedia.org/wiki/Identity_provider)를 통해 인증을 용이하게 합니다.
이를 활용하려면 선택한 제공업체에 필요한 모든 환경 변수가 서버 환경에 있는지 확인하십시오. **** 변수가 누락되면 Tuist는 해당 공급자를
우회하게 됩니다.
#### GitHub {#github}
GitHub
앱](https://docs.github.com/en/apps/creating-github-apps/about-creating-github-apps/about-creating-github-apps)을
사용하여 인증하는 것이 좋지만 [OAuth
앱](https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/creating-an-oauth-app)을
사용할 수도 있습니다. 서버 환경에 GitHub에서 지정한 모든 필수 환경 변수를 포함해야 합니다. 변수가 없으면 Tuist가 GitHub
인증을 간과하게 됩니다. GitHub 앱을 올바르게 설정하려면 다음과 같이 하세요:
- GitHub 앱의 일반 설정에서:
- `클라이언트 ID` 를 복사하여 `TUIST_GITHUB_APP_CLIENT_ID로 설정합니다.`
- `클라이언트 비밀` 을 새로 생성하고 복사하여 `TUIST_GITHUB_APP_CLIENT_SECRET으로 설정합니다.`
- `콜백 URL` 을 `http://YOUR_APP_URL/users/auth/github/callback` 으로 설정합니다.
`YOUR_APP_URL` 은 서버의 IP 주소일 수도 있습니다.
- 다음 권한이 필요합니다:
- 리포지토리:
- 풀 리퀘스트: 읽기 및 쓰기
- 계정:
- 이메일 주소: 읽기 전용
`권한 및 이벤트` 의 `계정 권한` 섹션에서 `이메일 주소` 권한을 `읽기 전용` 으로 설정합니다.
그런 다음 Tuist 서버가 실행되는 환경에서 다음 환경 변수를 노출해야 합니다:
| 환경 변수 | 설명 | 필수 | 기본값 | 예 |
| --------------------- | ----------------------- | --- | --- | ------------------------------------------ |
| `튜이스트_구글_앱_클라이언트_ID` | GitHub 애플리케이션의 클라이언트 ID | 예 | | `Iv1.a629723000043722` |
| `튜이스트_구글_앱_클라이언트_시크릿` | 애플리케이션의 클라이언트 비밀 | 예 | | `232f972951033b89799b0fd24566a04d83f44ccc` |
#### Google {#google}
OAuth 2](https://developers.google.com/identity/protocols/oauth2)를 사용하여 Google
인증을 설정할 수 있습니다. 이를 위해서는 OAuth 클라이언트 ID 유형의 새 자격 증명을 생성해야 합니다. 자격 증명을 만들 때 애플리케이션
유형으로 "웹 애플리케이션"을 선택하고 이름을 `Tuist` 로 지정한 다음 리디렉션 URI를
`{base_url}/users/auth/google/callback` (여기서 `base_url` 은 호스팅된 서비스가 실행되고 있는
URL)으로 설정합니다. 앱을 생성한 후 클라이언트 ID와 비밀 번호를 복사하여 각각 `GOOGLE_CLIENT_ID` 및
`GOOGLE_CLIENT_SECRET` 환경 변수로 설정합니다.
::: info CONSENT SCREEN SCOPES
동의 화면을 만들어야 할 수도 있습니다. 이 때 `userinfo.email` 및 `openid` 범위를 추가하고 앱을 내부로 표시하세요.
:::
#### Okta {#okta}
OAuth 2.0](https://oauth.net/2/) 프로토콜을 통해 Okta로 인증을 활성화할 수 있습니다. 다음
지침에 따라 Okta에서 [앱을 생성](https://developer.okta.com/docs/en/guides/implement-oauth-for-okta/main/#create-an-oauth-2-0-app-in-okta)해야 합니다.
Okta 애플리케이션을 설정하는 동안 클라이언트 ID와 비밀번호를 받으면 다음 환경 변수를 설정해야 합니다:
| 환경 변수 | 설명 | 필수 | 기본값 | 예 |
| ---------------------------- | -------------------------------------------- | --- | --- | --- |
| `tuist_okta_1_client_id` | Okta에 대해 인증할 클라이언트 ID입니다. 이 번호는 조직 ID여야 합니다. | 예 | | |
| `tuist_okta_1_client_secret` | Okta에 대한 인증을 위한 클라이언트 비밀 | 예 | | |
`1` 숫자를 조직 ID로 바꿔야 합니다. 일반적으로 1이 되지만 데이터베이스에서 확인하세요.
### 스토리지 환경 구성 {#storage-environment-configuration}
튜이스트는 API를 통해 업로드된 아티팩트를 저장할 스토리지가 필요합니다. **지원되는 스토리지 솔루션 중 하나(** )를 구성해야 Tuist를
효과적으로 운영할 수 있습니다.
#### S3 호환 스토리지 {#s3compliant-storages}
모든 S3 호환 스토리지 공급업체를 사용하여 아티팩트를 저장할 수 있습니다. 스토리지 제공업체와의 통합을 인증하고 구성하려면 다음 환경 변수가
필요합니다:
| 환경 변수 | 설명 | 필수 | 기본값 | 예 |
| ------------------------------------------------------- | ------------------------------------------------------------------------------- | --- | ---------- | ------------------------------------------------------------- |
| `TUIST_S3_ACCESS_KEY_ID` 또는 `AWS_ACCESS_KEY_ID` | 스토리지 제공업체에 대해 인증할 액세스 키 ID입니다. | 예 | | `아키아이오스푸드` |
| `TUIST_S3_SECRET_ACCESS_KEY` 또는 `AWS_SECRET_ACCESS_KEY` | 스토리지 제공업체에 대한 인증을 위한 비밀 액세스 키 | 예 | | `wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY` |
| `TUIST_S3_REGION` 또는 `AWS_REGION` | 버킷이 위치한 지역 | 아니요 | `자동` | `us-west-2` |
| `TUIST_S3_ENDPOINT` 또는 `AWS_ENDPOINT` | 스토리지 제공업체의 엔드포인트 | 예 | | `https://s3.us-west-2.amazonaws.com` |
| `tuist_s3_버킷_이름` | 아티팩트를 저장할 버킷의 이름입니다. | 예 | | `튜이스트 아티팩트` |
| `TUIST_S3_CA_CERT_PEM` | S3 HTTPS 연결을 확인하기 위한 PEM 인코딩된 CA 인증서. 자체 서명 인증서 또는 내부 인증 기관이 있는 에어 갭 환경에 유용합니다. | 아니요 | 시스템 CA 번들 | `-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----` |
| `tuist_s3_connect_timeout` | 스토리지 공급업체에 연결하기 위한 시간 제한(밀리초) | 아니요 | `3000` | `3000` |
| `tuist_s3_receive_timeout` | 스토리지 공급자로부터 데이터를 수신하는 데 걸리는 시간 제한(밀리초) | 아니요 | `5000` | `5000` |
| `tuist_s3_pool_timeout` | 스토리지 공급자에 대한 연결 풀의 시간 제한(밀리초)입니다. 시간 초과가 없는 경우 `무한대` 사용 | 아니요 | `5000` | `5000` |
| `tuist_s3_pool_max_idle_time` | 풀에 있는 연결의 최대 유휴 시간(밀리초)입니다. ` 무한대` 연결을 무기한으로 유지하려면 다음을 사용하세요. | 아니요 | `무한대` | `60000` |
| `tuist_s3_pool_size` | 풀당 최대 연결 수 | 아니요 | `500` | `500` |
| `tuist_s3_pool_count` | 사용할 연결 풀의 수 | 아니요 | 시스템 스케줄러 수 | `4` |
| `튜이스트_S3_프로토콜` | 스토리지 제공업체에 연결할 때 사용할 프로토콜 (`http1` 또는 `http2`) | 아니요 | `http1` | `http1` |
| `tuist_s3_virtual_host` | URL을 버킷 이름을 하위 도메인(가상 호스트)으로 구성해야 하는지 여부 | 아니요 | `false` | `1` |
::: info AWS authentication with Web Identity Token from environment variables
스토리지 제공업체가 AWS이고 웹 ID 토큰을 사용하여 인증하려는 경우, 환경 변수 `TUIST_S3_AUTHENTICATION_METHOD`
을 `aws_web_identity_token_from_env_vars` 로 설정하면 Tuist는 기존 AWS 환경 변수를 사용하여 해당 방법을
사용합니다.
:::
#### Google 클라우드 스토리지 {#google-cloud-storage}
Google 클라우드 스토리지의 경우, [이
문서](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(** )만 지원됩니다.
| 환경 변수 | 설명 | 필수 | 기본값 | 예 |
| ---------------------- | ------------------------------------------------------------------------ | --- | ------------------------------------- | ------------------------- |
| `튜이스트_메일건_API_키` | Mailgun 인증을 위한 API 키 | 예* | | `KEY-1234567890ABCDEF` |
| `tuist_mailing_domain` | 이메일을 보낼 도메인 | 예* | | `mg.tuist.io` |
| `튜이스트_메일링_발신_주소` | '보낸 사람' 필드에 표시될 이메일 주소입니다. | 예* | | `noreply@tuist.io` |
| `튜이스트_메일링_답장_주소` | 사용자 답장의 답장 수신 주소(선택 사항) | 아니요 | | `support@tuist.dev` |
| `튜이스트_스킵_이메일_확인` | 신규 사용자 등록 시 이메일 확인 건너뛰기. 이 기능을 활성화하면 사용자가 자동으로 확인되며 등록 후 즉시 로그인할 수 있습니다. | 아니요 | `참` 이메일이 구성되지 않은 경우, `거짓` 이메일이 구성된 경우 | `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)을
만들어야 합니다. OAuth GitHub 앱을 만들지 않았다면 인증용으로 만든 것을 재사용할 수 있습니다. ` 권한 및 이벤트` 의 `리포지토리
권한` 섹션에서 `풀 리퀘스트` 권한을 `읽기 및 쓰기` 로 추가로 설정해야 합니다.
`TUIST_GITHUB_APP_CLIENT_ID` 및 `TUIST_GITHUB_APP_CLIENT_SECRET` 외에 다음 환경 변수가
필요합니다:
| 환경 변수 | 설명 | 필수 | 기본값 | 예 |
| ------------------------------ | -------------------- | --- | --- | -------------------------- |
| `tuist_github_app_private_key` | GitHub 애플리케이션의 비공개 키 | 예 | | `-----비긴 RSA 개인 키-----...` |
## 로컬 테스트 {#testing-locally}
인프라에 배포하기 전에 로컬 컴퓨터에서 Tuist 서버를 테스트하는 데 필요한 모든 종속성을 포함하는 포괄적인 Docker Compose 구성을
제공합니다:
- 타임스케일DB 2.16 확장이 포함된 PostgreSQL 15(더 이상 사용되지 않음)
- 분석용 ClickHouse 25
- 클릭하우스 키퍼로 조정하기
- S3 호환 스토리지용 MinIO
- 배포 간 영구 KV 스토리지를 위한 Redis(선택 사항)
- 데이터베이스 관리를 위한 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`)
- MinIO API: http://localhost:9002
- pgweb(PostgreSQL UI): 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)
- 클릭하우스 키퍼 구성
- [.env.example](/server/self-host/.env.example) - 환경 변수 파일 예시
## 배포 {#deployment}
공식 Tuist 도커 이미지는 다음 링크에서 확인할 수 있습니다:
```
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
배포 파이프라인에서 서버가 가동 중인지 확인해야 하는 경우, `GET` HTTP 요청을 `/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는 자체 호스팅 인스턴스를 모니터링하는 데 도움이 되도록 `/metrics` 에서 Prometheus 지표를 노출합니다. 이러한
메트릭에는 다음이 포함됩니다:
### Finch HTTP 클라이언트 메트릭 {#finch-metrics}
Tuist는 [Finch](https://github.com/sneako/finch)를 HTTP 클라이언트로 사용하며 HTTP 요청에 대한
자세한 메트릭을 노출합니다:
#### 요청 메트릭
- `tuist_prom_ex_finch_request_count_total` - 총 핀치 요청 수(카운터)
- 레이블: `핀치_이름`, `방법`, `체계`, `호스트`, `포트`, `상태`
- `tuist_prom_ex_finch_request_duration_milliseconds` - HTTP 요청 기간(히스토그램)
- 레이블: `핀치_이름`, `방법`, `체계`, `호스트`, `포트`, `상태`
- 버킷 10밀리초, 50밀리초, 100밀리초, 250밀리초, 500밀리초, 1초, 2.5초, 5초, 10초
- `tuist_prom_ex_finch_request_exception_count_total` - 핀치 요청 예외의 총 개수(카운터)
- 레이블: `핀치_이름`, `방법`, `체계`, `호스트`, `포트`, `종류`, `이유`
#### 연결 풀 대기열 메트릭
- `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` - 핀치 대기열 예외의 총 개수(카운터)
- 레이블: `핀치_이름`, `체계`, `호스트`, `포트`, `종류`, `이유`
#### 연결 메트릭
- `tuist_prom_ex_finch_connect_duration_milliseconds` - 연결 설정에 소요된 시간(히스토그램)
- 레이블: `핀치_이름`, `체계`, `호스트`, `포트`, `오류`
- 버킷 10밀리초, 50밀리초, 100밀리초, 250밀리초, 500밀리초, 1초, 2.5초, 5초
- `tuist_prom_ex_finch_connect_count_total` - 총 연결 시도 횟수(카운터)
- 레이블: `핀치_이름`, `체계`, `호스트`, `포트`
#### 메트릭 보내기
- `tuist_prom_ex_finch_send_duration_milliseconds` - 요청 전송에 소요된 시간(히스토그램)
- 레이블: `핀치_이름`, `방법`, `체계`, `호스트`, `포트`, `오류`
- 버킷 1밀리초, 5밀리초, 10밀리초, 25밀리초, 50밀리초, 100밀리초, 250밀리초, 500밀리초, 1초
- `tuist_prom_ex_finch_send_idle_time_milliseconds` - 전송 전 연결이 유휴 상태로 있었던
시간(히스토그램)
- 레이블: `핀치_이름`, `방법`, `체계`, `호스트`, `포트`, `오류`
- 버킷 1밀리초, 5밀리초, 10밀리초, 25밀리초, 50밀리초, 100밀리초, 250밀리초, 500밀리초
모든 히스토그램 메트릭은 자세한 분석을 위해 `_bucket`, `_sum`, `_count` 변형을 제공합니다.
### 기타 메트릭
Tuist는 Finch 메트릭 외에도 다음에 대한 메트릭을 노출합니다:
- BEAM 가상 머신 성능
- 사용자 지정 비즈니스 로직 메트릭(스토리지, 계정, 프로젝트 등)
- 데이터베이스 성능(Tuist에서 호스팅하는 인프라를 사용하는 경우)
## 운영 {#operations}
Tuist는 `/ops/` 에서 인스턴스를 관리하는 데 사용할 수 있는 유틸리티 세트를 제공합니다.
::: warning Authorization
`TUIST_OPS_USER_HANDLES` 환경 변수에 핸들이 나열되어 있는 사용자만 `/ops/` 엔드포인트에 액세스할 수 있습니다.
:::
- **오류(`/ops/errors`):** 애플리케이션에서 발생한 예기치 않은 오류를 볼 수 있습니다. 이 정보는 디버깅하고 무엇이
잘못되었는지 이해하는 데 유용하며, 문제가 발생하면 이 정보를 공유해 달라고 요청할 수 있습니다.
- **대시보드(`/ops/dashboard`)를 클릭합니다:** 애플리케이션의 성능 및 상태(예: 메모리 사용량, 실행 중인 프로세스, 요청
수)에 대한 인사이트를 제공하는 대시보드를 볼 수 있습니다. 이 대시보드는 사용 중인 하드웨어가 부하를 처리하기에 충분한지 이해하는 데 매우
유용할 수 있습니다.