Upsun User Documentation

Define routes for your multiple apps

Sign up

Get your free trial by clicking the link below.

Get your Upsun free 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:20
    api:
        source:
            root: api
        type: php:8.3
    gatsby:
        source:
            root: gatsby
        type: nodejs:20
    mercure:
        source:
            root: mercure/.config
        type: golang:1.22

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:20
        ...
        web:
            locations:
              '/admin':
                  passthru: '/admin/index.html'
                  root: 'build'
                  index:
                    - 'index.html'
    api:
        source:
            root: api
        type: php:8.3
        ...
        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?