Everything runs on your server, in Docker. Kylth is one container, Caddy is another, and each project is a set of its own.
The internet
↓ HTTPS on ports 80 and 443
YOUR SERVER
Caddy
kylth-caddy↓ from Caddy: app.example.com
Kylth
kylth↓ from Caddy: shop.projects.example.com
Project
shop↓ Kylth creates and manages every project through Docker
Docker
Folders on disk
The parts
- Caddy runs in its own container,
kylth-caddy, on ports 80 and 443. It sends the dashboard’s address to Kylth and each project’s address straight to that project. It gets a Let’s Encrypt certificate for every address and renews it. - Kylth runs in the container
kylth. It listens only on127.0.0.1:8383, so the only way in is through Caddy. - Docker is the server’s own. Kylth creates, starts, stops and backs up project containers through it. Security & permissions explains what that access means.
- Projects each run as a separate set of Supabase containers, using Supabase’s own images.
Project traffic doesn’t pass through Kylth
Caddy sends requests for a project directly to that project. If Kylth stops, whether for an upgrade or because something failed, your projects keep running and stay reachable at their addresses.
While Kylth is stopped, these pause until it’s back:
- the dashboard and the API
- scheduled backups
- certificate checks and alerts
Where data lives
| Folder | Holds |
|---|---|
/opt/supabase-projects/<project>/ |
Each project’s configuration, secrets and data, including its database files and uploaded storage |
/opt/kylth |
Kylth’s own database, keys and licence |
/opt/kylth-backups |
Project backups kept on the server, and Kylth’s database copies from upgrades |
/etc/kylth |
docker-compose.yml and the settings file, .env |
Backups explains which of these you need to protect, and how.
More than one server
With a commercial licence, Kylth can manage projects on additional hosts, connected to it over WireGuard. These docs don’t cover that setup yet.