---
title: Install the platform
sidebar:
  order: 1
description: "Run the installer on a Linux server to get the control plane, edge, dashboard and automatic TLS."
---

The platform runs on one Linux server you control. The installer sets up Caddy with automatic TLS, a bubblewrap sandbox, a firewall, one admin identity, and the control, edge and dashboard services.

## Requirements

- An x86-64 Linux server running Debian, Ubuntu or a RHEL-family distribution, with systemd and the cgroups v2 unified hierarchy.
- A domain you control for deployments, for example `fn.example.com`. Every project and platform hostname lives under it.
- Inbound ports 22, 80 and 443. If port 80 is blocked, pass a Cloudflare API token as `SB_CF_TOKEN` so Caddy can use the DNS-01 challenge instead.

## Run the installer

SSH into the server and run:

```sh
curl -fsSL https://sproutboat.com/install.sh | sudo bash
```

It asks for the deployment domain, an email for Let's Encrypt, and an admin username, then runs unattended. It installs the newest released version.

Partway through, it pauses and asks for one DNS record: a wildcard `A` record for `*.<your-domain>` pointing at the server, DNS-only (not proxied). It waits up to five minutes for the record to resolve, then continues.

### Non-interactive install

| Variable | Purpose |
| --- | --- |
| `SB_DOMAIN` | Deployment domain. |
| `SB_ACME_EMAIL` | Let's Encrypt email. Also the admin's sign-in email. |
| `SB_ADMIN` | Admin username. |
| `SB_CF_TOKEN` | Optional. Cloudflare API token for the DNS-01 challenge. |
| `SB_GITHUB_CLIENT_ID`, `SB_GITHUB_CLIENT_SECRET` | Optional. Enable GitHub sign-in on the dashboard. |
| `SB_SKIP_DNS_CHECK=1` | Skip the wait for DNS. |
| `SB_REF` | Pin a release tag such as `v0.5.3`, or `main` to track the development branch. |

## After the install

The installer prints three things:

| | Where |
| --- | --- |
| Control API | `https://control.<your-domain>` |
| Dashboard | `https://dashboard.<your-domain>`. Sign in with the Let's Encrypt email and the admin token as the password. |
| Admin token | Printed once and saved in `/root/sproutboat-admin.env`. |

Point the CLI at the control API with the admin token, then deploy:

```sh
npx sproutboat login --api-url https://control.<your-domain> --token <admin-token>
```

Create accounts for other people from the dashboard; see [Get access](/get-started/access).

## Operate it

Run these on the server with `sudo`:

| Command | Does |
| --- | --- |
| `sbctl status` | Health of every service. |
| `sbctl logs [control \| edge \| caddy]` | Follow logs. |
| `sbctl down`, `sbctl up` | Pause and resume everything. |
| `sbctl update` | Stage the newest release and run its installer. |
| `sbctl uninstall [--keep-state]` | Remove everything. `--keep-state` keeps the database, artifacts and backups. |

The platform backs itself up daily to `/var/lib/sproutboat/backups` and keeps the last seven. Manage backups in the dashboard under `Admin` → `Backups`, and copy them off the server.
