Heroku + node.js: I have a server which uses multiple ports. How can I get Heroku to allocate them?

Amit Evron picture Amit Evron · Jun 5, 2016 · Viewed 12.1k times · Source

Umm I'll try to be more clear..

In an application server I have written in node.js, I have inner-proxy for multiple ports:

  • in my 8080 port I have my rest api.
  • in my 3000 port I have my push server and chat.

I use the npm package subdomain-router for inner-routing to the port, exposing sub-domains in the 'front-end' which proxy back to those ports.
code demonstration: (<some-app> is not the real name of the app obviously)

require('subdomain-router')
({
  host: '<some-app>.herokuapp.com',
  subdomains:
  {
    '': 8080,   // <some-app>.herokuapp.com <=> ::8080   --WORKS--
    'api': 8080,  // api.<some-app>.herokuapp.com <=> ::8080
    'chat': 3000, // chat.<some-app>.herokuapp.com <=> ::3000
    'push': 3000  // push.<some-app>.herokuapp.com <=> ::3000
  }
}).listen(process.env.PORT || 5000);

The API works great, though I cannot access it through <some-app>.herokuapp.com:8080, but only through <some-app>.herokuapp.com and let the inner subdomain-router module do it's magic.
Also, I can't access the subdomains. When trying to access api.<some-app>.herokuapp.com I get No such app error page from heroku.

TL;DR accessing <some-app>.herokuapp.com works (redirects to /v1 path for my API), but unable to access <some-app>.herokuapp.com:8080, <some-app>.herokuapp.com:3000 or chat.<some-app>.herokuapp.com.

When trying to access my API by specifying the port in the url (like this: <some-app>.herokuapp.com:8080), I get the following error in my browser (google chrome): ERR_CONNECTION_REFUSED.

My educated guess says that it might be something related to opening ports in heroku, but I have no clue on how to do it (tried googling ofc).
It doesn't explain why I cannot access the sub-domains though.

Would appreciate any light shed on this issue.
I'm new to heroku and it's getting really frustrating.

Thanks!
Amit

Answer

Amit Evron picture Amit Evron · Jun 5, 2016

Okay, after doing some research I've found out that opening ports in Heroku is disabled and not allowed.

The only way around this is to use sub-domains and then in-app to use a proxy module (like subdomain-router which I use).

BUT - Heroku don't let you create sub-domains on their domain, meaning that your-app.herokuapp.com is fixed and cannot have sub-domains.
In Heroku manuals, they demand you to have your own domain and dns provider to do such thing, by creating an A-alias (CNAME) in the dns table in your domain settings, that will refer to your app herokuapp domain, and then using the command heroku domains:add to add your domain to the allowed origin list.

You can read more here. It provides all the info you need.

Hope it helped some.