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

TypeForSourcePublic address
webHTTP apps and APIsa public image or a GitHub repository<label>.projectwabi.app and your own domains
workerqueue consumers, bots and other background processesa public image or a GitHub repositorynone
postgresa Postgres databasemanaged by wabian optional public endpoint, off by default
statica folder of filesan 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:

ServiceCheck
web or worker with a health pathan HTTP request to that path on the service's port, answered with a success status
web without a health patha TCP connection to the port
worker without a health pathnone: ready once it runs
postgresa 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:8080

A 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

TriggerWhen
manualyou deploy or redeploy
pusha push reaches a GitHub service's branch
configwhile something is live, you change the image, port, CPU, memory, a command or the health path, or sign new variables
rollbackyou roll back to an earlier deployment
uploadyou upload files to a static site

Deployment states

StateMeaning
queuedwaiting for a build slot, or for a static site's files
buildingthe repository is building
scanninga static upload is being scanned
helda static upload matched the scan and waits for review
deployingthe pre-deploy command, the rollout or a static switch is running
liveserving
failedstopped before going live; the message says why
cancelledthe build was cancelled
removedwas live, replaced by a newer deployment
SourcePath
imagequeued → deploying → live, or failed
GitHubqueued → building → deploying → live, or failed; queued or building can become cancelled
uploadqueued (waiting for the files) → scanning → deploying → live; a scan match goes scanning → held, then on to deploying once approved, or failed if taken down
anya 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

StatusMeaning
idlenothing deployed yet
buildinga build is running, including a new build for a live service
deployinga deployment is in progress
helda static upload waits for review
liveserving
crashedthe live deployment is restarting, for example after running out of memory
failedthe latest deployment failed and nothing is live
stoppedthe service runs no instance, for one of the reasons below

Stopped services

ReasonWhat it means
No planYour 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 limitA staking bonus ended and your usage stayed above your limits for 7 days. wabi stopped the newest services until the rest fit (Staking).
Taken downThis service was taken down under the Acceptable Use Policy.
Account suspendedYour 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.