Übersicht — worum es geht
Neben der Konsole hinter der Anmeldung hat InfraGuard eine öffentliche Oberfläche.
| Pfad | Bildschirm | Zugriff |
|---|---|---|
/ |
Marketing-Landingpage | Gäste (eine authentifizierte Sitzung wird auf /console umgeleitet) |
/demo |
Formular für Demo-Anfragen | Gäste |
/manual |
Benutzerhandbuch | Gäste und angemeldete Benutzer gleichermaßen |
/login · /lang/{locale} |
Anmeldung · Sprachumschaltung | Gäste |
Die Startseite der Konsole liegt unter /console. Dieser Umzug hat / an die öffentliche Oberfläche übergeben, ohne den Routennamen (overview) oder bestehende Lesezeichen zu zerstören.
Die Landingpage wird als eigenes Bundle (front.*) gebaut. Sie in das Konsolen-Bundle zu legen, würde jeden Besucher Vue, ECharts, CodeMirror, Konva und xterm herunterladen lassen (gemessen: rund 1,283KB Konsole gegenüber 24KB Front). Für eine Marketingseite ist der erste Eindruck die Ladegeschwindigkeit. Nur die minimale gemeinsame Oberfläche (Icon-Schaltflächen, Sprachumschalter) liegt in
_shared-ui, damit beide Seiten dieselbe Definition verwenden — beim Kopieren würde eine Seite abdriften.
Das öffentliche Handbuch
/manual öffnet sich ohne Anmeldung. Wer das Produkt evaluiert, sollte nachlesen können, wie es tatsächlich betrieben wird, und eine öffentliche Dokumentation ist selbst ein Marketing- und SEO-Wert. Die Dokumente enthalten keine Geheimnisse und keine Live-Daten.
- Eine URL, zwei Hüllen — Gäste erhalten die öffentliche Hülle (Kopfzeile, Fußzeile, Sprachumschalter), angemeldete Benutzer die Konsolenhülle, und beide rendern denselben Inhalt. View und Seitenmodul sind gemeinsam genutzt, die beiden können also nicht auseinanderlaufen.
- Gäste bekommen zusätzlich nur ein handbuchspezifisches Teil-Bundle (
manual.*); das Konsolen-Bundle wird ihnen nie ausgeliefert. - Artikel zu Funktionen mit höheren Rechten werden als gesperrt gekennzeichnet statt ausgeblendet. Gäste werden als Stufe 1 behandelt.
- Einstiegspunkte sind der [Benutzerhandbuch]-Aufruf im Hero-Bereich der Landingpage und die obere Navigation.
Demo-Anfragen
Das öffentliche Formular (/demo)
Dies ist eine Anfrageannahme, keine Demo per Klick. Erforderlich sind nur ein Name und eine geschäftliche E-Mail-Adresse; Sprache, Herkunftsquelle und IP werden daneben aufgezeichnet.
Dieses Formular ist der einzige Schreibpfad für Gäste in der Anwendung und daher vierfach abgesichert.
- Honeypot — wird er ausgefüllt, wird nichts gespeichert, die Antwort sieht aber weiterhin nach Erfolg aus (kündigen Sie die Erkennung niemals an).
throttle:8,1— die neunte Anfrage innerhalb einer Minute erhält ein 429.- CSRF-Token.
- Serverseitige Prüfung mit Whitelist —
statusundnotesind der Verwaltung vorbehalten, das öffentliche Formular kann sie also nicht setzen.
Der Verwaltungsbildschirm (Verwaltung ▸ Demo-Anfragen)
/admin/demo-requests betreibt den Posteingang: CRUD im Modal plus Suche, Statusfilter mit Zählern und Seitennavigation.
| Status | Bedeutung |
|---|---|
new |
eingegangen, unbearbeitet |
contacted |
kontaktiert |
qualified |
qualifizierte Gelegenheit |
closed |
abgeschlossen |
- Ändern Sie den Status direkt in der Zeile oder hinterlassen Sie eine interne Notiz im Modal.
- Der Eingangskontext (IP, Sprache, Quelle, Zeitstempel) wird schreibgeschützt angezeigt.
- Die Statusfacetten zählen die gesamte Tabelle unabhängig vom aktiven Filter — „wie viele sind unbearbeitet“ darf nicht verschwinden, weil ein Filter gesetzt ist.
Die Suche maskiert LIKE-Platzhalter (
%,_,\). Ohne das würde die Eingabe eines einzelnen%auf jede Zeile passen.
Analyse-Tags (GA4 · GTM · Search Console)
Tragen Sie eine Mess-ID in .env ein, und das Tag erscheint nur auf der öffentlichen Oberfläche. Ist der Wert leer, wird überhaupt kein <script> gerendert, sodass eine Standardinstallation null ausgehende Anfragen stellt.
| Schlüssel | Wert | Zweck |
|---|---|---|
GA_MEASUREMENT_ID |
G-XXXXXXXXXX |
gtag.js (GA4) |
GTM_CONTAINER_ID |
GTM-XXXXXXX |
Google Tag Manager (kann parallel laufen) |
GOOGLE_SITE_VERIFICATION |
Meta-Token | Inhaberschaft in der Search Console |
GA_PRODUCTION_ONLY |
true (Standard) |
nur in der Produktion auslösen |
Fügen Sie diese niemals der Konsole (
layouts/app) hinzu. Konsolen-URLs und -Titel führen Hostnamen, IPs, Instanz-Aliase und Vorfalltitel mit sich. Diese an eine Analyse-Property Dritter zu senden, widerspricht dem Versprechen von Self-Hosting und Datensouveränität, das die Landingpage selbst gibt, und gibt Details der Kundeninfrastruktur preis.
- IDs werden erst nach einer Formatprüfung ausgegeben (
G-…/GTM-…). Ein Tippfehler oder ein Wert mit versprengten Anführungszeichen fällt auf „keine Analyse“ zurück statt auf ein defektes Tag. GA_PRODUCTION_ONLYsteht standardmäßig auftrue— lokaler und Staging-Verkehr, der eine Property verunreinigt, lässt sich nachträglich nicht bereinigen, und das ist der häufigste Grund dafür, dass GA4-Zahlen nicht mehr vertraut wird.- Die Konversion löst auf der Erfolgsseite aus, nicht beim Absenden. Ein Auslösen beim Absenden zählt Validierungsfehler und Honeypot-Treffer als Konversionen und bläht die Zahl auf.
- Handlungsaufrufe werden nach Position getrennt (
hero,header,footer_cta,footer_nav,hero_manual), damit sich der Beitrag zuordnen lässt. - Fehlt
gtag, ist das JS vollständig wirkungslos — ein fehlgeschlagenes Laden der Analyse blockiert die Oberfläche nie.
GA4 liefert Ihnen keine Suchbegriffe. Es meldet den Kanal (organische Suche) und hört dort auf; die Suchanfragen liegen ausschließlich in der Search Console. Deshalb wird das Meta-Tag zur Inhaberschaft unabhängig von GA4 ausgegeben — Sie können die Inhaberschaft bestätigen, ohne GA4 überhaupt zu aktivieren. Für Auswertungen je Website siehe Besucher- und Suchauswertung.
Textrichtlinie
Vertrauenszahlen auf der Landingpage verwenden nur, was sich im Code zählen lässt, und sie werden beim Rendern gezählt statt fest verdrahtet (Anzahl der Regelsätze, Anzahl der Prüfungen, Anzahl der Mail-/SMS-Adapter und so weiter).
Diese Richtlinie hat einen echten Fehler aufgedeckt — die Zahl der Prüfungen betrug 36, nicht 37. Umgekehrt werden beobachtete Werte nie verwendet: die Anzahl unterschiedlicher Signaturen liegt bei 43 über 24h, 67 über 7d und 79 insgesamt, sie würde sich also zwischen Besuchen ändern und das Vertrauen eher untergraben als aufbauen. Da es sich um eine öffentliche Seite handelt, berührt sie auch nie die Datenbank — eine Abfrage pro Besuch ist unnötig, und die Marketingoberfläche sollte eine wackelnde Datenbank überstehen.
Datenquellen
| Ziel | Ort | Rolle |
|---|---|---|
infr_demo_request |
Standard (000770) | Posteingang der Demo-Anfragen (status, note, locale, source, ip) |
config/analytics.php ← .env |
config | Single Source of Truth für Mess-IDs und deren Freigabe (App\Support\Analytics) |
public/brand/ |
statische Dateien | Logo und OG-Bilder |
public/brand/muss eingecheckt werden. Der größte Teil vonpublic/ist erzeugte Ausgabe (build,hot,storagestehen im gitignore), deshalb wird es leicht übersehen — Markenmaterialien sind jedoch keine Vite-Ausgabe: nichts baut sie, und ohne den Commit liefern Logo und OG-Bild in der Produktion 404. Das OG-Bild muss PNG sein: viele Social-Media-Crawler rendern keine SVG-Vorschau.
Berechtigungen
- Landingpage, Demo-Formular, Handbuch: öffentlich.
- Verwaltung ▸ Demo-Anfragen: Stufe ≥ 10 (Selbstprüfung), jede Änderung wird in
infr_audit_logfestgehalten.
Fehlersuche · FAQ
/schickt mich immer zur Konsole — das ist korrekt: eine authentifizierte Sitzung wird auf/consoleumgeleitet. Melden Sie sich ab oder nutzen Sie ein privates Fenster, um die Landingpage zu sehen.- Das Tag erscheint nie — die ID ist leer, sie hat die Formatprüfung nicht bestanden, oder
GA_PRODUCTION_ONLY=truegilt, obwohl dies nicht die Produktion ist. Suchen Sie im Seitenquelltext nachgoogletagmanager.com, um das zu bestätigen. - GA4 erfasst nichts — prüfen Sie, ob die Mess-ID auf der Website zu der Property gehört, die Sie auswerten wollen (GA4-Verwaltung ▸ Datenstreams). Landen die Daten in einer anderen Property, zeigen die Berichte für immer null an.
- Eine Demo-Anfrage wurde nicht gespeichert — ein Honeypot-Treffer liefert Erfolg ohne zu speichern (so gewollt). Prüfen Sie außerdem Validierungsfehler und das Limit von 8 pro Minute (429).
- Der Umschalter listet acht Sprachen, übersetzt sind aber nur ko/en — der Rest fällt auf Englisch zurück. Die tatsächliche Nachfrage nach nicht übersetzten Sprachen wird über den Analyse-Parameter
languagebeobachtet. - Ein 500 direkt nach einem frischen Deployment — nginx muss so verdrahtet sein, dass es auf das Ende des Vite-Builds wartet. Da die öffentliche Landingpage
/ist, träfen Crawler und Interessenten sonst als ersten Eindruck auf ein 500.
Verwandte Themen
- Besucher- und Suchauswertung — die je Website erfassten Daten lesen
- Service ▸ Web — Überwachung registrierter Websites
- Sprache und Lokalisierung — Sprachumschaltung und Übersetzungspakete
- Verwaltung ▸ Audit-Protokoll — Verlauf der Bearbeitung von Demo-Anfragen
