6.7 KiB
6.7 KiB
Quick Start Guide
🚀 Deployment auf deinem System
Voraussetzungen
- Docker & Docker Compose installiert
- AWS Credentials mit Zugriff auf SQS, S3, SES, DynamoDB
- Docker Mailserver (DMS) läuft lokal
1. Vorbereitung
# Ins Verzeichnis wechseln
cd /pfad/zu/email-worker
# domains.txt anpassen (falls weitere Domains)
nano domains.txt
# Logs-Verzeichnis erstellen
mkdir -p logs
2. Umgebungsvariablen
Erstelle .env Datei:
# AWS Credentials
AWS_ACCESS_KEY_ID=dein_access_key
AWS_SECRET_ACCESS_KEY=dein_secret_key
# Optional: Worker Settings überschreiben
WORKER_THREADS=10
POLL_INTERVAL=20
MAX_MESSAGES=10
# Optional: SMTP Settings
SMTP_HOST=localhost
SMTP_PORT=25
# Optional: LMTP für direktes Dovecot Delivery
# LMTP_ENABLED=true
# LMTP_PORT=24
3. Build & Start
# Image bauen
docker-compose build
# Starten
docker-compose up -d
# Logs anschauen
docker-compose logs -f
4. Verifizierung
# Health Check
curl http://localhost:8080/health | jq
# Domains prüfen
curl http://localhost:8080/domains
# Metrics (Prometheus)
curl http://localhost:8000/metrics | grep emails_processed
# Container Status
docker ps | grep unified-email-worker
5. Test Email senden
# Via AWS SES Console oder CLI eine Test-Email senden
aws ses send-email \
--from sender@andreasknuth.de \
--destination ToAddresses=test@andreasknuth.de \
--message Subject={Data="Test"},Body={Text={Data="Test message"}}
# Worker Logs beobachten
docker-compose logs -f | grep "Processing:"
🔧 Wartung
Logs anschauen
# Live Logs
docker-compose logs -f
# Nur Worker Logs
docker logs -f unified-email-worker
# Logs im Volume
tail -f logs/*.log
Neustart
# Neustart nach Code-Änderungen
docker-compose restart
# Kompletter Rebuild
docker-compose down
docker-compose build
docker-compose up -d
Update
# Neue Version pullen/kopieren
git pull # oder manuell Dateien ersetzen
# Rebuild & Restart
docker-compose down
docker-compose build
docker-compose up -d
📊 Monitoring
Prometheus Metrics (Port 8000)
# Alle Metrics
curl http://localhost:8000/metrics
# Verarbeitete Emails
curl -s http://localhost:8000/metrics | grep emails_processed_total
# Queue Größe
curl -s http://localhost:8000/metrics | grep queue_messages_available
# Blocked Senders
curl -s http://localhost:8000/metrics | grep blocked_senders_total
Health Check (Port 8080)
# Status
curl http://localhost:8080/health | jq
# Domains
curl http://localhost:8080/domains | jq
🔐 DynamoDB Tabellen Setup
Email Rules (OOO, Forwarding)
# Tabelle erstellen (falls nicht vorhanden)
aws dynamodb create-table \
--table-name email-rules \
--attribute-definitions AttributeName=email_address,AttributeType=S \
--key-schema AttributeName=email_address,KeyType=HASH \
--billing-mode PAY_PER_REQUEST \
--region us-east-2
# OOO Regel hinzufügen
aws dynamodb put-item \
--table-name email-rules \
--item '{
"email_address": {"S": "andreas@andreasknuth.de"},
"ooo_active": {"BOOL": true},
"ooo_message": {"S": "Ich bin derzeit nicht erreichbar."},
"ooo_content_type": {"S": "text"}
}' \
--region us-east-2
# Forward Regel hinzufügen
aws dynamodb put-item \
--table-name email-rules \
--item '{
"email_address": {"S": "info@andreasknuth.de"},
"forwards": {"L": [
{"S": "andreas@andreasknuth.de"}
]}
}' \
--region us-east-2
Blocked Senders
# Tabelle erstellen (falls nicht vorhanden)
aws dynamodb create-table \
--table-name email-blocked-senders \
--attribute-definitions AttributeName=email_address,AttributeType=S \
--key-schema AttributeName=email_address,KeyType=HASH \
--billing-mode PAY_PER_REQUEST \
--region us-east-2
# Blocklist hinzufügen
aws dynamodb put-item \
--table-name email-blocked-senders \
--item '{
"email_address": {"S": "andreas@andreasknuth.de"},
"blocked_patterns": {"L": [
{"S": "*@spam.com"},
{"S": "noreply@*.marketing.com"}
]}
}' \
--region us-east-2
🐛 Troubleshooting
Worker startet nicht
# Logs prüfen
docker-compose logs unified-worker
# Container Status
docker ps -a | grep unified
# Manuell starten (Debug)
docker-compose run --rm unified-worker python3 main.py
Keine Emails werden verarbeitet
# Queue URLs prüfen
curl http://localhost:8080/domains
# AWS Permissions prüfen
aws sqs list-queues --region us-east-2
# DynamoDB Verbindung prüfen (in Logs)
docker-compose logs | grep "DynamoDB"
Bounces werden nicht umgeschrieben
# DynamoDB Bounce Records prüfen
aws dynamodb scan \
--table-name ses-outbound-messages \
--limit 5 \
--region us-east-2
# Worker Logs nach "Bounce detected" durchsuchen
docker-compose logs | grep "Bounce detected"
SMTP Delivery Fehler
# SMTP Verbindung testen
docker-compose exec unified-worker nc -zv localhost 25
# Worker Logs
docker-compose logs | grep "SMTP"
📈 Performance Tuning
Mehr Worker Threads
# In .env
WORKER_THREADS=20 # Default: 10
Längeres Polling
# In .env
POLL_INTERVAL=30 # Default: 20 (Sekunden)
Größerer Connection Pool
# In .env
SMTP_POOL_SIZE=10 # Default: 5
LMTP für bessere Performance
# In .env
LMTP_ENABLED=true
LMTP_PORT=24
🔄 Migration vom Monolithen
Side-by-Side Deployment
# Alte Version läuft als "unified-email-worker-old"
# Neue Version als "unified-email-worker"
# domains.txt aufteilen:
# old: andreasknuth.de
# new: andere-domain.de
# Nach Verifizierung alle Domains auf new migrieren
Zero-Downtime Switch
# 1. Neue Version starten (andere Domains)
docker-compose up -d
# 2. Beide parallel laufen lassen (24h)
# 3. Monitoring: Metrics vergleichen
curl http://localhost:8000/metrics
# 4. Alte Version stoppen
docker stop unified-email-worker-old
# 5. domains.txt updaten (alle Domains)
# 6. Neue Version neustarten
docker-compose restart
✅ Checkliste nach Deployment
- Container läuft:
docker ps | grep unified - Health Check OK:
curl http://localhost:8080/health - Domains geladen:
curl http://localhost:8080/domains - Logs ohne Fehler:
docker-compose logs | grep ERROR - Test-Email erfolgreich: Email an Test-Adresse senden
- Bounce Rewriting funktioniert: Bounce-Email testen
- Metrics erreichbar:
curl http://localhost:8000/metrics - DynamoDB Tables vorhanden: AWS Console prüfen
📞 Support
Bei Problemen:
- Logs prüfen:
docker-compose logs -f - Health Check:
curl http://localhost:8080/health - AWS Console: Queues, S3 Buckets, DynamoDB prüfen
- Container neu starten:
docker-compose restart