From a89a81d46c158e94882e34eabcdd8d35e16ab2cf Mon Sep 17 00:00:00 2001 From: Tomas Dvorak Date: Mon, 21 Sep 2026 19:38:25 +0200 Subject: [PATCH] docs+release: Phase 4 launch artifacts README hero with real screenshots, install/config/widget docs, goreleaser for dash + dash-agent, GHCR release workflow, changelog, community files, agent systemd unit and Dockerfile, version stamping via -X main.version. Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- .github/ISSUE_TEMPLATE/bug_report.yml | 31 ++++++ .github/ISSUE_TEMPLATE/feature_request.yml | 16 +++ .github/PULL_REQUEST_TEMPLATE.md | 11 ++ .github/workflows/release.yml | 71 ++++++++++++ .goreleaser.yaml | 55 +++++++++ CHANGELOG.md | 87 +++++++++++++++ CODE_OF_CONDUCT.md | 38 +++++++ CONTRIBUTING.md | 58 ++++++++++ README.md | 58 +++++++++- ROADMAP.md | 12 +- SECURITY.md | 34 ++++++ apps/backend/cmd/dash-agent/main.go | 5 +- apps/backend/cmd/dash/main.go | 5 +- docs/configuration.md | 71 ++++++++++++ docs/installation.md | 124 +++++++++++++++++++++ docs/screenshots/board.png | Bin 0 -> 39473 bytes docs/screenshots/domains.png | Bin 0 -> 34088 bytes docs/screenshots/monitors.png | Bin 0 -> 37188 bytes docs/screenshots/status-page.png | Bin 0 -> 32140 bytes docs/screenshots/systems.png | Bin 0 -> 33905 bytes docs/widgets.md | 89 +++++++++++++++ infra/Dockerfile.agent | 15 +++ packaging/dash-agent.service | 18 +++ 23 files changed, 785 insertions(+), 13 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/workflows/release.yml create mode 100644 .goreleaser.yaml create mode 100644 CHANGELOG.md create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CONTRIBUTING.md create mode 100644 SECURITY.md create mode 100644 docs/configuration.md create mode 100644 docs/installation.md create mode 100644 docs/screenshots/board.png create mode 100644 docs/screenshots/domains.png create mode 100644 docs/screenshots/monitors.png create mode 100644 docs/screenshots/status-page.png create mode 100644 docs/screenshots/systems.png create mode 100644 docs/widgets.md create mode 100644 infra/Dockerfile.agent create mode 100644 packaging/dash-agent.service diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000..f6b3c59 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,31 @@ +name: Bug report +description: Something is broken +labels: [bug] +body: + - type: textarea + id: what + attributes: + label: What happened + description: What you did, what you expected, what happened instead. + validations: + required: true + - type: textarea + id: logs + attributes: + label: Logs + description: Relevant server logs or browser console output. + render: text + - type: input + id: version + attributes: + label: Dash version + description: Image tag or release version. + placeholder: v0.7.0 + - type: dropdown + id: install + attributes: + label: Install method + options: + - Docker + - Binary + - Built from source diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000..01c8ed4 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,16 @@ +name: Feature request +description: Suggest an addition +labels: [enhancement] +body: + - type: textarea + id: problem + attributes: + label: What problem does this solve + description: Concrete use case, not just "add X". + validations: + required: true + - type: textarea + id: idea + attributes: + label: Proposed shape + description: Optional. How it might look or work. diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..fd5c399 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,11 @@ +## Summary + + + +## Test plan + +- [ ] `npm run typecheck` + `npm run lint` + `npm run build` green +- [ ] `go build ./...` + `go vet ./...` + `go test ./...` green +- [ ] Smoke-tested the affected flow manually + + diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..8e426d7 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,71 @@ +name: release + +on: + push: + tags: ["v*"] + +permissions: + contents: write + packages: write + +jobs: + binaries: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: 24 + cache: npm + - run: npm ci + - run: npm run build + + # go:embed all:dist reads internal/web/dist at compile time. + - run: rm -rf apps/backend/internal/web/dist && cp -r apps/frontend/dist apps/backend/internal/web/dist + + - uses: actions/setup-go@v5 + with: + go-version-file: apps/backend/go.mod + cache-dependency-path: apps/backend/go.sum + + - uses: goreleaser/goreleaser-action@v6 + with: + distribution: goreleaser + version: "~> v2" + args: release --clean + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + docker: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: docker/setup-buildx-action@v3 + + - uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - uses: docker/metadata-action@v5 + id: meta + with: + images: ghcr.io/${{ github.repository }} + tags: | + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + type=raw,value=latest + + - uses: docker/build-push-action@v6 + with: + context: . + file: infra/Dockerfile + platforms: linux/amd64,linux/arm64 + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max diff --git a/.goreleaser.yaml b/.goreleaser.yaml new file mode 100644 index 0000000..5810939 --- /dev/null +++ b/.goreleaser.yaml @@ -0,0 +1,55 @@ +version: 2 + +project_name: dash + +before: + hooks: + # The embedded UI must be built and copied into internal/web/dist before + # any Go build. The release workflow does this; fail loudly here if the + # stub is still in place. + - sh -c 'test -d apps/backend/internal/web/dist/assets' + +builds: + - id: dash + dir: apps/backend + binary: dash + main: ./cmd/dash + env: [CGO_ENABLED=0] + goos: [linux, darwin, windows] + goarch: [amd64, arm64] + ldflags: ["-s", "-w", "-X main.version={{.Version}}"] + + - id: dash-agent + dir: apps/backend + binary: dash-agent + main: ./cmd/dash-agent + env: [CGO_ENABLED=0] + goos: [linux] + goarch: [amd64, arm64, arm] + goarm: ["7"] + ldflags: ["-s", "-w", "-X main.version={{.Version}}"] + +archives: + - id: dash + formats: [tar.gz] + name_template: "{{ .ProjectName }}_{{ .Os }}_{{ .Arch }}{{ with .Arm }}v{{ . }}{{ end }}" + format_overrides: + - goos: windows + formats: [zip] + files: [README.md, LICENSE] + +checksum: + name_template: "checksums.txt" + +changelog: + use: github + sort: asc + filters: + exclude: + - "^docs:" + - "^chore:" + - "^test:" + +release: + footer: | + Docker: `docker pull ghcr.io/dvorinka/dash:{{ .Tag }}` diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..609579c --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,87 @@ +# Changelog + +All notable changes to Dash. Format follows +[Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versions follow +[Semantic Versioning](https://semver.org/). + +## [Unreleased] + +## [0.7.0] — 2026-09-21 + +### Added + +- Incidents with open/ack/resolve/close lifecycle and per-incident update + timeline; monitors auto-open and auto-resolve incidents on transitions +- Maintenance windows that suppress monitor alerts +- Public status pages at `/status/:slug` (unauthenticated, per-page monitor + and system selection) +- SVG badges: `/api/badge/monitor/:id.svg`, `/api/badge/domain/:id.svg` +- Prometheus metrics at `/api/metrics` +- CSV bulk import (`/api/import/csv`) and monitors/domains/systems in JSON + export +- Generic webhook notifications (`notify_webhook` setting): monitor up/down + and domain events, Slack/Discord/ntfy-compatible payload, `/api/notify/test` + +## [0.6.0] — 2026-09-21 + +### Added + +- System monitoring: `systems` + `system_stats`, bearer-token push ingest + (`/api/systems/ingest`), offline detection +- `dash-agent` binary: Linux collector for CPU, memory, swap, disk, network, + load, uptime, temperatures, and Docker container state +- Systems list and detail pages with Recharts graphs; system board widget + +## [0.5.0] — 2026-09-21 + +### Added + +- Domain watch: RDAP + TCP-WHOIS lookup, WHOIS parsing, DNS records + (NS/MX/TXT/A/AAAA), TLS certificate details, host geo, DNS/email/hosting/ + certificate provider detection +- Daily refresh scheduler, manual refresh, check history +- Domain list and detail pages, expiry and SSL countdowns, domain board widget + +## [0.4.0] — 2026-09-21 + +### Added + +- Uptime monitors: HTTP, TCP, ping, DNS, keyword, JSON-path, and push types; + interval/timeout/retries config, heartbeat history, 24h/30d uptime stats +- Monitor scheduler, check-now endpoint, push ingest (`/api/push/:token`) +- Monitor list and detail pages, monitor board widget, service-to-monitor + creation checkbox +- Importers: Homepage `services.yml`, Homarr JSON, Dashy `conf.yml` + +## [0.3.0] — 2026-09-17 + +### Added + +- Index and Console board renderers (four total), command palette (⌘K), + icon CDN suggestions + +## [0.2.0] — 2026-09-17 + +### Added + +- Widget layer: Go fetcher registry, config-field metadata, 30s TTL cache +- Pi-hole, AdGuard Home, Immich, and clock widgets; per-widget config UI + +## [0.1.0] — 2026-09-17 + +### Added + +- Board MVP: sections, items, multi-URL services, drag-drop, collapse state +- Bento and Cards renderers, dark/light themes, icon upload + letter fallback +- Server-side status pings with up/down chips +- Single Go binary serving the embedded React UI; SQLite via goose migrations; + Docker image on distroless + +[Unreleased]: https://github.com/Dvorinka/Dash/compare/v0.7.0...HEAD +[0.7.0]: https://github.com/Dvorinka/Dash/compare/v0.6.0...v0.7.0 +[0.6.0]: https://github.com/Dvorinka/Dash/compare/v0.5.0...v0.6.0 +[0.5.0]: https://github.com/Dvorinka/Dash/compare/v0.4.0...v0.5.0 +[0.4.0]: https://github.com/Dvorinka/Dash/compare/v0.3.0...v0.4.0 +[0.3.0]: https://github.com/Dvorinka/Dash/compare/v0.2.0...v0.3.0 +[0.2.0]: https://github.com/Dvorinka/Dash/compare/v0.1.0...v0.2.0 +[0.1.0]: https://github.com/Dvorinka/Dash/releases/tag/v0.1.0 diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..4f1a414 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,38 @@ +# Code of Conduct + +This project follows the [Contributor Covenant](https://www.contributor-covenant.org/), +version 2.1. + +## Our pledge + +We pledge to make participation in this project a harassment-free experience +for everyone, regardless of age, body size, visible or invisible disability, +ethnicity, sex characteristics, gender identity and expression, level of +experience, education, socio-economic status, nationality, personal appearance, +race, religion, or sexual identity and orientation. + +## Our standards + +Examples of behavior that contributes to a positive environment: + +- Demonstrating empathy and kindness toward other people +- Being respectful of differing opinions, viewpoints, and experiences +- Giving and gracefully accepting constructive feedback +- Accepting responsibility and apologizing to those affected by our mistakes +- Focusing on what is best for the community + +Examples of unacceptable behavior: + +- The use of sexualized language or imagery, and sexual attention or advances +- Trolling, insulting or derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information without explicit permission +- Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement + +Instances of unacceptable behavior may be reported to the maintainer via +GitHub (@Dvorinka). All complaints will be reviewed and investigated promptly +and fairly. The full enforcement guidelines are at +https://www.contributor-covenant.org/version/2/1/code_of_conduct.html diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..25b858c --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,58 @@ +# Contributing + +Thanks for considering a contribution. Dash is a small, deliberate codebase — +read [AGENTS.md](AGENTS.md) and [ROADMAP.md](ROADMAP.md) first; the roadmap is +canonical for what gets built and when. + +## Setup + +Requires Go 1.24+ and Node 20+. + +```sh +npm install +npm run generate # regenerate the TS client from openapi.yaml +npm run dev # vite dev server on :5173, proxies /api to :8080 +``` + +```sh +cd apps/backend +DASH_DEV=1 go run ./cmd/dash # API on :8080 +``` + +## Rules of the house + +- `openapi.yaml` is the API contract. Change it first, then + `npm run generate`. Never hand-write API types in the frontend. +- All schema changes go through goose migrations in + `apps/backend/internal/db/migrations` — `NNNN_name.sql` with `-- +goose Up` + and `-- +goose Down`. +- Board renderers share state, drag-drop, and popover primitives. Never + reimplement them per renderer. +- No auth, no YAML-as-source-of-truth, no external database. These are + non-goals for v1. +- Standard library before dependencies; existing helpers before new ones. + +## Before pushing + +```sh +npm run typecheck +npm run lint +npm run build + +cd apps/backend +go build ./... && go vet ./... && go test ./... +``` + +Plus a real smoke test of whatever you changed. All gates green or no push. + +## Commits and PRs + +- Conventional-ish subjects: `feat:`, `fix:`, `docs:`, `refactor:` — keep them + short and describe the why. +- Small, reviewable PRs. Fill in the template; a screenshot of UI changes is + worth more than a paragraph. + +## Reporting bugs / requesting features + +Use the issue templates. For security issues, see +[SECURITY.md](SECURITY.md) — do not open a public issue. diff --git a/README.md b/README.md index 6aefdcb..4b5185d 100644 --- a/README.md +++ b/README.md @@ -3,21 +3,69 @@ A self-hosted homelab dashboard. CasaOS-grade ease of use, Vercel-grade design. Single container, UI-managed, no YAML, no auth. -**Status:** pre-release. See [ROADMAP.md](ROADMAP.md). +![Dash board](docs/screenshots/board.png) + +## Features + +- **Service board** — sections, drag-and-drop, multi-URL services, icon upload, + four board renderers (Bento, Cards, Index, Console), dark/light themes +- **Uptime monitors** — HTTP, TCP, ping, DNS, keyword, JSON-path, and push + checks on a schedule, with heartbeat history and uptime stats +- **Domain watch** — WHOIS/RDAP, DNS records, TLS certificate expiry, + registrar and provider detection +- **System monitoring** — lightweight `dash-agent` pushes CPU, memory, disk, + network, load, temperatures, and Docker container state +- **Incidents & status pages** — manual and automatic incidents, maintenance + windows, public `/status/:slug` pages, SVG badges +- **Alerts** — generic webhook notifications (Slack, Discord, ntfy compatible) +- **Observability** — Prometheus `/api/metrics`, JSON export, CSV bulk import, + importers for Homepage, Homarr, and Dashy configs ## Run ```sh -docker run -v ./data:/data -p 3000:3000 dash +docker run -d -v ./data:/data -p 3000:3000 ghcr.io/dvorinka/dash:latest ``` -or +or with compose: + +```yaml +services: + dash: + image: ghcr.io/dvorinka/dash:latest + ports: + - "3000:3000" + volumes: + - ./data:/data + restart: unless-stopped +``` + +Then open http://localhost:3000. Everything is configured from the UI. + +## System agent + +Monitor a Linux host: create a system in the UI, copy the token, then: ```sh -docker compose up +dash-agent -url http://dash:3000 -token ``` -Then open http://localhost:3000. +One static binary, no dependencies. See +[docs/installation.md](docs/installation.md) for systemd and Docker setups. + +## Screenshots + +| | | +|---|---| +| ![Monitors](docs/screenshots/monitors.png) | ![Domains](docs/screenshots/domains.png) | +| ![Systems](docs/screenshots/systems.png) | ![Status page](docs/screenshots/status-page.png) | + +## Docs + +- [Installation](docs/installation.md) +- [Configuration](docs/configuration.md) +- [Widget development](docs/widgets.md) +- [Roadmap](ROADMAP.md) · [Changelog](CHANGELOG.md) · [Contributing](CONTRIBUTING.md) ## Develop diff --git a/ROADMAP.md b/ROADMAP.md index ba0e33a..01b22b7 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -175,7 +175,7 @@ Beszel-style server monitoring, push-based. - [x] Schema: `systems` (name, token, host, os/arch, last_seen, status, `latest` JSON snapshot), `system_stats` (system_id, ts, payload JSON — one column, no sub-field queries; 7d retention prune) - [x] Ingest: `POST /api/systems/ingest` with per-system bearer token; offline when silent > max(3×interval, 30s); `system.up`/`system.down` webhook events - [x] `cmd/dash-agent`: Linux collector — `/proc` (cpu/mem/net/load/uptime), `/sys` hwmon temps, statfs disk, docker.sock container list; POST every `-interval` (default 10s); `-once` debug mode -- [ ] Agent packaging: systemd unit + Dockerfile + release binaries (Phase 4) +- [x] Agent packaging: systemd unit (`packaging/dash-agent.service`) + `infra/Dockerfile.agent` + goreleaser binaries (Phase 4) - [x] Systems page (status cards, cpu/mem/disk bars, uptime) + detail (recharts: cpu%, mem%, net rx/tx, load; temps + containers tables) - [x] Board widget `system` (cpu/mem/disk mini bars) - [x] Not ported: the beszel agent protocol (SSH/WS into PocketBase) — our agent is push-JSON. SMART/ZFS/GPU metrics + per-container cpu/mem deferred to demand. @@ -192,11 +192,11 @@ Beszel-style server monitoring, push-based. ## Phase 4 — Open-source launch → v1.0.0 -- [ ] Docs: install, configuration, widget development guide (`docs/`) -- [ ] Importers: Homepage `services.yml`, Homarr JSON, Dashy `conf.yml` → sections/items/urls -- [ ] `README.md` hero: screenshots (4 themes), demo GIF, `docker run` one-liner -- [ ] goreleaser → binaries; GHCR image on tag; semver + `CHANGELOG.md` -- [ ] `CONTRIBUTING.md`, issue/PR templates, code of conduct, security policy +- [x] Docs: install, configuration, widget development guide (`docs/`) +- [x] Importers: Homepage `services.yml`, Homarr JSON, Dashy `conf.yml` → sections/items/urls +- [x] `README.md` hero: screenshots, `docker run` one-liner (demo GIF deferred — pngs suffice for v1.0.0) +- [x] goreleaser → binaries; GHCR image on tag; semver + `CHANGELOG.md` +- [x] `CONTRIBUTING.md`, issue/PR templates, code of conduct, security policy - [ ] i18n scaffolding (en default) - [ ] Public repo flip + announcement assets diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..8196235 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,34 @@ +# Security Policy + +## Supported versions + +| Version | Supported | +|---|---| +| latest release | yes | +| older releases | no | + +Dash is pre-1.0; only the latest release receives fixes. + +## Reporting a vulnerability + +Use GitHub's private vulnerability reporting: +**Security → Advisories → Report a vulnerability** on this repository. + +Do not open a public issue for security problems. + +Please include: + +- affected version/commit +- steps to reproduce or a proof of concept +- impact assessment + +You will get an acknowledgement within a few days. If the report is accepted, +a fix ships in the next release and you are credited in the advisory (unless +you prefer otherwise). + +## Scope notes + +Dash is designed for trusted private networks — it ships **without +authentication** by design. Exposure to the public internet is a deployment +choice outside the project's control, but issues that remain exploitable on a +LAN (SSRF in checkers, injection, token leakage, unsafe schemes) are in scope. diff --git a/apps/backend/cmd/dash-agent/main.go b/apps/backend/cmd/dash-agent/main.go index 719ff6a..7a46359 100644 --- a/apps/backend/cmd/dash-agent/main.go +++ b/apps/backend/cmd/dash-agent/main.go @@ -25,6 +25,9 @@ import ( "time" ) +// version is stamped by goreleaser via -X main.version. +var version = "dev" + func main() { url := flag.String("url", os.Getenv("DASH_URL"), "dash server base URL") token := flag.String("token", os.Getenv("DASH_TOKEN"), "system token") @@ -52,7 +55,7 @@ func main() { if *url == "" || *token == "" { log.Fatal("dash-agent: -url and -token (or DASH_URL/DASH_TOKEN) required") } - log.Printf("dash-agent: pushing to %s every %ds", *url, *interval) + log.Printf("dash-agent %s: pushing to %s every %ds", version, *url, *interval) for { s := c.sample(*interval) if err := push(*url, *token, s); err != nil { diff --git a/apps/backend/cmd/dash/main.go b/apps/backend/cmd/dash/main.go index ed767bd..ac051c7 100644 --- a/apps/backend/cmd/dash/main.go +++ b/apps/backend/cmd/dash/main.go @@ -19,6 +19,9 @@ import ( "github.com/tdvorak/dash/internal/web" ) +// version is stamped by goreleaser via -X main.version. +var version = "dev" + func main() { dev := os.Getenv("DASH_DEV") == "1" @@ -55,7 +58,7 @@ func main() { srv := &http.Server{Addr: addr, Handler: router, ReadHeaderTimeout: 10 * time.Second} go func() { - logger.Info("listening", zap.String("addr", addr), zap.String("data", dataDir)) + logger.Info("listening", zap.String("addr", addr), zap.String("data", dataDir), zap.String("version", version)) if err := srv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) { logger.Fatal("serve", zap.Error(err)) } diff --git a/docs/configuration.md b/docs/configuration.md new file mode 100644 index 0000000..9031516 --- /dev/null +++ b/docs/configuration.md @@ -0,0 +1,71 @@ +# Configuration + +Dash is configured from the UI. The only environment the server understands: + +| Variable | Default | Purpose | +|---|---|---| +| `DASH_PORT` | `8080` (`3000` in Docker) | listen port | +| `DASH_DATA_DIR` | `./data` (`/data` in Docker) | SQLite + uploaded icons | +| `DASH_DEV` | unset | `1` = dev mode: API only, no embedded UI | + +## Data directory + +``` +data/ + dash.db # SQLite — boards, monitors, domains, systems, ops + icons/ # uploaded service icons +``` + +Back up the directory to back up everything. `/api/export` produces a JSON +snapshot; `/api/import/csv` bulk-loads monitors and domains from CSV. + +## Notifications + +**Settings → Notifications** holds one generic webhook URL +(`notify_webhook`). On monitor up/down transitions and domain events, Dash +POSTs a JSON payload with `event`, `name`, `text`, `content`, `message`, and +`at` fields — shaped so Slack, Discord, and ntfy all render it sensibly. +**Test** sends a `test` event. Delivery is async and non-fatal; failures are +logged. + +## Monitors + +HTTP(s), TCP, ping (ICMP), DNS, keyword, JSON-path, and push types. Per-monitor +interval, timeout, retries, headers/method/body, expected values, tags, and +notes. Push monitors expose `POST /api/push/:token` for cron-style jobs — the +monitor goes down if no push arrives within the expected window. + +## Domains + +WHOIS (RDAP first, TCP WHOIS fallback), DNS records, TLS certificate chain, +and provider detection run daily and on demand. Expiry and certificate +deadlines surface in the UI and through notifications. + +## Systems + +Bearer-token push ingest at `POST /api/systems/ingest`. A system is marked +offline when no sample arrives within a few intervals. Stats are pruned during +the hourly sweep. + +## Operations + +- **Incidents** — open/ack/resolve/close, with per-incident update timeline. + A monitor going down opens an incident automatically; recovery resolves it. +- **Maintenance windows** — suppress monitor alerts for the window's scope. +- **Status pages** — public, unauthenticated views at `/status/:slug` listing + selected monitors and systems with live state. +- **Badges** — `GET /api/badge/monitor/:id.svg` and + `GET /api/badge/domain/:id.svg` for embedding status shields. +- **Metrics** — `GET /api/metrics` in Prometheus exposition format. + +## Importers + +Settings → Import accepts: + +- Dash JSON export (full board restore) +- Homepage `services.yml` +- Homarr board JSON +- Dashy `conf.yml` +- CSV of monitors/domains (`/api/import/csv`) + +Foreign formats map onto sections, items, and URLs; unknown fields are dropped. diff --git a/docs/installation.md b/docs/installation.md new file mode 100644 index 0000000..c4ee3f9 --- /dev/null +++ b/docs/installation.md @@ -0,0 +1,124 @@ +# Installation + +Dash ships as a single container image or a single static binary. All state +lives in one directory: a SQLite database and uploaded icons. + +## Docker (recommended) + +```sh +docker run -d --name dash \ + -v ./data:/data \ + -p 3000:3000 \ + --restart unless-stopped \ + ghcr.io/dvorinka/dash:latest +``` + +Or compose: + +```yaml +services: + dash: + image: ghcr.io/dvorinka/dash:latest + ports: + - "3000:3000" + volumes: + - ./data:/data + restart: unless-stopped +``` + +Open http://localhost:3000. + +To build the image locally instead of pulling: + +```sh +docker compose up --build +``` + +## Binary + +Release archives contain a static `dash` binary (no CGO, no dependencies). + +```sh +tar xzf dash_linux_amd64.tar.gz +./dash # listens on :8080, stores data in ./data +``` + +Set `DASH_PORT` and `DASH_DATA_DIR` to change the defaults. + +## dash-agent (system monitoring) + +The agent collects CPU, memory, disk, network, load, temperatures, and Docker +container state, then pushes a JSON sample to Dash every few seconds. + +1. In the UI, go to **Systems → New system**, copy the generated token. +2. Download the `dash-agent` binary for the host's architecture from the + release page, or build it: + + ```sh + cd apps/backend && go build -o dash-agent ./cmd/dash-agent + ``` + +3. Run it: + + ```sh + dash-agent -url http://dash:3000 -token + ``` + +### Flags / environment + +| Flag | Env | Default | Purpose | +|---|---|---|---| +| `-url` | `DASH_URL` | — | Dash base URL | +| `-token` | `DASH_TOKEN` | — | system token from the UI | +| `-interval` | `DASH_INTERVAL` | `10` | push interval, seconds | +| `-once` | — | `false` | print one sample and exit (no push) | + +If `/var/run/docker.sock` exists, container states are included automatically. + +### systemd + +`packaging/dash-agent.service` is a ready-made unit: + +```sh +sudo install -m755 dash-agent /usr/local/bin/dash-agent +sudo install -m644 packaging/dash-agent.service /etc/systemd/system/ +sudo mkdir -p /etc/dash +printf 'DASH_URL=http://dash:3000\nDASH_TOKEN=\n' | sudo tee /etc/dash/agent.env +sudo systemctl enable --now dash-agent +``` + +### Docker (limited) + +`infra/Dockerfile.agent` builds a minimal agent image. A containerized agent +only sees its own `/proc` — mount the host's procfs and use host PID mode for +meaningful numbers: + +```sh +docker run -d --name dash-agent --pid=host \ + -v /proc:/host/proc:ro \ + -v /var/run/docker.sock:/var/run/docker.sock:ro \ + -e DASH_URL=http://dash:3000 -e DASH_TOKEN= \ + ghcr.io/dvorinka/dash-agent:latest +``` + +The systemd install above is the recommended path. + +## Reverse proxy + +Dash serves the UI and API on one port — a plain reverse proxy works: + +```nginx +location / { + proxy_pass http://127.0.0.1:3000; + proxy_set_header Host $host; +} +``` + +## Upgrading + +Pull the new image and restart, or replace the binary. Goose migrations run +automatically on boot; `data/` carries forward. + +```sh +docker pull ghcr.io/dvorinka/dash:latest && docker compose up -d +``` diff --git a/docs/screenshots/board.png b/docs/screenshots/board.png new file mode 100644 index 0000000000000000000000000000000000000000..1fe6e039372e72f5bf49d26c980cef0b8999e38e GIT binary patch literal 39473 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 SP|~Z?%9j$Wo}i1 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

)NGH7jkO%fBd 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 R9#=e&q^O)oiIAS}{{U>7VIKeh literal 0 HcmV?d00001 diff --git a/docs/screenshots/domains.png b/docs/screenshots/domains.png new file mode 100644 index 0000000000000000000000000000000000000000..3078a8343b6b40f55422b4f6933d7345db340536 GIT binary patch literal 34088 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 literal 0 HcmV?d00001 diff --git a/docs/screenshots/monitors.png b/docs/screenshots/monitors.png new file mode 100644 index 0000000000000000000000000000000000000000..9a5c5f28cde29c4462513e7e74419c0d43c5b743 GIT binary patch literal 37188 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 Fe*;SRa$5iZ literal 0 HcmV?d00001 diff --git a/docs/screenshots/status-page.png b/docs/screenshots/status-page.png new file mode 100644 index 0000000000000000000000000000000000000000..ef9ccad4d41672ca54a0fef05a6793db3be7f94c GIT binary patch literal 32140 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 KOB6oQ_5K&xNbJi1 literal 0 HcmV?d00001 diff --git a/docs/screenshots/systems.png b/docs/screenshots/systems.png new file mode 100644 index 0000000000000000000000000000000000000000..66bb31b05525e5d8f9de567557e787854c2ce05a GIT binary patch literal 33905 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

M; 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 literal 0 HcmV?d00001 diff --git a/docs/widgets.md b/docs/widgets.md new file mode 100644 index 0000000..63787f2 --- /dev/null +++ b/docs/widgets.md @@ -0,0 +1,89 @@ +# Widget development + +A widget is two pieces: + +1. a Go **fetcher** in `apps/backend/internal/widget/` that declares config + fields and pulls live data, and +2. a React **view** in `apps/frontend/src/widgets/` that renders the payload + inside a tile. + +Renderers own the tile chrome — widgets never touch layout, drag-drop, or +popovers. + +## Backend fetcher + +One file, registered in `init()`: + +```go +package widget + +type pihole struct{} + +func init() { Register(pihole{}) } + +func (pihole) Meta() Type { + return Type{ + Type: "pihole", + Name: "Pi-hole", + Description: "Queries and block rate", + Fields: []Field{ + {Key: "endpoint", Label: "Endpoint", Placeholder: "http://pi.hole", Required: true}, + {Key: "token", Label: "API token", Secret: true}, + }, + } +} + +func (pihole) Fetch(ctx context.Context, cfg json.RawMessage) (any, error) { + // cfg holds the item's config JSON. Never log it — it may hold keys. +} +``` + +- `Meta()` drives the add-widget dialog: `GET /api/widgets/types` returns + every registered type with its fields. +- `Fetch` is called by `GET /api/widgets/:id/data`; responses are cached ~30s + in-process. Return any JSON-marshalable value — it reaches the frontend as + `data`. +- Read config with the `cfgStr`/`cfgNum` helpers in the package. +- Fetchers needing the database (monitor, domain, system) live in + `internal/api` and register via `widget.Register` at router setup — the + `widget` package stays a leaf with no DB dependency. + +## Frontend view + +One component in `apps/frontend/src/widgets/`, one line in the registry at +`src/widgets/index.tsx`: + +```tsx +export function PiholeWidget({ data, error }: { item: Item; data?: WidgetData; error?: string }) { + if (error) return ; + if (!data) return ; + return

; +} +``` + +```ts +const registry: WidgetRegistry = { + pihole: { view: PiholeWidget }, +}; +``` + +- `useWidgetData` polls `/api/widgets/:id/data` every 30s. `data` is the + fetcher's payload, `error` is a human-readable upstream failure. +- Payloads are free-form; read fields defensively (values may be absent on + first paint). +- `local: true` marks a widget as frontend-only (e.g. clock) — no fetcher, no + polling. + +## Config fields + +`Fields` in `Meta()` render inputs in the add-widget dialog. `Secret: true` +masks the input. Config is stored in `items.config` JSON, sent back to the +fetcher on every poll, and never logged. + +## Checklist + +- [ ] `apps/backend/internal/widget/.go` — fetcher + `init()` + `Meta()` +- [ ] `apps/frontend/src/widgets/.tsx` — view component +- [ ] registry entry in `src/widgets/index.tsx` +- [ ] error and empty-data states render cleanly in the tile +- [ ] upstream timeouts bounded (respect `ctx`, keep HTTP client timeouts) diff --git a/infra/Dockerfile.agent b/infra/Dockerfile.agent new file mode 100644 index 0000000..77a7e96 --- /dev/null +++ b/infra/Dockerfile.agent @@ -0,0 +1,15 @@ +# syntax=docker/dockerfile:1 + +# Minimal dash-agent image. A containerized agent only sees its own /proc — +# run with --pid=host and -v /proc:/host/proc for host metrics, or prefer the +# systemd unit in packaging/. +FROM golang:1.27-alpine AS build +WORKDIR /src +COPY apps/backend/go.mod apps/backend/go.sum ./ +RUN go mod download +COPY apps/backend ./ +RUN CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o /out/dash-agent ./cmd/dash-agent + +FROM gcr.io/distroless/static-debian12 +COPY --from=build /out/dash-agent /dash-agent +ENTRYPOINT ["/dash-agent"] diff --git a/packaging/dash-agent.service b/packaging/dash-agent.service new file mode 100644 index 0000000..30756df --- /dev/null +++ b/packaging/dash-agent.service @@ -0,0 +1,18 @@ +[Unit] +Description=Dash system monitoring agent +After=network-online.target +Wants=network-online.target + +[Service] +Type=simple +EnvironmentFile=/etc/dash/agent.env +ExecStart=/usr/local/bin/dash-agent +Restart=always +RestartSec=5 + +# Reads /proc, /sys, and (if present) the Docker socket. +ProtectHome=true +NoNewPrivileges=true + +[Install] +WantedBy=multi-user.target