Die Propus Platform bündelt Buchungstool, Tour Manager und Firmenhomepage in einer Codebasis: gemeinsame Kundendaten, lokale Session-basierte Anmeldung und eine PostgreSQL-Datenbank.
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.
| 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.
| 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 |
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 platformStandard-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:3000Optional: Legacy-Container separat:
docker compose --profile legacy-services up -d booking toursAlle 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 migrateDer 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.
VPS: 87.106.24.107 | Projektpfad: /opt/propus-platform | Port: 3100
.\scripts\deploy-vps.ps1 -VpsHost 87.106.24.107 -User root -SkipBackup -SkipSwitch -SkipCloudflarePurgeBei blockierter PowerShell-Execution-Policy:
powershell.exe -NoProfile -ExecutionPolicy Bypass -File ".\scripts\deploy-vps.ps1" -VpsHost 87.106.24.107 -User root -SkipBackup -SkipSwitch -SkipCloudflarePurgedeploy-vps.ps1 packt den Code als tar.gz, lädt ihn hoch, baut migrate und platform neu und führt den Health-Check aus.
Automatischer Deploy nach Push auf master (Workflow: .github/workflows/deploy-vps-and-booking-smoke.yml):
- Build Next.js – Type-Check + Build der
app/ - Deploy to VPS – Upload + Docker-Build + Migrationen + Health-Check + Cloudflare-Purge
- 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
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 |
# 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"Vor jedem Deploy die Build-Nummer in scripts/bump-deploy-version.ps1 erhöhen. Nicht mit derselben Nummer erneut deployen.
- Repository klonen (bei Netzlaufwerk ggf.
git config --global --add safe.directory "Z:/propus-platform"). .envaus.env.exampleerzeugen und anpassen.docker compose up -d postgres→docker compose --profile migrate run --rm migrate→docker compose up -d platform.- Kurztest:
http://localhost:3100(SPA) undhttp://localhost:3100/api/core/health.
Hinweis: core/dumps/ (SQL-Dumps) sind per .gitignore ausgeschlossen.
| 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 |