Zum Inhalt

Grafana Enterprise Dashboard - Administrator Guide

🎯 Phase 1 Deployment - Complete

✅ Was wurde implementiert:

  1. Grafana OSS (latest) - Open Source, keine Lizenzkosten
  2. Prometheus (latest) - Metrics-Sammlung (90 Tage Retention)
  3. PostgreSQL Datasource - Direkter Zugriff auf solarlog_db
  4. Auto-Provisioning - Datasources & Dashboards automatisch geladen
  5. 6 Dashboard Panels:
  6. Current Total Power (Gauge)
  7. Today's Energy Production (Gauge)
  8. Power Production Last 24h (Time Series)
  9. Inverter Status Table
  10. Daily Energy Last 30 Days (Stacked Bars)
  11. Online Status Indicators (Stat Panels)
  12. Cloudflare Tunnel - Externe Erreichbarkeit via grafana.solarlog.karma.organic
  13. User Documentation - Vollständiges Benutzerhandbuch (GRAFANA_USER_MANUAL.md)

📁 Dateistruktur:

solarlog_20251022/
├── docker-compose.yml                    # Grafana + Prometheus Services
├── grafana/
│   ├── provisioning/
│   │   ├── datasources/
│   │   │   └── solarlog.yml            # PostgreSQL Auto-Config
│   │   └── dashboards/
│   │       └── solarlog.yml            # Dashboard Auto-Loader
│   └── dashboards/
│       └── solar-pv-enterprise.json    # Haupt-Dashboard
├── prometheus/
│   └── prometheus.yml                   # Prometheus Scrape Config
├── deployment/
│   ├── cloudflare/
│   │   └── tunnel-config.yml           # Tunnel mit Grafana-Route
│   └── scripts/
│       ├── setup-grafana-dns.sh        # DNS-Setup für Grafana
│       └── restart-tunnel.sh           # Tunnel-Neustart
└── docs/
    ├── GRAFANA_SETUP.md                # Setup-Anleitung
    ├── GRAFANA_USER_MANUAL.md          # Benutzerhandbuch
    └── ENTERPRISE_UPGRADE_ANALYSIS.md  # Vollständige Analyse (4 Phasen)

🚀 Deployment

Lokaler Start:

cd /Users/gm/Documents/XCITE_DEV_DOCKER/solarlog_20251022

# 1. Grafana-DB erstellen (nur einmal!)
docker compose exec postgres psql -U solarlog -d solarlog_db -c "CREATE DATABASE grafana_db;"

# 2. Grafana + Prometheus starten
docker compose up -d grafana prometheus

# 3. Status prüfen
docker compose ps grafana prometheus
docker compose logs -f grafana

# 4. Zugriff
# Local: http://localhost:3001
# Login: admin / solarlog_grafana_2024

Cloudflare Tunnel Setup:

# 1. DNS-Route hinzufügen
./deployment/scripts/setup-grafana-dns.sh

# 2. Tunnel neu starten (mit neuer Config)
./deployment/scripts/restart-tunnel.sh

# 3. Warten (1-2 Minuten DNS-Propagierung)

# 4. Testen
curl -I https://grafana.solarlog.karma.organic

# 5. Browser öffnen
open https://grafana.solarlog.karma.organic

🔧 Konfiguration

Umgebungsvariablen:

In docker-compose.yml:

environment:
  - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_ADMIN_PASSWORD:-solarlog_grafana_2024}
  - GF_SERVER_ROOT_URL=https://grafana.solarlog.karma.organic
  - GF_DATABASE_TYPE=postgres  # Grafana Metadata in PostgreSQL

Passwort ändern:

# 1. .env erstellen/bearbeiten
echo "GRAFANA_ADMIN_PASSWORD=your_secure_password" >> .env

# 2. Grafana neu starten
docker compose restart grafana

Datasource-Konfiguration:

Datei: grafana/provisioning/datasources/solarlog.yml

datasources:
  - name: SolarLog PostgreSQL
    type: postgres
    url: postgres:5432
    database: solarlog_db
    user: solarlog
    secureJsonData:
      password: 'solarlog_password'
    isDefault: true

Wichtig: Password in Produktion ändern!

Dashboard-SQL-Queries:

Alle Queries nutzen production_data Tabelle:

Total Power (aktuell):

SELECT 
  COALESCE(SUM(pd.current_power), 0) / 1000.0 as "Total Power (kW)"
FROM production_data pd
JOIN inverters i ON pd.inverter_id = i.id
WHERE i.enabled = true
  AND pd.timestamp = (
    SELECT MAX(timestamp) FROM production_data WHERE inverter_id = i.id
  )

Online Status:

-- Online = Daten jünger als 2 Minuten
CASE 
  WHEN timestamp > NOW() - INTERVAL '2 minutes' THEN 'Online' 
  ELSE 'Offline' 
END

🛡️ Sicherheit

Zugriffskontrolle:

  1. Admin-Passwort ändern (siehe oben)
  2. Viewer-Accounts erstellen:
    Grafana UI → Administration → Users → New user
    Role: Viewer (nur lesen, keine Änderungen)
    
  3. Anonymous Access deaktiviert (Standard)
  4. Cloudflare Tunnel = automatisches SSL/TLS

Backup:

Dashboard-Export:

# In Grafana UI:
# Settings (⚙️) → JSON Model → Copy to clipboard
# Paste in: grafana/dashboards/backup-YYYYMMDD.json

Grafana-Datenbank-Backup:

docker compose exec postgres pg_dump -U solarlog grafana_db > grafana_db_backup.sql

Restore:

docker compose exec -T postgres psql -U solarlog grafana_db < grafana_db_backup.sql

📊 Monitoring

Grafana-Logs:

# Live-Logs
docker compose logs -f grafana

# Letzte 100 Zeilen
docker compose logs --tail=100 grafana

# Fehler filtern
docker compose logs grafana | grep -i error

Prometheus-Metriken:

# Prometheus UI öffnen
open http://localhost:9090

# Queries testen:
# - up{job="solarlog-backend"}  → Backend Status
# - up{job="prometheus"}         → Prometheus Self-Check

Healthchecks:

# Grafana Health
curl http://localhost:3001/api/health

# Erwartete Antwort:
# {"commit":"...","database":"ok","version":"..."}

# PostgreSQL Connection
docker compose exec grafana curl -s http://localhost:3000/api/datasources/proxy/1/health

🔄 Updates

Grafana-Update:

# 1. Backup erstellen!
docker compose exec postgres pg_dump -U solarlog grafana_db > grafana_backup_$(date +%Y%m%d).sql

# 2. Dashboard JSON exportieren
# (siehe Backup-Sektion)

# 3. docker-compose.yml anpassen:
#    image: grafana/grafana-oss:11.0.0  # Neue Version

# 4. Container neu erstellen
docker compose pull grafana
docker compose up -d --force-recreate grafana

# 5. Logs prüfen
docker compose logs -f grafana

# 6. Testen
open http://localhost:3001

Dashboard-Update:

# 1. JSON bearbeiten:
nano grafana/dashboards/solar-pv-enterprise.json

# 2. Grafana neu laden (holt neue JSON)
docker compose restart grafana

# 3. Browser-Cache leeren (Strg+F5)

# Alternative: UI-basiertes Update
# Dashboard → Settings → JSON Model → Paste & Save

🐛 Troubleshooting

Problem: Dashboard zeigt keine Daten

Diagnose:

# 1. Prüfe Datasource
docker compose exec grafana curl -s http://localhost:3000/api/datasources

# 2. Teste PostgreSQL-Verbindung
docker compose exec grafana curl -s http://localhost:3000/api/datasources/proxy/1/health

# 3. Prüfe Daten in DB
docker compose exec postgres psql -U solarlog -d solarlog_db -c "SELECT COUNT(*) FROM production_data WHERE timestamp > NOW() - INTERVAL '1 hour';"

Lösungen: - Datasource neu provisionieren: docker compose restart grafana - PostgreSQL-Password prüfen in grafana/provisioning/datasources/solarlog.yml - Netzwerk prüfen: docker compose exec grafana ping postgres

Problem: Grafana startet nicht

Diagnose:

# Logs anschauen
docker compose logs grafana | tail -50

# Häufige Fehler:
# - "database grafana_db does not exist" → DB erstellen (siehe Deployment)
# - "permission denied" → Volumes-Permission prüfen
# - "port already in use" → Anderer Service auf Port 3001?

Lösungen:

# DB erstellen
docker compose exec postgres psql -U solarlog -d solarlog_db -c "CREATE DATABASE grafana_db;"

# Volumes zurücksetzen (ACHTUNG: Datenverlust!)
docker compose down
docker volume rm solarlog-grafana-data
docker compose up -d grafana

# Port ändern (docker-compose.yml):
# ports: "3002:3000"  # Statt 3001

Problem: "Cannot connect to server"

Cloudflare Tunnel prüfen:

# Tunnel läuft?
pgrep -f cloudflared

# Tunnel-Logs
tail -f /tmp/cloudflared.log

# DNS-Auflösung
nslookup grafana.solarlog.karma.organic

# Tunnel neu starten
./deployment/scripts/restart-tunnel.sh

📈 Performance-Tuning

Query-Optimierung:

Wenn Dashboard langsam lädt:

  1. Zeitbereich begrenzen:

    -- Statt:
    WHERE timestamp > NOW() - INTERVAL '30 days'
    -- Besser:
    WHERE timestamp > NOW() - INTERVAL '7 days'
    

  2. Aggregation nutzen:

    -- Für lange Zeiträume:
    SELECT 
      DATE_TRUNC('hour', timestamp) AS time,  -- Stündlich statt Sekunden
      AVG(current_power) / 1000.0 as value
    FROM production_data
    WHERE timestamp > NOW() - INTERVAL '30 days'
    GROUP BY time
    ORDER BY time
    

  3. Indizes prüfen:

    -- In PostgreSQL:
    \d production_data
    -- Sollte haben:
    -- - ix_production_data_timestamp
    -- - ix_production_inverter_timestamp
    

Prometheus-Retention anpassen:

In docker-compose.yml:

prometheus:
  command:
    - '--storage.tsdb.retention.time=180d'  # 180 Tage statt 90

🎓 Best Practices

1. Regelmäßige Backups

# Cron-Job erstellen (täglich 3:00 Uhr)
0 3 * * * docker compose -f /path/to/docker-compose.yml exec postgres pg_dump -U solarlog grafana_db > /backups/grafana_$(date +\%Y\%m\%d).sql

2. Monitoring einrichten

  • Uptime-Checks für https://grafana.solarlog.karma.organic
  • Alert bei Grafana-Ausfall
  • Disk-Space-Monitoring (Prometheus-Daten wachsen!)

3. Dokumentation aktualisieren

  • Dashboard-Änderungen dokumentieren
  • Neue Queries in Git committen
  • User Manual bei Features updaten

4. Staging-Umgebung

# Kopie für Tests:
cp docker-compose.yml docker-compose.staging.yml
# Ports ändern: 3001 → 3003
# Starten: docker compose -f docker-compose.staging.yml up -d

🚀 Nächste Phasen

Phase 3: Battery Management (3-4 Tage)

  • Battery-Tabelle in PostgreSQL
  • Battery-API-Endpoints
  • Grafana-Panels für Batteriedaten
  • SOC, Lade-/Entladeleistung

Phase 4: Backup System (2-3 Tage)

  • WAL-Archivierung
  • Automatische Backups
  • Disaster Recovery

Phase 2: NixOS Pi Image (5-7 Tage)

  • Produktions-Image für Raspberry Pi 5
  • LVGL Touchscreen UI
  • Pre-loaded mit allen Daten

📞 Support

Internal: - Dokumentation: /docs/ - Issues: Git-Repository - Team: Slack #solarlog-enterprise

External (für Kunden): - User Manual: docs/GRAFANA_USER_MANUAL.md - Support-Mail: support@karma.organic


Version: 1.0.0 - Phase 1 Complete ✅
Deployment Date: 24. Oktober 2025
Next Review: Phase 3 Start