Port the standalone lab dashboard (lab.lthn.io) into the core CLI as pkg/lab/ with collectors, handlers, and HTML templates. The dashboard monitors machines, Docker containers, Forgejo, HuggingFace models, training runs, and InfluxDB metrics with SSE live updates. New command: core lab serve --bind :8080 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
84 lines
1.8 KiB
Go
84 lines
1.8 KiB
Go
package lab
|
|
|
|
import (
|
|
"os"
|
|
"strconv"
|
|
)
|
|
|
|
type Config struct {
|
|
Addr string
|
|
|
|
PrometheusURL string
|
|
PrometheusInterval int
|
|
|
|
ForgeURL string
|
|
ForgeToken string
|
|
ForgeInterval int
|
|
|
|
HFAuthor string
|
|
HFInterval int
|
|
|
|
M3Host string
|
|
M3User string
|
|
M3SSHKey string
|
|
M3APIURL string
|
|
M3Interval int
|
|
|
|
TrainingDataDir string
|
|
TrainingInterval int
|
|
|
|
DockerInterval int
|
|
|
|
InfluxURL string
|
|
InfluxToken string
|
|
InfluxDB string
|
|
InfluxInterval int
|
|
}
|
|
|
|
func LoadConfig() *Config {
|
|
return &Config{
|
|
Addr: env("ADDR", ":8080"),
|
|
|
|
PrometheusURL: env("PROMETHEUS_URL", "http://prometheus:9090"),
|
|
PrometheusInterval: envInt("PROMETHEUS_INTERVAL", 15),
|
|
|
|
ForgeURL: env("FORGE_URL", "https://forge.lthn.io"),
|
|
ForgeToken: env("FORGE_TOKEN", ""),
|
|
ForgeInterval: envInt("FORGE_INTERVAL", 60),
|
|
|
|
HFAuthor: env("HF_AUTHOR", "lthn"),
|
|
HFInterval: envInt("HF_INTERVAL", 300),
|
|
|
|
M3Host: env("M3_HOST", "10.69.69.108"),
|
|
M3User: env("M3_USER", "claude"),
|
|
M3SSHKey: env("M3_SSH_KEY", "/root/.ssh/id_ed25519"),
|
|
M3APIURL: env("M3_API_URL", "http://10.69.69.108:9800"),
|
|
M3Interval: envInt("M3_INTERVAL", 30),
|
|
|
|
TrainingDataDir: env("TRAINING_DATA_DIR", "/data/training"),
|
|
TrainingInterval: envInt("TRAINING_INTERVAL", 60),
|
|
|
|
DockerInterval: envInt("DOCKER_INTERVAL", 30),
|
|
|
|
InfluxURL: env("INFLUX_URL", "http://localhost:8181"),
|
|
InfluxToken: env("INFLUX_TOKEN", ""),
|
|
InfluxDB: env("INFLUX_DB", "training"),
|
|
InfluxInterval: envInt("INFLUX_INTERVAL", 60),
|
|
}
|
|
}
|
|
|
|
func env(key, fallback string) string {
|
|
if v := os.Getenv(key); v != "" {
|
|
return v
|
|
}
|
|
return fallback
|
|
}
|
|
|
|
func envInt(key string, fallback int) int {
|
|
if v := os.Getenv(key); v != "" {
|
|
if n, err := strconv.Atoi(v); err == nil {
|
|
return n
|
|
}
|
|
}
|
|
return fallback
|
|
}
|