Docker로 GitLab 서버 설치하기

Docker 컨테이너로 GitLab 서버를 설치하고 관련 내용을 정리하였다.

일반적인 GitLab 서버 설치

먼저 간략히 Ubuntu에서 일반적인 GitLab 서버 설치를 알아보면, 대략 아래와 같다.

  1. 우분투 업데이트 및 필요한 패키지를 설치한다.
    sudo apt-get update
    sudo apt-get install -y curl openssh-server ca-certificates
    
  2. 아래와 같이 GitLab 패키지 저장소를 add 한다. (아래 예에서는 Community Edition을 설치하기 위해 gitlab-ce를 사용)
    curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
    
  3. 아래와 같이 설치한다. (아래 예에서는 Community Edition을 설치하기 위해 gitlab-ce를 사용)
    apt-get install gitlab-ce
    
  4. URL 주소나 포트 번호를 변경하려면 /etc/gitlab/gitlab.rb 파일에서 “external_url” 정보를 수정한 후, 아래와 같이 적용해 준다.
    $ sudo gitlab-ctl reconfigure
    

    위의 step 4 과정을 생략하려면, step 3에서 아래와 같이 접속할 호스트 URL을 지정하여 설치하면 된다.

    $ sudo EXTERNAL_URL="your_ip_address" apt-get install gitlab-ce
    
  5. 이제 아래와 같이 GitLab 서비스를 시작/재시작시키면 해당 URL 주소에 접속할 수 있다.
    $ sudo gitlab-ctl restart
    
  6. GitLab 서비스를 중지시키려면 아래와 같이 한다.
    $ sudo gitlab-ctl stop
    

Docker로 GitLab 서버 설치

그런데 오랜만에 팀 개발 서버에 다시 GitLab 서버를 설치하려고 하니, dependency 문제로 제대로 설치가 되지 않았고, 해결이 쉽지 않은 상황이었다.
그래서 간단히 Docker로 설치하기로 하였고 (전에도 테스트로 GitLab, Jenkins, SonarQube를 Docker compose로 설치했었던 적이 있었음) 여기에 설치 이력을 남긴다.

Docker로 GitLab 서버를 설치하기 위해서 GitLab Docker images 페이지를 참조하여, 아래와 같이 설치하였다.

  1. 아래 예와 같이 docker-compose.yml 파일을 작성하였다. (HTTP 접속을 허가하지 않기 위해서 포트 80:80 부분은 의도적으로 제거했음)
    web:
     image: 'gitlab/gitlab-ce:latest'
     restart: always
     hostname: 'your_ip_address'
     environment:
         GITLAB_OMNIBUS_CONFIG: |
             external_url 'https://your_ip_address'
             nginx['ssl_certificate'] = "/etc/gitlab/ssl/server.crt"
             nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/server.key"
     ports:
         - '443:443'
         - '2222:22'
     volumes:
         - '/srv/gitlab/config:/etc/gitlab'
         - '/srv/gitlab/logs:/var/log/gitlab'
         - '/srv/gitlab/data:/var/opt/gitlab'
    
  2. 위의 Docker compose 파일에서 보듯이 호스트의 /srv/gitlab/ 경로를 Docker 볼륨과 연결하므로, 이 경로를 생성하고, HTTPS 접속을 위해 server 인증서를 생성한 후 (HTTPS 용 사설 인증서 만들기 참조), 이 파일들을 /srv/gitlab/config/ssl/ 디렉토리에 저장한다.
  3. 이제 아래와 같이 실행시키면 gitlab 컨테이너가 실행된다. (컨테이너 이름은 gitlab_web_1)
    docker-compose up -d
    
  4. Gitlab 업데이트는 아래와 같이 할 수 있다.
    $ docker-compose pull
    $ docker-compose up -d
    
  5. Gitlab 컨테이너의 config 파일 수정은 아래 예와 같이 할 수 있다. (예: external_url 항목 등)
    $ docker exec -it gitlab_web_1 vi /etc/gitlab/gitlab.rb
    

    Config 파일을 수정한 후에는 아래와 같이 하면 변경된 설정이 적용된다. (대부분의 경우 재시작이 필요없음)

    $ docker exec -t gitlab_web_1 gitlab-ctl reconfigure
    
  6. 필요하면 아래와 같이 컨테이너를 재시작시킬 수 있다.
    $ docker restart gitlab_web_1
    

  • 메일 발송 기능 지원
    GitLab SMTP settings 페이지를 참조하여 아래와 같이 하였다.
    $ docker exec -it gitlab_web_1 vi /etc/gitlab/gitlab.rb
    

    이후 아래와 같이 세팅하였다. (아래에서 your_xxx 부분은 본인 정보로 세팅해야 함)

    gitlab_rails['smtp_enable'] = true
    gitlab_rails['smtp_address'] = "smtp.gmail.com"
    gitlab_rails['smtp_port'] = 587
    gitlab_rails['smtp_user_name'] = "your_user_name"
    gitlab_rails['smtp_password'] = "your_password"
    gitlab_rails['smtp_domain'] = "your_domain"
    gitlab_rails['smtp_authentication'] = "login"
    gitlab_rails['smtp_enable_starttls_auto'] = true
    gitlab_rails['smtp_tls'] = false
    
  • 관리자 암호 세팅하기
    GitLab 서버의 최초 관리자 ID는 root, PW는 5iveL!fe이다. 관리자로 로그인한 후, 암호를 변경한다. 그런데 만약 관리자 암호를 잊어버린 경우에는 아래와 같이 컨테이너의 쉘을 띄워서 암호를 재설정하면 된다.
    $ docker exec -it gitlab_web_1 /bin/bash
    

    이후 컨테이너에서 아래와 같이 실행한다. (아래에서 new_password 부분에 새로운 암호를 세팅하면 됨)

    root@ca:/# gitlab-rails console -e production
    irb(main):001:0> u = User.find_by(username: 'root')
    irb(main):002:0> u.password = 'new_password'
    irb(main):003:0> u.password_confirmation = 'new_password'
    irb(main):004:0> u.save
    irb(main):005:0> exit
    root@ca:/# exit
    

    이후 아래와 같이 컨네이너를 재시작시키면 반영된다.

    $ docker restart gitlab_web_1
    
  • HSTS(HTTP Strict Transport Security) 관련
    HSTS를 지원하는 웹 브라우저에서는 일단 HTTPS로 연결이 된 사이트면, 이후부터는 HTTP로 접속해도 자동으로 HTTPS로 redirect 되어 접속된다. 만약, 이 동작을 의도적으로 막고자 한다면 컨테이너의 /etc/gitlab/gitlab.rb 파일에서 아래와 같이 세팅하면 된다.
    nginx['hsts_max_age'] = 0
    
  • PlantUML 지원하기
    GitLab에서 PlantUML을 enable 시키려면 root로 로그인한 후, Admin Area -> Settings -> Integrations -> PlantUML -> “Enable PlantUML” 항목을 활성화하고, “PlantUML URL” 항목에 PlantUML 서버 주소를 세팅하면 된다.
    (Local 서버가 있으면 해당 주소를, 없으면 PlantUML online demo server 주소인 http://www.plantuml.com/plantuml/를 입력하면 된다.) 나는 PlantUML 내용이 외부에 open 되지 않도록 local 서버를 Docker로 운용하기로 하였고, 이를 위해 아래와 같이 실행시켰다.
    $ docker run -d --name plantuml --restart=always -p 8080:8080 plantuml/plantuml-server:tomcat
    

    PlantUML 컨테이너가 정상적으로 실행되면, http://localhost:8080 주소에 접속해 보면 PlantUML server 화면이 표시됨을 확인할 수 있다. “PlantUML URL” 항목에 local PlantUML 서버 주소를 세팅한다.
    Markdown 파일에서는 아래 예와 같이 하면, 이쁘게 PlantUML로 렌더링되어 출력됨을 확인할 수 있다.🥂
    (참고로 아래에서 GitLab에서는 @startuml, @enduml 부분이 없어도 표시가 정상적으로 되지만, VS Code에서 preview가 정상적으로 표시되려면 이 부분이 필요하여 넣었음)

    ```plantuml
    @startuml
    Bob -> Alice : hello
    @enduml
    ```