> ## Documentation Index
> Fetch the complete documentation index at: https://docs.sevalla.com/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> These are the docs for Sevalla, a platform for deploying applications, databases, static sites, object storage and load balancers. The dashboard is at https://app.sevalla.com.
> Bold text in steps is an exact dashboard label.
> To act on a Sevalla account, prefer the Sevalla MCP server (https://mcp.sevalla.com/mcp, see https://docs.sevalla.com/ai-agents/overview.md), then the Sevalla CLI (https://docs.sevalla.com/developer-tools/cli.md), then the REST API (https://api-docs.sevalla.com, OpenAPI spec at https://api.sevalla.com/v3/openapi.json).
> Every page index is at https://docs.sevalla.com/llms.txt.

# Add Flask health checks

> Add readiness and liveness endpoints to Flask, one that checks the database and one that doesn't, and set them as the web process's health checks on Sevalla.

Health checks are HTTP requests that Sevalla sends to each instance of the web process. The readiness probe decides when an instance gets traffic: during a deployment, new instances receive requests only once it passes. The liveness probe restarts an instance that stops responding. A Flask application needs two endpoints for them, one that checks the database and one that only checks that the application answers.

## Before you begin

* A Flask project deployed on Sevalla, as in [Deploy Flask](/guides/python/flask/deploy).

## Add the endpoints

Add both routes in the application factory:

```python storefront/__init__.py theme={null}
import sqlalchemy as sa


def create_app() -> Flask:
    # ...the configuration and init_app calls...

    @app.get("/healthz")
    def healthz():
        try:
            db.session.execute(sa.text("SELECT 1"))
        except sa.exc.SQLAlchemyError:
            return {"status": "database unavailable"}, 503
        return {"status": "ok"}

    @app.get("/livez")
    def livez():
        return {"status": "ok"}

    return app
```

* `/healthz` returns `200` when the database answers a query and `503` when it doesn't. Use it for readiness: an instance that can't reach the database gets no traffic.
* `/livez` returns `200` whenever the application runs. Use it for liveness, so that a database outage doesn't restart every instance.

Add more checks to `/healthz` for each service the application can't work without, such as `cache.get("health")` for a Redis cache. Commit and push the changes, and wait for the deployment to finish before you turn on the probes.

## Turn on the health checks

<Steps>
  <Step title="Open the web process">
    On the application's **Processes** tab, click **⋯** on the **Web** process, then click **Update process**.
  </Step>

  <Step title="Turn on the readiness probe">
    Under **Health checks**, turn on **Readiness probe** and set the **Path** to `/healthz`. Keep the **Port** at the web process's port, `8080` unless you changed it.
  </Step>

  <Step title="Turn on the liveness probe">
    Turn on **Liveness probe**, set the **Path** to `/livez`, and set the **Initial delay** to `10` seconds, so a slow start doesn't count as a failure.
  </Step>

  <Step title="Save and deploy">
    Click **Update process**, then click **Deploy** in the undeployed changes bar at the bottom of the page.
  </Step>
</Steps>

<Frame>
  <img className="block dark:hidden" src="https://assets.sevalla.com/screenshots/light/app-processes-web-update.png" alt="The sheet for updating the web process, with its start command, resource, scaling and the Health checks section with the readiness probe on" width="768" />

  <img className="hidden dark:block" src="https://assets.sevalla.com/screenshots/dark/app-processes-web-update.png" alt="The sheet for updating the web process, with its start command, resource, scaling and the Health checks section with the readiness probe on" width="768" />
</Frame>

A probe passes when the path answers with a status from `200` to `399` within the timeout (1 second by default). Only the web process has health checks. See [Health checks](/applications/processes#health-checks) for every probe setting and its default.

## Verify

1. Request the endpoint through your domain: `curl -i https://storefront-x7k2m.sevalla.app/healthz` returns `200 OK` with `{"status":"ok"}`.
2. On the **Deployments** tab, the deployment that turned on the probes reaches **Deployed**.

If the deployment doesn't finish, click **App health** on the **Overview** tab to see each instance's status. An instance that fails the readiness probe shows **Unready**: request the path yourself and check that it returns `200`, and that the **Port** matches the port Gunicorn listens on.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.