Build & ship

Builds

Apprail turns your repository into an immutable image — from your Dockerfile, or from your framework when there isn’t one — and deploys it through the normal health-checked path. Or bring an image you built yourself.

Deploy on every push with GitHub

On a service’s page, choose Connect GitHub, install the Apprail GitHub app on the repositories you pick, then choose the repository, branch, build context, and Dockerfile path. Apprail builds and deploys right away and then on every push to that branch. Private repositories work; the app only asks to read contents and write commit statuses.

Terminal
apprail build shop/web --rebuild

Build any public repository

Without the GitHub app, build a public HTTPS repository on GitHub, GitLab, or Bitbucket by URL. Give the exact branch, tag, or commit; Apprail doesn’t guess.

Terminal
apprail build shop/web --git https://github.com/acme/shop --ref main --context services/web

With a Dockerfile

If the build context contains a Dockerfile (or the path you configured), Apprail builds exactly that with BuildKit. Nothing is changed or added. This is the most predictable option for anything unusual.

Without a Dockerfile

When there’s no Dockerfile, Apprail looks for a known framework in the build context and generates one:

FoundBuilt asStarted with
package.jsonNode.js 22. Installs with npm, pnpm, or yarn depending on the lockfile, then runs the build script if there is onescripts.start, or a Procfile
go.modA Go binary in a minimal imageThe binary, or a Procfile command
requirements.txtPython 3.13 with pipA Procfile; Django projects fall back to manage.py runserver

Static sites

Vite, Astro, Create React App, and Next.js with output: "export" — when they have no production start command — are built and served as static files from a small, unprivileged web server.

# _redirects
/blog/*   /articles/:splat   301
/old      https://example.com/new   308

# _headers
/*
  X-Frame-Options: DENY
  Referrer-Policy: strict-origin-when-cross-origin

Monorepos

Link several services to the same repository and branch, each with its own build context (services/api, services/web). A push rebuilds only the services whose context contains a changed file. If a service also depends on shared code elsewhere, add up to 20 watch paths (such as packages/shared) to its GitHub settings. A service whose context is the repository root rebuilds on every push, and so does every service when GitHub doesn’t say which files changed.

Deploy an image

Skip the build and deploy any image by tag or digest. Tags are resolved to a digest when you deploy, so a release always runs exactly the image it was created with.

Terminal
apprail deploy shop/web --image ghcr.io/acme/web:1.4

Private registries

Add a credential once per registry host; deployments from that host use it automatically. Passwords are stored encrypted and never shown again. Rotating updates it in place, so older releases can still be pulled for rollback, and a credential that retained releases depend on can’t be deleted.

Terminal
echo "$GHCR_TOKEN" | apprail registries add ghcr --registry ghcr.io --username acme --password-stdin
apprail registries

Build limits

LimitValue
Time30 minutes per build
Resources2 CPUs and 4 GB of memory, 20 GB of scratch disk
NetworkPublic HTTPS only — fetching packages works; reaching private networks doesn’t
LogsThe build output is kept with the build and shown in the console

A failed or cancelled build never changes what’s live. Build minutes are counted in usage.