feat: SQLite-backed installations, REST API, admin auth and web UI
Replaces the slice-2 hardcoded installation with a full install/deploy pipeline: - SQLite persistence (better-sqlite3) with a single `installations` table and a draft -> cloning -> building -> built -> starting -> running/error/stopped state machine; env vars and bearer tokens are encrypted at rest (AES-256-GCM, key derived from MASTER_KEY). - Build/run orchestration: git clone (+ .env.example key detection), `nixpacks build` as a logged subprocess, dockerode container run/stop with forced host/port env vars and a TCP-connect health check before flipping an installation to "running". - REST API (installations CRUD, build/deploy/redeploy, logs, token regeneration) behind single-operator session-cookie auth with a basic login lockout. - Vite+React admin SPA: login, installation list, install wizard, and a detail page to configure env vars, trigger build/deploy/redeploy, view the build log, and copy the authenticated /mcp/<slug> URL. - Dockerfile (multi-stage, pulls in nixpacks + the Docker CLI) and docker-compose.yml for production deployment. Validated end-to-end against a real cloned repo: draft creation with env-key detection, build, the error path on a failed health check, and delete, all through the live API. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
16
.env.example
16
.env.example
@@ -8,3 +8,19 @@ DOCKER_SOCKET_PATH=/var/run/docker.sock
|
||||
|
||||
# Name of the shared container network joining the manager and every installed MCP container
|
||||
MCP_NETWORK_NAME=mcp-net
|
||||
|
||||
# Where the manager stores its SQLite DB, cloned repos and build logs
|
||||
DATA_DIR=./data
|
||||
|
||||
# Public base URL used to build the authenticated MCP links shown in the UI, e.g. https://mcp.example.com
|
||||
PUBLIC_BASE_URL=http://localhost:3000
|
||||
|
||||
# Password for the single admin/operator account that can use the panel
|
||||
ADMIN_PASSWORD=change-me
|
||||
|
||||
# Random secret used to sign the admin session cookie
|
||||
SESSION_SECRET=change-me-too
|
||||
|
||||
# Random string (min 32 chars) used to derive the AES-256-GCM key that encrypts
|
||||
# installation env vars and bearer tokens at rest
|
||||
MASTER_KEY=change-me-to-a-random-string-of-at-least-32-characters
|
||||
|
||||
Reference in New Issue
Block a user