Docs Get started
Quickstart
By the end, an app answers at https://hello.example.com, served from your own server. Budget a quarter of an hour, most of it the server installing packages.
Before you begin
Link to the section Before you begin- A domain whose DNS is at Cloudflare. For another DNS provider, see Your server.
- A Cloudflare API token restricted to that zone, with
Zone / Zone / ReadandZone / DNS / Edit. - An SSH key loaded in your SSH agent.
- A Hetzner Cloud API token with Read & Write, or a fresh Debian 13 server you reach as
rootwith that key.
Your workstation runs macOS or Linux, with bash, ssh, rsync and curl.
Install the CLI
Link to the section Install the CLIThe script installs one checked executable in ~/.local/bin, and prints the line to add if that folder is not on your PATH. It needs neither Bun nor a clone.
curl -fsSL https://github.com/cthiriet/sitesolide/releases/latest/download/install.sh | sh
Create a server
Link to the section Create a serverTo order a server at Hetzner, give the CLI your token without echoing it:
read -rs HCLOUD_TOKEN && export HCLOUD_TOKEN
sitesolide machine create --provider hetzner --name web
It uploads your public key, creates a firewall, orders a Debian 13 server, and waits until SSH answers:
-> ready
ipv4 203.0.113.10
next: sitesolide setup root@203.0.113.10 --zone <your zone> --email <you>
With a Debian 13 server of your own, skip this step and use its address below.
Set up the server
Link to the section Set up the serverGive setup your Cloudflare token the same way:
read -rs CLOUDFLARE_API_TOKEN && export CLOUDFLARE_API_TOKEN
sitesolide setup root@203.0.113.10 --zone example.com --email you@example.com
Setup hardens the server, creates the DNS records, and installs Caddy, Bun, the dashboard, the sign-in portal, backups and the monitor. --email is where the certificate authority writes about expiry.
-> sitesolide is installed on deploy@203.0.113.10
dashboard https://dashboard.example.com its password was shown once, above
Setup shows two passwords once each, the dashboard's and the portal's. Store them in a password manager before the terminal scrolls them away.
Deploy an app
Link to the section Deploy an appCreate a one-file Bun app, or cd into a project of your own:
mkdir hello && cd hello
echo 'Bun.serve({ hostname: "127.0.0.1", port: Number(process.env.PORT), fetch: () => new Response("Hello from sitesolide") });' > server.ts
The folder has no sitesolide.json yet. --yes writes the one the CLI infers, then deploys:
sitesolide deploy --yes
-> no sitesolide.json: this folder reads as a Bun app
-> verify
https://hello.example.com/ 200
Open your app
Link to the section Open your appOpen https://hello.example.com: it answers "Hello from sitesolide", with a certificate already in place.
The app is Public: anyone with the address opens it. The dashboard, at https://dashboard.example.com, lists it with its address, access and service.
Next steps
Link to the section Next steps- Deploy a project: write a manifest, preview a deploy, read the logs.
- Access and sign-in: put the app behind your company's sign-in.
- Monitoring: give the monitor a heartbeat, so you hear when the server goes down.
- Agents: let an agent deploy with its own token.