View as Markdown

#Overview

The github.com/glassmkr/crucible repository ships a docker-compose.yml that runs three services: the dashboard, Postgres 16 (accounts, servers, alert state), and ClickHouse 24 (telemetry history). Database migrations apply automatically on boot. The compose file sets GLASSMKR_SELF_HOSTED=1, which removes every gate: no plans, no node limits, no billing. The programmatic API is on, and the AI analysis hook turns on as soon as you set LLM_API_URL. The MCP server ships in the box but is off by default: its OAuth server refuses a non-HTTPS origin in production, so it needs TLS in front plus a few environment variables. The flow has been exercised on the hosted origin, not yet on a self-hosted one. The self-hosting guide lists them.

#Prerequisites

  • Docker with the compose plugin (or a Postgres 16 + ClickHouse 24 you operate yourself; the app is configured entirely by environment variables).
  • 2 GB RAM is comfortable for a small fleet; ClickHouse is the hungriest part.
  • Linux hosts to monitor, with Node 22.19.0+ for the npm agent install (the binary install needs no Node at all).
  • Headroom on the monitored hosts for the agent itself. Measured on a two-disk Supermicro running Rocky 9.8: 40 samples over 20 minutes, spanning four collection cycles, gave 77 to 82 MB resident with a high-water mark of 103 MB that did not move during the run. Budget around 150 MB and you have room. Hosts with more disks and sensors to enumerate will sit higher, because the cost scales with what there is to walk.

#Quickstart

git clone https://github.com/glassmkr/glassmkr.git
cd glassmkr
cp env.selfhost.example .env
./scripts/selfhost-setup.sh     # generates the secrets
docker compose up -d

Then open http://localhost:3000, register the first account, and you are on the dashboard.

GLASSMKR_KEY_PEPPER is the pepper for API-key hashing. selfhost-setup.sh generates it, and re-running the script never overwrites it. Never change it after first boot; changing it invalidates every issued key.

Migrations run automatically: ClickHouse's on every up (they are idempotent), Postgres's from the dashboard container before the app starts (tracked, so only new ones apply).

#Pointing an agent at your dashboard

Create the server in your dashboard (or via POST /api/v1/servers with a write key from Settings); it returns the per-server gmk_cru_live_... key once. Then on the server, one command installs the agent and points it at YOUR dashboard:

curl -fsSL https://glassmkr.com/install.sh | sudo bash -s -- \
  --api-key "gmk_cru_live_..." \
  --ingest-url "http://your-dashboard-host:3000/api/v1/ingest"

The URL must be the full /api/v1/ingest endpoint (a bare base URL also works; the agent appends the path and says so). The installer allowlists exactly that origin for the agent's endpoint policy, which is what makes an http or private-network dashboard address work; https endpoints on public DNS need nothing extra.

If you install the npm package yourself instead, the same two flags on glassmkr-crucible init do the same thing (plus --allow-endpoint-origin <origin> for http/private endpoints; run glassmkr-crucible init --help for the full surface).

The agent stores the URL in /etc/glassmkr/crucible.yaml, so the flags are only needed at init time. Snapshots arrive roughly every five minutes; the first one appears on the dashboard within one cycle.

#AI analysis (optional)

Set LLM_API_URL in .env to any OpenAI-compatible endpoint and LLM_MODEL to the model name. Local Ollama works:

LLM_API_URL=http://host.docker.internal:11434/v1
LLM_MODEL=llama3.1:8b

Leave it empty and the analyze button reports that AI analysis is not configured; everything else is unaffected.

#Upgrading

git pull
./scripts/selfhost-setup.sh
docker compose build dashboard
docker compose up -d

Run the setup script on every upgrade. It is idempotent and never changes a value you already have, so usually it just prints "already set" and does nothing. It matters on the upgrade where a release needs a secret your .env predates: without it, docker compose refuses to parse.

New migrations apply on boot, the ClickHouse set idempotently and the Postgres set tracked. Read the changelog before major version jumps.

#Backups

State lives in the two Docker volumes: pgdata (accounts, servers, alert state, keys) and chdata (telemetry history). Snapshot both. Postgres is the one you cannot afford to lose; telemetry history is rebuildable by time.

#Self-hosted vs hosted

Same codebase. The hosted instance at app.glassmkr.com is the maintained reference deployment and live demo; self-hosted is the same thing on your hardware with every gate removed by the GLASSMKR_SELF_HOSTED flag. If you ever move between them, agents re-point with one init and the API is identical.