Обзор развертывания KVM с веб-управлением через Cockpit на сервере¶
Предварительные требования и базовые условия¶
Для развертывания требуется сервер Linux с операционной системой Ubuntu и правами root. Система должна иметь доступ в Интернет для загрузки пакетов и получения SSL-сертификатов. В процессе развертывания устанавливаются и настраиваются следующие компоненты:
-
Операционная система: Ubuntu
-
Права доступа: Для установки и настройки требуются права root.
-
Домен: Сервер должен быть доступен в зоне
hostkey.in. -
Порты: Порты 80 и 443 должны быть свободны для валидации Let's Encrypt и передачи трафика HTTPS.
-
Сервисы: Сервисы
libvirtdиcockpit.socketдолжны быть включены и запущены.
FQDN конечной панели¶
Полное доменное имя (FQDN) для доступа к веб-интерфейсу управления KVM имеет следующий формат:
kvm<Server ID>.hostkey.in
Система автоматически настраивает имя хоста и обновляет файл /etc/hosts для разрешения этого FQDN на адрес 127.0.1.1.
Структура файлов и каталогов¶
Для хранения конфигурации, данных и сертификатов развертывание использует следующие каталоги:
-
/etc/cockpit/ws-certs.d/: Хранит SSL-сертификат и закрытый ключ для Cockpit. -
/etc/letsencrypt/live/<fqdn>/: Содержит файлы сертификатов Let's Encrypt (fullchain.pemиprivkey.pem). -
/root/nginx/: Содержит конфигурацию Docker Compose для прокси-сервера Nginx. -
/data/nginx/user_conf.d/: Хранит пользовательские файлы конфигурации Nginx для конкретного экземпляра сервера. -
/data/nginx/nginx-certbot.env: Файл окружения для контейнера Nginx-Certbot.
Процесс установки приложения¶
Стек приложения устанавливается с использованием нативного менеджера пакетов и Docker. Процесс включает следующие шаги:
-
Установка пакетов: Система устанавливает пакеты
qemu-kvm,libvirt-daemon-system,libvirt-clients,bridge-utils,virtinst,cockpit,cockpit-machines,certbotиpip. -
Активация сервисов: Сервисы
libvirtdиcockpit.socketзапускаются и включаются для автоматического запуска при загрузке системы. -
Подготовка портов: Существующие веб-серверы (Nginx, Apache) и контейнеры Docker, занимающие порты 80 и 443, останавливаются для обеспечения возможности валидации Let's Encrypt.
-
Получение сертификатов: Сертификаты Let's Encrypt получаются для сгенерированного FQDN с использованием режима
certbotstandalone. -
Интеграция сертификатов: Полученные сертификаты копируются в каталог сертификатов Cockpit, и устанавливаются соответствующие права доступа.
-
Развертывание прокси: Развертывается контейнер Docker с образом
jonasal/nginx-certbot:latestдля обработки обратного проксирования и завершения SSL-соединений.
Права доступа и безопасность¶
Безопасность обеспечивается через изоляцию сервисов и управление сертификатами:
-
Межсетевой экран (Firewall): Порты 80 и 443 используются для внешнего доступа. Внутренние сервисы общаются через localhost.
-
Пользователи: Сервис Cockpit работает от имени пользователя
rootс определенными правами группы для группыcockpit-ws. -
Ограничения: Сервис
libvirtdуправляет доступом к виртуальным машинам, в то время как Cockpit предоставляет веб-интерфейс. -
Права на сертификаты: Файлы SSL-сертификатов в каталоге
/etc/cockpit/ws-certs.d/имеют права доступа640с владениемroot:cockpit-ws.
Контейнеры Docker и их развертывание¶
Обратный прокси-сервер развертывается с использованием Docker Compose. Конфигурация контейнера определена в файле /root/nginx/compose.yml.
-
Образ:
jonasal/nginx-certbot:latest -
Политика перезапуска:
unless-stopped -
Режим сети:
host -
Томы (Volumes):
-
nginx_secrets(внешний) монтируется в/etc/letsencrypt -
/data/nginx/user_conf.dмонтируется в/etc/nginx/user_conf.d -
Окружение (Environment):
-
CERTBOT_EMAIL:hkadm@hostkey.com -
Дополнительные переменные окружения загружаются из
/data/nginx/nginx-certbot.env
Контейнер запускается с помощью команды:
выполняемой из каталога/root/nginx. Прокси-серверы¶
Nginx развертывается как контейнер Docker для работы в качестве обратного прокси-сервера для веб-интерфейса Cockpit.
-
Цель проксирования: Конфигурация Nginx пересылает запросы на
http://127.0.0.1:3000. -
SSL/TLS: Завершение SSL-соединений обрабатывается контейнером Nginx с использованием сертификатов Let's Encrypt.
-
Расположение конфигурации: Пользовательские правила проксирования хранятся в файле
/data/nginx/user_conf.d/kvm<Server ID>.hostkey.in.conf. -
Интеграция с Certbot: Контейнер Nginx включает Certbot для автоматического обновления сертификатов.
Настройки прав доступа¶
Права доступа к файлам и каталогам настроены следующим образом:
-
/root/nginx/:0755(Владелец: root, Группа: root) -
/root/nginx/compose.yml:0644(Владелец: root, Группа: root) -
/etc/cockpit/ws-certs.d/:0755(Владелец: root, Группа: root) -
/etc/cockpit/ws-certs.d/*.crtи*.key:0640(Владелец: root, Группа: cockpit-ws)
Расположение файлов конфигурации и данных¶
Ключевые файлы конфигурации и места хранения данных включают:
-
Nginx Compose:
/root/nginx/compose.yml -
Пользовательская конфигурация Nginx:
/data/nginx/user_conf.d/kvm<Server ID>.hostkey.in.conf -
Сертификаты Cockpit:
/etc/cockpit/ws-certs.d/kvm<Server ID>.hostkey.in.crtи.key -
Сертификаты Let's Encrypt:
/etc/letsencrypt/live/kvm<Server ID>.hostkey.in/ -
Переменные окружения:
/data/nginx/nginx-certbot.env
Доступные порты для подключения¶
Для приложения настроены следующие порты:
| Порт | Протокол | Описание |
|---|---|---|
| 443 | TCP | Доступ HTTPS к веб-интерфейсу Cockpit через прокси Nginx. |
| 80 | TCP | HTTP для валидации Let's Encrypt и перенаправления. |
| 3000 | TCP | Внутренний порт сервиса Cockpit (только localhost). |
Запуск, остановка и обновление¶
Команды управления сервисами для развернутых компонентов:
-
Сервис Cockpit:
-
Запуск:
systemctl start cockpit.socket -
Остановка:
systemctl stop cockpit.socket -
Перезапуск:
systemctl restart cockpit -
Включение:
systemctl enable cockpit.socket -
Сервис Libvirt:
-
Запуск:
systemctl start libvirtd -
Остановка:
systemctl stop libvirtd -
Перезапуск:
systemctl restart libvirtd -
Включение:
systemctl enable libvirtd -
Контейнер прокси Nginx:
-
Запуск/Перезапуск:
docker compose up -d(из каталога/root/nginx) -
Остановка:
docker compose down(из каталога/root/nginx) -
Просмотр логов:
docker compose logs -f(из каталога/root/nginx)