Standalone ESM-daemon that: - Connects via ImapFlow IDLE to all active Legend mailboxes - Triggers /api/mail/scan-internal on new-mail events (real-time) - Auto-renew IDLE every 25min (RFC 3501 limit), exponential-backoff reconnect - DB-refresh every 5min for new/removed connections Plus deploy-pipeline: - GH-Actions artifact-upload + scp to /srv/rebreak/backend/imap-idle/ - npm install --production on server (imapflow + pg) - pm2 startOrReload via ecosystem.config.js - start-idle-staging.sh wrapper for Infisical secret-injection Replaces 30min-cron polling for Legend tier -- Casino-mails now blocked within seconds, fulfilling Legend tier marketing promise. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
52 lines
1.9 KiB
Markdown
52 lines
1.9 KiB
Markdown
# rebreak-imap-idle
|
|
|
|
Standalone IMAP IDLE Daemon für Rebreak.
|
|
|
|
## Was er macht
|
|
|
|
- Hält pro aktiver `MailConnection` (DB) eine persistente IMAP-IDLE-Session
|
|
- Reagiert in Echtzeit auf `EXISTS`-Events (neue Mail im Postfach)
|
|
- Feuert bei jedem Event `POST /api/mail/scan-internal` gegen das lokale Backend
|
|
- Das Backend entscheidet ob und welche Mails gelöscht werden (Gambling-Keywords + Blocklist)
|
|
- Aktualisiert alle 5 min die Connection-Liste (neue User → neue Sessions, entfernte → geschlossen)
|
|
- IDLE wird alle 25 min erneuert (RFC 3501 Server-Timeout liegt bei 29 min)
|
|
|
|
## Env-Vars
|
|
|
|
| Variable | Pflicht | Beschreibung |
|
|
|---------------------|---------|-----------------------------------------------------------|
|
|
| `DATABASE_URL` | ja | Postgres-Connection-String (Supabase Pooler oder direkt) |
|
|
| `ADMIN_SECRET` | ja | Shared Secret für /api/mail/scan-internal Header |
|
|
| `ENCRYPTION_KEY` | ja | AES-256 Key (identisch zum Backend-Key, 32+ Zeichen) |
|
|
| `BACKEND_URL` | nein | Default: http://127.0.0.1:3016 (staging) / 3015 (prod) |
|
|
| `NODE_ENV` | nein | `production` → BACKEND_URL default port 3015 |
|
|
|
|
## Lokal starten (Entwicklung)
|
|
|
|
```bash
|
|
cd backend/imap-idle
|
|
npm install
|
|
DATABASE_URL=<...> ADMIN_SECRET=<...> ENCRYPTION_KEY=<...> node index.mjs
|
|
```
|
|
|
|
Via Infisical (analog zu start-staging.sh):
|
|
|
|
```bash
|
|
infisical run --env=staging -- node index.mjs
|
|
```
|
|
|
|
## PM2 (Produktion)
|
|
|
|
Wird via ecosystem.config.js gestartet — siehe `docs/internal/MAIL_DAEMON_DEPLOYMENT.md`.
|
|
|
|
## Logs (pm2)
|
|
|
|
```
|
|
[idle/<email>] connected (imap.gmail.com:993)
|
|
[idle/<email>] exists-event received (new mail)
|
|
[idle/<email>] scan-triggered → scanned=12 blocked=1
|
|
[idle/<email>] idle renewing (25min threshold)
|
|
[idle/<email>] reconnecting in 5s (attempt 2)
|
|
[idle/db] refreshed — 47 active connections, 47 sessions
|
|
```
|