Grateful Deploy

Grateful Deploy

Deploys without the long, strange trip

A dashboard for the apps you deploy with Kamal. Every app gets a card with its running version, health and memory, and a page with Deploy, Roll back and Logs buttons. Each button runs one fixed Kamal or SSH command inside the app's own repo. There's nothing to type.

It runs on your own machine, with your SSH keys and your repos.

Your config stays plain Kamal. Nothing to migrate and nothing to lock you in: deploy from a terminal whenever you like, and Grateful Deploy still records it.

What it does

  • Buttons, not commandsDeploy, roll back, stop, start and logs each run one allowlisted Kamal or SSH command, built from argument arrays inside the app's repo. Nothing from a request reaches a shell.
  • Live deploy logsKamal's output streams into the page as it runs and is kept with the deploy. One deploy per app at a time, cancelable, and stopped after 20 minutes.
  • Health at a glanceEvery two minutes each app's running version, container state, memory and health check (over HTTP or HTTPS, through kamal-proxy) land on its card.
  • ServersRAM, disk, swap, load and every container on each server, from read-only SSH checks.
  • One-click rollbackRoll back to any earlier version whose container is still on the server.
  • Kamal's deploy lockWhile someone else's deploy holds the lock, Deploy waits and the page shows who holds it, with a button to release a lock a dead deploy left behind.
  • Terminal deploys count tooA Kamal post-deploy hook reports deploys made from a terminal or CI, so the history and the rollback list include them.
  • Secrets scrubbedKeys, tokens, passwords and email addresses are masked in every line of output before it's saved or shown.
  • Add appFinds repos with Kamal config in your projects folder, reads it without running its ERB, and writes the new app into your fleet file to review.
  • Passwordless sign-inEach sign-in emails a six-digit code.

Screens

The apps dashboard: a card per app grouped by server, with health, version, memory and last deploy
AppsEvery app on every server: health, running version, memory and its last deploy. The bear dances while a deploy runs.
An app page with Deploy and Stop container buttons, running version, health, logs, rollback buttons and deploy history
AppDeploy with one button and see how far HEAD is ahead of what's running, then roll back, read logs or check the history.
A finished deploy with its commit, timing and Kamal's full output
DeployKamal's output as it happened, with secrets masked.
The servers page: memory, disk, swap and load bars and a table of containers for each server
ServersRAM, disk, swap, load and containers on each server.

Stack

  • Ruby 3.4
  • Rails 8
  • SQLite
  • Solid Queue, Cache, Cable
  • Hotwire
  • Importmap, no build step
  • Postgres
  • Redis
  • Node
  • Sidekiq

It runs as a systemd user service on Linux, bound to 127.0.0.1, next to the repos it deploys. On Omarchy it also adds itself to the app launcher.

Quick start

$ git clone https://github.com/joelgaff/Grateful-Deploy.git grateful-deploy
$ cd grateful-deploy
$ bin/setup --skip-server       # gems, databases, the pre-push CI hook, config/fleet.yml
$ bin/rails credentials:edit    # your own master key and credentials
$ $EDITOR config/fleet.yml       # your servers and apps
$ bin/release                   # install and start the service

Then open http://127.0.0.1:3100 and sign in with your email. The README covers the fleet file, mail for login codes, and recording deploys made from a terminal.