187 lines
3.9 KiB
Markdown
187 lines
3.9 KiB
Markdown
# Automatische E-Mail-Synchronisation
|
|
|
|
Die automatische E-Mail-Synchronisation ruft regelmäßig E-Mails von allen konfigurierten Standorten ab und erstellt automatisch Buchungen aus Ninjaforms-Anfragen.
|
|
|
|
## Cron Endpoint
|
|
|
|
**URL:** `/api/cron/email-sync`
|
|
**Methode:** `GET`
|
|
**Authentifizierung:** Bearer Token (CRON_SECRET)
|
|
|
|
### Beispiel-Aufruf
|
|
|
|
```bash
|
|
curl -X GET https://your-domain.com/api/cron/email-sync \
|
|
-H "Authorization: Bearer YOUR_CRON_SECRET"
|
|
```
|
|
|
|
### Antwort
|
|
|
|
```json
|
|
{
|
|
"totalLocations": 5,
|
|
"totalEmails": 12,
|
|
"totalBookings": 8,
|
|
"results": [
|
|
{
|
|
"locationId": "...",
|
|
"locationName": "Lübeck",
|
|
"success": true,
|
|
"newEmails": 3,
|
|
"newBookings": 2,
|
|
"errors": []
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
## Einrichtung
|
|
|
|
### 1. Umgebungsvariable setzen
|
|
|
|
Füge in `.env` hinzu:
|
|
|
|
```
|
|
CRON_SECRET="your-secure-random-string-here"
|
|
```
|
|
|
|
Generiere einen sicheren Zufallsstring:
|
|
|
|
```bash
|
|
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
|
|
```
|
|
|
|
### 2. Vercel Cron Jobs (empfohlen für Vercel Hosting)
|
|
|
|
Erstelle `vercel.json`:
|
|
|
|
```json
|
|
{
|
|
"crons": [
|
|
{
|
|
"path": "/api/cron/email-sync",
|
|
"schedule": "*/15 * * * *"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
Dies führt die Synchronisation alle 15 Minuten aus.
|
|
|
|
**Wichtig:** Vercel Cron Jobs senden automatisch den `Authorization` Header mit dem in den Vercel Environment Variables gespeicherten `CRON_SECRET`.
|
|
|
|
Deployment:
|
|
1. Gehe zu Vercel Dashboard → Settings → Environment Variables
|
|
2. Füge `CRON_SECRET` mit deinem generierten Wert hinzu
|
|
3. Deploy das Projekt
|
|
|
|
### 3. Externe Cron Services
|
|
|
|
#### Cron-job.org
|
|
|
|
1. Registriere dich bei https://cron-job.org
|
|
2. Erstelle einen neuen Cronjob:
|
|
- **URL:** `https://your-domain.com/api/cron/email-sync`
|
|
- **Schedule:** `*/15 * * * *` (alle 15 Minuten)
|
|
- **Headers:**
|
|
- `Authorization: Bearer YOUR_CRON_SECRET`
|
|
3. Aktiviere den Job
|
|
|
|
#### EasyCron
|
|
|
|
1. Registriere dich bei https://www.easycron.com
|
|
2. Erstelle einen neuen Cron Job:
|
|
- **URL:** `https://your-domain.com/api/cron/email-sync`
|
|
- **Cron Expression:** `*/15 * * * *`
|
|
- **HTTP Header:** `Authorization: Bearer YOUR_CRON_SECRET`
|
|
3. Aktiviere den Job
|
|
|
|
### 4. Eigener Server (systemd Timer)
|
|
|
|
Erstelle `/etc/systemd/system/savethemoment-sync.service`:
|
|
|
|
```ini
|
|
[Unit]
|
|
Description=SaveTheMoment Email Sync
|
|
After=network.target
|
|
|
|
[Service]
|
|
Type=oneshot
|
|
ExecStart=/usr/bin/curl -X GET https://your-domain.com/api/cron/email-sync -H "Authorization: Bearer YOUR_CRON_SECRET"
|
|
```
|
|
|
|
Erstelle `/etc/systemd/system/savethemoment-sync.timer`:
|
|
|
|
```ini
|
|
[Unit]
|
|
Description=Run SaveTheMoment Email Sync every 15 minutes
|
|
|
|
[Timer]
|
|
OnBootSec=5min
|
|
OnUnitActiveSec=15min
|
|
|
|
[Install]
|
|
WantedBy=timers.target
|
|
```
|
|
|
|
Aktiviere den Timer:
|
|
|
|
```bash
|
|
sudo systemctl daemon-reload
|
|
sudo systemctl enable savethemoment-sync.timer
|
|
sudo systemctl start savethemoment-sync.timer
|
|
```
|
|
|
|
Status prüfen:
|
|
|
|
```bash
|
|
sudo systemctl status savethemoment-sync.timer
|
|
sudo journalctl -u savethemoment-sync.service
|
|
```
|
|
|
|
## Manuelle Synchronisation
|
|
|
|
Admins können jederzeit eine manuelle Synchronisation auslösen:
|
|
|
|
1. Gehe zu **Dashboard → Standorte**
|
|
2. Klicke bei einem Standort auf **"E-Mails abrufen"**
|
|
3. Die Synchronisation läuft sofort und zeigt das Ergebnis an
|
|
|
|
## Zeitpläne
|
|
|
|
Empfohlene Synchronisationsintervalle:
|
|
|
|
- **Hochsaison:** Alle 10-15 Minuten
|
|
- **Normalbetrieb:** Alle 30 Minuten
|
|
- **Ruhige Zeit:** Jede Stunde
|
|
|
|
## Fehlerbehandlung
|
|
|
|
Der Cron-Endpoint:
|
|
- Loggt alle Fehler in der Console
|
|
- Synchronisiert alle Standorte unabhängig voneinander
|
|
- Setzt die Synchronisation fort, auch wenn ein Standort fehlschlägt
|
|
- Gibt detaillierte Fehlerinformationen zurück
|
|
|
|
## Überwachung
|
|
|
|
Überwache die Logs:
|
|
|
|
```bash
|
|
# Vercel
|
|
vercel logs --follow
|
|
|
|
# Next.js Development
|
|
npm run dev
|
|
|
|
# Production (PM2)
|
|
pm2 logs atlas
|
|
```
|
|
|
|
## Sicherheit
|
|
|
|
- Der `CRON_SECRET` muss geheim bleiben
|
|
- Verwende einen starken, zufälligen String (min. 32 Zeichen)
|
|
- Speichere das Secret niemals im Code-Repository
|
|
- Rotiere das Secret regelmäßig (z.B. alle 90 Tage)
|