eeg_portal/DEPLOYMENT.md
Bernhard Müller 975f76dbd3 feat(community): add metering data upload and query with XLSX support
Implement complete metering data management for energy communities:

- MeteringData entity with unique constraint (metering_point_id, interval_start, data_type)
- Bulk upload via JSON or XLSX (multipart) with validation
- XLSX parser using Apache POI with comma-decimal support
- Ownership check on GET endpoints (userId must match metering point owner)
- Deduplication: existing records overwritten on re-upload
- DataSource tracking (EMAIL_XLSX, API, MANUAL)
- Query endpoints: by metering point, by type, by upload batch

Additional fixes:
- MapStruct annotation processor: add to execution-level annotationProcessorPaths
  (Spring Boot parent POM was overriding plugin-level config)
- EnergyCommunityMapper + MeteringDataMapper: componentModel=spring
- UserMapper: ignore passwordResetToken/Expiry (unmapped target policy ERROR)
- TariffService: add TariffInviteRepository dependency + invitation check
- TariffServiceTest: add missing @Mock for TariffInviteRepository
- SecurityConfig: permit /actuator/health and /actuator/info
- pom.xml: add poi-ooxml, postgresql, spring-boot-starter-actuator
- .gitignore: add *.log, survey/, backend.log

Tests: 137/137 passing
2026-07-22 12:42:27 +02:00

2.6 KiB

EEG Portal - Deployment Guide

Quick Start (Local Development)

# Start with H2 database (default)
docker compose up -d

# Or with PostgreSQL
docker compose --profile postgres up -d

Production Deployment on Hetzner Cloud

1. Server erstellen

  1. Hetzner Cloud Console öffnen
  2. Neuen Server erstellen:
    • Image: Debian 12
    • Größe: CX22 (2 vCPU, 4 GB RAM) - ~€4,59/Monat
    • Standort: Falkenstein oder Nürnberg
    • SSH-Key: Hochladen (empfohlen)

2. Server vorbereiten

# Auf Server verbinden
ssh root@<server-ip>

# Server-Setup-Skript ausführen
bash setup-server.sh

3. Projekt deployen

# Projekt klonen
git clone <your-repo-url>
cd eeg_portal

# .env erstellen
cp .env.example .env
nano .env  # Werte eintragen

# Deploy starten
bash deploy.sh

4. SSL einrichten (optional)

# DNS muss auf Server-IP zeigen
bash setup-ssl.sh your-domain.at

Environment Variables

Variable Beschreibung Beispiel
JWT_SECRET JWT-Schlüssel (required) super-secret-key-123
APP_FRONTEND_URL Frontend-URL (required) https://eeg-portal.at
APP_BACKEND_URL Backend-URL (required) https://eeg-portal.at
CORS_ORIGINS Erlaubte Origins (required) https://eeg-portal.at
POSTGRES_DB Datenbank-Name eegportal
POSTGRES_USER Datenbank-User eeg
POSTGRES_PASSWORD Datenbank-Passwort (required) starkes-passwort
MAIL_HOST SMTP-Server smtp.gmail.com
MAIL_PORT SMTP-Port 587
MAIL_USERNAME SMTP-User admin@eeg-portal.at
MAIL_PASSWORD SMTP-Passwort app-passwort

Services

Service Port Beschreibung
Frontend 80/443 Nginx + Angular
Backend 8080 Spring Boot API
Database 5432 PostgreSQL 16

Nützliche Befehle

# Logs anzeigen
docker compose logs -f

# Nur Backend-Logs
docker compose logs -f backend

# Neustart
docker compose restart

# Update
git pull
docker compose up -d --build

# Backup
docker compose exec db pg_dump -U eeg eegportal > backup.sql

# Restore
docker compose exec -T db psql -U eeg eegportal < backup.sql

Troubleshooting

Datenbank-Verbindung fehlgeschlagen

# Prüfen ob PostgreSQL läuft
docker compose ps db

# Logs anzeigen
docker compose logs db

Backend startet nicht

# Backend-Logs
docker compose logs backend

# Prüfen ob JWT_SECRET gesetzt ist
docker compose exec backend env | grep JWT

SSL-Zertifikat abgelaufen

# Zertifikat erneuern
certbot renew
docker compose restart frontend