Add Homepage dashboard + dual-export OpenCode traces
Homepage as the front door: single page at framework:7575 with one tile per service, live widgets where the upstream supports it (Ollama loaded models, container state via docker.sock, etc.), bookmarks for reference docs. Config files are pyinfra-managed — source of truth lives in compose/homepage/, sync by editing there and re-running ./run.sh. OpenCode plugin now dual-exports spans to Phoenix and OpenLIT in parallel. Phoenix remains the per-trace waterfall view; OpenLIT picks up the same data for fleet-level metrics. Each destination has its own batch processor so a hiccup at one doesn't block the other. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
22
pyinfra/framework/compose/homepage/bookmarks.yaml
Normal file
22
pyinfra/framework/compose/homepage/bookmarks.yaml
Normal file
@@ -0,0 +1,22 @@
|
||||
# https://gethomepage.dev/configs/bookmarks/
|
||||
|
||||
- Reference:
|
||||
- Strix Halo wiki:
|
||||
- abbr: SH
|
||||
href: https://strixhalo.wiki
|
||||
|
||||
- kyuz0 backend benchmarks:
|
||||
- abbr: KB
|
||||
href: https://kyuz0.github.io/amd-strix-halo-toolboxes/
|
||||
|
||||
- llama.cpp:
|
||||
- abbr: LC
|
||||
href: https://github.com/ggml-org/llama.cpp
|
||||
|
||||
- OpenCode:
|
||||
- abbr: OC
|
||||
href: https://opencode.ai
|
||||
|
||||
- Phoenix:
|
||||
- abbr: PX
|
||||
href: https://arize.com/docs/phoenix
|
||||
8
pyinfra/framework/compose/homepage/docker.yaml
Normal file
8
pyinfra/framework/compose/homepage/docker.yaml
Normal file
@@ -0,0 +1,8 @@
|
||||
# Docker integration. https://gethomepage.dev/configs/docker/
|
||||
#
|
||||
# `localhost-docker` is the name services.yaml refers to via
|
||||
# `server: localhost-docker`. Homepage uses the mounted /var/run/docker.sock
|
||||
# (read-only) to render container state on each tile.
|
||||
|
||||
localhost-docker:
|
||||
socket: /var/run/docker.sock
|
||||
80
pyinfra/framework/compose/homepage/services.yaml
Normal file
80
pyinfra/framework/compose/homepage/services.yaml
Normal file
@@ -0,0 +1,80 @@
|
||||
# Service tiles for the localgenai stack. Edit in place — pyinfra
|
||||
# ships this once and never overwrites.
|
||||
#
|
||||
# Widget reference: https://gethomepage.dev/widgets/
|
||||
|
||||
- Inference:
|
||||
- Ollama:
|
||||
icon: ollama.svg
|
||||
href: http://framework:11434
|
||||
description: Local model server (Qwen3-Coder-30B and friends)
|
||||
server: localhost-docker
|
||||
container: ollama
|
||||
widget:
|
||||
type: ollama
|
||||
url: http://framework:11434
|
||||
|
||||
- llama.cpp:
|
||||
icon: si-llama
|
||||
href: http://framework:8080
|
||||
description: Vulkan-backed llama.cpp server (gfx1151)
|
||||
server: localhost-docker
|
||||
container: llama
|
||||
# No native widget; a ping check confirms liveness.
|
||||
widget:
|
||||
type: customapi
|
||||
url: http://framework:8080/health
|
||||
refreshInterval: 30000
|
||||
mappings:
|
||||
- field: status
|
||||
label: Status
|
||||
|
||||
- vLLM:
|
||||
icon: mdi-server-network
|
||||
href: http://framework:8000
|
||||
description: Batched OpenAI-compatible serving (ROCm)
|
||||
server: localhost-docker
|
||||
container: vllm
|
||||
|
||||
- Agent UIs:
|
||||
- OpenWebUI:
|
||||
icon: open-webui.svg
|
||||
href: http://framework:3000
|
||||
description: Chat UI in front of Ollama, with SearXNG search
|
||||
server: localhost-docker
|
||||
container: openwebui
|
||||
|
||||
- OpenHands:
|
||||
icon: mdi-robot
|
||||
href: http://framework:3030
|
||||
description: Autonomous coding agent (loopback — needs SSH tunnel)
|
||||
server: localhost-docker
|
||||
container: openhands
|
||||
|
||||
- Observability:
|
||||
- Beszel:
|
||||
icon: beszel.svg
|
||||
href: http://framework:8090
|
||||
description: Host + container + AMD GPU dashboard
|
||||
server: localhost-docker
|
||||
container: beszel
|
||||
|
||||
- OpenLIT:
|
||||
icon: mdi-chart-line-variant
|
||||
href: http://framework:3001
|
||||
description: LLM fleet metrics (cost, tokens, latency)
|
||||
server: localhost-docker
|
||||
container: openlit
|
||||
|
||||
- Phoenix:
|
||||
icon: arize-phoenix.svg
|
||||
href: http://framework:6006
|
||||
description: Per-trace agent waterfall / flamegraph
|
||||
server: localhost-docker
|
||||
container: phoenix
|
||||
|
||||
- External:
|
||||
- SearXNG:
|
||||
icon: searxng.svg
|
||||
href: https://searxng.n0n.io
|
||||
description: Self-hosted metasearch (used by OpenWebUI + OpenCode)
|
||||
26
pyinfra/framework/compose/homepage/settings.yaml
Normal file
26
pyinfra/framework/compose/homepage/settings.yaml
Normal file
@@ -0,0 +1,26 @@
|
||||
# Top-level dashboard settings. https://gethomepage.dev/configs/settings/
|
||||
|
||||
title: localgenai
|
||||
favicon: https://gethomepage.dev/favicon.ico
|
||||
theme: dark
|
||||
color: slate
|
||||
|
||||
headerStyle: clean
|
||||
language: en
|
||||
target: _blank
|
||||
|
||||
# Layout: keep the four service groups in a 3-column grid each so a tile
|
||||
# fits comfortably without wrapping on a 1440-wide laptop.
|
||||
layout:
|
||||
Inference:
|
||||
style: row
|
||||
columns: 3
|
||||
Agent UIs:
|
||||
style: row
|
||||
columns: 3
|
||||
Observability:
|
||||
style: row
|
||||
columns: 3
|
||||
External:
|
||||
style: row
|
||||
columns: 3
|
||||
19
pyinfra/framework/compose/homepage/widgets.yaml
Normal file
19
pyinfra/framework/compose/homepage/widgets.yaml
Normal file
@@ -0,0 +1,19 @@
|
||||
# Top-of-page widgets. https://gethomepage.dev/widgets/info/
|
||||
|
||||
- search:
|
||||
provider: custom
|
||||
url: https://searxng.n0n.io/search?q=
|
||||
target: _blank
|
||||
focus: true
|
||||
|
||||
- resources:
|
||||
label: framework
|
||||
cpu: true
|
||||
memory: true
|
||||
disk: /
|
||||
|
||||
- datetime:
|
||||
text_size: xl
|
||||
format:
|
||||
timeStyle: short
|
||||
dateStyle: medium
|
||||
Reference in New Issue
Block a user