feat: customer config management — CRUD, API retrieval, per-customer auth (v0.2.0)
New "Configurations" section lets operators pre-configure customer settings
in the Hub, then docker-setup.sh can download a ready-made controller.yaml
using just a customer ID and retrieval password.
- Store: customer_configs table with CRUD + per-customer API key lookup
- API: GET /api/v1/config/{id} with X-Retrieval-Password auth
- Auth: per-customer API keys alongside existing global key (backward compatible)
- Web UI: /configs list, create, edit, delete, YAML preview, copy-to-clipboard
- YAML gen: deep-merge controller.yaml.example template with customer overrides
- Template fetcher: background goroutine refreshing template from Gitea repo
- Navigation: Dashboard / Configurations tabs on all pages
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
+19
-2
@@ -4,7 +4,7 @@
|
||||
|
||||
A lightweight Go service that receives periodic reports from felhom-controller instances, stores them in SQLite, and provides a web dashboard for fleet monitoring. Also serves as the infrastructure backup store for disaster recovery.
|
||||
|
||||
**Current version: v0.1.6**
|
||||
**Current version: v0.2.0**
|
||||
|
||||
---
|
||||
|
||||
@@ -38,7 +38,7 @@ A lightweight Go service that receives periodic reports from felhom-controller i
|
||||
|
||||
## API Endpoints
|
||||
|
||||
All API endpoints require `Authorization: Bearer <report_api_key>` (except `/healthz`).
|
||||
All API endpoints require `Authorization: Bearer <api_key>` (except `/healthz` and `/api/v1/config/{id}`). Auth accepts both the global `report_api_key` and per-customer API keys (generated when creating customer configs).
|
||||
|
||||
### Report Ingest
|
||||
|
||||
@@ -79,6 +79,14 @@ The infra-backup payload contains everything needed to restore a customer deploy
|
||||
|
||||
Notifications are sent via Resend.com email API.
|
||||
|
||||
### Customer Config Retrieval
|
||||
|
||||
| Method | Path | Description |
|
||||
|--------|------|-------------|
|
||||
| `GET` | `/api/v1/config/{customer_id}` | Download generated controller.yaml (auth: `X-Retrieval-Password` header) |
|
||||
|
||||
Config retrieval uses a separate per-customer retrieval password (not the API key). The Hub generates a complete `controller.yaml` by deep-merging `controller.yaml.example` (periodically fetched from the Gitea repo) with customer-specific overrides (identity, infrastructure tokens, hub API key, session secret).
|
||||
|
||||
### Health
|
||||
|
||||
| Method | Path | Description |
|
||||
@@ -91,6 +99,7 @@ Protected by bcrypt password + session cookie (7-day expiry).
|
||||
|
||||
- **Customer overview table:** status indicators (OK/WARN/DOWN), CPU/memory %, disk usage, container counts, backup age, controller version
|
||||
- **Customer detail page:** system info, storage bars, container table, notification preferences, notification log, 24h history graphs
|
||||
- **Configurations page:** CRUD management for customer configs — pre-configure customer identity, infrastructure secrets, monitoring UUIDs; auto-generates retrieval password + per-customer API key; shows setup commands (`docker-setup.sh` and `curl`); YAML preview
|
||||
- **Auto-refresh:** 60-second cycle
|
||||
- **Status logic:**
|
||||
- Green: report < 30 min old, health = ok
|
||||
@@ -107,6 +116,7 @@ SQLite with WAL mode. Tables:
|
||||
| `infra_backups` | Per-customer infrastructure snapshots for disaster recovery |
|
||||
| `customer_notifications` | Email + enabled event types per customer |
|
||||
| `notification_log` | Send/skip/fail history for notifications |
|
||||
| `customer_configs` | Pre-configured customer settings, retrieval passwords, per-customer API keys |
|
||||
|
||||
Retention: configurable (default 90 days), daily prune at 04:30 Budapest time.
|
||||
|
||||
@@ -131,6 +141,13 @@ retention:
|
||||
alerting:
|
||||
stale_threshold: "30m" # Customer considered stale after this duration
|
||||
|
||||
registry:
|
||||
image: "gitea.dooplex.hu/admin/felhom-controller"
|
||||
username: "" # Gitea registry credentials
|
||||
token: ""
|
||||
check_interval: "30m" # How often to check for new controller versions
|
||||
template_interval: "1h" # How often to refresh controller.yaml.example
|
||||
|
||||
server:
|
||||
listen: ":8080"
|
||||
data_dir: "/data" # SQLite database location
|
||||
|
||||
Reference in New Issue
Block a user