Привет! Меня зовут Александр Щербаков. Я DevOps команд страхования в Банки.ру. На своём карьерном пути я успел поработать эникейщиком, системным администратором и, наконец, DevOps-инженером с несколькими командами разработки. Как и любой инженер, я стремлюсь постоянно совершенствоваться: получать новые знания, изучать как устоявшиеся, так и только появившиеся технологии.
И здесь сразу появляется главная проблема — для развития DevOps нужна среда, где можно запускать ПО для исследования. Разработчикам проще: открыл документацию, скачал IDE, начал пробовать и изучать новую технологию. А вот DevOps-инженеру одной только IDE будет мало, так как часть его работы как минимум завязана на Linux серверах. Поэтому важно не просто знать, как использовать готовые решения, но и понимать, как они функционируют на уровне инфраструктуры.
Чтобы получить это понимание, нужно уметь разворачивать и настраивать серверы самостоятельно. В этом поможет работа с домашним сервером. Она позволит глубже погрузиться в процессы, увидеть, как все устроено изнутри, и набраться практического опыта для решения реальных задач. На мой взгляд, такой подход гораздо эффективнее, чем просто взаимодействие с облачными сервисами.
У меня есть опыт приобретения и развёртки домашнего сервера, поэтому я решил написать серию статей, в которых расскажу о подготовке и поэтапной установке сервера.
Еще не так давно вышли обновления популярного софта: Ubuntu 24, аппаратного гипервизора Proxmox 8.2 и Kubernetes 1.30. Хочется попробовать их на практике.
В статьях раскрою следующие аспекты:
Выбор железа.
Установка и настройка Proxmox 8.2.x для работы дома. Создание стандартных образов на базе Ubuntu Server (22 и 24).
Создание и парковка домена у одного из хостеров и получение бесплатного Let’s encrypt wildcard SSL-сертификата на купленный домен.
Сборка и настройка собственного NAS хранилища.
Установка сервера Gitlab для обучения CI/CD и хранения написанного кода.
Установка Kubernetes: установим runners для Gitlab и сопутствующий софт.
Полезные ссылки для самостоятельного изучения.
Эта статья — инструкция, которая поможет начинающим администраторам и 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 и т.д.
Выбор железа опционален и зависит от ваших потребностей и условий. Я выделил варианты, которые мне кажутся оптимальными и привлекательными.
У меня самого сейчас в наличии Lenovo Thinkstation, который и трудится в качестве домашнего сервера. Параметры следующие:
процессор intel core i3 10105t 4c/8t
32Gb оперативной памяти SODIMM DDR4
общий объем дискового пространства в 1,5 TB на nvme и ssd дисках (по факту - что было в наличии)
установленный гипервизор Proxmox 8.2.2
Устанавливаем и настраиваем гипервизор 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 и развернули прокси-сервер, раздающий сертификаты внутри нашей сети.
Если материал окажется интересным и полезным для сообщества, далее планирую показать установку Gitlab и Kubernetes для изучения CI/CD.
Для подготовки статьи я использовал следующие ресурсы:
И множество других мелких статей и видео, из которых я почерпнул информацию 😊