DevOps

Docker 기반의 GitLab 설치 및 Letsencrypt 인증서 설정

nineDeveloper 2021. 7. 12. 11:29
728x90

회사에서 Jenkins 서버가 필요한데 AWS LightSail 에 가볍게 띄우기 위해서 Docker 기반으로 Gitlab 서버를 띄우고
인증서 설정을 위해 Letsencrypt 인증서 설정까지 한 내용에 대해 기록해본다

크게 1번 인증서 발급 과정과 2번 GitLab 설치후 인증서 셋팅 두 과정으로 나누어 진다

먼저 1. 인증서 발급 부분부터 순서대로 진행해야 한다

참고로 GitLab 은 Gitlab community Edition 으로 진행 했다

https://about.gitlab.com/community/

우선 인스턴스 발급후 gitlab-ce 디렉토리 생성 후 작업을 진행한다

1. 인증서 발급

https://hibuz.com/https-ghost-blog-3 에서 git을 pull 받아서 설정내용을 수정한다(별도의 git에 수정된 설정내용을 생성해놓아도 된다)

git clone https://github.com/hibuz/nginx-certbot.git

init-letsencrypt.sh 파일과 data/nginx/app.conf 파일을 자신의 도메인에 맞게 변경

init-letsencrypt.sh 변경항목

domains=(example.org www.example.org)
email="" # Adding a valid address is strongly recommended

data/nginx/app.conf 변경내용 (app_prifix.conf 내용 참조)

인증서를 발급을 위해 data/nginx 디렉토리를 생성하고 app.conf 파일 내용 입력

server {
    listen 80;
    server_name gitlab.test.com; #<- 여기
    server_tokens off;

    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }

    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443 ssl;
    server_name gitlab.test.com; #<- 여기
    server_tokens off;

    ssl_certificate /etc/letsencrypt/live/gitlab.test.com/fullchain.pem; #<- 여기
    ssl_certificate_key /etc/letsencrypt/live/gitlab.test.com/privkey.pem; #<- 여기
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location / {
        proxy_pass  http://gitlab.test.com;
        proxy_set_header    Host                $http_host;
        proxy_set_header    X-Real-IP           $remote_addr;
        proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
    }
}

letsencrypt 인증서 설치를 위한 docker-compose.yml 파일 작성

단순히 letsencrypt 인증서 설치를 위한 docker-compose.yml 스크립트 이다

version: '3'

services:
  nginx:
    image: nginx:alpine
    container_name: nginx
    restart: always
    volumes:
      - ./ext/data/nginx:/etc/nginx/conf.d
      - ./ext/data/certbot/conf:/etc/letsencrypt
      - ./ext/data/certbot/www:/var/www/certbot
    ports:
      - 80:80
      - 443:443
    command: "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'"
  certbot:
    image: certbot/certbot
    container_name: certbot
    restart: always
    volumes:
      - ./ext/data/certbot/conf:/etc/letsencrypt
      - ./ext/data/certbot/www:/var/www/certbot
    entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"

./init-letsencrypt.sh 실행 후 인증서 설치가 완료되면 해당 도메인으로 https 접속이 가능한지 확인해 본다

2. GitLab 설치

기존에 인증서 발급을 위해 구동했던 컨테이너 삭제

docker-compose down

GitLab Docker 이미지 생성을 위한 Dockerfile 작성

사전에 설치해야하는 패키지 설치와 설정을 위한 Dockerfile 을 작성한다

FROM gitlab/gitlab-ce:latest

ARG GITLAB_DOMAIN_NAME

ENV GITLAB_DOMAIN_NAME=${GITLAB_DOMAIN_NAME}
ENV GITLAB_DOMAIN_NAME_CONF=${GITLAB_DOMAIN_NAME}.conf

RUN echo ${GITLAB_DOMAIN_NAME}
RUN echo ${GITLAB_DOMAIN_NAME_CONF}

RUN apt-get update && apt-get install letsencrypt -y
RUN apt-get install -y apt-transport-https ca-certificates software-properties-common rsync openssh-client
RUN curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add
RUN apt-key fingerprint 0EBFCD88
RUN add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
RUN apt-get update &&  apt-get install -y docker-ce

RUN curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | bash
RUN export GITLAB_RUNNER_DISABLE_SKEL=true; apt-get install gitlab-runner -y
RUN service gitlab-runner start

RUN mkdir /var/www
RUN mkdir /var/www/letsencrypt
RUN mkdir /etc/letsencrypt/configs

ADD ${GITLAB_DOMAIN_NAME_CONF} /etc/letsencrypt/configs/

docker-compose.yml 내용 수정 및 GitLab 컨테이너 추가

기존에 인증서 발급을 위해 작성했던 docker-compose.yml 내용을 아래와 같이 수정하고

docker-compuse up --build -d 명령으로 컨테이너를 실행하고 확인한다

version: '3'

services:
  gitlab:
    #image: "gitlab/gitlab-ce:latest"
    build:
       context: .
       args:
         - GITLAB_HOME
         - GITLAB_DOMAIN_NAME
    restart: always
    container_name: 'gitlab'
    hostname: 'gitlab.test.com'
    network_mode: "bridge"
    #command: gitlab service gitlab-runner start
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'https://gitlab.test.com'
        # Add any other gitlab.rb configuration here, each on its own line
        gitlab_rails['gitlab_shell_ssh_port']=1022
        gitlab_rails['gitlab_email_from'] = 'gitlab@test.com'
        gitlab_rails['gitlab_email_reply_to'] = 'noreply@test.com'
        gitlab_rails['smtp_enable'] = true
        gitlab_rails['smtp_address'] = "smtp.gmail.com"
        gitlab_rails['smtp_port'] = 587
        gitlab_rails['smtp_user_name'] = "user@email.com"
        gitlab_rails['smtp_password'] = "password"
        gitlab_rails['smtp_domain'] = "smtp.gmail.com"
        gitlab_rails['smtp_authentication'] = "login"
        gitlab_rails['smtp_enable_starttls_auto'] = true
        gitlab_rails['smtp_tls'] = false
        ###! **Can be: 'none', 'peer', 'client_once', 'fail_if_no_peer_cert'**
        ###! Docs: http://api.rubyonrails.org/classes/ActionMailer/Base.html
        gitlab_rails['smtp_openssl_verify_mode'] = 'peer'
        unicorn['worker_timeout'] = 60
        unicorn['worker_processes'] = 3
        logging['logrotate_frequency'] = "weekly"
        logging['logrotate_rotate'] = 52
        logging['logrotate_compress'] = "compress"
        logging['logrotate_method'] = "copytruncate"
        logging['logrotate_delaycompress'] = "delaycompress"
        nginx['custom_gitlab_server_config']= "location /.well-known/acme-challenge/ {root /var/www/letsencrypt;}"
        nginx['enable'] = true
        nginx['listen_port'] = 443
        nginx['listen_https']=true
        nginx['redirect_http_to_https'] = true
        nginx['redirect_http_to_https_port'] = 80
        nginx['ssl_certificate'] = "/etc/letsencrypt/live/gitlab.test.com/fullchain.pem"
        nginx['ssl_certificate_key'] = "/etc/letsencrypt/live/gitlab.test.com/privkey.pem"
        nginx['ssl_protocols'] = "TLSv1.1 TLSv1.2"
        nginx['logrotate_frequency'] = "weekly"
        nginx['logrotate_rotate'] = 52
        nginx['logrotate_compress'] = "compress"
        nginx['logrotate_method'] = "copytruncate"
        nginx['logrotate_delaycompress'] = "delaycompress"
      GITLAB_TIMEZONE: Asia/Seoul
      #GITLAB_HTTPS: true
      #SSL_SELF_SIGNED: true
      #GITLAB_PORT: 443
    ports:
      - "80:80"
      - "443:443"
      - "1022:22"
    volumes:
      - ./ext/config:/etc/gitlab
      - ./ext/gitlab-runner:/etc/gitlab-runner
      - ./ext/logs:/var/log/gitlab
      - ./ext/data:/var/opt/gitlab
      - ./ext/data/backups:/var/opt/gitlab/backups
      - ./ext/data/certbot/conf:/etc/letsencrypt
      - ./ext/data/certbot/www:/var/www/letsencrypt
      - /var/run/docker.sock:/var/run/docker.sock
  certbot:
    image: certbot/certbot
    container_name: certbot
    restart: always
    network_mode: "bridge"
    volumes:
      - ./ext/data/certbot/conf:/etc/letsencrypt
      - ./ext/data/certbot/www:/var/www/certbot
    entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"

3. GitLab-Runner 설치

GitLab CI/CD 를 사용하기 위해서는 GitLab-Runner 설치가 필요하다

해당 Repository - Settings - CI / CD - Runners 에서 Set up a specific runner manually 내용을 참조해서 설치를 진행한다

설치 시에는 gitlab 컨테이너 내부로 진입해서 설치한다

docker exec -it gitlab bash

# GitLab Runner 다운로드
curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64

# GitLab Runner 실행권한 부여
sudo chmod +x /usr/local/bin/gitlab-runner

# GitLab CI 유저 추가
sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash

# GitLab Runner 설치 및 Service 구동
sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
sudo gitlab-runner start

GitLab Runner 설치 후 Register를 등록해야 프로젝트에서 GitLab Runner 사용이 가능하다

아래의 내용에 url, registration-token 정보만 변경해주고 수행하면 된다

GitLab-Runner Register 등록

gitlab-runner register \
  --non-interactive \
  --url "https://gitlab.test.com/" \
  --registration-token "8XXXXXXXXXXXXXXXXXXk" \
  --executor "docker" \
  --docker-image alpine:latest \
  --description "docker-runner" \
  --tag-list "docker,aws" \
  --run-untagged="true" \
  --locked="false" \
  --access-level="not_protected"

gitlab 컨테이너 외부에서는 수행시 아래와 같이 수행하면 gitlab 컨테이너 내부에 해당 명령을 수행할 수 있다

docker exec -it gitlab gitlab-runner register \
  --non-interactive \
  --url "https://gitlab.test.com/" \
  --registration-token "8XXXXXXXXXXXXXXXXXXk" \
  --executor "docker" \
  --docker-image alpine:latest \
  --description "docker-runner" \
  --tag-list "docker,aws" \
  --run-untagged="true" \
  --locked="false" \
  --access-level="not_protected"

Register 등록이 완료 되면 아래와 같이 사용가능한 Runner 가 보이게 된다

Enable for this project 를 클릭하면 해당 프로젝트에서 runner 를 사용할 수 있다

GitLab-runner 삭제 및 재설치

# 모든 runner 삭제
gitlab-runner unregister --all-runners

# gitlab-runner 제거
sudo gitlab-runner uninstall

# gitlab-runner 클라이언트 삭제, 재설치 할 경우 삭제 불 필요
sudo rm -rf /usr/local/bin/gitlab-runner

# 추가한 사용자 제거
sudo userdel gitlab-runner
sudo rm -rf /home/gitlab-runner/
728x90