Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Reverse proxying does not work #32

Open
hexadecagram opened this issue Dec 27, 2022 · 1 comment
Open

Reverse proxying does not work #32

hexadecagram opened this issue Dec 27, 2022 · 1 comment

Comments

@hexadecagram
Copy link

hexadecagram commented Dec 27, 2022

LABEL build_version=netboot.xyz version: 0.6.7-nbxyz21 Build-date: 2022-12-09T02:25:23

Hello,

I am attempting to run docker-netbootxyz behind a reverse proxy so that I can have the administrative interface located at http://example.com/netbootxyz and the assets at http://example.com/assetsxyz. I am running netbootxyz as a Docker Stack (not just a service), with host-based rather than overlay networking which is better for maintaining stateful connections, and I use HAProxy and Apache to accomplish the reverse proxying.

Setting it up this way mostly seems to work just fine except that the webpage never progresses past saying "Getting Dashboard" with a pulsating disc, at which time I see this in Chrome's debugging console:

polling.js:311          GET https://example.com/socket.io/?EIO=4&transport=polling&t=OLK-hzD 503 (Service Unavailable)
create @ polling.js:311
Request @ polling.js:255
request @ polling.js:207
doPoll @ polling.js:232
poll @ polling.js:98
doOpen @ polling.js:58
open @ transport.js:49
open @ socket.js:162
Socket @ socket.js:103
open @ manager.js:108
Manager @ manager.js:39
lookup @ index.js:29
(anonymous) @ netbootxyz-web.js:9

If I then examine netbootxyz-web.js, the issue is plainly obvious at line 9. As you will notice in my Apache configuration, I have attempted to remedy the situation by adding the line ProxyHTMLURLMap /socket.io /netbootxyz/socket.io, which has no effect because ProxyHTMLURLMap evidently does not have the proper context to match that line, so "/socket.io" never gets modified, and it looks like it's the wrong thing to do here, anyway.

I can't recall the exact method that I've used in the past, but I know that I can work around this by piping netbootxyz-web.js through a shell script before it is served out by Apache. Nevertheless, anyone else that would like to reverse-proxy netbootxyz would likely bump into this issue, so it's worth mentioning. I will continue to work on this as time permits and post any findings.

Here are the relevant sections of my configurations.

docker-compose.yaml

version: "3.8"
  netbootxyz:
    image: ghcr.io/netbootxyz/netbootxyz
    deploy:
      mode: global
    ports:
      - target: 69
        published: $NETBOOTXYZ_TFTP_PORT
        protocol: udp
        mode: host
      - target: 80
        published: $NETBOOTXYZ_ASSETS_PORT
        mode: host
      - target: 3000
        published: $NETBOOTXYZ_CONFIG_PORT
        mode: host
    volumes:
      - netbootxyz_config:/config
      - netbootxyz_assets:/assets
    environment: [TZ]

volumes:
  netbootxyz_assets:
    name: netbootxyz_assets
    driver_opts:
      type: "nfs"
      o: "addr=server"
      device: ":/netbootxyz"
  netbootxyz_config:
    name: netbootxyz_config

haproxy.cfg

backend netbootxyz
    option httpchk OPTIONS *
    http-check send hdr Host localhost
    http-request redirect prefix / drop-query append-slash if { path /netbootxyz }
    server netbootxyz proxy_mod_proxy:80 check resolvers default # ssl verify none

backend assetsxyz
    option httpchk OPTIONS *
    http-check send hdr Host localhost
    http-request redirect prefix / drop-query append-slash if { path /assetsxyz }
    server assetsxyz proxy_mod_proxy:80 check resolvers default # ssl verify none

extra/proxy-html.conf

ProxyRequests Off

ProxyHTMLURLMap http://netbootxyz:3000/ /netbootxyz/
<Location /netbootxyz/>
    Header edit Set-Cookie expr=^(.*[Dd]omain)=([^;]+)(.*)$ \1=example.com\3
    Header edit Set-Cookie expr=^(.*[Pp]ath)=([^;]+)(.*)$ \1=/netbootxyz\3
    ProxyHTMLEnable On
    ProxyHTMLExtended On
    ProxyPass http://netbootxyz:3000/
    ProxyPassReverse http://netbootxyz:3000/
    ProxyHTMLURLMap /socket.io /netbootxyz/socket.io
    ProxyHTMLURLMap / /netbootxyz/
    RequestHeader unset Accept-Encoding
</Location>

ProxyHTMLURLMap http://netbootxyz:80/ /assetsxyz/
<Location /assetsxyz/>
    Header edit Set-Cookie expr=^(.*[Dd]omain)=([^;]+)(.*)$ \1=example.com\3
    Header edit Set-Cookie expr=^(.*[Pp]ath)=([^;]+)(.*)$ \1=/assetsxyz\3
    ProxyHTMLEnable On
    ProxyHTMLExtended On
    ProxyPass http://netbootxyz:80/
    ProxyPassReverse http://netbootxyz:80/
    ProxyHTMLURLMap / /assetsxyz/
    RequestHeader unset Accept-Encoding
</Location>
@hexadecagram hexadecagram changed the title Reverse Proxying does not work Reverse proxying does not work Dec 27, 2022
@PeterFalken
Copy link

PeterFalken commented Nov 28, 2024

I'm interested as well, I'm running netboot.xyz on kubernetes with Traefik providing the Kubernetes Gateway API. The code for the webapp defines the path for the socket here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants