Install and set up
Before you start
- A fresh Ubuntu 24.04+ VPS with SSH access.
- Your domains on your Cloudflare account. For each zone, turn on SSL/TLS → Edge Certificates → Always Use HTTPS (binboat has no port 80).
- A Cloudflare API token (My Profile → API Tokens → Create Custom Token) for your zones with:
| Permission | Used for |
|---|---|
| Zone → Zone → Read | finding the zone of each domain |
| Zone → DNS → Edit | proxied DNS records |
| Zone → SSL and Certificates → Edit | Origin CA certificates, the origin pull certificate |
| Zone → Zone Settings → Edit | turning on Authenticated Origin Pulls, reading and setting the SSL/TLS mode |
- Optional: a GitHub fine-grained token with Contents: Read-only on your app repos (needed for private repos), and an R2 bucket with an R2 API token (Object Read & Write on that bucket).
Install
curl -fsSL https://github.com/sumitwaani2/binboat/releases/latest/download/install.sh | sudo bash
It asks nothing, takes a few seconds and ends with the address to open (https://<server IP>) and a one-time password. You can close SSH now.
First steps in the browser
- Open the address, accept the certificate warning (expected on this first visit), and sign in with the one-time password, leaving the email empty.
- Set up your account: your email and a password (at least 12 characters).
- Settings → Cloudflare: paste the API token. binboat checks it and lists the zones it can use and any missing permission.
- Settings → Dashboard domain: e.g.
binboat.example.com. binboat creates the DNS record, the certificate and the origin pull setup and shows the progress; the first time for a zone this takes about 10 minutes. If the zone's SSL/TLS mode isn't Full (strict), press Set Full (strict) under Zones. Then openhttps://binboat.example.comand sign in; from then on the IP address no longer answers. - Settings → GitHub and Settings → Backups (endpoint
https://<account id>.r2.cloudflarestorage.com, regionauto, bucket, keys). - Your app repo follows Hosting an app: a
binboat.tomland the release workflow. Push a tag (git tag v1.0.0 && git push origin v1.0.0) and GitHub publishes a release a few minutes later. - Apps → Add app: pick the repo and a domain (e.g.
blog.example.com). The app is named after the repo. Add env vars if needed, choose a release under Deploy and watch the deploy log.
The home page always lists what is still missing.
Updating, and when you are locked out
Run the install command again. It installs the latest binboat, keeps all apps and settings, restarts them (a few seconds of downtime) and prints a new one-time password. Use that password only if you need it, e.g. after forgetting your password or when the dashboard domain stops working: for 24 hours the server's IP address accepts it.
Moving to a new server
- Shut the old server down (both would otherwise write to the same backup folders).
- Install on the new server and repeat steps 1–5 with the same tokens and bucket.
- Add app for each app. The form lists the bucket's folders and preselects the one with the app's name: binboat restores its newest backup before the first deploy. DNS records follow automatically.
Troubleshooting
| Symptom | Likely cause |
|---|---|
no Cloudflare zone found for … when saving a domain |
The domain isn't on this Cloudflare account, is misspelled, or the token doesn't cover that zone |
… lacks the … permission |
Add the missing permission to the token, then Sync now in Settings |
| Dashboard domain stays "being set up" | The page says what it waits for: Cloudflare rolling out the origin pull certificate (about 10 minutes the first time), a zone in Flexible mode (Set Full (strict)), or a token without Zone Settings permission |
| Cloudflare error 521 | The SSL/TLS mode is Flexible or Off, so Cloudflare connects to port 80: Settings → Zones → Set Full (strict). A Page Rule or Configuration Rule can also set Flexible for one hostname; remove it |
| Cloudflare error 526 | Full (strict) but the certificate isn't installed yet: Sync now in Settings |
| Cloudflare error 525 / 520 | Origin pulls were changed in Cloudflare; binboat repairs them on the next sync (Sync now) and waits a few minutes before requiring them again |
has a CNAME record |
Delete the CNAME in Cloudflare; binboat creates the A record |
| Nothing answers at all | Re-run the install command and use the address and one-time password it prints |