지오 프록시
지오 프록시를 사용하면, 보조 서버는 이제 웹 요청을 기본 서버로 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 클라이언트에 메시지 파이프 전달