elmercante
How can you run multiple applications on one BEAM instance with MainProxy?
Hi @axelson, thanks for putting together main_proxy. I want to use it to do the same thing you’ve used it for: running multiple applications from one BEAM instance. I have an umbrella application with three phoenix endpoints (3 separate child apps): one for an e-commerce shop, another for the store’s admin area, and a third for its cms admin area. I want to route the requests for the admin areas to the single exposed web port for the e-commerce shop since the other two will never see much traffic. However, I’m having difficulty getting it to work with my release.
I have the functionality working correctly in both my local dev and prod environments, but once I use mix release to produce a release nothing is served when I start it. I’m seeing logs such as Configuration :server was not enabled for MyAppWeb.Endpoint, http/https services won't start for each web app that I’m trying to spin up locally in my release. Upon deployment (we build & start the release on Render) I’m seeing those logs plus the following ==> No open HTTP ports detected on 0.0.0.0, continuing to scan...
Do you have any idea what the issue could be?
Marked As Solved
hubertlepicki
Two suspects:
- Are you starting
MyApp.Proxy(or whatever you called it) in your application.ex in the supervision tree? This is this step in the readme:
children = [
# ... other children
MyApp.Proxy,
]
This should be done in one of the applications you have in app/. In my case I created a separate application just to serve that.
- Are you including and starting the application mentioned in the paragraph above (may be your “ui” or “web” app too if you don’t use dedicated one for proxy) in the release configuration?
You should have something like this in the top-level mix.exs of your project
deps: deps(),
releases: releases()
...
defp releases do
[
my_app: [
applications: [
proxy: :permanent
...
]
]
end
I strongly suspect you’re not doing 1 or 2 or both and the OTP application that should have main proxy as a child either does not start at all, or does not start the child.
Also Liked
stefanluptak
If the RENDER_EXTERNAL_HOSTNAME is app-123.onrender.com for example, then it means that for MyCmsWeb and MyAppAdminWeb to work, domains my-cms.app-123.onrender.com and my-admin.app-123.onrender.com would have to exist, but that’s not the case, because you’re not able to create DNS records for onrender.com subdomains.
If you don’t want to use your own custom domain, you should probably use :path instead of :domain.
But I suggest to set up your custom domain. Then save it’s value to a CUSTOM_DOMAIN env var for example and use that one in your MyAppProxy.Proxy code instead of the RENDER_EXTERNAL_HOSTNAME.
stefanluptak
I think there could be a mismatch between your backends specification and the custom domains (with certificates) you set-up in the render.com settings for your app.
EDIT: I ran few apps with MainProxy on render.com successfully.
elmercante
Ok I gave :path a try, but the problem I’m running into now is that the cms is taking up all the spare paths. That is to say all the paths which aren’t already defined in the router file as routes for the app’s functionality are reserved for the cms. There’s probably a way to skirt around this, but I’d prefer not to complicate things further.
I think the only way forward is to use a custom domain as you suggested, but I was hoping to test things out with Render’s provided onrender.com subdomain first. I’ll continue to experiment with this and I’ll drop an update here if there’s anything useful to share. Thanks for your help @stefanluptak!
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #advent-of-code
- #elixirconf-us
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #performance








