Установка GitLab в Docker и Docker Compose на Ubuntu 20.04
Важно: перед началом убедитесь, что у вас есть доступ к корневому пользователю или права sudo и выделено не менее 4 ГБ ОЗУ для комфортной работы GitLab.
Введение
GitLab — это веб‑приложение для хранения Git‑репозиториев с встроенными возможностями CI/CD, отслеживания задач, вики и ревью кода. В этом руководстве мы создадим GitLab CE (Community Edition) внутри Docker‑контейнера и запустим сервис через docker‑compose на Ubuntu 20.04.
Определения одним предложением:
- Docker — механизм контейнеризации приложений;
- Docker Compose — инструмент для запуска нескольких контейнеров как одного проекта;
- GitLab CE — бесплатная версия GitLab с основными функциями.
Кому полезно: системным администраторам, DevOps‑инженерам и тимлидам, которые хотят быстро развернуть GitLab в изолированной среде.
Что мы сделаем
- Установим Docker и Docker Compose на Ubuntu 20.04.
- Настроим структуру директорий и переменные окружения для проекта.
- Подготовим docker‑compose.yml для GitLab.
- Сгенерируем SSL‑сертификаты LetsEncrypt и dhparam.
- Запустим контейнер и выполним пост‑установку.
- Добавим базовую эксплуатационную конфигурацию, резервное копирование и рекомендации по безопасности.
Требования
- Ubuntu Server 20.04 (Focal Fossa).
- Минимум 4 ГБ оперативной памяти.
- Права root или sudo.
- Доменное имя, указывающее на сервер (например, gitlab.example.com).
Шаг 1 — Установка Docker и Docker Compose
Сначала обновите пакеты и установите docker и docker-compose из репозиториев Ubuntu:
sudo apt update
sudo apt install docker.io containerd docker-composeПосле установки включите и запустите systemd‑сервис Docker:
sudo systemctl start docker
sudo systemctl enable dockerПроверьте статус сервиса:
systemctl status dockerДля быстрых тестов выполните контейнер hello‑world:
docker run hello-worldИзображение ниже показывает пример успешного запуска Docker.


Примечание: если у вас ограниченный доступ к репозиториям, можно установить Docker официальным скриптом с сайта docker.com, но в этой инструкции мы используем пакет Ubuntu для простоты и совместимости с Ubuntu 20.04.
Шаг 2 — Настройка директорий проекта GitLab
Создайте директорию проекта и перейдите в неё:
mkdir -p gitlab; cd gitlab/Создайте директорию данных GitLab и поддиректории для конфигураций, логов и данных:
sudo mkdir -p /srv/gitlab/{config/ssl,logs,data}В каталоге проекта создайте файл .env, который будет содержать переменную окружения GITLAB_HOME:
vim .envСодержимое .env (одна строка):
GITLAB_HOME=/srv/gitlabФайл .env позволит docker‑compose подставлять путь к хранилищу данных при монтировании томов.
docker-compose.yml
Создайте docker-compose.yml в каталоге проекта:
vim docker-compose.ymlНиже — минимальная и рабочая конфигурация службы web для GitLab CE. Замените gitlab.hakase-labs.io на ваш домен и при необходимости поменяйте SSH‑порт.
version: '3.6'
services:
web:
image: 'gitlab/gitlab-ce:latest'
restart: always
hostname: 'gitlab.hakase-labs.io'
environment:
GITLAB_OMNIBUS_CONFIG: |
# Add any other gitlab.rb configuration here, each on its own line
external_url 'https://gitlab.hakase-labs.io'
gitlab_rails['gitlab_shell_ssh_port'] = 2224
nginx['redirect_http_to_https'] = true
nginx['ssl_certificate'] = "/etc/gitlab/ssl/fullchain.pem"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/privkey.pem"
nginx['ssl_dhparam'] = "/etc/gitlab/ssl/dhparams.pem"
ports:
- '80:80'
- '443:443'
- '2224:22'
volumes:
- '${GITLAB_HOME}/config:/etc/gitlab'
- '${GITLAB_HOME}/logs:/var/log/gitlab'
- '${GITLAB_HOME}/data:/var/opt/gitlab'
- '${GITLAB_HOME}/config/ssl:/etc/gitlab/ssl'Сохраните файл. Разбор секций:
- image: образ gitlab/gitlab-ce:latest — свежая CE‑сборка;
- hostname и external_url должны соответствовать домену, для корректной генерации ссылок в GitLab;
- gitlab_shell_ssh_port — порт внутри контейнера, переадресованный на внешний порт (2224 в примере);
- volumes — монтирование конфигураций/логов/данных на хост, чтобы сохранить состояние при обновлениях контейнера.
Генерация SSL‑сертификатов и dhparam
Мы рекомендуем использовать LetsEncrypt для публичных доменов. Установите certbot:
sudo apt install certbotЗатем получите сертификат в режиме standalone (осторожно: этот режим временно запускает собственный HTTP‑сервер на порту 80):
certbot certonly --rsa-key-size 2048 --standalone --agree-tos --no-eff-email --email you@example.com -d gitlab.hakase-labs.ioПосле успешного получения сертификатов скопируйте их в каталог /srv/gitlab/config/ssl:
sudo cp /etc/letsencrypt/live/gitlab.hakase-labs.io/fullchain.pem /srv/gitlab/config/ssl/
sudo cp /etc/letsencrypt/live/gitlab.hakase-labs.io/privkey.pem /srv/gitlab/config/ssl/Сгенерируйте dhparams (может занять время):
sudo openssl dhparam -out /srv/gitlab/config/ssl/dhparams.pem 2048
Совет: на продакшн‑серверах храните резервные копии сертификатов и приватных ключей с ограниченным доступом.
Шаг 3 — Сборка и запуск контейнера GitLab
Проверьте содержимое каталога проекта и структуру /srv/gitlab:
ls -lah ~/gitlab/
tree /srv/gitlabПример вывода приведён на скриншоте ниже.

Запустите docker-compose в фоновом режиме:
cd ~/gitlab
docker-compose up -dМониторьте запуск и просматривайте лог запуска командой:
docker-compose ps
docker-compose logs -fДля просмотра портов используйте ss:
ss -plntЕсли всё корректно, контейнер будет отображён как запущенный, а порты 80, 443 и внешний SSH‑порт (2224 в примере) будут слушаться.


Если контейнер не запускается, см. раздел «Устранение неисправностей» ниже.
Шаг 4 — Пост‑установка в веб‑интерфейсе
Откройте браузер и перейдите по адресу вашего GitLab (https://gitlab.hakase-labs.io/ в примере). При первом запуске вам будет предложено сменить пароль пользователя root.

Установите надёжный пароль и войдите под пользователем root.

После входа вы попадёте в дашборд GitLab.

Поздравляем — базовая установка завершена.
Шаг 5 — Базовая эксплуатация контейнера GitLab
Перейдите в каталог проекта и проверьте состояние контейнера:
cd ~/gitlab
docker-compose psПроверка статуса сервисов внутри контейнера
Чтобы посмотреть статус внутренних сервисов GitLab используйте:
sudo docker exec -it gitlab_web_1 gitlab-ctl status
Вход в контейнер
Для выполнения диагностических команд войдите в контейнер:
sudo docker exec -it gitlab_web_1 /bin/bashПроверьте версию ОС внутри контейнера:
cat /etc/lsb-releaseВ приведённом примере контейнер основан на Ubuntu 16.04.
Выйдите из контейнера командой exit.
Редактирование конфигурации gitlab.rb
Если нужно внести изменения в /etc/gitlab/gitlab.rb, сделайте это из контейнера (или отредактируйте файл на хосте в ${GITLAB_HOME}/config):
sudo docker exec -it gitlab_web_1 editor /etc/gitlab/gitlab.rbПосле изменения примените конфигурацию перезапуском контейнера:
sudo docker restart gitlab_web_1Проверьте состояние служб и доступность.

Эксплуатационные рекомендации и безопасность
- Фаервол (UFW): откройте нужные порты и закройте остальное:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 2224/tcp
sudo ufw enable
sudo ufw statusЛоги и мониторинг: собирайте логи из ${GITLAB_HOME}/logs и настраивайте централизованный лог‑агрегатор (ELK/EFK/Graylog).
Резервное копирование: используйте встроенную команду для создания backup внутри контейнера или копируйте томы данных.
Создание бэкапа:
sudo docker exec -t gitlab_web_1 gitlab-rake gitlab:backup:createКопирование конфигураций и данных на хост:
sudo tar -czf gitlab-config-$(date +%F).tgz -C /srv/gitlab config
sudo tar -czf gitlab-data-$(date +%F).tgz -C /srv/gitlab dataОбновления: обновляйте образ gitlab/gitlab-ce аккуратно. Сначала тестируйте обновления на копии данных, затем выполняйте обновление в окно обслуживания.
Доступ по SSH: если вы используете альтернативный SSH‑порт, не забудьте открыть его в фаерволе и предоставить инструкцию разработчикам по подключениям (ssh -p 2224 git@gitlab.example.com).
Минимизация прав доступа: держите приватные ключи и сертификаты с ограниченным доступом; используйте менеджеры секретов для CI при необходимости.
Резервный план и откат
- Перед обновлением создайте полный бэкап данных и конфигурации.
- Если обновление привело к ошибкам, остановите контейнер, восстановите файлы из бэкапа и запустите предыдущую версию образа.
Пример восстановления из резервной копии (в зависимости от типа бэкапа):
# Пример восстановления конфигурации /srv/gitlab из архива
sudo tar -xzf gitlab-config-2022-01-01.tgz -C /srv/gitlab
sudo docker restart gitlab_web_1Устранение неисправностей — основные случаи
- Контейнер не запускается:
- Посмотрите логи: docker-compose logs -f
- Проверьте права на /srv/gitlab (контейнер должен иметь доступ к монтируемым директориям).
- Невозможно получить SSL — порт 80 занят:
- Остановите сервисы, использующие 80, или получите сертификат с помощью DNS‑challenge.
- Проблемы с памятью — GitLab потребляет ресурсы:
- Убедитесь, что выделено >= 4 ГБ ОЗУ; для больших инсталляций требуется больше.
- SSH‑подключение не проходит:
- Проверьте перенаправление портов в docker‑compose и правила фаервола.
Роль‑ориентированные чек‑листы
Администратор (развёртывание):
- Настроил DNS на домен gitlab.example.com.
- Установил Docker и docker‑compose.
- Создал /srv/gitlab и установил правильные права.
- Получил SSL‑сертификат и dhparam.
- Запустил docker‑compose и проверил работу сервисов.
DevOps (эксплуатация):
- Настроил бэкапы и проверил восстановление.
- Внедрил мониторинг и алерты.
- Спланировал процесс обновления/отката.
Разработчик (первый вход):
- Получил инструкцию по SSH‑подключению (порт и ключи).
- Создал первый проект и выполнил push.
Критерии приёмки
- Контейнер gitlab_web_1 в состоянии Up.
- HTTPS доступ к веб‑интерфейсу по указанному домену.
- Возможность смены пароля root и входа в систему.
- Успешный git push по HTTPS и/или SSH (в соответствии с вашей конфигурацией).
- Наличие резервной копии конфигурации и данных.
Тесты и проверочные сценарии
- Запрос страницы логина — ожидаемый результат: статус 200 и форма входа.
- Смена пароля root — ожидаемый результат: успешное обновление и вход в систему.
- Создание проекта, клонирование, коммит и push — ожидаемый результат: репозиторий доступен, коммиты видны.
- Откат обновления: симулировать неудачное обновление и восстановить данные из бэкапа.
Модель принятия решений: Docker vs Omnibus
Используйте Docker когда:
- Вы хотите изолированную инсталляцию и быстрый деплой;
- Вы планируете контейнеризировать инфраструктуру и использовать orchestrator.
Используйте Omnibus‑пакет когда:
- Вы хотите минимизировать уровень абстракции и запускать GitLab как системную службу;
- Требуется простая инсталляция на «сырой» сервер без контейнеризации.
flowchart TD
A[Нужен GitLab] --> B{Контейнеризация?}
B -- Да --> C[Docker + Docker Compose]
B -- Нет --> D[Omnibus пакет]
C --> E{Требуется масштабирование}
E -- Да --> F[Orchestrator 'K8s/Swarm']
E -- Нет --> G[Локальный Docker Compose]Быстрый чеит‑шит команд
- Старт: docker-compose up -d
- Останов: docker-compose down
- Логи: docker-compose logs -f
- Состояние: docker-compose ps
- Внутри контейнера: docker exec -it gitlab_web_1 /bin/bash
- Статус сервисов: docker exec -it gitlab_web_1 gitlab-ctl status
- Создать бэкап: docker exec -t gitlab_web_1 gitlab-rake gitlab:backup:create
Безопасность и соответствие требованиям приватности
- Храните приватные ключи сертификатов в защищённой директории и ограничьте доступ.
- Используйте HTTPS для всех внешних подключений.
- Отключите неиспользуемые сервисы и ограничьте доступ по IP при необходимости.
- Для соответствия GDPR: документируйте, какие данные пользователей сохраняются, и настройте процессы удаления/экспорта данных по запросам.
Частые ошибки и советы по их устранению
- Проблемы с правами на /srv/gitlab: убедитесь, что владелец и права позволяют записи от UID контейнера.
- Certbot не может занять порт 80: временно остановите сервисы на 80 или используйте DNS‑challenge.
- Недостаточно RAM: увеличьте ресурсы VM или используйте более лёгкие компоненты для CI.
Итог и дальнейшие шаги
Вы успешно развернули GitLab CE в Docker на Ubuntu 20.04. Дальше рекомендуем:
- Настроить интеграцию CI/CD и runners;
- Внедрить мониторинг и оповещения;
- Настроить регламент обновлений и тестирование на стенде;
- Организовать регулярные бэкапы и их автоматическую проверку.
В конце — контрольный список для быстрой проверки установки:
- Docker запущен и работает.
- Контейнер gitlab_web_1 в состоянии Up.
- Веб‑интерфейс доступен по HTTPS.
- SSH для Git работает на назначенном порту.
- Резервное копирование протестировано.
Спасибо за внимание. При возникновении ошибок присылайте логи docker-compose для быстрого анализа.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента