docker를 이용한 gitlab ce(Community Edition) git서버 구축 및 관리자 계정 비밀번호 변경

서론

기존 사내서 NCP(Naver Cloud Platform)에서 제공하는 git 저장소를 사용하고 있습니다.

그러나 이슈관리, PR 등 효율적인 소스관리나 자동배포를 위한 기능들이 빈약하다는 생각이 들었습니다. 

팀장님의 승인을 받고 git 저장소 조사를 진행하였습니다. github enterprise와 gitlab 유료버전은 가격이 너무 비싸서 제외했습니다.

다른 팀에서 무료인 gitlab ce 버전을 사용하고 있다는 것을 알게되었습니다.

우선 IDC 서버는 회사 정책상 사용하는데 제한이 있었습니다.

github enterprise는 사용자 당 가격을 책정하는것에 비해 gitlab ce 버전은 클라우드 서버 비용만 감수하면 되서 도입을 진행하게 되었습니다. (2021.01.09 기준 현재 진행중)

 

서버 환경 아래와 같습니다.

OS : 센토스 7.8

사양 : CPU 4코어, RAM 8G

※ 참고로 CPU 2코어, RAM 4G 사양일때는 서버가 터져버렸습니다.... 아무래도 도커를 써서 그런것 같습니다.

 

docker 설치

sudo yum update

도커를 설치하기 전에 yum을 업데이트 해줍니다.

 

sudo yum install docker
sudo systemctl start docker 
sudo systemctl enable docker #운영체제 부팅시 자동 시작하도록 설정

도커를 설치하고 시작을 해줍니다. OS 재부팅시 도커 자동시작도 설정해줍니다.

 

gitlab 설치

sudo docker pull gitlab/gitlab-ce

도커를 이용해 gitlab-ce 버전을 설치합니다. 대략 용량은 2G정도 됩니다.

 

gitlab 실행

docker run --detach \
  --hostname {서버 IP주소} \
  --env GITLAB_OMNIBUS_CONFIG="external_url 'http://{서버 IP주소}:8081'; gitlab_rails['gitlab_shell_ssh_port'] = 2224"  \
  --publish 8081:8081 --publish 2224:2224 \
  --name gitlab \
  --restart always \
  --volume ~/gitlab/config:/etc/gitlab:Z \
  --volume ~/gitlab/logs:/var/log/gitlab:Z \
  --volume ~/gitlab/data:/var/opt/gitlab:Z \
  --volume ~/gitlab/backups:/var/opt/gitlab/backups \
  --volume /etc/localtime:/etc/localtime:ro \
  -e TZ=Asia/Seoul \
  gitlab/gitlab-ce:latest

docker로 다운받은 gitlab-ce 이미지를 실행합니다.

가장 중요한 부분이므로 한줄씩 설명하겠습니다.

 

--hostname {서버 IP주소} \

컨테이너의 호스트 이름을 설정합니다. 저는 그냥 서버 IP 주소로 지정하였습니다.

원하는 이름으로 지어도 무방할 것 같습니다.

 

 --env GITLAB_OMNIBUS_CONFIG="external_url 'http://{서버 IP주소}:8081'; gitlab_rails['gitlab_shell_ssh_port'] = 2224"  \
 --publish 8081:8081 --publish 2224:2224 \

도커 실행시 해당 컨테이너의 환경설정을 추가해서 실행시킬 수 있습니다.

※ 해당 설정은 gitlab.rd 파일에 적용됩니다.

 

gitlab의 external_url 설정을 해야지만 저장소의 주소에 접근할 수 있어 git clone or pull 등을 받을 수 있습니다.

설정하지 않으면 블록친 부분에 호스트이름 혹은 컨테이너 이름으로 등록되어 외부에서 저장소에 접근할 수 없었습니다.

 

💡 겪은 난관

external_url을 지정하지 않을 경우  --env GITLAB_OMNIBUS_CONFIG 해당 부분의 설정은 필요없습니다.

하지만 git clone or pull을 받을려면 설정이 꼭 필요했습니다.

따라서 external_url을 위처럼 추가한뒤에 --publish 설정을 아래와 같이 넣었습니다.

  --publish 8081:80 --publish 2224:22 \

하지만 gitlab에 접근할 수 없었습니다. 이유는 external_url에 포트번호를 지정할 경우 3개의 포트가 모두 같아야 했습니다.

즉, 외부에서 들어오는 포트, 내부에서 listen하는 포트, gitlab.rd 파일에 설정한 포트가 같아야 합니다.

그렇지 않으면 gitlab을 운영할때, 각 링크가 gitlab.rd 파일 기준으로 연동되기 때문에 링크가 깨집니다.

 

  --name gitlab \
  --restart always \

name을 사용하여 컨테이너 ID대신 이름으로 사용할 수 있습니다.

restart always를 통해 도커를 실행시킬때 마다 컨테이너를 항상 같이 띄울 수 있습니다.

 

 --volume ~/gitlab/config:/etc/gitlab:Z \
 --volume ~/gitlab/logs:/var/log/gitlab:Z \
 --volume ~/gitlab/data:/var/opt/gitlab:Z \
 --volume ~/gitlab/backups:/var/opt/gitlab/backups \
 --volume /etc/localtime:/etc/localtime:ro \

도커볼륨 옵션을 지정합니다. 컨테이너의 해당 폴더는 host의 특정 폴더로 사용하겠다는 내용입니다.

컨테이너가 내려가면 해당 컨테이너에 등록한 데이터가 사라집니다. 즉 gitlab에 가입한 계정 혹은 저장소들이 삭제됩니다. 이러한 것을 방지하고 원활한 백업을 위해 도커 볼륨 옵션을 지정해줍니다.

 

gitlab ce 백업하는 방법

 

  -e TZ=Asia/Seoul \

로컬서버와 도커 컨테이너의 시간을 일치시킵니다.

 

gitlab/gitlab-ce:latest

docker hub에서 다운받을 이미지를 지정합니다.

 

도커를 실행한뒤 http://{서버 IP주소}:{지정포트번호}로 접속하면 위와 같은 gitlab 접속 화면을 볼 수 있습니다.

이전 버전에서는 즉시 root 비밀번호를 설정하는 화면이 나왔습니다. 현재 버전에서는 로그인 페이지가 뜨는군요.

하단의 Register now를 통해 회원가입을 진행하면 관리자의 승인이 필요합니다. 관련 내용은 하단에 있습니다.

 

실행중인 컨테이너 stop 및 제거

docker stop gitlab
docker rm gitlab

docker: Error response from daemon: Conflict. The container name "/gitlab" is already in use by container

컨테이너가 실행중인 상태에서 docker 명령어를 통해 재실행하면 위와 같은 에러가 뜹니다.

위의 명령어를 통해 가동중인 컨테이너를 종료하고 지운뒤에 재실행 하면 됩니다.

 

docker compose

일반적인 docker 실행시 옵션이 추가될수록 명령어가 길어져 기억하기 힘듬니다.

docker-compose를 통해 한번 설정해두면 실행시 편리하고 추후 CI 도구와 연계하기 위해서도 필요합니다.

 

docker compose 설치

# docker-compose 설치
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# docker-compose 실행 권한 부여
$ sudo chmod +x /usr/local/bin/docker-compose

# 설치된 docker-compose 실행 확인
$ docker-compose --version
docker-compose version 1.27.4, build 40524192

CentOS 7에서의 설치 및 실행 방법은 위의 명령어로 진행해주면 됩니다.

 

docker-compose.yml 설정

web:
   image: 'gitlab/gitlab-ce:latest'
   restart: always
   hostname: '{서버 IP주소}'
   container_name: gitlab
   environment:
     GITLAB_OMNIBUS_CONFIG: |
      external_url 'http://{서버 IP주소}:8081'
      gitlab_rails['gitlab_shell_ssh_port'] = 2224
     GITLAB_TIMEZONE: Asia/Seoul
   ports:
     - '8081:8081'
     - '2224:2224'
   volumes:
     - '~/gitlab/config:/etc/gitlab'
     - '~/gitlab/logs:/var/log/gitlab'
     - '~/gitlab/data:/var/opt/gitlab'
     - '~/gitlab/backups:/var/opt/gitlab/backups'

앞서 docker 옵션으로 세팅한것과 똑같습니다.

💡 docker compose 에서 container_name 과 hostname 의 차이
hostname : container 내에서 작용합니다. 그래서 container 의 shell 로 들어가서 hostname command 를 날리면 여기 설정한 이름이 보입니다. hostname은 외부에 영향을 주지 않습니다. 즉, 이 hostname 으로 외부에서 이 container 를 접근할 수는 없습니다.
container_name : container name을 설정 하지 않으면 docker compose 가 만들어서 세팅합니다. services 이름이 보통 container 들끼리의 통신에서 DNS name 으로 쓰입니다. (예를 들어 아래 같은 경우 redis) 그런데 여기에 container_name 이 더해지면, redis 와 myredis 둘다 사용할 수 있습니다.
services:
    redis:
        image: redis
        container_name: myredis

 

docker-compose.yml 실행

docker-compose up -d

해당 명령어로 docker-compose를 실행합니다.

 

관리자(root) 비밀번호 변경

docker exec -it gitlab /bin/bash
gitlab-rails console -e production

컨테이너 내부로 진입한뒤 두번째 명령어를 입력해줍니다. 아래의 사진과 같은 내용이 뜰때까지 기다려야 합니다.

 

user = User.where(id: 1).first

첫번째 아이디값을 user에 넣는 명령어입니다. #<User id:1 @root> 라는 응답이 올것이며, 관리자계정 root 입니다.

 

> user.password='변경할비밀번호'
> user.password_confirmation='변경할비밀번호'

root라는 계정이 들어간 user에 변경할 비밀번호를 넣어줍니다.

 

user.save

그리고 마지막으로 user.save 를 입력하면 끝입니다. 정상적으로 변경이 완료되면 true가 잘 안되었으면 false가 리턴됩니다. 보통 false인 경우는 비밀번호가 8자가 안되어서 그런것 같습니다.

 

Gitlab 회원가입 승인

관리자 계정으로 들어가서 User > Pending approval 으로 들어가면 방금 가입한 계정이 보일것입니다. 우측 하단의 설정버튼을 눌러서 Approve를 해주면 됩니다.

 

메일 발송 설정

추가로 비밀번호 분실시 메일을 발송할 수 있는 smtp 옵션도 제공할 수 있습니다. 자세한 사항은 gitlab 가이드 문서를 참조하시길 바랍니다.

gitlab smtp settings

 

gitlab 실행시 기타 설정, gitlab 내부 설정 등, 브랜치 전략 등 체크해야될 사항들이 아직 많이 남아있습니다.

팀에 처음으로 도입하는 만큼 팀원들끼리 열심히 조사해서 좋은 팀문화로 장착 되었으면 합니다. (화이팅!!)

 

출처

docker로 gitlab 설치

gitlab external_url 설정시 주의사항

gitlab 공식 가이드 문서

gitlab root 초기 비밀번호 설정

'형상관리 > gitlab' 카테고리의 다른 글

컨테이너 기반 gitlab 버전업 시나리오  (0) 2022.07.22