Self-hosted GitLab CE: установка корпоративного git-сервера под ключ
Я Семёнов Евгений Сергеевич, руковожу АйТи Фреш. За 15 лет я поднял около двадцати GitLab-инсталляций: от маленьких «на 6 разработчиков» до корпоративных на 300+ пользователей с LDAP и HA. У нас на практике GitLab у клиентов живёт либо на виртуалках в их офисе, либо на наших серверах Dell Xeon Platinum 8280 в дата-центре МТС Москва. Разберём установку с нуля на Ubuntu 22.04.
Железо и ОС
| Размер команды | CPU | RAM | Диск |
|---|---|---|---|
| до 20 пользователей | 4 vCPU | 8 ГБ | 100 ГБ SSD |
| до 50 | 8 vCPU | 16 ГБ | 500 ГБ SSD |
| до 200 | 16 vCPU | 32 ГБ | 1 ТБ SSD |
| 200+ | разнос | на 2–3 ноды | выделенный PG+Redis |
Ubuntu 22.04 LTS или Rocky/RHEL 9. Swap — держите 4–8 ГБ, пригодится на пиковых бэкапах.
Установка Omnibus на Ubuntu 22.04
sudo apt update
sudo apt install -y curl openssh-server ca-certificates tzdata perl postfix
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
sudo EXTERNAL_URL="https://git.company.ru" apt install -y gitlab-ce
Первая инициализация занимает 5–10 минут. В /etc/gitlab/initial_root_password лежит временный пароль для root.
Базовый gitlab.rb
# /etc/gitlab/gitlab.rb
external_url 'https://git.company.ru'
letsencrypt['enable'] = true
letsencrypt['contact_emails'] = ['admin@company.ru']
# SMTP для нотификаций
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "mail.company.ru"
gitlab_rails['smtp_port'] = 587
gitlab_rails['smtp_user_name'] = "gitlab@company.ru"
gitlab_rails['smtp_password'] = "secret"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['gitlab_email_from'] = 'gitlab@company.ru'
gitlab_rails['gitlab_email_reply_to'] = 'noreply@company.ru'
# Таймзона
gitlab_rails['time_zone'] = 'Europe/Moscow'
# Производительность
puma['worker_processes'] = 4
postgresql['shared_buffers'] = "4GB"
sidekiq['max_concurrency'] = 20
sudo gitlab-ctl reconfigure
LDAP интеграция с AD
gitlab_rails['ldap_enabled'] = true
gitlab_rails['ldap_servers'] = {
'main' => {
'label' => 'Active Directory',
'host' => 'dc.corp.company.ru',
'port' => 636,
'uid' => 'sAMAccountName',
'encryption' => 'simple_tls',
'verify_certificates' => true,
'bind_dn' => 'CN=gitlab_bind,OU=Services,DC=corp,DC=company,DC=ru',
'password' => 'BindPassword',
'active_directory' => true,
'base' => 'OU=Users,DC=corp,DC=company,DC=ru',
'user_filter' => '(memberOf=CN=Developers,OU=Groups,DC=corp,DC=company,DC=ru)',
'group_base' => 'OU=Groups,DC=corp,DC=company,DC=ru'
}
}
TLS: Let's Encrypt или свой PKI
Omnibus умеет сам выписывать Let's Encrypt — letsencrypt['enable'] = true. Для внутренней сети без доступа к интернету — используйте свой AD CS:
letsencrypt['enable'] = false
nginx['ssl_certificate'] = "/etc/gitlab/ssl/git.company.ru.crt"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/git.company.ru.key"
Регистрация раннеров
Для CI/CD нужен минимум один раннер. Быстрый вариант — docker-executor на отдельной виртуалке:
curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | sudo bash
sudo apt install -y gitlab-runner
sudo gitlab-runner register \
--non-interactive \
--url "https://git.company.ru/" \
--token "glrt-xxxx" \
--executor "docker" \
--docker-image "alpine:latest" \
--docker-privileged \
--description "main-docker-runner"
Бэкапы
Главное правило: бэкап состоит из двух частей — дамп данных и конфиг. Без конфига дамп не восстановить.
# Бэкап данных (БД, repos, uploads, artifacts)
sudo gitlab-backup create STRATEGY=copy GZIP_RSYNCABLE="true"
# Бэкап конфига и секретов
sudo tar czf /var/opt/gitlab/backups/etc-gitlab-$(date +%F).tgz /etc/gitlab
В cron:
0 2 * * * /usr/bin/gitlab-backup create CRON=1 >> /var/log/gitlab-backup.log 2>&1
30 2 * * * tar czf /var/opt/gitlab/backups/etc-$(date +\%F).tgz /etc/gitlab
Храните бэкапы на отдельном сервере (rsync/borg/restic). Тестируйте восстановление раз в квартал.
Производительность
- Puma workers = ядра / 2, минимум 2.
- PostgreSQL shared_buffers = 25% ОЗУ (до 8 ГБ).
- Sidekiq concurrency = 10–25 в зависимости от нагрузки.
- Git repos — отдельный SSD (ReadAhead, noatime).
- LFS — отдельный объектный сторадж (MinIO, S3).
Мониторинг
Omnibus включает Prometheus и Grafana внутри. Достаточно открыть https://git.company.ru/-/grafana/ — там готовые дашборды по Puma, Sidekiq, PostgreSQL. Для внешнего мониторинга экспортируйте :9090/metrics в корпоративный Prometheus.
Реальный кейс: миграция с Bitbucket Server
Однажды в 2024 году к нам пришёл клиент — крупное региональное медиа, 64 разработчика на Bitbucket Server 7.x. Лицензия подорожала в 3 раза, плюс санкционные риски по Atlassian. Задача: мигрировать проекты и пайплайны на self-hosted GitLab CE.
За 6 рабочих дней мы развернули GitLab на виртуалке 16 vCPU / 32 ГБ (наш сервер Dell Xeon Platinum 8280, дата-центр МТС Москва), интегрировали с AD по LDAP, мигрировали 148 репозиториев через bbcloud → git bundle → gitlab. Переписали 32 пайплайна с Bitbucket Pipelines на GitLab CI. Стоимость — 240 000 руб. Экономия лицензий — около 1,8 млн руб./год.
Грабли
- Обновления ломаются при пропуске минорных версий. GitLab требует идти по Upgrade path. Читайте документацию.
- Забытый secret.yml в бэкапе. Восстановление не идёт. Всегда бэкапьте
/etc/gitlab. - Медленный git push. Часто виноват диск, а не GitLab. Проверяйте iostat и latency.
- Почта уходит с сервера в спам. Настройте SPF и DKIM через ваш почтовый сервер, не SMTP-сервер GitLab.
- Забыли про Container Registry. Поднимается отдельно в
gitlab.rb, иначе разработчики будут жаловаться.
Развернём GitLab под вашу команду
15+ лет опыта администрирования. Мы ставим, обновляем, мигрируем GitLab: CE, EE, SaaS → self-hosted, Bitbucket/Gitea → GitLab. 8 серверов Dell Xeon Platinum 8280 в дата-центре МТС Москва — для клиентов, кто не хочет держать железо на своей стороне.
Телефон: +7 903 729-62-41
Telegram: @ITfresh_Boss
Семёнов Евгений Сергеевич, директор АйТи Фреш
FAQ — Self-hosted GitLab
- Сколько ресурсов нужно на GitLab для 50 разработчиков?
- Минимум 8 vCPU, 16 ГБ ОЗУ, 500 ГБ SSD. Комфортно 16 vCPU / 32 ГБ. Для 200+ пользователей разносите на два сервера: application + отдельный PostgreSQL/Redis.
- Omnibus или Docker?
- Для single-сервера — Omnibus-пакет (один deb/rpm). Проще обновлять и обслуживать. Docker и Helm нужны для HA-развёртывания на нескольких нодах или в Kubernetes.
- GitLab CE или EE?
- CE бесплатен и покрывает 95% потребностей: репозитории, CI, issue, wiki, LDAP. EE нужен для corporate audit, epic management, advanced security сканирования. Для большинства МСП хватит CE.
- Как делать бэкап GitLab?
- gitlab-backup create для данных (БД, repos, uploads, artifacts). Отдельно копируйте /etc/gitlab (секреты, конфиг). Без секретов из /etc/gitlab бэкап не восстановится.
- Можно ли интегрировать с Active Directory?
- Да, через LDAP. В gitlab.rb настраиваются gitlab_rails['ldap_servers'] с bind_dn, user_filter, group_base. Пользователи логинятся доменной учёткой, группы AD маппятся в GitLab.