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

3.0 KiB

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

# 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