PipelineOS Phase 1 is a single-tenant, self-hosted control plane:
- API (
api/) — Express + TypeScript on port3001. Owns MongoDB models, GitHub webhook ingress, run CRUD, internal runner callbacks, and the WebSocket log fan-out (/ws). - Runner (
runner/) — Separate Node process that polls for queued runs, fetches.pipelineos.ymlfrom GitHub, executes stages via dockerode against the host socket, and streams logs back to the API. - Frontend (
frontend/) — Vite + React + Tailwind dashboard for run history and live logs. - MongoDB — Single instance; no replica set required for Phase 1.
docker-compose.yml lives at the repository root, so build and volumes paths resolve naturally without needing --project-directory .. For advanced deployments with MongoDB, Redis, and Jaeger, there is a deploy/docker-compose.advanced.yml file.
Webhook handling enqueues asynchronous work with BullMQ backed by Redis. This keeps webhook responses under GitHub’s time budget while persisting runs safely and allowing multiple API processes/runners in later phases.
Runners claim work using a renewable lease stored on the run document (claimedBy, claimExpiresAt) and renewed via periodic heartbeats. This reduces race conditions and prevents long-lived zombie runs when runners crash.
Structured logging uses pino in Node services. Avoid unstructured console.log in runtime code so log shipping remains consistent in later phases.
Kubernetes runners, multi-tenant auth, Prometheus/Grafana, and expanded AI-assisted diagnosis are explicitly deferred.