Для работающего инстанса достаточно одной команды docker run и первого запуска, который настраивает инстанс. Сначала инстанс отвечает по HTTP, включение TLS — последний шаг этой страницы.
Перед началом
Проверьте хост по разделу «Требования» и определитесь с именем <HOSTNAME>: по нему пользователи открывают веб-интерфейс и обращаются к репозиториям Git. Это же имя указывается в адресе инстанса и в сертификате.
Проверьте, что имя разрешается в IP-адрес хоста:
getent hosts <HOSTNAME>Если DNS-записи нет, добавьте имя в /etc/hosts на хосте и на каждой машине, с которой открывают веб-интерфейс и работают с Git.
Получение образа
Образ публикуется в вариантах по базовому дистрибутиву: название варианта подставляется вместо <FLAVOR> в ссылке на образ.
| Вариант | Базовый дистрибутив |
|---|---|
ubuntu_22.04 | Ubuntu 22.04 |
ubuntu_24.04 | Ubuntu 24.04 |
redos_8 | RED 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.