Private networking with Railway generated ports

ciaranevans
TRIAL

2 years ago

Hey Folks,

Sorry if crossposting this is a big no-no, figured maybe Discord is easier for conversational things.

I raised https://community.railway.app/discuss/thread/how-do-i-use-private-networking-with-rai-65fa14c1 but TL;DR: How do I use private networking (internal hostnames) when I let Railway assign ports?

0 Replies

ciaranevans
TRIAL

2 years ago

cb5aa03d-c72c-426c-8dd7-f109b7f03b5d


2 years ago

there's a wonderful guide here

but yes it's good your apps are listening on the automatically assigned PORT variable, so that means getting your apps to listen on a static port for use with the private network is as simple as setting a PORT service variable


ciaranevans
TRIAL

2 years ago

Yeah, found the guide, guessed it was the case that I would have to define a port instead 😄 No worries.


2 years ago

what kind of frontend is this?


ciaranevans
TRIAL

2 years ago

Sveltekit


2 years ago

server side rendered?


ciaranevans
TRIAL

2 years ago

🤷‍♂️ I'm a frontend noob, much more comfortable kneedeep in AWS infra and Python 😄


ciaranevans
TRIAL

2 years ago

I manage a bunch of Svelte devs so figured I should learn it a bit haha


2 years ago

will the calls to the backend be made from the server side of your frontend app?


ciaranevans
TRIAL

2 years ago

Yes, it already is, you can't see the requests in devtools for example


2 years ago

perfect then you will want a service variable on the frontend service like this

BACKEND_URL=http://${{.RAILWAY_PRIVATE_DOMAIN}}:${{.PORT}}

then use that variable in your frontend's code when you make the fetch call


ciaranevans
TRIAL

2 years ago

Ohlala.

Don't suppose there's a page with all these magic env vars?


2 years ago

oh yes my bad


ciaranevans
TRIAL

2 years ago

Sweet. That snippet you sent would be super useful on the Private Networking guide, makes much more sense now 😄


ciaranevans
TRIAL

2 years ago

Annoyingly I don't seem to have the Solution App available


2 years ago

I shall make that happen


ciaranevans
TRIAL

2 years ago

I have another question on the community page, feel bad duplicating it here also 🥲 Buuuuut if you're around 👀


2 years ago

solution app?


ciaranevans
TRIAL

2 years ago

1193298341082189800


ciaranevans
TRIAL

2 years ago

1193298427317072000


2 years ago

I turned that off because I had too many people marking the complete wrong message as the answer


ciaranevans
TRIAL

2 years ago

Ah 😛


2 years ago

but I haven't turned off the message lol


ciaranevans
TRIAL

2 years ago

No worries haha


2 years ago

I'll be honest I'm happy you posted here too, and I'd prefer you do, because as you said discord is easier for conversational things.

the forums is lacking a conversational aspect and that's why I don't like using them, but the cheerleader for the forums knows that too!


ciaranevans
TRIAL

2 years ago

Righto. I'll make a dupe here then 😅


2 years ago

sounds good!


ciaranevans
TRIAL

2 years ago

Back on this one 😅 So I put:

BACKEND_URL=http://${{backend.RAILWAY_PRIVATE_DOMAIN}}:${{backend.PORT}}

This resolves but if I put Https or http, it fails to connect, the more concerning part is the PORT resolves to not what the backend service is actually listening on:

errno: -111,

code: 'ECONNREFUSED',

syscall: 'connect',

address: 'fd12:2030:e370::8f:bc37:5946',

Backend logs:

[INFO] Running on http://[::]:6642

Am I using the right variables?


ciaranevans
TRIAL

2 years ago

Hmmm okay, in the dashboard it resolves ${{backend.RAILWAY_PRIVATE_DOMAIN}} as backend.railway.internal however when that's injected into my service, it's actually the ipv6 address.


ciaranevans
TRIAL

2 years ago

If I then use [] for fetch like recommended for ipv6 addresses, it resolves to:

1193466052940673000


ciaranevans
TRIAL

2 years ago

Safe to say I'm scuppered 😛


ciaranevans
TRIAL

2 years ago

BACKEND_URL=http://[${{backend.RAILWAY_PRIVATE_DOMAIN}}]:${{backend.PORT}}

This is what I have right now, Railway setup the port for backend, so I assume I'll be able to access that value.

This resolves to 'http://[backend.railway.internal]:'

If I remove the [] from my ENV (Even though that's not what I should do), it resolves to the actual ipv6 address.

Either way I do it, PORT Is empty anyway 🥲


ciaranevans
TRIAL

2 years ago

Okay, so a little progress:

BACKEND_URL=http://${{backend.RAILWAY_PRIVATE_DOMAIN}}:6642

If I hardcode the port to what I see in my backends logs (from the port Railway generated), I get a connection

So I guess the real question is - How the heck do I get that port without log diving 😄


ciaranevans
TRIAL

2 years ago

(I'd rather not pin it as it just another bit of config to remember)


2 years ago

pinning the port by setting a PORT service variable is perfectly fine as long as your app is still listening on the PORT environment variable, and that's exactly what you need to do to get that reference variable to render correctly.

it's also absolutely necessary because without pinning the port, railway will assign a random port (via the PORT environment variable) on every deployment that it expects your app to listen on, you can't reference this magic variable and even of you could it would just makes things worse because its random

also I have never seen the square brackets be necessary, so try not using the brackets


ciaranevans
TRIAL

2 years ago

Yeah, it's just strange that if I set the value, I can refer to it, but if Railway does, I can't 😂

Alright, I shall just pin it!


ciaranevans
TRIAL

2 years ago

Is that something I can define in railway.json? Or dashboard only?


2 years ago

yeah I get ya, but it's a good thing you can't reference the automatically generated PORT, as the value would become stale very quickly anyway, it's random and only available to the deployment at runtime.

has to be defined as a service variable in the dashboard


ciaranevans
TRIAL

2 years ago

Yeah that's fair enough, just somewhat invalidates the 'magic' 😂


ciaranevans
TRIAL

2 years ago

Anyway, I'll switch to that, thanks once again Brody! You the MVP


2 years ago

its now in the docs!


fcms14
PRO

2 years ago

Hi folks,

I'm having trouble using private networks
I read all the content above, including the links, followed the tutorial in the last link sent above, but I was unsuccessful.

I have two backend services running on railway, where currently one communicates with the other via the public network.

I would like to leave this second service with the public route disabled, and use the private network to communicate with it.

The two services have the same project name and environment, as I understood from the document above.
The service that will receive requests via the private route is configured to listen on IPv6.

I tested calling the url numerous times using ###.railway.internal and port, but it always returns "getaddrinfo ENOTFOUND"

I don't know what else I can try, does anyone suggest anything?

Both projects are in nestJs with typescript.


2 years ago

nixpacks or dockerfile based deployments?


fcms14
PRO

2 years ago

Nixpacks


2 years ago

at what point in your apps lifecycle are you trying to call the other service?


fcms14
PRO

2 years ago

The first service, with public routes, is an API gateway that, depending on the requested route, makes a call to this second service.
This call I would like to make via private route internally.


2 years ago

does your service make a call to the other service within the first 3 seconds of itself starting?


fcms14
PRO

2 years ago

no, never


2 years ago

screenshot of your project please


fcms14
PRO

2 years ago

what do you want i screen shot exactly?


2 years ago

of your railway project


fcms14
PRO

2 years ago

the second service

1227330303299944400


2 years ago

where is the other service


fcms14
PRO

2 years ago

the first, that uses the second

1227330479322038300


2 years ago

these are separate projects


fcms14
PRO

2 years ago

they are different reppositories


fcms14
PRO

2 years ago

is there any how deploy toggether?


fcms14
PRO

2 years ago

ok, i got it


fcms14
PRO

2 years ago

i just saw the "new" button


2 years ago

you can't communicate to services in different projects


fcms14
PRO

2 years ago

1227331037856796700


2 years ago

wouldn't be very private if you could


fcms14
PRO

2 years ago

yeah, i undertand it
i thought as i set the project name as the same, it would work as one


2 years ago

gotcha


fcms14
PRO

2 years ago

i use railway for almost 2 years the wrong way 🥲
I'd never seen that "new" button


fcms14
PRO

2 years ago

i have a lot to do now.. re-managing the services of my projects


2 years ago

yeah you aren't the first


2 years ago

and until railway stops allowing users to deploy services from the dashboard, you will not be the last


fcms14
PRO

2 years ago

now it makes more sense why it has to be in the same project AND enviroment


2 years ago

indeed


fcms14
PRO

2 years ago

thank you
its already working


2 years ago

awesome


espectrosoft
HOBBY

a year ago

Hello @Brody , I have a question

I want my front to connect to my backend using Private Network, but I haven't been able to do it… I checked this post but nothing helps… any ideas?

I have this as follows:

1289309371792101600


espectrosoft
HOBBY

a year ago

And my code is this:

export const getStrapiURL = () => {

    if (process.env.NODE_ENV === 'production') {
        return 'https://espectrosoft-backend.railway.internal'
    }

    if (process.env.NODE_ENV === 'development') {
        return 'http://localhost:1337';
    }
}

a year ago

a client side rendered frontend app can not use the internal domain of the backend, you need to use the public domain.

it wouldnt be a very private network if anyone's browser could make requests to it.


espectrosoft
HOBBY

a year ago

I'm not exactly using client side, I'm doing it with Nextjs and I make these requests using server side


a year ago

please read this then -


espectrosoft
HOBBY

a year ago

I tried to do that but in my variables I can't find the port


a year ago

you need to set it then


espectrosoft
HOBBY

a year ago

1289311163829719000


espectrosoft
HOBBY

a year ago

And it can be any port or is there any guide regarding that?


a year ago

8080 is a good port


a year ago

make sure your app is listening on the $PORT environment variable too


espectrosoft
HOBBY

a year ago

Got it, I'll try it


Private networking with Railway generated ports - Railway Help Station