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
129 lines
2.6 KiB
Markdown
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
|
|
```
|