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

Всем привет. Чисто из интереса я решил попробовать развернуть собственный GitLab сервер, и вот что у меня получилось.
Данный пост будет полезен тем, кто хотел бы хостить свои проекты на своем личном сервере, или кто, также как и я, хочет потренироваться в этом деле.
Используемые технологии
- Сервер на ОС Linux минимум 2 ядра и 2Gb RAM (у меня был куплен сервер с ОС Ubuntu 20.04 LTS)
- Домен
- Docker последней версии
- Docker Compose последней версии
- Traefik версии 1.7.16
- 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 закончено. При необходимости можно настроить отправку писем с сервера, и другие нужные вам настройки.
Полезные ссылки
Материал подготовлен с ❤️ редакцией Кухни IT.