Hello misc@,

I'm currently trying to migrate my nginx setup to relayd, though, I cannot get some things to work properly, and I wonder if that is due to me not understanding how to configure it correctly or due to relayd not supporting my usecase.

To be precise: I want to run multiple apps behind a reverse proxy. One of them is ntfy. With nginx, the config looks like this:

map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
}

location / {
        proxy_pass http://127.0.0.1:8888;
        proxy_http_version 1.1;

        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;

        proxy_connect_timeout 3m;
        proxy_send_timeout 3m;
        proxy_read_timeout 3m;

        client_max_body_size 0;
}

(This is equivalent to the example configuration in the ntfy docs [1])

relayd takes care of Host, Upgrade and Connection with the http websockets option, and X-Forwarded-For is easily added as a header:

table <ntfy> { 127.0.0.1 }

http protocol revproxy {
        tls keypair ...
        tcp { nodelay, sack, socket buffer 65536, backlog 100 }
        http websockets
        return error
        
        match request header set "X-Forwarded-For" value "$REMOTE_ADDR"
        
        ...

        pass request quick header "Host" value "ntfy.example" \
                forward to <ntfy>
}

relay https {
        listen on 0.0.0.0 port 443 tls
        protocol revproxy
        forward to <ntfy> port 8888
}

But how do I modify the proxy_{connect,send,read}_timeout variables? Following relayd.conf(5), I suppose the closest thing to be:

relay https {
        ...
        session timeout 180
}

But what if I want to leave the session timeout untouched for other subdomains (applications) that I am proxying with the same protocol / relay?

table <disco> { 127.0.0.1 }

http protocol revproxy {
        ...
        pass request quick header "Host" value "disco.example" \
                forward to <disco>
}

relay https {
        listen on 0.0.0.0 port 443 tls
        protocol revproxy
        forward to <ntfy> port 8888 session timeout 180
        forward to <disco> port 9999
}

Specifying session timeout per forward is unfortunately not an option.

And finally, client_max_body_size? ntfy requires this: "Stream request body to backend" is the annotation in their docs.

Talking about disco, a syncthing discovery server [2] is another item on my selfhosting bucket list - and I have even less of an idea on how to make that work:

server {
        ...

        ssl_verify_client optional_no_ca;

        location / {
                proxy_pass http://127.0.0.1:9999;

                proxy_http_version 1.1;
                proxy_buffering off;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection $http_connection;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Client-Port $remote_port;
                proxy_set_header X-Forwarded-For \
                        $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto \
                        $http_x_forwarded_proto;
                proxy_set_header X-SSL-Cert $ssl_client_cert;
        }
}

That is, can relayd even do this client cert logic?

Not to mention... do I really have to copy paste each relay block as soon as I want relayd to be listening on multiple addresses? In nginx, one can simply say

listen 443 ssl;
listen [::]:443 ssl;

... while the equivalent in relayd appears to be ...

relay https4 {
        listen on 0.0.0.0 port 443 tls
        protocol revproxy
        forward to <ntfy> port 8888
        forward to <disco> port 9999
}

relay https6 {
        listen on :: port 443 tls
        protocol revproxy
        forward to <ntfy> port 8888
        forward to <disco> port 9999
}

... this obviously does not scale at all.

- Christoph

[1] https://docs.ntfy.sh/config/#nginxapache2caddy
[2] https://docs.syncthing.net/users/stdiscosrv.html#nginx

Reply via email to