Start · Basecamp
Type the hostname you want Basecamp on. You get the command to run, and a preview of everything it does: buys the box, installs Basecamp, writes the DNS record, waits for the certificate and makes your first admin.
$ fli basecamp:create --domain basecamp.example.comNo password box here. The run asks for it at your own terminal, or generates one when you press Enter.
not yet Where this is going
$ npm i -g @frontierjs/cli
That one install, then the command above, with no checkout. Today basecamp:create runs Basecamp from the framework's own source, so it needs a checkout beside fli. Basecamp is to ship as an image the box pulls by digest (FJS-D1526); until it does, this is the path:
packages/basecamp.~/.ssh/id_ed25519.pub (or id_rsa.pub, or --key).git clone https://github.com/frontierjs/frontierjs && cd frontierjs bun install (cd packages/cli && bun link) # fli on PATH, pointed at this tree fli eset DIGITALOCEAN_TOKEN <token> --global fli eset CLOUDFLARE_TOKEN <token> --global
Either token missing on a first run at a terminal: the run opens the page that makes it and takes the paste.
The run, start to finish, with your values in it. Questions answered with Enter take the default shown.
The hostname is checked against your Cloudflare token first. A token that opens no zone holding it refuses here — nothing asked, nothing bought. The zone is the longest one the token opens that the hostname ends with.
Server name, the ssh Host, the Outpost, the password — all asked before the box is bought, so the minute it takes is one you can walk away from. The summary is the last stop before money is spent.
A 4gb box at DigitalOcean carrying your SSH public key and nothing else, on a reserved IP that a replacement box keeps. Its Host block goes into ~/.ssh/config unless one of that name is already there.
Once ssh answers, fli deploy:setup puts docker and caddy on the box and fli deploy builds Basecamp, ships it and starts it. Each is a full fli run of its own — what it asks, it asks you.
One A record, DNS-only, carrying Basecamp's fleet mark, so the Basecamp on the box manages it later. A record somebody made by hand at that name is refused, never overwritten.
It waits for Caddy's certificate, then offers Cloudflare's proxy with Full (strict) for this host alone. The zone's own SSL mode is never changed — it covers every other host in the zone.
The first admin and its workspace are made on the box; a generated password is printed once. Then fli deploy:outpost enrolls the box in its own fleet, so apps can run beside Basecamp.
Sign in at your hostname with the admin it made, and change the password. A later deploy runs from packages/basecamp, with the line the run printed. Want the box without Basecamp yet? Answer no to the install — it prints the fli basecamp:install line that finishes the job later.