Настройка
Новости
Оплата
Доставка
Информация
Контакты
Загрузки
Форум
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
    info@proxmox.su
    +7 (495) 320-70-49
    Заказать звонок
    Аспро: ЛайтШоп
    Каталог
    • 1U
      1U
    • 2U
      2U
    • 3U
      3U
    • 4U
      4U
    0 Сравнение
    0 Избранное
    0 Корзина
    Аспро: ЛайтШоп
    Каталог
    0 Сравнение
    0 Избранное
    0 Корзина
    Аспро: ЛайтШоп
    Телефоны
    +7 (495) 320-70-49
    Заказать звонок
    0
    0
    0
    Аспро: ЛайтШоп
    • +7 (495) 320-70-49
      • Назад
      • Телефоны
      • +7 (495) 320-70-49
      • Заказать звонок
    • info@proxmox.su
    • Москва, Бакунинская улица, 69с1
    • Пн-Пт: 09-00 до 18-00
      Сб-Вс: выходной
    • 0 Сравнение
    • 0 Избранное
    • 0 Корзина
    Главная
    Форум
    Proxmox Виртуальная Среда
    [ТУТОРИАЛ]Как настроить noVNC на веб-приложении.

    Форумы: Proxmox Виртуальная Среда, Proxmox Backup Server, Proxmox Mail Gateway, Proxmox Datacenter Manager
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    [ТУТОРИАЛ]Как настроить noVNC на веб-приложении., Proxmox Виртуальная Среда
     
    parrotassassin15
    Guest
    #1
    0
    05.03.2023 07:42:00
    Короткий рассказ о том, как я настроил noVNC. После бесчисленных часов исследований я наконец-то все настроил так, как задумано. Хочу поделиться пошаговой инструкцией, чтобы людям в будущем было проще.

    Я использую следующий API Wrapper: https://github.com/zzantares/ProxmoxVE

    Вкратце, вот что нам нужно сделать:

    *   Установить API Wrapper на хост-систему.
    *   Добавить API-пользователя и убедиться, что у него есть необходимые права.
    *   Создать функции для предварительного просмотра VNC на страницах по вашему выбору.
    *   Встроить (Iframe) экземпляр VNC в веб-приложение.

    Эта настройка может не сработать для вас. Если это так, ответьте в этой теме, и я помогу вам. Возможно, вам потребуется внести некоторые изменения для вашей конкретной настройки.

    Вот как создать нового пользователя с необходимыми правами для VNC:

    (Нажмите на Datacenter, а затем Users)


    Добавить пользователя, нажав здесь:



    Затем нам нужно убедиться, что у этого нового пользователя есть пароль. Вот что я лично предпочитаю для этого:


    Можно просто добавить нового пользователя с надежным паролем (будьте внимательны к специальным символам, поскольку этот Proxmox wrapper их не любит: '&$').

    Bash: `adduser api`

    Затем нужно повторить это на уровне Datacenter:

    ```json
    {
    "lightbox_close": "Закрыть",
    "lightbox_next": "Следующий",
    "lightbox_previous": "Предыдущий",
    "lightbox_error": "Запрашиваемый контент не может быть загружен. Пожалуйста, попробуйте позже.",
    "lightbox_start_slideshow": "Запустить слайдшоу",
    "lightbox_stop_slideshow": "Остановить слайдшоу",
    "lightbox_full_screen": "Полноэкранный режим",
    "lightbox_thumbnails": "Миниатюры",
    "lightbox_download": "Загрузить",
    "lightbox_share": "Поделиться",
    "lightbox_zoom": "Увеличить",
    "lightbox_new_window": "Новое окно",
    "lightbox_toggle_sidebar": "Переключить боковую панель"
    }
    ```

    [https://forum.proxmox.com/attachments/1677997390955-png.47577/?hash=4b135874fbeefba380d04ae5ca7436a2](<#9 >)

    Нажмите на нового пользователя, который был создан, а затем на 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',
       ];

       $host = $credentials['hostname'];

       $proxmox = new Proxmox($credentials);

       if ($login = $proxmox->login()) {

           $ticket = $login->getTicket();

           $config = $proxmox->create("/nodes/$node/qemu/$vmid/vncproxy", [
               'websocket' => 1, // Start websocket proxy
           ]);


           $websock = $proxmox->get("/nodes/$node/qemu/$vmid/vncwebsocket", [

               'vncticket' => $config['data']['ticket'],
               'port' => $config['data']['port']
           ]);



           $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/"'.$ticket;
           echo '<iframe src="'.$src_href.'" frameborder="0" scrolling="no" width="100%" height="100%"></iframe>';
       }
    }

    ?>
    ```

    FILE: preview\_vnc.php

    ```php
    <?php
    require 'vm_functions.php';

    $vmid = 100;
    $node = 'proxmox';

    PreviewVnc($vmid, $node);
    ```

    Если все пройдет успешно, у вас должна быть инстанция VNC, запущенная на preview\_vnc.php.
     
     
     
    vegasss7
    Guest
    #2
    0
    02.10.2023 11:55:00
    Привет, извините, что поднимаю эту тему снова, можно ли использовать API Token вместо PVEAuthCookie? Спасибо! И, кстати, вы уже сняли видео?
     
     
     
    alexo
    Guest
    #3
    0
    12.03.2023 07:57:00
    Ошибка 801 Нет тикета https://myhostip:8006/?console=kvm&...n/nodes/s123/qemu/9505/vncwebsocket/port/5900 "/vncticket/"PVE:root@pam:640D7AAD::S/gwT/TL7fGdfC+eVraLJZ3JmvUhKtxFxxWFAJG42Q2FPjMUXWZVBjN5Rn39­olTwjIgiuiHCnfrSAd7Jgml/bUSZQ7v/M0lodhlfB96MnGE7ObLJixuldTxD­Vgf7giDxLiK+UL/ThVPs6darIeZniMN5kaGMXnspywv9u9o/qqW9/EJv0XQE­CM2u+8Rb4bTMlbVqfc0auX43dW/SqjoCdpINEfdMYAiMGpqInannQdvGG/gn­PzrBxe3J3TWbtgAloJB0nZZM27LI53TdIFUdj313sUVBjPxEXOHIL7AB0SOv­M7TXC9ejqzABH/PBh3YY2lP0WwIvldQQlRXTmg1omQ==
     
     
     
    parrotassassin15
    Guest
    #4
    0
    28.04.2023 23:26:00
    Ребята, вы пробовали установить cookie для VNC-тикета? Мое веб-приложение работает и без него, но в некоторых случаях он может понадобиться. Могу сделать видео и скинуть ссылку на него сегодня, если это поможет?
     
     
     
    parrotassassin15
    Guest
    #5
    0
    12.03.2023 22:47:00
    Привет, там есть два разных типа тикетов: VNC-тикет и PVE-тикет. Убедись, что ты передаешь правильный тикет в нужное место. Похоже, ты используешь PVE-тикет для входа в VNC, когда тебе нужен VNCPVE-тикет. `<---- этот фрагмент кода извлекает vnc-тикет. Основное различие между ними в том, что PVE-тикет аутентифицирует весь сервер, а vnc-тикет аутентифицирует только vnc-прокси. Надеюсь, это поможет, если все равно возникнут проблемы — дай знать.
     
     
     
    alexo
    Guest
    #6
    0
    12.03.2023 23:20:00
    И я только что взял твой код.
     
     
     
    parrotassassin15
    Guest
    #7
    0
    12.03.2023 23:29:00
    Ну, у каждого будет немного разная конфигурация, это просто обзор основ настройки. Мой код должен работать в теории, он работает у меня. В некоторых случаях может потребоваться функция получения 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;

       $getTicket = $proxmox->get("/ticket");

    }
    ```
     
     
     
    alexo
    Guest
    #8
    0
    12.03.2023 23:31:00
    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()) {
         
           $ticket = $login->getTicket();
       
           $config = $proxmox->create("/nodes/$node/qemu/$vmid/vncproxy", [
               'websocket' => 1, // Start websocket proxy
           ]);


           $websock = $proxmox->get("/nodes/$node/qemu/$vmid/vncwebsocket", [

               'vncticket' => $config['data']['ticket'],
               'port' => $config['data']['port']
           ]);




           $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'], но это не помогло
     
     
     
    alexo
    Guest
    #9
    0
    12.03.2023 23:39:00
    Ошибка сервера: запрос `GET https://123.123.12.12:8006/api2/json/ticket` вернул ответ `501 Method 'GET /ticket' not implemented`: {"data":null}
     
     
     
    alexo
    Guest
    #10
    0
    12.03.2023 23:46:00
    https://123.123.12.12:8006/?console.../nodes/s3356/qemu/9803/vncwebsocket/port/5900 "/vncticket/"PVEVNC:640E5602::ZcxySe36YkbisxgRfXs3zqEMGO54zUXP1HdPMJKDjkZ7u7FaUdVYFMS9txDE­1h2LVCnSsnZiV0tQzBd4zF4mue8A7evGajTMRoPGJSAsb73QSD8jW3je2bbx­LokCqj/o8PzCyRh7yL/4gc3boELBkfsD3awcJKpfuT1zxMFckBMxESRRgog2­bn4g9TmtMc8yqnZnViKm0rpaQZ7XVyOmV4LHP9336Ps/Dnh0naMByjTzoLaN­w4++1IukrXIRAoDnJ1AvOdS5DPJZuwrCUawvjkSUTgyF7Nj9D/94uC5Z7Lip­KV9TNOXAq4K+5v8fK0B+UBj+DaibjDfjEbaRGeEF4A==
     
     
     
    alexo
    Guest
    #11
    0
    13.03.2023 08:47:00
    Судя по всему, я что-то делаю не так.
     
     
     
    MatthieuLAURENT39
    Guest
    #12
    0
    16.03.2023 13:05:00
    Ты смог заставить это работать в итоге? У меня тоже ошибка 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/5­900/"vncticket"/PVEVNC%3A64130932%3A%3Adn%2BOzhoQtfRvVKfxd%2F%2B­xE9IbBIwegHihcg8IZ2YRce%2BQrRGHcXtFQRr1QSmOMCyJrgzPiHGdu%2Bv­0WZmhqK6ablXIsj%2FEY1f%2BVma2Fkp%2FH9A0pvkoQxcMYayLDwZPIFQYA­cf%2BLzmQNybVKdGQgCY%2FB%2Bib1abUaohbRWbBUZq6y8CS1S6y8u6DBSf­5jp7zc6wugpr3AOWtj%2BpTCtZZWwCChE1t2CyFVF78hAQB%2F1BCPYFx9%2­B%2FuEgdKv0s4Vzr%2BHXOQnXy%2F64G55lOcnz6ewIp6v0twwxr1i%2FjD6­jmqZ9BBgWgMfzQaiUCLilSA3dE0G8Le30a%2ByReJIJyIi7QqgVvGvQ%3D%3­D Ещё заметил, что после получения ошибки 401, веб-интерфейс Proxmox показывает подключения немного дольше, прежде чем отключаться
     
     
     
    dklinux7
    Guest
    #13
    0
    18.07.2023 13:47:00
    Не могли бы вы поделиться ссылкой на видео???
     
     
     
    habibulilalbaab
    Guest
    #14
    0
    11.01.2024 06:35:00
    Привет, я использую этот код, и всё работает. Можешь попробовать, тебе нужно добавить 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);

    if ($login = $proxmox->login()) {
       $host = $credentials['hostname'];
       $node = 'n1';
       $vmid = 119;

       $ticket = $login->getTicket();
       setcookie("PVEAuthCookie",$ticket, 0, "/", '.domain' );
       $config = $proxmox->create("/nodes/$node/qemu/$vmid/vncproxy", [
           'websocket' => 1, // Start websocket proxy
       ]);

       $websock = $proxmox->get("/nodes/$node/qemu/$vmid/vncwebsocket", [
           'vncticket' => $config['data']['ticket'],
           'port' => $config['data']['port']
       ]);
       // print_r($login);
       $src_href = 'https://'.$host.'/?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>';
    }
    ```
     
     
     
    lubr
    Guest
    #15
    0
    09.07.2024 15:29:00
    Это решение объединяет два разных подхода и генерирует лишние вызовы /vncproxy в Proxmox, что не нужно. Смотрите мою тему и комментарии здесь: https://forum.proxmox.com/threads/n...ction-timeout-on-vncproxy.150854/#post-682559 Если у вас другое мнение, не стесняйтесь это обсудить. Я думаю, лучше найти чистое решение без лишних вызовов и ненужных кусков кода.
     
     
     
    ShotgunPayDay
    Guest
    #16
    0
    31.07.2024 13:22:00
    Можно ли использовать VNC без PVEAuthCookie, как Spice? Если всё равно приходится устанавливать cookie, то проще использовать обычные ссылки, когда cookie браузера уже установлен. https://{host}/?console=kvm&novnc=1&vmid={vmid}&node={node}&autoresize=true. Это не работает, потому что проверяется CSRF-токен. Было бы неплохо, если бы VNC-тикета было достаточно без установки cookie.
     
     
     
    ultrasive
    Guest
    #17
    0
    06.11.2024 06:47:00
    Есть ли способ обойти необходимость в CSRF-токенах? Может быть, можно использовать обратный прокси, который будет добавлять нужный токен?
     
     
     
    windowsdesxtop
    Guest
    #18
    0
    12.02.2025 11:24:00
    @alexo @vegasss7 @habibulilalbaab @ultrasive Ребята, вы уже нашли решение?
     
     
     
    habibulilalbaab
    Guest
    #19
    0
    27.02.2025 11:56:00
    Привет, могу подтвердить, что этот метод работает у меня:

    Proxmox хост: id-n1.domain.com
    VNC URL/Этот PHP файл (должен быть на том же домене, что и Proxmox домен): vnc.domain.com

    PHP:
    ```php
    <?php
    ini_set('display_errors', '1');
    ini_set('display_startup_errors', '1');
    error_reporting(E_ALL);
    // Require the autoloader
    require_once 'vendor/autoload.php';

    // Use the library namespace
    use ProxmoxVE\Proxmox;

    // Create your credentials array
    $credentials = [
       'hostname' => 'id-n1.domain.com',  // Также может быть IP
       'username' => 'vnc',
       'password' => 'q1w2e3r4',
       'realm' => 'pve',
       'port' => '8006',
    ];

    // Then simply pass your credentials when creating the API client object.
    $proxmox = new Proxmox($credentials);

    if ($login = $proxmox->login()) {
       $host = $credentials['hostname'].':'.$credentials['port'];
       $node = 'id-n1';
       $vmid = 109;

       $ticket = $login->getTicket();
       setcookie("PVEAuthCookie",$ticket, 0, "/", ".domain.com" );
       $config = $proxmox->create("/nodes/$node/qemu/$vmid/vncproxy", [
           'websocket' => 1, // Start websocket proxy
       ]);

       $websock = $proxmox->get("/nodes/$node/qemu/$vmid/vncwebsocket", [
           'vncticket' => $config['data']['ticket'],
           'port' => $config['data']['port']
       ]);

       $src_href = 'https://'.$host.'/?console=kvm&novnc=1&vmid='.$vmid.'&node='.$node.'&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>';
    }
    make sure PVEAuthCookie set to .yourdomain.com
    ```

    Убедитесь, что PVEAuthCookie установлен для .yourdomain.com
     
     
     
    habibulilalbaab
    Guest
    #20
    0
    28.02.2025 11:18:00
    У меня есть еще один метод, если твой 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;

    // Create your credentials array
    $credentials = [
       'hostname' => 'id-n1.domain.com',
       'username' => 'vnc',
       'password' => 'q1w2e3r4',
       'realm' => 'pve',
       'port' => '8006',
    ];

    // Then simply pass your credentials when creating the API client object.
    $proxmox = new Proxmox($credentials);

    session_start();
    if ($login = $proxmox->login()) {
       $host = $credentials['hostname'].':'.$credentials['port'];
       $node = 'id-n1';
       $vmid = 109;

       $ticket = $login->getTicket();
       $csrf = $login->getCsrf();

       $src_href = "https://{$host}/novnc/loadvnc.html?novnc=1&token={$ticket}&CSRFPreventionToken={$csrf}&console=qemu&virtualization=qemu&node={$node}&vmid={$vmid}";
       header("Location: ".$src_href);
       exit();
    }
    ```
     
     
     
    Страницы: 1
    Читают тему
    +7 (495) 320-70-49
    info@proxmox.su

    Конфиденциальность Оферта
    © 2025 Proxmox.su
    Главная Каталог 0 Корзина 0 Избранные 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры