Домашний сервер на базе Proxmox

от автора

Привет! Меня зовут Александр Щербаков. Я 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, так как у него хорошая совместимость с доступным для нас железом. Но предлагаю рассмотреть и другие варианты. 

  1. Одноплатные ПК по типу Raspberry pi: сама малинка и её клоны – Orange PI, Banana PI, Potato Pi и т.д. Нам, к сожалению, не подходит, так как зачастую одноплатники используют в качестве диска microSD карточки, менее надежные и медленные, чем HDD/SSD диски.

  1. Мини-ПК китайских брендов: Beelink, Geekom, Minisforum и других. Рынок заполнен экземплярами с ценником от десяти тысяч рублей и до бесконечности. Чаще всего встречаются мини-ПК на процессорах AMD Ryzen от 3000 серии и выше, а также бюджетные варианты с Intel n100. К плюсам подобных машин я бы отнес компактность, доступность, цену и минимальный шум. К минусам — скудный апгрейд, частое отсутствие разъёмов pci-e и посредственную китайскую сборку из б/у или восстановленных комплектующих.

  1. Б/У сервер с Авито. Хорошая опция для энтузиастов, но найти достойный экземпляр с нормальным ценником сложно. Плюс, если вы живёте в квартире, постоянно шумящий сервер будет раздражать, а электричества «накрутит» больше, чем другие варианты.

  1. Конструктор Лего. Варианты типа старенького ПК/ноутбука или сборка сервера из китайских комплектующих на базе сокетов 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 Insall 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.

Для подготовки статьи я использовал следующие ресурсы: 

И множество других мелких статей и видео, из которых я почерпнул информацию 😊


ссылка на оригинал статьи https://habr.com/ru/articles/827760/


Комментарии

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

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