Главная проблема — для развития DevOps нужна среда, где можно
запускать ПО для исследования. Разработчикам проще: открыл документацию, скачал IDE, начал пробовать и изучать новую технологию. А вот DevOps-инженеру одной только IDE будет мало, так как часть его работы
как минимум завязана на Linux серверах. Поэтому важно не просто знать,
как использовать готовые решения, но и понимать, как они функционируют
на уровне инфраструктуры.
Чтобы получить это понимание, нужно уметь разворачивать и настраивать серверы самостоятельно. В этом поможет работа с домашним сервером. Она позволит глубже погрузиться в процессы, увидеть, как все устроено изнутри, и набраться практического опыта для решения реальных задач. На мой взгляд, такой подход гораздо эффективнее, чем просто взаимодействие с облачными сервисами.
Эта статья — инструкция, которая поможет начинающим администраторам и
DevOps инженерам расширить свои знания и получить прикладной опыт работы с данным стеком технологий. В качестве бонуса в дальнейшем у нас
останется платформа и наработки для быстрого запуска личных проектов и
полезного софта (например, умный дом, медиасервер и т.д.)
Выбираем железо
Сразу небольшое отступление: если хотите сделать кластер с гипервизорами Proxmox (два и больше сервера работают вместе), то лучше всего приобретать железо с процессорами одного производителя. Тогда откроется возможность переезда работающих виртуальных машин с одной ноды кластера без остановки самой виртуальной машины.
Итак, для подобных экспериментов нам понадобится железо,
на котором всё это будет крутиться. Конечно, можно обойтись и просто
домашним ПК, но тот же Virtualbox/Workstation Pro не предназначены для
работы 24/7. Для домашнего гипервизора я выбрал Proxmox, так как у него
хорошая совместимость с доступным для нас железом. Но предлагаю
рассмотреть и другие варианты.
Одноплатные ПК по типу Raspberry pi: сама малинка и её клоны – Orange PI, Banana PI, Potato Pi и т.д. Нам, к сожалению, не подходит, так как зачастую одноплатники используют в качестве диска microSD карточки, менее надежные и медленные, чем HDD/SSD диски.
Мини-ПК китайских брендов: Beelink, Geekom, Minisforum и других. Рынок заполнен экземплярами с ценником от десяти тысяч рублей и до бесконечности. Чаще всего встречаются мини-ПК на процессорах AMD Ryzen от 3000 серии и выше, а также бюджетные варианты с Intel n100. К плюсам подобных машин я бы отнес компактность, доступность, цену и минимальный шум. К минусам — скудный апгрейд, частое отсутствие разъёмов pci-e и посредственную китайскую сборку из б/у или восстановленных комплектующих.
Б/У сервер с Авито. Хорошая опция для энтузиастов,
но найти достойный экземпляр с нормальным ценником сложно. Плюс, если вы живёте в квартире, постоянно шумящий сервер будет раздражать, а
электричества «накрутит» больше, чем другие варианты.
- Конструктор Лего. Варианты типа старенького ПК/ноутбука или сборка сервера из китайских комплектующих на базе сокетов 2011 и 2011-v3. Ещё не так давно в продажу на площадках стали поступать б/у серверные материнские платы в формфакторах ATX и EATX на тех же сокетах. Производители: Lenovo, Supermicro, Asus и т.д.
Выбор железа опционален и зависит от ваших потребностей и условий. Я выделил варианты, которые мне кажутся оптимальными и привлекательными.
Устанавливаем и настраиваем гипервизор Proxmox
Здесь всё достаточно просто: идём на сайт Proxmox и скачиваем установочный ISO файл. Еще нам понадобится флешка размером от 16 гигабайт. Почему такой большой объём: вместо распространенного Rufus для создания загрузочной флешки, мы задействуем Ventoy. Ventoy позволяет нам не записывать ISO-файлы, как это делает Rufus. Он просто размечает флешку на
загрузочный диск, на который можно скопировать ISO файл для его
дальнейшего запуска. Таким образом, на одну среднюю флешку может
поместиться с пяток полезных ISO образов. Например, у меня реализовано
это так:
- Я взял внешний корпус для nvme диска и установил
туда nvme SSD диск на 256 гигабайт, получив очень шустрый внешний диск.
Через разметку Ventoy выделил 50 гигабайт для копирования образов для
запуска, остальное пространство — мои личные файлы.
- На раздел Ventoy сложил несколько нужных мне образов:
При подключении к железу и при запуске с этого внешнего диска они дают следующий результат:
Остаётся просто выбрать образ, с которого мы будем грузиться и устанавливать нужную нам ОС.
Установить Ventoy очень просто:
- вставляем флешку в свободный порт;
- запускаем Ventoy2Disk и жмём Install.
- в появившийся раздел Ventoy копируем ранее скачанный нами ISO Proxmox.
Затем вставляем эту флешку в наше железо, загружаемся в Boot Menu,
загружаемся с флешки в Ventoy и выбираем строку с Proxmox iso. Жмём
загрузку с ISO и попадаем в меню установки Proxmox.
Выбираем графическую установку и принимаем лицензионное соглашение (EULA).
Выбираем жёсткий диск для установки Proxmox.
Устанавливаем пароль на root пользователя и вписываем почту.
Далее идёт настройка hostname системы и его статического IP адреса.
На следующей вкладке мы увидим информацию, которую вносили на предыдущих этапах: сверяемся и жмём Install. Установка закончится достаточно быстро, железо перезагрузится, и мы увидим следующий результат:
Дальше идем в браузер. Используя адрес со скриншота (обычно он выглядит как https://ранее_заданный_при_установке_ip:8006/),
попадаем в веб-управление Proxmox, попутно соглашаясь на небезопасное
https-соединение (в дальнейшем пофиксим через SSL-сертификат):
Вводим root в username и тот пароль, который указывали при установке. Попадаем в панель управления, которая предупреждает, что у нас нет подписки на этот сервер Proxmox. Не волнуйтесь, чуть позже уберём и это сообщение.
Обычно при свежей установке я шёл в консоль, открывая попутно вот эту страницу, и менял платные репозитории на бесплатные, чтобы в дальнейшем получать обновления софта. Но недавно энтузиасты начали распространять в сети сайт Proxmox VE Helper-Scripts, на котором выложены готовые скрипты для настройки свежего Proxmox.
Итак, на этом этапе нас интересует Post Install Script
Заходим и копируем его:
bash -c "$(wget -qLO - https://github.com/tteck/Proxmox/raw/main/misc/post-pve-install.sh)"
В Proxmox открываем вверху Shell, вставляем скопированную строчку и запускаем:
Скрипт спросит про отключение платного репозитория, включение бесплатного, включение тестового репозитория (я выбрал — нет), про отключение плашки о том, что вы используете софт без подписки, про включение/отключение высокой доступности (я выбрал оставить). И напомнит, что нужно поддерживать команду разработки Proxmox.В конце запустит обновление и перезагрузку системы.
После перезагрузки мы получаем работающий гипервизор для домашнего
использования с бесплатными репозиториями для дальнейших обновлений и
без раздражающей плашки о подписке. Дальше я обычно использую самописный скрипт, который на выбор качает облачный образ Ubuntu (22.04 или 24.04), и создаёт готовый шаблон CloudInit на базе этих образов. Это
нужно для быстрого создания серверов на Ubuntu через клонирование
шаблонов. Содержимое скрипта ниже.
#!/bin/bash
# Указываем директорию
DIRECTORY="/root"
# Меню выбора версии Ubuntu
OPTION=$(whiptail --title "Меню выбора версии Ubuntu" --menu "Выберите версию Ubuntu" 15 60 2 \
"1" "Ubuntu 22.04" \
"2" "Ubuntu 24.04" 3>&1 1>&2 2>&3)
case $OPTION in
1)
ISO_FILE="jammy-server-cloudimg-amd64.img"
URL="https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img"
TEMPLATE_ID=2204
TEMPLATE_NAME="Ubuntu-22.04"
;;
2)
ISO_FILE="noble-server-cloudimg-amd64.img"
URL="https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img"
TEMPLATE_ID=2404
TEMPLATE_NAME="Ubuntu-24.04"
;;
*)
echo "Неверный вариант"
exit 1
;;
esac
# Проверка существования шаблона с ID TEMPLATE_ID
if qm list | grep -qw "$TEMPLATE_ID"; then
echo "Шаблон с ID $TEMPLATE_ID уже существует. Пропускаем создание шаблона."
exit 0
fi
# Проверяем, существует ли файл в директории
if [ -f "$DIRECTORY/$ISO_FILE" ]; then
echo "Файл $ISO_FILE уже существует в $DIRECTORY. Пропускаем загрузку."
else
echo "Файл $ISO_FILE не найден в $DIRECTORY. Начинаем загрузку..."
wget -O "$DIRECTORY/$ISO_FILE" "$URL"
if [ $? -eq 0 ]; then
echo "Файл успешно загружен."
else
echo "Ошибка при загрузке файла."
exit 1
fi
fi
# Создание и настройка виртуальной машины
qm create $TEMPLATE_ID --memory 4096 --cores 2 --net0 virtio,bridge=vmbr0 --scsihw virtio-scsi-pci --name $TEMPLATE_NAME
qm set $TEMPLATE_ID --scsi0 local-lvm:0,import-from=$DIRECTORY/$ISO_FILE
qm set $TEMPLATE_ID --ide2 local-lvm:cloudinit
qm set $TEMPLATE_ID --boot order=scsi0
qm set $TEMPLATE_ID --serial0 socket --vga serial0
qm resize $TEMPLATE_ID scsi0 +30G
qm template $TEMPLATE_ID
echo "Шаблон с ID $TEMPLATE_ID и именем $TEMPLATE_NAME успешно создан."
Базовая установка и настройка Proxmox закончена. Далее продолжим ставить сопутствующий софт.
Установка NginxProxyManager и получение Wildcard SSL-сертификата от
Let’s Encrypt для использования с приложениями в домашней сети
Сразу предупрежу, что для реализации этой части нужен внешний домен. У меня, например, есть домен k3s.host.
Как видно из названия, это прокси-сервер на Nginx. До знакомства с Proxmox
VE Helper-Scripts я обычно создавал LXC контейнер в Proxmox, а в сам
контейнер уже ставил docker-compose и, следуя инструкции, создавал прокси-сервер.
Теперь всё намного проще. Нужно скопировать и вставить скрипт в shell Proxmox отсюда.
bash -c "$(wget -qLO - https://github.com/tteck/Proxmox/raw/main/ct/nginxproxymanager.sh)"
Скрипт проведёт по меню создания LXC контейнера, спрашивая будущий ID, IP
адрес, ресурсы и прочее, и установит ProxyManager в сам контейнер.
Ссылка для входа на прокси будет такого типа: http://192.168.0.18:81 (у вас будет другая, но 81 порт на конце останется. Зависит от того, какой адрес задали во время работы скрипта.)
Email: admin@example.com
Password: changeme
После ввода логина и пароля последний нам предложат поменять. Меняем и попадаем в меню управления прокси-сервера.
Дальше нас интересует секция с SSL сертификатами.
На скриншоте видно, что я использую свой лично приобретённый домен в
связке с DNS CloudFlare. Но в статье я опишу бесплатный вариант с
DuckDNS.
Идём на duckdns.org и логинимся любым удобным способом. Попадаем в панель управления DNS.
В пункте domains придумываем домен. Для тестов я успел взять домен k8s-lab.duckdns.org
В настройке домена в секции current ip задаём IP-адрес сервера
nginxproxymanager. У меня это 192.168.0.18. У вас — тот, что вы указали
при установке скриптом. Обязательно запишите токен, он пригодится.
Возвращаемся в открытую вкладку с nginxproxymanager и начинаем создавать наш SSL-сертификат. Жмём add SSL-certificate, выбираем Let’s Encrypt и
заполняем поля в таком виде:
Вписываем ваш свежий домен, email, в DNS провайдерах выбираем DuckDNS и вписываем токен со страницы управления DuckDNS. Нажимаем сохранить и ждём создания вашего сертификата
Возможно, вы можете получить ошибку о том, что certbot ничего не знает про
DuckDNS. Для решения этой проблемы нужно зайти в shell самого
nginxproxymanager и установить пакет duckdns следующей командой:
pip install -U certbot-dns-duckdns
Через некоторое время работы мы получили валидный сертификат на наш домен:
Итак, время проверить работоспособность сертификата. Идём в Hosts и выбираем Proxy Hosts. Нажимаем add proxy host, заполняем данные для Proxmox и сохраняем.
Теперь при посещении https://proxmox.k8s-lab.duckdns.org попадаём в панель управления Proxmox.
Смотрим, как обстоят дела с сертификатом.
С ним все отлично — мы получили SSL‑сертификат, который можно будет
использовать для любого сервиса внутри сети через прокси-менеджер.
Итак, в сегодняшней статье мы рассмотрели варианты железа для домашней
лаборатории, установили и настроили Proxmox для дальнейшей комфортной
работы, познакомились с Proxmox VE Helper-Scripts и развернули
прокси-сервер, раздающий сертификаты внутри нашей сети.
Для подготовки статьи я использовал следующие ресурсы: