지오 프록시

지오 프록시를 사용하면, 보조 서버는 이제 웹 요청을 기본 서버로 Workhorse를 통해 프록시하므로 두 번째에서 탐색하는 사용자는 읽기-쓰기 UI를 볼 수 있으며 기본 서버에서 수행할 수 있는 모든 작업을 수행할 수 있습니다.

요청 수명주기

최상위 수준 뷰

프록시 상호 작용은 다음 다이어그램을 통해 고수준으로 설명할 수 있습니다:

sequenceDiagram actor client participant secondary participant primary client->>secondary: GET /explore secondary-->>primary: GET /explore (프록시됨) primary-->>secondary: HTTP/1.1 200 OK [..] secondary->>client: HTTP/1.1 200 OK [..]

프록시 감지 메커니즘

지오가 활성화되면 프록시를 기본 서버로 전달해야 할지 여부 및 기본 서버의 URL(데이터베이스에 저장된 대로)를 알기 위해 Workhorse는 내부 API를 주기적으로 폴링합니다. 프록시를 활성화해야 할 경우 내부 API는 모든 요청에 대해 기본 URL 및 JWT로 서명된 데이터를 응답합니다.

sequenceDiagram participant W as Workhorse (secondary) participant API as 내부 Rails API W->API: GET /api/v4/geo/proxy (내부) loop 10초마다 폴링 API-->W: {geo_proxy_primary_url, geo_proxy_extra_data}, 구성 업데이트 end

심층 요청 흐름 및 프록시링과 로컬 데이터 가속 비교

상세한 구현은, 요청된 보조 Workhorse에서 데이터를 프록시할지 여부를 결정합니다. 데이터 유형을 “가속”할 수 있는 경우(즉, 라운드트립 요청을 저장할 수 있는 경우) 데이터를 즉시 반환합니다. 그렇지 않으면, 트래픽이 기본 내부 URL로 보내지며, 기본에서 Workhorse에 의해 정확히 직접 요청한 것처럼 제공됩니다. 그런 다음 응답은 동일한 연결을 통해 보조 Workhorse를 통해 사용자에게 프록시됩니다.

flowchart LR A[Client]--->W1["Workhorse (secondary)"] W1 --> W1C[로컬에서 데이터 제공?] W1C -- "네" ----> W1 W1C -- "아니오 (프록시)" ----> W2["Workhorse (primary)"] W2 --> W1 ----> A

로그인

기본 서버로 프록시된 요청에 대한 권한 부여 필요

sequenceDiagram autoNumber participant Client participant Secondary participant Primary Client->>Secondary: `/group/project` 요청 Secondary->>Primary: 기본 /group/project 프록시 opt 기본 서버에 로그인되지 않음 Primary-->>Secondary: 302 리디렉트 Secondary-->>Client: 302 리디렉트 프록시 Client->>Secondary: 사용자/sign_in Secondary->>Primary: 기본 /사용자/sign_in 프록시 Note right of Primary: 인증 수행, 동일한 URL에 대한 POST 등 Primary-->>Secondary: 302 리디렉트 Secondary-->>Client: 302 리디렉트 프록시 Client->>Secondary: /group/project Secondary->>Primary: 기본 /group/project 프록시 end Primary-->>Secondary: 로그인한 /group/project 응답(기본에 세션 생성됨) Secondary-->>Client: 전체 응답 프록시

Git pull

역사적인 이유로, push_from_secondary 경로를 사용하여 Git pull을 전달합니다. 이 경로의 이름을 변경하여 혼란을 피하기 위한 이슈가 제안되었습니다.

HTTP(s)를 통한 Git pull

가속화된 저장소

보조 서버에 저장소가 있고 이것이 주 서버와 동기화된 것으로 감지되면, 프록시하지 않고 직접 제공합니다.

sequenceDiagram participant C as Git client participant Wsec as "Workhorse (secondary)" participant Rsec as "Rails (secondary)" participant Gsec as "Gitaly (secondary)" C->>Wsec: GET /foo/bar.git/info/refs/?service=git-upload-pack Wsec->>Rsec: <내부 API 확인> note over Rsec: 저장소가 동기화되었고 최신 상태임을 결정 Rsec-->>Wsec: 401 Unauthorized Wsec-->>C: <응답> C->>Wsec: GET /foo/bar.git/info/refs/?service=git-upload-pack Wsec->>Rsec: <내부 API 확인> Rsec-->>Wsec: Workhorse OK 렌더링 Wsec-->>C: 200 OK C->>Wsec: POST /foo/bar.git/git-upload-pack Wsec->>Rsec: GitHttpController#git_receive_pack Rsec-->>Wsec: Workhorse OK 렌더링 Wsec->>Gsec: Workhorse는 Rails로부터 연결 세부 정보를 받아 Gitaly에 연결: SmartHTTP Service, UploadPack RPC (세부 사항 확인) Gsec-->>Wsec: Proto 메시지 스트림 반환 Wsec-->>C: Git 클라이언트에 메시지 전달

프록시된 저장소

요청된 저장소가 동기화되지 않았거나 최신 상태가 아니라면, 요청은 최신 변경 사항을 가져오기 위해 기본 서버로 프록시됩니다.

sequenceDiagram participant C as Git client participant Wsec as "Workhorse (secondary)" participant Rsec as "Rails (secondary)" participant W as "Workhorse (primary)" participant R as "Rails (primary)" participant G as "Gitaly (primary)" C->>Wsec: GET /foo/bar.git/info/refs/?service=git-upload-pack Wsec->>Rsec: <응답> note over Rsec: 저장소가 최신 상태가 아니라고 결정 Rsec-->>Wsec: /-/push_from_secondary/2/foo/bar.git/info/refs?service=git-upload-pack로 리디렉트 302 Wsec-->>C: <응답> C->>Wsec: GET /-/push_from_secondary/2/foo/bar.git/info/refs/?service=git-upload-pack Wsec->>W: <프록시된 요청> W->>R: <데이터> R-->>W: 401 Unauthorized W-->>Wsec: <프록시된 응답> Wsec-->>C: <응답> C->>Wsec: GET /-/push_from_secondary/2/foo/bar.git/info/refs/?service=git-upload-pack note over W: 프록시됨 Wsec->>W: <프록시된 요청> W->>R: <데이터> R-->>W: Workhorse OK 렌더링 W-->>Wsec: <프록시된 응답> Wsec-->>C: <응답> C->>Wsec: POST /-/push_from_secondary/2/foo/bar.git/git-upload-pack Wsec->>W: <프록시된 요청> W->>R: GitHttpController#git_receive_pack R-->>W: Workhorse OK 렌더링 W->>G: Workhorse는 Rails로부터 연결 세부 정보를 받아 Gitaly에 연결: SmartHTTP Service, UploadPack RPC (세부 사항 확인) G-->>W: Proto 메시지 스트림 반환 W-->>Wsec: Git 클라이언트로부터 전달된 메시지 Wsec-->>C: Git에서 전달된 메시지 반환

SSH를 통한 Git pull

SSH 작업은 Workhorse 대신 GitLab Shell을 통해 이루어지므로 Workhorse 요청에 사용되는 메커니즘을 거치지 않습니다. SSH 작업은 보조 레일스 내부 API에 의해 기본 사이트로의 Git HTTP 요청으로 프록시됩니다.

가속화된 저장소

보조 저장소에 저장소가 있고 기본 저장소와 동기화되었음을 감지하면 프록시 처리 대신 직접 제공됩니다.

sequenceDiagram participant C as Git client participant S as GitLab Shell (secondary) participant I as Internal API (secondary Rails) participant G as Gitaly (secondary) C->>S: git pull S->>I: SSH 키 유효성 검사 (api/v4/internal/authorized_keys?key=..) I-->>S: HTTP/1.1 200 OK S->>G: InfoRefs:UploadPack RPC G-->>S: Git 응답 스트리밍 S-->>C: Git 응답 스트리밍 C-->>S: 푸시할 Git 데이터 스트리밍 S->>G: UploadPack RPC G-->>S: Git 응답 스트리밍 S-->>C: Git 응답 스트리밍

프록시된 저장소

요청된 저장소가 동기화되지 않았거나 최신 상태가 아닌 것으로 감지되면 변경 사항의 최신 버전을 가져오기 위해 주요 사이트로 프록시됩니다.

sequenceDiagram participant C as Git client participant S as GitLab Shell (secondary) participant I as Internal API (secondary Rails) participant P as Primary API C->>S: git pull S->>I: SSH 키 유효성 검사 (api/v4/internal/authorized_keys?key=..) I-->>S: HTTP/1.1 300 (사용자 정의 액션 상태) 및 {endpoint, msg, primary_repo}를 포함하는 응답 S->>I: POST /api/v4/geo/proxy_git_ssh/info_refs_upload_pack I->>P: $PRIMARY/foo/bar.git/info/refs/?service=git-upload-pack로 POST P-->>I: HTTP/1.1 200 OK I-->>S: <응답> S-->>C: 주요 사이트에서의 Git 응답 반환 C-->>S: 푸시할 Git 데이터 스트리밍 S->>I: POST /api/v4/geo/proxy_git_ssh/upload_pack I->>P: $PRIMARY/foo/bar.git/git-upload-pack로 POST P-->>I: HTTP/1.1 200 OK I-->>S: <응답> S-->>C: 주요 사이트에서의 Git 응답 반환

Git push

SSH를 통한 Git push

SSH 작업은 Workhorse 대신 GitLab Shell을 통해 이루어지므로 Workhorse 요청에 사용되는 메커니즘을 거치지 않습니다. SSH 작업은 보조 레일스 내부 API에 의해 기본 사이트로의 Git HTTP 요청으로 프록시됩니다.

sequenceDiagram participant C as Git client participant S as GitLab Shell (secondary) participant I as Internal API (secondary Rails) participant P as Primary API C->>S: git push S->>I: SSH 키 유효성 검사 (api/v4/internal/authorized_keys?key=..) I-->>S: HTTP/1.1 300 (사용자 정의 액션 상태) 및 {endpoint, msg, primary_repo}를 포함하는 응답 S->>I: POST /api/v4/geo/proxy_git_ssh/info_refs_receive_pack I->>P: $PRIMARY/foo/bar.git/info/refs/?service=git-receive-pack로 POST P-->>I: HTTP/1.1 200 OK I-->>S: <응답> S-->>C: 주요 사이트에서의 Git 응답 반환 C-->>S: 푸시할 Git 데이터 스트리밍 S->>I: POST /api/v4/geo/proxy_git_ssh/receive_pack I->>P: $PRIMARY/foo/bar.git/git-receive-pack로 POST P-->>I: HTTP/1.1 200 OK I-->>S: <응답> S-->>C: 주요 사이트에서의 Git 응답 반환

HTTP(S)를 통한 Git push

HTTP(S)를 통한 Git push 통합 URL

통합 URL을 통해 푸시가 -/-push_from_secondary/$SECONDARY_ID/*로 서식화된 로컬 경로로 리디렉션됩니다. 이 경로를 통한 추가 요청은 프록시된 후 푸시를 처리할 주요 사이트로 이동됩니다.

sequenceDiagram participant C as Git client participant Wsec as Workhorse (secondary) participant W as Workhorse (primary) participant R as Rails (primary) participant G as Gitaly (primary) C->>Wsec: GET /foo/bar.git/info/refs/?service=git-receive-pack Wsec->>C: 302 Redirect to /-/push_from_secondary/2/foo/bar.git/info/refs?service=git-receive-pack C->>Wsec: GET /-/push_from_secondary/2/foo/bar.git/info/refs/?service=git-receive-pack Wsec->>W: <프록시된 요청> W->>R: <데이터> R-->>W: 401 Unauthorized W-->>Wsec: <프록시된 응답> Wsec-->>C: <응답> C->>Wsec: GET /-/push_from_secondary/2/foo/bar.git/info/refs/?service=git-receive-pack Wsec->>W: <프록시된 요청> W->>R: <데이터> R-->>W: Workhorse OK 렌더링 W-->>Wsec: <프록시된 응답> Wsec-->>C: <응답> C->>Wsec: POST /-/push_from_secondary/2/foo/bar.git/git-receive-pack Wsec->>W: <프록시된 요청> W->>R: GitHttpController:git_receive_pack R-->>W: Workhorse OK 렌더링 W->>G: Rails에서 연결 상세정보 가져오고 SmartHTTP Service에 연결, ReceivePack RPC G-->>W: Proto 메시지 스트림 반환 W-->>Wsec: Git 클라이언트에 메시지 전달 Wsec-->>C: Git에서 전달된 메시지 반환

HTTP(S)를 통한 Git push와 별도의 URL

별도의 URL을 사용하면, 보조 시스템은 $PRIMARY/-/push_from_secondary/$SECONDARY_ID/*와 같은 형식의 URL로 리디렉션됩니다.

sequenceDiagram participant Wsec as Workhorse (secondary) participant C as Git client participant W as Workhorse (primary) participant R as Rails (primary) participant G as Gitaly (primary) C->>Wsec: GET $SECONDARY/foo/bar.git/info/refs/?service=git-receive-pack Wsec->>C: 302 Redirect to $PRIMARY/-/push_from_secondary/2/foo/bar.git/info/refs?service=git-receive-pack C->>W: GET $PRIMARY/-/push_from_secondary/2/foo/bar.git/info/refs/?service=git-receive-pack W->>R: <데이터> R-->>W: 401 Unauthorized W-->>C: <응답> C->>W: GET /-/push_from_secondary/2/foo/bar.git/info/refs/?service=git-receive-pack W->>R: <데이터> R-->>W: Workhorse OK로 렌더링 W-->>C: <응답> C->>W: POST /-/push_from_secondary/2/foo/bar.git/git-receive-pack W->>R: GitHttpController:git_receive_pack R-->>W: Workhorse OK로 렌더링 W->>G: Rails에서 연결 세부정보를 가져와 SmartHTTP 서비스 및 ReceivePack RPC에 연결 G-->>W: Proto 메시지 스트림 반환 W-->>C: Git 클라이언트에 메시지 파이프 전달