Proxmox VE
Где в панели: Infrastructure › Cloud provider › Providers (
/infra/providers), затем страница провайдера (/infra/providers/<id>) со вкладками Overview, Clusters, VMs, Servers и Credentials. Тарифы настраиваются в Services › Virtual Machines › Plans & pricing (/vm/catalog).
Назначение
NexCMP позволяет продавать виртуальные машины, работающие на одном или нескольких кластерах Proxmox VE, параллельно с CloudStack или вместо него. VM создается полным клонированием шаблона ОС (full clone), а затем настраивается через cloud-init: размер, IP-адрес из заданного вами пула, пароль root и SSH-ключ. В портале клиентам доступны управление питанием, консоль, снимки, переустановка, сброс пароля и метрики. Название кластера, ноды или источника они никогда не видят.
Используйте эту возможность, если вы уже работаете с Proxmox VE или хотите предложить клиентам второй пул VM с другими ценами.
Требования
| Параметр | Требование |
|---|---|
| Proxmox VE | PVE 9.x. Интеграция проверена на 9.2. Требуются тип содержимого хранилища import и опция диска import-from (PVE 8.2 или новее). |
| Сеть со стороны панели | HTTPS к API кластера, https://<host or IP>:8006. Без пути, имени пользователя или query-параметров. Подключаются как панель, так и воркер; консоль браузера проксируется через панель. |
| Учетная запись | Выделенный пользователь PVE с API token и пользовательская роль с привилегиями, перечисленными ниже. Никогда не используйте root@pam. |
| Хранилище | Хранилище для дисков VM с поддержкой клонирования (например, local-lvm). Для встроенного сборщика шаблонов — хранилище с именем local и типами содержимого import и snippets. |
| Сеть | Linux-мост (например, vmbr0), имеющий доступ к сети с IP-адресами клиентов. Используйте VLAN-aware мост, если указывается VLAN-тег. |
| IP-адреса | Блок IPv4 (от /16 до /30), маршрутизируемый на этот мост, со шлюзом. NexCMP назначает адреса самостоятельно; в Proxmox нет управления IP-адресами. |
| Шаблоны | По одной шаблонной VM с cloud-init на каждую ОС на каждом узле, куда выполняется развертывание, с QEMU guest agent. |
| Зона | Существующая зона для привязки кластера. См. Зоны. |
| Зависимости | Ничего. |
Подготовка инфраструктуры
Выполните команды от имени root на любом узле кластера.
1. Создайте роль, пользователя и токен API с минимальными правами
Создайте роль. Список привилегий точно соответствует используемым в NexCMP; в нем нет прав на изменение пользователей, настроек хранилищ или дата-центра.
bashpveum role add NexCMP -privs "VM.Allocate VM.Clone VM.Config.CDROM VM.Config.CPU VM.Config.Cloudinit VM.Config.Disk VM.Config.HWType VM.Config.Memory VM.Config.Network VM.Config.Options VM.PowerMgmt VM.Audit VM.Console VM.Snapshot VM.Snapshot.Rollback VM.Backup VM.GuestAgent.Audit VM.GuestAgent.Unrestricted Datastore.Audit Datastore.AllocateSpace Datastore.AllocateTemplate Sys.Audit Sys.AccessNetwork SDN.Use SDN.Audit Pool.Audit Mapping.Audit Mapping.Use"Sys.AccessNetworkтребуется для скачивания cloud-image. В PVE 9 привилегииVM.Monitorнет, добавлять ее не нужно.Создайте пользователя и токен.
--privsep 1означает, что права токена являются пересечением прав пользователя и собственных прав токена.bashpveum user add nexcmp@pve --comment "NexCMP" pveum user token add nexcmp@pve api --privsep 1Команда выводит секрет токена один раз (UUID). Скопируйте его сразу. Token id —
nexcmp@pve!api.Назначьте роль как пользователю, так и токену. Об этом шаге часто забывают: при разделении привилегий только токен получает ошибки 403, такие как
Datastore.Audit, если у пользователя нет прав.bashpveum acl modify / --roles NexCMP --users nexcmp@pve pveum acl modify / --roles NexCMP --tokens 'nexcmp@pve!api'Проверьте его с сервера панели:
bashcurl -sk -H 'Authorization: PVEAPIToken=nexcmp@pve!api=<secret>' https://192.0.2.10:8006/api2/json/versionJSON-документ с
versionозначает, что токен работает. (Параметр-kиспользуется только для этой быстрой проверки; NexCMP сам закрепляет сертификат, см. ниже.)
2. Проверьте сетевой мост и хранилище
bash
pvesm status # storages, type, content and free space
ip -br link show type bridge- ВМ клиентов получают сетевые интерфейсы
virtioна сетевом мосту, указанном в NexCMP. Если вы задаете VLAN, сетевой мост должен быть VLAN-aware. - Размещайте ВМ клиентов на сетевом мосту или в VLAN, изолированных от адреса управления узлом. Если они находятся в общей сети, автоматический IP-набор управления брандмауэра Proxmox открывает порты узла 22, 8006, 3128, 5900-5999 и 60000-60050 для каждой ВМ в этой сети. Если их нельзя разделить, добавьте явное правило DROP для подсети ВМ к этим портам выше правила ACCEPT управления.
3. Примечания к хранилищу (LVM-thin)
- Оставьте обнуление thin-pool по умолчанию. Его отключение (
lvchange -Zn) может привести к сохранению старых данных в выделяемых чанках и повреждению таблиц разделов или файловых систем клонированных ВМ. - Диски, сообщающие «write cache: disabled», могут клонироваться со скоростью всего несколько МБ/с. Проверьте это с помощью
hdparm -W /dev/sdXи включите кэш записи, если диск оснащен защитой от потери питания.
4. Включите тип содержимого import (только для встроенного конструктора шаблонов)
Встроенный конструктор загружает cloud-образ в хранилище с именем local и создает на его основе шаблон. Добавьте import (и snippets) в список типов содержимого этого хранилища. Сохраните типы, которые вы уже используете; команда --content заменяет весь список целиком:
bash
pvesm status --storage local # note the current content
pvesm set local --content iso,vztmpl,backup,import,snippets5. Создание шаблона ОС из cloud-образа
Шаблон представляет собой ВМ с cloud-init, которую клонирует NexCMP. Каждый из них регистрируется под коротким OS key, таким как ubuntu-24.04, с указанием своего VM id. Создавайте по одному шаблону на каждую ОС на каждом узле, который будет принимать ВМ, так как клонирование выполняется на выбранном узле.
Вариант A, рекомендуемый: самостоятельная сборка. Стандартные cloud-образы Ubuntu и Debian не содержат гостевого агента и не разрешают вход под root, а NexCMP задает пароль root через cloud-init. Сначала подготовьте образ:
bash
apt install -y libguestfs-tools
wget -O noble.qcow2 https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img
virt-customize -a noble.qcow2 --install qemu-guest-agent \
--write /etc/cloud/cloud.cfg.d/99-nexcmp.cfg:$'ssh_pwauth: true\ndisable_root: false\n' \
--write /etc/ssh/sshd_config.d/00-nexcmp.conf:$'PermitRootLogin yes\nPasswordAuthentication yes\n'Затем создайте шаблонную ВМ (id 9000 приведен для примера; задавайте идентификаторы шаблонов меньше значения vmid from, по умолчанию 1000):
bash
qm create 9000 --name tpl-ubuntu-24-04 --memory 2048 --cores 2 --cpu host --ostype l26 \
--scsihw virtio-scsi-single --net0 virtio,bridge=vmbr0 --agent 1 --serial0 socket --vga serial0
qm set 9000 --scsi0 local-lvm:0,import-from=$PWD/noble.qcow2,discard=on,iothread=1
qm set 9000 --ide2 local-lvm:cloudinit --boot order=scsi0
qm template 9000Вариант B: встроенный конструктор. Карточка Create OS template from cloud image на вкладке Clusters (см. ниже) загружает образ qcow2, собирает шаблон и регистрирует его. Она создает ВМ с cloud-init и флагом гостевого агента, но не изменяет содержимое образа. Используйте этот вариант только для образов, где уже разрешен вход под root и запущен гостевой агент, либо если вы также передаете фрагмент vendor-data для cloud-init.
Гостевой агент необходим для работы Reset password и отображения IP-адреса ВМ.
6. Получение отпечатка сертификата (необязательно)
NexCMP доверяет кластеру, закрепляя SHA-256 отпечаток его TLS-сертификата, поэтому самоподписанный сертификат вполне подойдет. Чтобы узнать значение, которое закрепит NexCMP:
bash
openssl x509 -in /etc/pve/local/pve-ssl.pem -noout -fingerprint -sha256Подключение в NexCMP
Перейдите в Infrastructure › Cloud provider › Providers и нажмите Add cloud provider. Выберите Proxmox VE и заполните поля:
Поле Пример значения Name Proxmox cluster 1Endpoint https://192.0.2.10:8006Token id nexcmp@pve!apiToken secret XXXX(UUID, выведенный на шаге 1)Slug pve-1(a-z, 0-9, дефис, от 2 до 32 символов)Default node pve1(пусто: нода в сети с наибольшим объемом свободной RAM)Хранилище local-lvmBridge vmbr0
Нажмите Save & open provider и укажите причину при появлении запроса. Токен шифруется перед сохранением.
На вкладке Overview нажмите Test connection. Первый успешный тест закрепляет TLS-отпечаток кластера; с этого момента другой сертификат будет отклоняться.
Откройте вкладку Clusters. В карточке Node · storage · bridge отображаются данные, полученные через API; в карточке Cluster configuration задаются настройки:
Поле Значение Default node Нода для новых VM. Пустое значение означает ноду в сети с наибольшим объемом свободной RAM. Storage, Bridge, VLAN Дисковое хранилище, сетевой мост (NIC bridge) и необязательный VLAN-тег (0 означает отсутствие). CPU type hostпо умолчанию. Используйтеx86-64-v2-AES, если у нод разные поколения CPU.vmid from Начальный ID, присваиваемый клиентским VM (по умолчанию 1000). Storage ISO, Storage backup Оставьте пустыми, если они не используются; пустое значение означает, что функции ISO и резервного копирования не предоставляются. Template OS По одной записи на строку, os-key=vmid, напримерubuntu-24.04=9000.Pinned TLS fingerprint (SHA-256) Заполняется при первом тесте. Очистите поле и выполните повторный тест после замены сертификата кластера. 
Необязательно: если вы выбрали вариант B выше, заполните Create OS template from cloud image (OS key
ubuntu-24.04, vmid9000, нодаpve1, URL-адрес qcow2-образа) и нажмите Create template. Процесс выполняется в фоновом режиме несколько минут; результат отображается в Audit log.
Нажмите Add pool в Cluster IP pool и создайте пул, из которого VM будут получать адреса:
Поле Пример значения Name customers-1CIDR 198.51.100.0/24Gateway 198.51.100.1(никогда не назначается VM)DNS 1.1.1.1,8.8.8.8(от 1 до 4 адресов IPv4)Bridge, VLAN vmbr0,0Already used IPs по одному на строку, ip note, например198.51.100.10 monitoringNexCMP никогда не назначает адрес сети, широковещательный адрес, шлюз или зарезервированный адрес. Пулы одного кластера не могут перекрываться. Пул можно удалить только тогда, когда ни один из его адресов не используется.

В Attach cluster to zone выберите зону и, при необходимости, имя ноды, затем нажмите Attach to zone. Кластер подключается к зоне, в которой уже продаются VM, благодаря чему в одной зоне могут сосуществовать CloudStack и Proxmox. Новый источник по умолчанию не продается и не меняет поведение существующих тарифов.

Откройте Services › Virtual Machines › Plans & pricing и нажмите Add plan. В поле Infrastructure source выберите кластер Proxmox, затем настройте CPU, RAM, диск и цену. Для тарифа Proxmox не требуется сервисное предложение CloudStack. Чтобы продавать одну и ту же конфигурацию из обоих источников, используйте Clone для тарифа и выберите другой источник. Размер диска в тарифе должен быть не меньше размера диска в шаблоне: Proxmox не может уменьшать диск.
Импорт существующей VM
Откройте вкладку Servers, чтобы просмотреть список виртуальных машин в кластере. Действие Import бесплатно привязывает существующую виртуальную машину к аккаунту клиента: оплата за часы, время в выключенном состоянии или трафик не взимается. Клиент может запускать, останавливать, перезагружать ВМ и открывать консоль, но не может удалить её — это доступно только администратору. Во время импорта NexCMP выполняет только чтение данных из кластера.
Кластер должен быть привязан к зоне с указанием имени ноды этой виртуальной машины (если оставить имя ноды пустым, процесс импорта вернет ошибку о том, что регион не настроен).
Чтобы сделать виртуальную машину защищенной (остановка, перезагрузка, переустановка, восстановление из Snapshots, уничтожение и смена тарифа блокируются), импортируйте её из командной строки с помощью
--protect:bashsudo -u nexcmp /opt/nexcmp/bin/nexcmp px-import --provider pve-1 --server-ref pve1/101 --account-id 12 --hostname web-1 --protect
Что поддерживается и не поддерживается в Proxmox
| Функция | Proxmox VE |
|---|---|
| Создание, включение/выключение/перезагрузка, удаление | Да |
| Изменение объема CPU и RAM, увеличение диска | Да, но ВМ останавливается, параметры изменяются, затем она запускается снова (live resize не поддерживается) |
| Snapshots | Да, до 5 на одну ВМ: создание, просмотр списка, восстановление, удаление |
| Переустановка | Да: ВМ пересоздается из шаблона с сохранением своего id, IP и настроек, но с новым паролем |
| Сброс пароля | Да, через гостевой агент |
| Консоль | Да, консоль в браузере, проксируемая панелью |
| Метрики | Да: CPU, память, сеть и диск |
| Монтирование ISO, Backups, firewall, IPv6, проброс портов, смена IP, дополнительные тома, Auto Scaling, DDoS Shield, VPC, учет трафика | Недоступно. На странице виртуальной машины клиента скрыты функции, которые не поддерживаются источником. |
Проверка
- Test connection отображает OK, а статус провайдера — active.
- В Clusters ваши ноды показаны со статусом online, вместе с хранилищем и сетевым мостом.
- В Cluster IP pool отображается количество свободных, используемых и зарезервированных адресов.
- После подключения кластера ключ ОС появляется в списке шаблонов зоны в Services › Virtual Machines › Template.
- Закажите тестовую ВМ по тарифу, использующему этот кластер. Она должна получить адрес из пула, пароль root и рабочую консоль, а в пуле один адрес должен отображаться как занятый.
Ограничения и примечания
Зоны со смешанными источниками
Начиная с NexCMP 1.4.0 публичный прайс-лист Cloud Server работает и тогда, когда CloudStack и Proxmox VE используют одну общую зону. В каждом тарифе используется собственный Infrastructure source. После подключения кластера проверьте публичный прайс-лист и оформите тестовый заказ для каждого источника.
- Можно добавить несколько кластеров Proxmox. Каждый из них выступает как отдельный провайдер.
- Зона предоставляет один источник по умолчанию; тариф с собственной настройкой Infrastructure source развертывается именно в этом кластере, если он активен и относится к зоне тарифа.
- Кластер, находящийся в той же зоне, что и CloudStack, сохраняет свои существующие тарифы на CloudStack. Перед запуском протестируйте полный цикл заказа.
- Токен API можно только заменить, просмотреть его нельзя. Замените его на вкладке Credentials: сначала создайте новый токен в Proxmox, укажите его, нажмите Test connection и затем отзовите старый токен.
- Действия Test, Sync и cluster-info ограничены шестью вызовами в минуту на одного администратора.
- NexCMP выставляет счета вашим клиентам; расходы на оборудование и лицензии кластера вы несете самостоятельно.
Устранение неполадок
| Симптом | Причина | Решение |
|---|---|---|
| Test: "Key rejected (wrong access key / secret, or revoked)" или HTTP 401/403 | Неверный token id или secret, либо права ACL были назначены только токену | Повторно выполните обе команды pveum acl modify (пользователь и токен) и проверьте, что token id — user@realm!tokenid. |
| Тест: "Could not connect to the provider" или "Timed out" | Файрвол, неверный хост или порт | Проверьте https://host:8006 с сервера панели. |
| Тест: "Invalid endpoint or not on the allowlist" | Эндпоинт содержит путь, имя пользователя, параметры запроса или не использует HTTPS | Используйте в точности https://host:8006. |
| "TLS-сертификат кластера НЕ соответствует привязанному отпечатку" | Сертификат кластера был заменен | Очистите Pinned TLS fingerprint на вкладке Clusters, сохраните и снова выполните Test connection. |
| Slug отклонен | Содержит символы помимо a-z, 0-9, дефиса или длина не от 2 до 32 символов | Используйте значение вида pve-1. |
| "Формат Token id: user@realm!tokenid, и требуется secret" | Отсутствует token id или secret | Укажите оба значения; secret — это UUID, отображаемый при создании токена. |
| "Недопустимая строка шаблона: …" | Строка в Template OS не соответствует key=vmid | Используйте буквы, цифры, ., _, - в ключе и vmid не менее 100. |
| "OS key: a-z 0-9 . _ - и vmid ≥ 100" | Неверный ключ или id в Create template | Исправьте ключ ОС и используйте свободный vmid. |
| "vmid … already exists" при создании шаблона | vmid уже занят | Выберите другой id. |
| "url указывает на внутренний адрес" | URL образа указывает на внутренний IP-адрес | Используйте публичный URL; разрешение доменных имен выполняется Proxmox. |
| Сбой задачи шаблона при скачивании | В хранилище local не включен тип содержимого import | pvesm set local --content …,import,snippets, затем повторите попытку. Имя файла должно оканчиваться на .qcow2, .raw, .vmdk, .ova или .ovf. |
| "cluster has no online nodes" или "node … is not online" | Узел по умолчанию недоступен или указан с ошибкой | Исправьте Default node или оставьте поле пустым. |
| "образ не принадлежит кластеру" | ОС тарифного плана отсутствует в Template OS | Добавьте ключ в список и сохраните. |
| Развертывание ожидает, затем завершается сбоем при клонировании | ВМ шаблона находится не на выбранном узле | Создайте шаблон на этом узле или укажите в Default node узел, на котором он находится. |
| Клиент не может войти под пользователем root | Образ блокирует вход под root | Пересоберите шаблон, как описано в Option A. |
| Сброс пароля не дает результата | В гостевой ОС не установлен guest agent | Установите и включите qemu-guest-agent в шаблоне. |
| «Имя, CIDR и шлюз обязательны» | Не заполнено обязательное поле пула | Заполните все три поля. |
| Создание пула: "overlaps with pool …", "gateway must be within range (not network/broadcast address)" или "cidr: network address must be …" | Пересечение пулов, неверный шлюз или CIDR не на границе сети | Используйте свободный диапазон, шлюз внутри него и CIDR, указанный как сетевой адрес (например, 198.51.100.0/24). |
| Импорт: "region is not set up" | Кластер подключен без имени узла VM | Подключите кластер к зоне с указанием имени узла. |