The deploy loop
What happens between a git push and healthy traffic on your own server, step by step.
The six steps
- Push. You push to your project's branch (
mainby default). - Build. The
relay-deployGitHub Action builds your Dockerfile intolinux/amd64andlinux/arm64images and pushes them to your registry. - Hand-off. The Action tells Relay the image is ready, and Relay queues a deployment.
- Orchestrate. A worker reserves the image and wakes the agent on your server over its outbound connection.
- Verify. The agent pulls the image, stops the running container, starts the new one, and probes your health check path on the service port. There is a brief gap in serving while the container is swapped.
- Promote. Only when the new container is healthy does the agent write the Caddy routing for it and reload Caddy.
If the health check fails, the agent removes the new container and restarts the last version that passed. The deployment is marked failed and the reason is shown in the dashboard.
What you configure
Each project has four settings that shape the loop:
- Branch — which branch triggers a deploy.
- Dockerfile path — where the build starts (
Dockerfileby default). - Service port — the port your container listens on.
- Health check path — the request the agent makes before promoting (
/by default). Point it at an endpoint that returns200only when your app is ready.
Deployment statuses
| Status | Meaning |
|---|---|
| Queued | The deployment is waiting for the worker to pick it up. |
| Building | The GitHub Action is building and pushing your image. |
| Deploying | The agent is pulling the image, starting it and running health checks. |
| Healthy | The new version passed its checks and is serving traffic. |
| Failed | A step failed. The last healthy version is restarted, and the reason is recorded. |
| Cancelled | The deployment was stopped before it finished. |
| Rolled back | A later deployment replaced this one by promoting an earlier image. |
Rollbacks
Every built image stays in your registry. A rollback promotes a previous image through the same health-gated path as a normal deploy, so it's a few seconds of traffic switching rather than a rebuild. You can start one from the project's deployment list.
Logs
Each deployment has a build log and a runtime log. They stream live while the deploy is in progress and stay available afterwards, so you can see exactly where a failed deploy stopped.
URLs and domains
Every project gets a working HTTPS URL on a platform domain as soon as its server reports a public IP. To use your own domain, add it in the dashboard. Relay verifies you own it before Caddy requests a certificate for it.