Docker 기반의 GitLab 설치 및 Letsencrypt 인증서 설정
회사에서 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/