Files
gashboard/README.md
2026-05-09 17:10:47 +01:00

69 lines
3.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# gashboard
> a custom dashboard for the datum gateway running on umbrel.
> for the four little boards that probably won't find a block, but are trying their best.
Polls a local Datum gateway (OCEAN's open-source mining gateway), shows live per-miner hashrate, share counts, lottery odds, and a tongue-in-cheek read on how unlikely it all is. Designed for a small fleet of solo-style hobby miners (Bitaxe, NerdQAxe, Avalon Nano 3, Avalon Mini 3) hashing into one Datum on Umbrel.
## What it shows
- **Pool hero** — combined hashrate, current block height being templated, mempool fee snapshot, datum connection status.
- **Per-miner cards** — nickname, ASIC type, location, live hashrate, accepted/rejected shares, last-share age, status light, firmware string from `useragent`.
- **Lottery widget** — P(block in 24h) at current network difficulty, with rotating self-deprecating commentary.
- **Live share ticker** — sparkline + scrolling feed of recent accepted shares.
- **Sats-today counter** — earnings projection from current hashrate × network reward.
- **Map panel** — pins for each location (split by remote IP from Datum's `/clients`), pulse-per-share.
- **Block celebration** — confetti + sound the day it finally happens.
## Auth
Nostr-only login (NIP-98 over HTTP). Two signers supported:
- **Remote signer** (NIP-46) — covers Primal app, Amber, nsecbunker.
- **Browser extension** (NIP-07) — Alby, nos2x, etc.
Allowlist of npubs is set via `NOSTR_ALLOWED_NPUBS`. Anything else is rejected before a session token is issued.
## Stack
- **Frontend** — Vue 3 + Vite + Pinia + TypeScript
- **Backend** — Express + TypeScript
- **Auth** — `nostr-tools` (NIP-98 verify), `applesauce-*` (signer abstraction, lifted from indeehub)
- **Container** — multi-stage `node:22.12.0-alpine` (pinned by SHA256 in Dockerfile)
## Deploy on Portainer (the way it'll actually run)
1. **Enable Datum admin API** on your Umbrel — edit
`~/umbrel/app-data/datum-gateway/data/datum_gateway/datum_gateway_config.json`
and add `"admin_password": "<openssl rand -hex 32>"` inside the `"api"` block.
Restart the Datum app.
2. **Push this repo** to your gitea/whatever:
```bash
git push -u origin main
```
3. **In Portainer → Stacks → Add stack → Repository**:
- Repository URL: `https://git.tx1138.com/lfg2025/gashboard`
- Compose path: `docker-compose.yml`
- Add env vars (see `.env.example`)
- Remove any old `DATUM_URL=http://10.21...`,
`DATUM_URL=http://datum...`, or `DATUM_URL=http://datum_datum_1...` value
from the stack env vars.
- By default the stack uses host networking and polls Datum through Umbrel's
host-published admin port: `DATUM_URL=http://127.0.0.1:21000`.
- Reward contribution accounting is persisted in the Docker volume
`gashboard_data` at `/data/contribution-ledger.json`.
4. Open the dashboard, log in with one of the allowed npubs, watch your boards lose at hashing in style.
## Local dev
```bash
pnpm install
pnpm dev # runs api + web concurrently
```
## License
MIT.