Короткий рассказ о том, как я настроил noVNC. После бесчисленных часов исследований я наконец-то все настроил так, как задумано. Хочу поделиться пошаговой инструкцией, чтобы людям в будущем было проще.
* Установить API Wrapper на хост-систему. * Добавить API-пользователя и убедиться, что у него есть необходимые права. * Создать функции для предварительного просмотра VNC на страницах по вашему выбору. * Встроить (Iframe) экземпляр VNC в веб-приложение.
Эта настройка может не сработать для вас. Если это так, ответьте в этой теме, и я помогу вам. Возможно, вам потребуется внести некоторые изменения для вашей конкретной настройки.
Вот как создать нового пользователя с необходимыми правами для VNC:
(Нажмите на Datacenter, а затем Users)
Добавить пользователя, нажав здесь:
Затем нам нужно убедиться, что у этого нового пользователя есть пароль. Вот что я лично предпочитаю для этого:
Можно просто добавить нового пользователя с надежным паролем (будьте внимательны к специальным символам, поскольку этот Proxmox wrapper их не любит: '&$').
Нажмите на нового пользователя, который был создан, а затем на Password:
Убедитесь, что вы вводите тот же пароль, что и в командной строке хост-системы.
Затем нам нужно убедиться, что у этого нового пользователя есть необходимые права: (Создайте Resource Pool для ресурсов, которые мы хотим предоставить API-пользователю)
Затем просто назовите его – можете назвать как угодно. После этого мы сможем добавлять ресурсы в этот пул:
Нажмите на Virtual Machines, чтобы массово добавить отдельные машины:
Затем просто добавьте машины, к которым API-пользователь должен иметь доступ.
Наконец, мы можем добавить соответствующие права для пользователя:
Структура файлов:
---
VNC\_API:
* vm\_functions.php * preview\_vnc.php
Установка Wrapper:
Bash: `composer require zzantares/proxmoxve ~4.0`
FILE: vm\_functions.php
```php <?php
use ProxmoxVE\Proxmox; use GuzzleHttp\Client;
function PreviewVnc($vmID, $nodeid) { // pass in the vmid and nodeid from the functions above $node = $nodeid; $vmid = $vmID;
// set up the proxmox creds and login $credentials = [ 'hostname' => 'proxmox-domain', // Also can be an IP 'username' => 'api', 'password' => 'password', ];
Ребята, вы пробовали установить cookie для VNC-тикета? Мое веб-приложение работает и без него, но в некоторых случаях он может понадобиться. Могу сделать видео и скинуть ссылку на него сегодня, если это поможет?
Привет, там есть два разных типа тикетов: VNC-тикет и PVE-тикет. Убедись, что ты передаешь правильный тикет в нужное место. Похоже, ты используешь PVE-тикет для входа в VNC, когда тебе нужен VNCPVE-тикет. `<---- этот фрагмент кода извлекает vnc-тикет. Основное различие между ними в том, что PVE-тикет аутентифицирует весь сервер, а vnc-тикет аутентифицирует только vnc-прокси. Надеюсь, это поможет, если все равно возникнут проблемы — дай знать.
Ну, у каждого будет немного разная конфигурация, это просто обзор основ настройки. Мой код должен работать в теории, он работает у меня. В некоторых случаях может потребоваться функция получения access token, которая будет получать определённый тикет для аутентификации, например, так: PHP:
```php function getAT() { $credentials = [ 'hostname' => 'domain.com', // Также может быть IP 'username' => 'apiuser', 'password' => 'pass123', ]; $proxmox = new Proxmox($credentials); if ($login = $proxmox->login()) { $ticket = $login->getTicket(); return $ticket; } return null;
PHP: <?php require 'vendor/autoload.php'; use ProxmoxVE\Proxmox; use GuzzleHttp\Client; function PreviewVnc($vmID, $nodeid) { // pass in the vmid and nodeid from the functions above $node = $nodeid; $vmid = $vmID; // set up the proxmox creds and login $credentials = [ 'hostname' => '123.123.12.12', // Also can be an IP 'username' => 'root', 'password' => 'mypassword', ]; $host = $credentials['hostname']; $proxmox = new Proxmox($credentials); if ($login = $proxmox->login()) {
$src_href = 'https://'.$host.':8006/?console=kvm&novnc=1&node='.$node.'&resize=1&vmid='.$vmid.'&path=api2/json/nodes/'.$node.'/qemu/'.$vmid.'/vncwebsocket/port/'.$config['data']['port'].'"/vncticket/"'.$config['data']['ticket']; echo '<iframe src="'.$src_href.'" frameborder="0" scrolling="no" width="100%" height="100%"></iframe>'; } } ?> Теперь я изменил это на $config['data']['ticket'], но это не помогло
Ты смог заставить это работать в итоге? У меня тоже ошибка 401 No Ticket, хотя я использую VNC-билет. Мой URL выглядит так: Code: https://172.17.50.250:8006/?console=kvm&novnc=1&node=mynodename&resize=1&vmid=103&path=api2/json/nodes/mynodename/qemu/103/vncwebsocket/port/5900/"vncticket"/PVEVNC%3A64130932%3A%3Adn%2BOzhoQtfRvVKfxd%2F%2BxE9IbBIwegHihcg8IZ2YRce%2BQrRGHcXtFQRr1QSmOMCyJrgzPiHGdu%2Bv0WZmhqK6ablXIsj%2FEY1f%2BVma2Fkp%2FH9A0pvkoQxcMYayLDwZPIFQYAcf%2BLzmQNybVKdGQgCY%2FB%2Bib1abUaohbRWbBUZq6y8CS1S6y8u6DBSf5jp7zc6wugpr3AOWtj%2BpTCtZZWwCChE1t2CyFVF78hAQB%2F1BCPYFx9%2B%2FuEgdKv0s4Vzr%2BHXOQnXy%2F64G55lOcnz6ewIp6v0twwxr1i%2FjD6jmqZ9BBgWgMfzQaiUCLilSA3dE0G8Le30a%2ByReJIJyIi7QqgVvGvQ%3D%3D Ещё заметил, что после получения ошибки 401, веб-интерфейс Proxmox показывает подключения немного дольше, прежде чем отключаться
Привет, я использую этот код, и всё работает. Можешь попробовать, тебе нужно добавить auth cookie. Мой PVE Node: n1.domain Моя APP: vnc.domain PHP: ```php <?php
// Require the autoloader require_once 'vendor/autoload.php';
// Use the library namespace use ProxmoxVE\Proxmox;
// Create your credentials array $credentials = [ 'hostname' => 'n1.domain', // Also can be an IP 'username' => 'root', 'password' => 'pass', 'realm' => 'pam', 'port' => '8006', ];
// Then simply pass your credentials when creating the API client object. $proxmox = new Proxmox($credentials);
Это решение объединяет два разных подхода и генерирует лишние вызовы /vncproxy в Proxmox, что не нужно. Смотрите мою тему и комментарии здесь: https://forum.proxmox.com/threads/n...ction-timeout-on-vncproxy.150854/#post-682559 Если у вас другое мнение, не стесняйтесь это обсудить. Я думаю, лучше найти чистое решение без лишних вызовов и ненужных кусков кода.
Можно ли использовать VNC без PVEAuthCookie, как Spice? Если всё равно приходится устанавливать cookie, то проще использовать обычные ссылки, когда cookie браузера уже установлен. https://{host}/?console=kvm&novnc=1&vmid={vmid}&node={node}&autoresize=true. Это не работает, потому что проверяется CSRF-токен. Было бы неплохо, если бы VNC-тикета было достаточно без установки cookie.
У меня есть еще один метод, если твой PVE URL отличается от NovNC URL: загрузи loadvnc.html, mgui.js, util.js, webutil.js в PVE ноду /usr/share/novnc-pve/ и PHP файл типа:
PHP: ```php <?php // Require the autoloader require_once 'vendor/autoload.php';
// Use the library namespace use ProxmoxVE\Proxmox;