Запускаем GitLab CE в контейнерах Docker

  • Михаил
  • 8 мин. на прочтение
  • 351
  • 16 Feb 2023
  • 16 Feb 2023

GitLab — это сайт и система управления репозиториями кода для Git. Также GitLab позволяет разработчикам вести непрерывный процесс развертывания для создания, тестирования и развертывания кода. Доступны три разных редакции GitLab: Community Edition (CE), Enterprise Edition (EE) и версия, размещенная на GitLab. GitLab - это выбор номер один, если вы хотите отказаться от GitHub. Он может импортировать проекты и задачи из разных источников, включая GitHub, что упрощает процесс миграции.

Сегодня мы рассмотрим, как быстро поднять свой GitLab сервер на контейнерах Docker, находящийся за обратным прокси сервером NGINX. Предполагается, что у вас уже установлен движок контейнеризации приложений Docker и Compose, а также обратный прокси сервер NGINX.

GitLab сервер будет доступен по адресу: git.subbnet.ru. Также не забываем добавить А запись для домена git.subbnet.ru в DNS.

Для начала создадим структуру каталогов для нашего GitLab:

mkdir -p /opt/gitlab/{config,logs,data}

Далее приводим файл docker-compose.yml к следующему содержимому:

version: '3.3'
services:
 web:
   image: 'gitlab/gitlab-ce:latest'
   restart: always
   hostname: 'git.subbnet.ru'
   environment:
     GITLAB_OMNIBUS_CONFIG: |
       external_url 'http://git.subbnet.ru'
       gitlab_rails['gitlab_shell_ssh_port'] = 2224
   ports:
     - '8099:80'
     - '2224:22'
   volumes:
     - './config:/etc/gitlab'
     - './logs:/var/log/gitlab'
     - './data:/var/opt/gitlab'
   shm_size: '256m'

В качестве образа мы используем последнюю версию GitLab Community Edition latest, вешаем GitLab на loopback интерфейс, а для ssh используем нестандартный порт 2224.

Выполняем билд и запускаем контейнеры:

docker-compose -f /opt/gitlab/docker-compose.yml up -d --build

Проверяем статус контейнеров:

sudo docker ps -a


Теперь необходимо отредактировать основной конфигурациооный файл GitLab и раскомментировать следующие параметры:
vi /opt/gitlab/config/gitlab.rb

gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "mail.example.com"
gitlab_rails['smtp_port'] = 587
gitlab_rails['smtp_user_name'] = "git@example.com"
gitlab_rails['smtp_password'] = "password"
gitlab_rails['smtp_domain'] = "example.com"
gitlab_rails['gitlab_email_from'] = 'git@example.com'
gitlab_rails['gitlab_email_display_name'] = 'GitLab'
nginx['listen_port'] = 80
nginx['listen_https'] = false
nginx['proxy_set_headers'] = {
 "Host" => "git.example.com",
 "X-Real-IP" => "$remote_addr",
 "X-Forwarded-For" => "$proxy_add_x_forwarded_for",
 "X-Forwarded-Proto" => "https",
 "X-Forwarded-Ssl" => "on",
 "Upgrade" => "$http_upgrade",
 "Connection" => "$connection_upgrade"
}

Получилось так:


Мы разрешили использовать отправку писем через SMTP, а также указали параметры nginx для работы за обратным прокси. Для вступления в силу изменений, перезапускаем контейнеры:

docker-compose -f /opt/gitlab/docker-compose.yml restart
или
sudo docker restart gitlab_web_1


Создадим конфигурационный файл виртуального хоста на стороне обратного прокси NGINX:

server {
   listen 80;
   server_name git.subbnet.ru;
   location / {
       proxy_pass http://10.10.11.18:8099;
   }
}
server {
   listen 443 ssl http2;
   server_name git.subbnet.ru;
   location / {
       proxy_pass http://10.10.11.18:8099;
       proxy_redirect off;
       proxy_set_header Host $host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header X-Forwarded-Host $server_name;
   }
   proxy_connect_timeout 900;
   proxy_send_timeout 900;
   proxy_read_timeout 900;
   send_timeout 900;
   access_log /var/log/nginx/localhost-access.log;
   error_log /var/log/nginx/localhost-error.log;
   ssl_certificate /etc/nginx/cert/git.subbnet.ru/fullchain.pem;
   ssl_certificate_key /etc/nginx/cert/git.subbnet.ru/privkey.pem;
   ssl_trusted_certificate /etc/nginx/cert/git.subbnet.ru/fullchain.pem;
   ssl_protocols TLSv1.2 TLSv1.3;
   ssl_prefer_server_ciphers on;
   ssl_session_timeout 1d;
   ssl_session_cache shared:SSL:50m;
   ssl_stapling on;
   ssl_stapling_verify on;
   add_header Strict-Transport-Security max-age=15768000;

Проверяем и перечитываем конфигурацию:

nginx -t
nginx -s reload

С помощью пакета certbot и python3-certbot-nginx можем получить SSL сертификат от Let’s Encrypt:

certbot --nginx -d git.subbnet.ru
nginx -t
nginx -s reload


Открываем сайт git.subbnet.ru в браузере и пытаемся авторизоваться. 

Пароль от root можно получить следующей командой на сервере:

docker exec -it gitlab_web_1 grep 'Password:' /etc/gitlab/initial_root_password