feat: ICS-Kalendereinträge, Rate-Limiting und erweiterte E-Mail-Validierung
- ICS-Dateianhänge in Bestätigungsmails mit Europe/Berlin Zeitzone - Rate-Limiting: IP-basiert (5/10min) und E-Mail-basiert (3/1h) - Mehrschichtige E-Mail-Validierung mit Rapid Email Validator API - Disposable Email Detection (blockiert Wegwerf-Adressen) - MX Record Verification - Domain Verification - Typo-Erkennung mit Vorschlägen - Zod-Schema-Validierung für Name, E-Mail und Telefonnummer - Dokumentation für Rate-Limiting und E-Mail-Validierung - README mit neuen Features aktualisiert - Backlog aktualisiert
This commit is contained in:
464
README.md
464
README.md
@@ -1,225 +1,239 @@
|
||||
# Stargirlnails Kiel - Nail Salon Booking System
|
||||
|
||||
Ein vollständiges Buchungssystem für Nagelstudios mit Admin-Panel, Kalender und E-Mail-Benachrichtigungen.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- [TypeScript](https://www.typescriptlang.org/)
|
||||
- [React](https://react.dev/)
|
||||
- [Vite](https://vite.dev/)
|
||||
- [Tailwind CSS V4](https://tailwindcss.com/)
|
||||
- [oRPC](https://orpc.unnoq.com/)
|
||||
- [Hono](https://hono.dev/)
|
||||
- [Zod](https://zod.dev/)
|
||||
|
||||
## Setup
|
||||
|
||||
### 1. Umgebungsvariablen konfigurieren
|
||||
|
||||
Kopiere die `.env.example` Datei zu `.env` und konfiguriere deine Umgebungsvariablen:
|
||||
|
||||
```bash
|
||||
cp .env.example .env
|
||||
```
|
||||
|
||||
### 2. Admin-Passwort Hash generieren
|
||||
|
||||
Das Admin-Passwort wird als Base64-Hash in der `.env` Datei gespeichert. Hier sind verschiedene Methoden, um einen Hash zu generieren:
|
||||
|
||||
#### PowerShell (Windows)
|
||||
```powershell
|
||||
# Einfache Methode mit Base64-Encoding
|
||||
$password = "dein_sicheres_passwort"
|
||||
$bytes = [System.Text.Encoding]::UTF8.GetBytes($password)
|
||||
$hash = [System.Convert]::ToBase64String($bytes)
|
||||
Write-Host "Password Hash: $hash"
|
||||
|
||||
# Alternative mit PowerShell 7+ (kürzer)
|
||||
$password = "dein_sicheres_passwort"
|
||||
[Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($password))
|
||||
```
|
||||
|
||||
#### Node.js (falls verfügbar)
|
||||
```javascript
|
||||
// In der Node.js Konsole oder als separates Script
|
||||
const password = "dein_sicheres_passwort";
|
||||
const hash = Buffer.from(password).toString('base64');
|
||||
console.log("Password Hash:", hash);
|
||||
```
|
||||
|
||||
#### Online-Tools (nur für Entwicklung)
|
||||
- Verwende einen Base64-Encoder wie [base64encode.org](https://www.base64encode.org/)
|
||||
|
||||
### 3. .env Datei konfigurieren
|
||||
|
||||
Bearbeite deine `.env` Datei und setze die generierten Werte:
|
||||
|
||||
```env
|
||||
# Admin Account Configuration
|
||||
ADMIN_USERNAME=owner
|
||||
ADMIN_PASSWORD_HASH=ZGVpbl9zaWNoZXJlc19wYXNzd29ydA== # Dein generierter Hash
|
||||
|
||||
# Domain Configuration
|
||||
DOMAIN=localhost:5173 # Für Produktion: deine-domain.de
|
||||
|
||||
# Email Configuration
|
||||
RESEND_API_KEY=your_resend_api_key_here
|
||||
EMAIL_FROM=noreply@yourdomain.com
|
||||
ADMIN_EMAIL=admin@yourdomain.com
|
||||
|
||||
# Stornierungsfrist (in Stunden)
|
||||
MIN_STORNO_TIMESPAN=24
|
||||
|
||||
# Legal Information (Impressum/Datenschutz)
|
||||
COMPANY_NAME=Stargirlnails Kiel
|
||||
OWNER_NAME=Inhaber Name
|
||||
ADDRESS_STREET=Liebigstr. 15
|
||||
ADDRESS_CITY=Kiel
|
||||
ADDRESS_POSTAL_CODE=24145
|
||||
ADDRESS_COUNTRY=Deutschland
|
||||
ADDRESS_LATITUDE=54.3233 # Optional: GPS-Koordinaten für Karte
|
||||
ADDRESS_LONGITUDE=10.1228 # Optional: GPS-Koordinaten für Karte
|
||||
CONTACT_PHONE=+49 431 123456
|
||||
CONTACT_EMAIL=info@stargirlnails.de
|
||||
TAX_ID=12/345/67890 # Optional
|
||||
VAT_ID=DE123456789 # Optional
|
||||
COMMERCIAL_REGISTER=HRB 12345 # Optional
|
||||
RESPONSIBLE_FOR_CONTENT=Inhaber Name
|
||||
DATA_PROTECTION_RESPONSIBLE=Inhaber Name
|
||||
DATA_PROTECTION_EMAIL=datenschutz@stargirlnails.de
|
||||
THIRD_PARTY_SERVICES=Resend (E-Mail-Versand),Google Analytics # Komma-getrennt
|
||||
```
|
||||
|
||||
### 4. Anwendung starten
|
||||
|
||||
```bash
|
||||
# Dependencies installieren
|
||||
pnpm install
|
||||
|
||||
# Entwicklungsserver starten
|
||||
pnpm dev
|
||||
```
|
||||
|
||||
## Docker Deployment
|
||||
|
||||
### Docker Build
|
||||
|
||||
```bash
|
||||
# Docker Image erstellen
|
||||
docker build -t stargirlnails-booking .
|
||||
|
||||
# Container starten
|
||||
docker run -d \
|
||||
--name stargirlnails-app \
|
||||
-p 3000:3000 \
|
||||
--env-file .env \
|
||||
stargirlnails-booking
|
||||
```
|
||||
|
||||
### Docker Compose (empfohlen)
|
||||
|
||||
Erstelle eine `docker-compose.yml` Datei:
|
||||
|
||||
```yaml
|
||||
services:
|
||||
stargirlnails:
|
||||
build: .
|
||||
ports:
|
||||
- "3000:3000"
|
||||
env_file:
|
||||
- .env
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ./.storage:/app/.storage
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 40s
|
||||
```
|
||||
|
||||
Starten mit Docker Compose:
|
||||
|
||||
```bash
|
||||
# Container starten
|
||||
docker-compose up -d
|
||||
|
||||
# Logs anzeigen
|
||||
docker-compose logs -f
|
||||
|
||||
# Container stoppen
|
||||
docker-compose down
|
||||
```
|
||||
|
||||
### Produktions-Deployment
|
||||
|
||||
Für den produktiven Einsatz:
|
||||
|
||||
```bash
|
||||
# Mit Docker Compose
|
||||
docker-compose -f docker-compose.yml up -d
|
||||
|
||||
# Oder direkt mit Docker
|
||||
docker run -d \
|
||||
--name stargirlnails-prod \
|
||||
-p 80:3000 \
|
||||
--restart unless-stopped \
|
||||
--env-file .env.production \
|
||||
stargirlnails-booking
|
||||
```
|
||||
|
||||
**Wichtige Produktions-Hinweise:**
|
||||
- Verwende eine `.env.production` Datei mit Produktions-Konfiguration
|
||||
- Setze `NODE_ENV=production` in der Umgebungsdatei
|
||||
- Verwende einen Reverse Proxy (nginx, Traefik) für HTTPS
|
||||
- Überwache Container mit Health Checks
|
||||
- **Persistente Daten**: Der `.storage` Ordner wird als Volume gemountet, um Buchungen und Einstellungen zu erhalten
|
||||
|
||||
## Features
|
||||
|
||||
- 📅 **Terminbuchung**: Kunden können online Termine buchen
|
||||
- 💅 **Behandlungsverwaltung**: Admin kann Behandlungen hinzufügen/bearbeiten
|
||||
- 📆 **Kalender-Ansicht**: Übersichtliche Darstellung aller Termine
|
||||
- ⏰ **Verfügbarkeits-Slots**: Flexible Slot-Verwaltung mit behandlungsspezifischen Dauern
|
||||
- 📧 **E-Mail-Benachrichtigungen**: Automatische Benachrichtigungen bei Buchungen
|
||||
- ❌ **Termin-Stornierung**: Kunden können Termine über sichere Links stornieren
|
||||
- ⏰ **Stornierungsfrist**: Konfigurierbare Mindestfrist vor dem Termin (MIN_STORNO_TIMESPAN)
|
||||
- 📋 **Impressum/Datenschutz**: Rechtliche Seiten mit konfigurierbaren Daten
|
||||
- 🔐 **Admin-Panel**: Geschützter Bereich für Inhaber
|
||||
- 🛡️ **Security.txt**: RFC 9116 konformer Endpoint für Sicherheitsmeldungen
|
||||
|
||||
## Admin-Zugang
|
||||
|
||||
Nach dem Setup kannst du dich mit den in der `.env` konfigurierten Admin-Credentials anmelden:
|
||||
- **Benutzername**: Wert aus `ADMIN_USERNAME`
|
||||
- **Passwort**: Das ursprüngliche Passwort (nicht der Hash)
|
||||
|
||||
## Sicherheit
|
||||
|
||||
⚠️ **Wichtige Hinweise:**
|
||||
- Ändere das Standard-Passwort vor dem Produktionseinsatz
|
||||
- Das Passwort wird als Base64-Hash in der `.env` Datei gespeichert
|
||||
- Verwende ein sicheres Passwort und generiere den entsprechenden Hash
|
||||
- Die `.env` Datei sollte niemals in das Repository committet werden
|
||||
|
||||
### Security.txt Endpoint
|
||||
|
||||
Die Anwendung bietet einen RFC 9116 konformen Security.txt Endpoint unter `/.well-known/security.txt`:
|
||||
|
||||
- **Kontakt**: Konfigurierbar über `SECURITY_CONTACT` Umgebungsvariable
|
||||
- **Ablauf**: Automatisch gesetzt auf Ende des aktuellen Jahres
|
||||
- **Sprachen**: Deutsch und Englisch bevorzugt
|
||||
- **Caching**: 24 Stunden Cache-Header für bessere Performance
|
||||
|
||||
**Beispiel-Konfiguration:**
|
||||
```env
|
||||
SECURITY_CONTACT=security@stargirlnails.de
|
||||
```
|
||||
|
||||
**Zugriff:**
|
||||
```bash
|
||||
curl https://your-domain.com/.well-known/security.txt
|
||||
```
|
||||
|
||||
Dies ermöglicht Sicherheitsforschern, Sicherheitslücken verantwortungsvoll zu melden.
|
||||
# Stargirlnails Kiel - Nail Salon Booking System
|
||||
|
||||
Ein vollständiges Buchungssystem für Nagelstudios mit Admin-Panel, Kalender und E-Mail-Benachrichtigungen.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- [TypeScript](https://www.typescriptlang.org/)
|
||||
- [React](https://react.dev/)
|
||||
- [Vite](https://vite.dev/)
|
||||
- [Tailwind CSS V4](https://tailwindcss.com/)
|
||||
- [oRPC](https://orpc.unnoq.com/)
|
||||
- [Hono](https://hono.dev/)
|
||||
- [Zod](https://zod.dev/)
|
||||
|
||||
## Setup
|
||||
|
||||
### 1. Umgebungsvariablen konfigurieren
|
||||
|
||||
Kopiere die `.env.example` Datei zu `.env` und konfiguriere deine Umgebungsvariablen:
|
||||
|
||||
```bash
|
||||
cp .env.example .env
|
||||
```
|
||||
|
||||
### 2. Admin-Passwort Hash generieren
|
||||
|
||||
Das Admin-Passwort wird als Base64-Hash in der `.env` Datei gespeichert. Hier sind verschiedene Methoden, um einen Hash zu generieren:
|
||||
|
||||
#### PowerShell (Windows)
|
||||
```powershell
|
||||
# Einfache Methode mit Base64-Encoding
|
||||
$password = "dein_sicheres_passwort"
|
||||
$bytes = [System.Text.Encoding]::UTF8.GetBytes($password)
|
||||
$hash = [System.Convert]::ToBase64String($bytes)
|
||||
Write-Host "Password Hash: $hash"
|
||||
|
||||
# Alternative mit PowerShell 7+ (kürzer)
|
||||
$password = "dein_sicheres_passwort"
|
||||
[Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($password))
|
||||
```
|
||||
|
||||
#### Node.js (falls verfügbar)
|
||||
```javascript
|
||||
// In der Node.js Konsole oder als separates Script
|
||||
const password = "dein_sicheres_passwort";
|
||||
const hash = Buffer.from(password).toString('base64');
|
||||
console.log("Password Hash:", hash);
|
||||
```
|
||||
|
||||
#### Online-Tools (nur für Entwicklung)
|
||||
- Verwende einen Base64-Encoder wie [base64encode.org](https://www.base64encode.org/)
|
||||
|
||||
### 3. .env Datei konfigurieren
|
||||
|
||||
Bearbeite deine `.env` Datei und setze die generierten Werte:
|
||||
|
||||
```env
|
||||
# Admin Account Configuration
|
||||
ADMIN_USERNAME=owner
|
||||
ADMIN_PASSWORD_HASH=ZGVpbl9zaWNoZXJlc19wYXNzd29ydA== # Dein generierter Hash
|
||||
|
||||
# Domain Configuration
|
||||
DOMAIN=localhost:5173 # Für Produktion: deine-domain.de
|
||||
|
||||
# Email Configuration
|
||||
RESEND_API_KEY=your_resend_api_key_here
|
||||
EMAIL_FROM=noreply@yourdomain.com
|
||||
ADMIN_EMAIL=admin@yourdomain.com
|
||||
|
||||
# Stornierungsfrist (in Stunden)
|
||||
MIN_STORNO_TIMESPAN=24
|
||||
|
||||
# Legal Information (Impressum/Datenschutz)
|
||||
COMPANY_NAME=Stargirlnails Kiel
|
||||
OWNER_NAME=Inhaber Name
|
||||
ADDRESS_STREET=Liebigstr. 15
|
||||
ADDRESS_CITY=Kiel
|
||||
ADDRESS_POSTAL_CODE=24145
|
||||
ADDRESS_COUNTRY=Deutschland
|
||||
ADDRESS_LATITUDE=54.3233 # Optional: GPS-Koordinaten für Karte
|
||||
ADDRESS_LONGITUDE=10.1228 # Optional: GPS-Koordinaten für Karte
|
||||
CONTACT_PHONE=+49 431 123456
|
||||
CONTACT_EMAIL=info@stargirlnails.de
|
||||
TAX_ID=12/345/67890 # Optional
|
||||
VAT_ID=DE123456789 # Optional
|
||||
COMMERCIAL_REGISTER=HRB 12345 # Optional
|
||||
RESPONSIBLE_FOR_CONTENT=Inhaber Name
|
||||
DATA_PROTECTION_RESPONSIBLE=Inhaber Name
|
||||
DATA_PROTECTION_EMAIL=datenschutz@stargirlnails.de
|
||||
THIRD_PARTY_SERVICES=Resend (E-Mail-Versand),Google Analytics # Komma-getrennt
|
||||
```
|
||||
|
||||
### 4. Anwendung starten
|
||||
|
||||
```bash
|
||||
# Dependencies installieren
|
||||
pnpm install
|
||||
|
||||
# Entwicklungsserver starten
|
||||
pnpm dev
|
||||
```
|
||||
|
||||
## Docker Deployment
|
||||
|
||||
### Docker Build
|
||||
|
||||
```bash
|
||||
# Docker Image erstellen
|
||||
docker build -t stargirlnails-booking .
|
||||
|
||||
# Container starten
|
||||
docker run -d \
|
||||
--name stargirlnails-app \
|
||||
-p 3000:3000 \
|
||||
--env-file .env \
|
||||
stargirlnails-booking
|
||||
```
|
||||
|
||||
### Docker Compose (empfohlen)
|
||||
|
||||
Erstelle eine `docker-compose.yml` Datei:
|
||||
|
||||
```yaml
|
||||
services:
|
||||
stargirlnails:
|
||||
build: .
|
||||
ports:
|
||||
- "3000:3000"
|
||||
env_file:
|
||||
- .env
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ./.storage:/app/.storage
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 40s
|
||||
```
|
||||
|
||||
Starten mit Docker Compose:
|
||||
|
||||
```bash
|
||||
# Container starten
|
||||
docker-compose up -d
|
||||
|
||||
# Logs anzeigen
|
||||
docker-compose logs -f
|
||||
|
||||
# Container stoppen
|
||||
docker-compose down
|
||||
```
|
||||
|
||||
### Produktions-Deployment
|
||||
|
||||
Für den produktiven Einsatz:
|
||||
|
||||
```bash
|
||||
# Mit Docker Compose
|
||||
docker-compose -f docker-compose.yml up -d
|
||||
|
||||
# Oder direkt mit Docker
|
||||
docker run -d \
|
||||
--name stargirlnails-prod \
|
||||
-p 80:3000 \
|
||||
--restart unless-stopped \
|
||||
--env-file .env.production \
|
||||
stargirlnails-booking
|
||||
```
|
||||
|
||||
**Wichtige Produktions-Hinweise:**
|
||||
- Verwende eine `.env.production` Datei mit Produktions-Konfiguration
|
||||
- Setze `NODE_ENV=production` in der Umgebungsdatei
|
||||
- Verwende einen Reverse Proxy (nginx, Traefik) für HTTPS
|
||||
- Überwache Container mit Health Checks
|
||||
- **Persistente Daten**: Der `.storage` Ordner wird als Volume gemountet, um Buchungen und Einstellungen zu erhalten
|
||||
|
||||
## Features
|
||||
|
||||
### Buchungssystem
|
||||
- 📅 **Terminbuchung**: Kunden können online Termine buchen
|
||||
- 💅 **Behandlungsverwaltung**: Admin kann Behandlungen hinzufügen/bearbeiten
|
||||
- 📆 **Kalender-Ansicht**: Übersichtliche Darstellung aller Termine
|
||||
- ⏰ **Verfügbarkeits-Slots**: Flexible Slot-Verwaltung mit behandlungsspezifischen Dauern
|
||||
- ❌ **Termin-Stornierung**: Kunden können Termine über sichere Links stornieren
|
||||
- ⏰ **Stornierungsfrist**: Konfigurierbare Mindestfrist vor dem Termin (MIN_STORNO_TIMESPAN)
|
||||
|
||||
### E-Mail & Benachrichtigungen
|
||||
- 📧 **E-Mail-Benachrichtigungen**: Automatische Benachrichtigungen bei Buchungen
|
||||
- 📅 **ICS-Kalendereinträge**: Termin-Bestätigungen mit ICS-Datei zum Importieren in Kalender-Apps
|
||||
- ⏰ **Kalender-Erinnerungen**: 24h-Erinnerung im ICS-Kalendereintrag
|
||||
- 📎 **AGB-Anhänge**: Automatischer PDF-Anhang der Allgemeinen Geschäftsbedingungen
|
||||
|
||||
### Sicherheit
|
||||
- 🛡️ **Rate-Limiting**: IP- und E-Mail-basierter Schutz gegen Spam (3 Anfragen/E-Mail pro Stunde, 5 Anfragen/IP pro 10 Min)
|
||||
- ✉️ **E-Mail-Validierung**: Mehrschichtige Validierung inkl. Disposable-Email-Detection und MX-Record-Prüfung
|
||||
- 🚫 **Wegwerf-Email-Schutz**: Blockierung von temporären E-Mail-Adressen
|
||||
- 🔐 **Admin-Panel**: Geschützter Bereich für Inhaber
|
||||
- 🛡️ **Security.txt**: RFC 9116 konformer Endpoint für Sicherheitsmeldungen
|
||||
|
||||
### Rechtliches
|
||||
- 📋 **Impressum/Datenschutz**: Rechtliche Seiten mit konfigurierbaren Daten
|
||||
- ⚖️ **GDPR-konform**: Datenschutzfreundliche Implementierung
|
||||
|
||||
## Admin-Zugang
|
||||
|
||||
Nach dem Setup kannst du dich mit den in der `.env` konfigurierten Admin-Credentials anmelden:
|
||||
- **Benutzername**: Wert aus `ADMIN_USERNAME`
|
||||
- **Passwort**: Das ursprüngliche Passwort (nicht der Hash)
|
||||
|
||||
## Sicherheit
|
||||
|
||||
⚠️ **Wichtige Hinweise:**
|
||||
- Ändere das Standard-Passwort vor dem Produktionseinsatz
|
||||
- Das Passwort wird als Base64-Hash in der `.env` Datei gespeichert
|
||||
- Verwende ein sicheres Passwort und generiere den entsprechenden Hash
|
||||
- Die `.env` Datei sollte niemals in das Repository committet werden
|
||||
|
||||
### Security.txt Endpoint
|
||||
|
||||
Die Anwendung bietet einen RFC 9116 konformen Security.txt Endpoint unter `/.well-known/security.txt`:
|
||||
|
||||
- **Kontakt**: Konfigurierbar über `SECURITY_CONTACT` Umgebungsvariable
|
||||
- **Ablauf**: Automatisch gesetzt auf Ende des aktuellen Jahres
|
||||
- **Sprachen**: Deutsch und Englisch bevorzugt
|
||||
- **Caching**: 24 Stunden Cache-Header für bessere Performance
|
||||
|
||||
**Beispiel-Konfiguration:**
|
||||
```env
|
||||
SECURITY_CONTACT=security@stargirlnails.de
|
||||
```
|
||||
|
||||
**Zugriff:**
|
||||
```bash
|
||||
curl https://your-domain.com/.well-known/security.txt
|
||||
```
|
||||
|
||||
Dies ermöglicht Sicherheitsforschern, Sicherheitslücken verantwortungsvoll zu melden.
|
||||
|
Reference in New Issue
Block a user