---
title: Proxmox VE
description: Кластеры Proxmox VE как источник VM: токен API с минимумом прав, хранилища, шаблоны cloud-image, пулы IP, TLS pinning и выбор источника в тарифе.
url: https://nexcmp.com/ru/docs/infrastructure/proxmox/
applies_to: NexCMP 1.6.1
updated: 2026-11-02
---

# Proxmox VE

> **Где в панели:** Infrastructure › Cloud provider › Providers (`/infra/providers`), затем страница провайдера (`/infra/providers/<id>`) со вкладками Overview, Clusters, VMs, Servers и Credentials. Тарифы настраиваются в Services › Virtual Machines › Plans & pricing (`/vm/catalog`).

## Назначение {#what-it-does}

NexCMP позволяет продавать виртуальные машины, работающие на одном или нескольких кластерах Proxmox VE, параллельно с CloudStack или вместо него. VM создается полным клонированием шаблона ОС (full clone), а затем настраивается через cloud-init: размер, IP-адрес из заданного вами пула, пароль root и SSH-ключ. В портале клиентам доступны управление питанием, консоль, снимки, переустановка, сброс пароля и метрики. Название кластера, ноды или источника они никогда не видят.

Используйте эту возможность, если вы уже работаете с Proxmox VE или хотите предложить клиентам второй пул VM с другими ценами.

## Требования {#requirements}

| Параметр | Требование |
|---|---|
| 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. |
| Зона | Существующая зона для привязки кластера. См. [Зоны](https://nexcmp.com/ru/docs/infrastructure/zones/). |
| Зависимости | Ничего. |

## Подготовка инфраструктуры {#prepare-the-infrastructure}

Выполните команды от имени root на любом узле кластера.

### 1. Создайте роль, пользователя и токен API с минимальными правами {#_1-create-a-least-privilege-role-user-and-api-token}

1. Создайте роль. Список привилегий точно соответствует используемым в NexCMP; в нем нет прав на изменение пользователей, настроек хранилищ или дата-центра.

   ```bash
   pveum 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` нет, добавлять ее не нужно.

2. Создайте пользователя и токен. `--privsep 1` означает, что права токена являются **пересечением** прав пользователя и собственных прав токена.

   ```bash
   pveum user add nexcmp@pve --comment "NexCMP"
   pveum user token add nexcmp@pve api --privsep 1
   ```

   Команда выводит **секрет токена один раз** (UUID). Скопируйте его сразу. Token id — `nexcmp@pve!api`.

3. Назначьте роль **как пользователю, так и токену**. Об этом шаге часто забывают: при разделении привилегий только токен получает ошибки 403, такие как `Datastore.Audit`, если у пользователя нет прав.

   ```bash
   pveum acl modify / --roles NexCMP --users nexcmp@pve
   pveum acl modify / --roles NexCMP --tokens 'nexcmp@pve!api'
   ```

4. Проверьте его с сервера панели:

   ```bash
   curl -sk -H 'Authorization: PVEAPIToken=nexcmp@pve!api=<secret>' https://192.0.2.10:8006/api2/json/version
   ```

   JSON-документ с `version` означает, что токен работает. (Параметр `-k` используется только для этой быстрой проверки; NexCMP сам закрепляет сертификат, см. ниже.)

### 2. Проверьте сетевой мост и хранилище {#_2-check-the-bridge-and-the-storage}

```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) {#_3-storage-notes-lvm-thin}

- Оставьте **обнуление thin-pool по умолчанию**. Его отключение (`lvchange -Zn`) может привести к сохранению старых данных в выделяемых чанках и повреждению таблиц разделов или файловых систем клонированных ВМ.
- Диски, сообщающие «write cache: disabled», могут клонироваться со скоростью всего несколько МБ/с. Проверьте это с помощью `hdparm -W /dev/sdX` и включите кэш записи, если диск оснащен защитой от потери питания.

### 4. Включите тип содержимого `import` (только для встроенного конструктора шаблонов) {#_4-enable-the-import-content-only-for-the-built-in-template-builder}

Встроенный конструктор загружает cloud-образ в хранилище с именем `local` и создает на его основе шаблон. Добавьте `import` (и `snippets`) в список типов содержимого этого хранилища. Сохраните типы, которые вы уже используете; команда `--content` заменяет весь список целиком:

```bash
pvesm status --storage local     # note the current content
pvesm set local --content iso,vztmpl,backup,import,snippets
```

### 5. Создание шаблона ОС из cloud-образа {#_5-build-an-os-template-from-a-cloud-image}

Шаблон представляет собой ВМ с 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. Получение отпечатка сертификата (необязательно) {#_6-know-the-certificate-fingerprint-optional}

NexCMP доверяет кластеру, закрепляя SHA-256 отпечаток его TLS-сертификата, поэтому самоподписанный сертификат вполне подойдет. Чтобы узнать значение, которое закрепит NexCMP:

```bash
openssl x509 -in /etc/pve/local/pve-ssl.pem -noout -fingerprint -sha256
```

## Подключение в NexCMP {#connect-in-nexcmp}

1. Перейдите в **Infrastructure › Cloud provider › Providers** и нажмите **Add cloud provider**. Выберите **Proxmox VE** и заполните поля:

   | Поле | Пример значения |
   |---|---|
   | Name | `Proxmox cluster 1` |
   | Endpoint | `https://192.0.2.10:8006` |
   | Token id | `nexcmp@pve!api` |
   | Token secret | `XXXX` (UUID, выведенный на шаге 1) |
   | Slug | `pve-1` (a-z, 0-9, дефис, от 2 до 32 символов) |
   | Default node | `pve1` (пусто: нода в сети с наибольшим объемом свободной RAM) |
   | Хранилище | `local-lvm` |
   | Bridge | `vmbr0` |

      ![Окно Add cloud provider с выбранным Proxmox VE и примерами значений endpoint, токена и хранилища](https://nexcmp.com/ru/docs/images/infrastructure/proxmox-01-add-provider.webp)

2. Нажмите **Save & open provider** и укажите причину при появлении запроса. Токен шифруется перед сохранением.
3. На вкладке **Overview** нажмите **Test connection**. Первый успешный тест **закрепляет TLS-отпечаток кластера**; с этого момента другой сертификат будет отклоняться.


4. Откройте вкладку **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) | Заполняется при первом тесте. Очистите поле и выполните повторный тест после замены сертификата кластера. |

      ![Вкладка Clusters, карточка Cluster configuration с примером ноды, хранилища, bridge и списка шаблонов ОС](https://nexcmp.com/ru/docs/images/infrastructure/proxmox-03-cluster-config.webp)

5. Необязательно: если вы выбрали вариант B выше, заполните **Create OS template from cloud image** (OS key `ubuntu-24.04`, vmid `9000`, нода `pve1`, URL-адрес qcow2-образа) и нажмите **Create template**. Процесс выполняется в фоновом режиме несколько минут; результат отображается в Audit log.

      ![Карточка Create OS template from cloud image с примером URL-адреса образа Ubuntu](https://nexcmp.com/ru/docs/images/infrastructure/proxmox-04-template-from-image.webp)

6. Нажмите **Add pool** в **Cluster IP pool** и создайте пул, из которого VM будут получать адреса:

   | Поле | Пример значения |
   |---|---|
   | Name | `customers-1` |
   | CIDR | `198.51.100.0/24` |
   | Gateway | `198.51.100.1` (никогда не назначается VM) |
   | DNS | `1.1.1.1,8.8.8.8` (от 1 до 4 адресов IPv4) |
   | Bridge, VLAN | `vmbr0`, `0` |
   | Already used IPs | по одному на строку, `ip note`, например `198.51.100.10 monitoring` |

   NexCMP никогда не назначает адрес сети, широковещательный адрес, шлюз или зарезервированный адрес. Пулы одного кластера не могут перекрываться. Пул можно удалить только тогда, когда ни один из его адресов не используется.

      ![Диалоговое окно Add IP pool с примером сети /24 и шлюза](https://nexcmp.com/ru/docs/images/infrastructure/proxmox-05-ip-pool.webp)

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

      ![Карточка Attach cluster to zone с выбранной существующей зоной](https://nexcmp.com/ru/docs/images/infrastructure/proxmox-06-attach-zone.webp)

8. Откройте **Services › Virtual Machines › Plans & pricing** и нажмите **Add plan**. В поле **Infrastructure source** выберите кластер Proxmox, затем настройте CPU, RAM, диск и цену. Для тарифа Proxmox не требуется сервисное предложение CloudStack. Чтобы продавать одну и ту же конфигурацию из обоих источников, используйте **Clone** для тарифа и выберите другой источник. Размер диска в тарифе должен быть не меньше размера диска в шаблоне: Proxmox не может уменьшать диск.


### Импорт существующей VM {#import-a-vm-that-already-exists}

Откройте вкладку **Servers**, чтобы просмотреть список виртуальных машин в кластере. Действие **Import** бесплатно привязывает существующую виртуальную машину к аккаунту клиента: оплата за часы, время в выключенном состоянии или трафик не взимается. Клиент может запускать, останавливать, перезагружать ВМ и открывать консоль, но не может удалить её — это доступно только администратору. Во время импорта NexCMP выполняет только чтение данных из кластера.

- Кластер должен быть привязан к зоне **с указанием имени ноды** этой виртуальной машины (если оставить имя ноды пустым, процесс импорта вернет ошибку о том, что регион не настроен).
- Чтобы сделать виртуальную машину **защищенной** (остановка, перезагрузка, переустановка, восстановление из Snapshots, уничтожение и смена тарифа блокируются), импортируйте её из командной строки с помощью `--protect`:

  ```bash
  sudo -u nexcmp /opt/nexcmp/bin/nexcmp px-import --provider pve-1 --server-ref pve1/101 --account-id 12 --hostname web-1 --protect
  ```



### Что поддерживается и не поддерживается в Proxmox {#what-is-and-is-not-supported-on-proxmox}

| Функция | Proxmox VE |
|---|---|
| Создание, включение/выключение/перезагрузка, удаление | Да |
| Изменение объема CPU и RAM, увеличение диска | Да, но ВМ останавливается, параметры изменяются, затем она запускается снова (live resize не поддерживается) |
| Snapshots | Да, до 5 на одну ВМ: создание, просмотр списка, восстановление, удаление |
| Переустановка | Да: ВМ пересоздается из шаблона с сохранением своего id, IP и настроек, но с новым паролем |
| Сброс пароля | Да, через гостевой агент |
| Консоль | Да, консоль в браузере, проксируемая панелью |
| Метрики | Да: CPU, память, сеть и диск |
| Монтирование ISO, Backups, firewall, IPv6, проброс портов, смена IP, дополнительные тома, Auto Scaling, DDoS Shield, VPC, учет трафика | Недоступно. На странице виртуальной машины клиента скрыты функции, которые не поддерживаются источником. |

## Проверка {#verify}

1. **Test connection** отображает OK, а статус провайдера — active.
2. В **Clusters** ваши ноды показаны со статусом online, вместе с хранилищем и сетевым мостом.
3. В **Cluster IP pool** отображается количество свободных, используемых и зарезервированных адресов.
4. После подключения кластера ключ ОС появляется в списке шаблонов зоны в **Services › Virtual Machines › Template**.
5. Закажите тестовую ВМ по тарифу, использующему этот кластер. Она должна получить адрес из пула, пароль root и рабочую консоль, а в пуле один адрес должен отображаться как занятый.

## Ограничения и примечания {#limits-and-notes}

::: tip Зоны со смешанными источниками
Начиная с 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 выставляет счета вашим клиентам; расходы на оборудование и лицензии кластера вы несете самостоятельно.


## Устранение неполадок {#troubleshooting}

| Симптом | Причина | Решение |
|---|---|---|
| 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 | Подключите кластер к зоне с указанием имени узла. |
