Skip to content

Janez76/propus-platform

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1,280 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Propus Platform

Die Propus Platform bündelt Buchungstool, Tour Manager und Firmenhomepage in einer Codebasis: gemeinsame Kundendaten, lokale Session-basierte Anmeldung und eine PostgreSQL-Datenbank.

Architektur

propus-platform/
├── app/            # Next.js 16 App (React 19, TypeScript, Tailwind v4) – primäres Admin-Frontend
├── platform/       # Zentraler Server (server.js): Booking + Tours, ein Port (3100)
│   └── frontend/   # Vite/React-SPA (Admin + Buchungs-Wizard, wird von platform ausgeliefert)
├── booking/        # Backend Buchungstool (Express) – API, RBAC, E-Mail, Kalender
├── tours/          # Tour Manager (Express), unter /tour-manager gemountet
├── core/           # Gemeinsame Migrationen, Migration Runner, Seed-Daten
├── auth/           # Auth-Hilfsfunktionen (Session-Store, Postgres-Sessions)
├── website/        # Firmenhomepage (Astro + Supabase)
├── infra/          # Hilfsskripte
├── scripts/        # Deploy-, Backup- und Utility-Skripte
├── docs/           # Zusätzliche Dokumentation
├── docker-compose.yml          # Lokale Entwicklungsumgebung
└── docker-compose.vps.yml      # Produktions-Deploy (VPS)

Hinweis: Wo sich nutzer- und admin-sichtbare Texte pflegen lassen, steht in docs/PLATTFORM-TEXTE-UND-ARCHITEKTUR.md.

Datenbank-Schemas

Schema Inhalt
core Gemeinsam: Kunden, Kontakte, Firmen, Auth-Bezüge
booking Aufträge, Fotografen, Produkte, Preise, RBAC
tour_manager Touren, Rechnungen, Portalnutzer, Vorschläge

Alle Module nutzen dieselbe Datenbank (propus) und setzen search_path, damit unqualifizierte SQL-Abfragen im richtigen Schema landen.

Frontend-Übersicht

Paket Tech-Stack Zweck
app/ Next.js 16, React 19, Tailwind v4 Primäres Admin-Frontend (Kunden, Aufträge, Kalender, Exxas, …)
website/ Astro + Supabase Öffentliche Firmenhomepage mit Produkt-Katalog-API

Schnellstart (Docker, lokal)

Voraussetzung: Docker Compose v2 im Projektroot.

# 1. Umgebung anlegen und anpassen
cp .env.example .env

# 2. Datenbank starten
docker compose up -d postgres

# 3. SQL-Migrationen ausführen
docker compose --profile migrate run --rm migrate

# 4. Zentrale Plattform (Booking + Tour Manager, ein Prozess)
docker compose up -d platform

Standard-Hostports (über Variablen in .env änderbar):

Dienst Host (Default) Hinweis
Plattform (SPA, API, Tour Mgr) http://localhost:3100 BOOKING_PORT; Container intern auf 3000
Tour Manager (EJS) http://localhost:3100/tour-manager/admin gleicher Container
Health-Check http://localhost:3100/api/core/health Prüft DB-Verbindung
PostgreSQL (Propus) localhost:5435 PROPUS_PG_PORT

Next.js App lokal starten (separater Dev-Server, zeigt auf platform-API):

cd app
npm install
npm run dev   # http://localhost:3000

Optional: Legacy-Container separat:

docker compose --profile legacy-services up -d booking tours

Migrationen

Alle SQL-Migrationen liegen unter core/migrations/ (gemeinsame Schemas) und booking/migrations/ (Booking-spezifisch). Der Runner core/migrate.js führt sie in Reihenfolge aus:

docker compose --profile migrate run --rm migrate

Der Runner wendet nur noch nicht in core.applied_migrations eingetragene *.sql-Dateien an (alphabetische Reihenfolge). Booking-Migrationen laufen separat über booking/migrations/ (siehe Booking-Doku).

Hinweis Finanzen / Rechnungen (2026): 036_renewal_invoices_payment_fields.sql ergänzt tour_manager.renewal_invoices um paid_at_date, payment_channel, skonto_chf, writeoff (im Admin: «Betreibung eingeleitet»), writeoff_reason. Nach Deploy läuft die Migration automatisch mit, sofern der VPS-Deploy den Schritt docker compose … --profile migrate run --rm migrate ausführt (siehe scripts/deploy-remote.sh). Manuell auf dem Server dasselbe Kommando mit gültiger DATABASE_URL in .env.vps.


Deploy (VPS)

VPS: 87.106.24.107 | Projektpfad: /opt/propus-platform | Port: 3100

Schnell-Deploy (empfohlen, lokal)

.\scripts\deploy-vps.ps1 -VpsHost 87.106.24.107 -User root -SkipBackup -SkipSwitch -SkipCloudflarePurge

Bei blockierter PowerShell-Execution-Policy:

powershell.exe -NoProfile -ExecutionPolicy Bypass -File ".\scripts\deploy-vps.ps1" -VpsHost 87.106.24.107 -User root -SkipBackup -SkipSwitch -SkipCloudflarePurge

deploy-vps.ps1 packt den Code als tar.gz, lädt ihn hoch, baut migrate und platform neu und führt den Health-Check aus.

GitHub Actions CI/CD

Automatischer Deploy nach Push auf master (Workflow: .github/workflows/deploy-vps-and-booking-smoke.yml):

  1. Build Next.js – Type-Check + Build der app/
  2. Deploy to VPS – Upload + Docker-Build + Migrationen + Health-Check + Cloudflare-Purge
  3. Smoke Tests – Nur bei manuellem Trigger (run_smoke)
Auslöser Jobs
Push auf master Build Next.js → Deploy (automatisch)
Manuell Build Next.js → Deploy + ggf. Smoke

Details und Secrets-Setup: docs/BOOKING-E2E-DEPLOY.md

Cloudflare-Hostnames

Diese zeigen auf http://127.0.0.1:3100 (ohne vollständige Liste — siehe docs/VPS-BETRIEB.md):

Hostname Zweck
booking.propus.ch Öffentlicher Buchungs-Wizard
admin-booking.propus.ch Admin-SPA
portal.propus.ch Kunden-Login / Passwort-Reset (PORTAL_BASE_URL)
api-booking.propus.ch API + Auth-Endpunkte

Logs & Health auf dem VPS

# Health-Check
ssh -i "C:\Users\svajc\.ssh\id_ed25519_propus_vps" -o IdentitiesOnly=yes root@87.106.24.107 `
  "curl -fsS http://127.0.0.1:3100/api/core/health"

# Logs (live)
ssh -i "C:\Users\svajc\.ssh\id_ed25519_propus_vps" -o IdentitiesOnly=yes root@87.106.24.107 `
  "docker logs propus-platform-platform-1 --tail 100 -f"

Versionierung

Vor jedem Deploy die Build-Nummer in scripts/bump-deploy-version.ps1 erhöhen. Nicht mit derselben Nummer erneut deployen.


Weiterarbeit auf einem anderen Rechner

  1. Repository klonen (bei Netzlaufwerk ggf. git config --global --add safe.directory "Z:/propus-platform").
  2. .env aus .env.example erzeugen und anpassen.
  3. docker compose up -d postgresdocker compose --profile migrate run --rm migratedocker compose up -d platform.
  4. Kurztest: http://localhost:3100 (SPA) und http://localhost:3100/api/core/health.

Hinweis: core/dumps/ (SQL-Dumps) sind per .gitignore ausgeschlossen.


Weitere Dokumentation

Datei Inhalt
docs/FLOWS_AUTH.md Auth-Flows: Unified Login, Session-Bridge, Magic-Link, Passwort-Reset
docs/FLOWS_BOOKING.md Buchungs-Flows, Status-Übergänge, Kalender-Sync
docs/FLOWS_TOURS.md Tour-Manager-Flows, Matterport, Portal, Cleanup
docs/ROLES_PERMISSIONS.md RBAC, Rollen, Permissions
docs/VPS-BETRIEB.md VPS-Setup, Backup/Restore
docs/BOOKING-E2E-DEPLOY.md GitHub Actions Secrets, Playwright Smoke Tests
docs/FIRMENHOMEPAGE-KATALOG-API.md Website-Katalog-API
docs/ADMIN-FRONTEND-DESIGN.md Design-System, Theme, Komponenten
docs/PLATTFORM-TEXTE-UND-ARCHITEKTUR.md Texte und Seiten-Architektur

About

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors