- Add frame-src directive to CSP for OpenStreetMap.org - Fix Impressum map display issue in production - Allow embedding of OpenStreetMap iframes while maintaining security - Update Caddyfile CSP configuration
Stargirlnails Kiel - Nail Salon Booking System
Ein vollständiges Buchungssystem für Nagelstudios mit Admin-Panel, Kalender und E-Mail-Benachrichtigungen.
Dependencies
Setup
1. Umgebungsvariablen konfigurieren
Kopiere die .env.example
Datei zu .env
und konfiguriere deine Umgebungsvariablen:
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)
# 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)
// 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
3. .env Datei konfigurieren
Bearbeite deine .env
Datei und setze die generierten Werte:
# 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
# Dependencies installieren
pnpm install
# Entwicklungsserver starten
pnpm dev
Docker Deployment
Docker Build
# 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:
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:
# Container starten
docker-compose up -d
# Logs anzeigen
docker-compose logs -f
# Container stoppen
docker-compose down
Produktions-Deployment
Für den produktiven Einsatz mit automatischem SSL:
# Mit Docker Compose (empfohlen)
docker-compose -f docker-compose-prod.yml up -d
# Oder mit dem Caddy-Setup-Script
chmod +x scripts/setup-caddy.sh
./scripts/setup-caddy.sh
Wichtige Produktions-Hinweise:
- Verwende eine
.env.production
Datei mit Produktions-Konfiguration - Setze
NODE_ENV=production
in der Umgebungsdatei - Automatisches SSL: Caddy erstellt und verwaltet automatisch Let's Encrypt-Zertifikate
- Ü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:
SECURITY_CONTACT=security@stargirlnails.de
Zugriff:
curl https://your-domain.com/.well-known/security.txt
Dies ermöglicht Sicherheitsforschern, Sicherheitslücken verantwortungsvoll zu melden.