Развертывание собственного GitLab сервера в Docker + Traefik / блог.Oxymeal

Развертывание собственного GitLab сервера в Docker + Traefik

Всем привет. Чисто из интереса я решил попробовать развернуть собственный GitLab сервер, и вот что у меня получилось.

Данный пост будет полезен тем, кто хотел бы хостить свои проекты на своем личном сервере, или кто, также как и я, хочет потренироваться в этом деле.

Используемые технологии

  • Сервер на ОС Linux минимум 2 ядра и 2Gb RAM (у меня был куплен сервер с ОС Ubuntu 20.04 LTS)
  • Домен
  • Docker последней версии
  • Docker Compose последней версии
  • Traefik версии 1.7.16 (я не стал тестить latest образ, если кому интересно и кто-то проверит - отпишитесь на почту palmero@oxymeal.ru или в telegram @pa1m3r0) 
  • latest образ GitLab Community Edition

Требования к серверу

Требования для сервера GitLab CE можно посмотреть тут и тут. У меня был сервер на 2 ядра и 2 гигабайта оперативной памяти. Этой конфигурации оказалось недостаточно, так как при запуске контейнера я получал ошибку 502, и в логах контейнера наблюдались out of memory ошибки. Исправить это все дело получилось с помощью создания файла подкачки на 2 гигабайта. Вот так выглядит нагрузка сервера при запуске контейнера:

А вот так выглядит нагрузка, когда все контейнеры (gitlab и traefik) запущены:

Отсюда можно сделать вывод, что желательно иметь конфигурацию сервера минимум на 4 ядра и от 4 гигабайт оперативной памяти.

Настройка домена

Предположим, у вас есть домен для вашей организации или ваш личный домен, например oxymeal.ru, то гитлаб можно развернуть на поддомене gitlab.oxymeal.ru. Для этого в настройках вашего домена необходимо добавить А запись с поддоменом gitlab.oxymeal.ru и значением ip-адресом вашего сервера. После этого нужно немного подождать, пока обновятся DNS сервера, чтобы ваш домен был привязан к ip-адресу вашего сервера.

Подготовка сервера

Пока обновляются DNS сервера, можно подготовить сервер. Первым делом сгенерируем пару ssh ключей и закинем публичный ключ в настройки сервера. Это самый предпочтительный и очень удобный способ аутентификации. Если кому нужно, то вот документация по этой теме.

Далее установим Docker по следующей инструкции. Также необходимо установить Docker Compose.

Настройка traefik

Находясь в корневом разделе создаем папку traefik командой mkdir traefik далее переходим в эту папку и создаем файл docker-compose.yml командой nano docker-compose.yml после чего вставляем в этот файл следующее содержимое:

version: '2' 
services:
 traefik:
   image: traefik:1.7.16
   restart: always
   ports:
     - 80:80
     - 443:443
   networks:
     - traefik_network
   volumes:
     - /var/run/docker.sock:/var/run/docker.sock
     - ./traefik/traefik.toml:/traefik.toml
     - ./traefik/acme.json:/acme.json
   container_name: traefik
networks:
 traefik_network:
   external: true

Теперь создадим сеть в docker: docker network create traefik_network

Далее, находясь в папке traeifk, создаем еще одну папку с таким же названием и переходим в неё. Здесь необходимо создать два файла: touch acme.json и touch traefik.toml. Сразу же обновим права доступа к файлу acme.json, чтобы при запуске контейнера traefik к этому файлу был доступ: chmod 600 acme.json, иначе при запуске контейнера в этот файл не будет записан SSL сертификат. Далее открываем traefik.toml командой nano traefik.toml и вставляем в него следующее содержимое:

debug = false 

logLevel = "ERROR"
defaultEntryPoints = ["https","http"]

[entryPoints]
 [entryPoints.http]
 address = ":80"
   [entryPoints.http.redirect]
   entryPoint = "https"
 [entryPoints.https]
 address = ":443"
 [entryPoints.https.tls]

[retry]

[docker]
endpoint = "unix:///var/run/docker.sock"
domain = "yourdomain.ru" # <--- не забудьте дописать здесь свой домен
watch = true
exposedByDefault = false

[acme]
email = "admin@yourdomain.ru" # <--- не забудьте дописать здесь свой домен
storage = "acme.json"
entryPoint = "https"
onHostRule = true
[acme.httpChallenge]
entryPoint = "http"

На этом настройка traefik закончена, контейнер пока не запускаем, так как еще не написан compose файл для gitlab.

Настройка gitlab

В корне сервера создаем папку gitlab mkdir gitlab и внутри этой папки создаем docker-compose.yml nano docker-compose.yml и вставляем следующее содержимое:

version: '3' 
services:
 gitlab:
   container_name: gitlab
   image: gitlab/gitlab-ce:latest
   restart: always
  hostname: gitlab.yourdomain.ru # <--- ваш домен
   environment:
    GITLAB_OMNIBUS_CONFIG: |
       gitlab_rails['gitlab_shell_ssh_port'] = 2224
   labels:
     - traefik.docker.network=traefik_network
    - traefik.frontend.rule=Host:gitlab.yourdomain.ru # <--- ваш домен 
     - traefik.enable=true
     - traefik.port=80
   healthcheck:
     disable: false
   ports:
     - '2224:22'
   volumes:
     - '/srv/gitlab/config:/etc/gitlab'
     - '/srv/gitlab/logs:/var/log/gitlab'
     - '/srv/gitlab/data:/var/opt/gitlab'
   networks:
     - traefik_network
     - gitlab
networks:
 gitlab: {}
 traefik_network:
   external: true

После этого можно запускать контейнер командой docker-compose up -d. После запуска gitlab контейнера переходим в папку traefik и выполняем ту же самую команду docker-compose up -d. На этом всё готово, можно перейти по адресу, который вы указали в docker-compose.yml файле и проверить. При первом открытии система предложит ввести вам пароль администратора. После этого можно заходить под админом используя логин root и ваш пароль.

Если же при открытии сайта вы видите белую страницу с надписью 502 Bad gateway, то ничего страшного нет, вам необходимо подождать пару минут, пока запустится контейнер. После этой белой страницы должна появиться страница с ошибкой от гитлаба:

Здесь также необходимо подождать пару минут, пока выполнятся все процессы по настройке контейнера. После чего откроется страница входа.

На этом развертывание GitLab закончено. При необходимости можно настроить отправку писем с сервера, и другие нужные вам настройки. Если у вас остались вопросы, можете написать на почту palmero@oxymeal.ru или в telegram @pa1m3r0.

Полезные ссылки