{{if .HasReports}}{{end}}
← All Customers

{{statusIcon .OverallStatus}} {{if .CustomerName}}{{.CustomerName}}{{else}}{{.CustomerID}}{{end}}

{{if .HasReports}}

Last report: {{timeAgo .Customer.ReceivedAt}} · Controller v{{.Customer.ControllerVersion}}

{{else}}

No reports received yet

{{end}}
{{if .Flash}}
{{if eq .Flash "created"}}Configuration created successfully. {{else if eq .Flash "updated"}}Configuration updated. {{else if eq .Flash "password_regenerated"}}Retrieval password regenerated. {{else if eq .Flash "blocked"}}Customer blocked — hidden from Dashboard. {{else if eq .Flash "unblocked"}}Customer unblocked — visible on Dashboard again. {{end}}
{{end}} {{if .IsBlocked}}
This customer is blocked — reports are accepted but not shown on the Dashboard.
{{end}}

Customer Info

{{if .HasConfig}} Edit {{if .IsBlocked}}
{{else}}
{{end}}
{{else}}
{{end}}
Customer ID {{.CustomerID}}
Name {{if .CustomerName}}{{.CustomerName}}{{else}}—{{end}}
Domain {{if .Domain}}{{.Domain}}{{else}}—{{end}}
Email {{if .Email}}{{.Email}}{{else}}—{{end}}
Config {{if .HasConfig}} MANAGED {{else}} MANUAL {{end}} {{if .IsBlocked}}BLOCKED{{end}}
{{if .HasConfig}}
Config Created {{timeAgo .Config.CreatedAt}}
{{end}}
{{if .HasReports}}

System

{{with .Report.system}}
Hostname {{index . "hostname"}}
OS {{index . "os"}}
Kernel {{index . "kernel"}}
CPU {{index . "cpu_model"}} ({{index . "cpu_cores"}} cores)
{{end}}
CPU {{formatFloat .Customer.CPUPercent}}%
Memory {{formatFloat .Customer.MemoryPercent}}%

Storage

{{with .Report.storage}}
{{range .}}
{{with index . "label"}}{{.}}{{else}}{{index . "mount"}}{{end}} {{printf "%.0f" (index . "percent")}}%
{{printf "%.1f" (index . "used_gb")}} / {{printf "%.1f" (index . "total_gb")}} GB
{{end}}
{{end}}

Containers ({{.Customer.ContainerRunning}}/{{.Customer.ContainerTotal}})

{{with .Report.containers}} {{$list := index . "list"}} {{if $list}} {{range $list}} {{end}}
Name State CPU Memory
{{index . "name"}} {{index . "state"}} {{printf "%.1f" (index . "cpu_percent")}}% {{printf "%.0f" (index . "memory_mb")}} MB
{{end}} {{end}}

Backup

{{with .Report.backup}}
Enabled {{if index . "enabled"}}Yes{{else}}No{{end}}
Snapshots {{index . "snapshot_count"}}
Repo Size {{index . "repo_size_mb"}} MB
Integrity {{if index . "integrity_ok"}}OK{{else}}Unknown{{end}}
{{end}}

Infra Backup

{{if .InfraBackup}}
Last Updated {{.InfraBackupAge}}
Deployed Stacks {{.InfraBackup.StackCount}}
Disks {{.InfraBackup.DiskCount}}
{{else}}

No infra backup received yet

{{end}}

Health

{{if eq .OverallStatus "disabled"}}

Reporting has been disabled on this node

Enable it in the controller's controller.yaml: hub.enabled: true

{{else if eq .OverallStatus "blocked"}}

Customer is blocked

{{else}} {{with .Report.health}}

Status: {{index . "status"}}

{{$issues := index . "issues"}} {{if $issues}}

Issues

{{end}} {{$warnings := index . "warnings"}} {{if $warnings}}

Warnings

{{end}} {{end}} {{end}}
{{else}} {{if .HasConfig}}

Waiting for First Report

This customer has been configured but no controller report has been received yet.

Use one of the setup commands below to deploy the controller on the customer node.

{{end}} {{end}} {{if .HasConfig}}

Credentials

Retrieval Password
{{.Config.RetrievalPassword}}
API Key
{{.Config.APIKey}}
Used by the controller for ongoing hub communication (reports, notifications, backups)

Setup Commands

Use one of these methods to configure a customer node:

Option 1: docker-setup.sh (recommended)

sudo ./docker-setup.sh --hub-customer {{.CustomerID}} --hub-password {{.Config.RetrievalPassword}}

Option 2: Direct download

curl -fsSL https://hub.felhom.eu/api/v1/config/{{.CustomerID}} -H "X-Retrieval-Password: {{.Config.RetrievalPassword}}" -o controller.yaml

YAML Preview

Loading preview...

{{end}} {{if .HasReports}}

Controller Update

Current version v{{.Customer.ControllerVersion}}
{{if .LatestVersion}}
Latest version v{{.LatestVersion}} {{if .UpdateAvailable}} ● update available {{else}} — up to date {{end}}
{{end}} {{if .ControllerURL}}
Controller URL {{.ControllerURL}}
{{end}}
{{if and .HasConfig .ConfigSyncStatus}}
Config Sync {{if eq .ConfigSyncStatus "in_sync"}}✓ In sync {{else if eq .ConfigSyncStatus "mismatch"}}⚠ Config mismatch — Hub config differs from controller {{else}}Unknown — controller not reporting config hash (update controller) {{end}}
{{end}}
{{if and .ControllerURL .UpdateAvailable}} {{else if and .ControllerURL (not .LatestVersion)}} {{end}} {{if and .HasConfig .ControllerURL}} {{end}}
{{if and .ControllerURL (not .LatestVersion)}}

Registry check not configured — cannot verify if update is available

{{end}}

Notifications

Email {{if .NotifPrefs}}{{if .NotifPrefs.Email}}{{.NotifPrefs.Email}}{{else}}Not set{{end}}{{else}}Not configured{{end}}
{{if .NotifPrefs}}
Events {{if .NotifPrefs.EnabledEvents}}{{joinStrings .NotifPrefs.EnabledEvents ", "}}{{else}}None{{end}}
{{end}}
{{if .RecentNotifications}}

Recent (last 10)

{{range .RecentNotifications}} {{end}}
Time Event Status Message
{{.CreatedAt.Format "Jan 02 15:04"}} {{.EventType}} {{.Status}} {{.Message}}
{{end}}
{{if .History}}

Report History (last 24h)

{{len .History}} reports {{range .History}} {{end}}
Time Status CPU Memory
{{.ReceivedAt.Format "Jan 02 15:04"}} {{.HealthStatus}} {{formatFloat .CPUPercent}}% {{formatFloat .MemoryPercent}}%
{{end}} {{end}}