Deploying an app
How LaunchPad builds and ships your app with Kamal, and what each deploy does.
LaunchPad deploys with Kamal. You don't write a deploy.yml — LaunchPad generates it from your app's settings and runs the deploy for you, streaming the log live.
What you provide
- A GitHub repo + branch with a Dockerfile (Rails 7+ generates one).
- A container registry username (GHCR uses your GitHub username — it's prefilled).
- A
KAMAL_REGISTRY_PASSWORDenvironment variable — the registry credential Kamal pushes your built image with. Use a Docker Hub access token, or a GitHub personal access token with thewrite:packagesscope for GHCR. Without it the deploy fails at the image-push step, so preflight blocks the deploy until it's set. - Environment variables and, optionally, a managed database.
What each deploy does
- Pre-deploy backup — if the app has a database with pre-deploy backups enabled, LaunchPad snapshots it first so the deploy can be rolled back.
- Build & push — builds the image and pushes it to your registry.
- Migrate — runs
db:migratebefore the new version takes traffic. - Cutover gated on readiness — the Kamal proxy only promotes the new release once
/readyzreports the database, migrations, and job queue are all healthy. A release that boots but can't reach its database is never promoted. - Auto-rollback — if the post-cutover health check fails, LaunchPad rolls back to the previous image automatically. See Rolling back a deploy.
Watching a deploy
The deploy log streams live to the app's Releases tab. If a deploy fails, the reason is captured on the deployment record and surfaced as an attention item.