## The four, in order

**A server.** Any Linux host with SSH access and 2GB of memory. Kamal installs Docker itself if it
is missing, so a bare Ubuntu image is enough.

**A registry.** Docker Hub or GitHub Container Registry both work. This is where the built image
goes so the server can pull it.

**A domain.** One A record at the server's IP. Kamal's proxy requests a certificate on the first
request, so HTTPS needs no separate step.

**`RAILS_MASTER_KEY`.** Rails cannot decrypt credentials without it and raises during boot, so the
deploy fails on the health check rather than serving a broken page.

```bash
bin/kamal setup
curl -sI https://yourdomain.com/up | head -1
```

## What you do not need yet

This is the part that surprises people. Every external integration in the kit sits behind an adapter
with a deterministic local fake, wired the way `app/adapters/billing.rb` shows: a real client when
the credential is present, a fake when it is not. So a first deploy needs no Stripe account, no
Resend account and no OAuth application. Checkout runs end to end against the fake, email opens
locally instead of sending, and nothing raises.

Add each key when you actually want that integration live. `docs/BRING_YOUR_OWN_KEYS.md` lists all
of them and marks which are optional, which is all of them except the master key.

## Two settings worth doing on day one anyway

`APP_HOST`, so mailer links and the sitemap are absolute. And a statement descriptor in Stripe,
before you charge anyone, because it is what appears on a customer's card statement and changing it
later does not change past charges.

## How long it takes

The first `kamal setup` runs five to ten minutes, mostly installing Docker and building the image
for the first time. Deploys after that are one to three minutes, dominated by the image build.
Nothing in that path needs you to watch it.
