Toupas

Docs

How apps with their own server run on Toupas

AspectContract
ListeningListen on 0.0.0.0:$PORT. PORT is always 8080
FilesThe app's folder is /app, read-only. Only /tmp is writable (64 MB, emptied on every restart and update)
DataKeep data in the Toupas database (DATABASE_URL, Postgres 17 with pgvector) or Toupas file storage (S3 settings). Never in files next to the code
Start/bin/sh -c "exec <start>" as a non-root user, after preparing the app in Toupas's builder image (Linux x86-64), so native dependencies match
Health checkGET healthCheck.path (default /): any answer below 500 within 60 s (up to 300) means it started. Then every 30 s; 3 failures in a row restart it
RestartsOn a crash or failed health check, with growing waits. A new version only replaces the live one once it passes its health check
MemorymemoryMb (default 128). Going over stops the app (reported in logs and status)
CPUUp to half a CPU, shared
NetworkOutgoing internet is allowed. Other Toupas apps and private addresses aren't reachable
StoppingSIGTERM, then SIGKILL after 10 s

Settings the app gets

On the user's computer

toupas dev db and toupas dev storage (in a shell) start a local database and file storage that match the live ones, and write their settings to .env.

Static sites

No server: the prepared folder (e.g. dist) is served as it is. Hashed asset files are cached for a long time; HTML is always checked for a newer version.