v1.3: Serverseitige Datenbank (PostgreSQL + Node-API) ersetzt localStorage

- server/: Express-API (Auth, Bootstrap, Tickets, Threads, Benutzerverwaltung, Codes)
  mit pg-Schema (11 Tabellen), idempotem Seed (50 Wohnungen, 552 Buchungen)
- mp-db (PostgreSQL 16, Volume mp_pgdata) + mp-api im Compose-Stack,
  nginx proxiet /api/ an mp-api; deploy.sh baut API-Image auf dem Server
- Frontend: Store laedt /api/bootstrap, Schreibzugriff async, kein localStorage
  mehr (ausser Theme), Ladebildschirm beim Session-Check, vite-Proxy fuer Dev
- Rollenrechte serverseitig: Mieter nur eigene Wohnung (getestet, 403-Verweis)
- Mail-Benachrichtigungen komplett serverseitig (server/src/mail.js)
- beispieldaten.py schreibt server/seed/generated.json; Verwaltungs-Mail = axel@hocks.eu
- E2E live verifiziert: Login, Scoping, Ticket + Zustellung (status=sent),
  Registrierung, Codes; Testdaten bereinigt; Doku nachgefuehrt
This commit is contained in:
2026-10-02 12:54:44 +02:00
parent 5503ce5fc5
commit 311153b3c3
26 changed files with 8873 additions and 894 deletions
+48 -2
View File
@@ -1,6 +1,15 @@
# Hocks Mieterportal – Portal-Container (statisches Frontend hinter NPM)
# Hinterstein Mieterportal – Portal-Stack auf hocks.eu
# TLS + Subdomain liefert der Nginx Proxy Manager (npm_default-Netz).
# Deploy: ./deploy.sh baut dist/ lokal und lädt es auf den Server.
# Deploy: ./deploy.sh baut dist/ + API-Image und lädt alles auf den Server.
#
# Dienste:
# mp-portal nginx, statisches dist/ (SPA), proxiet /api/ → mp-api
# und POST /api/mail/send → mp-mail-api (Token aus portal.env)
# mp-api Node-API (Express + PostgreSQL-Client), baut sich aus ./server
# mp-db PostgreSQL 16 (persistiertes Volume mp_pgdata)
#
# portal.env (nur auf dem Server, gitignored) liefert:
# MAIL_API_TOKEN, POSTGRES_PASSWORD
services:
mp-portal:
@@ -13,9 +22,46 @@ services:
- ./docker/templates/default.conf.template:/etc/nginx/templates/default.conf.template:ro
env_file:
- portal.env
depends_on:
- mp-api
networks:
- npm_default
mp-api:
build: ./server
container_name: mp-api
restart: unless-stopped
environment:
DATABASE_URL: postgres://mp:${POSTGRES_PASSWORD}@mp-db:5432/mieterportal
MAIL_API_URL: http://mp-mail-api:8080
MAIL_API_TOKEN: ${MAIL_API_TOKEN}
PORT: 3000
depends_on:
- mp-db
networks:
- npm_default
mp-db:
image: postgres:16-alpine
container_name: mp-db
restart: unless-stopped
environment:
POSTGRES_USER: mp
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: mieterportal
volumes:
- mp_pgdata:/var/lib/postgresql/data
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U mp -d mieterportal']
interval: 10s
timeout: 5s
retries: 5
networks:
- npm_default
networks:
npm_default:
external: true
volumes:
mp_pgdata: