# desfoto.de Quellcode und Deployment für **https://desfoto.de** — die Foto- und Videoproduktion von Denny Schulz aus Neumünster. Die Seite ist bewusst als statische Website gebaut: kein Framework, kein CMS, keine Datenbank. `scripts/build-site.py` erzeugt aus `src/` und den heruntergeladenen Originaldateien in `assets-src/` das vollständige, auslieferbare Verzeichnis `site/`. ## Aufbau | Pfad | Inhalt | | --- | --- | | `src/content.py` | Alle redaktionellen Inhalte, Kontaktdaten und Pflichtangaben | | `src/pages.py` | Die 13 Seiten und die 404-Seite als HTML-Fabriken | | `src/layout.py` | Grundgerüst, Navigation, ``, Bild-Helfer | | `src/theme.py` | Design-Tokens und das komplette Stylesheet | | `src/images.json` | Zuordnung der Bildmotive aus dem eigenen Bilderpool | | `scripts/fetch-assets.py` | Lädt Bilderpool, Google-Fonts-Subsets und Lizenzen | | `scripts/build-site.py` | Erzeugt `site/` inkl. WebP-Varianten, OG-Bildern, Sitemap | | `tests/test_site.py` | Struktur-, Datenschutz- und Inhaltstests | | `site/` | Generiertes Ergebnis — wird so ausgeliefert (committet) | | `assets-src/` | Heruntergeladene Quellen (nicht im Git, per Skript reproduzierbar) | | `.ocauto/` | QA-, Deploy- und Verify-Hooks | | `docs/deployment.md` | Produktionsablauf, Rollback, Infrastruktur | ## Lokal bauen und prüfen ```bash python3 scripts/fetch-assets.py # einmalig, braucht Zugriff auf den Bilderpool python3 scripts/build-site.py # schreibt site/ .ocauto/qa # vollständige deterministische Prüfung ``` Der lokale Server läuft über Docker Compose: ```bash docker compose -f compose.yml up -d open http://127.0.0.1:18430/ ``` ## Seiten Startseite · Fotografie · Businessfotografie · Portrait & Model · Familie · Minishootings · Video · Social Media · Projekte · Über · Kontakt · Impressum · Datenschutz — plus eine eigene 404-Seite. Der GTIN-Generator unter `/gtin/` ist ein separates, öffentlich direkt aufrufbares Werkzeug. Er bleibt absichtlich unverlinkt, fehlt in der Sitemap und trägt `noindex,nofollow`; nur das Werkzeug selbst verlinkt auf seine eigenständigen Rechtstexte unter `/gtin/impressum/` und `/gtin/datenschutz/`. Diese Seiten verwenden keine Navigation oder Rechtstexte des Hauptauftritts. ## Technische Entscheidungen - **Schriften selbst gehostet.** Fraunces (Display) und Manrope (Text) werden als Google-Fonts-`woff2`-Subsets mitgeliefert, dazu die OFL-Lizenzen in `docs/`. Es wird nichts von `fonts.googleapis.com` geladen. - **Bilder als WebP in mehreren Breiten.** Erzeugt werden nur Breiten, die kleiner oder gleich dem Original sind — nichts wird hochskaliert. - **YouTube erst nach Klick.** Statt eines vorab geladenen iframes gibt es ein Vorschaubild; das eigentliche Video kommt per Klick über `youtube-nocookie.com`. - **Kontaktformular ohne Server.** Das Formular setzt aus den Eingaben lokal einen E-Mail-Entwurf zusammen. Ohne JavaScript greift `mailto:` als Fallback. Es gibt keinen API-Endpunkt und keine Datenübertragung an den Server. - **Keine Zugriffsprotokolle.** `nginx.conf` schaltet das Access-Log ab; es gibt keine Cookies, keine Analyse und keine externen Ressourcen. - **GTIN-Generator.** Der Generator unter `/gtin/` rechnet vollständig im Browser, ohne Konto, externe API oder Serverübertragung. Er speichert bis zu 20 zuletzt erzeugte Einträge lokal im Browser; der Offline-Appcache enthält nur die Anwendungsdateien. Die eigenständige Datenschutzerklärung liegt unter `/gtin/datenschutz/`; die Rechtstexte sind nicht mit denen des Hauptauftritts verknüpft. ## Herkunft der Inhalte Die Bilder stammen aus dem eigenen Bilderpool des Betreibers und werden als bereits abgeleitete `web`-Variante geladen. Es werden nur Motive gezeigt, für die die Rechte vorliegen. Alle gezeigten Personen sind mit der Veröffentlichung einverstanden.