Deploy from the CLI
Push-to-deploy, the Vercel way: hand nebula a GitHub
URL and get back a running, HTTPS-secured service. No Docker, nothing to
containerize.
Before you start
Install the CLI and log in once — see Getting started. Confirm you're authenticated:
$ nebula whoami jeremy · Captain plan · 3 / 10 nebulae in use
Deploy a repository
Pass any GitHub URL. Nebulae provisions a fresh nebula, clones the repo, and starts it:
$ nebula deploy github.com/jeremy/hello-spaceport → provisioning nebula… → cloning repository… → config.spaceport detected → starting service → routing hello-spaceport.jeremy.spaceport.host ✓ live at https://hello-spaceport.jeremy.spaceport.host
From inside a repo's directory you can omit the URL — nebula deploy
uses the current repo's origin.
How a deploy runs
Every project runs the same way: Nebulae clones it, runs a one-time build if one is needed, then launches your start command as a managed service — a supervised screen session that comes back on its own after a reboot or a redeploy. What gets run is detected from the repo:
| If the repo has… | Nebulae will… |
|---|---|
config.spaceport | Run it as a service: java -jar spaceport-latest.jar --start config.spaceport. No build step. |
nebula.toml | Run build once (if set), then supervise start. |
| Neither | Stop and ask you to add a nebula.toml. |
nebula.toml
For anything that isn't a Spaceport app, drop a nebula.toml in the
repo root. start is the long-running command Nebulae keeps alive and
must bind $PORT; build is optional and runs once per
deploy.
# nebula.toml build = "npm ci && npm run build" start = "node server.js" # must listen on $PORT
Environment variables
Nebulae injects $PORT (the port your service must bind)
automatically. Set your own with nebula env:
$ nebula env set STRIPE_KEY=sk_live_… --nebula hello-spaceport $ nebula env list --nebula hello-spaceport
Changes take effect on the next deploy.
Multiple projects on one nebula
By default each nebula deploy creates its own single-project box.
To run several projects on the same nebula, target it by name with
--nebula — each project gets its own port and subdomain:
$ nebula deploy github.com/jeremy/api ✓ new nebula 'api' · https://api.jeremy.spaceport.host $ nebula deploy github.com/jeremy/web --nebula api ✓ added 'web' to nebula 'api' · https://web.api.jeremy.spaceport.host
Redeploying
Run nebula deploy again to ship the latest commit to the same
project — the URL stays put:
$ nebula deploy --nebula hello-spaceport ✓ redeployed · service restarted in 4s