3

We would like to add a maintenance page to our front-end which should appear when the back-end is currently unavailable (e.g. stopped or deploying). When the application is not running, the following message is displayed together with a 404 status code:

404 Not Found: Requested route ('name.scapp.io') does not exist.

Additionally, there is header present, when the application is stopped (and only then):

X-Cf-Routererror: unknown_route

Is this header reliably added if the application is not running? If this is the case, I can use this flag to display a maintenance page.


By the way: Wouldn't it make more sense to provide a 5xx status code if the application is not started/crashed, i.e. differ between stopped applications and wrong request routes? Catching a 503 error would be much easier, as it does not interfere with our business logic (404 is used inside the application).

ssc-hrep3
  • 15,024
  • 7
  • 48
  • 87

2 Answers2

5

Another option is to use a wildcard route.

https://docs.cloudfoundry.org/devguide/deploy-apps/routes-domains.html#create-an-http-route-with-wildcard-hostname

An application mapped to a wildcard route acts as a fallback app for route requests if the requested route does not exist.

Thus you can map a wildcard route to a static app that displays a maintenance page. Then if your app mapped to a specific route is down or unavailable the maintenance page will get displayed instead of the 404.

In regards to your question...

By the way: Wouldn't it make more sense to provide a 5xx status code if the application is not started/crashed, i.e. differ between stopped applications and wrong request routes? Catching a 503 error would be much easier, as it does not interfere with our business logic (404 is used inside the application).

The GoRouter maintains a list of routes for mapping incoming requests to applications. If your application is down then there is no route in the routing table, that's why you end up with a 404. If you think about it from the perspective of the GoRouter, it makes sense. There's no route, so it returns a 404 Not Found. For a 503 to make sense, the GoRouter would have to know about the app and know it's down or not responding.

I suppose you might be able to achieve that behavior if you used a wildcard route above, but instead of displaying a maintenance page just have it return an HTTP 503.

Hope that helps!

Daniel Mikusa
  • 13,716
  • 1
  • 22
  • 28
  • 1
    This really sounds like a great solution. Please note though that this will only work if you provide your own domain. You might not be able to create a wildcard route for shard domains. – Lafunamor Oct 30 '17 at 12:00
1

The 404 Error you see is generated by CloudFoundrys routing tier and is maintained upstream.

Generally if you don't want to get such error messages you can use blue-green deployments. Here is a detailed description of it in the CF docs: https://docs.cloudfoundry.org/devguide/deploy-apps/blue-green.html

An other option is to add a routing service that implements this functionality for you. Have a look at the CF docs for this: https://docs.cloudfoundry.org/services/route-services.html

Lafunamor
  • 753
  • 3
  • 8