Vagrant Как на хостовой Ubuntu с ядром 6.8 автоматически в VirtualBox создать виртуальную машину и развернуть в ней микросервис

Предварительная установка окружения

1. Установка Vagrant версии 2.4.7

Лучше установить вручную — это гарантирует установку именно версии 2.4.7:

wget -O /tmp/vagrant_2.4.7-1_amd64.deb https://releases.hashicorp.com/vagrant/2.4.7/vagrant_2.4.7-1_amd64.deb
sudo apt install /tmp/vagrant_2.4.7-1_amd64.deb

Проверим установленную версию:

vagrant --version

ожидаемый вывод: "Vagrant 2.4.7"

2. Установка VirtualBox версии 7.1

Сначала скачать дистрибутив, потом установить: https://fkn.ktu10.com/?q=node/16210

Либо можно всё сделать командами через терминал:
Добавим ключи репозитория:

wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | sudo apt-key add -
wget -q https://www.virtualbox.org/download/oracle_vbox.asc -O- | sudo apt-key add -

Добавим официальный репозиторий VirtualBox (замените "jammy" на свою версию Ubuntu, например, focal, bionic):

echo "deb [arch=amd64] https://download.virtualbox.org/virtualbox/debian jammy contrib" | sudo tee /etc/apt/sources.list.d/virtualbox.list

Обновим список пакетов:

sudo apt update

Собственно установим VirtualBox:

sudo apt install virtualbox-7.1

Проверим установленную версию:

VBoxManage --version

ожидаемый вывод: "7.1.10r169112"

3. Установка подходящего компилятора

Проверим текущий компилятор в текущей системе:

gcc --version

например: gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
Проверим, каким компилятором собрано ядро:

cat /proc/version 

например: x86_64-linux-gnu-gcc-12
Если их версии совпадают, этот шаг пропустить.

Иначе установим компилятор gcc-12:

sudo apt install gcc-12

Зарегистрируем альтернативы:

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 110
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 120

Выберем нужную версию:

sudo update-alternatives --config gcc

Проверим результат:

gcc --version  

ожидаемый вывод: "gcc (Ubuntu 12.3.0-1ubuntu1~22.04) 12.3.0"

4. После выполним пересборку и установку ядренных модулей VirtualBox

sudo /sbin/vboxconfig

5. Если уже был установлен плагин vagrant-vbguest — лучше его удалить

В последних версиях VirtualBox и Vagrant плагин всё чаще не справляется — особенно с Ubuntu 22.04+ и VirtualBox 7+. При его наличии могут возникать конфликты или ошибки при запуске проекта. Рекомендуется ставить Guest Additions вручную или через shell-скрипт внутри ВМ.

vagrant plugin uninstall vagrant-vbguest

Создание с помощью Vagrant виртуальной машины с микросервисом (например, ktu-auth) внутри

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

mkdir ~/my-vagrant
cd ~/my-vagrant
vagrant init

Таким образом, в домашней директории пользователя создаётся директория проекта "my-vagrant", а команда "vagrant init" создаст в ней дефолтный файл Vagrantfile.

2. Создание локальной копии удалённого репозитория

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

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

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

3. Монтаж образа Гостевых дополнений

Скачаем ISO отсюда: https://download.virtualbox.org/virtualbox/7.1.10/VBoxGuestAdditions_7.1.10.iso
и поместим его в папку проекта "my-vagrant" (путь к этой папке пропишем в нашем Vagrantfile)

Или можно из папки проекта скачать командой:

wget https://download.virtualbox.org/virtualbox/7.1.10/VBoxGuestAdditions_7.1.10.iso

4. Автоматизация управления над Virtualbox

Отредактируем 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 = 2048               # выделяем 2 ГБ оперативки
    vb.cpus = 2                    # 2 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

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

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

  # Установка необходимых пакетов
  config.vm.provision "shell", inline: <<-SHELL
    # Не взаимодействовать с пользователем при установке (для предотвращения зависаний)
    export DEBIAN_FRONTEND=noninteractive

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

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

    echo "Обновление списка пакетов..."
    apt-get update -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 "Очистка кэша пакетов..."
    apt-get autoremove -y

    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 "✅ Установка завершена."
  SHELL
end

Вместо <your-name> (строка 18) подставьте ваше имя пользователя в Ubuntu!

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

VirtualBox может быть не запущен. Из папки проекта выполним команду:

vagrant up

В этом шаге Vagrant:

  • скачает образ Ubuntu (если его нет)
  • создаст и запустит ВМ
  • настроит сеть
  • установит окружение
  • запустит сервер

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

В нормальной работе с Vagrant не стоит входить в ОС через VirtualBox вручную (но если очень нужно, то вот стандартные учётные данные для всех Vagrant-образов Ubuntu: логин: vagrant пароль: vagrant).

1. Войдём в гостевую VM из основной системы

Если находитесь не в папке проекта, можно перейти в неё так:

cd ~/my-vagrant

Из папки проекта на основной системе выполним команду:

vagrant ssh

таким образом зашли в гостевую систему через терминал хостовой системы:

vagrant@ubuntu-jammy:~$

2. Соберём и запустим контейнеры микросервиса ktu-auth

Перейдём в папку проекта уже внутри гостевой VM, над которым нужно работать:

cd /var/www/ktu-auth

Стартанём контейнеры:

make docker.start.all

3. Вероятно, при первом запуске возникнет такая ошибка

network nginx_dev_local_network declared as external, but could not be found
make: *** [Makefile:41: docker.start.all] Error 1

Тогда добавим сеть вручную:

docker network create nginx_dev_local_network

и затем повторно выполним:

make docker.start.all

Если на это раз всё ОК, должны увидеть что-то вроде:

...
Локальное приложение  KTU-auth: http://localhost:9731
Описание API KTU-auth Swagger: http://localhost:19736

4. Далее подтягиваем зависимости

make composer.install

Если всё прошло успешно, из браузера из хостовой системы должны открываться страницы:
Локальное приложение KTU-auth: http://192.168.56.10:9731
Описание API KTU-auth Swagger: http://192.168.56.10:19736

5. Выйдем из виртуалки

exit

Если что-то пошло не так

Больше информации здесь: https://fkn.ktu10.com/?q=node/17432