Services
A project holds services: web services, workers, Postgres databases and static sites. Every service that runs code gets its own size and its own microVM.
Projects
A project is a named group of services, for example shop holding a web service, a worker and a database. Project names are 1–40 characters and unique among your projects. A project can be deleted once it holds no services.
All your projects share one private network, so a service in one project reaches a service in another (Private network).
Service types
| Type | For | Source | Public address |
|---|---|---|---|
web | HTTP apps and APIs | a public image or a GitHub repository | <label>.projectwabi.app and your own domains |
worker | queue consumers, bots and other background processes | a public image or a GitHub repository | none |
postgres | a Postgres database | managed by wabi | an optional public endpoint, off by default |
static | a folder of files | an upload from the dashboard | <label>.projectwabi.app and your own domains |
Web services, workers and databases need a plan, and each runs in its own microVM. Static sites run no code of yours: wabi serves their files directly, and three of them are free without a plan (Static sites).
Names
A service name is a lowercase DNS label of 1–32 characters: letters a–z, digits and hyphens, starting and ending with a letter or a digit. It is unique within its project. Other services use it to reference this service's variables, as in ${{db.DATABASE_URL}}.
Web services and static sites also have an address label, which defaults to the service name (Domains).
Sizes
Each web service, worker and database has a CPU size in vCPU and a memory size in MB or GB, for example 0.5 vCPU and 512 MB. A database also has a disk size, and a web service or worker can have a volume (Volumes).
The sum over all your services counts against your plan plus your staking bonus: CPU, memory, disk, the number of services, and custom domains. Paid static sites count as services; free sites have their own limits. A create or a resize that would go over the total is refused, and the dashboard shows what is left.
- Memory is reserved: the full memory size is held for the service.
- CPU is shared: a service uses up to its CPU size, and a quarter of that is reserved for it.
For an account's first 7 days, the total is capped at the first-week allowance (Limits). A service with keyless on adds its signer's 0.5 vCPU and 128 MB to its allocation (Keyless backends).
Port and PORT
Web services and workers have a port, 8080 unless you set another. Databases use 5432.
wabi sets the PORT environment variable to the service's port, sends a web service's public traffic to it, and serves the private address on it. Because wabi sets PORT, it is never one of your variables (Sealed variables).
An app that listens on PORT works with any port setting. An image with a fixed port, such as nginx on 80, needs the port set to match. On a keyless service, port 7461 belongs to the signer.
Health checks
A new deployment takes traffic only after it passes its health check:
| Service | Check |
|---|---|
| web or worker with a health path | an HTTP request to that path on the service's port, answered with a success status |
| web without a health path | a TCP connection to the port |
| worker without a health path | none: ready once it runs |
| postgres | a TCP connection to port 5432 |
The check runs every 5 seconds. Three failures in a row mark the instance not ready, and a new web or worker instance must stay ready for 10 seconds before the rollout completes. Set a health path, such as /healthz, in the service's settings.
An instance that keeps crashing before it goes live fails the deployment, with the reason in the deployment's message.
Volumes
A web service or worker can have a volume: a disk size in GB and a mount path, set together, for example 5 GB at /data. Files under the mount path persist across restarts and deployments. A volume's size only grows, and it counts against your plan's disk.
A service with a volume restarts rather than rolling: the running instance stops before the new one starts, so two instances never share one data directory.
A database has its volume from the start (Postgres).
Private network
Each service has a private address, privateHost, shown in the dashboard. Services in your projects reach each other at <privateHost>:<port>, and nothing outside your account reaches these addresses. Workers are reached only this way.
wabi adds no address variables of its own. To give one service another's address, set it as a variable value:
API_URL=http://s-ab12cd34ef:8080A database already carries its private address in its own variables, so other services reference it as ${{db.DATABASE_URL}}. Isolation between customers is covered in Isolation.
Deployments
A deployment is one version of a service: its image pinned by digest, port, size, start and pre-deploy commands, health path, and the variables version it runs with. That snapshot never changes. Anything new is a new deployment.
What starts a deployment
| Trigger | When |
|---|---|
manual | you deploy or redeploy |
push | a push reaches a GitHub service's branch |
config | while something is live, you change the image, port, CPU, memory, a command or the health path, or sign new variables |
rollback | you roll back to an earlier deployment |
upload | you upload files to a static site |
Deployment states
| State | Meaning |
|---|---|
queued | waiting for a build slot, or for a static site's files |
building | the repository is building |
scanning | a static upload is being scanned |
held | a static upload matched the scan and waits for review |
deploying | the pre-deploy command, the rollout or a static switch is running |
live | serving |
failed | stopped before going live; the message says why |
cancelled | the build was cancelled |
removed | was live, replaced by a newer deployment |
| Source | Path |
|---|---|
| image | queued → deploying → live, or failed |
| GitHub | queued → building → deploying → live, or failed; queued or building can become cancelled |
| upload | queued (waiting for the files) → scanning → deploying → live; a scan match goes scanning → held, then on to deploying once approved, or failed if taken down |
| any | a live deployment becomes removed when a newer one goes live |
Rolling updates
A web service or worker without a volume runs as one instance in its own microVM. A new deployment starts a second instance next to it. Once the new one passes its health check, it takes traffic and the old one stops.
A service with a volume, and a database, restarts instead.
A failed deployment never touches what is live: the previous one keeps serving.
Rollback
You can roll back to any earlier deployment that has an image. wabi starts a new deployment from that snapshot with no build, running the same digest even when a tag has moved since.
A rollback keeps your current variables. To bring back older values, open them from the variables history and sign them again as a new version (Sealed variables).
Service status
| Status | Meaning |
|---|---|
idle | nothing deployed yet |
building | a build is running, including a new build for a live service |
deploying | a deployment is in progress |
held | a static upload waits for review |
live | serving |
crashed | the live deployment is restarting, for example after running out of memory |
failed | the latest deployment failed and nothing is live |
stopped | the service runs no instance, for one of the reasons below |
Stopped services
| Reason | What it means |
|---|---|
| No plan | Your plan ended and its 3-day grace period passed. Data is kept for 14 days, and paying for a plan starts the service again (Plans and payment). |
| Over limit | A staking bonus ended and your usage stayed above your limits for 7 days. wabi stopped the newest services until the rest fit (Staking). |
| Taken down | This service was taken down under the Acceptable Use Policy. |
| Account suspended | Your account is suspended: every service stops and static sites go offline. |
Free static sites keep serving when a plan ends.
Deleting a service
Deleting a service deletes it with its volume, its backups and its uploaded files.