Files
mesh-configs/skills/devops/mesh-master-control/references/impressum-deploy-learnings-2026-09-01.md

44 lines
3.0 KiB
Markdown

# Impressum-Projekt Lernerfolg (01.09.2026)
Gemeinsames Impressum für alle Domains, Kontaktformular mit Honeypot + Rate-Limit + Telegram-Relay. 8 Fehler gemacht und analysiert.
## Ergebnis-Setup (funktionierend)
- **Zentrale Seite:** `mehlzoerwer.de/impressum/` → `/var/www/mehlzoerwer.de/html/impressum/index.html`
- **Footer-Link auf allen 14 Domains** → verweist auf die zentrale Seite (§5 DDG: 2-Klick-Regel erfüllt)
- **Backend:** Flask `/opt/impressum/app.py` (127.0.0.1:8096), systemd `impressum-kontakt.service`
- **nginx-Proxy:** `location /impressum/senden { proxy_pass http://127.0.0.1:8096/senden; }`
⚠️ **Pfad-Bug:** Flask hat `/senden`, URL ist `/impressum/senden` → proxy_pass MUSS `/senden` angehängt haben, sonst 404.
- **Spam-Schutz:** Honeypot-Feld `website` (unsichtbar) + Rate-Limit (5/Stunde/IP, In-Memory `_RATE`-Dict) → 429 ab 6. Anfrage
- **E-Mail-Verschleierung:** `webmaster [at] mehlzoerwer [dot] de` → JS baut `mailto:` erst bei Klick
- **Telegram-Relay statt SMTP:** Gmail-SMTP von VPS-IP geblockt (timeout) → Nachricht als JSON-Datei in `/tmp/impressum-kontakt/` + Telegram-Push via Bot. **Kein SMTP-Passwort nötig.**
- **Schema.org/Person JSON-LD** im Impressum (SEO + rechtlich sauber)
## Die 8 Fehler (Prävention in Klammern)
1. **SMTP-Daten in Plaintext-Datei gespeichert** → musste gelöscht werden. (Secrets nur in .env chmod 600; Telegram statt SMTP.)
2. **SyntaxError in Flask** (f-String mit Emoji). (`python3 -m py_compile` vor systemd-Start)
3. **Rate-Limit-Einbau zerstörte Einrückung** → IndentationError. (Nach Patch py_compile prüfen.)
4. **nginx-Proxy falscher Pfad** → 404. (Nach nginx-Edit: `nginx -t` + curl auf localhost-Port.)
5. **certbot --expand überschrieb veganbedeutetleben.de mit falschem Zertifikat** → Domain offline. (Nach certbot: SANs prüfen mit `openssl x509 ... | grep DNS:`)
6. **Sub-Agent-Tasks ohne URL/Kontext** → Agenten konnten nicht arbeiten. (Material IMMER in Task einbetten.)
7. **Doppelte Task-Dateien** (offen + fertig gleichzeitig). (Eindeutige task_id, nach Erledigung aus offen/ löschen.)
8. **Alte hängengebliebene Tasks in in_arbeit/** (vom 28.08). (Cleanup-Cron Mo 06:00.)
## Wichtige Erkenntnis zur E-Mail-Verbindung
Gmail-SMTP (`smtp.gmail.com:587`) von netcup-VPS-IPs → **timeout** (Gmail blockt VPS/Rekursions-IPs). App-Passwort funktioniert lokal nicht. Lösung: kein SMTP — Flask schreibt JSON-Datei + Telegram-Bot-Push. Der Nutzer kann das App-Passwort in Google widerrufen (nicht mehr benötigt).
## Kontaktformular-Test-Rezept
```bash
# Honeypot (Bot) → sollte freundlich blocken
curl -X POST https://mehlzoerwer.de/impressum/senden -d "name=Bot&email=b@x.de&nachricht=spam&website=http://spam"
# Normal → 200 + Telegram-Push
curl -X POST https://mehlzoerwer.de/impressum/senden -d "name=Test&email=t@t.de&nachricht=Hallo"
# Rate-Limit → ab 6. Anfrage 429
for i in 1 2 3 4 5 6; do curl -o /dev/null -w '%{http_code}' -X POST https://mehlzoerwer.de/impressum/senden -d "name=T$i&email=t@t.de&nachricht=x"; done
```