Real-time health monitoring dashboard for all Online Beratung microservices. Provides a beautiful web interface to monitor service status, response times, and historical health data.
- β Real-time Monitoring - Checks services every 60 seconds
- β Beautiful UI - Modern dark-themed dashboard
- β Service Details - View detailed health information for each service
- β Helm Image Inventory - Shows Helm-deployed workloads with running images, source branch when exposed, and image hashes
- β Historical Data - Tracks last 10 health check runs
- β Manual Refresh - Trigger health checks on demand
- β API Proxy - Proxies health check requests to avoid CORS issues
cd /home/caritas/Desktop/online-beratung/caritas-workspace/ORISO-HealthDashboard
npm install
npm startdocker build -t caritas-health-dashboard:latest .
sudo k3s ctr images import <(docker save caritas-health-dashboard:latest)
kubectl apply -f kubernetes-deployment.yamlEdit config.json to configure which services to monitor:
{
"TenantService": {
"name": "TenantService",
"url": "http://localhost:8081/actuator/health"
},
"UserService": {
"name": "UserService",
"url": "http://localhost:8082/actuator/health"
},
"ConsultingTypeService": {
"name": "ConsultingTypeService",
"url": "http://localhost:8083/actuator/health"
},
"AgencyService": {
"name": "AgencyService",
"url": "http://localhost:8084/actuator/health"
},
"VideoService": {
"name": "VideoService",
"url": "http://localhost:8090/actuator/health"
}
}# Port (default: 9100)
PORT=9100
# Namespace to inspect for Helm workloads. Defaults to the pod namespace in Kubernetes.
ORISO_HELM_NAMESPACE=caritas
# Optional comma-separated Helm release filter. Leave unset to show every
# Helm-managed workload in the namespace.
ORISO_HELM_RELEASES=oriso
# Optional GitHub token used to resolve exact package-version URLs for image
# digests, e.g. /pkgs/container/oriso-agencyservice/1070196056?tag=pre-dev.
# Without this token the dashboard links to the package page only.
GITHUB_TOKEN=github_pat_or_classic_token_with_package_read_access
# Package tag to prefer when the running pod only exposes sha256 image text.
ORISO_PACKAGE_TAG=pre-devReturns list of all configured services.
Response:
{
"TenantService": {
"name": "TenantService",
"url": "http://localhost:8081/actuator/health"
}
}Proxies health check request to the specified service.
Example: /api/health/TenantService
Response:
{
"status": "UP",
"components": {
"db": {
"status": "UP",
"details": {
"database": "MariaDB",
"validationQuery": "isValid()"
}
}
}
}Returns last 10 automated health check runs.
Response:
[
{
"id": 42,
"timestamp": "2025-10-31T19:30:00.000Z",
"results": {
"TenantService": "UP",
"UserService": "UP",
"AgencyService": "UP"
},
"overall": "ALL_UP"
}
]Triggers an immediate health check of all services.
Response:
{
"id": 43,
"timestamp": "2025-10-31T19:31:00.000Z",
"results": {
"TenantService": "UP",
"UserService": "DOWN",
"AgencyService": "UP"
},
"overall": "PARTIAL_DOWN"
}Returns Helm-managed Deployments, StatefulSets, and DaemonSets in the configured namespace with each container image and runtime image hash/digest from matching pods. When GITHUB_TOKEN or GH_TOKEN is available, ORISO image rows include packageUrl pointing to the exact GitHub package version when the digest or tag can be matched, and sourceBranch is populated from exact package version tags such as pre-dev, dev, or main. Without GitHub package metadata, sourceBranch falls back to workload labels/annotations or image tags. ORISO release image tags such as 2.0.1 are mapped to service release branches such as release/userservice-2.0.1.
Response:
{
"namespace": "caritas",
"releaseFilter": ["oriso"],
"count": 1,
"generatedAt": "2026-07-25T12:00:00.000Z",
"workloads": [
{
"kind": "Deployment",
"name": "oriso-userservice",
"helmRelease": "oriso",
"containers": [
{
"name": "userservice",
"image": "ghcr.io/openresilienceinitiative/oriso-userservice:rebuild",
"runningImage": "ghcr.io/openresilienceinitiative/oriso-userservice:rebuild",
"digest": "sha256:abc123",
"imageID": "containerd://sha256:abc123",
"packageName": "oriso-userservice",
"packageUrl": "https://github.com/OpenResilienceInitiative/ORISO-UserService/pkgs/container/oriso-userservice/123456789?tag=pre-dev",
"packageTags": ["sha-abcdef1", "pre-dev"],
"sourceBranch": "pre-dev",
"sourceBranchUrl": "https://github.com/OpenResilienceInitiative/ORISO-UserService/tree/pre-dev",
"sourceBranchSource": "GitHub package digest tag"
}
]
}
]
}The dashboard pod needs RBAC to list pods, deployments, statefulsets, and daemonsets; see kubernetes-rbac.yaml. For exact branch reporting across all services, either deploy ORISO images with branch/release tags such as pre-dev, dev, main, or 2.0.1, or add one of these labels/annotations to workloads during deployment: app.kubernetes.io/source-branch, oriso.org/source-branch, or git.branch.
- Backend: Node.js + Express
- Frontend: Vanilla JavaScript (no framework)
- Styling: Custom CSS (dark theme)
- Health Checks: HTTP requests to
/actuator/healthendpoints
- Dashboard loads list of services from
/api/services - Frontend displays services in sidebar
- Every 60 seconds, backend performs health checks on all services
- Results are stored in memory (last 10 runs)
- Frontend polls
/api/cron/runsto show historical data - User can click services to see detailed health information
- Backend proxies requests to avoid CORS issues
Create kubernetes-deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: health-dashboard
namespace: caritas
spec:
replicas: 1
selector:
matchLabels:
app: health-dashboard
template:
metadata:
labels:
app: health-dashboard
spec:
hostNetwork: true
containers:
- name: health-dashboard
image: caritas-health-dashboard:latest
imagePullPolicy: Never
env:
- name: PORT
value: "9001"
ports:
- containerPort: 9001
name: http
---
apiVersion: v1
kind: Service
metadata:
name: health-dashboard
namespace: caritas
spec:
selector:
app: health-dashboard
ports:
- port: 9001
targetPort: 9001
name: httpkubectl apply -f kubernetes-deployment.yaml- Internal: http://health-dashboard.caritas.svc.cluster.local:9001
- External: http://91.99.219.182:9001 (configure Nginx proxy)
{
"TenantService": "http://localhost:8081/actuator/health",
"UserService": "http://localhost:8082/actuator/health",
"ConsultingTypeService": "http://localhost:8083/actuator/health",
"AgencyService": "http://localhost:8084/actuator/health"
}{
"TenantService": "http://tenantservice.caritas.svc.cluster.local:8081/actuator/health",
"UserService": "http://userservice.caritas.svc.cluster.local:8082/actuator/health",
"ConsultingTypeService": "http://consultingtypeservice.caritas.svc.cluster.local:8083/actuator/health",
"AgencyService": "http://agencyservice.caritas.svc.cluster.local:8084/actuator/health"
}- Sidebar Navigation - List of all services with status indicators
- Service Details - Click any service to view detailed health information
- Real-time Status - Green (UP) / Red (DOWN) indicators
- Response Data - Full JSON response from health endpoints
- Historical Runs - View last 10 automated health checks
- π’ Green Dot - Service is UP
- π΄ Red Dot - Service is DOWN or unreachable
The dashboard supports any service exposing:
/actuator/health(Spring Boot Actuator)/health(Generic health endpoint)- Custom health endpoints returning JSON
- Edit
config.json - Add new service entry with name and URL
- Restart dashboard
- Service will appear in sidebar
Example:
{
"VideoService": {
"name": "Video Call Service",
"url": "http://localhost:8090/actuator/health"
}
}# Check if pod is running
kubectl get pods -n caritas | grep health-dashboard
# Check logs
kubectl logs -n caritas -l app=health-dashboard- Check if service pod is running
- Verify service URL in
config.json - Test health endpoint manually:
curl http://localhost:8081/actuator/health - Check for network/firewall issues
Dashboard uses backend proxy to avoid CORS issues. If you see CORS errors:
- Ensure you're accessing dashboard through
/api/health/:keyendpoint - Check browser console for specific errors
- Verify service allows requests from dashboard origin
ORISO-HealthDashboard/
βββ package.json # Node.js dependencies
βββ server.js # Express server
βββ config.json # Service configuration
βββ Dockerfile # Docker image
βββ public/
β βββ index.html # Dashboard UI
βββ kubernetes-deployment.yaml
npm install
node server.js
# Open http://localhost:9100docker build -t caritas-health-dashboard:latest .PORT- Server port (default: 9100)NODE_ENV- Environment (development/production)
Health dashboard can be monitored by SignOZ for alerting:
- Monitor dashboard uptime
- Track service health metrics
- Alert on service failures
Configure Nginx to proxy health dashboard:
location /health/ {
proxy_pass http://health-dashboard.caritas.svc.cluster.local:9001/;
}- Memory Storage - Health check history is stored in memory (cleared on restart)
- 60s Interval - Automated checks run every 60 seconds
- No Authentication - Dashboard has no built-in auth (secure via Nginx/network)
- Kubernetes-Aware - Can use Kubernetes service discovery
- Lightweight - Minimal dependencies, fast startup
- Default Port: 9100 (configurable)
- Production Port: 9001
- URL Pattern: http://:
- Current Access: http://91.99.219.182:9001/
Services must return JSON with status field:
{
"status": "UP" or "DOWN",
"components": {
"db": { "status": "UP" },
"diskSpace": { "status": "UP" }
}
}- Response Time: < 50ms per service
- Memory Usage: ~ 50MB
- CPU Usage: Minimal (< 1%)
- Concurrent Checks: All services checked in parallel
Status: Production Ready β
Port: 9001
Access: http://91.99.219.182:9001/