7.5 KiB
7.5 KiB
Kompatibilität mit bestehendem Setup
✅ 100% Kompatibel
Die modulare Version ist vollständig kompatibel mit deinem bestehenden Setup:
1. Dockerfile
- ✅ Gleicher Base Image:
python:3.11-slim - ✅ Gleicher User:
worker(UID 1000) - ✅ Gleiche Verzeichnisse:
/app,/var/log/email-worker,/etc/email-worker - ✅ Gleicher Health Check:
curl http://localhost:8080/health - ✅ Gleiche Labels:
maintainer,description - Änderung: Kopiert nun mehrere Module statt einer Datei
2. docker-compose.yml
- ✅ Gleicher Container Name:
unified-email-worker - ✅ Gleicher Network Mode:
host - ✅ Gleiche Volumes:
domains.txt,logs/ - ✅ Gleiche Ports:
8000,8080 - ✅ Gleiche Environment Variables
- ✅ Gleiche Resource Limits: 512M / 256M
- ✅ Gleiche Logging Config: 50M / 10 files
- Neu: Zusätzliche optionale Env Vars (abwärtskompatibel)
3. requirements.txt
- ✅ Gleiche Dependencies:
boto3,prometheus-client - ✅ Aktualisierte Versionen (>=1.34.0 statt >=1.26.0)
- Kompatibel: Alte Version funktioniert auch, neue ist empfohlen
4. domains.txt
- ✅ Gleiches Format: Eine Domain pro Zeile
- ✅ Kommentare mit
#funktionieren - ✅ Gleiche Location:
/etc/email-worker/domains.txt - Keine Änderung nötig
🔄 Was ist neu/anders?
Dateistruktur
Alt:
/
├── Dockerfile
├── docker-compose.yml
├── requirements.txt
├── domains.txt
└── unified_worker.py (800+ Zeilen)
Neu:
/
├── Dockerfile
├── docker-compose.yml
├── requirements.txt
├── domains.txt
├── main.py # Entry Point
├── config.py # Konfiguration
├── logger.py # Logging
├── worker.py # Message Processing
├── unified_worker.py # Worker Coordinator
├── domain_poller.py # Queue Polling
├── health_server.py # Health Check Server
├── aws/
│ ├── s3_handler.py
│ ├── sqs_handler.py
│ ├── ses_handler.py
│ └── dynamodb_handler.py
├── email/
│ ├── parser.py
│ ├── bounce_handler.py
│ ├── blocklist.py
│ └── rules_processor.py
├── smtp/
│ ├── pool.py
│ └── delivery.py
└── metrics/
└── prometheus.py
Neue optionale Umgebungsvariablen
Diese sind optional und haben sinnvolle Defaults:
# Internal SMTP Port (neu)
INTERNAL_SMTP_PORT=2525 # Default: 2525
# LMTP Support (neu)
LMTP_ENABLED=false # Default: false
LMTP_HOST=localhost # Default: localhost
LMTP_PORT=24 # Default: 24
# Blocklist Table (neu)
DYNAMODB_BLOCKED_TABLE=email-blocked-senders # Default: email-blocked-senders
Wichtig: Wenn du diese nicht setzt, funktioniert alles wie vorher!
🚀 Deployment
Option 1: Drop-In Replacement
# Alte Dateien sichern
cp unified_worker.py unified_worker.py.backup
cp Dockerfile Dockerfile.backup
cp docker-compose.yml docker-compose.yml.backup
# Neue Dateien entpacken
tar -xzf email-worker-modular.tar.gz
cd email-worker/
# domains.txt und .env anpassen (falls nötig)
# Dann normal deployen:
docker-compose build
docker-compose up -d
Option 2: Side-by-Side (Empfohlen)
# Altes Setup bleibt in /opt/email-worker-old
# Neues Setup in /opt/email-worker
# Neue Version entpacken
cd /opt
tar -xzf email-worker-modular.tar.gz
mv email-worker email-worker-new
# Container Namen unterscheiden:
# In docker-compose.yml:
container_name: unified-email-worker-new
# Starten
cd email-worker-new
docker-compose up -d
# Parallel laufen lassen (24h Test)
# Dann alte Version stoppen, neue umbenennen
🔍 Verifikation der Kompatibilität
1. Environment Variables
Alle deine bestehenden Env Vars funktionieren:
# Deine bisherigen Vars (alle kompatibel)
AWS_ACCESS_KEY_ID ✅
AWS_SECRET_ACCESS_KEY ✅
AWS_REGION ✅
WORKER_THREADS ✅
POLL_INTERVAL ✅
MAX_MESSAGES ✅
VISIBILITY_TIMEOUT ✅
SMTP_HOST ✅
SMTP_PORT ✅
SMTP_POOL_SIZE ✅
METRICS_PORT ✅
HEALTH_PORT ✅
2. DynamoDB Tables
Bestehende Tables funktionieren ohne Änderung:
# Bounce Tracking (bereits vorhanden)
ses-outbound-messages ✅
# Email Rules (bereits vorhanden?)
email-rules ✅
# Blocklist (neu, optional)
email-blocked-senders 🆕 Optional
3. API Endpoints
Gleiche Endpoints wie vorher:
# Health Check
GET http://localhost:8080/health ✅ Gleiche Response
# Domains List
GET http://localhost:8080/domains ✅ Gleiche Response
# Prometheus Metrics
GET http://localhost:8000/metrics ✅ Kompatibel + neue Metrics
4. Logging
Gleiches Format, gleiche Location:
# Logs in Container
/var/log/email-worker/ ✅ Gleich
# Log Format
[timestamp] [LEVEL] [worker-name] [thread] message ✅ Gleich
5. S3 Metadata
Gleiches Schema, volle Kompatibilität:
{
"processed": "true",
"processed_at": "1706000000",
"processed_by": "worker-andreasknuth-de",
"status": "delivered",
"invalid_inboxes": "..."
}
Neu: Zusätzliche Metadata bei blockierten Emails:
{
"status": "blocked",
"blocked_sender": "spam@bad.com",
"blocked_recipients": "user@andreasknuth.de"
}
⚠️ Breaking Changes
KEINE! Die modulare Version ist 100% abwärtskompatibel.
Die einzigen Unterschiede sind:
- ✅ Mehr Dateien statt einer (aber gleiches Verhalten)
- ✅ Neue optionale Features (müssen nicht genutzt werden)
- ✅ Bessere Performance (durch Batch-Calls)
- ✅ Mehr Metrics (zusätzliche, alte bleiben)
🧪 Testing Checklist
Nach Deployment prüfen:
# 1. Container läuft
docker ps | grep unified-email-worker
✅ Status: Up
# 2. Health Check
curl http://localhost:8080/health | jq
✅ "status": "healthy"
# 3. Domains geladen
curl http://localhost:8080/domains
✅ ["andreasknuth.de"]
# 4. Logs ohne Fehler
docker-compose logs | grep ERROR
✅ Keine kritischen Fehler
# 5. Test Email senden
# Email via SES senden
✅ Wird zugestellt
# 6. Metrics verfügbar
curl http://localhost:8000/metrics | grep emails_processed
✅ Metrics werden erfasst
💡 Empfohlener Rollout-Plan
Phase 1: Testing (1-2 Tage)
- Neuen Container parallel zum alten starten
- Nur 1 Test-Domain zuweisen
- Logs monitoren
- Performance vergleichen
Phase 2: Staged Rollout (3-7 Tage)
- 50% der Domains auf neue Version
- Metrics vergleichen (alte vs neue)
- Bei Problemen: Rollback auf alte Version
Phase 3: Full Rollout
- Alle Domains auf neue Version
- Alte Version als Backup behalten (1 Woche)
- Dann alte Version dekommissionieren
🔙 Rollback-Plan
Falls Probleme auftreten:
# 1. Neue Version stoppen
docker-compose -f docker-compose.yml down
# 2. Backup wiederherstellen
cp unified_worker.py.backup unified_worker.py
cp Dockerfile.backup Dockerfile
cp docker-compose.yml.backup docker-compose.yml
# 3. Alte Version starten
docker-compose build
docker-compose up -d
# 4. Verifizieren
curl http://localhost:8080/health
Downtime: < 30 Sekunden (Zeit für Container Restart)
✅ Fazit
Die modulare Version ist ein Drop-In Replacement:
- Gleiche Konfiguration
- Gleiche API
- Gleiche Infrastruktur
- Bonus: Bessere Performance, mehr Features, weniger Bugs
Einziger Unterschied: Mehr Dateien, aber alle in einem tarball verpackt.