- 독립 Gitaly 서버 사용 시 버전 확인
- 스토리지 리소스 세부정보 찾기
gitaly-debug
사용- 문제 해결 시 Git이 필요할 때
gitaly git
사용 - 커밋, 푸시 및 클론이 401을 반환
- 리포지토리 페이지에서 500 및
폴더 콘텐츠 가져오기
오류 - 클라이언트 측 gRPC 로그
- 서버 측 gRPC 로그
- Git 프로세스를 RPC와 연관시키기
- 리포지토리 변경이
401 Unauthorized
오류로 실패 - 리포지토리 푸시가
401 Unauthorized
및JWT::VerificationError
로 실패하는 경우 - 명령줄 도구가 Gitaly에 연결할 수 없는 경우
- 리포지토리에 접근할 때 Gitaly 또는 Praefect 로그에 나타나는 권한 거부 오류
- Gitaly가 재구성 후 새 주소에서 수신 대기하지 않음
- 독립형 Gitaly 노드에서 레포지토리에 접근 시 Gitaly 로그의 오류
- 헬스 체크 경고
- 파일을 찾을 수 없는 오류
- Dynatrace가 활성화되면 Git 푸시가 느림
gitaly check
가401
상태 코드로 실패- Gitaly TLS를 사용할 때 새 병합 요청에 대한 변경 사항(차이)이 로드되지 않음
- Gitaly의
noexec
파일 시스템에서 프로세스 포크 실패 - 커밋 서명 오류 발생:
invalid argument
또는invalid data
- Gitaly 로그에서
info
메시지의 오류 표시 - Gitaly 프로파일링
- GitLab 복원 후 리포지토리가 비어 있는 것으로 표시됨
Pre-receive hook declined
오류 RHEL 인스턴스에fapolicyd
가 활성화된 상태에서 푸시할 때- 중복 경로가 있는 저장소 제거 후 저장소 업데이트
Gitaly 문제 해결
Gitaly 문제를 해결할 때 아래 정보를 참조하세요. Gitaly Cluster(Praefect) 문제 해결에 대한 정보는
Gitaly Cluster 문제 해결을 참조하세요.
다음 섹션에서는 Gitaly 오류에 대한 가능한 해결책을 제공합니다.
또한 Gitaly 타임아웃 설정과
gitaly/current
파일을 파싱하는 방법에 대한 조언도 확인하세요.
독립 Gitaly 서버 사용 시 버전 확인
독립 Gitaly 서버를 사용할 때는 GitLab과 동일한 버전인지 확인하여
완전한 호환성을 보장해야 합니다:
- 왼쪽 사이드바 하단에서 Admin을 선택합니다.
- Overview > Gitaly servers를 선택합니다.
- 모든 Gitaly 서버가 최신 상태인지 확인합니다.
스토리지 리소스 세부정보 찾기
다음 명령어를 Rails 콘솔에서 실행하여
Gitaly 스토리지의 사용 가능 및 사용 공간을 확인할 수 있습니다:
Gitlab::GitalyClient::ServerService.new("default").storage_disk_statistics
# Gitaly Cluster의 경우
Gitlab::GitalyClient::ServerService.new("<storage name>").disk_statistics
gitaly-debug
사용
gitaly-debug
명령은 Gitaly 및 Git 성능을 위한 “프로덕션 디버깅” 도구를 제공합니다.
이는 프로덕션 엔지니어와 지원 엔지니어가 Gitaly 성능 문제를 조사하는 데 도움을 주기 위해 설계되었습니다.
지원되는 하위 명령어 목록을 보려면 gitaly-debug
의 도움말 페이지를 실행하세요:
gitaly-debug -h
문제 해결 시 Git이 필요할 때 gitaly git
사용
디버깅 또는 테스트 목적으로 Gitaly와 동일한 Git 실행 환경을 사용하여 Git 명령을 실행하려면
gitaly git
를 사용하세요. gitaly git
는 버전 호환성을 보장하기 위한 기본 방법입니다.
gitaly git
는 모든 인수를 기본 Git 호출로 전달하며
Git이 지원하는 모든 형태의 입력을 지원합니다. gitaly git
를 사용하려면 다음을 실행하세요:
sudo -u git -- /opt/gitlab/embedded/bin/gitaly git <git-command>
예를 들어, 리포지토리의 작업 디렉토리에서 Gitaly를 통해 git ls-tree
를 실행하려면:
sudo -u git -- /opt/gitlab/embedded/bin/gitaly git ls-tree --name-status HEAD
커밋, 푸시 및 클론이 401을 반환
remote: GitLab: 401 Unauthorized
gitlab-secrets.json
파일을 GitLab 애플리케이션 노드와 동기화해야 합니다.
리포지토리 페이지에서 500 및 폴더 콘텐츠 가져오기
오류
Fetching folder content
및 일부 경우 500
오류는 GitLab과 Gitaly 간의 연결 문제를 나타냅니다.
상세 정보를 보려면 클라이언트 측 gRPC 로그를 참조하세요.
클라이언트 측 gRPC 로그
Gitaly는 gRPC RPC 프레임워크를 사용합니다. Ruby gRPC 클라이언트는
Gitaly 오류를 확인할 때 유용한 정보를 포함할 수 있는 자체 로그 파일을 가지고 있습니다.
gRPC 클라이언트의 로그 수준은 GRPC_LOG_LEVEL
환경 변수를 사용하여 제어할 수 있습니다.
기본 수준은 WARN
입니다.
gRPC 추적을 실행하려면:
sudo GRPC_TRACE=all GRPC_VERBOSITY=DEBUG gitlab-rake gitlab:gitaly:check
이 명령이 모든 주소에 연결 실패
오류로 실패하면 SSL 또는 TLS 문제를 확인하세요:
/opt/gitlab/embedded/bin/openssl s_client -connect <gitaly-ipaddress>:<port> -verify_return_error
Verify return code
필드가
알려진 Linux 패키지 설치 구성 문제를 나타내는지 확인하세요.
openssl
이 성공하지만 gitlab-rake gitlab:gitaly:check
가 실패하는 경우,
Gitaly에 대한 인증서 요구 사항을 확인하세요.
서버 측 gRPC 로그
gRPC 추적은 GODEBUG=http2debug
환경 변수를 사용하여 Gitaly 자체에서 활성화할 수도 있습니다. Linux 패키지 설치에서 이를 설정하려면:
-
gitlab.rb
파일에 다음 내용을 추가합니다:gitaly['env'] = { "GODEBUG=http2debug" => "2" }
-
GitLab 재구성합니다.
Git 프로세스를 RPC와 연관시키기
때때로 특정 Git 프로세스를 생성한 Gitaly RPC를 찾아야 할 필요가 있습니다.
이 작업을 수행하는 한 가지 방법은 DEBUG
로깅을 사용하는 것입니다. 하지만 이는 사전에 활성화해야 하며, 생성된 로그는 다소 상세합니다.
이 상관관계를 확인하기 위한 가벼운 방법은 Git 프로세스의 환경을 검사하고 CORRELATION_ID
변수를 살펴보는 것입니다:
PID=<Git process ID>
sudo cat /proc/$PID/environ | tr '\0' '\n' | grep ^CORRELATION_ID=
이 방법은 git cat-file
프로세스에 대해 신뢰할 수 없는데, Gitaly가 내부적으로 이를 풀링하고 RPC 간에 재사용하기 때문입니다.
리포지토리 변경이 401 Unauthorized
오류로 실패
Gitaly를 단독 서버에서 실행하고 다음과 같은 조건이 발생하는 경우:
- 사용자가 SSH 및 HTTPS를 사용하여 리포지토리를 성공적으로 클론하고 가져올 수 있습니다.
- 사용자가 리포지토리에 푸시할 수 없거나 웹 UI에서 변경을 시도할 때
401 Unauthorized
메시지를 받습니다.
Gitaly는 잘못된 비밀 파일로 인해 Gitaly 클라이언트와 인증에 실패할 수 있습니다.
다음이 모두 사실인지 확인하세요:
-
어떤 사용자가 이 Gitaly 서버의 리포지토리에
git push
를 수행할 때401 Unauthorized
오류가 발생합니다:remote: GitLab: 401 Unauthorized To <REMOTE_URL> ! [remote rejected] branch-name -> branch-name (pre-receive hook declined) error: failed to push some refs to '<REMOTE_URL>'
- 어떤 사용자가 GitLab UI를 사용하여 리포지토리에서 파일을 추가하거나 수정할 때 즉시 빨간색
401 Unauthorized
배너가 표시됩니다. - 새 프로젝트를 생성하고 README로 초기화할 경우 프로젝트는 성공적으로 생성되지만 README는 생성되지 않습니다.
-
Gitaly 클라이언트에서 로그를 tailing 할 때 오류를 재현하면
/api/v4/internal/allowed
엔드포인트에 도달할 때401
오류가 발생합니다:# api_json.log { "time": "2019-07-18T00:30:14.967Z", "severity": "INFO", "duration": 0.57, "db": 0, "view": 0.57, "status": 401, "method": "POST", "path": "\/api\/v4\/internal\/allowed", "params": [ { "key": "action", "value": "git-receive-pack" }, { "key": "changes", "value": "REDACTED" }, { "key": "gl_repository", "value": "REDACTED" }, { "key": "project", "value": "\/path\/to\/project.git" }, { "key": "protocol", "value": "web" }, { "key": "env", "value": "{\"GIT_ALTERNATE_OBJECT_DIRECTORIES\":[],\"GIT_ALTERNATE_OBJECT_DIRECTORIES_RELATIVE\":[],\"GIT_OBJECT_DIRECTORY\":null,\"GIT_OBJECT_DIRECTORY_RELATIVE\":null}" }, { "key": "user_id", "value": "2" }, { "key": "secret_token", "value": "[FILTERED]" } ], "host": "gitlab.example.com", "ip": "REDACTED", "ua": "Ruby", "route": "\/api\/:version\/internal\/allowed", "queue_duration": 4.24, "gitaly_calls": 0, "gitaly_duration": 0, "correlation_id": "XPUZqTukaP3" } # nginx_access.log [IP] - - [18/Jul/2019:00:30:14 +0000] "POST /api/v4/internal/allowed HTTP/1.1" 401 30 "" "Ruby"
이 문제를 해결하려면 Gitaly 서버의 gitlab-secrets.json
파일이 Gitaly 클라이언트의 파일과 일치하는지 확인합니다. 일치하지 않으면 Gitaly 서버의 비밀 파일을 Gitaly 클라이언트에 맞게 업데이트한 후 재구성합니다.
모든 Gitaly 서버 및 클라이언트에서 gitlab-secrets.json
파일이 동일하다는 것을 확인했다면, 애플리케이션이 다른 파일에서 이 비밀을 가져오고 있을 수 있습니다. Gitaly 서버의 config.toml 파일
에서 사용 중인 비밀 파일을 확인할 수 있습니다. 해당 설정이 누락되면 GitLab은 /opt/gitlab/embedded/service/gitlab-rails/.gitlab_shell_secret
에 있는 .gitlab_shell_secret
를 기본 사용합니다.
리포지토리 푸시가 401 Unauthorized
및 JWT::VerificationError
로 실패하는 경우
git push
를 시도할 때 다음과 같은 메시지를 볼 수 있습니다:
-
401 Unauthorized
오류. -
서버 로그에서 다음과 같은 내용:
{ ... "exception.class":"JWT::VerificationError", "exception.message":"Signature verification raised", ... }
이 오류 조합은 GitLab 서버가 GitLab 15.5 이상으로 업그레이드되었으나 Gitaly가 아직 업그레이드되지 않은 경우 발생합니다.
GitLab 15.5부터 GitLab은 공유 비밀 대신 JWT 토큰을 사용하여 GitLab Shell과 인증합니다.
외부 Gitaly 업그레이드에 대한 권장 사항을 따르고 GitLab 서버보다 먼저 Gitaly를 업그레이드해야 합니다.
리포지토리 푸시가 deny updating a hidden ref
오류로 실패하는 경우
Gitaly에는 사용자가 업데이트할 수 없는 읽기 전용 내장 GitLab 참조가 있습니다. 내부 참조를 git push --mirror
로 업데이트하려고 하면 Git은 deny updating a hidden ref
거부 오류를 반환합니다.
읽기 전용 참조는 다음과 같습니다:
- refs/environments/
- refs/keep-around/
- refs/merge-requests/
- refs/pipelines/
브랜치와 태그만 미러 푸시하고 보호된 참조를 미러 푸시하려고 시도하지 않으려면 다음을 실행하세요:
git push origin +refs/heads/*:refs/heads/* +refs/tags/*:refs/tags/*
관리자가 푸시하려는 다른 네임스페이스도 추가 패턴을 통해 포함할 수 있습니다.
명령줄 도구가 Gitaly에 연결할 수 없는 경우
gRPC가 Gitaly 서버에 도달할 수 없는 경우:
- 명령줄 도구로 Gitaly 서버에 연결할 수 없습니다.
- 특정 작업에서
14: Connect Failed
오류 메시지가 발생합니다.
TCP를 사용하여 Gitaly에 도달할 수 있는지 확인하세요:
sudo gitlab-rake gitlab:tcp_check[GITALY_SERVER_IP,GITALY_LISTEN_PORT]
TCP 연결이:
- 실패하면 네트워크 설정 및 방화벽 규칙을 확인합니다.
- 성공하면 네트워킹 및 방화벽 규칙이 올바릅니다.
Bash와 같은 명령줄 환경에서 프록시 서버를 사용하는 경우 이는 gRPC 트래픽에 방해가 될 수 있습니다.
Bash 또는 호환 가능한 명령줄 환경을 사용하고 있는 경우, 다음 명령을 실행하여 프록시 서버가 구성되어 있는지 확인하세요:
echo $http_proxy
echo $https_proxy
이 변수 중 하나라도 값이 있으면 Gitaly CLI 연결이 Gitaly에 연결할 수 없는 프록시를 통해 라우팅되고 있을 수 있습니다.
프록시 설정을 제거하려면 (어떤 변수가 값이 있었는지에 따라) 다음 명령을 실행하세요:
unset http_proxy
unset https_proxy
리포지토리에 접근할 때 Gitaly 또는 Praefect 로그에 나타나는 권한 거부 오류
Gitaly 및 Praefect 로그에서 다음과 같은 내용을 볼 수 있습니다:
{
...
"error":"rpc error: code = PermissionDenied desc = permission denied",
"grpc.code":"PermissionDenied",
"grpc.meta.client_name":"gitlab-web",
"grpc.request.fullMethod":"/gitaly.ServerService/ServerInfo",
"level":"warning",
"msg":"finished unary call with code PermissionDenied",
...
}
이 로그의 정보는 gRPC 호출 오류 응답 코드입니다.
이 오류가 발생하면, Gitaly 인증 토큰이 올바르게 설정되어 있어도, Gitaly 서버에서 시계 드리프트가 발생하고 있는 것일 수 있습니다. Gitaly로 전송되는 인증 토큰에는 타임스탬프가 포함되어 있습니다. 유효하다고 간주되려면 Gitaly는 해당 타임스탬프가 Gitaly 서버 시간의 60초 이내여야 합니다.
Gitaly 클라이언트와 서버가 동기화되었는지 확인하고, 네트워크 시간 프로토콜(NTP) 시간 서버를 사용하여 동기화를 유지합니다.
Gitaly가 재구성 후 새 주소에서 수신 대기하지 않음
gitaly['configuration'][:listen_addr]
또는 gitaly['configuration'][:prometheus_listen_addr]
값을 업데이트할 때, Gitaly가 sudo gitlab-ctl reconfigure
후에도 이전 주소에서 계속 수신 대기할 수 있습니다.
이 경우, 문제를 해결하기 위해 sudo gitlab-ctl restart
를 실행하세요. 이는 더 이상 필요하지 않아야 하며, 이 문제는 해결되었습니다.
독립형 Gitaly 노드에서 레포지토리에 접근 시 Gitaly 로그의 오류
독립형 Gitaly 노드에서 레포지토리에 접근할 때 Gitaly 로그에서 권한 거부 오류를 볼 수 있습니다. 이 오류는 파일 권한이 올바르더라도 발생합니다.
Gitaly 노드가 시계 드리프트를 경험하고 있을 가능성이 높습니다.
가능하다면 GitLab과 Gitaly 노드가 동기화되어 있는지 확인하고 NTP 시간 서버를 사용하여 동기화 상태를 유지하세요.
헬스 체크 경고
/var/log/gitlab/praefect/current
에서 다음 경고는 무시할 수 있습니다.
"error":"full method name not found: /grpc.health.v1.Health/Check",
"msg":"error when looking up method info"
파일을 찾을 수 없는 오류
/var/log/gitlab/gitaly/current
에서 다음 오류는 무시할 수 있습니다.
이 오류는 GitLab Rails 응용 프로그램이 레포지토리에 존재하지 않는 특정 파일을 확인할 때 발생합니다.
"error":"not found: .gitlab/route-map.yml"
"error":"not found: Dockerfile"
"error":"not found: .gitlab-ci.yml"
Dynatrace가 활성화되면 Git 푸시가 느림
Dynatrace는 sudo -u git -- /opt/gitlab/embedded/bin/gitaly-hooks
참조 트랜잭션 훅이 시작되고 종료되는 데 몇 초가 걸리도록 만들 수 있습니다. 사용자가 푸시할 때 gitaly-hooks
가 두 번 실행되므로 상당한 지연이 발생합니다.
Dynatrace가 활성화된 상태에서 Git 푸시가 너무 느린 경우 Dynatrace를 비활성화하세요.
gitaly check
가 401
상태 코드로 실패
gitaly check
는 Gitaly가 내부 GitLab API에 접근할 수 없는 경우 401
상태 코드로 실패할 수 있습니다.
이를 해결하는 한 가지 방법은 gitlab.rb
의 GitLab 내부 API URL에 대한 항목이 올바른지 확인하는 것입니다. 이는 gitlab_rails['internal_api_url']
로 설정되어야 합니다.
Gitaly TLS를 사용할 때 새 병합 요청에 대한 변경 사항(차이)이 로드되지 않음
Gitaly with TLS를 활성화한 후, 새 병합 요청에 대한 변경 사항(차이)이 생성되지 않으며 GitLab에서 다음 메시지를 볼 수 있습니다.
병합 요청을 구축하는 중입니다... 빌드가 완료되면 이 페이지가 업데이트됩니다.
Gitaly가 일부 작업을 완료하기 위해 스스로 연결할 수 있어야 합니다. Gitaly 인증서가 Gitaly 서버에 의해 신뢰되지 않는 경우 병합 요청 차이를 생성할 수 없습니다.
Gitaly가 스스로 연결할 수 없는 경우, 다음과 같은 메시지를 Gitaly 로그에서 볼 수 있습니다.
{
"level":"warning",
"msg":"[core] [Channel #16 SubChannel #17] grpc: addrConn.createTransport failed to connect to {Addr: \"ext-gitaly.example.com:9999\", ServerName: \"ext-gitaly.example.com:9999\", }. Err: connection error: desc = \"transport: authentication handshake failed: tls: failed to verify certificate: x509: certificate signed by unknown authority\"",
"pid":820,
"system":"system",
"time":"2023-11-06T05:40:04.169Z"
}
{
"level":"info",
"msg":"[core] [Server #3] grpc: Server.Serve failed to create ServerTransport: connection error: desc = \"ServerHandshake(\\\"x.x.x.x:x\\\") failed: wrapped server handshake: remote error: tls: bad certificate\"",
"pid":820,
"system":"system",
"time":"2023-11-06T05:40:04.169Z"
}
문제를 해결하려면 Gitaly 서버의 /etc/gitlab/trusted-certs
폴더에 Gitaly 인증서를 추가했는지 확인하고:
-
GitLab 재구성하기하여 인증서가 심볼릭 링크 되도록 하세요.
-
Gitaly 프로세스가 인증서를 로드할 수 있도록 수동으로 Gitaly를 재시작하세요:
sudo gitlab-ctl restart gitaly
.
Gitaly의 noexec
파일 시스템에서 프로세스 포크 실패
마운트 지점에 noexec
옵션을 적용하면 (예: /var
) Gitaly에서 프로세스 포크와 관련된 permission denied
오류가 발생합니다. 예를 들어:
fork/exec /var/opt/gitlab/gitaly/run/gitaly-2057/gitaly-git2go: permission denied
이 문제를 해결하려면 파일 시스템 마운트에서 noexec
옵션을 제거하십시오. 대안으로 Gitaly 런타임 디렉토리를 변경할 수 있습니다:
-
/etc/gitlab/gitlab.rb
에gitaly['runtime_dir'] = '<PATH_WITH_EXEC_PERM>'
를 추가하고noexec
가 설정되지 않은 위치를 지정합니다. -
sudo gitlab-ctl reconfigure
를 실행합니다.
커밋 서명 오류 발생: invalid argument
또는 invalid data
커밋 서명이 다음 오류 중 하나로 실패하는 경우:
invalid argument: signing key is encrypted
invalid data: tag byte does not have MSB set
이 오류는 Gitaly 커밋 서명이 헤드리스 상태이고 특정 사용자와 연결되지 않았기 때문에 발생합니다. GPG 서명 키는 비밀번호 없이 생성되어야 하며, 내보내기 전에 비밀번호를 제거해야 합니다.
Gitaly 로그에서 info
메시지의 오류 표시
GitLab 16.3에서 도입된 버그로 인해 추가 항목이 Gitaly 로그에 기록되었습니다. 이러한 로그 항목은 "level":"info"
를 포함하고 있지만 msg
문자열은 오류를 포함한 것으로 보였습니다.
예를 들어:
{"level":"info","msg":"[core] [Server #3] grpc: Server.Serve failed to create ServerTransport: connection error: desc = \"ServerHandshake(\\\"x.x.x.x:x\\\") failed: wrapped server handshake: EOF\"","pid":6145,"system":"system","time":"2023-12-14T21:20:39.999Z"}
이 로그 항목의 이유는 기본 gRPC 라이브러리가 때때로 자세한 전송 로그를 출력하기 때문입니다. 이러한 로그 항목은 오류처럼 보이지만, 일반적으로 무시해도 안전합니다.
이 버그는 GitLab 16.4.5, 16.5.5 및 16.6.0에서 수정되었습니다, 이로 인해 이러한 유형의 메시지가 Gitaly 로그에 기록되는 것을 방지합니다.
Gitaly 프로파일링
Gitaly는 Prometheus 리스닝 포트에서 여러 Go 내장 성능 프로파일링 도구를 노출합니다. 예를 들어, Prometheus가 GitLab 서버의 포트 9236
에서 리스닝하고 있는 경우:
-
실행 중인
goroutines
목록과 그 백트레이스를 가져옵니다:curl --output goroutines.txt "http://<gitaly_server>:9236/debug/pprof/goroutine?debug=2"
-
30초 동안 CPU 프로파일을 실행합니다:
curl --output cpu.bin "http://<gitaly_server>:9236/debug/pprof/profile"
-
힙 메모리 사용량을 프로파일링합니다:
curl --output heap.bin "http://<gitaly_server>:9236/debug/pprof/heap"
-
5초 실행 추적을 기록합니다. 이는 실행 중 Gitaly 성능에 영향을 미칩니다:
curl --output trace.bin "http://<gitaly_server>:9236/debug/pprof/trace?seconds=5"
go
가 설치된 호스트에서 CPU 프로파일과 힙 프로파일을 브라우저에서 볼 수 있습니다:
go tool pprof -http=:8001 cpu.bin
go tool pprof -http=:8001 heap.bin
실행 추적은 다음을 실행하여 볼 수 있습니다:
go tool trace heap.bin
프로파일 Git 작업
- GitLab 16.9에서 도입됨
log_git_traces
라는 플래그와 함께. 기본적으로 비활성화됨.
자체 관리 GitLab에서는 기본적으로 이 기능을 사용할 수 없습니다. 사용 가능하게 하려면, 관리자가 기능 플래그를 활성화해야 합니다
log_git_traces
라는 이름으로. GitLab.com에서는 이 기능이 사용 가능하지만 GitLab.com 관리자만 구성할 수 있습니다. GitLab Dedicated에서는 이 기능을 사용할 수 없습니다.Gitaly에서 수행하는 Git 작업에 대한 추가 정보를 Gitaly 로그에 보내 프로파일링할 수 있습니다. 이 정보로 사용자는 성능 최적화, 디버깅 및 일반 텔레메트리 수집을 위한 인사이트를 더 얻을 수 있습니다. 자세한 내용은 Git Trace2 API 참조를 참조하세요.
시스템 과부하를 방지하기 위해, 추가 정보 로그는 속도 제한이 있습니다. 속도 제한이 초과되면, 추적이 건너뛰어집니다. 그러나 속도가 건강한 상태로 돌아온 후, 추적이 다시 자동으로 처리됩니다. 속도 제한은 시스템이 안정적으로 유지되도록 하고 지나치게 많은 추적 처리로 인한 부정적인 영향을 피하도록 보장합니다.
GitLab 복원 후 리포지토리가 비어 있는 것으로 표시됨
보안을 강화하기 위해 fapolicyd
를 사용하는 경우, GitLab은 GitLab 백업 파일에서 복원이 성공했음을 보고할 수 있지만:
- 리포지토리가 비어 있는 것으로 표시됩니다.
-
새 파일 생성 시 비슷한 오류가 발생합니다:
13:commit: commit: starting process [/var/opt/gitlab/gitaly/run/gitaly-5428/gitaly-git2go -log-format json -log-level -correlation-id 01GP1383JV6JD6MQJBH2E1RT03 -enabled-feature-flags -disabled-feature-flags commit]: fork/exec /var/opt/gitlab/gitaly/run/gitaly-5428/gitaly-git2go: operation not permitted.
-
Gitaly 로그에는 비슷한 오류가 포함될 수 있습니다:
"error": "exit status 128, stderr: \"fatal: cannot exec '/var/opt/gitlab/gitaly/run/gitaly-5428/hooks-1277154941.d/reference-transaction': Operation not permitted\\nfatal: cannot exec '/var/opt/gitlab/gitaly/run/gitaly-5428/hooks-1277154941.d/reference-transaction': Operation not permitted\\nfatal: ref updates aborted by hook\\n\"", "grpc.code": "Internal", "grpc.meta.deadline_type": "none", "grpc.meta.method_type": "client_stream", "grpc.method": "FetchBundle", "grpc.request.fullMethod": "/gitaly.RepositoryService/FetchBundle", ...
디버그 모드를 사용하여 fapolicyd
가 현재 규칙에 따라 실행을 거부하고 있는지 확인할 수 있습니다.
fapolicyd
가 실행을 거부하고 있음을 발견한 경우 다음을 고려하세요:
-
fapolicyd
구성에서/var/opt/gitlab/gitaly
의 모든 실행 파일을 허용하세요:allow perm=any all : ftype=application/x-executable dir=/var/opt/gitlab/gitaly/
-
서비스를 재시작하세요:
sudo systemctl restart fapolicyd sudo gitlab-ctl restart gitaly
Pre-receive hook declined
오류 RHEL 인스턴스에 fapolicyd
가 활성화된 상태에서 푸시할 때
fapolicyd
가 활성화된 RHEL 기반 인스턴스에 푸시할 때 Pre-receive hook declined
오류가 발생할 수 있습니다. 이 오류는 fapolicyd
가 Gitaly 바이너리의 실행을 차단할 수 있기 때문에 발생할 수 있습니다. 이 문제를 해결하려면 다음 중 하나를 수행하세요:
-
fapolicyd
비활성화. -
fapolicyd
가 활성화된 상태에서 Gitaly 바이너리 실행을 허용하는fapolicyd
규칙 생성.
Gitaly 바이너리 실행을 허용하는 규칙을 만들려면:
-
/etc/fapolicyd/rules.d/89-gitlab.rules
에 파일 생성. -
파일에 다음 내용을 입력합니다:
allow perm=any all : ftype=application/x-executable dir=/var/opt/gitlab/gitaly/
-
서비스를 재시작합니다:
systemctl restart fapolicyd
새 규칙은 데몬이 재시작된 후에 효과가 발생합니다.
중복 경로가 있는 저장소 제거 후 저장소 업데이트
- Rake 작업
gitlab:gitaly:update_removed_storage_projects
도입됨 GitLab 17.1.
GitLab 17.0에서 중복 경로를 가진 저장소 구성에 대한 지원이 제거됨. 이는 gitaly
구성에서 중복 저장소 구성을 제거해야 함을 의미할 수 있습니다.
경고: 구형 저장소와 신형 저장소가 동일한 Gitaly 서버의 동일한 디스크 경로를 공유하는 경우에만 이 Rake 작업을 사용하세요. 다른 상황에서 이 Rake 작업을 사용하면 저장소가 사용할 수 없게 됩니다. 다른 모든 상황에서는 프로젝트 저장소 이동 API를 사용하여 저장소 간에 프로젝트를 이동하세요.
Gitaly 구성에서 다른 저장소와 동일한 경로를 사용하는 저장소를 제거할 때, 구형 저장소와 관련된 프로젝트는 신형 저장소로 재배정되어야 합니다.
예를 들어, 다음과 유사한 구성이 있을 수 있습니다:
gitaly['configuration'] = {
storage: [
{
name: 'default',
path: '/var/opt/gitlab/git-data/repositories',
},
{
name: 'duplicate-path',
path: '/var/opt/gitlab/git-data/repositories',
},
],
}
구성에서 duplicate-path
를 제거하는 경우, 할당된 프로젝트를 default
와 연결하기 위해 다음 Rake 작업을 실행합니다:
sudo gitlab-rake "gitlab:gitaly:update_removed_storage_projects[duplicate-path, default]"
sudo -u git -H bundle exec rake "gitlab:gitaly:update_removed_storage_projects[duplicate-path, default]" RAILS_ENV=production