Немного заметок по GitLab

Продолжаем переезжать с xWiki на WordPress и сегодня перетащу пачку старых заметок по GitLab вдруг кому пригодится.

Настройка GitLab runner с поддержкой Docker Executor в Debian 10

Настройка Docker на хосте

# apt-get remove docker docker-engine docker.io containerd runc
# apt-get install ca-certificates curl gnupg lsb-release
# curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# echo   "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
 $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
# apt-get update
# apt-get install docker-ce docker-ce-cli containerd.io

Устанавливаем службу Gitlab Runner

# curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | bash
# apt-get install gitlab-runner
# systemctl enable gitlab-runner
# systemctl start gitlab-runner

Регистрируем Gitlab Runner в GitLab

# gitlab-runner register -n  --url https://git.stagono.io  --registration-token XXXXXXXXXXX --executor docker \
--description "DOCKER-BUILDER-01" --docker-image "docker:20.10.5" --docker-volumes /var/run/docker.sock:/var/run/docker.sock

Установка GitLab в Ubuntu 20.04 и Centos 8 (и немного про Gitea)

С GitLab я работаю уже не один год и у меня накопился довольно большой опыт администрирования, установки и настройки. Что можно сказать в двух словах про гитлаб. Вещь прекрасная, практически все есть сразу и из коробки и реджестри и артефакты и кодревью и собственно Git. Но как вы наверное понимаете, такой комбайн потребляет огромное количество ресурсов и на мой взгляд использование его на небольших VPS и для небольших команд смысла не имеет. 

Так-же желательно чтобы был выделенный белый IP-адрес и устанавливаться на отдельную VPS без Docker или Kubernates. Это конечно мое личное мнение не претендующее на истину в первой инстанции и для небольших команд и проектов я бы рекомендовал использовать Gitea.

Установка Gitea

Раз уж я сказал про Gitea, то давайте в двух словах расскажу про установку этого “Аналога GitLab”. Это к вашему сведению относительно небольшое приложение на GO и представляет собой просто бинарный файл который можно запустить и ваш сервис будет сразу рабочим.

Создаем каталог в /opt/ где будет жить сервис, скачиваем файл и делаем исполняемым:

# mkdir /opt/gitea
# cd /opt/gitea/
# wget -O gitea https://dl.gitea.io/gitea/1.17.3/gitea-1.17.3-linux-amd64
# chmod +x ./gitea

Создаем пользователя от имени которого будет запускаться Gitea и тестовый запуск

# adduser --system --shell /bin/bash --gecos 'Gitea' --group --disabled-password --home /opt/gitea/ git
# chown -R git:git /opt/gitea/
# su git
$ ./gitea --port 18001

Теперь можно подключиться браузером на указанный порт (в моем случае http://185.135.80.10:18001)

Базовая настройка довольно простая.

  • Создаем базу данных и пользователя
  • В настройках web-интерфейса прописываем базу и пока больше ничего не меняем

Настройка для запуска в реальном окружении.

  • Создаем домен где все это будет крутиться
  • Получаем сертификат Let’s encrypt
  • Создаем реверс-прокси на домен
  • Меняем в настройках конфига все под созданный домен

SystemD unit для запуска Gitea:

[Unit]
Description=Gitea (Git with a cup of tea)
After=syslog.target
After=network.target
[Service]
LimitNOFILE=524288:524288
RestartSec=2s
Type=simple
User=git
Group=git
WorkingDirectory=/opt/gitea
ExecStart=/opt/gitea/gitea web --port 18001
Restart=always
Environment=USER=git HOME=/opt/gitea/ GITEA_WORK_DIR=/opt/gitea/

[Install]
WantedBy=multi-user.target

Установка GitLab в Ubuntu 20.04
Установка необходимых пакетов

# apt-get update
# apt-get upgrade
# apt-get install -y curl openssh-server ca-certificates tzdata perl mc wget aptitude
# apt-get install -y postfix

Подключаем CE-репозитарий

# curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash

Получаем список всех доступных версий GitLab

# apt-cache madison gitlab-ce

Устанавливаем определенную версию

# sudo EXTERNAL_URL="https://git.aagt.ru" apt-get install gitlab-ce=14.8.2-ce.0

Установка GitLab в Centos 8 (Локально)
Исходная системна на которую проводится установка GitLab.

cat /etc/redhat-release

CentOS Linux release 8.3.2011

Устанавливаем необходимые для работы пакеты:

# dnf install -y curl policycoreutils openssh-server perl
# systemctl enable sshd
# systemctl start sshd
# dnf install postfix
# systemctl enable postfix
# systemctl start postfix

Подключаем репозиторий Gitlab CE:

# curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash

Устанавливаем GitLab CE

sudo EXTERNAL_URL="http://37.194.5.244" dnf install -y gitlab-ce

Запускаем Gitlab CE и настраиваем автозапуск:

# systemctl enable gitlab-runsvdir.service
# systemctl enable gitlab-runsvdir.service

Запуск GitLab CE в Docker-контейнере
Конфигурация docker-compose.yml для запуска gitlab и будущего отдельного хранилища баз данных postgresql с назначением хостов расположения контейнеров


version: "3.9"
services:
    postgresql:
      image: postgres:11.2-alpine
      ports:
        - '5432:5432'
      volumes:
        - /opt/interlan/postgresql-data:/var/lib/postgresql/data
        - /etc/localtime:/etc/localtime:ro
      # swarm
      deploy:
        placement:
          constraints:
            - "node.labels.hostname == srv-prod-db-01"

    gitlab:
      image: 'gitlab/gitlab-ce:15.5.1-ce.0'
      hostname: 'git.interlan.xyz'
      ports:
        - '18080:80'
        - '2224:22'
      volumes:
        - '/opt/interlan/gitlab/config:/etc/gitlab'
        - '/opt/interlan/gitlab/logs:/var/log/gitlab'
        - '/opt/interlan/gitlab/data:/var/opt/gitlab'
        - '/opt/interlan/gitlab/backups:/var/opt/gitlab/backups'
      # swarm
      deploy:
        placement:
          constraints:
            - "node.labels.hostname == srv-prod-app-01"

Настройка параметров конфигурации gitlab.rb
Для применения параметров конфигурации используется команда

docker exec -it 86e6a7464d8a gitlab-ctl reconfigure

Где 86e6a7464d8a это идентификатор контейнера на хосте и в моем случае я внес следующие правки в конфигурацию gitlab.rb

external_url 'http://git.interlan.xyz'
gitlab_rails['gitlab_ssh_host'] = 'git.interlan.xyz'
gitlab_rails['gitlab_shell_ssh_port'] = 2224
letsencrypt['enable'] = false
Настройки резервного копирования

gitlab_rails['manage_backup_path'] = true
gitlab_rails['backup_path'] = "/var/opt/gitlab/backups"
gitlab_rails['backup_keep_time'] = 604800

Запуск резервного копирования командой:

# docker exec -it 4dbfb4cc80d9 gitlab-rake gitlab:backup:create

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

# cat ./database.sql | psql -h 10.240.250.3 -U gitlab_user gitlab_db

Меняем настройки подключения к базе данных и вместо внутренней СУБД идем к внешней.

gitlab_rails['db_adapter'] = "postgresql"
gitlab_rails['db_encoding'] = "unicode"
gitlab_rails['db_collation'] = nil
gitlab_rails['db_database'] = "gitlab_db"
gitlab_rails['db_username'] = "gitlab_user"
gitlab_rails['db_password'] = "PASSWORD"
gitlab_rails['db_host'] = "10.240.250.3"
gitlab_rails['db_port'] = 5432
gitlab_rails['auto_migrate'] = true
gitlab_rails['rake_cache_clear'] = true

Переконфигурируем и запускаемся на внешней базе. Для чистоты эксперимента можем попробовать развернуть бэкап.

# docker exec -it 0917454b68eb gitlab-backup restore BACKUP=1667040952_2022_10_29_15.5.1

P.S. Внутренний Postgresql отключается

postgresql['enable'] = false

Оптимизация GitLab для слабых VPS-серверов

Как я уже многократно говорил, GitLab не подходит для запуска на слабых VPS-серверах и минимальными требованиями для комфортной работы небольшой команды является 4гб оперативной памяти и 4 процессорных ядра. Но все же есть несколько практик как настроить GitLab для пусть не совсем комфортной, но возможности полноценной работы на слабых VPS.

Отключаем опции у проектов по умолчанию (wiki, snippets) и т.п.

gitlab_rails[‘gitlab_default_projects_features_issues’] = false
gitlab_rails[‘gitlab_default_projects_features_merge_requests’] = true
gitlab_rails[‘gitlab_default_projects_features_wiki’] = false
gitlab_rails[‘gitlab_default_projects_features_snippets’] = false
gitlab_rails[‘gitlab_default_projects_features_builds’] = true
gitlab_rails[‘gitlab_default_projects_features_container_registry’] = true
gitlab_rails[‘terraform_state_enabled’] = false

Уменьшаем параметр vm.swappiness в файле /etc/sysctl.conf

vm.swappiness=10

Отключаем exporter-ы и хелфчеки

sidekiq[‘metrics_enabled’] = false
sidekiq[‘health_checks_enabled’] = false
node_exporter[‘enable’] = false
prometheus_monitoring[‘enable’] = false

Отключаем кластеризацию puma

puma[‘worker_processes’] = 0

Оптимизация различных сервисов

sidekiq[‘max_concurrency’] = 5

gitaly[‘ruby_max_rss’] = 200_000_000
gitaly[‘concurrency’] = [
  {
    ‘rpc’ => “/gitaly.SmartHTTPService/PostReceivePack”,
    ‘max_per_repo’ => 3
  }, {
    ‘rpc’ => “/gitaly.SSHService/SSHUploadPack”,
    ‘max_per_repo’ => 3
  }
]

gitaly[‘cgroups_repositories_count’] = 2
gitaly[‘cgroups_mountpoint’] = ‘/sys/fs/cgroup’
gitaly[‘cgroups_hierarchy_root’] = ‘gitaly’
gitaly[‘cgroups_memory_bytes’] = 500000
gitaly[‘cgroups_cpu_shares’] = 512

gitaly[‘env’] = {
  ‘GITALY_COMMAND_SPAWN_MAX_PARALLEL’ => ‘2’
}

Меняем модель управления памятью

gitlab_rails[‘env’] = {
  ‘MALLOC_CONF’ => ‘dirty_decay_ms:1000,muzzy_decay_ms:1000’
}

gitaly[‘env’] = {
  ‘MALLOC_CONF’ => ‘dirty_decay_ms:1000,muzzy_decay_ms:1000’
}

Отключаем дополнительные мониторинги

  • Go to GitLab web interface.
  • On the top bar, select Main menu > Admin.
  • On the left sidebar, select Settings > Metrics and profiling.
  • Expand Metrics – Prometheus.
  • Disable Enable Prometheus Metrics.
  • Select Save changes.

Настройка отправки электронной почты (STARTTLS на 25-ом порту)

В файле /etc/gitlab/gitlab.rb меняем параметры:

gitlab_rails[‘smtp_enable’] = true
gitlab_rails[‘smtp_address’] = “mail.bds.su”
gitlab_rails[‘smtp_port’] = 25
gitlab_rails[‘smtp_user_name’] = “git@interlan.xyz”
gitlab_rails[‘smtp_password’] = “xxxPASSWORDxxx”
gitlab_rails[‘smtp_domain’] = “interlan.xyz”
gitlab_rails[‘smtp_authentication’] = “plain”
gitlab_rails[‘smtp_tls’] = false
gitlab_rails[‘smtp_enable_starttls_auto’] = true
gitlab_rails[‘smtp_ssl’] = false
gitlab_rails[‘smtp_force_ssl’] = false
gitlab_rails[‘gitlab_email_from’] = ‘git@interlan.xyz’
gitlab_rails[‘gitlab_email_reply_to’] = ‘git@interlan.xyz’

Так-же в файле /opt/gitlab/embedded/service/gitlab-rails/config/environments/production.rb изменяем параметр

config.action_mailer.delivery_method = :sendmail

на 

config.action_mailer.delivery_method = :smtp

Задаем логин-пароль командой:

gitlab-rake gitlab:smtp:secret:edit EDITOR=vim

Изменяем параметры:

user_name: ‘smtp user’
password: ‘smtp password’

Запускаем реконфигурирование GitLab:

# gitlab-ctl reconfigure

Проверка отправки электронной почты:

# gitlab-rails console
Notify.test_email(‘chernousov@interlan.xyz’, ‘Test message’, ‘Hello!!!’).deliver_now

Конфигурация отправки электронной почты без авторизации

gitlab_rails[‘smtp_enable’] = true
gitlab_rails[‘smtp_address’] = “10.77.77.101”
gitlab_rails[‘smtp_port’] = 25
gitlab_rails[‘smtp_domain’] = “code.smsfinance.ru”

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *