# Journal 2026-09-04

## Firmen-Landingpage `/dpohl` modernisiert

**Was:** Die Firmenseite von D.Pohl Smart Solutions (Route `dpohl`, `HomeController::index()`) wurde
neu aufgebaut: ein responsives Template statt Desktop-/Mobile-Weiche, eigenes Stylesheet statt
1.200 Zeilen Inline-CSS, überarbeitete Inhalte.

**Warum:** Die Seite lief über User-Agent-Erkennung auf zwei parallel zu pflegende Templates
(`home/index.html.twig`, `home/mobile.html.twig`), setzte auf Flip-Karten (auf Touch und per Tastatur
kaum bedienbar) und enthielt nicht belegbare Werbeaussagen („50+ Projekte“, „100 % Kundenzufriedenheit“,
„24/7 Support“) sowie ein Kundenzitat ohne Freigabe. Zusätzlich war die im CSS gesetzte Schrift `Inter`
nie geladen (stattdessen das ungenutzte `Oswald`).

**Entscheidungen (mit dem Kunden abgestimmt):** Markenfarben aus dem Logo beibehalten (Gelb/Amber auf
Dunkelviolett, Gelb nur als Akzent), eine responsive Seite für alle Geräte, nicht belegbare Zahlen
durch nachprüfbare Aussagen ersetzen.

**Änderungen:**

- `src/Controller/HomeController.php`
  - `index()` rendert immer `home/index.html.twig`; User-Agent-Erkennung und `Request`-Parameter entfallen.
    `impressum()`/`datenschutz()` bleiben unverändert.
- `templates/home/index.html.twig` (neu geschrieben)
  - Struktur: Hero mit „digitaler Visitenkarte“, Fakten-Leiste, Leistungen (4 Karten + offene
    Einladung), Referenz Kreissportbund Düren mit Projektdetails, SwimMonitor/Smart-Home-Beispiele,
    Ablauf in vier Schritten, Technologien nach Themen, FAQ, CTA, Kontakt, Footer.
  - Statt Flip-Karten normale Karten mit sichtbaren Inhalten (Tastatur- und Touch-tauglich, indexierbar).
  - Zahlenversprechen ersetzt durch belegbare Aussagen (ein Ansprechpartner, Standort Kreuzau/Kreis
    Düren, kostenloses Erstgespräch, Betreuung nach dem Livegang). Zitat „Daniel Schneider, Privatkunde“
    entfernt; KSB-Referenz sachlich als Projektbeschreibung.
  - SEO/Sharing: Meta-Description, Canonical, Open Graph/Twitter, `theme-color`, Favicon,
    JSON-LD (`ProfessionalService`) mit den Daten aus dem Impressum.
  - Barrierefreiheit: Skip-Link, `<main>`/`<nav>`-Landmarks, sichtbarer Fokus, Formularlabels,
    `aria-live` für Formularmeldungen, dekorative Icons `aria-hidden`.
  - Kontaktformular mit Labels und Datenschutz-Checkbox; API-Vertrag (`POST` auf `contact` mit
    `name`, `email`, `subject`, `message`) unverändert.
  - Assets über `asset()` statt relativer Pfade; Bootstrap 5.3.3 + Font Awesome 6.5.2; AOS entfällt.
- `public/css/dpohl-landing.css` (neu) — komplettes Seitendesign, Tokens unter `--dp-*`,
  mobile-first mit Breakpoints, `prefers-reduced-motion` berücksichtigt.
- `public/js/dpohl-landing.js` (neu) — Header-Zustand beim Scrollen, Mobile-Navigation, Einblenden
  per `IntersectionObserver` (ersetzt AOS), aktiver Navigationspunkt, Formular-Handling.

**Gotchas beim Umbau:**

- `.dp-page a { color: … }` (Spezifität 0-1-1) hat die Buttonfarbe `.dp-btn--primary` (0-1-0)
  überschrieben → Buttontext war gelb auf gelb. Fließtext-Links jetzt via
  `a:not(.dp-btn):not(.dp-brand)`, Buttonfarben mit `.dp-page`-Präfix.
- `repeat(auto-fit, minmax(290px, 1fr))` erzeugt auf sehr schmalen Viewports horizontalen Überlauf →
  `minmax(min(290px, 100%), 1fr)`.
- Vier Leistungskarten in einem Drei-Spalten-Raster ließen eine Lücke; Leistungsraster ab 768 px
  fest zweispaltig (`.dp-grid--services`).

**Offen:** `templates/home/mobile.html.twig` ist nicht mehr eingebunden und kann gelöscht werden;
Freigabe für die KSB-Kundenstimme einholen; echte Projektbilder ergänzen; `impressum`/`datenschutz`
nutzen weiterhin eigene Mobile-Templates. Siehe `docs/TODO.md`.

## Suchmaschinen-Sichtbarkeit `/dpohl`

**Was:** robots.txt und sitemap.xml ergänzt, strukturierte Daten erweitert, Meta-Angaben geschärft,
Logo-Auslieferung von 1.314 KB auf 15 KB reduziert — und zwei blockierende Befunde dokumentiert.

**Befund 1 (blockierend, serverseitig):** `https://dp-smartsolutions.de/` liefert ein **HTML-Frameset**
mit leerem `<title>`, das `…/ksbdueren/public/dpohl` in einem `<frame>` lädt. Google rechnet
Frame-Inhalte nicht der Eltern-URL zu, `<frameset>` ist in HTML5 entfallen und mobil unbrauchbar; auf
der Domain-Wurzel existieren zudem weder `/robots.txt` noch `/sitemap.xml` (beide 404). Beispiel-vHost
zur Umstellung liegt unter `config/apache/dp-smartsolutions-root.conf.example` (inkl. Hinweisen zu
`APP_URL` und den Microsoft-OAuth-Redirect-URIs, die den alten Pfad enthalten).

**Befund 2 (rechtlich + SEO):** `/impressum` und `/datenschutz` waren in `security.yaml` nicht
freigegeben — live erschien unter beiden URLs die **SwimMonitor-Login-Seite** (HTTP 200). Pflichtangaben
müssen ohne Login erreichbar sein; für Google waren die Seiten nicht indexierbar und lieferten
Duplicate Content der Loginmaske.

**Änderungen:**

- `config/packages/security.yaml`
  - `PUBLIC_ACCESS` für `^/impressum`, `^/datenschutz`, `^/robots\.txt$`, `^/sitemap\.xml$`
    (vor der Catch-all-Regel `^/` mit `ROLE_USER`).
- `src/Controller/SeoController.php` (neu) + `templates/seo/sitemap.xml.twig` (neu)
  - `/robots.txt` mit Disallow für Admin-, API- und Login-Pfade und Sitemap-Verweis.
  - `/sitemap.xml` mit `dpohl`, `impressum`, `datenschutz`; URLs kommen aus dem Router, funktionieren
    also unter Unterpfad und späterer Domain-Wurzel gleichermaßen. Beide Antworten `public`, 24 h Cache.
- `templates/home/index.html.twig`
  - Titel/Description auf Suchbegriffe plus Region ausgerichtet („Webentwicklung, Smart Home & IoT im
    Kreis Düren“), `robots`-Meta mit `max-image-preview:large`, Open Graph mit Bildmaßen und Alt-Text.
  - JSON-LD `ProfessionalService` erweitert (`@id`, `logo`, `sameAs`, `areaServed`, `knowsAbout`,
    `hasOfferCatalog`) und zweiter Block `FAQPage` für die vier FAQ-Einträge (Rich-Result-Kandidat).
  - Logo über `<picture>` mit WebP und PNG-Fallback, `fetchpriority="high"` plus `preload` für das
    Hero-Bild.
- `public/images/firmenlogo-{240,480,960}.{webp,png}` (neu, per GD aus dem Original erzeugt)
  - Original ist 2500×1080 px / 1.314 KB und wurde unverändert im Header (38 px hoch!) geladen.
    Neu: Header 3 KB, Hero 15 KB (WebP). Original bleibt als Quelldatei liegen.
- `templates/home/{impressum,impressum_mobile,datenschutz,datenschutz_mobile}.html.twig`
  - Sprechende Titel, Meta-Description und `rel="canonical"`.
- `config/apache/dp-smartsolutions-root.conf.example` (neu) — vHost-Vorlage für die Domain-Wurzel.

**Noch offen (Kunde/Server):** vHost umstellen und Frameset entfernen, danach `APP_URL` anpassen und
Sitemap in der Google Search Console einreichen. Optional: Google Fonts, Bootstrap und Font Awesome
selbst hosten — beschleunigt den Seitenaufbau und passt zur DSGVO-Aussage auf der Seite.

## Impressum und Datenschutz neu für die Firmenpräsenz

**Was:** Beide Rechtsseiten neu geschrieben — im Design der neuen Landingpage, responsiv, mit Inhalten,
die zu dieser Seite passen. Dazu ein gemeinsames Grundgerüst für alle drei Seiten der Firmenpräsenz.

**Warum:** Die alten Seiten stammten aus dem Vorgängerdesign (Flip-Card-Ära), liefen über die
User-Agent-Weiche mit je einem zweiten `*_mobile`-Template und beschrieben Verarbeitungen, die es auf
der neuen Seite nicht mehr gibt bzw. verschwiegen die, die es gibt: Die neue Seite lädt Schriftarten
von Google Fonts, Bootstrap von jsDelivr und Font Awesome von cdnjs — dabei geht die IP-Adresse der
Besucher an Dritte, was in der alten Erklärung nicht stand. Umgekehrt stand dort ein allgemeiner
Cookie-Abschnitt, obwohl die Seite keine Cookies setzt.

**Änderungen:**

- `templates/home/base_dpohl.html.twig` (neu) — gemeinsames Grundgerüst: `<head>` mit Blöcken für
  Titel, Description, Canonical, Preload und strukturierte Daten, Header mit Navigation, Footer.
  Kindtemplates setzen `navBase`, damit die Ankerlinks von den Rechtsseiten auf die Landingpage zeigen.
- `templates/home/index.html.twig` — nutzt jetzt das Grundgerüst; Inhalt unverändert, rund 120 Zeilen
  doppelter Kopf/Fuß entfallen.
- `templates/home/impressum.html.twig` (neu geschrieben) — sieben Abschnitte mit Sprungmarken:
  Anbieter, Kontakt, Umsatzsteuer, inhaltlich Verantwortlicher, Streitschlichtung, Haftung,
  Urheberrecht. Verweise auf **§ 5 DDG** und **§ 18 MStV** statt auf das außer Kraft getretene TMG.
- `templates/home/datenschutz.html.twig` (neu geschrieben) — zwölf Abschnitte, passend zum tatsächlichen
  Verhalten der Seite: kein Tracking/keine Analyse, Server-Logfiles (Art. 6 Abs. 1 lit. f), Kontaktformular
  (Weiterleitung per E-Mail, **keine** Datenbankspeicherung, Bestätigungsmail, Art. 6 Abs. 1 lit. b/f/a),
  Direktkontakt, **eingebundene Drittdienste namentlich** (Google Fonts, jsDelivr, cdnjs) inklusive
  Drittlandhinweis und der Absicht, künftig selbst zu hosten, Cookies (§ 25 Abs. 2 Nr. 2 TDDDG),
  Speicherdauer, Betroffenenrechte mit LDI NRW als Aufsichtsbehörde, Widerspruch, TLS, Änderungen.
  Stand-Datum sichtbar im Kopf.
- `src/Controller/HomeController.php` — User-Agent-Weiche in `impressum()` und `datenschutz()` entfernt,
  `Request` dort nicht mehr nötig; je Seite existiert nur noch eine URL.
- `public/css/dpohl-landing.css` — Baustein `.dp-legal-*` (Kopfbereich, klebendes Inhaltsverzeichnis,
  Textkarten, Definitionslisten, Hinweisbox) sowie `scroll-behavior: smooth` und `scroll-padding-top`,
  damit Ankerziele nicht unter dem klebenden Header landen.

**Bewusst allgemein gehalten:** Hoster und E-Mail-Dienstleister sind in Abschnitt 3 und 4 nicht
namentlich genannt (Twig-Kommentar im Template, Eintrag in `docs/TODO.md`) — die Angaben lagen nicht
belegt vor, und falsche Namen wären schlimmer als eine allgemeine Formulierung.

**Hinweis:** Die Texte sind sorgfältig auf die tatsächliche Verarbeitung abgestimmt, ersetzen aber keine
Rechtsberatung. Vor dem Livegang einmal prüfen lassen.

## Externe CDNs entfernt — alle Ressourcen vom eigenen Server

**Was:** Die Firmenpräsenz (`/dpohl`, `/impressum`, `/datenschutz`) lädt keine Dateien mehr von fremden
Servern. Beim Aufruf entsteht keine Verbindung zu Google, jsDelivr oder Cloudflare mehr.

**Warum:** Bei jedem Seitenaufruf ging die IP-Adresse der Besucher an drei US-nahe Anbieter — das
widersprach der Aussage „DSGVO-konforme Umsetzung“ auf der eigenen Seite und kostete zusätzliche
DNS- und Verbindungsaufbauten beim Laden.

**Änderungen:**

- `public/vendor/fontawesome/` (neu) — Font Awesome 6.5.2, CSS plus die beiden tatsächlich genutzten
  Schnitte `fa-solid-900.woff2` und `fa-brands-400.woff2`. Die bisher lokale Version 6.0.0 unter
  `public/css/all.min.css` blieb unangetastet, weil sie andere Seiten nutzen — und ihr fehlten die
  Brands-Icons für Discord und GitHub.
- `public/vendor/fonts/` (neu) — Inter (400/500/600/700) und Barlow Condensed (600/700 kursiv) als
  woff2, Subsets latin und latin-ext, dazu ein selbst erzeugtes `fonts.css` mit den `@font-face`-Regeln
  inklusive `unicode-range` und `font-display: swap`. Lizenz: SIL Open Font License 1.1.
- Bootstrap kommt aus den vorhandenen Dateien `public/css/bootstrap.min.css` (5.3.0) und
  `public/js/bootstrap.bundle.min.js` (5.3.3) — kein zweiter Satz derselben Bibliothek im Projekt.
- `templates/home/base_dpohl.html.twig` — CDN-Links und `preconnect`-Hinweise ersetzt durch lokale
  Pfade; stattdessen `preload` für die beiden Schriftschnitte, die oberhalb der Falz sichtbar sind.
- `templates/home/datenschutz.html.twig` — Abschnitt 6 heißt jetzt „Schriftarten, Symbole und externe
  Inhalte“ und beschreibt den neuen Zustand: keine Verbindung zu Dritten, keine Drittlandübermittlung.
  Auch die Kurzübersicht (Abschnitt 1) und der Änderungshinweis (Abschnitt 12) wurden angepasst.

**Geprüft:** Im ausgelieferten HTML aller drei Seiten bleiben als externe Adressen nur die Links zu
Discord und GitHub im Seitenfuß übrig — reine Verweise, die erst beim Klick Daten übertragen.
Darstellung, Schriften und Icons (inklusive Brands) unverändert.


## Magallanes Cutover — .mage.yml Fix (pending root deploy)

**Problem:** Composer post-install `cache:clear` scheiterte, weil `var/log` schon Symlink war.
**Fix:** `.mage.yml` — mkdir var/cache+log; `.env`-Links vor composer; `--no-scripts`; `var/log`-Link danach; cache clear/warmup in post-release.
**Blocker:** `sudo -u ftpuser` braucht Passwort; SSH-Key für ftpuser von pohl nicht lesbar.
**Root:** `bash /tmp/ksb-fix/run-deploy-now.sh`


## GitHub privat + Magallanes-Deploy

**Repo:** https://github.com/znyde87/ksbdueren (privat)
**Fix in `.mage.yml`:** `.env` vor composer (`../../shared`); `composer --no-scripts`;
`var/log` + `public/uploads` mit `../../../shared` (relativ zum Symlink-Ort unter var/ bzw. public/);
Cache clear/warmup in post-release.
**Deploy:** `scripts/deploy.sh` / `php /usr/local/bin/mage deploy production` als ftpuser.
**Cutover:** `bash /tmp/ksb-fix/finish-cutover-final.sh` (Repair current oder Full-Deploy).
**Dateien:** `.mage.yml`, `scripts/deploy.sh`, `shared/`, `current/`
