- 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
21 lines
652 B
Docker
21 lines
652 B
Docker
# Hinterstein Mieterportal – API-Container (Node + PostgreSQL-Client)
|
||
# Build: docker compose build mp-api
|
||
# Die Datenbank läuft als eigener Service (mp-db) im selben Compose-Projekt.
|
||
|
||
FROM node:20-alpine AS deps
|
||
WORKDIR /app
|
||
COPY package.json package-lock.json* ./
|
||
RUN npm ci --omit=dev --no-audit --no-fund
|
||
|
||
FROM node:20-alpine
|
||
ENV NODE_ENV=production
|
||
WORKDIR /app
|
||
COPY --from=deps /app/node_modules ./node_modules
|
||
COPY package.json ./
|
||
COPY src ./src
|
||
COPY seed ./seed
|
||
EXPOSE 3000
|
||
HEALTHCHECK --interval=30s --timeout=5s --start-period=15s \
|
||
CMD wget -qO- http://localhost:3000/api/healthz >/dev/null 2>&1 || exit 1
|
||
CMD ["node", "src/index.js"]
|