Upsun User Documentation

Define routes for your multiple apps

Try Upsun for 15 days
After that, enjoy the same, game-changing Upsun features for less with the First Project Incentive!ยน A monthly $19 perk!
ยนTerms and conditions apply
Activate your 15-day trial

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:

.upsun/config.yaml
applications:
  admin:
    source:
      root: admin
    type: nodejs:22
  api:
    source:
      root: api
    type: php:8.4
  gatsby:
    source:
      root: gatsby
    type: nodejs:22
  mercure:
    source:
      root: mercure/.config
    type: golang:1.23

Depending on your needs, you could configure the router container using subdomains or using subdirectories.

Define routes using subdomains Anchor to this heading

You could define routes for your apps as follows:

.upsun/config.yaml
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).

Define routes using subdirectories Anchor to this heading

Alternatively, you could define your routes as follows:

.upsun/config.yaml
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:

.upsun/config.yaml
applications:
  admin:
    source:
      root: admin
    type: nodejs:22
    ...
    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/admin is 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.

Is this page helpful?