정적 객체용 외부 리포지터리

Tier: Free, Premium, Ultimate Offering: Self-Managed

GitLab을 구성하여 아카이브 또는 원본 블롭과 같은 리포지터리 정적 객체를 외부 리포지터리(콘텐츠 전달 네트워크(CDN) 등)에서 제공하도록 구성합니다.

외부 리포지터리 구성

정적 객체를 위해 외부 리포지터리를 구성하려면 다음을 수행합니다:

  1. 왼쪽 사이드바에서 맨 아래에서 관리 영역을 선택합니다.
  2. 설정 > 리포지터리를 선택합니다.
  3. 리포지터리 정적 객체를 위한 외부 리포지터리를 확장합니다.
  4. 기본 URL 및 임의의 토큰을 입력합니다. 외부 리포지터리 설정을 수행할 때, 이러한 값을 ORIGIN_HOSTNAMESTORAGE_TOKEN으로 설정하는 스크립트를 사용합니다.
  5. 변경 사항 저장을 선택합니다.

이 토큰은 외부 리포지터리에서 오는 요청을 구별하기 위해 필요하며, 사용자가 외부 리포지터리를 우회하고 응용 프로그램에 직접 액세스하지 못하도록 합니다. GitLab은 외부 리포지터리에서 유래한 요청의 X-Gitlab-External-Storage-Token 헤더에 이 토큰이 설정되기를 예상합니다.

개인 정적 객체 제공

GitLab은 개인 프로젝트에 속하는 정적 객체 URL에 대해 사용자별 토큰을 추가하여 외부 리포지터리가 사용자를 대신 인증할 수 있도록합니다.

외부 리포지터리에서 유래한 요청을 처리할 때, GitLab은 사용자가 요청한 객체에 액세스할 수 있는지 확인하기 위해 다음을 확인합니다:

  • token 쿼리 매개변수
  • X-Gitlab-Static-Object-Token 헤더

요청 흐름 예시

다음 예시에서 요청과 응답의 시퀀스를 보여줍니다:

  • 사용자
  • GitLab
  • 콘텐츠 전달 네트워크
sequenceDiagram User->>GitLab: GET /project/-/archive/master.zip GitLab->>User: 302 Found Note over User,GitLab: Location: https://cdn.com/project/-/archive/master.zip?token=secure-user-token User->>CDN: GET /project/-/archive/master.zip?token=secure-user-token alt 캐시에 있는 객체 없음 CDN->>GitLab: GET /project/-/archive/master.zip Note over CDN,GitLab: X-Gitlab-External-Storage-Token: secure-cdn-token<br/>X-Gitlab-Static-Object-Token: secure-user-token GitLab->>CDN: 200 OK CDN->>User: master.zip else 캐시에 있는 객체 CDN->>GitLab: GET /project/-/archive/master.zip Note over CDN,GitLab: X-Gitlab-External-Storage-Token: secure-cdn-token<br/>X-Gitlab-Static-Object-Token: secure-user-token<br/>If-None-Match: etag-value GitLab->>CDN: 304 Not Modified CDN->>User: master.zip end

외부 리포지터리 설정

이 절차는 외부 리포지터리로 Cloudflare Workers를 사용하지만, 다른 CDN이나 FaaS(FaaS) 시스템도 같은 원리를 사용하여 작동할 수 있어야 합니다.

  1. 아직 수행하지 않았다면 Cloudflare Worker 도메인을 선택합니다.
  2. 다음 스크립트에서 첫 두 상수에 대한 다음 값을 설정합니다:

    • ORIGIN_HOSTNAME: GitLab 설치의 호스트 이름입니다.
    • STORAGE_TOKEN: 임의의 안전한 토큰입니다. UNIX 머신에서 pwgen -cn1 64를 실행하여 토큰을 얻을 수 있습니다. 이를 구성 섹션에 설명된 대로 관리 영역에 저장합니다.

      const ORIGIN_HOSTNAME = 'gitlab.installation.com' // FIXME: SET CORRECT VALUE
      const STORAGE_TOKEN = 'very-secure-token' // FIXME: SET CORRECT VALUE
      const CACHE_PRIVATE_OBJECTS = false
           
      // ... (이하 생략)
      
  3. 이 스크립트로 새 워커를 만듭니다.
  4. ORIGIN_HOSTNAMESTORAGE_TOKEN의 값을 복사합니다. 이 값을 사용하여 정적 객체용 외부 리포지터리를 구성합니다.