# Hinterstein Mieterportal – Portal-Stack auf hocks.eu # TLS + Subdomain liefert der Nginx Proxy Manager (npm_default-Netz). # 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: image: nginx:1.27-alpine container_name: mp-portal restart: unless-stopped volumes: - ./dist:/usr/share/nginx/html:ro # envsubst ersetzt ${MAIL_API_TOKEN} beim Start aus portal.env - ./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: