New Phase 1 Platform database — PostgreSQL, separate from the Lab image's own SQLite (which keeps its current students/progress data untouched, decision #2 / correction C in docs/LAB_ARCHITECTURE.md). Schema (platform/provisioner/migrations/): - lab_hosts: the abstraction that keeps Docker connectivity out of code — endpoint (unix:// or tcp://+TLS), enabled flag. Phase 1 ships one row. - environments: environment_id (UUID), student_id (opaque external identifier, no FK — students table isn't in this database yet), lab_host_id (real FK), status, routing_token (CSPRNG via crypto.randomBytes, opaque), container/ network identity, resource limits, lifecycle timestamps. - environment_events: append-only audit trail, one row per lifecycle transition, never logs the routing token in plaintext (see lifecycle.js's redact()). File-based migration runner (db.js) matching the check-before-alter idempotency pattern already used in the Lab image's backend/server.js, applied on every Provisioner boot. Resource limits and the lab_hosts seed are config files (config/resource-policy.yaml, config/lab-hosts.seed.yaml), not database tables — there's no admin UI to manage them via a database yet, so a DB-backed policy table would just be a write path nothing uses. Co-Authored-By: Claude Sonnet 5 <[email protected]>
18 lines
422 B
JSON
18 lines
422 B
JSON
{
|
|
"name": "rootnode-provisioner",
|
|
"version": "0.1.0",
|
|
"description": "RootNode Academy Phase 1 platform provisioner — disposable per-student lab lifecycle.",
|
|
"private": true,
|
|
"main": "src/server.js",
|
|
"scripts": {
|
|
"start": "node src/server.js",
|
|
"test": "node test/run.js"
|
|
},
|
|
"dependencies": {
|
|
"dockerode": "^4.0.2",
|
|
"express": "^4.19.2",
|
|
"js-yaml": "^4.1.0",
|
|
"pg": "^8.11.5"
|
|
}
|
|
}
|