safe_ticket = quote(ticket, safe="") safe_port = quote(str(port), safe="") upstream_url = ( f"wss://{fallback_host}/api2/json/nodes/{node}/{guest_path}/{vmid}/vncwebsocket" f"?port={safe_port}&vncticket={safe_ticket}" ) # Хост для заголовка Host в WebSocket-handshake. Proxmox проверяет, # что origin тикета совпадает с origin запроса. Если backend подключается # по внутреннему IP, но в сертификате Proxmox указан внешний DNS — # можно в заголовке Host передать внешний DNS. Тогда Proxmox примет # запрос как "пришедший с правильного origin". pve_external_host = settings.pve_public_host.split(":")[0] if settings.pve_public_host else "" if not pve_external_host: # По умолчанию используем pve1.input.netcraze.pro, если в настройках # backend-окружения не указан PVE_PUBLIC_HOST. # Это эвристика: если запросы через внешний DNS не работают, # можно задать PVE_PUBLIC_HOST=192.168.31.4 чтобы отключить подмену. pve_external_host = "" upstream_host_header = pve_external_host or pve_backend_host