2023-03-30 16:49:43
이 글은 설치형 GitLab을 패키지 매니저로 설치한 상태에서 Docker로 이전하는 과정을 담은 글 입니다.
환경이 달라 다른 동작을 보이거나 불필요한 내용이 있을 수 있습니다.
OS/배포판:
Docker:
Nginx:
GitLab 내장 Nginx를 사용하지 않으며, 별도 설치한 Nginx를 사용함.
컴파일 방식으로 설치됨.
version: nginx/1.19.0
이 글에서는 용이한 관리를 위하여 docker-compose
를 이용해서 진행합니다.
또한, 작업 경로는 /srv/gitlab
으로 작업을 하며 글에서 해당 경로가 나올 시 원하는 경로로 변경하여 진행하면 됩니다.
현재 GitLab은 오래전에 구축하였다. 현재 2023년 3월인데. 2019년 9월 30일에 구축하였다. (최초 계정 생성일)
그러므로 설정 템플릿도 안맞을 것이다. 중간에 기억나는 것만 unicorn이라는 것에서 puma로 바꾸면서 업데이트를 귀찮게 했던 기억이 있다.
또한 이런저런 시도를 해본다고 불필요한 설정도 했을 것이고, 이번에 nginx를 그냥 다시 내장 nginx를 사용하는 것으로 설정을 바꿀 것이므로 이에 대한 설정을 진행하고 gitlab.rb
파일은 설정 참고 템플릿으로만 보고 compose.yaml
파일에 설정을 하도록 변경할 것 이다.
우선 docker compose를 작성하여야 합니다.
Docker 버전으로 깃랩을 설치하는 공식 가이드 문서를 참고하여 작성합니다.
https://docs.gitlab.com/ee/install/docker.html
sudo mkdir -r /srv/gitlab
cd /srv/gitlab
sudo vim compose.yaml
이후 아래 내용을 수정하여 작성합니다.
services:
web:
image: 'gitlab/gitlab-ce:latest'
container_name: 'gitlab'
restart: always
hostname: 'gitlab.example.com'
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'https://gitlab.example.com'
# gitlab.rb 파일의 설정 내용을 여기 추가합니다.
ports:
- '80:80'
- '443:443'
- '22:22'
volumes:
- './config:/etc/gitlab'
- './logs:/var/log/gitlab'
- './data:/var/opt/gitlab'
shm_size: '0'
기존 gitlab.rb파일의 설정을 여기다가 적을 수 있는데.
컨테이너 명을 설정하지 않으면 자동으로 compose에서 경로명-web-1
이런식으로 짓습니다.
후에 접근할 일이 생길 때 번거로우므로 정하시면 편합니다.
해당 컨테이너의 재시작 정책을 정합니다. 꺼지더라도 항상 재시작이 되어야 하므로 always로 하였습니다.
컨테이너의 호스트명을 지정합니다. 평범하게 해당 GitLab의 주소로 작성하시면 됩니다.
컨테이너에 미리 지정된 환경변수를 설정합니다.
이를 설정하지 않고 gitlab.rb 파일을 직접 수정해도 무관합니다.
현재 환경에서는 개선을 위해서 설정을 다시 해주었습니다.
...
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'https://gitlab.example.com'
# Nginx Config
nginx['listen_port'] = 80
nginx['listen_https'] = false
nginx['redirect_http_to_https'] = false
# Registry Nginx Config
registry_nginx['redirect_http_to_https'] = false
# Let's Encrypt Settings
letsencrypt['enable'] = false
# Email Settings
gitlab_rails['gitlab_email_enabled'] = true
gitlab_rails['gitlab_email_from'] = '이메일'
gitlab_rails['gitlab_email_display_name'] = '이메일 이름'
gitlab_rails['gitlab_email_reply_to'] = '이메일'
# OmniAuth Settings
gitlab_rails['omniauth_providers'] = [
{
"name" => "google_oauth2",
"app_id" => "app_id",
"app_secret" => "token",
"args" => { "access_type" => "offline", "approval_prompt" => '' }
}
]
# Backup Settings
gitlab_rails['backup_archive_permissions'] = 0644
gitlab_rails['backup_keep_time'] = 604800
# GitLab email server settings
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.gmail.com"
gitlab_rails['smtp_port'] = 587
gitlab_rails['smtp_user_name'] = "smtp_유저명"
gitlab_rails['smtp_password'] = "비밀번호 or 토큰"
gitlab_rails['smtp_domain'] = "smtp.gmail.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = false
...
컨테이너 내부와 외부간 포트를 연결해줍니다.
각자의 환경에 따라 적절하게 설정합니다.
이 글의 환경에서는 외부 nginx에서 gitlab nginx로 프록시를 할 것이므로 http 포트인 80번과 ssh 포트인 22번만 노출하도록 수정할 것 입니다.
volumes 하위에 경로들은 깃랩의 설정, 로그, 데이터 등을 보관하는 영역입니다.
기존 패키지 매니저로 설치한 것과 동일한 경로이나 아쉽게도 파일의 권한에 문제가 있으므로 config 하위의 파일만 복사하고 데이터 부분은 깃랩 자체 백업/복원기능을 사용하여 이동합니다.
이 과정에서 기존 깃랩과 새로운 깃랩간의 버전이 동일하여야 합니다. 기존 깃랩의 버전을 업데이트 하거나 컨테이너의 버전을 맞춰야합니다.
우선 백업부터 진행합니다.
sudo gitlab-backup create
백업이 완료되면 다음과 같이 마지막 문단에 일부 파일은 수동으로 옮겨야 한다라는 경고와 백업된 파일명을 알려줍니다.
이를 메모해둡니다.
...
2023-03-30 14:03:29 UTC -- Warning: Your gitlab.rb and gitlab-secrets.json files contain sensitive data
and are not included in this backup. You will need these files to restore a backup.
Please back them up manually.
2023-03-30 14:03:29 UTC -- Backup 백업_파일_명 is done.
2023-03-30 23:03:29 +0900 -- Deleting backup and restore lock file
다음은 기존 깃랩을 중단합니다.
sudo gitlab-ctl stop
이후 설정파일을 복사한 뒤, 기존에 사용하던 gitlab.rb
파일은 이 글에서 사용하지 않는 것으로 변경할 것이므로 삭제합니다.
sudo cp -r /etc/gitlab ./config
sudo rm -rf ./config/gitlab.rb
컨테이너를 시작합니다.
sudo docker compose up -d
정상 구동을 확인 후 백업파일을 복사해넣고 복원 작업을 수행합니다.
sudo cp /var/opt/gitlab/backups/백업_파일_명_gitlab_backup.tar /srv/gitlab/data/backups
이후 복원을 위해 컨테이너 쉘로 접속합니다.
sudo docker exec -it gitlab bash
접속 한 다음 복원을 진행합니다.
gitlab-backup restore BACKUP=백업_파일_명
이후 기다리면 몇번씩 계속 하겠냐고 묻습니다.
yes를 적어 계속진행하여 완료하면 끝 입니다.