온프레미스에 설치된 gitlab omnibus docker 을 AWS 로 아래와 같이 이전하려고 한다.

  • 온 프레이미스 구성

                    ┌──on premise ──┐
                    │               │
                    │  ┌──Srv ──┐   │
Developer ── https ─┼──┤ Gitlab │   │
                    │  └───┬────┘   │
                    │      │        │
                    │     SSL cert  │
                    └───────────────┘
  • AWS Cloud 이전 이후

                    ┌──────────── AWS ───────────────┐
                    │  Route53                       │
                    │     │                          │
                    │     │               ┌──EC2───┐ │
Developer ── https ─┼─── ELB  ────http────┤ Gitlab │ │
                    │     │               └────────┘ │
                    │     │                          │
                    │  Certificate Manager            │
                    └────────────────────────────────┘

gitlab omnibus docker 이기때문에 기존 저장소를 그대로 옮긴 후에 실행시키면 Gitlab docker 내부에 nginx 가 설치되어 있어서 이것때문에 https proxy 오류가 발생하였다.

Route53 내 도메인 인증서를 가지고 제어하기 때문에 docker 내부에 있는 nginx에서는 http 통신 가능하게 설정하면 된다. ELB listner 2가지 listner를 추가해야 한다. 아래와 같이 설정하지 않으면 Mix Contents error 가 발생하게 되고, docker 내부의 nginx 환경구성을 아무리 해도 제대로 작동하지 않는다.

Listner Rules
HTTP:443 Forward to gitlab-ec2
HTTP:80 Redirect to https://#{host}:443/#{path}?#{query} Status code:HTTP_301
  • 443 : Developer 는 https 로 접근하게 하고, forword 을 내부의 EC2 80포트로 gitlab에 전달한다.
  • 80 : gitlab 에서 http로 오는 것을 developer에게 전달헤기 위해서는 redirect 로 https 로 설정한다.

export GITLAB_HOME=/srv/gitlab
  • /srv/gitlab 하위에 config, logs, data 폴더를 만든다. (docker 외부에 볼륨을 마운트 시키키 위한 폴더)

mkdir -p /srv/gitlab/config
mkdir -p /srv/gitlab/logs
mkdir -p /srv/gitlab/data
  • gitlab docker-compose 파일을 아래와 같이 구성한다.

version: "3"
services:
  gitlab:
    image: 'gitlab/gitlab-ce:latest'
    restart: always
    hostname: mydomain.com
    environment:
      TZ: Asia/Seoul
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'https://mydomain.com'
        gitlab_rails['time_zone'] = 'Asia/Seoul'
        nginx['listen_https'] = false
        nginx['listen_port'] = 80
        nginx['proxy_set_headers'] = {
          "X-Forwarded-Proto" => "http",
        }

    ports:
     - '80:80'
    volumes:
     - '$GITLAB_HOME/config:/etc/gitlab'
     - '$GITLAB_HOME/logs:/var/log/gitlab'
     - '$GITLAB_HOME/data:/var/opt/gitlab'
  • docker-compose 실행 후 로그를 확인해 보고 정상 작동하는지 확인해 보자

docker-compose up -d && docker-compose logs -f

plugin 추가

  • google oauth 를 연동하기 위해서는 google console 에서 oauth 키를 획득 후에 GITLAB_OMNIBUS_CONFIG 부분에 아래와 같이 추가한다.

version: "3"
services:
  gitlab:
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        gitlab_rails['omniauth_providers'] = [
          {
            'name' => 'openid_connect',
            'label' => 'Google OpenID',
            'args' => {
              'name' => 'openid_connect',
              'scope' => ['openid', 'profile', 'email'],
              'response_type' => 'code',
              'issuer' => 'https://accounts.google.com',
              'client_auth_method' => 'query',
              'discovery' => true,
              'uid_field' => 'preferred_username',
              'client_options' => {
                'identifier' => 'xxxxxx.apps.googleusercontent.com',
                'secret' => 'xxxxxx',
                'redirect_uri' => 'https://mydomain.com/users/auth/openid_connect/callback',
              }
            }
          }
        ]
  • plantuml 를 추가하기 위해서는 아래와 같이 추가한 이후에 https://mydomain.com/admin/application_settings/general 으로 접속 후
    • PlantUML 란에 Enable PlantUML 체크 박스 V
    • PlantUML URL : https://mydomain.com/-/plantuml/
    • 이제 README.md 파일 같은 곳에서 다이어그램을 작성하면 된다.

version: "3"
services:
  gitlab:
    ~~~
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        nginx['custom_gitlab_server_config'] = "location /-/plantuml/ { \n    proxy_cache off; \n    proxy_pass  http://plantuml:8080/; \n}\n"
  plantuml:
    image: 'plantuml/plantuml-server:tomcat'
    container_name: plantuml