Установка GitLab Self-Hosted на свой сервер: полное руководство

Linux 24.03.2026 ~12 мин чтения Автор: АйТи Фреш
\"Установка

GitLab — мощная платформа для управления исходным кодом, CI/CD пайплайнами и DevOps-процессами. Многие компании предпочитают размещать GitLab на собственных серверах для полного контроля над данными и безопасностью. В этом руководстве мы подробно разберём установку GitLab Community Edition на Debian/Ubuntu-сервер с настройкой HTTPS через Let's Encrypt.

Зачем разворачивать GitLab на своём сервере

Прежде чем приступить к установке, стоит понять, какие преимущества даёт Self-Hosted GitLab по сравнению с облачным gitlab.com:

Совет: GitLab CE (Community Edition) бесплатен и включает все основные функции: Git-репозитории, CI/CD, Issue Tracker, Wiki, Container Registry. Для enterprise-функций (SAML SSO, аудит, advanced security) потребуется GitLab EE с лицензией.

Системные требования для GitLab

GitLab — достаточно ресурсоёмкое приложение. Минимальные требования для комфортной работы команды из 10-50 человек:

Важно: Не используйте сетевые диски (NFS, iSCSI) для основного хранилища GitLab — это приведёт к критическим проблемам с производительностью, особенно при работе с Git-операциями.

Подготовка DNS и домена

Для работы GitLab с HTTPS нужен домен. Есть два основных подхода:

Вариант 1: Собственный домен через Cloudflare

Если у вас есть домен, привяжите его DNS к Cloudflare для удобного управления записями и получения wildcard-сертификатов:

  1. Зарегистрируйте домен (reg.ru, namecheap и т.д.)
  2. Перенаправьте NS-записи на Cloudflare
  3. Создайте A-запись gitlab.yourdomain.ru на IP вашего сервера
  4. Получите API-токен Cloudflare (для certbot)

Вариант 2: Бесплатный поддомен Duck DNS

Для тестовых инсталляций подойдёт бесплатный сервис Duck DNS, предоставляющий поддомены формата *.duckdns.org:

# Регистрация на duckdns.org и привязка IP
echo url="https://www.duckdns.org/update?domains=mygitlab&token=YOUR_TOKEN&ip=" | curl -k -o ~/duckdns/duck.log -K -

Получение SSL-сертификата Let's Encrypt

Для HTTPS необходим SSL-сертификат. Let's Encrypt предоставляет их бесплатно. Установим certbot с плагином Cloudflare для DNS-валидации:

# Установка certbot
sudo apt update
sudo apt install -y certbot python3-pip
pip install certbot-dns-cloudflare --break-system-packages

Создадим файл с API-токеном Cloudflare:

# Конфигурация Cloudflare API
sudo mkdir -p /etc/letsencrypt
echo "dns_cloudflare_api_token = YOUR_CLOUDFLARE_API_TOKEN" | sudo tee /etc/letsencrypt/cloudflare.ini
sudo chmod 600 /etc/letsencrypt/cloudflare.ini

Запрашиваем wildcard-сертификат:

sudo certbot certonly \
  --dns-cloudflare \
  --agree-tos \
  --email admin@yourdomain.ru \
  --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini \
  --dns-cloudflare-propagation-seconds 60 \
  -d "*.yourdomain.ru"
Совет: Wildcard-сертификат (*.yourdomain.ru) позволяет использовать один сертификат для GitLab, Registry, Pages и других сервисов на поддоменах.

Установка GitLab CE

Переходим к основному этапу — установке GitLab. Сначала поставим необходимые зависимости:

# Установка зависимостей
sudo apt-get update
sudo apt-get install -y curl openssh-server ca-certificates tzdata perl postfix

При установке Postfix выберите «Internet Site» и укажите ваш домен. Далее подключим репозиторий GitLab:

# Подключение репозитория GitLab CE
curl -fsSL https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash

Запускаем установку с указанием внешнего URL:

# Установка GitLab CE
sudo EXTERNAL_URL="https://gitlab.yourdomain.ru" apt-get install gitlab-ce
Внимание: Процесс установки занимает 5-15 минут в зависимости от производительности сервера. Не прерывайте его.

Настройка SSL в GitLab

После установки нужно указать GitLab пути к SSL-сертификатам. Откройте основной конфигурационный файл:

sudo nano /etc/gitlab/gitlab.rb

Найдите и раскомментируйте строки для nginx SSL:

# /etc/gitlab/gitlab.rb — секция nginx SSL
nginx['ssl_certificate'] = "/etc/letsencrypt/live/yourdomain.ru/fullchain.pem"
nginx['ssl_certificate_key'] = "/etc/letsencrypt/live/yourdomain.ru/privkey.pem"
nginx['redirect_http_to_https'] = true

Применяем конфигурацию:

sudo gitlab-ctl reconfigure

Автообновление сертификата

Certbot автоматически обновляет сертификаты, но нужно перезагружать nginx GitLab после обновления:

# Создаём hook для перезагрузки nginx после обновления сертификата
sudo cat > /etc/letsencrypt/renewal-hooks/post/gitlab.sh <<'EOF'
#!/bin/sh
/usr/bin/gitlab-ctl restart nginx
EOF

sudo chmod 755 /etc/letsencrypt/renewal-hooks/post/gitlab.sh

Первичная настройка и вход в GitLab

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

# Получение временного пароля (действителен 48 часов)
sudo cat /etc/gitlab/initial_root_password | grep Password:

Откройте https://gitlab.yourdomain.ru в браузере и войдите:

После первого входа немедленно смените пароль через User Settings → Password.

Базовые настройки безопасности

  1. Отключите открытую регистрацию: Admin Area → Settings → General → Sign-up restrictions → Sign-up enabled (снять галку)
  2. Включите двухфакторную аутентификацию: Admin Area → Settings → General → Sign-in restrictions → Two-factor authentication → Enforce
  3. Ограничьте видимость проектов: Admin Area → Settings → General → Visibility → Default project visibility → Private

Настройка SMTP для отправки почты

GitLab отправляет уведомления о merge-request'ах, CI/CD статусах и прочих событиях. Настроим SMTP через Mail.ru (или Яндекс):

# /etc/gitlab/gitlab.rb — секция SMTP
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.mail.ru"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "gitlab@yourdomain.ru"
gitlab_rails['smtp_password'] = "your_app_password"
gitlab_rails['smtp_domain'] = "yourdomain.ru"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_tls'] = true
gitlab_rails['smtp_openssl_verify_mode'] = 'peer'
gitlab_rails['gitlab_email_from'] = 'gitlab@yourdomain.ru'
gitlab_rails['gitlab_email_display_name'] = 'GitLab'

Применяем и тестируем:

sudo gitlab-ctl reconfigure
sudo gitlab-rails console
# В консоли:
Notify.test_email('admin@yourdomain.ru', 'Test Subject', 'Test Body').deliver_now

Настройка GitLab Runner для CI/CD

GitLab Runner — агент, который выполняет задачи из пайплайнов CI/CD. Установим его на тот же или отдельный сервер:

# Установка GitLab Runner
curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | sudo bash
sudo apt-get install gitlab-runner

Регистрация Runner

Получите токен регистрации в Admin Area → CI/CD → Runners и зарегистрируйте Runner:

sudo gitlab-runner register \
  --url https://gitlab.yourdomain.ru \
  --token YOUR_REGISTRATION_TOKEN \
  --executor docker \
  --docker-image alpine:latest \
  --description "docker-runner-01"
Совет: Для production-среды рекомендуется Docker executor — он изолирует каждую сборку в отдельном контейнере. Shell executor проще, но менее безопасен.

Настройка бэкапов GitLab

Регулярные бэкапы — обязательный элемент production-инсталляции. GitLab предоставляет встроенный механизм:

# Ручное создание бэкапа
sudo gitlab-backup create

Настроим автоматические ежедневные бэкапы через cron:

# /etc/gitlab/gitlab.rb — секция backup
gitlab_rails['backup_keep_time'] = 604800  # хранить 7 дней
gitlab_rails['backup_path'] = "/var/opt/gitlab/backups"
# Cron-задача для ежедневного бэкапа в 2:00
echo "0 2 * * * root /opt/gitlab/bin/gitlab-backup create CRON=1" | sudo tee /etc/cron.d/gitlab-backup
Важно: Бэкап gitlab-backup create не включает конфигурационные файлы (/etc/gitlab/) и секреты (/etc/gitlab/gitlab-secrets.json). Бэкапьте их отдельно!

Восстановление из бэкапа

# Остановить сервисы, зависящие от БД
sudo gitlab-ctl stop puma
sudo gitlab-ctl stop sidekiq

# Восстановить (указать timestamp бэкапа)
sudo gitlab-backup restore BACKUP=1711234567_2024_03_23_16.9.0

# Перезапустить GitLab
sudo gitlab-ctl restart
sudo gitlab-rake gitlab:check SANITIZE=true

Оптимизация производительности

По умолчанию GitLab потребляет много памяти. Для серверов с 8 ГБ RAM рекомендуется настроить ограничения:

# /etc/gitlab/gitlab.rb — оптимизация памяти
puma['worker_processes'] = 2
sidekiq['max_concurrency'] = 10
postgresql['shared_buffers'] = "256MB"
postgresql['max_worker_processes'] = 4
prometheus_monitoring['enable'] = false  # отключить если не нужен мониторинг
sudo gitlab-ctl reconfigure

Мониторинг состояния GitLab

Проверяйте состояние сервисов регулярно:

# Статус всех сервисов
sudo gitlab-ctl status

# Проверка целостности
sudo gitlab-rake gitlab:check

# Просмотр логов
sudo gitlab-ctl tail

Настройка Container Registry

GitLab может работать как Docker Registry для хранения образов контейнеров:

# /etc/gitlab/gitlab.rb — Container Registry
registry_external_url 'https://registry.yourdomain.ru'
registry_nginx['ssl_certificate'] = "/etc/letsencrypt/live/yourdomain.ru/fullchain.pem"
registry_nginx['ssl_certificate_key'] = "/etc/letsencrypt/live/yourdomain.ru/privkey.pem"
sudo gitlab-ctl reconfigure

После этого в проектах появится раздел Packages & Registries → Container Registry, а образы можно пушить через:

docker login registry.yourdomain.ru
docker build -t registry.yourdomain.ru/myproject/myapp:latest .
docker push registry.yourdomain.ru/myproject/myapp:latest

Интеграция с LDAP/Active Directory

Для корпоративных инсталляций критично подключение к существующей службе каталогов:

# /etc/gitlab/gitlab.rb — LDAP
gitlab_rails['ldap_enabled'] = true
gitlab_rails['ldap_servers'] = {
  'main' => {
    'label' => 'Corporate LDAP',
    'host' => 'ldap.yourdomain.ru',
    'port' => 636,
    'uid' => 'sAMAccountName',
    'encryption' => 'simple_tls',
    'bind_dn' => 'CN=gitlab,OU=Service,DC=yourdomain,DC=ru',
    'password' => 'ldap_bind_password',
    'base' => 'DC=yourdomain,DC=ru',
    'active_directory' => true
  }
}

Обновление GitLab

Регулярные обновления важны для безопасности. GitLab поддерживает обновление через пакетный менеджер:

# Создать бэкап перед обновлением
sudo gitlab-backup create

# Обновить GitLab
sudo apt-get update
sudo apt-get install gitlab-ce

# Проверить статус
sudo gitlab-ctl status
sudo gitlab-rake gitlab:check
Внимание: Всегда обновляйтесь последовательно между мажорными версиями. Нельзя прыгнуть с 15.x на 17.x — нужно пройти через 16.x. Проверяйте upgrade paths в документации.

Итоги

Мы развернули полноценный GitLab Self-Hosted с SSL, почтой, CI/CD Runner, Container Registry и бэкапами. Такая инсталляция подходит для команд любого размера и обеспечивает полный контроль над инфраструктурой разработки.

Ключевые моменты, о которых стоит помнить:

Часто задаваемые вопросы (FAQ)

Сколько оперативной памяти нужно для GitLab Self-Hosted?

Минимум 8 ГБ для команды до 50 человек. Рекомендуется 16 ГБ для комфортной работы с CI/CD и Container Registry. GitLab активно использует PostgreSQL и Redis, которые требуют достаточного объёма RAM.

Можно ли установить GitLab бесплатно?

Да, GitLab Community Edition (CE) полностью бесплатен и включает Git-репозитории, CI/CD, Issue Tracker, Wiki и Container Registry. Enterprise Edition (EE) требует лицензии для расширенных функций.

Как часто нужно обновлять GitLab?

Рекомендуется обновлять как минимум раз в месяц для получения патчей безопасности. Всегда следуйте официальным upgrade paths и делайте бэкап перед обновлением.

Как перенести репозитории с GitHub на GitLab?

GitLab имеет встроенный импортёр. Перейдите в New Project, выберите Import project, укажите GitHub и авторизуйтесь. GitLab перенесёт репозитории, issues, merge requests и wiki.

Можно ли использовать GitLab без домена?

Да, можно использовать IP-адрес или бесплатный поддомен Duck DNS. Однако для HTTPS с Let's Encrypt потребуется доменное имя. Для локальной сети можно использовать самоподписанный сертификат.

Как настроить GitLab для работы за reverse proxy?

В gitlab.rb укажите external_url с нужным доменом, настройте nginx['listen_port'] и nginx['listen_https'] = false, а проксирование реализуйте на внешнем nginx/haproxy с SSL-терминацией.

IT-аутсорсинг для бизнеса

Нужна помощь с настройкой серверов и IT-инфраструктуры?

Компания АйТи Фреш — профессиональный IT-аутсорсинг в Москве и регионах. Настроим, защитим и будем поддерживать вашу инфраструктуру 24/7.

10+лет опыта
500+клиентов
24/7поддержка