Как на хостовой Ubuntu установить автономный GitLab (self-hosted) с помощью Vagrant

1. Создание Vagrant-проекта

Если с нуля
Предварительная установка окружения https://fkn.ktu10.com/?q=node/17436
и после этого собственно создание Vagrant-проекта такими командами:

mkdir ~/my-vagrant
cd ~/my-vagrant
vagrant init
touch provision.sh
chmod +x provision.sh

Если Vagrant-проект уже существует
Перейдём в папку проекта и создадим там файл provision.sh:

touch provision.sh
chmod +x provision.sh

2. Создание локальных копий удалённых репозиторий в хостовой системе

Перед запуском виртуальной машины все микросервисы, указанные в Vagrantfile, должен уже находиться в папке проекта my-vagrant. Поэтому, из данной папки выполним такую команду для каждого репозитория:

git clone <АдресРепозитория>

Вместо <АдресРепозитория> подставьте URL вашего репозитория!

3. Редактирование Vagrantfile — замените содержимое файла на следующее:

# -*- mode: ruby -*-
Vagrant.configure("2") do |config|
  # Используем официальную Ubuntu 22.04 LTS (Jammy)
  config.vm.box = "ubuntu/jammy64"

  # Настройка провайдера VirtualBox
  config.vm.provider "virtualbox" do |vb|
    vb.name = "ubuntu2204-vbox"    # имя виртуальной машины в VirtualBox
    vb.memory = 6144               # 6 ГБ оперативки — безопасный минимум для GitLab
    vb.cpus = 4                    # 4 CPU
    vb.gui = false                 # без GUI, если нужна — true
    vb.customize [
          "storageattach", :id,
          "--storagectl", "IDE", # ← вот контроллер, имя узнать можно так: "VBoxManage showvminfo ubuntu2204-vbox | grep -i controller"
          "--port", "1",
          "--device", "0",
          "--type", "dvddrive",
          "--medium", "/home/<your-name>/my-vagrant/VBoxGuestAdditions_7.1.10.iso" # вместо <your-name> подставьте ваше имя пользователя!
    ]
  end

  # Настройка приватной сети с IP
  config.vm.network "private_network", ip: "192.168.56.10"

  # Синхронизация папок (тип "virtualbox" по умолчанию для Linux-хостов)
  config.vm.synced_folder "ktu-articles", "/var/www/ktu-articles", type: "virtualbox"
  config.vm.synced_folder "ktu-backend-pack", "/var/www/ktu-backend-pack", type: "virtualbox"
  config.vm.synced_folder "ktu-backend-test", "/var/www/ktu-backend-test", type: "virtualbox"

  # Установка необходимых пакетов и окружения
  config.vm.provision "shell",
    path: "provision.sh",
    env: {
      # "REG_TOKEN"      => "PASTE_YOUR_REGISTRATION_TOKEN_HERE_from_gitlab", # <-- свой токен сюда
      "FALLBACK_TOKEN" => "",
      "GITLAB_URL"     => "http://192.168.56.10"
    }
end

4. Редактирование provision.sh — вставьте в файл следующее содержимое:

#!/bin/bash

# Не взаимодействовать с пользователем при установке (для предотвращения зависаний)
export DEBIAN_FRONTEND=noninteractive

# Прерывать выполнение скрипта при любой ошибке команды
set -e

echo "Проверка и восстановление dpkg, если был прерван..."
dpkg --configure -a || true

echo "Обновление списка пакетов..."
apt-get update -y
apt-get upgrade -y

echo "Установка Make и необходимых утилит..."
apt-get install -y make ca-certificates curl gnupg lsb-release dkms build-essential linux-headers-$(uname -r) 

echo "Установка GPG ключа Docker (если ещё нет)..."
if [ ! -f /etc/apt/keyrings/docker.gpg ]; then
  install -m 0755 -d /etc/apt/keyrings
  curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
  chmod a+r /etc/apt/keyrings/docker.gpg
fi

echo "Добавление репозитория Docker (если не добавлен)..."
if [ ! -f /etc/apt/sources.list.d/docker.list ]; then
  echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" \
  | tee /etc/apt/sources.list.d/docker.list > /dev/null
fi

echo "Повторное обновление пакетов..."
apt-get update -y

echo "Установка Docker и Compose Plugin..."
apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

echo "Добавление пользователя vagrant в группу docker..."
if getent group docker > /dev/null; then
  usermod -aG docker vagrant
fi

echo "Проверка, входит ли пользователь vagrant в группу docker..."
if id vagrant | grep -q '\\bdocker\\b'; then
  echo 'Пользователь vagrant уже в группе docker.'
else
  echo 'ВНИМАНИЕ: Пользователь vagrant ещё не в группе docker.'
  echo 'Для применения групп выполните команду: "vagrant reload" или "vagrant destroy && vagrant up" чтобы применить изменения.'
fi

echo "✅ Установка Docker завершена."

if command -v gitlab-ctl >/dev/null 2>&1; then
  echo "✅ GitLab уже установлен. Пропускаем установку."
else
  echo "Установка зависимостей GitLab..."
  apt-get install -y openssh-server tzdata perl postfix

  echo "Добавление официального репозитория GitLab..."
  curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | bash

  echo "[INFO] Установка GitLab CE..."
  EXTERNAL_URL="http://192.168.56.10" apt-get install -y gitlab-ce
fi

echo "Оптимизация / настройка gitlab.rb с отключёнными службами..."
cat <<EOF > /etc/gitlab/gitlab.rb
external_url 'http://192.168.56.10'
puma['worker_processes'] = 1
puma['worker_timeout'] = 60
sidekiq['max_concurrency'] = 5
# sidekiq['enable'] = false
prometheus_monitoring['enable'] = false
alertmanager['enable'] = false
node_exporter['enable'] = false
redis_exporter['enable'] = false
postgres_exporter['enable'] = false
EOF

echo "Применение конфигурации GitLab..."
RUBYOPT='-W0' gitlab-ctl reconfigure

echo "Ожидание доступности веб-интерфейса GitLab..."
until curl -s http://localhost/users/sign_in | grep -q 'GitLab'; do
  echo "Ждём, пока интерфейс GitLab загрузится..."
  sleep 5
done

echo "Установка пароля root-пользователя..."
# root-пароль 'mytest12' задан только для локальной разработки. Не используйте в продакшене!
gitlab-rails runner "
  u = User.find_by_username('root');
  u.password = 'mytest12';
  u.password_confirmation = 'mytest12';
  u.save!
" || echo 'Ошибка при установке пароля root'

echo "✅ Установка или настройка GitLab завершена. Доступен по адресу: http://192.168.56.10 (Логин: root, Пароль: mytest78)" | tee /tmp/gitlab_ready.log

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

# Параметры
RUNNER_NAME="vagrant-runner"
RUNNER_TAGS="vagrant,ci"

# Попытка получить токен автоматически из GitLab через rails
if [ -z "$REG_TOKEN" ]; then
  echo "Пытаемся получить registration_token из GitLab через rails..."
  REG_TOKEN=$(gitlab-rails runner -e production "puts Gitlab::CurrentSettings.current_application_settings.runners_registration_token" 2>/dev/null)
fi
if [ -z "$REG_TOKEN" ]; then
  echo "Не удалось получить токен автоматически. Используем fallback..."
  REG_TOKEN="$FALLBACK_TOKEN"
fi
if [ -z "$REG_TOKEN" ]; then
  echo "Токен не найден. Завершаем установку."
  exit 1
else
  echo "✅ Токен успешно получен: $REG_TOKEN"
fi
# Этот способ работает только внутри самой GitLab VM, потому что использует gitlab-rails

# Проверка, зарегистрирован ли Runner
EXISTING_RUNNER=$(gitlab-runner list 2>/dev/null | grep "$RUNNER_NAME" || true)

if [ -z "$EXISTING_RUNNER" ]; then
  echo "Регистрируем GitLab Runner..."
  sudo gitlab-runner register --non-interactive \
    --url "$GITLAB_URL/" \
    --registration-token "$REG_TOKEN" \
    --executor "shell" \
    --description "$RUNNER_NAME" \
    --tag-list "$RUNNER_TAGS" \
    --run-untagged="true" \
    --locked="false"
else
  echo "GitLab Runner уже зарегистрирован."
fi

sudo gitlab-runner start

echo "✅ Установка GitLab Runner завершена."

5. Запуск виртуальной машины

Из папки проекта выполним команду:
если Vagrant-проект был создан сейчас и ранее никогда не запускался:

vagrant up

после выполнения команды свободное место на диске уменьшится на ~10ГБ
если Vagrant-проект существовал ранее и сейчас только внесли изменения в Vagrantfile и provision.sh:

vagrant up --provision

после выполнения команды свободное место на диске уменьшится на ~7ГБ
Время выполнения каждой из команд может занять до одного часа.

6. Настройка и работа с GitLab

Если всё прошло успешно, из браузера из хостовой системы GitLab будет доступен по адресу:
http://192.168.56.10
Логин "root" пароль "mytest12". Не используйте этот пароль в продакшене!
После включения компьютера если нужно стартовать GitLab — из папки проекта команда:

vagrant up

на выполнение команды может уйти несколько минут.

Добавим второй remote, чтобы оставить обе платформы — и Bitbucket и GitLab
например:

cd ./ktu-articles
git remote add gitlab http://192.168.56.10/root/ktu-articles.git
git push -u gitlab master

После этого проект должен быть доступен по адресу:
http://192.168.56.10/root/ktu-articles

Во время работы над проектом пушить изменения в GitLab командой:

git push gitlab master

логин "root" пароль "mytest12"

7. Опционально, если мы хотим сделать GitLab remote по умолчанию

Чтобы просто писать "git push", и он шёл в GitLab, а не в Bitbucket, нужно переопределить remote origin:

git remote set-url origin http://192.168.56.10/root/ktu-articles.git

После этого проверим текущее подключение:

git remote show origin

Ожидаемый результат:

Username for 'http://192.168.56.10':

8. Настройка SSH-доступа с основной машины к GitLab

1) Проверим, есть ли уже SSH-ключ

ls ~/.ssh/id_rsa.pub

Если файл существует — переходим к шагу 3.
Если не существует — нужно создать ключ.

2) Создадим SSH-ключ (если его нет)

ssh-keygen -t rsa -b 4096 -C "<your-name>@bitbucket.org"

Вместо <your-name> подставьте ваше имя на почте bitbucket!
Просто жмём Enter в ответ на все вопросы — по умолчанию он создаст ключ в ~/.ssh/id_rsa.

3) Скопируем публичный ключ

cat ~/.ssh/id_rsa.pub

Копируем весь вывод (он должен начинаться с ssh-rsa и заканчиваться почтой).

4) Добавим ключ в GitLab

В правом верхнем углу жмём на иконку пользователя (обычно круг с инициалами или аватар)
В выпадающем меню выбираем "Preferences" или "Edit profile" (в зависимости от версии GitLab)
Нажимаем кнопку "Add new key"
(попадаем в итоге на страницу вроде http://192.168.56.10/-/user_settings/ssh...)
Вставляем туда скопированный из предыдущего шага публичный ключ
Можно назвать ключ, например, "vagrant-pc"
Жмём "Add key"

5) Проверим соединение с GitLab по SSH

Из хостовой системы из папки проекта (например, ~/my-vagrant/ktu-articles):

ssh -T git@192.168.56.10

Если всё работает, увидим примерно это:

Welcome to GitLab, @root!

Если видим сообщение "The authenticity of host can't be established" — введи yes и продолжи.

6) Изменим URL репозитория на SSH

Посмотрим список текущих удалённых репозиториев (remote):

git remote -v

Заменим GitLab remote на SSH:

git remote set-url gitlab git@192.168.56.10:root/ktu-articles.git

7) Теперь можем пушить без пароля

git push gitlab master

или если мы сделали GitLab remote по умолчанию, то:

git push

8) Материалы по теме SSH-доступа

Настройка SSH без пароля: https://fkn.ktu10.com/?q=node/5789
Ubuntu Настройка SSH с авторизацией по ключу: https://fkn.ktu10.com/?q=node/8498