Removes the old identity service/volume, adds the api service (host networking, Postgres URL, Provisioner shared secret, ADMIN_PASSWORD, both required via :?). gateway now points PLATFORM_API_URL at it instead of the old IDENTITY_BACKEND_URL.
RootNode Academy — Platform
The full multi-student platform, layered on top of the unmodified Lab image at the repo root. Start here, then go to the component you need:
provisioner/— Postgres-backed environment registry and lifecycle. Design:docs/LAB_ARCHITECTURE.md,docs/PHASE1_PLATFORM_FOUNDATION.md. Operational reference:provisioner/README.md.gateway/— the only student-facing path to a Lab (HTTP + WebSocket proxy, environment-aware routing, student identity glue). Design:docs/PHASE2A_GATEWAY_AND_STUDENT_FLOW.md.egress-proxy/— shared allowlisting proxy every Lab's outbound traffic passes through.docker-compose.dev.yml— the full stack (Postgres, egress proxy, Provisioner, a persistent "identity" instance, Gateway) on one machine. This is the Phase 1/2A local dev exception — production is the two-VM Proxmox split described indocs/LAB_ARCHITECTURE.md§1.
Running the full stack locally
cd platform
echo "PROVISIONER_SHARED_SECRET=$(openssl rand -hex 32)" > .env
docker compose -f docker-compose.dev.yml build
docker compose -f docker-compose.dev.yml up -d
Wait for identity to boot (it runs a real k3s cluster, same as any Lab — check with
curl http://localhost:7554/api/health), then the whole platform is reachable at
http://localhost:4200 (the Gateway) — that's the one origin a student's browser would use.
Tests
provisioner/test/run.js— fast, isolated Provisioner tests (network/container/firewall mechanics, no Gateway/identity involved). Run againstprovisioner/docker-compose.dev.yml.test/e2e-phase2a.js— slow, full-stack tests against the compose file above: roster → login → curriculum → launch → Gateway routing → cross-student rejection → progress relay → reset. Real k3s boots, budget several minutes. Run whenever the Gateway, Provisioner API surface, or the identity backend's progress/roster/curriculum routes change.
Neither substitutes for the manual real-Lab-image checks (node-pty, terminal WebSocket,
kubectl, scenario validation) in docs/PHASE2A_GATEWAY_AND_STUDENT_FLOW.md §8 — those need a
browser-equivalent client and aren't automated here.
Known limitations
See provisioner/README.md (Phase 1) and docs/PHASE2A_GATEWAY_AND_STUDENT_FLOW.md §9
(Phase 2A) for the full, honest lists — including the identity service's network_mode: bridge requirement and its unused-k3s resource cost, both flagged as real, not swept under
the rug.