Introduction
Noite is a tiny self-hostable PaaS for celld — accounts, apps, subdomains, deploy logs.
Introduction
Noite is a tiny self-hostable PaaS for celld: user accounts (passkeys), apps, {slug}.{BASE_DOMAIN} subdomains, thin deploy/build logs and status. It fits on one small server.
Noite is one image, ghcr.io/<owner>/noite. One docker compose up -d runs it next to a bundled RustFS store (docker/compose.yaml); inside the container the runner supervises everything else:
- runner: the Rust deploy pipeline and PID 1. Git smart-HTTP, builds, one celld fleet per app, telemetry aggregation, and the edge’s config.
- caddy: the edge. Per-host TLS with on-demand certificates, routing to the UI, the API and tenant apps.
- control: the Oxide control UI, a celld fleet whose worker bundle is baked into the image and deployed on first boot.
- tenant fleets: one celld per app, sandboxed from the platform when other people push code (
NOITE_TENANCY=multi).
State lives in one S3 bucket (git/ tip bundles, fleets/ tenant celld, control/ the UI worker and its D1, runner/state/ runner snapshots): the bundled RustFS, or your own S3 with --scale rustfs=0.
Get started from a checkout:
cp .env.example .env
make up # build the image and start the stack
make logs
make doctor # verify the install
| URL | |
|---|---|
| http://localhost:9080 | control UI (passkeys) |
| http://api.localhost:9080 | runner API |
http://{slug}.localhost:9080 |
deployed apps |
Then deploy the sample app: cd apps/noite/test && ./deploy.sh.
Real domains, external S3, Coolify, image-only hosts, volumes and backups: Deployment.