본문 바로가기
개발자 전향 프로젝트

Docker GitLab 버전 업그레이드 + 프로젝트 백업과 복구

by 샘오리 2024. 7. 12.
728x90
반응형

https://gitlab-com.gitlab.io/support/toolbox/upgrade-path/?current=16.1.6&target=16.11.6&distro=docker&edition=ce

 

Upgrade Path

 

gitlab-com.gitlab.io

깃랩에서 제공하는 Upgrade Path라는 사이트로

본인이 사용하는 깃랩 현재 버전과, 궁극적으로 올리고 싶은 버전을 오른쪽에 기입한다.

 

예시:

 

같은 16 버전에서의 업그레이드는 가능한 것으로 테스트 됐지만

메이저 버전을 17로 올렸을 때 DB Migration의 문제가 있어서 웬만해서는 메이저 버전은 올리지말고

새롭게 받아 구축하는 것을 추천한다.

나의 경우 CE를 사용하고 도커에 띄우기 때문에 위와 같이 설정했다.

GO!를 누르게 되면 

맨 위에 어떤 버전을 순차적으로 거쳐야 하는지 알려준다.

 

그러면 해당 버전을 메모해두고 순차적으로 업그레이드 해주면 된다.

도커의 경우 이미지 버전만 바꿔주면 알아서 해당 이미지를 받고 실행해주기 때문에 편하다.

문제는 저렇게 하위 버전을 올린다고 하더라도 바로 작동하는 것은 아니고 어떤 일련의 업그레이드 프로세스가 존재한다.

 

먼저 가장 중요한 백업과 복구가 있다.

기존에 사용하던 버전에서 백업하는 방법은 아래와 같다.

docker exec -it <컨테이너ID> bash
gitlab-rake gitlab:backup:create

 

위 명령어가 성공적으로 작동하면 도커 깃랩의 경우 백업 기본 경로인 

/var/opt/gitlab/backups

 

아래에 tar 파일이 생기게 된다.

이 경로를 바인드 마운트 했다면 해당 경로에도 생기게 된다.

마운트 하지 않았더라도 docker cp 명령어를 통해 복사해올 수도 있다.

 

일단 docker cp 명령어는 앞에 나오는 경로의 것을 뒤에 나오는 경로로 복사하는 것을 의미한다.

예컨데 docker cp ./백업.tar 컨테이너ID:/var/opt/gitlab/backups

하게 되면 현재 경로에 있는 백업.tar를 컨테이너의 명시된 경로로 복사하라는 의미이고 우리의 경우에는

컨테이너에 생성된 백업 파일을 호스트 pc로 가져와야 하기 때문에 

컨테이너 안으로 들어가서 백업 파일명을 알아내든, 다르게 해서 알아내든 백업 파일명을 알아낸 다음에

호스트 PC 의 원하는 경로로 가서 터미널을 연뒤

반대로

docker cp 컨테이너ID:/etc/gitlab/백업.tar .

 

를 입력하면 된다. 마지막 . 은 현재 위치한 경로를 의미한다.

 

그리고 애초에 백업이 불필요하게 만드는 방법도 있다.

바로 볼륨 OR 바인드 마운트이다.

소스 자체를 도커 볼륨이나 호스트 PC 경로에 두는 마운트 방식은 그 자체로 백업이기 때문에

이미지가 바뀌어서 컨테이너가 새롭게 뜬다고 하더라도 존재하던 파일은 날라가지 않고

다시 마운트된 경로에 복사되어 들어가게 된다.

그래서 도커를 사용한다면 마운트가 굉장히 유용하다고 생각한다.

컴포즈를 사용한다면 아래와 같이 나올 수 있겠다.

    volumes:
      - './gitlab/backup:/var/opt/gitlab/backups'

 

gitlab.rb와 gitlab-secrets.json은 기본 백업 명령어로 백업이 되지 않기 때문에 수동 복구를 하라고 하는데

이것도 그 두 파일의 위치를 마운트 시키거나 cp로 수동으로 백업해두면 된다.

 

복구하는 방법은 아래와 같다.

docker exec -it <컨테이너ID> gitlab-rake gitlab:backup:restore BACKUP=<백업파일명>.tar

 

복구를 하는 것은 일단 버전을 올리고 실행한 뒤 아니겠는가..

 

버전을 올리고 실행을 하기 위해서는

여러 순서가 있는데 맨 위 사이트에서 찾아낸 버전대로 도커 이미지를 바꾸고

 

도커를 실행시킨 뒤 컨테이너 밖에서 아래 명령어를 순차적으로 실행시키면 된다.

1. docker exec -it <컨테이너ID> update-permissions
2. docker exec -it <컨테이너ID> gitlab-ctl restart
3. docker exec -it <컨테이너ID> gitlab-ctl status

 

여기서 아래 그림처럼 나오면 성공한 것이다.

 

4. docker exec -it <컨테이너ID> gitlab-ctl reconfigure

 

참고로 4번 reconfigure 명령어가 환경에 따라 꽤 오래걸릴 수 있다.

저 Reconfigure가 뭐냐면 자동으로 설정이 업데이트 되는데 어떤 이유에서인가 업데이트 되지 않을 경우를 대비해서

수동으로 업데이트를 해주는 것이다. 예로 gitlab.rb 같은 파일.

 

불행하게도 Reconfigure가 안될 때가 있다.

 

CASE 1 ) SIDEKIQ

*sidekiq이란 루비 앱의 비동기 백그라운드 프레임워크이다. 

 

뭐 대충 아래와 비슷한 에러가 떴다는 것은 

FATAL: Mixlib::ShellOut::ShellCommandFailed: sidekiq_service[sidekiq] (gitlab::sidekiq line 23) had an error: Mixlib::ShellOut::ShellCommandFailed: runit_service[sidekiq] (gitlab::sidekiq line 67) had an error: Mixlib::ShellOut::ShellCommandFailed: Expected process to exit with [0], but received '1'
---- Begin output of /opt/gitlab/embedded/bin/sv restart /opt/gitlab/service/sidekiq ----
STDOUT: timeout: down: /opt/gitlab/service/sidekiq: 25s, normally up
STDERR:
---- End output of /opt/gitlab/embedded/bin/sv restart /opt/gitlab/service/sidekiq ----
Ran /opt/gitlab/embedded/bin/sv restart /opt/gitlab/service/sidekiq returned 1

 

Reconfigure을 하다가 보니까 sidekiq이란 녀석이 말을 안들은 것이다.

컴퓨터가 안될 때 옛 어르신들이 그랬다. 껐다 키라고. 그 말은 어떻게 보면 매우 과학적일지도..

바로 껐다 킨다.

 

1. docker exec -it gitlab-web-https gitlab-ctl restart sidekiq
2. docker exec -it gitlab-web-https gitlab-ctl status sidekiq

 

3. docker exec -it gitlab-web-https gitlab-ctl reconfigure

 

이걸로 해결이 되지 않았다면 애석하지만 구글링을 더 해보길 바란다.

 

CASE 2 ) DB CONNECTION / MIGRATION ERROR

1. docker exec -it gitlab-web-https gitlab-rake "gitlab:background_migrations:finalize[ProjectNamespaces::BackfillProjectNamespaces,projects,id,[null,\"up\"]]"
2. docker exec -it gitlab-web-https gitlab-rake db:migrate
3. docker exec -it gitlab-web-https gitlab-ctl reconfigure
4. docker exec -it gitlab-web-https apt dist-upgrade
5. docker exec -it gitlab-web-https gitlab-ctl restart

 

위 명령어를 순차적으로 기입해본다.

근데 나는 해도 안됐다. 아마 버전이 바뀌면서 DB를 Migrate 하는데 수동으로 뭔가를 더 해줘야 하는 것 같은데

메이저 버전을 올리면서 뜬 문제였고 저걸 찾아서 고치기엔 너무 많은 시간이 들어갈 것이라 판단했다.

 

기타

 

뭐가 없어서 안된다고 한다면 도커에서 띄운 이미지에 따라 다른데

보통 debian/ubuntu 의 경우 apt, alpine의 경우 apk로 기억한다.

1. apt-get update && apt-get install unzip
2. apt-get install 설치할 라이브러리

 

위와 같이 하면 도커 내부에서도 라이브러리 다운/설치하는데 문제가 없을 것이다.

728x90
반응형