Self-hosted IT ops dashboard for MSPs — auth-event observability, service inventory, and a lightweight admin view over Docker Compose.
Formerly MSPDash.
dashova is a small, self-hosted stack with three services:
- dashboard — a static admin page (nginx) showing recent staff login events
- api — a FastAPI service that ingests and stores auth events
- timescaledb — PostgreSQL 16 + TimescaleDB for event storage
Everything runs locally via Docker Compose. No cloud dependencies.
git clone https://github.com/OneByJorah/dashova.git
cd dashova
cp .env.example .env
docker compose up -d --buildSeed a few demo events (documentation-range IPs, fake names):
curl -s -X POST http://127.0.0.1:42000/ingest/service-login \
-H 'Content-Type: application/json' \
-d '{"staff_email":"Avery Quinn","service_name":"portal-gateway","source_ip":"203.0.113.10"}'Then open:
- Dashboard:
http://127.0.0.1:3000 - API health:
http://127.0.0.1:42000/health
Stop and remove everything (including the database volume):
docker compose down -vThe API exposes exactly three endpoints:
| Endpoint | Method | Purpose |
|---|---|---|
/health |
GET | Health probe — returns {"status":"ok"} |
/ingest/service-login |
POST | Record a staff login event (staff_email, service_name, optional source_ip, user_agent, metadata) |
/admin/events |
GET | List recent events (?service=, ?limit=) |
- Auth-event ingestion — POST login events from any tooling you run
- Service inventory — services are created automatically on first sighting
- Admin dashboard — dark, single-page view of recent activity
- Docker Compose — one command brings up the full stack
- CORS-scoped API — the API only accepts browser origins you list in
ALLOWED_ORIGINS
install.ps1 is a PowerShell-only installer for Docker Desktop hosts:
.\install.ps1It creates .env from .env.example and runs docker compose up --build -d. On Linux/macOS use install.sh or the Quick Start above.
Captured against the live local stack with demo data (scripts/screenshots.mjs).
| Admin dashboard |
|---|
![]() |
api/ FastAPI service (app.py, Dockerfile, requirements.txt)
admin/ Static dashboard page served by nginx
adapters/ Reference adapters (email, osticket, password-reset)
scripts/ screenshots.mjs — Playwright capture with scrub checks
tests/ pytest suite for the API
- Demo-mode defaults.
.env.exampleships withchange-mecredentials for local use. Change every one of them before exposing anything to a network. - No authentication on the dashboard. The admin page and
/admin/eventsare unauthenticated. Keep the ports bound to localhost or put a reverse proxy with auth in front. - Telegram variables are placeholders.
TELEGRAM_BOT_TOKEN/TELEGRAM_ADMIN_CHAT_IDexist in.env.examplebut no code reads them yet. - No PyPI package. Install via Docker;
pip install dashovadoes not exist. - Local image tag only.
docker compose up --buildbuilds and tagsghcr.io/onebyjorah/dashova:latestlocally. It is not pulled from a registry. - Single-node by design. No clustering, no HA, no multi-tenant isolation beyond the
servicefield on events.
# run the API tests (SQLite fallback works without Postgres)
pip install -r api/requirements.txt pytest pytest-asyncio httpx
pytest tests/ -v
# lint markdown / Dockerfile / secrets (what CI runs)
markdownlint-cli2 "**/*.md"
hadolint Dockerfile api/DockerfileRe-capture screenshots with the stack running:
npm install --no-save playwright && npx playwright install --with-deps chromium
BASE_URL=http://127.0.0.1:3000 node scripts/screenshots.mjsContributions are welcome. Open an issue to report a bug or request a feature.
MIT — see LICENSE.
