Start

Core concepts

A handful of ideas explain everything else in Apprail: where things live, what a deployment actually does, and what your code can count on when it starts.

The model

Workspace
Your team’s account. It holds members, API tokens, alert channels, registry credentials, usage, and limits. A token belongs to exactly one workspace.
Project
One application — all the services and data it needs. Addressed by its slug (shop) or ID.
Environment
A separate copy of the project: production and staging by default, more if you add them, and a pr-<number> environment for each pull-request preview. Each has its own variables, data, hostnames, and private network.
Service
One long-running program, built from one image. A web service listens on a port and gets a public address; a worker has no port and just keeps running. A service is defined once per project and deployed into each environment separately.
Release
An immutable snapshot of what runs: the image pinned to its exact digest plus the service’s settings (port, health path, CPU, memory, instances, scaling, pre-deploy command). Rollback and promotion reuse releases; nothing is rebuilt.
Deployment
The act of making a release live in one environment, with a recorded history of every step.
Data resources
Postgres databases, Valkey caches, RabbitMQ queues, and S3-compatible buckets. They belong to an environment, and every service in it receives their connection variables.

Services are addressed as PROJECT/SERVICE everywhere — shop/web, shop/worker — and commands act on production unless you pass --env.

What a deployment does

Every deployment — from an image, a Git build, a promotion, a rollback, or a settings change — goes through the same steps, visible in the console and in apprail status:

StateWhat happens
awaiting_approvalOnly in a protected environment, until an owner or admin approves it. Nothing changes meanwhile.
queuedWaiting for a worker to pick it up — usually a moment.
preparingThe image tag is resolved to its digest (with your registry credential if it is private) and recorded as a release.
releasingThe pre-deploy command runs once, if the service has one.
canaryIf canary releases are on, one instance of the new release takes a share of public traffic for a set time. With blue/green, a full copy of the release starts beside the live one, takes all public traffic at once, and the previous release stands by.
deploying, health_checkingNew instances start and must pass their health check; old instances keep serving until they do.
readyThe release is live. The previous release is kept for rollback.
failedSomething went wrong, with the reason attached. The release that was live keeps serving — a failed deployment never takes an app down.
superseded, cancelledA newer deployment of the same service and environment replaced it before it finished, or someone stopped or rejected it.

What your code can count on

Addresses and networking

Each web service gets a generated HTTPS address per environment on apprail.io, shown by apprail status. Add your own domain with Domains.

Inside an environment, services reach each other privately: every service receives APPRAIL_SERVICE_<NAME>_URL (and _HOST, _PORT) for each sibling web service, such as APPRAIL_SERVICE_API_URL=http://api. That traffic never leaves the environment’s network. Environments are isolated from each other and from other workspaces; data resources have no public address at all.

Where it runs

Apprail’s compute region is Šiauliai, Lithuania (lt-sil-1). Your services, workers, jobs, and data all run there. Cloudflare’s global edge sits in front of every public address, terminating TLS close to your visitors. See Network.

The console, CLI, API, and coding agents are four doors into the same system. Anything you do in one is visible in the others, and every change lands in the workspace’s activity history.