[Gitlab/Docker] 깜빡하고 gitlab-secrets.json을 백업하지 않았을 때, CI/CD 페이지가 계속 응답 500을 반환하는 경우

참고: https://gitlab.com/gitlab-org/gitlab-foss/-/issues/47922#note_117669498

백업과 복원은 항상 신중하게

본격적인 글을 적기에 앞서, 당연한 내용이지만 다시 한번 강조합니다. 어떠한 중요한 데이터를 백업하고 복원할 때는 항상 빠진게 없는지 신중하게 하시길 바랍니다.

방금 저는 GitLab CI/CD를 구현하려다가 일이 꼬여서 컨테이너를 날리고 Docker for Windows를 재설치해야만 했습니다. 그래서 docker-exec -it gitlab gitlab-backup backup 명령어로 백업을 진행한 뒤, 백업된 .tar 파일을 안전하게 보관한 뒤에 gitlab.rb 파일도 따로 보관했습니다.

그러나, 마음이 급해서 보고도 놓친 것이 있었습니다. gitlab-backup 명령어로 백업이 완료되면 친절하게 gitlab.rbgitlab-secrets.json은 사적인 파일이니 꼭 따로 백업하라고 알려줍니다. 저는 그걸 보고도 무시해버린 것이죠. 지금 와서 다시 생각하면 정말 어이가 없습니다.

그러니 여러분은 백업과 복원을 진행하실 때 항상 신중히, 빼먹는 것이 없도록 하시기 바랍니다.

gitlab-secrets.json이 없으면 생기는 상황

위에 적었다시피, 저는 CI/CD 기능을 사용하기 위해 이러한 일련의 삽질을 하는 중이었습니다. 그래서 재설치도 하고 복원도 했으니 신나는 마음으로 설정을 위해 프로젝트 CI/CD 페이지에 들어갔죠.

하지만 보이는 것은 500 에러 화면 뿐이었습니다.

뭐지? 인스턴스가 시작되자마자 페이지에 들어와서 뭐가 로딩이 덜 됐나? 하는 어리석은 생각을 하며 새로고침을 계속 해봤으나 여전히 보이는 화면은 500… 여기서부터 뭔가 잘못됐다고 느끼기 시작했습니다.

갓-구글

생각보다 원인은 쉽게 찾을 수 있었습니다. 구글에 gitlab ci cd 500 이라고 검색하고 나온 상위 문서 몇 개 중에 backup/restore 관련 문제일 수 있다는 글이 있었거든요. 네. 맞습니다. 지금까지도 gitlab-secrets.json과 관련된 문제라고는 생각하지 못하고 있었습니다.

아무튼, 그렇게 하나 하나 문서를 살펴보다 보니 슬슬 윤곽이 잡히기 시작하는 겁니다. 아. 백업 할 때 그걸 잊었구나.

해결 방법

그래서 일단 제가 알고 있는 도구 중에 쓸만한 방법을 시도했습니다. gitlab-rails db:migrate를 포함해 이것저것 해봤으나 아무것도 효과가 없었습니다. 저는 이제서야 본문 최상단에 위치한 참고 링크를 천천히 읽어보기 시작했습니다.

그리고 바로 저 댓글을 찾아냈죠. gitlab-psql 계정으로 스위치한 뒤 psql -h /var/opt/gitlab/postgresql/ gitlabhq_production 을 실행하고, INSERT INTO proejct_ci_cd_settings (project_id) SELECT id FROM projects ON CONFLICT (project_id) DO NOTHING; SQL을 실행하라는 것이었습니다.

그래서 저는 망설이지 않고 바로 따라하려 했으나, 여기에서도 문제가 있었습니다. 바로 psql 명령어를 찾을 수 없다는 것이었죠.

분명 유저를 스위치하기 전에는 잘 작동했습니다. 하지만 gitlab-psql 계정에서는 명령어를 찾지 못하더라고요.

그래서 일단 다시 root 계정으로 돌아가 whereis psql을 입력해 위치를 보니 /opt/gitlab/embedded/bin/psql 경로에 위치하고 있었습니다.

경로도 알았겠다, 다시 돌아가 psql 부분을 /opt/gitlab/embedded/bin/psql로 바꾼 뒤 명령어를 실행하고 SQL을 실행한 뒤 gitlab 페이지를 새로고침하니…!

끝.


추가: https://docs.gitlab.com/ee/raketasks/backup_restore.html#when-the-secrets-file-is-lost



댓글

이 블로그의 인기 게시물

C# 남아도는 메모리에도 불구하고 OutOfMemoryException이 발생한다면?

USB를 뒤는 괜찮은데 앞에 꽂으면 인식이 힘들다?

MySQL 데이터 타입과 Java 데이터 타입 비교/매칭