- lagebild.js: tote initLangToggle() und switchContent() entfernt; initTranslations()-Aufruf aus init() raus (translations.js gibt es nicht mehr). Kein neues Verhalten, nur Aufraeumen. - CLAUDE.md aktualisiert: en/situations/-Struktur, Slug-Mapping, Daten-Freigabe-Konzept, Kontaktformular i18n-Hinweis, CHANGE_LOG erweitert. Backend (contact-form.py) wurde live ausgerollt und ist nicht im Repo (liegt unter /opt/v2-Docker/aegis-website/), Backup unter contact-form.py.bak.<timestamp>. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
280 Zeilen
11 KiB
Markdown
280 Zeilen
11 KiB
Markdown
# CLAUDE.md - AegisSight Website
|
|
|
|
RELATED_DOCS:
|
|
COOKIE_CONSENT_IMPLEMENTATION.md: "Cookie-Banner Implementierung, GDPR, Testing"
|
|
DATENSCHUTZ_ANALYTICS.md: "Textbausteine fuer Datenschutzerklaerung"
|
|
PROFESSIONAL_TOOLBOX_CONTENT.md: "Backup-HTML fuer entfernte Produktkarte"
|
|
VIDEO_UPLOAD_INSTRUCTIONS.md: "Anleitung fuer manuelle Video-Uploads (Git-Limit)"
|
|
|
|
PROJECT: Website
|
|
STATUS: PRODUCTION
|
|
URL: https://aegis-sight.de
|
|
CONTAINER: aegis-website-nginx
|
|
|
|
COMPANY:
|
|
name: AegisSight UG (haftungsbeschraenkt)
|
|
domain: aegis-sight.de
|
|
email: info@aegis-sight.de
|
|
|
|
TECHNOLOGY:
|
|
type: Static Website
|
|
build_process: NONE
|
|
deployment: Docker/nginx
|
|
|
|
frontend:
|
|
- HTML5
|
|
- CSS3 (modular)
|
|
- JavaScript ES6+
|
|
- SVG
|
|
|
|
features:
|
|
- multi_language: [DE, EN]
|
|
- responsive: mobile-first
|
|
- video_backgrounds: true
|
|
- cookie_consent: GDPR-compliant
|
|
- security_headers: enabled
|
|
|
|
STRUCTURE:
|
|
root_files:
|
|
- index.html: Hauptseite (DE)
|
|
- impressum.html: Impressum (DE)
|
|
- datenschutz.html: Datenschutz (DE)
|
|
- accountforger-video.html: Produkt-Demo
|
|
- robots.txt: SEO-Konfiguration
|
|
- sitemap-launch.xml: Sitemap mit hreflang-Alternativen
|
|
- cookie-consent.js: GDPR Cookie-System (liest <html lang> selbststaendig)
|
|
- cookie-consent.css: Cookie-Banner Styles
|
|
|
|
directories:
|
|
en:
|
|
- index.html: Hauptseite (EN)
|
|
- legal-notice.html: Impressum (EN, Hinweis "German version prevails")
|
|
- privacy.html: Datenschutz (EN, Hinweis "German version prevails")
|
|
situations:
|
|
- iran-conflict/index.html: Lagebild Iran (EN-Mirror, teilt /lagen/iran-konflikt/data)
|
|
- cyber-attacks/index.html: Lagebild Cyberangriffe (EN-Mirror, teilt /lagen/cyberangriffe/data)
|
|
- deepfakes/index.html: Recherche Deepfakes (EN-Mirror, teilt /lagen/deepfakes/data)
|
|
|
|
assets:
|
|
fonts: [Inter, Bebas Neue]
|
|
images:
|
|
icons: UI-Icons (SVG)
|
|
flags: Laenderflaggen
|
|
logos: "Logo+Schrift_Rechts.svg"
|
|
videos: "~300MB - Hero-Videos, AFv6.mp4"
|
|
|
|
css:
|
|
- main.css: Kern-Styles
|
|
- animations-enhanced.css: Animationen
|
|
- mobile.css: Mobile Responsive
|
|
- fonts.css: Typografie
|
|
- style.css: Light-Mode Styles (index, legal pages, /en/)
|
|
- lang-switcher.css: Sprachumschalter-Komponente (DE/EN)
|
|
|
|
js:
|
|
- main.js: Einstiegspunkt
|
|
- components.js: UI-Komponenten
|
|
- animations.js: Animationssystem
|
|
- app.js: Hero-Videos, 3D-Karussell, Leaflet-Karte, Live-Daten, Kontaktformular
|
|
|
|
docs: Rechtliche PDFs
|
|
|
|
lagen:
|
|
iran-konflikt:
|
|
- index.html: Lagebild-Seite (Leaflet, Tabs, Timeline)
|
|
- lagebild.js: Datenladung, Rendering, Interaktionen
|
|
- lagebild.css: Dark-Theme Styling
|
|
- data/: current.json + Snapshots (sync alle 5min)
|
|
|
|
vorschau:
|
|
- index.html: Produktseite AegisSight Monitor (Passwort-Gate)
|
|
css:
|
|
- style.css: Light-Mode Design (Navy/Gold Akzente)
|
|
js:
|
|
- app.js: Hero-Videos, 3D-Karussell, Leaflet-Karte, Live-Daten, Kontaktformular
|
|
|
|
PAGES:
|
|
homepage:
|
|
sections: [Hero mit Video, Ueber uns, Loesungen, Kontakt]
|
|
legal:
|
|
- /impressum.html bzw. /en/legal-notice.html
|
|
- /datenschutz.html bzw. /en/privacy.html
|
|
product:
|
|
- AccountForger Video-Demo
|
|
lagen:
|
|
url_struktur:
|
|
de: /lagen/{thema}/
|
|
en: /en/situations/{slug}/ (slug ist die englische URL-Variante)
|
|
slug_mapping:
|
|
iran-konflikt: iran-conflict
|
|
cyberangriffe: cyber-attacks
|
|
deepfakes: deepfakes
|
|
daten_freigabe: |
|
|
EN-Mirror-Seiten setzen window.LAGEBILD_DATA_BASE auf den DE-Pfad,
|
|
damit beide Sprachvarianten die gleichen JSON-Daten laden. Das
|
|
lagebild.js liest curLang() aus <html lang> und schaltet UI-Strings
|
|
automatisch um (lang.de / lang.en Dictionary).
|
|
redirect: /lagebild/ -> 301 -> /lagen/iran-konflikt/
|
|
aktiv:
|
|
- iran-konflikt / iran-conflict: Live-Lagebild Irankonflikt
|
|
- cyberangriffe / cyber-attacks: Live-Lagebild Cyberangriffe
|
|
- deepfakes / deepfakes: Recherche-Briefing Deepfakes
|
|
vorschau:
|
|
url: /vorschau/
|
|
zweck: Produktseite AegisSight Monitor (ersetzt spaeter die Hauptseite)
|
|
auth: JavaScript SHA-256 Passwort-Gate (kein Benutzername)
|
|
design: Light-Mode, Navy/Gold Akzente, SVG-Wellen/Diagonale Divider
|
|
sections: [Hero mit Video (clip-path Chevron), Problem (dark), Workflow 3-Schritte, Live-Stats, 3D-Karussell mit Lagebild-Text, Leaflet-Karte (gekoppelt an Karussell), Faktenprüfung-Statement, Features (5 Cards zentriert), CTA, Unser Versprechen]
|
|
daten: Fetcht /lagen/iran-konflikt/data/summary.json (~116 KB)
|
|
karussell: 3D-Perspektive, 3 Cards (Iran live + 2 Platzhalter), Karte wechselt mit
|
|
karte: Leaflet mit Pulse-Markern, Dark Popups/Legende, gekoppelt an aktive Lage
|
|
kontaktformular: Popup-Modal (Name, Organisation, E-Mail, Nachricht) -> /api/contact -> SMTP
|
|
icons: monitor.svg + languages.svg (Lucide) hinzugefuegt
|
|
|
|
DEVELOPMENT:
|
|
i18n:
|
|
ansatz: statische Duplikate (DE unter /, EN unter /en/)
|
|
sprachumschalter: css/lang-switcher.css
|
|
pendant_urls: in jeder Seite hardcoded (funktioniert ohne JS)
|
|
cookie_banner: cookie-consent.js liest <html lang> selbststaendig
|
|
lagen: lagebild.js liest <html lang> via curLang(); Daten-Pfad ueber
|
|
window.LAGEBILD_DATA_BASE pro EN-Mirror-Seite
|
|
kontaktformular: |
|
|
Frontend (js/app.js) sendet lang im POST-Body, zeigt Sende- und
|
|
Fehler-Texte in der jeweiligen Sprache. Backend
|
|
(/opt/v2-Docker/aegis-website/contact-form.py, NICHT im Repo)
|
|
liest lang und antwortet entsprechend; E-Mail an info@aegis-sight.de
|
|
bleibt deutsch, mit Hinweis "[EN]" im Betreff bei EN-Anfragen.
|
|
large_files: "assets/videos/ (~300MB)"
|
|
design: mobile-first responsive
|
|
|
|
SERVICES:
|
|
contact-form:
|
|
script: /opt/v2-Docker/aegis-website/contact-form.py
|
|
service: aegis-contact.service
|
|
port: 127.0.0.1:8074
|
|
nginx: /api/contact -> 127.0.0.1:8074
|
|
zweck: Kontaktformular-Handler (SMTP an info@aegis-sight.de)
|
|
rate_limit: 3 Anfragen pro IP / 10 Min
|
|
|
|
DEPLOYMENT:
|
|
container: aegis-website-nginx
|
|
server: nginx (static files)
|
|
ssl: enabled
|
|
security_headers: enabled
|
|
rate_limiting: configured
|
|
|
|
CHANGE_LOG:
|
|
2026-01-08:
|
|
- "Rebrand: IntelSight -> AegisSight"
|
|
- "Neues Logo: Logo+Schrift_Rechts.svg"
|
|
- "Email: info@aegis-sight.de"
|
|
- "Footer: Dynamisches Jahr, AGB entfernt"
|
|
2026-05-06:
|
|
- "i18n: Sprachumschalter DE/EN, neue Seiten unter /en/"
|
|
- "Aufraeumen: js/translations.js, impressum-en.html, datenschutz-en.html entfernt"
|
|
- "data-translate Attribute aus Lagen-Seiten entfernt"
|
|
- "EN-Lagen-Seiten unter /en/situations/{slug}/, teilen DE-Datenfiles"
|
|
- "lagebild.js: curLang() liest <html lang>, dataBase()-Helper neu, tote initLangToggle/switchContent entfernt"
|
|
- "Kontaktformular zweisprachig (Frontend + Backend)"
|
|
|
|
Last-Updated: 2026-05-06
|
|
|
|
RULES:
|
|
neue_html_seiten:
|
|
- "Jede neue HTML-Datei MUSS im <head> folgende Favicon-Tags enthalten:"
|
|
- "<link rel=\"icon\" type=\"image/svg+xml\" href=\"/favicon.svg\">"
|
|
- "<link rel=\"apple-touch-icon\" href=\"/assets/images/logos/AegisSightLogo_NavyGold.svg\">"
|
|
- "Fuer Unterverzeichnisse relative Pfade anpassen, z.B. ../favicon.svg"
|
|
|
|
# ───────────────────────────────────────────────────────────────────
|
|
# STAGING-UMGEBUNG
|
|
# ───────────────────────────────────────────────────────────────────
|
|
|
|
STAGING:
|
|
url: https://staging.aegis-sight.de
|
|
server: 46.225.225.49 (gleicher Host wie Live)
|
|
container: aegis-website-staging-nginx (eigener Docker-Container)
|
|
pfad: /opt/v2-Docker/aegis-website-staging/html
|
|
branch: develop
|
|
netzwerk_ip: 172.18.0.7 (im v2_internal_net)
|
|
zugriff: Magic-Link-Login an info@aegis-sight.de (Cookie 30 Tage)
|
|
|
|
besonderheit_lagen_daten:
|
|
erklaerung: |
|
|
Die Live-Lagen-Daten (/lagen/*/data/*.json) werden vom sync-lagebild.py
|
|
erzeugt und nicht ins Repo committed. Im Staging-Container ist das
|
|
Live-/lagen/-Verzeichnis read-only gemountet, damit die Karten-Vorschau
|
|
auch im Staging mit echten Daten funktioniert.
|
|
mount_im_compose: /opt/v2-Docker/aegis-website/html/lagen:/usr/share/nginx/html/lagen:ro
|
|
|
|
auth_service:
|
|
pfad: /opt/v2-Docker/aegis-staging-auth
|
|
service: aegis-staging-auth.service
|
|
port: 127.0.0.1:8095
|
|
cookie_domain: staging.aegis-sight.de
|
|
cookie_name: aegis_staging_auth
|
|
|
|
WORKFLOW_STAGING_TO_LIVE:
|
|
1_aenderung_in_develop: |
|
|
cd /opt/v2-Docker/aegis-website-staging/html
|
|
git checkout develop
|
|
# Aenderung machen
|
|
git add . && git commit -m ...
|
|
git push origin develop
|
|
2_staging_aktualisieren_manuell: |
|
|
ssh claude-dev@46.225.225.49 'cd /opt/v2-Docker/aegis-website-staging/html && git pull'
|
|
# Kein Container-Reload noetig (statische Files)
|
|
3_in_browser_pruefen: https://staging.aegis-sight.de
|
|
4_promote_zu_live: |
|
|
# Auf Gitea: Pull Request develop -> main, dann mergen
|
|
# Danach auf Live-Server pullen:
|
|
ssh claude-dev@46.225.225.49 'cd /opt/v2-Docker/aegis-website/html && git pull'
|
|
|
|
# ───────────────────────────────────────────────────────────────────
|
|
# AUTO-DEPLOY + PROMOTE-UI
|
|
# ───────────────────────────────────────────────────────────────────
|
|
|
|
AUTO_DEPLOY:
|
|
prinzip: |
|
|
Gitea-Webhook bei Push auf develop -> Listener-Service auf dem Server pullt
|
|
automatisch + restartet ggf. den Service. Kein manueller git pull mehr noetig.
|
|
|
|
listener_service:
|
|
pfad: /opt/v2-Docker/aegis-staging-deploy
|
|
service: aegis-staging-deploy.service
|
|
port: 127.0.0.1:8096
|
|
deployments:
|
|
staging: "develop -> /opt/v2-Docker/aegis-website-staging/html"
|
|
live: "main -> /opt/v2-Docker/aegis-website/html"
|
|
endpoints:
|
|
"POST /__deploy": "staging (HMAC ueber Gitea-Webhook)"
|
|
"POST /__deploy/live": "live (HMAC ueber Promote-UI)"
|
|
secrets: in /opt/v2-Docker/aegis-staging-deploy/.env (nicht im Repo)
|
|
|
|
gitea_webhook:
|
|
repo: AegisSight/Website
|
|
url: https://staging.aegis-sight.de/__deploy
|
|
branch_filter: develop
|
|
|
|
PROMOTE_UI:
|
|
url: https://deploy.aegis-sight.de
|
|
pfad: /opt/v2-Docker/aegis-promote
|
|
service: aegis-promote.service
|
|
port: 127.0.0.1:8097
|
|
zugriff: Magic-Link-Login an info@aegis-sight.de (eigener Cookie deploy.aegis-sight.de)
|
|
funktion: |
|
|
Zeigt pro Service (Webseite + Monitor) Live-Stand vs. Staging-Stand.
|
|
Promote-Button erstellt Gitea-PR develop->main, mergt ihn auto, und triggert
|
|
den Live-Deploy via HMAC-signed Webhook am Listener-Service.
|
|
|
|
WORKFLOW_KOMPLETT:
|
|
1_entwickeln: |
|
|
git checkout develop
|
|
# Aenderung
|
|
git add . && git commit && git push origin develop
|
|
# -> Auto-Deploy pullt in /opt/v2-Docker/aegis-website-staging/html
|
|
2_pruefen_staging: https://staging.aegis-sight.de/
|
|
3_promoten: https://deploy.aegis-sight.de/ (Promote-Knopf)
|
|
4_pruefen_live: https://aegis-sight.de/
|