Menu

메모용 개발 블로그

전체보기 > GitLab >

GitLab+Docker+Nginx+ReverseProxy 환경 container registry

2023-05-02 16:08:54

환경

아래와 같은 환경에서 GitLab Container Registry를 활성화하여 사용하는 과정을 메모하였다.

GitLab은 Gitlab CE 15.10.1 버전을 도커로 운용하고 있으며, GitLab 자체 Nginx가 구동되고 있다.

또한 다른 컨테이너에서 Nginx를 구동하여 GitLab을 리버스 프록시로 바라보며 외부에 서비스하고 있다.

Nginx 컨테이너와 GitLab 컨테이너는 동일한 네트워크로 묶여있으며, 각각 nginx, gitlab 이라는 컨테이너명으로 서로 접근한다.

구축하고자 하는 환경

별도의 컨테이너에 구축된 Nginx에 접근한 뒤 도메인에 따라(vhost) gitlab 웹 페이지(80)와 레지스트리(5050)포트로 역방향 프록시를 걸어준다.

여기서는 GitLab 도커 컨테이너 내부의 Nginx는 유지한다.

GitLab 설정

compose.yml파일 수정 혹은 gitlab.rb파일 수정

# Registry Config
registry['enable'] = true
registry_external_url '도메인'

# Registry Nginx Config
registry_nginx['enable'] = true
registry_nginx['listen_port'] = 5050
registry_nginx['listen_https'] = false
registry_nginx['proxy_set_headers'] = {
  "X-Forwarded-Proto" => "https",
  "X-Forwarded-Ssl" => "on"
}

위 설정을 추가한다.

이렇게하면 registry nginx는 사용하면서 http로 제공하며 로드밸런서에 접속 시 어떤 프로토콜을 이용했는지 명시한다.

컨테이너 레지스트리는 https 프로토콜을 필수로 사용하도록 하고 있으며, 사용하지 않는 방법은 안전하지도 않고 귀찮은 설정을 동반한다.

Nginx 설정

server {
  listen 80;
  listen [::]:80;

  server_name 도메인;
  server_tokens off;
  return 301 https://$http_host$request_uri;
  access_log  /var/log/nginx/gitlab_access.log;
  error_log   /var/log/nginx/gitlab_error.log;
}

## HTTPS host
server {
  listen 443 http2 ssl;
  listen [::]:443 http2 ssl;
  server_name 도메인;
  server_tokens off;

  ssl_certificate  /etc/letsencrypt/live/도메인/fullchain.pem;
  ssl_certificate_key  /etc/letsencrypt/live/도메인/privkey.pem;

  # GitLab needs backwards compatible ciphers to retain compatibility with Java IDEs
  ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_prefer_server_ciphers on;
  ssl_session_cache shared:SSL:10m;
  ssl_session_timeout 5m;

  ## Individual nginx logs for this GitLab vhost
  access_log  /var/log/nginx/gitlab_access.log;
  error_log   /var/log/nginx/gitlab_error.log;

  location / {
    client_max_body_size 0;
    gzip off;

    proxy_read_timeout      300;
    proxy_connect_timeout   300;
    proxy_redirect          off;

    proxy_http_version 1.1;

    proxy_set_header    Host                $http_host;
    proxy_set_header    X-Real-IP           $remote_addr;
    proxy_set_header    X-Forwarded-Ssl     on;
    proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
    proxy_set_header    X-Forwarded-Proto   $scheme;
    
    proxy_pass http://gitlab:5050; # GitLab 컨테이너
  }
}

확인

설정을 마쳤다면 모든 서비스를 재시작해주어야 한다.

nginx

우선 nginx 문법 검사를 수행하여 문제가 없는지 확인한다.

sudo docker exec -it nginx nginx -t

문제가 없다면 reload 해준다.

sudo docker exec -it nginx nginx -s reload

GitLab

GitLab은 compose.yaml파일을 수정하였으므로 컨테이너를 다시 올려준다.

sudo docker compose up -d

이후 아래 명령어를 통해서 GitLab에 올라가 있는 서비스를 확인할 수 있다.

sudo docker exec -it gitlab gitlab-ctl status

서비스들이 올라오는데 다소 시간이 걸릴 수 있다.

registry 라는 서비스가 올라와있는지 확인하고 GItLab에 접속한다.

image-20230503010628052

위 사진 처럼 아무 저장소에 들어가서 Packages and registriesContainer Registry가 추가되면 사용할 수 있다.

해당 화면 하단에 사용 명령어로 간단하게 명시되어 있다.