Werkzeuge für den automatischen Download, den Datenbankimport und die Konvertierung des Marktstammdatenregisters der Bundesnetzagentur. Diese Werkzeuge sind die Datengrundlage und damit notwendig für den Betrieb der mastr-app.
Die mastr-app kann unter https://mastr.nachtsieb.de ausprobiert werden.
mastr-tool lädt die Marktstammdatenregister-Daten der Bundesnetzagentur herunter, importiert sie in eine
PostgreSQL-Datenbank, reichert sie an und konvertiert sie in handhabbare Formate. Die Architektur ist in zwei Bereiche
geteilt:
mastr-tool– das Backend. Führt den Scheduler aus, der die Pipeline betreibt: Dump-Download, DB-Import, Anreicherung und CSV-/Parquet-/Excel-Export. Die Ergebnisse stellt es über den Servicemastr-staticvia http bereit.mastr-app– das Frontend. Eine WebUI, die die exportierten Daten visualisiert. Sie greift aufmastr-staticzu, um die konvertierten Dateien zu laden.
- Dump-Download: Der Scheduler prüft alle 30 Minuten, ob ein aktualisierter MaStR-Dump bei der Bundesnetzagentur vorliegt. Nur dann wird neu heruntergeladen und die Konvertierung durchgeführt.
- DB-Import: Die riesigen XML-Dateien des Dumps werden in PostgreSQL importiert.
- Enrichment: Für alle Einheiten mit Koordinaten werden UTM-Koordinaten berechnet und in der Datenbank ergänzt (Zone, Ostwert, Nordwert). Bereits berechnete Koordinaten werden zwischengespeichert, um Rechenzeit bei zukünftigen Konvertierungen zu sparen.
- Export: Die angereicherten Daten werden konvertiert in:
- CSV
- Parquet
- Excel (
.xlsx, nicht für Solar, da zu groß)
- Docker mit Compose-Plugin
- Mindestens 70 GiB freier Speicher – der größte Anteil entfällt auf den unkomprimierten MaStR-Dump (aktuell ca. 60 GiB, wächst über die Zeit).
Man legt eine .env neben der docker-compose.yaml an:
# Cache-Verzeichnis (Dump, entpackte XML-Dateien, Enricher-Cache)
MASTR_CACHE_DIR=/pfad/zum/cache
# Export-Verzeichnis (CSV-, Parquet- und Excel-Exporte)
MASTR_OUTPUT_DIR=/pfad/zum/exportEs gibt zwei Compose-Dateien für unterschiedliche Anwendungsfälle:
| Datei | Services | Anwendung |
|---|---|---|
docker-compose.yaml |
mastr-tool, db, mastr-static, mastr-app |
Vollbetrieb inkl. WebUI |
docker-compose.convert.yaml |
mastr-tool, db |
Nur (regelmäßige) Konvertierung ohne web-app und http-Zugriff auf exportierte Daten |
docker compose -f docker-compose.yaml up -d --buildStartet alle Services. Die WebUI ist unter 127.0.0.1:8081 erreichbar, die exportierten Dateien unter 127.0.0.1:8080.
docker compose -f docker-compose.convert.yaml up -d --buildStartet nur mastr-tool und db. Die Exporte landen im
konfigurierten MASTR_OUTPUT_DIR. Ohne mastr-static und mastr-app gibt es keinen Webserver-Zugriff auf die
Dateien – sie liegen direkt im gemounteten Verzeichnis. Auch hier wird alle 30 Minuten geprüft, ob ein neuer Dump bei
der Bundesnetzagentur vorliegt.
docker compose -f docker-compose.convert.yaml logs -f mastr-toolmastr-tool wird über das Helm-Chart in charts/mastr-tool deployt. Es bringt den
Backend-Scheduler (mastr-tool), den http-Server für die Exporte (mastr-static) und eine eigenständige
PostgreSQL-Datenbank mit. Nicht enthalten ist mastr-app – die WebUI besitzt ein eigenes Helm-Chart
im mastr-app-Repository und wird separat installiert.
- Kubernetes-Cluster mit einem Ingress-Controller
helm>= 3- Eine
StorageClass, dieReadWriteManyunterstützt (für dasoutput-PVC, damitmastr-staticdie vonmastr-toolgeschriebenen Exporte lesen kann). Alternativ beide Pods über Affinity auf denselben Knoten legen undReadWriteOnceverwenden.
# Chart-Abhängigkeiten (falls vorhanden) aktualisieren
helm dependency build charts/mastr-tool
# Eigene Werte anpassen (siehe Minimal-Beispiel unten) und installieren
helm install mastr charts/mastr-tool -n mastr --create-namespace -f my-values.yamlhelm upgrade mastr charts/mastr-tool -n mastr -f my-values.yamlmastrTool:
image:
repository: nachtsieb/mastr-tool
tag: latest
forceUsingExistingDump: false
resources: {}
mastrStatic:
enabled: true
image:
repository: nachtsieb/mastr-static
tag: latest
service:
type: ClusterIP
port: 8080
ingress:
enabled: true
className: "" # leer = Cluster-Default-Ingress-Class
annotations: {}
hosts:
- host: mastr-static.example.com
paths:
- path: /
pathType: Prefix
database:
mode: standalone
port: 5432
standalone:
image:
repository: postgres
tag: "18"
user: mastr
password: "change-me-please"
name: mastr
storage: 50Gi
storageClassName: ""
resources: {}
persistence:
cache:
size: 80Gi
storageClassName: ""
accessModes: [ReadWriteOnce]
output:
size: 20Gi
storageClassName: "" # musst be RWX StorageClass
accessModes: [ReadWriteMany]