# PlantPlan – Architektur **Datum:** 16. April 2026 --- ## 1. Überblick PlantPlan ist eine hybride Webanwendung für technische Gleisplan-Skizzen. Das iPad dient als Eingabegerät (PWA im Safari), ein Python-Backend übernimmt Bibliotheksverwaltung, Normalisierung und Export. ``` ┌─────────────────────────┐ ┌─────────────────────────┐ │ client/ │ │ server/ │ │ (tldraw + React + Vite) │ HTTP │ (FastAPI + Python) │ │ │────────▶│ │ │ - Canvas & Zeichnung │ JSON │ - Symbolbibliothek │ │ - Custom Shapes │◀────────│ - Normalisierung │ │ - Snap-to-Grid │ │ - JSON/SVG Export │ └─────────────────────────┘ └─────────────────────────┘ ``` --- ## 2. Projektstruktur ``` plantplan/ ├── bin/ Skripte (setenv, install, activate) ├── cfg/ Konfigurationsdateien ├── client/ Frontend – wird auf Server deployed │ ├── src/ │ │ ├── main.tsx React Entry Point │ │ └── App.tsx tldraw Canvas │ ├── index.html │ ├── package.json │ ├── tsconfig.json │ └── vite.config.ts Dev-Proxy /api → localhost:8000 ├── server/ Backend – wird auf Server kopiert │ ├── catalog/ │ │ └── symbols.json Symbolbibliothek │ ├── main.py FastAPI Anwendung │ └── requirements.txt Python-Abhängigkeiten ├── doc/ Dokumentation ├── lib/ Python-Bibliotheken (eigene Module) ├── tests/ Tests └── examples/ Beispieldaten ``` --- ## 3. Client (Frontend) | Aspekt | Detail | |---|---| | Framework | React 18 + TypeScript | | Canvas | tldraw v2 | | Bundler | Vite | | Dev-Server | `localhost:5173` | | Build-Output | `client/dist/` (statische Dateien) | Der Vite Dev-Server leitet `/api/*`-Requests per Proxy an das lokale Backend weiter. Im Produktivbetrieb liefert nginx die statischen Dateien aus und proxied API-Calls. --- ## 4. Server (Backend) | Aspekt | Detail | |---|---| | Framework | FastAPI | | ASGI-Server | Uvicorn | | Python | >= 3.11 | | Dev-Server | `localhost:8000` | ### API-Endpunkte | Methode | Pfad | Beschreibung | |---|---|---| | GET | `/symbols` | Symbolbibliothek als JSON ausliefern | | POST | `/normalize` | Koordinaten auf Grid snappen | | POST | `/export` | Finales JSON/SVG-Projektfile erzeugen | ### Datenmodell (Request) ```json { "shapes": [ { "id": "shape:abc", "type": "weiche", "x": 100, "y": 200, "props": { "radius": 300, "direction": "left" } } ], "grid_size": 10 } ``` --- ## 5. Lokale Entwicklung Beide Komponenten laufen parallel auf einer Maschine: ``` Terminal 1 (Server): cd server pip install -r requirements.txt uvicorn main:app --reload Terminal 2 (Client): cd client npm install npm run dev ``` Kein externer Server nötig. Der Vite-Proxy sorgt dafür, dass Frontend und Backend nahtlos kommunizieren. --- ## 6. Deployment (Hetzner) Beim Deployment werden zwei Teile auf den Server kopiert: | Was | Wohin | Wie | |---|---|---| | `client/dist/` (nach `npm run build`) | nginx Document Root | Statische Dateien | | `server/` | Python-Umgebung | uvicorn hinter nginx reverse proxy | ``` nginx ├── / → client/dist/ (statische Dateien) └── /api/* → proxy_pass http://127.0.0.1:8000 ``` --- ## 7. Umgebungsvariablen (setenv.bat / setenv.sh) | Variable | Pfad | |---|---| | `PROJECT` | Projekt-Root | | `PV_CLIENT` | `client/` | | `PV_SERVER` | `server/` | | `PV_BIN` | `bin/` | | `PV_LIB` | `lib/` | | `PV_CFG` | `cfg/` | | `PV_DATA` | `data/` | | `PV_LOG` | `log/` | | `PV_RESULTS` | `results/` | | `PV_EXAMPLES` | `examples/` | | `PV_TESTS` | `tests/` |