API updadte
This commit is contained in:
881
README.md
881
README.md
@@ -1,841 +1,154 @@
|
|||||||
# Immorechner
|
# Immorechner
|
||||||
|
|
||||||
Eine moderne Webanwendung zur Immobilienberechnung, entwickelt mit Symfony 7.3, PHP 8.4 und MariaDB.
|
Eine moderne Webanwendung zur Immobilienberechnung mit interaktivem Frontend und vollständiger REST-API.
|
||||||
|
|
||||||
|
## Schnellstart
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Repository klonen
|
||||||
|
git clone <repository-url>
|
||||||
|
cd immorechner
|
||||||
|
|
||||||
|
# Docker-Container starten
|
||||||
|
docker-compose up -d --build
|
||||||
|
|
||||||
|
# Dependencies installieren
|
||||||
|
docker-compose exec web composer install
|
||||||
|
|
||||||
|
# Datenbank initialisieren
|
||||||
|
docker-compose exec web php bin/console doctrine:migrations:migrate --no-interaction
|
||||||
|
|
||||||
|
# Anwendung öffnen
|
||||||
|
# Frontend: http://localhost:8080
|
||||||
|
# API-Docs: http://localhost:8080/api/docs.html
|
||||||
|
# phpMyAdmin: http://localhost:8081
|
||||||
|
```
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
- **REST-API**: Vollständige REST-API mit API Platform 4.2
|
### Frontend (Web-Interface)
|
||||||
- **API-Key-Authentifizierung**: Sichere Authentifizierung über eindeutige API-Keys
|
- 🧮 **Interaktiver Immobilienrechner** mit Live-Berechnungen
|
||||||
- **Rollenbasierte Zugriffskontrolle**: USER, ADMIN, MODERATOR mit feingranularen Berechtigungen
|
- 🔗 **URL-Sharing** für anonyme Nutzer (keine Registrierung nötig)
|
||||||
- **Swagger/OpenAPI**: Automatische interaktive API-Dokumentation (Swagger UI)
|
- 👤 **Benutzer-Registrierung & Login**
|
||||||
- **Web-Interface**: Benutzerfreundliche Weboberfläche mit Twig-Templates
|
- 💾 **Immobilien speichern** (nur für registrierte Nutzer)
|
||||||
- **Immobilien-Management**: Vollständige CRUD-Operationen mit automatischen Berechnungen
|
- 📊 **Automatische Berechnungen**: Grunderwerbsteuer, Gesamtkosten, Abschreibung, etc.
|
||||||
- **Mandantenfähigkeit**: Jeder User sieht nur seine eigenen Immobilien (außer Admins)
|
- 📱 **Responsive Design** (Mobile-optimiert)
|
||||||
- **Öffentliche Ressourcen**: Bundesländer und Heizungstypen ohne Authentifizierung abrufbar
|
|
||||||
- **Docker-Setup**: Vollständig containerisierte Entwicklungsumgebung
|
|
||||||
- **Datenbank-Migrationen**: Versionskontrollierte Datenbankschema-Verwaltung mit Doctrine
|
|
||||||
- **Testing**: Umfassende Test-Suite mit PHPUnit für Unit- und Funktions-Tests
|
|
||||||
- **Code Quality**: PHP-CS-Fixer für konsistenten Code-Style nach Symfony Standards
|
|
||||||
- **CORS-Unterstützung**: Konfigurierbare CORS-Einstellungen für API-Zugriffe
|
|
||||||
- **phpMyAdmin**: Integriertes Datenbank-Verwaltungstool
|
|
||||||
|
|
||||||
## Technologie-Stack
|
### Backend (REST-API)
|
||||||
|
- 🔌 **Vollständige REST-API** mit API Platform 4.2
|
||||||
|
- 🔐 **Dual-Authentifizierung**: Session-basiert (Frontend) & API-Key (API)
|
||||||
|
- 🔑 **Rollenbasierte Zugriffskontrolle**: USER, ADMIN, MODERATOR, TECHNICAL
|
||||||
|
- 📖 **Swagger/OpenAPI** Dokumentation
|
||||||
|
- 🏢 **Mandantenfähigkeit**: Jeder User sieht nur seine eigenen Immobilien
|
||||||
|
- 🌍 **Öffentliche Ressourcen**: Bundesländer und Heizungstypen ohne Authentifizierung
|
||||||
|
|
||||||
- **Backend**: PHP 8.4
|
### Technologie
|
||||||
- **Framework**: Symfony 7.3
|
- **Backend**: PHP 8.4, Symfony 7.3
|
||||||
- **Datenbank**: MariaDB (Latest)
|
- **Frontend**: Twig, jQuery, separates CSS/JS
|
||||||
|
- **Datenbank**: MariaDB
|
||||||
|
- **Container**: Docker & Docker Compose
|
||||||
- **ORM**: Doctrine 3.0
|
- **ORM**: Doctrine 3.0
|
||||||
- **API**: API Platform 4.2
|
- **API**: API Platform 4.2
|
||||||
- **Template Engine**: Twig 3.22
|
|
||||||
- **Webserver**: Apache 2.4 mit mod_rewrite
|
|
||||||
- **Container**: Docker & Docker Compose
|
|
||||||
- **Datenbank-Tool**: phpMyAdmin
|
|
||||||
|
|
||||||
## Voraussetzungen
|
## Dokumentation
|
||||||
|
|
||||||
- Docker Desktop (Windows/Mac) oder Docker Engine + Docker Compose (Linux)
|
📚 **Detaillierte Dokumentation:**
|
||||||
- Git
|
|
||||||
|
|
||||||
## Installation
|
- **[Installation & Setup](docs/installation.md)** - Schritt-für-Schritt Installationsanleitung
|
||||||
|
- **[Features & Funktionalität](docs/features.md)** - Übersicht aller Funktionen
|
||||||
### 1. Repository klonen
|
- **[Technische Dokumentation](docs/technical.md)** - Architektur, Datenbank-Schema, Konfiguration
|
||||||
|
- **[API-Dokumentation](docs/api.md)** - REST-API Endpunkte, Authentifizierung, Beispiele
|
||||||
```bash
|
- **[Entwicklung](docs/development.md)** - Testing, Code Quality, Entwickler-Workflow
|
||||||
git clone <repository-url>
|
- **[Docker](docs/docker.md)** - Docker-Befehle und Container-Management
|
||||||
cd immorechner
|
- **[Fehlerbehebung](docs/troubleshooting.md)** - Lösungen für häufige Probleme
|
||||||
```
|
|
||||||
|
|
||||||
### 2. Docker-Container starten
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker-compose up -d --build
|
|
||||||
```
|
|
||||||
|
|
||||||
Dieser Befehl:
|
|
||||||
- Baut das PHP 8.4 Image mit allen benötigten Extensions
|
|
||||||
- Startet MariaDB
|
|
||||||
- Startet phpMyAdmin
|
|
||||||
- Startet den Apache-Webserver
|
|
||||||
|
|
||||||
### 3. Dependencies installieren
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker-compose exec web composer install
|
|
||||||
```
|
|
||||||
|
|
||||||
### 4. Bundle-Assets installieren
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker-compose exec web php bin/console assets:install public --symlink --relative
|
|
||||||
```
|
|
||||||
|
|
||||||
Dieser Schritt ist wichtig für die Swagger UI (CSS, JS, Bilder).
|
|
||||||
|
|
||||||
### 5. Datenbank-Schema erstellen
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker-compose exec web php bin/console doctrine:migrations:migrate --no-interaction
|
|
||||||
```
|
|
||||||
|
|
||||||
### 6. Cache leeren
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker-compose exec web php bin/console cache:clear
|
|
||||||
```
|
|
||||||
|
|
||||||
## Verwendung
|
|
||||||
|
|
||||||
### Anwendung aufrufen
|
|
||||||
|
|
||||||
- **Web-Interface**: http://localhost:8080
|
|
||||||
- **API-Dokumentation (Swagger UI)**: http://localhost:8080/api/docs.html
|
|
||||||
- **API Entrypoint (Hydra)**: http://localhost:8080/api
|
|
||||||
- **OpenAPI Spezifikation (JSON)**: http://localhost:8080/api/docs?format=json
|
|
||||||
- **phpMyAdmin**: http://localhost:8081
|
|
||||||
- Server: `db`
|
|
||||||
- Benutzer: `root`
|
|
||||||
- Passwort: `root`
|
|
||||||
|
|
||||||
### Schnellstart API
|
|
||||||
|
|
||||||
Die vollständige API-Dokumentation mit allen Endpunkten, Beispielen und interaktiven Tests finden Sie im Abschnitt **[API-Dokumentation](#api-dokumentation)** weiter unten.
|
|
||||||
|
|
||||||
Wichtigste Endpunkte:
|
|
||||||
- **Immobilien**: `/api/immobilies` (GET, POST, PATCH, DELETE)
|
|
||||||
- **Benutzer**: `/api/users` (GET, POST, PUT, DELETE)
|
|
||||||
- **Bundesländer**: `/api/bundeslands` (GET, POST, PUT, DELETE)
|
|
||||||
- **Heizungstypen**: `/api/heizungstyps` (GET, POST, PUT, DELETE)
|
|
||||||
|
|
||||||
## Datenbank-Schema
|
|
||||||
|
|
||||||
### User-Tabelle
|
|
||||||
|
|
||||||
| Feld | Typ | Beschreibung |
|
|
||||||
|------|-----|--------------|
|
|
||||||
| id | INT | Primärschlüssel (Auto-Increment) |
|
|
||||||
| name | VARCHAR(255) | Benutzername (min. 2 Zeichen) |
|
|
||||||
| email | VARCHAR(255) | E-Mail-Adresse (Unique) |
|
|
||||||
| role | ENUM | Benutzerrolle (user, admin, moderator, technical) |
|
|
||||||
| api_key | VARCHAR(64) | API-Key für Authentifizierung (Unique, automatisch generiert) |
|
|
||||||
| created_at | DATETIME | Erstellungsdatum |
|
|
||||||
|
|
||||||
**Benutzerrollen:**
|
|
||||||
- `user` - Normaler Benutzer (sieht nur eigene Immobilien)
|
|
||||||
- `admin` - Administrator (uneingeschränkter Zugriff auf alle Ressourcen)
|
|
||||||
- `moderator` - Moderator (erweiterte Rechte)
|
|
||||||
- `technical` - Technischer User (kann Bundesländer und Heizungstypen verwalten)
|
|
||||||
|
|
||||||
**API-Key:**
|
|
||||||
- Wird automatisch beim Erstellen eines Users generiert (SHA256-Hash)
|
|
||||||
- Ist eindeutig für jeden User
|
|
||||||
- Kann über die Methode `regenerateApiKey()` neu generiert werden
|
|
||||||
- Wird für die API-Authentifizierung verwendet
|
|
||||||
|
|
||||||
### Bundesland-Tabelle
|
|
||||||
|
|
||||||
| Feld | Typ | Beschreibung |
|
|
||||||
|------|-----|--------------|
|
|
||||||
| id | INT | Primärschlüssel (Auto-Increment) |
|
|
||||||
| name | VARCHAR(100) | Name des Bundeslandes (Unique) |
|
|
||||||
| grunderwerbsteuer | DECIMAL(4,2) | Grunderwerbsteuer in Prozent |
|
|
||||||
|
|
||||||
**Grunderwerbsteuer-Sätze (Stand 2025):**
|
|
||||||
- Baden-Württemberg, Bremen, Niedersachsen, Rheinland-Pfalz, Sachsen-Anhalt, Thüringen: 5,0%
|
|
||||||
- Bayern: 3,5%
|
|
||||||
- Hamburg, Sachsen: 5,5%
|
|
||||||
- Berlin, Hessen, Mecklenburg-Vorpommern: 6,0%
|
|
||||||
- Brandenburg, Nordrhein-Westfalen, Saarland, Schleswig-Holstein: 6,5%
|
|
||||||
|
|
||||||
### Heizungstyp-Tabelle
|
|
||||||
|
|
||||||
| Feld | Typ | Beschreibung |
|
|
||||||
|------|-----|--------------|
|
|
||||||
| id | INT | Primärschlüssel (Auto-Increment) |
|
|
||||||
| name | VARCHAR(100) | Name des Heizungstyps (Unique) |
|
|
||||||
|
|
||||||
**Beispiele:** Gasheizung, Wärmepumpe, Ölheizung, Fernwärme, etc.
|
|
||||||
|
|
||||||
### Immobilien-Tabelle
|
|
||||||
|
|
||||||
| Feld | Typ | Beschreibung |
|
|
||||||
|------|-----|--------------|
|
|
||||||
| id | INT | Primärschlüssel (Auto-Increment) |
|
|
||||||
| verwalter_id | INT | Foreign Key zu User (Verwalter der Immobilie) |
|
|
||||||
| adresse | VARCHAR(255) | Vollständige Adresse (5-255 Zeichen) |
|
|
||||||
| wohnflaeche | INT | Wohnfläche in m² (ganze Zahl) |
|
|
||||||
| nutzflaeche | INT | Nutzfläche in m² (ganze Zahl) |
|
|
||||||
| garage | BOOLEAN | Hat Garage? (Standard: false) |
|
|
||||||
| zimmer | INT | Anzahl Zimmer (> 0) |
|
|
||||||
| baujahr | INT | Baujahr (1800-2100, optional) |
|
|
||||||
| typ | ENUM | Immobilientyp (wohnung, haus, grundstueck, gewerbe, buero) |
|
|
||||||
| beschreibung | TEXT | Freitextbeschreibung (optional) |
|
|
||||||
| etage | INT | Stockwerk (0-10, optional) |
|
|
||||||
| heizungstyp_id | INT | Foreign Key zu Heizungstyp (optional) |
|
|
||||||
| abschreibungszeit | INT | Abschreibungszeit in Jahren (0-100, optional) |
|
|
||||||
| bundesland_id | INT | Foreign Key zu Bundesland (optional) |
|
|
||||||
| kaufpreis | INT | Kaufpreis in Euro (ganze Zahl, optional) |
|
|
||||||
| created_at | DATETIME | Erstellungsdatum |
|
|
||||||
| updated_at | DATETIME | Letzte Aktualisierung |
|
|
||||||
|
|
||||||
**Berechnete Felder (nicht in DB gespeichert):**
|
|
||||||
- `gesamtflaeche`: Wohnfläche + Nutzfläche
|
|
||||||
- `kaufnebenkosten`: Objekt mit Notar, Grundbuch, Grunderwerbsteuer und Gesamtsumme
|
|
||||||
- Notarkosten: ca. 1,5% des Kaufpreises
|
|
||||||
- Grundbuchkosten: ca. 0,5% des Kaufpreises
|
|
||||||
- Grunderwerbsteuer: abhängig vom Bundesland (3,5% - 6,5%)
|
|
||||||
|
|
||||||
## Testing & Code Quality
|
|
||||||
|
|
||||||
Das Projekt verwendet **PHPUnit** für Unit- und Funktionstests sowie **PHP-CS-Fixer** für Code-Qualität und Linting.
|
|
||||||
|
|
||||||
### Tests ausführen
|
|
||||||
|
|
||||||
#### Alle Tests ausführen
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker-compose exec web php bin/phpunit
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Tests mit Ausgabedetails
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker-compose exec web php bin/phpunit --verbose
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Nur bestimmte Testklassen ausführen
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Entity-Tests
|
|
||||||
docker-compose exec web php bin/phpunit tests/Entity
|
|
||||||
|
|
||||||
# API-Tests
|
|
||||||
docker-compose exec web php bin/phpunit tests/Api
|
|
||||||
|
|
||||||
# Einzelne Testklasse
|
|
||||||
docker-compose exec web php bin/phpunit tests/Entity/UserTest.php
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Code Coverage Report (optional)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker-compose exec web php bin/phpunit --coverage-text
|
|
||||||
```
|
|
||||||
|
|
||||||
### Code-Linting mit PHP-CS-Fixer
|
|
||||||
|
|
||||||
#### Code-Style prüfen (Dry-Run)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker-compose exec web vendor/bin/php-cs-fixer fix --dry-run --diff
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Code automatisch formatieren
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker-compose exec web vendor/bin/php-cs-fixer fix
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Bestimmte Verzeichnisse prüfen
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Nur src/ Verzeichnis
|
|
||||||
docker-compose exec web vendor/bin/php-cs-fixer fix src --dry-run
|
|
||||||
|
|
||||||
# Nur tests/ Verzeichnis
|
|
||||||
docker-compose exec web vendor/bin/php-cs-fixer fix tests --dry-run
|
|
||||||
```
|
|
||||||
|
|
||||||
### Test-Struktur
|
|
||||||
|
|
||||||
```
|
|
||||||
tests/
|
|
||||||
├── Entity/ # Unit-Tests für Entities
|
|
||||||
│ ├── UserTest.php # User-Entity Tests
|
|
||||||
│ ├── ImmobilieTest.php # Immobilie-Entity Tests (inkl. Kaufnebenkosten)
|
|
||||||
│ ├── BundeslandTest.php # Bundesland-Entity Tests
|
|
||||||
│ └── HeizungstypTest.php # Heizungstyp-Entity Tests
|
|
||||||
└── Api/ # Funktions-/API-Tests
|
|
||||||
├── BundeslandApiTest.php # Bundesländer API-Tests
|
|
||||||
├── HeizungstypApiTest.php # Heizungstypen API-Tests
|
|
||||||
└── ApiDocumentationTest.php # API-Dokumentations-Tests
|
|
||||||
```
|
|
||||||
|
|
||||||
### Test-Abdeckung
|
|
||||||
|
|
||||||
Die Tests decken folgende Bereiche ab:
|
|
||||||
|
|
||||||
**Entity-Tests:**
|
|
||||||
- User-Entity: API-Key-Generierung, Rollen, UserInterface-Methoden
|
|
||||||
- Immobilie-Entity: Gesamtflächen-Berechnung, Kaufnebenkosten-Berechnung
|
|
||||||
- Bundesland-Entity: Grunderwerbsteuer-Werte für alle Bundesländer
|
|
||||||
- Heizungstyp-Entity: CRUD-Operationen
|
|
||||||
|
|
||||||
**API-Tests:**
|
|
||||||
- Öffentlicher Zugriff auf Bundesländer und Heizungstypen (GET)
|
|
||||||
- Authentifizierung für CREATE-Operationen
|
|
||||||
- API-Dokumentation Zugänglichkeit
|
|
||||||
|
|
||||||
### Code-Style Regeln
|
|
||||||
|
|
||||||
Die PHP-CS-Fixer-Konfiguration (`.php-cs-fixer.dist.php`) verwendet:
|
|
||||||
- Symfony Coding Standards
|
|
||||||
- Short Array Syntax
|
|
||||||
- Sortierte Imports
|
|
||||||
- Trailing Commas in Multiline Arrays
|
|
||||||
- Und weitere PSR-12 kompatible Regeln
|
|
||||||
|
|
||||||
## Entwicklung
|
|
||||||
|
|
||||||
### Neue Entity erstellen
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker-compose exec web php bin/console make:entity
|
|
||||||
```
|
|
||||||
|
|
||||||
### Migration erstellen
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker-compose exec web php bin/console doctrine:migrations:diff
|
|
||||||
```
|
|
||||||
|
|
||||||
### Migration ausführen
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker-compose exec web php bin/console doctrine:migrations:migrate
|
|
||||||
```
|
|
||||||
|
|
||||||
### Controller erstellen
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker-compose exec web php bin/console make:controller
|
|
||||||
```
|
|
||||||
|
|
||||||
### Cache leeren
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker-compose exec web php bin/console cache:clear
|
|
||||||
```
|
|
||||||
|
|
||||||
### Symfony Console aufrufen
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker-compose exec web php bin/console
|
|
||||||
```
|
|
||||||
|
|
||||||
## Docker-Befehle
|
|
||||||
|
|
||||||
### Container starten
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker-compose up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
### Container stoppen
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker-compose down
|
|
||||||
```
|
|
||||||
|
|
||||||
### Container neu bauen
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker-compose up -d --build
|
|
||||||
```
|
|
||||||
|
|
||||||
### Container-Logs anzeigen
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Alle Container
|
|
||||||
docker-compose logs -f
|
|
||||||
|
|
||||||
# Nur Web-Container
|
|
||||||
docker-compose logs -f web
|
|
||||||
|
|
||||||
# Nur Datenbank-Container
|
|
||||||
docker-compose logs -f db
|
|
||||||
```
|
|
||||||
|
|
||||||
### In Container einloggen
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Web-Container (PHP/Apache)
|
|
||||||
docker-compose exec web bash
|
|
||||||
|
|
||||||
# Datenbank-Container
|
|
||||||
docker-compose exec db bash
|
|
||||||
```
|
|
||||||
|
|
||||||
### Composer-Befehle ausführen
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker-compose exec web composer require <paket-name>
|
|
||||||
docker-compose exec web composer update
|
|
||||||
docker-compose exec web composer dump-autoload
|
|
||||||
```
|
|
||||||
|
|
||||||
## Projekt-Struktur
|
## Projekt-Struktur
|
||||||
|
|
||||||
```
|
```
|
||||||
immorechner/
|
immorechner/
|
||||||
├── bin/ # Symfony Console und andere Binaries
|
├── config/ # Symfony Konfiguration
|
||||||
├── config/ # Symfony Konfigurationsdateien
|
├── docs/ # Dokumentation
|
||||||
├── docker/ # Docker-Konfigurationsdateien
|
├── migrations/ # Datenbank-Migrationen
|
||||||
│ └── apache/ # Apache VirtualHost Konfiguration
|
├── public/ # Web-Root, CSS, JS, Assets
|
||||||
├── migrations/ # Doctrine Datenbank-Migrationen
|
|
||||||
├── public/ # Web-Root (index.php, Assets)
|
|
||||||
├── src/ # PHP-Quellcode
|
├── src/ # PHP-Quellcode
|
||||||
│ ├── Controller/ # Controller
|
│ ├── Controller/ # Controller (Frontend & API)
|
||||||
│ ├── Entity/ # Doctrine Entities
|
│ ├── Entity/ # Doctrine Entities
|
||||||
│ ├── Enum/ # PHP Enums
|
|
||||||
│ ├── Repository/ # Doctrine Repositories
|
│ ├── Repository/ # Doctrine Repositories
|
||||||
│ └── Kernel.php # Symfony Kernel
|
│ └── Security/ # Authentifizierung
|
||||||
├── templates/ # Twig-Templates
|
├── templates/ # Twig-Templates
|
||||||
│ ├── base.html.twig # Basis-Template
|
|
||||||
│ └── home/ # Homepage-Templates
|
|
||||||
├── var/ # Cache, Logs
|
|
||||||
├── vendor/ # Composer Dependencies
|
|
||||||
├── .env # Umgebungsvariablen
|
|
||||||
├── .env.example # Beispiel-Umgebungsvariablen
|
|
||||||
├── .gitignore # Git Ignore-Datei
|
|
||||||
├── composer.json # Composer-Konfiguration
|
|
||||||
├── docker-compose.yml # Docker Compose-Konfiguration
|
├── docker-compose.yml # Docker Compose-Konfiguration
|
||||||
├── Dockerfile # Docker-Image für PHP/Apache
|
└── Dockerfile # Docker-Image für PHP/Apache
|
||||||
└── README.md # Diese Datei
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Umgebungsvariablen
|
## Verwendung
|
||||||
|
|
||||||
Die Anwendung verwendet folgende Umgebungsvariablen (definiert in `.env`):
|
### Frontend
|
||||||
|
|
||||||
```env
|
**Startseite (Rechner):** http://localhost:8080
|
||||||
# Symfony
|
- Immobiliendaten eingeben
|
||||||
APP_ENV=dev
|
- Live-Berechnungen ansehen
|
||||||
APP_SECRET=<generierter-secret-key>
|
- Link zum Teilen generieren
|
||||||
|
- Bei Anmeldung: Immobilie speichern
|
||||||
|
|
||||||
# Datenbank
|
**Registrierung:** http://localhost:8080/register
|
||||||
DATABASE_URL="mysql://immorechner_user:immorechner_pass@db:3306/immorechner?serverVersion=mariadb-11.7.1&charset=utf8mb4"
|
|
||||||
|
|
||||||
# CORS
|
**Login:** http://localhost:8080/login
|
||||||
CORS_ALLOW_ORIGIN='^https?://(localhost|127\.0\.0\.1)(:[0-9]+)?$'
|
|
||||||
|
|
||||||
# Routing
|
**Meine Immobilien:** http://localhost:8080/meine-immobilien (nach Login)
|
||||||
DEFAULT_URI=http://localhost
|
|
||||||
```
|
|
||||||
|
|
||||||
## Konfiguration
|
### API
|
||||||
|
|
||||||
### CORS anpassen
|
**API-Dokumentation (Swagger UI):** http://localhost:8080/api/docs.html
|
||||||
|
|
||||||
CORS-Einstellungen können in `config/packages/nelmio_cors.yaml` angepasst werden.
|
**API Entrypoint:** http://localhost:8080/api
|
||||||
|
|
||||||
### Datenbank-Verbindung ändern
|
**Öffentliche Endpunkte (ohne Authentifizierung):**
|
||||||
|
- `GET /api/bundeslands` - Alle Bundesländer
|
||||||
|
- `GET /api/heizungstyps` - Alle Heizungstypen
|
||||||
|
|
||||||
Datenbank-Verbindung in `.env` anpassen:
|
**Geschützte Endpunkte (API-Key erforderlich):**
|
||||||
|
- `/api/immobilies` - Immobilien-Management
|
||||||
|
- `/api/users` - Benutzer-Management
|
||||||
|
|
||||||
```env
|
## Schnelle Befehle
|
||||||
DATABASE_URL="mysql://user:password@host:port/database?serverVersion=mariadb-11.7.1"
|
|
||||||
```
|
|
||||||
|
|
||||||
### Apache-Konfiguration
|
|
||||||
|
|
||||||
Apache-VirtualHost-Konfiguration befindet sich in `docker/apache/000-default.conf`.
|
|
||||||
|
|
||||||
## Fehlerbehebung
|
|
||||||
|
|
||||||
### Swagger UI lädt ohne CSS/JS (Assets fehlen)
|
|
||||||
|
|
||||||
Wenn die Swagger UI unter http://localhost:8080/api/docs.html zwar lädt, aber keine Styles/Formatierung hat:
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Bundle-Assets installieren
|
# Container starten
|
||||||
docker-compose exec web php bin/console assets:install public --symlink --relative
|
docker-compose up -d
|
||||||
|
|
||||||
# Cache leeren
|
# Container stoppen
|
||||||
docker-compose exec web php bin/console cache:clear
|
|
||||||
```
|
|
||||||
|
|
||||||
Danach sollten alle CSS-, JS- und Bilddateien unter `/bundles/apiplatform/` verfügbar sein.
|
|
||||||
|
|
||||||
### Container starten nicht
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Container-Logs prüfen
|
|
||||||
docker-compose logs
|
|
||||||
|
|
||||||
# Container-Status prüfen
|
|
||||||
docker ps -a
|
|
||||||
|
|
||||||
# Container neu bauen
|
|
||||||
docker-compose down
|
docker-compose down
|
||||||
docker-compose up -d --build
|
|
||||||
```
|
|
||||||
|
|
||||||
### "Class not found" Fehler
|
# Logs anzeigen
|
||||||
|
docker-compose logs -f
|
||||||
|
|
||||||
```bash
|
# In Container einloggen
|
||||||
# Autoloader neu generieren
|
docker-compose exec web bash
|
||||||
docker-compose exec web composer dump-autoload
|
|
||||||
|
|
||||||
# Cache leeren
|
# Cache leeren
|
||||||
docker-compose exec web php bin/console cache:clear
|
docker-compose exec web php bin/console cache:clear
|
||||||
|
|
||||||
# Container neu starten
|
# Tests ausführen
|
||||||
docker-compose restart web
|
docker-compose exec web php bin/phpunit
|
||||||
```
|
```
|
||||||
|
|
||||||
### Datenbank-Verbindungsfehler
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Prüfen ob DB-Container läuft
|
|
||||||
docker ps | grep db
|
|
||||||
|
|
||||||
# DB-Logs prüfen
|
|
||||||
docker-compose logs db
|
|
||||||
|
|
||||||
# In DB-Container einloggen und testen
|
|
||||||
docker-compose exec db mysql -u root -proot
|
|
||||||
```
|
|
||||||
|
|
||||||
### Port bereits belegt
|
|
||||||
|
|
||||||
Wenn Port 8080, 8081 oder 3306 bereits belegt ist, können die Ports in `docker-compose.yml` angepasst werden:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
services:
|
|
||||||
web:
|
|
||||||
ports:
|
|
||||||
- "8090:80" # Statt 8080:80
|
|
||||||
```
|
|
||||||
|
|
||||||
## API-Dokumentation
|
|
||||||
|
|
||||||
Die Anwendung nutzt **API Platform** zur automatischen Generierung von OpenAPI/Swagger-Dokumentation. Die interaktive Dokumentation ermöglicht es, alle API-Endpunkte direkt im Browser zu testen.
|
|
||||||
|
|
||||||
### API-Authentifizierung
|
|
||||||
|
|
||||||
Die API verwendet **API-Key-basierte Authentifizierung**. Jeder User erhält automatisch beim Erstellen einen eindeutigen API-Key.
|
|
||||||
|
|
||||||
#### API-Key verwenden
|
|
||||||
|
|
||||||
Fügen Sie den API-Key im Header `X-API-KEY` zu allen API-Anfragen hinzu:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
curl -H "X-API-KEY: your-api-key-here" http://localhost:8080/api/immobilies
|
|
||||||
```
|
|
||||||
|
|
||||||
#### API-Key erhalten
|
|
||||||
|
|
||||||
Der API-Key wird automatisch generiert, wenn ein neuer User erstellt wird. Sie können ihn abrufen über:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# User erstellen
|
|
||||||
curl -X POST http://localhost:8080/api/users \
|
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-d '{
|
|
||||||
"name": "Max Mustermann",
|
|
||||||
"email": "max@example.com",
|
|
||||||
"role": "user"
|
|
||||||
}'
|
|
||||||
|
|
||||||
# Response enthält den API-Key
|
|
||||||
{
|
|
||||||
"@context": "/api/contexts/User",
|
|
||||||
"@id": "/api/users/1",
|
|
||||||
"@type": "User",
|
|
||||||
"id": 1,
|
|
||||||
"name": "Max Mustermann",
|
|
||||||
"email": "max@example.com",
|
|
||||||
"role": "user",
|
|
||||||
"apiKey": "a1b2c3d4e5f6...", // Verwenden Sie diesen Key für die Authentifizierung
|
|
||||||
"createdAt": "2025-11-08T22:00:00+00:00"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Zugriffsrechte
|
|
||||||
|
|
||||||
Die API implementiert folgende Zugriffsrechte:
|
|
||||||
|
|
||||||
| Ressource | Aktion | Berechtigung |
|
|
||||||
|-----------|--------|--------------|
|
|
||||||
| **Bundesländer** | GET (Lesen) | Öffentlich (keine Authentifizierung) |
|
|
||||||
| **Bundesländer** | POST, PUT, DELETE | ADMIN oder TECHNICAL |
|
|
||||||
| **Heizungstypen** | GET (Lesen) | Öffentlich (keine Authentifizierung) |
|
|
||||||
| **Heizungstypen** | POST, PUT, DELETE | ADMIN oder TECHNICAL |
|
|
||||||
| **Immobilien** | GET, POST, PATCH, DELETE | Authentifiziert |
|
|
||||||
| **Immobilien** | Sichtbarkeit | User sehen nur eigene Immobilien |
|
|
||||||
| **Immobilien** | Admin-Zugriff | ADMIN sieht alle Immobilien |
|
|
||||||
| **Users** | Alle Aktionen | Authentifiziert |
|
|
||||||
|
|
||||||
**Wichtig:**
|
|
||||||
- Normale User sehen und verwalten nur ihre eigenen Immobilien
|
|
||||||
- Admins haben uneingeschränkten Zugriff auf alle Ressourcen
|
|
||||||
- Technische User können Bundesländer und Heizungstypen anlegen, ändern und löschen
|
|
||||||
- Bundesländer und Heizungstypen können ohne API-Key gelesen werden
|
|
||||||
|
|
||||||
### Swagger UI (Interaktive Dokumentation)
|
|
||||||
|
|
||||||
Die **Swagger UI** bietet eine vollständige, interaktive Dokumentation aller API-Endpunkte:
|
|
||||||
|
|
||||||
**URL**: http://localhost:8080/api/docs.html
|
|
||||||
|
|
||||||
Features:
|
|
||||||
- Übersicht aller verfügbaren Endpunkte
|
|
||||||
- Interaktives Testen direkt im Browser
|
|
||||||
- Detaillierte Request/Response-Schemas
|
|
||||||
- Automatische Validierung von Parametern
|
|
||||||
- Try-it-out Funktion für alle Operationen
|
|
||||||
|
|
||||||
### OpenAPI Spezifikation
|
|
||||||
|
|
||||||
Die OpenAPI-Spezifikation (ehemals Swagger) kann in verschiedenen Formaten abgerufen werden:
|
|
||||||
|
|
||||||
#### OpenAPI JSON-Format
|
|
||||||
```bash
|
|
||||||
curl "http://localhost:8080/api/docs?format=json"
|
|
||||||
```
|
|
||||||
|
|
||||||
#### JSON-LD Format (Hydra)
|
|
||||||
```bash
|
|
||||||
curl http://localhost:8080/api/docs.jsonld
|
|
||||||
```
|
|
||||||
|
|
||||||
#### HTML Format (Swagger UI)
|
|
||||||
```bash
|
|
||||||
curl http://localhost:8080/api/docs.html
|
|
||||||
# oder im Browser öffnen: http://localhost:8080/api/docs.html
|
|
||||||
```
|
|
||||||
|
|
||||||
### API-Formate
|
|
||||||
|
|
||||||
Die API unterstützt mehrere Content-Type-Formate:
|
|
||||||
|
|
||||||
| Format | Content-Type | Beschreibung |
|
|
||||||
|--------|--------------|--------------|
|
|
||||||
| **JSON-LD** | `application/ld+json` | Standard-Format mit Linked Data Kontext (Hydra) |
|
|
||||||
| **JSON** | `application/json` | Einfaches JSON-Format |
|
|
||||||
| **HTML** | `text/html` | HTML-Darstellung (Swagger UI) |
|
|
||||||
|
|
||||||
#### Beispiel: JSON-Format verwenden
|
|
||||||
|
|
||||||
```bash
|
|
||||||
curl -H "Accept: application/json" http://localhost:8080/api/users
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Beispiel: JSON-LD Format (Standard)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
curl http://localhost:8080/api/users
|
|
||||||
# oder explizit:
|
|
||||||
curl -H "Accept: application/ld+json" http://localhost:8080/api/users
|
|
||||||
```
|
|
||||||
|
|
||||||
### Verfügbare Ressourcen
|
|
||||||
|
|
||||||
#### Immobilien-Endpunkte
|
|
||||||
|
|
||||||
| Methode | Endpoint | Beschreibung |
|
|
||||||
|---------|----------|--------------|
|
|
||||||
| GET | `/api/immobilies` | Alle Immobilien abrufen (mit Pagination) |
|
|
||||||
| GET | `/api/immobilies/{id}` | Einzelne Immobilie abrufen |
|
|
||||||
| POST | `/api/immobilies` | Neue Immobilie erstellen |
|
|
||||||
| PATCH | `/api/immobilies/{id}` | Immobilie teilweise aktualisieren |
|
|
||||||
| DELETE | `/api/immobilies/{id}` | Immobilie löschen |
|
|
||||||
|
|
||||||
#### User-Endpunkte
|
|
||||||
|
|
||||||
| Methode | Endpoint | Beschreibung |
|
|
||||||
|---------|----------|--------------|
|
|
||||||
| GET | `/api/users` | Alle User abrufen (mit Pagination) |
|
|
||||||
| GET | `/api/users/{id}` | Einzelnen User abrufen |
|
|
||||||
| POST | `/api/users` | Neuen User erstellen |
|
|
||||||
| PUT | `/api/users/{id}` | User vollständig ersetzen |
|
|
||||||
| DELETE | `/api/users/{id}` | User löschen |
|
|
||||||
|
|
||||||
#### Bundesland-Endpunkte
|
|
||||||
|
|
||||||
| Methode | Endpoint | Beschreibung |
|
|
||||||
|---------|----------|--------------|
|
|
||||||
| GET | `/api/bundeslands` | Alle Bundesländer abrufen (mit Pagination) |
|
|
||||||
| GET | `/api/bundeslands/{id}` | Einzelnes Bundesland abrufen |
|
|
||||||
| POST | `/api/bundeslands` | Neues Bundesland erstellen |
|
|
||||||
| PUT | `/api/bundeslands/{id}` | Bundesland vollständig ersetzen |
|
|
||||||
| DELETE | `/api/bundeslands/{id}` | Bundesland löschen |
|
|
||||||
|
|
||||||
#### Heizungstyp-Endpunkte
|
|
||||||
|
|
||||||
| Methode | Endpoint | Beschreibung |
|
|
||||||
|---------|----------|--------------|
|
|
||||||
| GET | `/api/heizungstyps` | Alle Heizungstypen abrufen (mit Pagination) |
|
|
||||||
| GET | `/api/heizungstyps/{id}` | Einzelnen Heizungstyp abrufen |
|
|
||||||
| POST | `/api/heizungstyps` | Neuen Heizungstyp erstellen |
|
|
||||||
| PUT | `/api/heizungstyps/{id}` | Heizungstyp vollständig ersetzen |
|
|
||||||
| DELETE | `/api/heizungstyps/{id}` | Heizungstyp löschen |
|
|
||||||
|
|
||||||
### Beispiele
|
|
||||||
|
|
||||||
#### Bundesländer abrufen (Öffentlich, kein API-Key benötigt)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
curl http://localhost:8080/api/bundeslands
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Bundesland erstellen (Admin oder Technical User)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
curl -X POST http://localhost:8080/api/bundeslands \
|
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-H "X-API-KEY: admin-or-technical-api-key" \
|
|
||||||
-d '{
|
|
||||||
"name": "Bayern",
|
|
||||||
"grunderwerbsteuer": 3.5
|
|
||||||
}'
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Heizungstyp erstellen (Admin oder Technical User)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
curl -X POST http://localhost:8080/api/heizungstyps \
|
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-H "X-API-KEY: admin-or-technical-api-key" \
|
|
||||||
-d '{
|
|
||||||
"name": "Wärmepumpe"
|
|
||||||
}'
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Technischen User erstellen
|
|
||||||
|
|
||||||
```bash
|
|
||||||
curl -X POST http://localhost:8080/api/users \
|
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-d '{
|
|
||||||
"name": "Technical User",
|
|
||||||
"email": "technical@example.com",
|
|
||||||
"role": "technical"
|
|
||||||
}'
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Immobilie erstellen (Mit API-Key)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
curl -X POST http://localhost:8080/api/immobilies \
|
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-H "X-API-KEY: your-api-key-here" \
|
|
||||||
-d '{
|
|
||||||
"verwalter": "/api/users/1",
|
|
||||||
"adresse": "Hauptstraße 123, 12345 Musterstadt",
|
|
||||||
"wohnflaeche": 85,
|
|
||||||
"nutzflaeche": 15,
|
|
||||||
"zimmer": 3,
|
|
||||||
"typ": "wohnung",
|
|
||||||
"garage": true,
|
|
||||||
"baujahr": 2020,
|
|
||||||
"heizungstyp": "/api/heizungstyps/1",
|
|
||||||
"bundesland": "/api/bundeslands/1",
|
|
||||||
"kaufpreis": 350000,
|
|
||||||
"abschreibungszeit": 50,
|
|
||||||
"etage": 3
|
|
||||||
}'
|
|
||||||
```
|
|
||||||
|
|
||||||
#### User erstellen
|
|
||||||
|
|
||||||
```bash
|
|
||||||
curl -X POST http://localhost:8080/api/users \
|
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-d '{
|
|
||||||
"name": "Max Mustermann",
|
|
||||||
"email": "max@example.com",
|
|
||||||
"role": "user"
|
|
||||||
}'
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Eigene Immobilien abrufen (Mit API-Key)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Erste Seite (Standard) - User sieht nur eigene Immobilien
|
|
||||||
curl -H "X-API-KEY: your-api-key-here" http://localhost:8080/api/immobilies
|
|
||||||
|
|
||||||
# Zweite Seite
|
|
||||||
curl -H "X-API-KEY: your-api-key-here" http://localhost:8080/api/immobilies?page=2
|
|
||||||
|
|
||||||
# Als Admin: Sieht alle Immobilien
|
|
||||||
curl -H "X-API-KEY: admin-api-key-here" http://localhost:8080/api/immobilies
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Einzelne Immobilie aktualisieren (PATCH, Mit API-Key)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
curl -X PATCH http://localhost:8080/api/immobilies/1 \
|
|
||||||
-H "Content-Type: application/merge-patch+json" \
|
|
||||||
-H "X-API-KEY: your-api-key-here" \
|
|
||||||
-d '{
|
|
||||||
"wohnflaeche": 90,
|
|
||||||
"kaufpreis": 360000,
|
|
||||||
"heizungstyp": "/api/heizungstyps/2"
|
|
||||||
}'
|
|
||||||
```
|
|
||||||
|
|
||||||
### Berechnete Felder
|
|
||||||
|
|
||||||
Die Immobilien-Entity bietet automatisch berechnete Felder:
|
|
||||||
|
|
||||||
- **gesamtflaeche**: Berechnet die Gesamtfläche (Wohnfläche + Nutzfläche)
|
|
||||||
- **kaufnebenkosten**: Berechnet die Kaufnebenkosten basierend auf Kaufpreis und Bundesland
|
|
||||||
- Enthält: Notarkosten (1,5%), Grundbuchkosten (0,5%), Grunderwerbsteuer (abhängig vom Bundesland) und Gesamtsumme
|
|
||||||
|
|
||||||
Diese Felder sind schreibgeschützt (read-only) und werden automatisch bei jeder Abfrage berechnet.
|
|
||||||
|
|
||||||
### Enums
|
|
||||||
|
|
||||||
Die API verwendet folgende Enums:
|
|
||||||
|
|
||||||
**ImmobilienTyp:**
|
|
||||||
- `wohnung` - Wohnung
|
|
||||||
- `haus` - Haus
|
|
||||||
- `grundstueck` - Grundstück
|
|
||||||
- `gewerbe` - Gewerbe
|
|
||||||
- `buero` - Büro
|
|
||||||
|
|
||||||
**UserRole:**
|
|
||||||
- `user` - Benutzer
|
|
||||||
- `admin` - Administrator
|
|
||||||
- `moderator` - Moderator
|
|
||||||
- `technical` - Technischer User
|
|
||||||
|
|
||||||
### Relationen
|
|
||||||
|
|
||||||
**Bundesland und Heizungstyp** sind eigene Entities, die über Foreign Keys mit Immobilien verknüpft sind:
|
|
||||||
- Bei der Erstellung einer Immobilie muss eine IRI verwendet werden (z.B. `/api/bundeslands/1`)
|
|
||||||
- Diese Entities können über ihre eigenen Endpunkte verwaltet werden
|
|
||||||
- Bundesländer enthalten die Grunderwerbsteuer-Sätze für die Kaufnebenkosten-Berechnung
|
|
||||||
|
|
||||||
### Hydra-Unterstützung
|
|
||||||
|
|
||||||
Bei Verwendung des JSON-LD Formats (Standard) bietet die API Hydra-Unterstützung:
|
|
||||||
|
|
||||||
- **@context**: Beschreibt die Linked Data Struktur
|
|
||||||
- **@id**: IRI (Internationalized Resource Identifier) der Ressource
|
|
||||||
- **@type**: Typ der Ressource
|
|
||||||
- **hydra:member**: Array der Ressourcen in Collections
|
|
||||||
- **hydra:totalItems**: Gesamtanzahl der Elemente
|
|
||||||
- **hydra:view**: Pagination-Links (first, last, next, previous)
|
|
||||||
|
|
||||||
## Sicherheitshinweise
|
## Sicherheitshinweise
|
||||||
|
|
||||||
**Wichtig für Produktion:**
|
**⚠️ Wichtig für Produktion:**
|
||||||
|
|
||||||
1. Ändern Sie alle Standardpasswörter in `docker-compose.yml` und `.env`
|
1. Ändern Sie alle Standardpasswörter in `docker-compose.yml` und `.env`
|
||||||
2. Generieren Sie einen neuen `APP_SECRET` für `.env`
|
2. Generieren Sie einen neuen `APP_SECRET`
|
||||||
3. Setzen Sie `APP_ENV=prod` in der Produktion
|
3. Setzen Sie `APP_ENV=prod`
|
||||||
4. Konfigurieren Sie CORS entsprechend Ihrer Domain
|
4. Aktivieren Sie HTTPS
|
||||||
5. Aktivieren Sie HTTPS
|
5. Entfernen Sie phpMyAdmin
|
||||||
6. Verwenden Sie sichere Datenbank-Credentials
|
6. Konfigurieren Sie CORS für Ihre Domain
|
||||||
7. Entfernen Sie phpMyAdmin aus der Produktion
|
|
||||||
|
Details siehe [Technische Dokumentation](docs/technical.md#sicherheit).
|
||||||
|
|
||||||
## Lizenz
|
## Lizenz
|
||||||
|
|
||||||
[Lizenz hier einfügen]
|
[Lizenz hier einfügen]
|
||||||
|
|
||||||
## Kontakt
|
## Support
|
||||||
|
|
||||||
[Kontaktinformationen hier einfügen]
|
Bei Problemen siehe [Fehlerbehebung](docs/troubleshooting.md) oder öffnen Sie ein Issue.
|
||||||
|
|||||||
185
docs/api.md
Normal file
185
docs/api.md
Normal file
@@ -0,0 +1,185 @@
|
|||||||
|
# API-Dokumentation
|
||||||
|
|
||||||
|
[← Zurück zur Hauptseite](../README.md)
|
||||||
|
|
||||||
|
## Übersicht
|
||||||
|
|
||||||
|
Die Immorechner-API ist eine vollständige REST-API basierend auf API Platform 4.2 mit OpenAPI/Swagger-Dokumentation.
|
||||||
|
|
||||||
|
**Basis-URL:** `http://localhost:8080/api`
|
||||||
|
|
||||||
|
**Formate:**
|
||||||
|
- `application/ld+json` (Standard, JSON-LD mit Hydra)
|
||||||
|
- `application/json` (Einfaches JSON)
|
||||||
|
|
||||||
|
## Interaktive Dokumentation
|
||||||
|
|
||||||
|
**Swagger UI:** http://localhost:8080/api/docs.html
|
||||||
|
|
||||||
|
Hier können Sie alle Endpunkte direkt im Browser testen.
|
||||||
|
|
||||||
|
## Authentifizierung
|
||||||
|
|
||||||
|
### API-Key (für API-Zugriff)
|
||||||
|
|
||||||
|
Fügen Sie den API-Key im Header hinzu:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -H "X-API-KEY: ihr-api-key-hier" http://localhost:8080/api/immobilies
|
||||||
|
```
|
||||||
|
|
||||||
|
### API-Key erhalten
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# User erstellen
|
||||||
|
curl -X POST http://localhost:8080/api/users \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{
|
||||||
|
"name": "Max Mustermann",
|
||||||
|
"email": "max@example.com",
|
||||||
|
"role": "user"
|
||||||
|
}'
|
||||||
|
|
||||||
|
# Response enthält apiKey
|
||||||
|
{
|
||||||
|
"apiKey": "a1b2c3d4e5f6...", # Diesen Key verwenden
|
||||||
|
...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Endpunkte
|
||||||
|
|
||||||
|
### Bundesländer (Öffentlich)
|
||||||
|
|
||||||
|
| Methode | Endpoint | Beschreibung | Auth |
|
||||||
|
|---------|----------|--------------|------|
|
||||||
|
| GET | `/api/bundeslands` | Alle Bundesländer | Nein |
|
||||||
|
| GET | `/api/bundeslands/{id}` | Einzelnes Bundesland | Nein |
|
||||||
|
| POST | `/api/bundeslands` | Neues Bundesland erstellen | ADMIN/TECHNICAL |
|
||||||
|
| PUT | `/api/bundeslands/{id}` | Bundesland aktualisieren | ADMIN/TECHNICAL |
|
||||||
|
| DELETE | `/api/bundeslands/{id}` | Bundesland löschen | ADMIN/TECHNICAL |
|
||||||
|
|
||||||
|
**Beispiel:**
|
||||||
|
```bash
|
||||||
|
curl http://localhost:8080/api/bundeslands
|
||||||
|
```
|
||||||
|
|
||||||
|
### Heizungstypen (Öffentlich)
|
||||||
|
|
||||||
|
| Methode | Endpoint | Beschreibung | Auth |
|
||||||
|
|---------|----------|--------------|------|
|
||||||
|
| GET | `/api/heizungstyps` | Alle Heizungstypen | Nein |
|
||||||
|
| GET | `/api/heizungstyps/{id}` | Einzelner Heizungstyp | Nein |
|
||||||
|
| POST | `/api/heizungstyps` | Neuen Typ erstellen | ADMIN/TECHNICAL |
|
||||||
|
| PUT | `/api/heizungstyps/{id}` | Typ aktualisieren | ADMIN/TECHNICAL |
|
||||||
|
| DELETE | `/api/heizungstyps/{id}` | Typ löschen | ADMIN/TECHNICAL |
|
||||||
|
|
||||||
|
### Immobilien (Geschützt)
|
||||||
|
|
||||||
|
| Methode | Endpoint | Beschreibung | Auth |
|
||||||
|
|---------|----------|--------------|------|
|
||||||
|
| GET | `/api/immobilies` | Eigene Immobilien | API-Key |
|
||||||
|
| GET | `/api/immobilies/{id}` | Einzelne Immobilie | API-Key |
|
||||||
|
| POST | `/api/immobilies` | Neue Immobilie | API-Key |
|
||||||
|
| PATCH | `/api/immobilies/{id}` | Immobilie aktualisieren | API-Key |
|
||||||
|
| DELETE | `/api/immobilies/{id}` | Immobilie löschen | API-Key |
|
||||||
|
|
||||||
|
**Beispiel - Immobilie erstellen:**
|
||||||
|
```bash
|
||||||
|
curl -X POST http://localhost:8080/api/immobilies \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-H "X-API-KEY: your-api-key" \
|
||||||
|
-d '{
|
||||||
|
"verwalter": "/api/users/1",
|
||||||
|
"adresse": "Hauptstraße 123, 12345 Musterstadt",
|
||||||
|
"wohnflaeche": 85,
|
||||||
|
"nutzflaeche": 15,
|
||||||
|
"zimmer": 3,
|
||||||
|
"typ": "wohnung",
|
||||||
|
"kaufpreis": 300000,
|
||||||
|
"bundesland": "/api/bundeslands/1",
|
||||||
|
"heizungstyp": "/api/heizungstyps/1"
|
||||||
|
}'
|
||||||
|
```
|
||||||
|
|
||||||
|
### User (Geschützt)
|
||||||
|
|
||||||
|
| Methode | Endpoint | Beschreibung | Auth |
|
||||||
|
|---------|----------|--------------|------|
|
||||||
|
| GET | `/api/users` | Alle User | API-Key |
|
||||||
|
| GET | `/api/users/{id}` | Einzelner User | API-Key |
|
||||||
|
| POST | `/api/users` | Neuen User erstellen | Nein* |
|
||||||
|
| PUT | `/api/users/{id}` | User aktualisieren | API-Key |
|
||||||
|
| DELETE | `/api/users/{id}` | User löschen | API-Key |
|
||||||
|
|
||||||
|
*POST ohne Auth zum Registrieren neuer User
|
||||||
|
|
||||||
|
## Rollen & Berechtigungen
|
||||||
|
|
||||||
|
| Rolle | Rechte |
|
||||||
|
|-------|--------|
|
||||||
|
| `user` | Eigene Immobilien verwalten |
|
||||||
|
| `admin` | Alle Ressourcen, alle Immobilien |
|
||||||
|
| `technical` | Bundesländer & Heizungstypen verwalten |
|
||||||
|
| `moderator` | Erweiterte Rechte |
|
||||||
|
|
||||||
|
## Enums
|
||||||
|
|
||||||
|
### ImmobilienTyp
|
||||||
|
- `wohnung` - Wohnung
|
||||||
|
- `haus` - Haus
|
||||||
|
- `grundstueck` - Grundstück
|
||||||
|
- `gewerbe` - Gewerbe
|
||||||
|
- `buero` - Büro
|
||||||
|
|
||||||
|
### UserRole
|
||||||
|
- `user` - Benutzer
|
||||||
|
- `admin` - Administrator
|
||||||
|
- `moderator` - Moderator
|
||||||
|
- `technical` - Technischer User
|
||||||
|
|
||||||
|
## Pagination
|
||||||
|
|
||||||
|
Alle Collection-Endpunkte unterstützen Pagination:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Erste Seite (Standard: 30 Items)
|
||||||
|
curl http://localhost:8080/api/immobilies
|
||||||
|
|
||||||
|
# Zweite Seite
|
||||||
|
curl http://localhost:8080/api/immobilies?page=2
|
||||||
|
|
||||||
|
# Custom Page Size
|
||||||
|
curl "http://localhost:8080/api/immobilies?itemsPerPage=10"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Filter
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Nach Typ filtern
|
||||||
|
curl "http://localhost:8080/api/immobilies?typ=wohnung"
|
||||||
|
|
||||||
|
# Nach Bundesland filtern
|
||||||
|
curl "http://localhost:8080/api/immobilies?bundesland=/api/bundeslands/1"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Fehler-Codes
|
||||||
|
|
||||||
|
| Status Code | Bedeutung |
|
||||||
|
|-------------|-----------|
|
||||||
|
| 200 | OK - Erfolgreiche Anfrage |
|
||||||
|
| 201 | Created - Ressource erstellt |
|
||||||
|
| 204 | No Content - Erfolgreich gelöscht |
|
||||||
|
| 400 | Bad Request - Ungültige Daten |
|
||||||
|
| 401 | Unauthorized - Authentifizierung fehlgeschlagen |
|
||||||
|
| 403 | Forbidden - Keine Berechtigung |
|
||||||
|
| 404 | Not Found - Ressource nicht gefunden |
|
||||||
|
| 500 | Internal Server Error - Server-Fehler |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Weitere Informationen:**
|
||||||
|
- [Features](features.md) - Funktionsübersicht
|
||||||
|
- [Technical](technical.md) - Datenbank-Schema & Architektur
|
||||||
|
|
||||||
|
[← Zurück zur Hauptseite](../README.md)
|
||||||
302
docs/development.md
Normal file
302
docs/development.md
Normal file
@@ -0,0 +1,302 @@
|
|||||||
|
# Entwicklung
|
||||||
|
|
||||||
|
[← Zurück zur Hauptseite](../README.md)
|
||||||
|
|
||||||
|
## Entwickler-Workflow
|
||||||
|
|
||||||
|
### Entwicklungsumgebung einrichten
|
||||||
|
|
||||||
|
Siehe [Installation](installation.md)
|
||||||
|
|
||||||
|
### Code-Änderungen testen
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Container starten
|
||||||
|
docker-compose up -d
|
||||||
|
|
||||||
|
# In Web-Container einloggen
|
||||||
|
docker-compose exec web bash
|
||||||
|
|
||||||
|
# Cache leeren nach Änderungen
|
||||||
|
php bin/console cache:clear
|
||||||
|
```
|
||||||
|
|
||||||
|
## Testing
|
||||||
|
|
||||||
|
### PHPUnit Tests
|
||||||
|
|
||||||
|
Das Projekt verwendet PHPUnit 12.4 für Tests.
|
||||||
|
|
||||||
|
#### Alle Tests ausführen
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose exec web php bin/phpunit
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Spezifische Tests
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Nur Entity-Tests
|
||||||
|
docker-compose exec web php bin/phpunit tests/Entity
|
||||||
|
|
||||||
|
# Nur API-Tests
|
||||||
|
docker-compose exec web php bin/phpunit tests/Api
|
||||||
|
|
||||||
|
# Einzelne Testklasse
|
||||||
|
docker-compose exec web php bin/phpunit tests/Entity/UserTest.php
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Mit Details
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose exec web php bin/phpunit --verbose
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Code Coverage (optional)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose exec web php bin/phpunit --coverage-text
|
||||||
|
```
|
||||||
|
|
||||||
|
### Test-Struktur
|
||||||
|
|
||||||
|
```
|
||||||
|
tests/
|
||||||
|
├── Entity/
|
||||||
|
│ ├── UserTest.php # User-Entity Tests
|
||||||
|
│ ├── ImmobilieTest.php # Immobilie-Entity Tests
|
||||||
|
│ ├── BundeslandTest.php # Bundesland-Entity Tests
|
||||||
|
│ └── HeizungstypTest.php # Heizungstyp-Entity Tests
|
||||||
|
└── Api/
|
||||||
|
├── BundeslandApiTest.php # Bundesländer-API Tests
|
||||||
|
├── HeizungstypApiTest.php # Heizungstypen-API Tests
|
||||||
|
└── ApiDocumentationTest.php # API-Docs Tests
|
||||||
|
```
|
||||||
|
|
||||||
|
## Code Quality
|
||||||
|
|
||||||
|
### PHP-CS-Fixer
|
||||||
|
|
||||||
|
Für konsistenten Code-Style nach Symfony Standards.
|
||||||
|
|
||||||
|
#### Code-Style prüfen (Dry-Run)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose exec web vendor/bin/php-cs-fixer fix --dry-run --diff
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Code automatisch formatieren
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose exec web vendor/bin/php-cs-fixer fix
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Bestimmte Verzeichnisse
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Nur src/
|
||||||
|
docker-compose exec web vendor/bin/php-cs-fixer fix src
|
||||||
|
|
||||||
|
# Nur tests/
|
||||||
|
docker-compose exec web vendor/bin/php-cs-fixer fix tests
|
||||||
|
```
|
||||||
|
|
||||||
|
### Code-Style Regeln
|
||||||
|
|
||||||
|
Konfiguration in `.php-cs-fixer.dist.php`:
|
||||||
|
- Symfony Coding Standards
|
||||||
|
- PSR-12 kompatibel
|
||||||
|
- Short Array Syntax
|
||||||
|
- Sortierte Imports
|
||||||
|
- Trailing Commas in Arrays
|
||||||
|
|
||||||
|
## Datenbank
|
||||||
|
|
||||||
|
### Neue Entity erstellen
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose exec web php bin/console make:entity
|
||||||
|
```
|
||||||
|
|
||||||
|
### Migration erstellen
|
||||||
|
|
||||||
|
Nach Änderungen an Entities:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose exec web php bin/console doctrine:migrations:diff
|
||||||
|
```
|
||||||
|
|
||||||
|
### Migration ausführen
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose exec web php bin/console doctrine:migrations:migrate
|
||||||
|
```
|
||||||
|
|
||||||
|
### Migration rückgängig machen
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Letzte Migration
|
||||||
|
docker-compose exec web php bin/console doctrine:migrations:migrate prev
|
||||||
|
|
||||||
|
# Zu spezifischer Version
|
||||||
|
docker-compose exec web php bin/console doctrine:migrations:migrate DoctrineMigrations\\Version20251109100000
|
||||||
|
```
|
||||||
|
|
||||||
|
### Migration-Status
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose exec web php bin/console doctrine:migrations:status
|
||||||
|
```
|
||||||
|
|
||||||
|
### Datenbank-Schema validieren
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose exec web php bin/console doctrine:schema:validate
|
||||||
|
```
|
||||||
|
|
||||||
|
## Controller & Routes
|
||||||
|
|
||||||
|
### Controller erstellen
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose exec web php bin/console make:controller
|
||||||
|
```
|
||||||
|
|
||||||
|
### Routes anzeigen
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Alle Routes
|
||||||
|
docker-compose exec web php bin/console debug:router
|
||||||
|
|
||||||
|
# Spezifische Route
|
||||||
|
docker-compose exec web php bin/console debug:router app_home
|
||||||
|
```
|
||||||
|
|
||||||
|
## Symfony Console
|
||||||
|
|
||||||
|
### Cache
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Cache leeren
|
||||||
|
docker-compose exec web php bin/console cache:clear
|
||||||
|
|
||||||
|
# Cache warmup
|
||||||
|
docker-compose exec web php bin/console cache:warmup
|
||||||
|
```
|
||||||
|
|
||||||
|
### Services debuggen
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Alle Services
|
||||||
|
docker-compose exec web php bin/console debug:container
|
||||||
|
|
||||||
|
# Spezifischer Service
|
||||||
|
docker-compose exec web php bin/console debug:container UserRepository
|
||||||
|
```
|
||||||
|
|
||||||
|
### Ereignisse anzeigen
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose exec web php bin/console debug:event-dispatcher
|
||||||
|
```
|
||||||
|
|
||||||
|
### Konfiguration anzeigen
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose exec web php bin/console debug:config framework
|
||||||
|
```
|
||||||
|
|
||||||
|
## Git Workflow
|
||||||
|
|
||||||
|
### Feature-Branch erstellen
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git checkout -b feature/neue-funktion
|
||||||
|
```
|
||||||
|
|
||||||
|
### Änderungen committen
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git add .
|
||||||
|
git commit -m "Feature: Beschreibung der Änderung"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Pull Request erstellen
|
||||||
|
|
||||||
|
1. Push auf Remote Branch
|
||||||
|
2. Pull Request in GitHub/GitLab erstellen
|
||||||
|
3. Code Review abwarten
|
||||||
|
4. Nach Approval mergen
|
||||||
|
|
||||||
|
## Best Practices
|
||||||
|
|
||||||
|
### Code-Organisation
|
||||||
|
|
||||||
|
1. **Controller:** Dünn halten, Logik in Services auslagern
|
||||||
|
2. **Entities:** Nur Datenmodell, keine Business-Logik
|
||||||
|
3. **Services:** Wiederverwendbare Business-Logik
|
||||||
|
4. **Repositories:** Nur Datenbank-Queries
|
||||||
|
|
||||||
|
### Namenskonventionen
|
||||||
|
|
||||||
|
- **Controller:** `XyzController.php`
|
||||||
|
- **Entity:** `Xyz.php`
|
||||||
|
- **Repository:** `XyzRepository.php`
|
||||||
|
- **Service:** `XyzService.php`
|
||||||
|
- **Test:** `XyzTest.php`
|
||||||
|
|
||||||
|
### Security
|
||||||
|
|
||||||
|
- Nie Passwörter im Klartext speichern
|
||||||
|
- Immer UserPasswordHasher verwenden
|
||||||
|
- CSRF-Tokens bei allen Forms
|
||||||
|
- Input-Validierung auf Server-Seite
|
||||||
|
- Output-Escaping (Twig macht automatisch)
|
||||||
|
|
||||||
|
### Performance
|
||||||
|
|
||||||
|
- Doctrine Query Cache nutzen
|
||||||
|
- Eager Loading für Relationen
|
||||||
|
- Opcache in Produktion aktivieren
|
||||||
|
- Assets kompilieren für Produktion
|
||||||
|
|
||||||
|
## Deployment
|
||||||
|
|
||||||
|
### Vorbereitung
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# .env.local für Produktion erstellen
|
||||||
|
cp .env .env.local
|
||||||
|
|
||||||
|
# Produktions-Werte setzen
|
||||||
|
APP_ENV=prod
|
||||||
|
APP_SECRET=<neues-secret-generieren>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Build für Produktion
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Composer Dependencies ohne Dev
|
||||||
|
composer install --no-dev --optimize-autoloader
|
||||||
|
|
||||||
|
# Cache warmup
|
||||||
|
php bin/console cache:warmup --env=prod
|
||||||
|
|
||||||
|
# Assets installieren
|
||||||
|
php bin/console assets:install public --symlink --relative --env=prod
|
||||||
|
```
|
||||||
|
|
||||||
|
### Database Migration
|
||||||
|
|
||||||
|
```bash
|
||||||
|
php bin/console doctrine:migrations:migrate --no-interaction --env=prod
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Siehe auch:**
|
||||||
|
- [Technical](technical.md) - Architektur & Konfiguration
|
||||||
|
- [Docker](docker.md) - Container-Management
|
||||||
|
- [Troubleshooting](troubleshooting.md) - Fehler beheben
|
||||||
|
|
||||||
|
[← Zurück zur Hauptseite](../README.md)
|
||||||
337
docs/docker.md
Normal file
337
docs/docker.md
Normal file
@@ -0,0 +1,337 @@
|
|||||||
|
# Docker
|
||||||
|
|
||||||
|
[← Zurück zur Hauptseite](../README.md)
|
||||||
|
|
||||||
|
## Container-Übersicht
|
||||||
|
|
||||||
|
Das Projekt verwendet 3 Docker-Container:
|
||||||
|
|
||||||
|
| Container | Image | Port | Beschreibung |
|
||||||
|
|-----------|-------|------|--------------|
|
||||||
|
| `immorechner_web` | Custom (PHP 8.4 + Apache) | 8080 | Web-Server & PHP |
|
||||||
|
| `immorechner_db` | mariadb:latest | 3306 | Datenbank |
|
||||||
|
| `immorechner_phpmyadmin` | phpmyadmin:latest | 8081 | DB-Verwaltung |
|
||||||
|
|
||||||
|
## Container-Management
|
||||||
|
|
||||||
|
### Starten
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Alle Container starten
|
||||||
|
docker-compose up -d
|
||||||
|
|
||||||
|
# Mit Build (nach Dockerfile-Änderungen)
|
||||||
|
docker-compose up -d --build
|
||||||
|
|
||||||
|
# Im Vordergrund (mit Logs)
|
||||||
|
docker-compose up
|
||||||
|
```
|
||||||
|
|
||||||
|
### Stoppen
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Container stoppen
|
||||||
|
docker-compose stop
|
||||||
|
|
||||||
|
# Container stoppen und entfernen
|
||||||
|
docker-compose down
|
||||||
|
|
||||||
|
# Container stoppen, entfernen + Volumes löschen
|
||||||
|
docker-compose down -v
|
||||||
|
```
|
||||||
|
|
||||||
|
### Neustarten
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Alle Container
|
||||||
|
docker-compose restart
|
||||||
|
|
||||||
|
# Einzelner Container
|
||||||
|
docker-compose restart web
|
||||||
|
docker-compose restart db
|
||||||
|
```
|
||||||
|
|
||||||
|
### Status prüfen
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Container-Status
|
||||||
|
docker-compose ps
|
||||||
|
|
||||||
|
# Alle Container (auch gestoppte)
|
||||||
|
docker ps -a
|
||||||
|
|
||||||
|
# Resource-Usage
|
||||||
|
docker stats
|
||||||
|
```
|
||||||
|
|
||||||
|
## Logs
|
||||||
|
|
||||||
|
### Container-Logs anzeigen
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Alle Container (Live)
|
||||||
|
docker-compose logs -f
|
||||||
|
|
||||||
|
# Nur Web-Container
|
||||||
|
docker-compose logs -f web
|
||||||
|
|
||||||
|
# Nur Datenbank
|
||||||
|
docker-compose logs -f db
|
||||||
|
|
||||||
|
# Nur phpMyAdmin
|
||||||
|
docker-compose logs -f phpmyadmin
|
||||||
|
|
||||||
|
# Letzte 100 Zeilen
|
||||||
|
docker-compose logs --tail=100 web
|
||||||
|
```
|
||||||
|
|
||||||
|
### Apache-Logs
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Access Log
|
||||||
|
docker-compose exec web tail -f /var/log/apache2/access.log
|
||||||
|
|
||||||
|
# Error Log
|
||||||
|
docker-compose exec web tail -f /var/log/apache2/error.log
|
||||||
|
```
|
||||||
|
|
||||||
|
### Symfony-Logs
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Dev Log
|
||||||
|
docker-compose exec web tail -f /var/www/html/var/log/dev.log
|
||||||
|
|
||||||
|
# Prod Log
|
||||||
|
docker-compose exec web tail -f /var/www/html/var/log/prod.log
|
||||||
|
```
|
||||||
|
|
||||||
|
## Container-Zugriff
|
||||||
|
|
||||||
|
### In Container einloggen
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Web-Container (Bash)
|
||||||
|
docker-compose exec web bash
|
||||||
|
|
||||||
|
# Datenbank-Container
|
||||||
|
docker-compose exec db bash
|
||||||
|
|
||||||
|
# phpMyAdmin-Container
|
||||||
|
docker-compose exec phpmyadmin bash
|
||||||
|
```
|
||||||
|
|
||||||
|
### Als Root einloggen
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose exec -u root web bash
|
||||||
|
```
|
||||||
|
|
||||||
|
## Befehle im Container ausführen
|
||||||
|
|
||||||
|
### PHP/Symfony
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Symfony Console
|
||||||
|
docker-compose exec web php bin/console
|
||||||
|
|
||||||
|
# PHP-Version prüfen
|
||||||
|
docker-compose exec web php -v
|
||||||
|
|
||||||
|
# PHP-Module anzeigen
|
||||||
|
docker-compose exec web php -m
|
||||||
|
|
||||||
|
# PHP-Konfiguration
|
||||||
|
docker-compose exec web php -i
|
||||||
|
```
|
||||||
|
|
||||||
|
### Composer
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Install
|
||||||
|
docker-compose exec web composer install
|
||||||
|
|
||||||
|
# Update
|
||||||
|
docker-compose exec web composer update
|
||||||
|
|
||||||
|
# Paket hinzufügen
|
||||||
|
docker-compose exec web composer require vendor/package
|
||||||
|
|
||||||
|
# Paket entfernen
|
||||||
|
docker-compose exec web composer remove vendor/package
|
||||||
|
|
||||||
|
# Autoloader neu generieren
|
||||||
|
docker-compose exec web composer dump-autoload
|
||||||
|
```
|
||||||
|
|
||||||
|
### Datenbank
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# MariaDB-Client öffnen
|
||||||
|
docker-compose exec db mariadb -u root -proot immorechner
|
||||||
|
|
||||||
|
# SQL-Datei importieren
|
||||||
|
docker-compose exec -T db mariadb -u root -proot immorechner < backup.sql
|
||||||
|
|
||||||
|
# Datenbank exportieren
|
||||||
|
docker-compose exec db mariadb-dump -u root -proot immorechner > backup.sql
|
||||||
|
|
||||||
|
# Tabellen anzeigen
|
||||||
|
docker-compose exec db mariadb -u root -proot -e "SHOW TABLES" immorechner
|
||||||
|
```
|
||||||
|
|
||||||
|
## Volumes
|
||||||
|
|
||||||
|
### Volumes anzeigen
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker volume ls
|
||||||
|
```
|
||||||
|
|
||||||
|
### Volume-Details
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker volume inspect immorechner_db_data
|
||||||
|
```
|
||||||
|
|
||||||
|
### Volume löschen
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# ACHTUNG: Löscht alle Daten!
|
||||||
|
docker volume rm immorechner_db_data
|
||||||
|
```
|
||||||
|
|
||||||
|
### Backup erstellen
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Datenbank-Backup
|
||||||
|
docker-compose exec db mariadb-dump -u root -proot immorechner > backup_$(date +%Y%m%d).sql
|
||||||
|
|
||||||
|
# Volume-Backup
|
||||||
|
docker run --rm -v immorechner_db_data:/data -v $(pwd):/backup alpine tar czf /backup/db_backup.tar.gz /data
|
||||||
|
```
|
||||||
|
|
||||||
|
## Images
|
||||||
|
|
||||||
|
### Images anzeigen
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker images
|
||||||
|
```
|
||||||
|
|
||||||
|
### Image neu bauen
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose build web
|
||||||
|
```
|
||||||
|
|
||||||
|
### Image mit Tag
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker build -t immorechner:latest .
|
||||||
|
```
|
||||||
|
|
||||||
|
### Image löschen
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker rmi immorechner-web
|
||||||
|
```
|
||||||
|
|
||||||
|
## Netzwerk
|
||||||
|
|
||||||
|
### Netzwerke anzeigen
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker network ls
|
||||||
|
```
|
||||||
|
|
||||||
|
### Netzwerk-Details
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker network inspect immorechner_immorechner_network
|
||||||
|
```
|
||||||
|
|
||||||
|
### Container im Netzwerk
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker network inspect immorechner_immorechner_network | grep Name
|
||||||
|
```
|
||||||
|
|
||||||
|
## Cleanup
|
||||||
|
|
||||||
|
### Gestoppte Container entfernen
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker container prune
|
||||||
|
```
|
||||||
|
|
||||||
|
### Ungenutzte Images entfernen
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker image prune
|
||||||
|
```
|
||||||
|
|
||||||
|
### Ungenutzte Volumes entfernen
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker volume prune
|
||||||
|
```
|
||||||
|
|
||||||
|
### Alles aufräumen
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# ACHTUNG: Löscht alles Ungenutzte!
|
||||||
|
docker system prune -a --volumes
|
||||||
|
```
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Container startet nicht
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Logs prüfen
|
||||||
|
docker-compose logs web
|
||||||
|
|
||||||
|
# Container im Debug-Modus starten
|
||||||
|
docker-compose up web
|
||||||
|
```
|
||||||
|
|
||||||
|
### Port bereits belegt
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Ports prüfen
|
||||||
|
netstat -ano | findstr :8080 # Windows
|
||||||
|
lsof -i :8080 # Mac/Linux
|
||||||
|
|
||||||
|
# In docker-compose.yml ändern:
|
||||||
|
ports:
|
||||||
|
- "8090:80" # Statt 8080:80
|
||||||
|
```
|
||||||
|
|
||||||
|
### Berechtigungsprobleme
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Berechtigungen setzen
|
||||||
|
docker-compose exec -u root web chown -R www-data:www-data /var/www/html
|
||||||
|
|
||||||
|
# Schreibrechte für var/
|
||||||
|
docker-compose exec -u root web chmod -R 777 /var/www/html/var
|
||||||
|
```
|
||||||
|
|
||||||
|
### Container-Reset
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Komplett neu starten
|
||||||
|
docker-compose down -v
|
||||||
|
docker-compose up -d --build
|
||||||
|
docker-compose exec web composer install
|
||||||
|
docker-compose exec web php bin/console doctrine:migrations:migrate --no-interaction
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Siehe auch:**
|
||||||
|
- [Installation](installation.md) - Setup-Anleitung
|
||||||
|
- [Development](development.md) - Entwickler-Workflow
|
||||||
|
- [Troubleshooting](troubleshooting.md) - Fehler beheben
|
||||||
|
|
||||||
|
[← Zurück zur Hauptseite](../README.md)
|
||||||
275
docs/features.md
Normal file
275
docs/features.md
Normal file
@@ -0,0 +1,275 @@
|
|||||||
|
# Features & Funktionalität
|
||||||
|
|
||||||
|
[← Zurück zur Hauptseite](../README.md)
|
||||||
|
|
||||||
|
## Übersicht
|
||||||
|
|
||||||
|
Der Immorechner bietet zwei Hauptkomponenten:
|
||||||
|
1. **Web-Frontend** - Interaktive Benutzeroberfläche für Endanwender
|
||||||
|
2. **REST-API** - Programmgesteuerter Zugriff für Integrationen
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Frontend-Features
|
||||||
|
|
||||||
|
### 1. Immobilienrechner (Startseite)
|
||||||
|
|
||||||
|
**URL:** http://localhost:8080/
|
||||||
|
|
||||||
|
Der Immobilienrechner ermöglicht die schnelle Berechnung wichtiger Kennzahlen einer Immobilie.
|
||||||
|
|
||||||
|
#### Eingabefelder
|
||||||
|
|
||||||
|
| Feld | Typ | Beschreibung | Pflicht |
|
||||||
|
|------|-----|--------------|---------|
|
||||||
|
| Adresse | Text | Vollständige Adresse der Immobilie | Nein |
|
||||||
|
| Kaufpreis | Zahl | Kaufpreis in Euro | Empfohlen |
|
||||||
|
| Wohnfläche | Zahl | Wohnfläche in m² | Ja |
|
||||||
|
| Nutzfläche | Zahl | Nutzfläche in m² | Nein |
|
||||||
|
| Zimmer | Zahl | Anzahl der Zimmer | Empfohlen |
|
||||||
|
| Baujahr | Zahl | Baujahr der Immobilie | Nein |
|
||||||
|
| Etage | Zahl | Stockwerk | Nein |
|
||||||
|
| Immobilientyp | Auswahl | Wohnung, Haus oder Gewerbe | Empfohlen |
|
||||||
|
| Bundesland | Auswahl | Deutsches Bundesland | Empfohlen |
|
||||||
|
| Heizungstyp | Auswahl | Ölheizung, Gasheizung, Wärmepumpe, Pelletheizung | Nein |
|
||||||
|
| Abschreibungszeit | Zahl | Jahre für Abschreibung (Standard: 50) | Nein |
|
||||||
|
| Garage | Checkbox | Garage vorhanden? | Nein |
|
||||||
|
|
||||||
|
#### Live-Berechnungen
|
||||||
|
|
||||||
|
Alle Werte werden **in Echtzeit** berechnet (ohne Seitenreload):
|
||||||
|
|
||||||
|
1. **Gesamtfläche**
|
||||||
|
- Formel: Wohnfläche + Nutzfläche
|
||||||
|
- Einheit: m²
|
||||||
|
|
||||||
|
2. **Preis pro m² Wohnfläche**
|
||||||
|
- Formel: Kaufpreis / Wohnfläche
|
||||||
|
- Einheit: €/m²
|
||||||
|
|
||||||
|
3. **Grunderwerbsteuer**
|
||||||
|
- Formel: Kaufpreis × Grunderwerbsteuersatz des Bundeslandes
|
||||||
|
- Sätze: 3,5% (Bayern) bis 6,5% (Brandenburg, NRW, Saarland, SH)
|
||||||
|
- Einheit: €
|
||||||
|
|
||||||
|
4. **Gesamtkosten**
|
||||||
|
- Formel: Kaufpreis + Grunderwerbsteuer
|
||||||
|
- Einheit: €
|
||||||
|
|
||||||
|
5. **Jährliche Abschreibung**
|
||||||
|
- Formel: Kaufpreis / Abschreibungszeit
|
||||||
|
- Standard-Abschreibungszeit: 50 Jahre
|
||||||
|
- Einheit: €/Jahr
|
||||||
|
|
||||||
|
6. **Alter der Immobilie**
|
||||||
|
- Formel: Aktuelles Jahr - Baujahr
|
||||||
|
- Einheit: Jahre
|
||||||
|
|
||||||
|
### 2. URL-Sharing für anonyme Nutzer
|
||||||
|
|
||||||
|
**Funktion:** "Link teilen" Button
|
||||||
|
|
||||||
|
- Kodiert alle Formulardaten in URL-Parameter
|
||||||
|
- Ermöglicht Teilen der Berechnung ohne Registrierung
|
||||||
|
- Link funktioniert auch nach Tagen/Wochen
|
||||||
|
- Daten werden **nicht** in der Datenbank gespeichert
|
||||||
|
- Ideal für schnelle Berechnungen und Vergleiche
|
||||||
|
|
||||||
|
**Beispiel-URL:**
|
||||||
|
```
|
||||||
|
http://localhost:8080/?adresse=Teststr+123&kaufpreis=300000&wohnflaeche=85&...
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Benutzer-Authentifizierung
|
||||||
|
|
||||||
|
#### Registrierung
|
||||||
|
|
||||||
|
**URL:** http://localhost:8080/register
|
||||||
|
|
||||||
|
- Name (Pflicht, mind. 2 Zeichen)
|
||||||
|
- E-Mail (Pflicht, muss gültig und eindeutig sein)
|
||||||
|
- Passwort (Pflicht, mind. 6 Zeichen)
|
||||||
|
- Passwort bestätigen
|
||||||
|
|
||||||
|
**Sicherheit:**
|
||||||
|
- Passwort wird mit bcrypt gehasht
|
||||||
|
- E-Mail muss eindeutig sein
|
||||||
|
- Validierung auf Client- und Server-Seite
|
||||||
|
|
||||||
|
#### Login
|
||||||
|
|
||||||
|
**URL:** http://localhost:8080/login
|
||||||
|
|
||||||
|
- E-Mail
|
||||||
|
- Passwort
|
||||||
|
|
||||||
|
**Session-basiert:**
|
||||||
|
- Bleibt aktiv bis zum Logout
|
||||||
|
- Cookie-basierte Session
|
||||||
|
- CSRF-Schutz integriert
|
||||||
|
|
||||||
|
#### Logout
|
||||||
|
|
||||||
|
- Link im Header "Abmelden"
|
||||||
|
- Beendet Session
|
||||||
|
- Redirect zur Startseite
|
||||||
|
|
||||||
|
### 4. Immobilien speichern (nur eingeloggte Nutzer)
|
||||||
|
|
||||||
|
**Funktion:** "Speichern" Button (erscheint nur nach Login)
|
||||||
|
|
||||||
|
- Speichert alle eingegebenen Daten in der Datenbank
|
||||||
|
- Immobilie wird dem eingeloggten Nutzer zugeordnet
|
||||||
|
- Nutzer kann nur eigene Immobilien sehen
|
||||||
|
- AJAX-basiert (kein Seitenreload)
|
||||||
|
- Erfolgs-/Fehlermeldung als Alert
|
||||||
|
|
||||||
|
### 5. Meine Immobilien
|
||||||
|
|
||||||
|
**URL:** http://localhost:8080/meine-immobilien (nur nach Login)
|
||||||
|
|
||||||
|
**Funktionen:**
|
||||||
|
- Übersicht aller gespeicherten Immobilien
|
||||||
|
- Anzeige aller Details pro Immobilie
|
||||||
|
- Berechnete Werte werden angezeigt
|
||||||
|
- Sortierung nach Erstellungsdatum (neueste zuerst)
|
||||||
|
|
||||||
|
**Angezeigt werden:**
|
||||||
|
- Typ, Kaufpreis, Flächen
|
||||||
|
- Zimmer, Baujahr, Etage
|
||||||
|
- Bundesland, Heizungstyp
|
||||||
|
- Garage (Ja/Nein)
|
||||||
|
- Erstellungsdatum
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## API-Features
|
||||||
|
|
||||||
|
Vollständige Details siehe [API-Dokumentation](api.md)
|
||||||
|
|
||||||
|
### 1. Dual-Authentifizierung
|
||||||
|
|
||||||
|
**Session-basiert (Frontend):**
|
||||||
|
- Form-Login mit E-Mail/Passwort
|
||||||
|
- Cookie-basierte Sessions
|
||||||
|
- Für Web-Interface
|
||||||
|
|
||||||
|
**API-Key-basiert (API):**
|
||||||
|
- Header: `X-API-KEY`
|
||||||
|
- Automatisch generiert bei User-Erstellung
|
||||||
|
- Für programmatischen Zugriff
|
||||||
|
|
||||||
|
### 2. Rollenbasierte Zugriffskontrolle
|
||||||
|
|
||||||
|
| Rolle | Rechte |
|
||||||
|
|-------|--------|
|
||||||
|
| **USER** | Eigene Immobilien verwalten |
|
||||||
|
| **ADMIN** | Alle Immobilien verwalten, alle User sehen |
|
||||||
|
| **MODERATOR** | Erweiterte Rechte |
|
||||||
|
| **TECHNICAL** | Bundesländer & Heizungstypen verwalten |
|
||||||
|
|
||||||
|
### 3. Mandantenfähigkeit
|
||||||
|
|
||||||
|
- Jeder User sieht nur eigene Immobilien
|
||||||
|
- Admins sehen alle Immobilien
|
||||||
|
- Automatische Filterung auf Basis des eingeloggten Users
|
||||||
|
- Keine manuelle Filterung nötig
|
||||||
|
|
||||||
|
### 4. Öffentliche Ressourcen
|
||||||
|
|
||||||
|
**Ohne Authentifizierung verfügbar:**
|
||||||
|
- `GET /api/bundeslands` - Alle Bundesländer mit Grunderwerbsteuersätzen
|
||||||
|
- `GET /api/heizungstyps` - Alle Heizungstypen
|
||||||
|
|
||||||
|
**Vorbefüllt:**
|
||||||
|
- 16 deutsche Bundesländer mit aktuellen Steuersätzen
|
||||||
|
- 4 Heizungstypen (Öl, Gas, Wärmepumpe, Pellet)
|
||||||
|
|
||||||
|
### 5. Swagger/OpenAPI-Dokumentation
|
||||||
|
|
||||||
|
**URL:** http://localhost:8080/api/docs.html
|
||||||
|
|
||||||
|
**Features:**
|
||||||
|
- Interaktive API-Dokumentation
|
||||||
|
- "Try it out" Funktion für alle Endpunkte
|
||||||
|
- Request/Response Beispiele
|
||||||
|
- Schema-Dokumentation
|
||||||
|
- Export als JSON/YAML
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Technische Features
|
||||||
|
|
||||||
|
### 1. Responsive Design
|
||||||
|
|
||||||
|
- Mobile-optimiert
|
||||||
|
- Grid-Layout passt sich an Bildschirmgröße an
|
||||||
|
- Touch-freundliche Buttons und Formulare
|
||||||
|
|
||||||
|
### 2. Performance
|
||||||
|
|
||||||
|
- **Live-Berechnungen** ohne Server-Anfragen
|
||||||
|
- **AJAX** für Speichern-Funktion (kein Reload)
|
||||||
|
- **Opcache** aktiviert in Produktion
|
||||||
|
- **Doctrine Query Cache**
|
||||||
|
|
||||||
|
### 3. Datenvalidierung
|
||||||
|
|
||||||
|
**Frontend:**
|
||||||
|
- HTML5-Validierung
|
||||||
|
- Required-Felder
|
||||||
|
- Type-Checking (number, email, etc.)
|
||||||
|
|
||||||
|
**Backend:**
|
||||||
|
- Symfony Validator
|
||||||
|
- Doctrine Constraints
|
||||||
|
- Custom Validation Rules
|
||||||
|
|
||||||
|
### 4. Sicherheit
|
||||||
|
|
||||||
|
- **CSRF-Protection** für alle Forms
|
||||||
|
- **Passwort-Hashing** mit bcrypt
|
||||||
|
- **SQL-Injection-Schutz** durch Doctrine ORM
|
||||||
|
- **XSS-Schutz** durch Twig Auto-Escaping
|
||||||
|
- **CORS-Konfiguration** für API
|
||||||
|
|
||||||
|
### 5. Separation of Concerns
|
||||||
|
|
||||||
|
- **CSS** in separaten Dateien (`public/css/`)
|
||||||
|
- **JavaScript** in separaten Dateien (`public/js/`)
|
||||||
|
- **Templates** mit Twig
|
||||||
|
- **Controller** für Logik
|
||||||
|
- **Entities** für Datenmodell
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Berechnungslogik
|
||||||
|
|
||||||
|
### Grunderwerbsteuer
|
||||||
|
|
||||||
|
Bundesland-spezifisch (Stand 2025):
|
||||||
|
|
||||||
|
| Bundesland | Steuersatz |
|
||||||
|
|------------|-----------|
|
||||||
|
| Bayern | 3,5% |
|
||||||
|
| Baden-Württemberg, Bremen, Niedersachsen, Rheinland-Pfalz, Sachsen-Anhalt, Thüringen | 5,0% |
|
||||||
|
| Hamburg, Sachsen | 5,5% |
|
||||||
|
| Berlin, Hessen, Mecklenburg-Vorpommern | 6,0% |
|
||||||
|
| Brandenburg, NRW, Saarland, Schleswig-Holstein | 6,5% |
|
||||||
|
|
||||||
|
### Kaufnebenkosten (nur API)
|
||||||
|
|
||||||
|
Bei API-Anfragen werden zusätzlich berechnet:
|
||||||
|
- **Notarkosten:** ca. 1,5% des Kaufpreises
|
||||||
|
- **Grundbuchkosten:** ca. 0,5% des Kaufpreises
|
||||||
|
- **Grunderwerbsteuer:** siehe oben
|
||||||
|
- **Gesamt:** Summe aller Nebenkosten
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Siehe auch:**
|
||||||
|
- [Technische Dokumentation](technical.md) - Architektur & Datenbank
|
||||||
|
- [API-Dokumentation](api.md) - REST-API Details
|
||||||
|
- [Installation](installation.md) - Setup-Anleitung
|
||||||
|
|
||||||
|
[← Zurück zur Hauptseite](../README.md)
|
||||||
291
docs/installation.md
Normal file
291
docs/installation.md
Normal file
@@ -0,0 +1,291 @@
|
|||||||
|
# Installation & Setup
|
||||||
|
|
||||||
|
[← Zurück zur Hauptseite](../README.md)
|
||||||
|
|
||||||
|
## Voraussetzungen
|
||||||
|
|
||||||
|
- **Docker Desktop** (Windows/Mac) oder **Docker Engine + Docker Compose** (Linux)
|
||||||
|
- **Git**
|
||||||
|
- Mindestens 2GB freier RAM für Docker
|
||||||
|
- Ports 8080, 8081 und 3306 verfügbar
|
||||||
|
|
||||||
|
## Installations-Schritte
|
||||||
|
|
||||||
|
### 1. Repository klonen
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone <repository-url>
|
||||||
|
cd immorechner
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Docker-Container starten
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose up -d --build
|
||||||
|
```
|
||||||
|
|
||||||
|
Dieser Befehl:
|
||||||
|
- Baut das PHP 8.4 Image mit allen benötigten Extensions
|
||||||
|
- Startet MariaDB Container
|
||||||
|
- Startet phpMyAdmin Container
|
||||||
|
- Startet den Apache-Webserver
|
||||||
|
|
||||||
|
**Hinweis:** Der erste Build kann 5-10 Minuten dauern.
|
||||||
|
|
||||||
|
### 3. Dependencies installieren
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose exec web composer install
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Bundle-Assets installieren
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose exec web php bin/console assets:install public --symlink --relative
|
||||||
|
```
|
||||||
|
|
||||||
|
Dieser Schritt ist wichtig für die Swagger UI (CSS, JS, Bilder).
|
||||||
|
|
||||||
|
### 5. Datenbank-Schema erstellen
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose exec web php bin/console doctrine:migrations:migrate --no-interaction
|
||||||
|
```
|
||||||
|
|
||||||
|
Diese Migration erstellt:
|
||||||
|
- Users-Tabelle mit Passwort- und API-Key-Feldern
|
||||||
|
- Bundesländer-Tabelle (vorbefüllt mit allen 16 deutschen Bundesländern)
|
||||||
|
- Heizungstypen-Tabelle (vorbefüllt mit Ölheizung, Gasheizung, Wärmepumpe, Pelletheizung)
|
||||||
|
- Immobilien-Tabelle mit allen Relationen
|
||||||
|
|
||||||
|
### 6. Cache leeren
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose exec web php bin/console cache:clear
|
||||||
|
```
|
||||||
|
|
||||||
|
## Überprüfung der Installation
|
||||||
|
|
||||||
|
### Anwendung testen
|
||||||
|
|
||||||
|
Öffnen Sie die folgenden URLs in Ihrem Browser:
|
||||||
|
|
||||||
|
1. **Frontend (Rechner):** http://localhost:8080
|
||||||
|
- Sie sollten den Immobilienrechner sehen
|
||||||
|
- Bundesländer-Dropdown sollte befüllt sein
|
||||||
|
- Heizungstypen-Dropdown sollte befüllt sein
|
||||||
|
|
||||||
|
2. **API-Dokumentation:** http://localhost:8080/api/docs.html
|
||||||
|
- Swagger UI sollte mit CSS/Styling laden
|
||||||
|
- Alle API-Endpunkte sollten sichtbar sein
|
||||||
|
|
||||||
|
3. **phpMyAdmin:** http://localhost:8081
|
||||||
|
- Server: `db`
|
||||||
|
- Benutzer: `root`
|
||||||
|
- Passwort: `root`
|
||||||
|
- Datenbank `immorechner` sollte existieren
|
||||||
|
|
||||||
|
### Datenbank überprüfen
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# In Container einloggen
|
||||||
|
docker-compose exec db bash
|
||||||
|
|
||||||
|
# MariaDB-Client starten
|
||||||
|
mariadb -u root -proot immorechner
|
||||||
|
|
||||||
|
# Tabellen anzeigen
|
||||||
|
SHOW TABLES;
|
||||||
|
|
||||||
|
# Bundesländer überprüfen (sollte 16 Einträge haben)
|
||||||
|
SELECT COUNT(*) FROM bundeslaender;
|
||||||
|
|
||||||
|
# Heizungstypen überprüfen (sollte 4 Einträge haben)
|
||||||
|
SELECT COUNT(*) FROM heizungstypen;
|
||||||
|
|
||||||
|
# Beenden
|
||||||
|
EXIT;
|
||||||
|
```
|
||||||
|
|
||||||
|
## Erste Schritte nach der Installation
|
||||||
|
|
||||||
|
### 1. Testbenutzer anlegen
|
||||||
|
|
||||||
|
#### Via Frontend (Empfohlen)
|
||||||
|
|
||||||
|
1. Öffnen Sie http://localhost:8080/register
|
||||||
|
2. Registrieren Sie sich mit:
|
||||||
|
- Name: "Test User"
|
||||||
|
- E-Mail: "test@example.com"
|
||||||
|
- Passwort: "test123" (min. 6 Zeichen)
|
||||||
|
3. Nach der Registrierung werden Sie zum Login weitergeleitet
|
||||||
|
4. Melden Sie sich an
|
||||||
|
|
||||||
|
#### Via API
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -X POST http://localhost:8080/api/users \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{
|
||||||
|
"name": "Test User",
|
||||||
|
"email": "test@example.com",
|
||||||
|
"role": "user"
|
||||||
|
}'
|
||||||
|
```
|
||||||
|
|
||||||
|
**Hinweis:** Die API-Response enthält den `apiKey`, den Sie für API-Anfragen benötigen.
|
||||||
|
|
||||||
|
### 2. Erste Immobilie berechnen
|
||||||
|
|
||||||
|
#### Via Frontend
|
||||||
|
|
||||||
|
1. Gehen Sie zu http://localhost:8080/
|
||||||
|
2. Füllen Sie das Formular aus (mindestens: Adresse, Kaufpreis, Wohnfläche)
|
||||||
|
3. Sehen Sie die Live-Berechnungen rechts
|
||||||
|
4. Optional: Klicken Sie auf "Link teilen" zum Teilen
|
||||||
|
5. Wenn angemeldet: Klicken Sie auf "Speichern"
|
||||||
|
|
||||||
|
#### Via API
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Ersetzen Sie YOUR_API_KEY mit dem API-Key aus Schritt 1
|
||||||
|
curl -X POST http://localhost:8080/api/immobilies \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-H "X-API-KEY: YOUR_API_KEY" \
|
||||||
|
-d '{
|
||||||
|
"verwalter": "/api/users/1",
|
||||||
|
"adresse": "Teststraße 123, 12345 Teststadt",
|
||||||
|
"wohnflaeche": 85,
|
||||||
|
"nutzflaeche": 15,
|
||||||
|
"zimmer": 3,
|
||||||
|
"typ": "wohnung",
|
||||||
|
"kaufpreis": 300000,
|
||||||
|
"bundesland": "/api/bundeslands/1"
|
||||||
|
}'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Umgebungsvariablen anpassen
|
||||||
|
|
||||||
|
Die Datei `.env` enthält alle wichtigen Konfigurationen:
|
||||||
|
|
||||||
|
```env
|
||||||
|
# Symfony
|
||||||
|
APP_ENV=dev # Für Produktion: prod
|
||||||
|
APP_SECRET=<generiert> # Für Produktion: neu generieren
|
||||||
|
|
||||||
|
# Datenbank
|
||||||
|
DATABASE_URL="mysql://immorechner_user:immorechner_pass@db:3306/immorechner?serverVersion=mariadb-11.7.1&charset=utf8mb4"
|
||||||
|
|
||||||
|
# CORS (nur für API relevant)
|
||||||
|
CORS_ALLOW_ORIGIN='^https?://(localhost|127\.0\.0\.1)(:[0-9]+)?$'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Für Produktion
|
||||||
|
|
||||||
|
Erstellen Sie eine `.env.local` Datei (wird von Git ignoriert):
|
||||||
|
|
||||||
|
```env
|
||||||
|
APP_ENV=prod
|
||||||
|
APP_SECRET=<neue-generierte-secret-hier>
|
||||||
|
DATABASE_URL="mysql://prod_user:sichere_passwort@db-host:3306/prod_db?serverVersion=mariadb-11.7.1&charset=utf8mb4"
|
||||||
|
CORS_ALLOW_ORIGIN='^https?://(ihre-domain\.com)(:[0-9]+)?$'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Ports anpassen
|
||||||
|
|
||||||
|
Falls die Standard-Ports bereits belegt sind, können Sie diese in `docker-compose.yml` ändern:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
services:
|
||||||
|
web:
|
||||||
|
ports:
|
||||||
|
- "8090:80" # Statt 8080:80
|
||||||
|
|
||||||
|
db:
|
||||||
|
ports:
|
||||||
|
- "3307:3306" # Statt 3306:3306
|
||||||
|
|
||||||
|
phpmyadmin:
|
||||||
|
ports:
|
||||||
|
- "8091:80" # Statt 8081:80
|
||||||
|
```
|
||||||
|
|
||||||
|
## Häufige Probleme bei der Installation
|
||||||
|
|
||||||
|
### Container starten nicht
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Container-Logs prüfen
|
||||||
|
docker-compose logs
|
||||||
|
|
||||||
|
# Spezifischen Container-Log prüfen
|
||||||
|
docker-compose logs web
|
||||||
|
docker-compose logs db
|
||||||
|
|
||||||
|
# Container-Status prüfen
|
||||||
|
docker ps -a
|
||||||
|
```
|
||||||
|
|
||||||
|
### "Permission Denied" Fehler
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Container neu bauen und Berechtigungen setzen
|
||||||
|
docker-compose down
|
||||||
|
docker-compose up -d --build
|
||||||
|
|
||||||
|
# Berechtigungen im Container setzen
|
||||||
|
docker-compose exec web chown -R www-data:www-data /var/www/html/var
|
||||||
|
```
|
||||||
|
|
||||||
|
### Datenbank-Verbindungsfehler
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Prüfen ob DB-Container läuft
|
||||||
|
docker ps | grep db
|
||||||
|
|
||||||
|
# DB-Logs prüfen
|
||||||
|
docker-compose logs db
|
||||||
|
|
||||||
|
# Warten bis DB bereit ist (kann 30-60 Sekunden dauern)
|
||||||
|
docker-compose exec web php bin/console doctrine:query:sql "SELECT 1"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Composer-Fehler
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Composer Cache leeren
|
||||||
|
docker-compose exec web composer clear-cache
|
||||||
|
|
||||||
|
# Dependencies neu installieren
|
||||||
|
docker-compose exec web rm -rf vendor
|
||||||
|
docker-compose exec web composer install
|
||||||
|
```
|
||||||
|
|
||||||
|
## Deinstallation
|
||||||
|
|
||||||
|
### Nur Container stoppen
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose down
|
||||||
|
```
|
||||||
|
|
||||||
|
### Container und Volumes löschen (Datenbank wird gelöscht!)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose down -v
|
||||||
|
```
|
||||||
|
|
||||||
|
### Alles entfernen (inkl. Images)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose down -v --rmi all
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Nächste Schritte:**
|
||||||
|
- [Features & Funktionalität](features.md) - Übersicht aller Funktionen
|
||||||
|
- [API-Dokumentation](api.md) - REST-API verwenden
|
||||||
|
- [Entwicklung](development.md) - Development-Workflow
|
||||||
|
|
||||||
|
[← Zurück zur Hauptseite](../README.md)
|
||||||
424
docs/technical.md
Normal file
424
docs/technical.md
Normal file
@@ -0,0 +1,424 @@
|
|||||||
|
# Technische Dokumentation
|
||||||
|
|
||||||
|
[← Zurück zur Hauptseite](../README.md)
|
||||||
|
|
||||||
|
## Technologie-Stack
|
||||||
|
|
||||||
|
- **Backend**: PHP 8.4
|
||||||
|
- **Framework**: Symfony 7.3
|
||||||
|
- **Datenbank**: MariaDB 11.7
|
||||||
|
- **ORM**: Doctrine 3.0
|
||||||
|
- **API**: API Platform 4.2
|
||||||
|
- **Template Engine**: Twig 3.22
|
||||||
|
- **Webserver**: Apache 2.4 mit mod_rewrite
|
||||||
|
- **Container**: Docker & Docker Compose
|
||||||
|
- **Frontend**: jQuery 3.7.1, separates CSS/JS
|
||||||
|
|
||||||
|
## Architektur
|
||||||
|
|
||||||
|
### Schichtenmodell
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────────────────────────────┐
|
||||||
|
│ Presentation Layer │
|
||||||
|
│ (Twig Templates, CSS, JavaScript) │
|
||||||
|
└─────────────────────────────────────┘
|
||||||
|
↓
|
||||||
|
┌─────────────────────────────────────┐
|
||||||
|
│ Controller Layer │
|
||||||
|
│ (HomeController, AuthController, │
|
||||||
|
│ ImmobilienSaveController) │
|
||||||
|
└─────────────────────────────────────┘
|
||||||
|
↓
|
||||||
|
┌─────────────────────────────────────┐
|
||||||
|
│ Service Layer │
|
||||||
|
│ (Security, Validation, Business │
|
||||||
|
│ Logic) │
|
||||||
|
└─────────────────────────────────────┘
|
||||||
|
↓
|
||||||
|
┌─────────────────────────────────────┐
|
||||||
|
│ Persistence Layer │
|
||||||
|
│ (Doctrine ORM, Repositories) │
|
||||||
|
└─────────────────────────────────────┘
|
||||||
|
↓
|
||||||
|
┌─────────────────────────────────────┐
|
||||||
|
│ Database Layer │
|
||||||
|
│ (MariaDB) │
|
||||||
|
└─────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
### Komponenten
|
||||||
|
|
||||||
|
#### Frontend
|
||||||
|
- **Templates:** `templates/` (Twig)
|
||||||
|
- **CSS:** `public/css/` (calculator.css, auth.css)
|
||||||
|
- **JavaScript:** `public/js/` (calculator.js mit jQuery)
|
||||||
|
|
||||||
|
#### Backend
|
||||||
|
- **Controller:** `src/Controller/` (Request Handling)
|
||||||
|
- **Entity:** `src/Entity/` (Datenmodelle)
|
||||||
|
- **Repository:** `src/Repository/` (Datenbank-Queries)
|
||||||
|
- **Security:** `src/Security/` (Authentifizierung)
|
||||||
|
- **Enum:** `src/Enum/` (PHP Enums)
|
||||||
|
|
||||||
|
## Datenbank-Schema
|
||||||
|
|
||||||
|
### Entity-Relationship-Diagram
|
||||||
|
|
||||||
|
```
|
||||||
|
┌──────────────┐ ┌────────────────┐
|
||||||
|
│ User │ 1 * │ Immobilie │
|
||||||
|
│──────────────│◄────────│────────────────│
|
||||||
|
│ id │ │ id │
|
||||||
|
│ name │ │ verwalter_id │
|
||||||
|
│ email │ │ adresse │
|
||||||
|
│ password │ │ wohnflaeche │
|
||||||
|
│ role │ │ nutzflaeche │
|
||||||
|
│ api_key │ │ zimmer │
|
||||||
|
│ created_at │ │ kaufpreis │
|
||||||
|
└──────────────┘ │ typ │
|
||||||
|
│ ... │
|
||||||
|
└────────────────┘
|
||||||
|
│
|
||||||
|
┌──────────────┴──────────────┐
|
||||||
|
│ │
|
||||||
|
▼ ▼
|
||||||
|
┌───────────────┐ ┌─────────────────┐
|
||||||
|
│ Bundesland │ │ Heizungstyp │
|
||||||
|
│───────────────│ │─────────────────│
|
||||||
|
│ id │ │ id │
|
||||||
|
│ name │ │ name │
|
||||||
|
│ grunderwerbst.│ └─────────────────┘
|
||||||
|
└───────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
### Tabellen-Details
|
||||||
|
|
||||||
|
#### User-Tabelle
|
||||||
|
|
||||||
|
| Feld | Typ | Constraints | Beschreibung |
|
||||||
|
|------|-----|-------------|--------------|
|
||||||
|
| id | INT | PK, AUTO_INCREMENT | Eindeutige ID |
|
||||||
|
| name | VARCHAR(255) | NOT NULL | Benutzername |
|
||||||
|
| email | VARCHAR(255) | NOT NULL, UNIQUE | E-Mail-Adresse |
|
||||||
|
| password | VARCHAR(255) | NULL | Bcrypt-Hash des Passworts |
|
||||||
|
| role | VARCHAR(255) | NOT NULL | Benutzerrolle (Enum) |
|
||||||
|
| api_key | VARCHAR(64) | NOT NULL, UNIQUE | SHA256 API-Key |
|
||||||
|
| created_at | DATETIME | NOT NULL | Erstellungsdatum |
|
||||||
|
|
||||||
|
**Benutzerrollen (Enum):**
|
||||||
|
- `user` - Normaler Benutzer
|
||||||
|
- `admin` - Administrator
|
||||||
|
- `moderator` - Moderator
|
||||||
|
- `technical` - Technischer User
|
||||||
|
|
||||||
|
#### Bundesland-Tabelle
|
||||||
|
|
||||||
|
| Feld | Typ | Constraints | Beschreibung |
|
||||||
|
|------|-----|-------------|--------------|
|
||||||
|
| id | INT | PK, AUTO_INCREMENT | Eindeutige ID |
|
||||||
|
| name | VARCHAR(100) | NOT NULL, UNIQUE | Name des Bundeslandes |
|
||||||
|
| grunderwerbsteuer | DECIMAL(4,2) | NOT NULL | Steuersatz in % |
|
||||||
|
|
||||||
|
**Vorbefüllt mit 16 deutschen Bundesländern**
|
||||||
|
|
||||||
|
#### Heizungstyp-Tabelle
|
||||||
|
|
||||||
|
| Feld | Typ | Constraints | Beschreibung |
|
||||||
|
|------|-----|-------------|--------------|
|
||||||
|
| id | INT | PK, AUTO_INCREMENT | Eindeutige ID |
|
||||||
|
| name | VARCHAR(100) | NOT NULL, UNIQUE | Name des Heizungstyps |
|
||||||
|
|
||||||
|
**Vorbefüllt mit:** Ölheizung, Gasheizung, Wärmepumpe, Pelletheizung
|
||||||
|
|
||||||
|
#### Immobilien-Tabelle
|
||||||
|
|
||||||
|
| Feld | Typ | Constraints | Beschreibung |
|
||||||
|
|------|-----|-------------|--------------|
|
||||||
|
| id | INT | PK, AUTO_INCREMENT | Eindeutige ID |
|
||||||
|
| verwalter_id | INT | FK → users.id, NOT NULL | Besitzer der Immobilie |
|
||||||
|
| bundesland_id | INT | FK → bundeslaender.id, NULL | Bundesland |
|
||||||
|
| heizungstyp_id | INT | FK → heizungstypen.id, NULL | Heizungstyp |
|
||||||
|
| adresse | VARCHAR(255) | NOT NULL | Vollständige Adresse |
|
||||||
|
| wohnflaeche | INT | NOT NULL | Wohnfläche in m² |
|
||||||
|
| nutzflaeche | INT | NOT NULL | Nutzfläche in m² |
|
||||||
|
| garage | BOOLEAN | NOT NULL, DEFAULT false | Garage vorhanden? |
|
||||||
|
| zimmer | INT | NOT NULL | Anzahl Zimmer |
|
||||||
|
| baujahr | INT | NULL | Baujahr (1800-2100) |
|
||||||
|
| typ | VARCHAR(255) | NOT NULL | Immobilientyp (Enum) |
|
||||||
|
| beschreibung | TEXT | NULL | Freitextbeschreibung |
|
||||||
|
| etage | INT | NULL | Stockwerk (0-10) |
|
||||||
|
| kaufpreis | INT | NULL | Kaufpreis in Euro |
|
||||||
|
| abschreibungszeit | INT | NULL | Abschreibungszeit in Jahren |
|
||||||
|
| created_at | DATETIME | NOT NULL | Erstellungsdatum |
|
||||||
|
| updated_at | DATETIME | NOT NULL | Letzte Änderung |
|
||||||
|
|
||||||
|
**Immobilientyp (Enum):**
|
||||||
|
- `wohnung` - Wohnung
|
||||||
|
- `haus` - Haus
|
||||||
|
- `grundstueck` - Grundstück
|
||||||
|
- `gewerbe` - Gewerbe
|
||||||
|
- `buero` - Büro
|
||||||
|
|
||||||
|
### Indizes
|
||||||
|
|
||||||
|
```sql
|
||||||
|
-- User
|
||||||
|
CREATE UNIQUE INDEX UNIQ_1483A5E9E7927C74 ON users (email);
|
||||||
|
CREATE UNIQUE INDEX UNIQ_1483A5E9C912ED9D ON users (api_key);
|
||||||
|
|
||||||
|
-- Bundesland
|
||||||
|
CREATE UNIQUE INDEX UNIQ_DF7DFAB25E237E06 ON bundeslaender (name);
|
||||||
|
|
||||||
|
-- Heizungstyp
|
||||||
|
CREATE UNIQUE INDEX UNIQ_6161C2A65E237E06 ON heizungstypen (name);
|
||||||
|
|
||||||
|
-- Immobilie
|
||||||
|
CREATE INDEX IDX_2C789D3E5F66D3 ON immobilien (verwalter_id);
|
||||||
|
CREATE INDEX IDX_2C789DC1B4DB52 ON immobilien (heizungstyp_id);
|
||||||
|
CREATE INDEX IDX_2C789DB74FDBEB ON immobilien (bundesland_id);
|
||||||
|
```
|
||||||
|
|
||||||
|
## Konfiguration
|
||||||
|
|
||||||
|
### Umgebungsvariablen (.env)
|
||||||
|
|
||||||
|
```env
|
||||||
|
# Symfony
|
||||||
|
APP_ENV=dev # Umgebung: dev | prod | test
|
||||||
|
APP_SECRET=<32-zeichen-hex> # Symfony Secret für Verschlüsselung
|
||||||
|
|
||||||
|
# Datenbank
|
||||||
|
DATABASE_URL="mysql://immorechner_user:immorechner_pass@db:3306/immorechner?serverVersion=mariadb-11.7.1&charset=utf8mb4"
|
||||||
|
|
||||||
|
# Routing
|
||||||
|
DEFAULT_URI=http://localhost
|
||||||
|
|
||||||
|
# CORS (für API)
|
||||||
|
CORS_ALLOW_ORIGIN='^https?://(localhost|127\.0\.0\.1)(:[0-9]+)?$'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Services (config/services.yaml)
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
services:
|
||||||
|
_defaults:
|
||||||
|
autowire: true
|
||||||
|
autoconfigure: true
|
||||||
|
|
||||||
|
App\:
|
||||||
|
resource: '../src/'
|
||||||
|
exclude:
|
||||||
|
- '../src/Entity/'
|
||||||
|
- '../src/Repository/'
|
||||||
|
- '../src/Kernel.php'
|
||||||
|
|
||||||
|
App\Controller\:
|
||||||
|
resource: '../src/Controller/'
|
||||||
|
tags: ['controller.service_arguments']
|
||||||
|
|
||||||
|
App\Repository\:
|
||||||
|
resource: '../src/Repository/'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Security (config/packages/security.yaml)
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
security:
|
||||||
|
password_hashers:
|
||||||
|
Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface: 'auto'
|
||||||
|
|
||||||
|
providers:
|
||||||
|
app_user_provider:
|
||||||
|
entity:
|
||||||
|
class: App\Entity\User
|
||||||
|
property: email
|
||||||
|
|
||||||
|
firewalls:
|
||||||
|
# API mit API-Key
|
||||||
|
api:
|
||||||
|
pattern: ^/api
|
||||||
|
stateless: true
|
||||||
|
custom_authenticators:
|
||||||
|
- App\Security\ApiKeyAuthenticator
|
||||||
|
|
||||||
|
# Frontend mit Form-Login
|
||||||
|
main:
|
||||||
|
lazy: true
|
||||||
|
provider: app_user_provider
|
||||||
|
form_login:
|
||||||
|
login_path: app_login
|
||||||
|
check_path: app_login
|
||||||
|
default_target_path: app_home
|
||||||
|
logout:
|
||||||
|
path: app_logout
|
||||||
|
target: app_home
|
||||||
|
```
|
||||||
|
|
||||||
|
### API Platform (config/packages/api_platform.yaml)
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
api_platform:
|
||||||
|
title: 'Immorechner API'
|
||||||
|
version: 1.0.0
|
||||||
|
mapping:
|
||||||
|
paths: ['%kernel.project_dir%/src/Entity']
|
||||||
|
defaults:
|
||||||
|
stateless: true
|
||||||
|
formats:
|
||||||
|
jsonld: ['application/ld+json']
|
||||||
|
json: ['application/json']
|
||||||
|
```
|
||||||
|
|
||||||
|
## Docker-Konfiguration
|
||||||
|
|
||||||
|
### docker-compose.yml
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
services:
|
||||||
|
web:
|
||||||
|
build: .
|
||||||
|
container_name: immorechner_web
|
||||||
|
ports:
|
||||||
|
- "8080:80"
|
||||||
|
volumes:
|
||||||
|
- .:/var/www/html
|
||||||
|
depends_on:
|
||||||
|
- db
|
||||||
|
|
||||||
|
db:
|
||||||
|
image: mariadb:latest
|
||||||
|
container_name: immorechner_db
|
||||||
|
environment:
|
||||||
|
MYSQL_ROOT_PASSWORD: root
|
||||||
|
MYSQL_DATABASE: immorechner
|
||||||
|
MYSQL_USER: immorechner_user
|
||||||
|
MYSQL_PASSWORD: immorechner_pass
|
||||||
|
ports:
|
||||||
|
- "3306:3306"
|
||||||
|
volumes:
|
||||||
|
- db_data:/var/lib/mysql
|
||||||
|
|
||||||
|
phpmyadmin:
|
||||||
|
image: phpmyadmin:latest
|
||||||
|
container_name: immorechner_phpmyadmin
|
||||||
|
ports:
|
||||||
|
- "8081:80"
|
||||||
|
environment:
|
||||||
|
PMA_HOST: db
|
||||||
|
PMA_USER: root
|
||||||
|
PMA_PASSWORD: root
|
||||||
|
```
|
||||||
|
|
||||||
|
### Dockerfile
|
||||||
|
|
||||||
|
```dockerfile
|
||||||
|
FROM php:8.4-apache
|
||||||
|
|
||||||
|
# Install dependencies
|
||||||
|
RUN apt-get update && apt-get install -y \
|
||||||
|
libpng-dev libonig-dev libxml2-dev libicu-dev \
|
||||||
|
libzip-dev git curl unzip
|
||||||
|
|
||||||
|
# Install PHP extensions
|
||||||
|
RUN docker-php-ext-install pdo_mysql mbstring exif \
|
||||||
|
pcntl bcmath gd zip intl opcache
|
||||||
|
|
||||||
|
# Enable Apache modules
|
||||||
|
RUN a2enmod rewrite headers
|
||||||
|
|
||||||
|
# Copy Composer
|
||||||
|
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
|
||||||
|
|
||||||
|
# Set working directory
|
||||||
|
WORKDIR /var/www/html
|
||||||
|
|
||||||
|
# Copy application
|
||||||
|
COPY . /var/www/html
|
||||||
|
|
||||||
|
# Set permissions
|
||||||
|
RUN chown -R www-data:www-data /var/www/html
|
||||||
|
```
|
||||||
|
|
||||||
|
## Performance-Optimierungen
|
||||||
|
|
||||||
|
### Opcache (Produktion)
|
||||||
|
|
||||||
|
In Produktion ist Opcache aktiviert:
|
||||||
|
|
||||||
|
```ini
|
||||||
|
opcache.enable=1
|
||||||
|
opcache.memory_consumption=256
|
||||||
|
opcache.max_accelerated_files=20000
|
||||||
|
opcache.validate_timestamps=0
|
||||||
|
```
|
||||||
|
|
||||||
|
### Doctrine Query Cache
|
||||||
|
|
||||||
|
Doctrine nutzt automatisch Query-Cache in Produktion.
|
||||||
|
|
||||||
|
### Asset Compilation
|
||||||
|
|
||||||
|
Assets werden bei Deployment kompiliert:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
php bin/console assets:install public --symlink --relative
|
||||||
|
```
|
||||||
|
|
||||||
|
## Sicherheit
|
||||||
|
|
||||||
|
### CSRF-Schutz
|
||||||
|
|
||||||
|
Alle Forms verwenden CSRF-Tokens:
|
||||||
|
|
||||||
|
```twig
|
||||||
|
<input type="hidden" name="_csrf_token" value="{{ csrf_token('authenticate') }}">
|
||||||
|
```
|
||||||
|
|
||||||
|
### Passwort-Hashing
|
||||||
|
|
||||||
|
Passwörter werden mit bcrypt gehasht:
|
||||||
|
|
||||||
|
```php
|
||||||
|
$hashedPassword = $passwordHasher->hashPassword($user, $password);
|
||||||
|
```
|
||||||
|
|
||||||
|
### API-Key-Generierung
|
||||||
|
|
||||||
|
API-Keys sind SHA256-Hashes:
|
||||||
|
|
||||||
|
```php
|
||||||
|
return hash('sha256', random_bytes(32).microtime(true));
|
||||||
|
```
|
||||||
|
|
||||||
|
### SQL-Injection-Schutz
|
||||||
|
|
||||||
|
Doctrine ORM verhindert SQL-Injection durch Prepared Statements.
|
||||||
|
|
||||||
|
### XSS-Schutz
|
||||||
|
|
||||||
|
Twig escaped automatisch alle Ausgaben.
|
||||||
|
|
||||||
|
## Migrations
|
||||||
|
|
||||||
|
Migrationen werden mit Doctrine Migrations verwaltet:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Neue Migration erstellen
|
||||||
|
php bin/console doctrine:migrations:diff
|
||||||
|
|
||||||
|
# Migrationen ausführen
|
||||||
|
php bin/console doctrine:migrations:migrate
|
||||||
|
|
||||||
|
# Migration-Status anzeigen
|
||||||
|
php bin/console doctrine:migrations:status
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Siehe auch:**
|
||||||
|
- [Installation](installation.md) - Setup-Anleitung
|
||||||
|
- [Development](development.md) - Entwickler-Workflow
|
||||||
|
- [Docker](docker.md) - Container-Management
|
||||||
|
|
||||||
|
[← Zurück zur Hauptseite](../README.md)
|
||||||
432
docs/troubleshooting.md
Normal file
432
docs/troubleshooting.md
Normal file
@@ -0,0 +1,432 @@
|
|||||||
|
# Fehlerbehebung
|
||||||
|
|
||||||
|
[← Zurück zur Hauptseite](../README.md)
|
||||||
|
|
||||||
|
## Häufige Probleme
|
||||||
|
|
||||||
|
### Frontend-Probleme
|
||||||
|
|
||||||
|
#### Seite lädt ohne CSS/JavaScript
|
||||||
|
|
||||||
|
**Problem:** Seite wird angezeigt, aber ohne Styling oder JavaScript-Funktionalität.
|
||||||
|
|
||||||
|
**Lösung:**
|
||||||
|
```bash
|
||||||
|
# Assets installieren
|
||||||
|
docker-compose exec web php bin/console assets:install public --symlink --relative
|
||||||
|
|
||||||
|
# Cache leeren
|
||||||
|
docker-compose exec web php bin/console cache:clear
|
||||||
|
|
||||||
|
# Browser-Cache leeren (Strg+F5)
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Live-Berechnungen funktionieren nicht
|
||||||
|
|
||||||
|
**Problem:** Formular-Eingaben triggern keine Berechnungen.
|
||||||
|
|
||||||
|
**Lösung:**
|
||||||
|
```bash
|
||||||
|
# Browser-Konsole öffnen (F12)
|
||||||
|
# Nach JavaScript-Fehlern suchen
|
||||||
|
|
||||||
|
# Prüfen ob jQuery geladen wurde
|
||||||
|
# Sollte in Netzwerk-Tab sichtbar sein: jquery-3.7.1.min.js
|
||||||
|
|
||||||
|
# calculator.js prüfen
|
||||||
|
curl http://localhost:8080/js/calculator.js
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Login funktioniert nicht
|
||||||
|
|
||||||
|
**Problem:** Login-Formular gibt Fehler oder leitet nicht weiter.
|
||||||
|
|
||||||
|
**Lösung:**
|
||||||
|
```bash
|
||||||
|
# Cache leeren
|
||||||
|
docker-compose exec web php bin/console cache:clear
|
||||||
|
|
||||||
|
# Prüfen ob User existiert
|
||||||
|
docker-compose exec db mariadb -u root -proot -e "SELECT email FROM users" immorechner
|
||||||
|
|
||||||
|
# Session-Verzeichnis prüfen
|
||||||
|
docker-compose exec web ls -la /var/www/html/var/cache/dev/sessions
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### API-Probleme
|
||||||
|
|
||||||
|
#### Swagger UI lädt ohne CSS
|
||||||
|
|
||||||
|
**Problem:** http://localhost:8080/api/docs.html lädt, aber ohne Formatierung.
|
||||||
|
|
||||||
|
**Lösung:**
|
||||||
|
```bash
|
||||||
|
# Bundle-Assets installieren
|
||||||
|
docker-compose exec web php bin/console assets:install public --symlink --relative
|
||||||
|
|
||||||
|
# Cache leeren
|
||||||
|
docker-compose exec web php bin/console cache:clear
|
||||||
|
|
||||||
|
# Prüfen ob Assets existieren
|
||||||
|
docker-compose exec web ls -la /var/www/html/public/bundles/apiplatform
|
||||||
|
```
|
||||||
|
|
||||||
|
#### API gibt 401 Unauthorized
|
||||||
|
|
||||||
|
**Problem:** API-Anfrage mit API-Key schlägt fehl.
|
||||||
|
|
||||||
|
**Lösung:**
|
||||||
|
```bash
|
||||||
|
# API-Key prüfen
|
||||||
|
docker-compose exec db mariadb -u root -proot -e "SELECT id, email, api_key FROM users" immorechner
|
||||||
|
|
||||||
|
# Korrekten Header verwenden
|
||||||
|
curl -H "X-API-KEY: ihr-api-key" http://localhost:8080/api/immobilies
|
||||||
|
|
||||||
|
# Nicht "Authorization" Header!
|
||||||
|
```
|
||||||
|
|
||||||
|
#### API gibt 500 Internal Server Error
|
||||||
|
|
||||||
|
**Problem:** API-Anfrage schlägt mit Server-Fehler fehl.
|
||||||
|
|
||||||
|
**Lösung:**
|
||||||
|
```bash
|
||||||
|
# Logs prüfen
|
||||||
|
docker-compose logs web
|
||||||
|
|
||||||
|
# Symfony Logs prüfen
|
||||||
|
docker-compose exec web tail -f /var/www/html/var/log/dev.log
|
||||||
|
|
||||||
|
# Datenbank-Verbindung testen
|
||||||
|
docker-compose exec web php bin/console doctrine:query:sql "SELECT 1"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Datenbank-Probleme
|
||||||
|
|
||||||
|
#### Connection refused
|
||||||
|
|
||||||
|
**Problem:** Kann nicht zur Datenbank verbinden.
|
||||||
|
|
||||||
|
**Lösung:**
|
||||||
|
```bash
|
||||||
|
# DB-Container läuft?
|
||||||
|
docker ps | grep db
|
||||||
|
|
||||||
|
# DB-Container-Logs
|
||||||
|
docker-compose logs db
|
||||||
|
|
||||||
|
# Warten (DB braucht ~30-60 Sekunden)
|
||||||
|
sleep 60
|
||||||
|
|
||||||
|
# DB-Verbindung testen
|
||||||
|
docker-compose exec db mariadb -u root -proot -e "SELECT 1"
|
||||||
|
|
||||||
|
# Neustart
|
||||||
|
docker-compose restart db
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Migrations schlagen fehl
|
||||||
|
|
||||||
|
**Problem:** `doctrine:migrations:migrate` gibt Fehler.
|
||||||
|
|
||||||
|
**Lösung:**
|
||||||
|
```bash
|
||||||
|
# Migration-Status prüfen
|
||||||
|
docker-compose exec web php bin/console doctrine:migrations:status
|
||||||
|
|
||||||
|
# Datenbank droppen und neu erstellen
|
||||||
|
docker-compose exec web php bin/console doctrine:database:drop --force
|
||||||
|
docker-compose exec web php bin/console doctrine:database:create
|
||||||
|
docker-compose exec web php bin/console doctrine:migrations:migrate --no-interaction
|
||||||
|
|
||||||
|
# Oder: Container komplett neu aufsetzen
|
||||||
|
docker-compose down -v
|
||||||
|
docker-compose up -d --build
|
||||||
|
docker-compose exec web composer install
|
||||||
|
docker-compose exec web php bin/console doctrine:migrations:migrate --no-interaction
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Tabellen fehlen
|
||||||
|
|
||||||
|
**Problem:** "Table 'immorechner.users' doesn't exist"
|
||||||
|
|
||||||
|
**Lösung:**
|
||||||
|
```bash
|
||||||
|
# Migrations ausführen
|
||||||
|
docker-compose exec web php bin/console doctrine:migrations:migrate --no-interaction
|
||||||
|
|
||||||
|
# Tabellen prüfen
|
||||||
|
docker-compose exec db mariadb -u root -proot -e "SHOW TABLES" immorechner
|
||||||
|
|
||||||
|
# Falls leer: Migration erneut ausführen
|
||||||
|
docker-compose exec web php bin/console doctrine:migrations:migrate --no-interaction
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Docker-Probleme
|
||||||
|
|
||||||
|
#### Container starten nicht
|
||||||
|
|
||||||
|
**Problem:** `docker-compose up` schlägt fehl.
|
||||||
|
|
||||||
|
**Lösung:**
|
||||||
|
```bash
|
||||||
|
# Logs prüfen
|
||||||
|
docker-compose logs
|
||||||
|
|
||||||
|
# Alte Container stoppen
|
||||||
|
docker-compose down
|
||||||
|
|
||||||
|
# Neu starten mit Build
|
||||||
|
docker-compose up -d --build
|
||||||
|
|
||||||
|
# Docker neu starten
|
||||||
|
# Windows: Docker Desktop neu starten
|
||||||
|
# Linux: sudo systemctl restart docker
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Port bereits belegt
|
||||||
|
|
||||||
|
**Problem:** "Port 8080 is already allocated"
|
||||||
|
|
||||||
|
**Lösung 1 - Port freigeben:**
|
||||||
|
```bash
|
||||||
|
# Windows
|
||||||
|
netstat -ano | findstr :8080
|
||||||
|
taskkill /PID <prozess-id> /F
|
||||||
|
|
||||||
|
# Linux/Mac
|
||||||
|
lsof -i :8080
|
||||||
|
kill -9 <prozess-id>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Lösung 2 - Port ändern:**
|
||||||
|
```yaml
|
||||||
|
# In docker-compose.yml
|
||||||
|
services:
|
||||||
|
web:
|
||||||
|
ports:
|
||||||
|
- "8090:80" # Statt 8080:80
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Volumes löschen nicht möglich
|
||||||
|
|
||||||
|
**Problem:** "Volume is in use"
|
||||||
|
|
||||||
|
**Lösung:**
|
||||||
|
```bash
|
||||||
|
# Alle Container stoppen
|
||||||
|
docker-compose down
|
||||||
|
|
||||||
|
# Volume prüfen
|
||||||
|
docker volume ls
|
||||||
|
|
||||||
|
# Container mit Volume finden
|
||||||
|
docker ps -a --filter volume=immorechner_db_data
|
||||||
|
|
||||||
|
# Container löschen
|
||||||
|
docker rm <container-id>
|
||||||
|
|
||||||
|
# Volume löschen
|
||||||
|
docker volume rm immorechner_db_data
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Composer-Probleme
|
||||||
|
|
||||||
|
#### "Class not found" Fehler
|
||||||
|
|
||||||
|
**Problem:** PHP kann Klasse nicht finden.
|
||||||
|
|
||||||
|
**Lösung:**
|
||||||
|
```bash
|
||||||
|
# Autoloader neu generieren
|
||||||
|
docker-compose exec web composer dump-autoload
|
||||||
|
|
||||||
|
# Cache leeren
|
||||||
|
docker-compose exec web php bin/console cache:clear
|
||||||
|
|
||||||
|
# Dependencies neu installieren
|
||||||
|
docker-compose exec web rm -rf vendor
|
||||||
|
docker-compose exec web composer install
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Composer sehr langsam
|
||||||
|
|
||||||
|
**Problem:** `composer install` braucht ewig.
|
||||||
|
|
||||||
|
**Lösung:**
|
||||||
|
```bash
|
||||||
|
# Im Container ausführen (schneller als via Volume)
|
||||||
|
docker-compose exec web composer install
|
||||||
|
|
||||||
|
# Cache leeren
|
||||||
|
docker-compose exec web composer clear-cache
|
||||||
|
|
||||||
|
# Parallel Downloads aktivieren
|
||||||
|
docker-compose exec web composer config --global process-timeout 2000
|
||||||
|
docker-compose exec web composer config --global repos.packagist composer https://packagist.org
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Berechtigungs-Probleme
|
||||||
|
|
||||||
|
#### "Permission denied" in var/
|
||||||
|
|
||||||
|
**Problem:** Kann nicht in `var/cache` oder `var/log` schreiben.
|
||||||
|
|
||||||
|
**Lösung:**
|
||||||
|
```bash
|
||||||
|
# Berechtigungen setzen
|
||||||
|
docker-compose exec -u root web chown -R www-data:www-data /var/www/html/var
|
||||||
|
|
||||||
|
# Oder: 777 Rechte (nur Development!)
|
||||||
|
docker-compose exec -u root web chmod -R 777 /var/www/html/var
|
||||||
|
|
||||||
|
# Cache neu erstellen
|
||||||
|
docker-compose exec web php bin/console cache:clear
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Performance-Probleme
|
||||||
|
|
||||||
|
#### Seite lädt sehr langsam
|
||||||
|
|
||||||
|
**Problem:** Frontend/API antwortet langsam.
|
||||||
|
|
||||||
|
**Lösung:**
|
||||||
|
```bash
|
||||||
|
# Opcache Status prüfen
|
||||||
|
docker-compose exec web php -i | grep opcache
|
||||||
|
|
||||||
|
# Cache warmup
|
||||||
|
docker-compose exec web php bin/console cache:warmup
|
||||||
|
|
||||||
|
# Für Produktion: APP_ENV=prod setzen in .env
|
||||||
|
# Opcache aktiviert sich automatisch
|
||||||
|
|
||||||
|
# Docker-Resources erhöhen
|
||||||
|
# Docker Desktop -> Settings -> Resources -> Memory: 4GB+
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Datenbank-Queries langsam
|
||||||
|
|
||||||
|
**Problem:** API-Anfragen langsam bei vielen Datensätzen.
|
||||||
|
|
||||||
|
**Lösung:**
|
||||||
|
```bash
|
||||||
|
# Indizes prüfen
|
||||||
|
docker-compose exec web php bin/console doctrine:schema:validate
|
||||||
|
|
||||||
|
# Query-Log aktivieren (temporär)
|
||||||
|
# In config/packages/doctrine.yaml:
|
||||||
|
logging: true
|
||||||
|
profiling: true
|
||||||
|
|
||||||
|
# Slow Query Log in MariaDB aktivieren
|
||||||
|
docker-compose exec db mariadb -u root -proot -e "SET GLOBAL slow_query_log = 'ON'"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Browser-Probleme
|
||||||
|
|
||||||
|
#### Alte Daten werden angezeigt
|
||||||
|
|
||||||
|
**Problem:** Änderungen werden nicht sichtbar.
|
||||||
|
|
||||||
|
**Lösung:**
|
||||||
|
```bash
|
||||||
|
# Browser-Cache leeren
|
||||||
|
# Chrome/Firefox: Strg+Shift+Delete
|
||||||
|
|
||||||
|
# Hard Reload
|
||||||
|
# Chrome/Firefox: Strg+F5
|
||||||
|
# Mac: Cmd+Shift+R
|
||||||
|
|
||||||
|
# Server-Cache leeren
|
||||||
|
docker-compose exec web php bin/console cache:clear
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Debug-Modus aktivieren
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# .env
|
||||||
|
APP_ENV=dev
|
||||||
|
APP_DEBUG=true
|
||||||
|
|
||||||
|
# Cache leeren
|
||||||
|
docker-compose exec web php bin/console cache:clear
|
||||||
|
|
||||||
|
# Symfony Profiler in Browser verwenden
|
||||||
|
# Unten auf der Seite erscheint Toolbar
|
||||||
|
```
|
||||||
|
|
||||||
|
## Komplett-Reset (Letzter Ausweg)
|
||||||
|
|
||||||
|
**WARNUNG:** Löscht alle Daten!
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Alles stoppen und löschen
|
||||||
|
docker-compose down -v
|
||||||
|
|
||||||
|
# Docker-Images löschen
|
||||||
|
docker rmi immorechner-web
|
||||||
|
|
||||||
|
# Neu aufbauen
|
||||||
|
docker-compose up -d --build
|
||||||
|
|
||||||
|
# Dependencies installieren
|
||||||
|
docker-compose exec web composer install
|
||||||
|
|
||||||
|
# Datenbank initialisieren
|
||||||
|
docker-compose exec web php bin/console doctrine:migrations:migrate --no-interaction
|
||||||
|
|
||||||
|
# Cache leeren
|
||||||
|
docker-compose exec web php bin/console cache:clear
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Support
|
||||||
|
|
||||||
|
Wenn das Problem weiterhin besteht:
|
||||||
|
|
||||||
|
1. **Logs sammeln:**
|
||||||
|
```bash
|
||||||
|
docker-compose logs > debug_logs.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Systeminfo sammeln:**
|
||||||
|
```bash
|
||||||
|
docker version > system_info.txt
|
||||||
|
docker-compose version >> system_info.txt
|
||||||
|
php -v >> system_info.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Issue erstellen** mit:
|
||||||
|
- Problembeschreibung
|
||||||
|
- Fehlermeldung
|
||||||
|
- Logs (debug_logs.txt)
|
||||||
|
- Systeminfo (system_info.txt)
|
||||||
|
- Schritte zum Reproduzieren
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Siehe auch:**
|
||||||
|
- [Docker](docker.md) - Container-Management
|
||||||
|
- [Development](development.md) - Entwickler-Workflow
|
||||||
|
- [Installation](installation.md) - Setup-Anleitung
|
||||||
|
|
||||||
|
[← Zurück zur Hauptseite](../README.md)
|
||||||
Reference in New Issue
Block a user