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

129 lines
2.6 KiB
Markdown

# EEG Portal - Deployment Guide
## Quick Start (Local Development)
```bash
# 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
```bash
# Auf Server verbinden
ssh root@<server-ip>
# Server-Setup-Skript ausführen
bash setup-server.sh
```
### 3. Projekt deployen
```bash
# 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)
```bash
# 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
```bash
# 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
```bash
# Prüfen ob PostgreSQL läuft
docker compose ps db
# Logs anzeigen
docker compose logs db
```
### Backend startet nicht
```bash
# Backend-Logs
docker compose logs backend
# Prüfen ob JWT_SECRET gesetzt ist
docker compose exec backend env | grep JWT
```
### SSL-Zertifikat abgelaufen
```bash
# Zertifikat erneuern
certbot renew
docker compose restart frontend
```