Define routes for your multiple apps
Back to home
On this page
When you set up a project containing multiple applications,
all of your apps are served by a single router for the project.
Each of your apps must have a name that’s unique within the project.
To define specific routes for one of your apps, use this name.
There are various ways you can define routes for multiple app projects.
In this project, you have a CMS app, two frontend apps (one using Symfony and another using Gatsby), and a Mercure Rocks server app, defined as follows:
applications:
admin:
source:
root: admin
type: nodejs:24
api:
source:
root: api
type: php:8.4
gatsby:
source:
root: gatsby
type: nodejs:24
mercure:
source:
root: mercure/.config
type: golang:1.25Note
You don’t need to define a route for each app in the repository. If an app isn’t specified, then it isn’t accessible to the web. One good example of defining an app with no route is when you use Git submodules and want to use a source operation to update your submodules.
You can also achieve the same thing by defining the app as a worker.
Depending on your needs, you could configure the router container using subdomains or using subdirectories.
Define routes using subdomains
You could define routes for your apps as follows:
routes:
"https://mercure.{default}/":
type: upstream
upstream: "mercure:http"
"https://{default}/":
type: upstream
upstream: "api:http"So if your default domain is example.com, that means:
https://mercure.example.com/is served by your Mercure Rocks app (mercure).https://example.com/is served by your Symfony frontend app (api).
Note
Using a subdomain might double your network traffic,
so consider using a path like https://{default}/api instead.
Define routes using subdirectories
Alternatively, you could define your routes as follows:
routes:
"https://{default}/":
type: upstream
upstream: "api:http"
"https://{default}/admin":
type: upstream
upstream: "admin:http"Then you would need to configure each app’s web.locations property to match these paths:
applications:
admin:
source:
root: admin
type: nodejs:24
...
web:
locations:
'/admin':
passthru: '/admin/index.html'
root: 'build'
index:
- 'index.html'
api:
source:
root: api
type: php:8.4
...
web:
locations:
"/":
passthru: "/index.php"
root: "public"
index:
- index.php
routes:
"https://{default}/":
type: upstream
upstream: "api:http"
"https://{default}/admin":
type: upstream
upstream: "admin:http"So if your default domain is example.com, that means:
https://example.com/is served by your Symfony frontend app (api).https://example.com/adminis served by your Admin app (admin).
Note that in this example, for the configuration of your admin app,
you need to add the URL suffix /admin as both an index in the web.locations and a value for the passhtru setting.
For a complete example, go to this project on GitHub.