An example app on earl.ee
FastAPI, extended, running on earl.ee.
This app was built from its Dockerfile and deployed with git push, the same way as every other app on the platform.
- Framework
- FastAPI
- Built as
- Python, uvicorn
- Answering at
- fastapi-extended-f8bd.earlee.app
- Listens on
- port 3000, HTTPS
What FastAPI does here
This page and a JSON endpoint come from the same Python app.
{
"framework": "FastAPI",
"host": "fastapi-extended-f8bd.earlee.app",
"time": "2026-10-31 20:07:18 UTC"
}
What end-to-end TLS does here
Between the earl.ee router and this container, the request travels over TLS as well. The router checks this container’s certificate before it passes anything on.
Measured by this app, for this request
- Scheme
- https
- Certificate from
- EU-Native Platform Root CA
- Issued for
- 6293c04c-e393-4d34-b499-0c431ca60f66
- Valid until
- 2027-10-25 08:52 UTC
Stated by the platform
- Your browser reaches Caddy over HTTPS with a public certificate.
- Caddy and the router authenticate each other with mutual TLS.
- The router accepts this container only with a certificate from the platform’s CA that is issued for this app’s ID. Without one there is no connection, and nothing falls back to HTTP.
- The platform issues a new certificate with every deploy, valid for 365 days.
What PostgreSQL does here
This app has a PostgreSQL database of its own in each environment. The database runs in a container on the app’s own network, and only this app’s container can reach it.
Measured by this app, for this request
- Server
- PostgreSQL 18.4 (Debian 18.4-1.pgdg13+1)
- Host
- db-6293c04c-e393-4d34-b499-0c431ca60f66-live
- First row written
- 2026-10-21 14:38 UTC
- Container started
- 2026-10-25 08:52 UTC
- Page views counted
- 24
- Database size
- 7.5 MB
The first row is older than this container, so the data outlived at least one container.
Stated by the platform
- Each app gets one database per environment. Preview and live share no data, and live starts empty.
- The address comes in as DATABASE_URL. The password in it is generated by the platform.
- The connection between the app and its database is not encrypted. It stays on one server.
- The database is backed up continuously. The owner can restore it to a chosen point in time.
- 50 MB per app and environment are included. Nothing stops a database that grows past them.
- Migrations run when the app starts. The platform runs none of its own.
What Valkey does here
This app has a Valkey instance of its own in each environment. Valkey keeps everything in memory. It runs in a container on the app’s own network, and only this app’s container can reach it.
Measured by this app, for this request
- Server
- Valkey 9.1.1
- Host
- valkey-6293c04c-e393-4d34-b499-0c431ca60f66-live
- Valkey started
- 2026-10-27 20:05 UTC
- Container started
- 2026-10-25 08:52 UTC
- Page views counted
- 4
- Memory used
- 1.0 MB
- Memory limit
- 64.0 MB
- When full
- allkeys-lru
The counter starts again at 1 whenever Valkey loses its contents.
Stated by the platform
- Each app gets one Valkey instance per environment. Nothing in it is switched off, and pub/sub works.
- The address comes in twice, as VALKEY_URL and as REDIS_URL. Both lead to the same instance.
- The connection between the app and Valkey is not encrypted. It stays on one server.
- Valkey keeps its contents in memory only and has no backup. A restart, an image upgrade or a new deploy of the instance loses them.
- When the memory limit is reached, Valkey removes the keys used least recently, also while it runs. Anything that must not be lost belongs in PostgreSQL.