GitLab docker로 이전

이번에 대대적인(?) 서버 이전을 감행하면서 gitlab을 standalone으로부터 docker 이미지로 바꾸기로 계획했다.

백업

기존 gitlab에서 백업 후 새로 연 docker판 gitlab으로 복원을 위해 먼저 백업/복원 방법을 확인한다.

ref: https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/raketasks/backup_restore.md

Ubuntu 14.04에 apt-get을 통해 설치한 gitlab이므로 백업 방법은 다음과 같다.

sudo gitlab-rake gitlab:backup:create

생성되는 백업 파일은 /var/opt/gitlab/backups/ 아래에 위치한다.
해당 파일을 새 서버로 옮기고 docker판 gitlab으로 복원해야한다.

Docker판 GitLab 설치

ref: https://docs.gitlab.com/omnibus/docker/README.html

일단 서버의 메모리가 2기가 이상의 여유가 있는지 확인하자.
없다면 Swap 설정을 진행해야 한다.

현재 내 환경은 VPS + CloudFlare + HTTPS + apache2 proxy 상태이므로 몇가지 고려할 사항이 있다.
(Apache2 proxy 설정 및 HTTPS 인증서 설정, CloudFlare/DNS 설정 모두가 완료된 상태로 가정한다.)

설정은 그냥 pre-configure 상태로 진행한다. 이렇게 하면 gitlab.rb 파일이나 gitlab.yml 파일을 수정할 필요가 없다.

  • docker를 거치므로 external_url에 따로 포트 설정을 할 필요가 없다.
  • CloudFlare로 인해 SSH 아이피를 따로 지정해줘야 한다.
  • HTTPS는 Apache2가 대응하므로 nginx는 따로 https를 열지 않고, 포트는 포워딩 설정을 해야한다.
  • HTTP 역시 Apache2가 대응하므로 포트포워딩 설정을 진행한다.
  • SSH 포트의 경우 필요하다면 임의의 포트로 연결하고, 아니면 그냥 22번으로 해도 된다.
  • SSH 포트는 반드시 방화벽에서 해제해야 clone 등이 가능하다.
docker pull gitlab/gitlab-ce:latest
docker run --detach \
    --hostname [도메인/호스트네임] \
    --env GITLAB_OMNIBUS_CONFIG="external_url 'https://[도메인]/'; gitlab_rails['gitlab_ssh_host'] = '[실제 아이피주소]'; gitlab_rails['gitlab_shell_ssh_port'] = [SSH포트]; nginx['listen_https'] = false;" \
    --publish [HTTPS포트]:443 --publish [HTTP포트]:80 --publish [SSH포트]:22 \
    --name gitlab \
    --restart always \
    --volume /path/gitlab/config:/etc/gitlab \
    --volume /path/gitlab/logs:/var/log/gitlab \
    --volume /path/gitlab/data:/var/opt/gitlab \
    gitlab/gitlab-ce:latest

위와 같이 run 시키면 첫 실행이 시작된다.
메모리의 여유가 없다면 실행에 실패하게 되니까 주의한다.

방화벽에서 앞서 지정한 SSH포트를 해제한다.

gitlab.rb, gitlab.yml 파일은 신경 쓸 필요 없다.

복원

옮겨온 백업 파일을 /path/gitlab/data/backups로 옮겨둔다.
이 경로는 docker run에서 연결한 볼륨 경로이다.

docker exec -it <name of container> gitlab-rake gitlab:backup:restore
여기서는 컨테이너 이름에, 앞서 지정했던 이름인, gitlab을 입력하면 된다.
이렇게 하면 데이터 복원이 시작되고, 문제없이 진행된다면 저장소, gitlab 계정 등이 모두 복원될 것이다.

단점

Docker 기반의 장점이야 설명할 필요도 없지만 단점은 한가지 두드러지는 점이 있다.
서버 재부팅하면 컨테이너가 다시 시작하는데, 그게 너무 오래 걸린다.
standalone 기반일 땐 그럴 필요가 없었는데, 이번엔 다시 올라가는 동안 기다려야만 한다.