Для работающего инстанса достаточно одной команды docker run и первого запуска, который настраивает инстанс. Сначала инстанс отвечает по HTTP, включение TLS — последний шаг этой страницы.

Перед началом

Проверьте хост по разделу «Требования» и определитесь с именем <HOSTNAME>: по нему пользователи открывают веб-интерфейс и обращаются к репозиториям Git. Это же имя указывается в адресе инстанса и в сертификате.

Проверьте, что имя разрешается в IP-адрес хоста:

getent hosts <HOSTNAME>

Если DNS-записи нет, добавьте имя в /etc/hosts на хосте и на каждой машине, с которой открывают веб-интерфейс и работают с Git.

Получение образа

Образ публикуется в вариантах по базовому дистрибутиву: название варианта подставляется вместо <FLAVOR> в ссылке на образ.

ВариантБазовый дистрибутив
ubuntu_22.04Ubuntu 22.04
ubuntu_24.04Ubuntu 24.04
redos_8RED OS 8

Каждый тег называет версию, отдельного тега для последней версии нет, поэтому и при первом запуске, и при каждом обновлении версия указывается явно:

docker pull <REGISTRY>/<FLAVOR>:<VERSION>

Запуск контейнера

Создайте контейнер с томами, опубликованными портами и адресом инстанса:

docker run -d --name code \
  --shm-size 256m \
  -p 80:80 -p 443:443 -p 22:22 \
  -e GITLAB_OMNIBUS_CONFIG="external_url 'http://<HOSTNAME>'" \
  -v /srv/code/config:/etc/gitlab \
  -v /srv/code/logs:/var/log/gitlab \
  -v /srv/code/data:/var/opt/gitlab \
  <REGISTRY>/<FLAVOR>:<VERSION>

Имя code используется во всех командах ниже. Левый порт в каждом -p — это порт хоста, он может отличаться от порта контейнера; порт 22 на хосте обычно занят системным sshd, а настройка, которая указывает другой порт в URL для клонирования, описана в разделе «Настройка после установки».

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

Адрес инстанса

Без настройки адресом становится http://<CONTAINER_HOSTNAME>, где <CONTAINER_HOSTNAME> — имя хоста контейнера. Docker задаёт его равным идентификатору контейнера, если не указан параметр --hostname. Этот идентификатор попадёт во все ссылки и URL для клонирования, поэтому задайте адрес при первом запуске.

Адрес — это настройка external_url в gitlab.rb, и образ берёт её из переменной окружения и из файла конфигурации:

  • GITLAB_OMNIBUS_CONFIG содержит строки конфигурации и вычисляется при каждом запуске;
  • /etc/gitlab/gitlab.rb на томе конфигурации читается после переменной, поэтому настройка из файла переопределяет ту же настройку из переменной.

Переменная EXTERNAL_URL, которую читает установщик пакета, в контейнере не действует.

Первый запуск

Стартовый скрипт готовит инстанс до того, как сервисы начнут принимать запросы:

  • копирует gitlab.rb из шаблона, если на томе конфигурации файла нет;
  • генерирует ключи хоста SSH в /etc/gitlab, если их нет;
  • выполняет gitlab-ctl reconfigure — шаг, который при первом запуске занимает несколько минут;
  • приводит базу данных к текущей версии PostgreSQL;
  • выводит логи сервисов в вывод контейнера.

Следите за запуском по выводу контейнера:

docker logs -f code

В образе настроена проверка состояния, которая выполняется каждые 60 секунд. До первой успешной проверки состояние контейнера — starting, после пяти неуспешных проверок подряд — unhealthy; первый запуск доходит до этого состояния, пока настройка ещё выполняется:

docker inspect --format '{{.State.Health.Status}}' code

Запуск завершён, когда состояние контейнера — healthy, а все сервисы находятся в состоянии run:

docker exec code gitlab-ctl status

Первый вход

Первый пароль пользователя root записывается на том конфигурации. Прочитайте его из контейнера:

docker exec code cat /etc/gitlab/initial_root_password

Откройте http://<HOSTNAME> и войдите под пользователем root с этим паролем.

Файл с паролем удаляется при первой настройке, которая выполняется позже чем через 24 часа после записи файла, и шаг с TLS ниже — это такая настройка. Смените пароль root в веб-интерфейсе и удалите файл: docker exec code rm -f /etc/gitlab/initial_root_password.

По HTTP данные для входа и содержимое репозиториев передаются в открытом виде. Инстанс, с которым работают пользователи, работает по TLS.

TLS

Разместите сертификат и ключ на томе конфигурации, чтобы контейнер читал их из /etc/gitlab/ssl:

sudo mkdir -p /srv/code/config/ssl && sudo chmod 755 /srv/code/config/ssl
sudo install -m 644 <CERT_FILE> /srv/code/config/ssl/<HOSTNAME>.crt
sudo install -m 600 <KEY_FILE> /srv/code/config/ssl/<HOSTNAME>.key

<CERT_FILE> — файл сертификата в формате PEM, <KEY_FILE> — файл его закрытого ключа.

Выпуск сертификата, требование к subjectAltName и причина, по которой отключается Let’s Encrypt, описаны в разделе «Быстрый старт».

Добавьте настройки в файл /srv/code/config/gitlab.rb, который контейнер читает как /etc/gitlab/gitlab.rb:

external_url 'https://<HOSTNAME>'
letsencrypt['enable'] = false
nginx['redirect_http_to_https'] = true
nginx['ssl_certificate'] = "/etc/gitlab/ssl/<HOSTNAME>.crt"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/<HOSTNAME>.key"

Пути в настройках — это пути внутри контейнера. Примените изменение перезапуском контейнера: настройка выполняется при каждом запуске.

docker restart code

Проверка

Проверьте сервисы, состояние контейнера и перенаправление с HTTP:

docker exec code gitlab-ctl status
docker exec code gitlab-healthcheck --fail --max-time 10
docker inspect --format '{{.State.Health.Status}}' code
curl -sI http://<HOSTNAME>/ | grep -i location

Откройте https://<HOSTNAME> в браузере, войдите и создайте тестовый проект, чтобы проверить доступ к Git по HTTPS и по SSH.

Дополнительные ресурсы