Hosting platforms
The dashboard builds to a static dist/ folder, so it drops onto any host. Two families: static hosts (serve the files) and container hosts (run the Docker image).
Everywhere, the build is the same:
bun install && bun run build # → dist/Set VITE_BUNQUEUE_URL to your server's origin (a build-time env var on the platform), or leave it and configure the target from the in-app Settings page. On a static host the browser calls bunqueue directly, so that server needs CORS for your dashboard domain.
Every static host also needs a history-API fallback (serve index.html for unknown paths) or deep links 404. That is the one config each platform below sets.
Static hosts
Vercel
vercel.json in the repo root:
{
"buildCommand": "bun run build",
"outputDirectory": "dist",
"rewrites": [{ "source": "/(.*)", "destination": "/index.html" }]
}Set VITE_BUNQUEUE_URL under Project Settings, Environment Variables. Deploy with vercel --prod or connect the Git repo.
Netlify
netlify.toml in the repo root:
[build]
command = "bun run build"
publish = "dist"
[[redirects]]
from = "/*"
to = "/index.html"
status = 200Cloudflare Pages
- Build command:
bun run build - Build output directory:
dist - SPA fallback: add a
public/_redirectsfile (Vite copies it intodist):
/* /index.html 200GitHub Pages
Served under a repo sub-path, so build with the base path and add a 404.html that mirrors index.html (Pages serves it for unknown routes):
VITE_BASE=/your-repo/ bun run build
cp dist/index.html dist/404.htmlPublish dist/ with actions/deploy-pages. This repo already does exactly this for the docs site in .github/workflows/pages.yml.
Render (static site)
- Build command:
bun install && bun run build - Publish directory:
dist - Add a rewrite rule: Source
/*, Destination/index.html, Action Rewrite.
Container hosts
These run the Docker image (Caddy already handles the SPA fallback, so there is nothing extra to configure).
Fly.io
fly launch --image ghcr.io/egeominotti/bunqueue-dashboard:latestEnsure fly.toml has internal_port = 80, then fly deploy. Fly terminates TLS for you.
Railway
New project, Deploy from the repo (Railway builds the Dockerfile), or Deploy an image and paste ghcr.io/egeominotti/bunqueue-dashboard:latest. Set the service port to 80.
Google Cloud Run
gcloud run deploy bunqueue-dashboard \
--image ghcr.io/egeominotti/bunqueue-dashboard:latest \
--port 80 \
--allow-unauthenticated \
--region europe-west1Cloud Run injects TLS and a public URL, and scales to zero when idle.
Want the API proxy and process control?
All of the above serve the static build (no control agent, browser talks to bunqueue directly). For a same-origin /api proxy and Server Control, run the all-in-one server on a VM (PM2 / systemd) or as a container, and point these platforms' proxy or your load balancer at it.