Stargirlnails Kiel - Nail Salon Booking System
Ein vollständiges Buchungssystem für Nagelstudios mit Admin-Panel, Kalender und E-Mail-Benachrichtigungen.
Dependencies
Hinweis zu DOMPurify: Wir nutzen
isomorphic-dompurify
, das DOMPurify bereits mitliefert und sowohl in Node.js als auch im Browser funktioniert. Eine zusätzliche Installation vondompurify
ist daher nicht erforderlich und würde eine redundante Abhängigkeit erzeugen.
Setup
1. Umgebungsvariablen konfigurieren
Kopiere die .env.example
Datei zu .env
und konfiguriere deine Umgebungsvariablen:
cp .env.example .env
2. Admin-Passwort Hash generieren (bcrypt)
Das Admin-Passwort wird als bcrypt-Hash in der .env
Datei gespeichert. So erzeugst du einen Hash:
Node.js (empfohlen)
node -e "require('bcrypt').hash('dein_sicheres_passwort', 10).then(console.log)"
Alternativ kannst du ein kleines Script verwenden (falls du es öfter brauchst):
// scripts/generate-hash.js
require('bcrypt').hash(process.argv[2] || 'dein_sicheres_passwort', 10).then(h => {
console.log(h);
});
Ausführen:
node scripts/generate-hash.js "dein_sicheres_passwort"
3. .env Datei konfigurieren
Bearbeite deine .env
Datei und setze die generierten Werte:
# Admin Account Configuration
ADMIN_USERNAME=owner
# bcrypt-Hash des Admin-Passworts (kein Base64). Beispielwert:
ADMIN_PASSWORD_HASH=$2b$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy
# 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 bcrypt-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
Hinweis zur Migration: Vorhandene Base64-Hashes aus älteren Versionen werden beim Server-Start automatisch in bcrypt migriert. Zusätzlich erfolgt beim nächsten erfolgreichen Login ebenfalls eine Migration, falls noch erforderlich.
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.