PhotonSpark Hosting Platform
I built this to replace hand-run, cPanel-style provisioning. You point it at a Git repo or upload an archive. It builds an immutable release, runs it on Kubernetes with TLS and DNS, and keeps every earlier release ready to switch back to. I designed, built and run it alone.
Runs PhotonSpark’s own sites, including this one. Customer hosting is still on the legacy cPanel stack.
From a repository to a routed, recoverable release
Declare
You create a site or app, choose Git or an upload, add domains, and optionally ask for a Postgres database or a tunnel to a private origin. The Go API checks ownership, stores the desired state and queues a durable job.
Build
A worker builds and packages the source, checksums it, and stores it in S3-compatible storage as an immutable release. Uploads take the same path.
Reconcile
A Kubernetes operator turns desired state into workloads, Gateway API routes with TLS, Cilium policies between tenants, the optional database, and DNS records in PowerDNS or Cloudflare.
Recover
Health, logs, usage and release history sit on the resource’s own page. Rolling back activates an earlier release; nothing is rebuilt.
System map
- Go control plane
Nothing.
- Build workers
Nothing.
- SparkTunnel
Nothing.
- Static runtime
- Application runtime
- SparkTunnel
Nothing.
Nothing.
- Go control plane
- Build workers
- Kubernetes operator
- DNS providers
- Platform PostgreSQL
- Hosting dashboard
- Static runtime
- Application runtime
- App DB workspaces
- Go control plane
- S3 artifacts
- Git repositories
- Go control plane
Nothing.
- Kubernetes operator
- Gateway API
Nothing.
- Kubernetes operator
- Gateway API
Nothing.
- Gateway API
- Private origin
Nothing.
- Go control plane
Nothing.
- Kubernetes operator
Nothing.
- Build workers
Decisions
- Activate releases, never rebuild them.
- A rollback switches to an artifact that already exists, so it can’t fail on a broken build or an unreachable dependency.
- Jobs live in Postgres.
- Builds and reconciles are durable jobs with real state, so the dashboard never reports a deploy as finished before it is.
- An operator, not deploy scripts.
- Desired state lives in custom resources, so drift is corrected on the next reconcile.
- Tenants are isolated at the network layer.
- Cilium policies stop one tenant’s workloads from reaching another’s apps or databases.
Not done yet
- Moving customers off cPanel.
- The Rust/Tauri desktop connector for SparkTunnel is a scaffold.