Analytics auf Umami umgestellt, Firmennamen korrigiert, Lagebild-Daten aus Git entfernt
- cookie-consent.js: Von /insights/t.js auf Umami (/analytics-und-so/datenblick.js) umgestellt, cookieloses Tracking korrekt beschrieben, Website-ID ergänzt - analytics-events.js: Custom-Event-Tracking für Umami (Produkt-Clicks, About-Tabs, Scroll, Sprachwechsel, Lagebild-Besuche) - Alle HTML-Seiten: analytics-events.js eingebunden - impressum.html: "UG i. G." -> "UG (haftungsbeschränkt)" - impressum-en.html: Footer-Jahr dynamisch, Firmenname korrigiert - .gitignore: lagebild/data/ ausgeschlossen (wird per Cron-Sync alle 5min vom Monitor regeneriert, gehört nicht ins Repo) - Doku-Updates: COOKIE_CONSENT_IMPLEMENTATION.md, DATENSCHUTZ_ANALYTICS.md Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Dieser Commit ist enthalten in:
@@ -1,51 +1,54 @@
|
||||
# 🍪 COOKIE CONSENT IMPLEMENTIERUNG - KOMPLETT-GUIDE
|
||||
# ANALYTICS IMPLEMENTATION - KOMPLETT-GUIDE
|
||||
|
||||
**IntelSight / Aegis-Sight**
|
||||
**Datum:** 2025-11-09
|
||||
**Version:** 1.0
|
||||
**Status:** ✅ Implementation Complete
|
||||
**AegisSight UG**
|
||||
**Datum:** 2026-03-20
|
||||
**Version:** 2.0
|
||||
**Status:** Implementation Complete
|
||||
|
||||
---
|
||||
|
||||
# PHASE 1: BESTANDSAUFNAHME ✅
|
||||
# PHASE 1: BESTANDSAUFNAHME
|
||||
|
||||
## Dienste & Cookies Katalog
|
||||
## Dienste & Tracking Katalog
|
||||
|
||||
### **Dienste im Einsatz:**
|
||||
- ✅ **IntelSight Analytics** (Self-Hosted, Deutschland)
|
||||
- ❌ Keine Google Analytics
|
||||
- ❌ Keine Facebook Pixel
|
||||
- ❌ Keine Third-Party CDNs
|
||||
- ❌ Keine Social Media Widgets
|
||||
- **AegisSight Analytics (Umami v3.0.3)** - Self-Hosted, Deutschland
|
||||
- Keine Google Analytics
|
||||
- Keine Facebook Pixel
|
||||
- Keine Third-Party CDNs
|
||||
- Keine Social Media Widgets
|
||||
|
||||
### **Cookies:**
|
||||
| Cookie | Zweck | Laufzeit | Opt-In? |
|
||||
|--------|-------|----------|---------|
|
||||
| `_insights_session` | Session-Tracking | 30 Min. | ✅ Ja |
|
||||
| `insights-consent` | Consent-Status | 12 Mon. | ❌ Nein (technisch) |
|
||||
| `insights-theme` | Dark Mode | ∞ | ❌ Nein (funktional) |
|
||||
|
||||
### **Tracking-Daten:**
|
||||
**Keine.** Umami arbeitet vollständig cookieless. Es werden weder Session-Cookies noch Tracking-Cookies gesetzt. Die Identifikation erfolgt ohne Cookies und ohne Fingerprinting.
|
||||
|
||||
| Eintrag | Zweck | Typ | Opt-In? |
|
||||
|---------|-------|-----|---------|
|
||||
| `analytics-consent` (LocalStorage) | Consent-Status | LocalStorage | Nein (technisch) |
|
||||
|
||||
### **Tracking-Daten (anonymisiert):**
|
||||
- Browser, OS, Device, Screen Resolution
|
||||
- Stadt, Land, Koordinaten (GeoIP)
|
||||
- Seiten, Referrer, Session-Dauer, Bounce
|
||||
- Land, Region (kein Stadtlevel, kein GeoIP-Lookup)
|
||||
- Seiten, Referrer, Session-Dauer
|
||||
- Traffic Source, UTM-Parameter
|
||||
|
||||
### **Personenbezug:** ⚠️ Ja (IP + Fingerprinting)
|
||||
### **Personenbezug:** Nein
|
||||
|
||||
**Rechtsgrundlage:** Art. 6 Abs. 1 lit. a DSGVO (Einwilligung)
|
||||
Umami speichert keine IP-Adressen und verwendet kein Fingerprinting. Alle Daten sind aggregiert und nicht auf einzelne Nutzer rückführbar.
|
||||
|
||||
**Rechtsgrundlage:** Art. 6 Abs. 1 lit. f DSGVO (berechtigtes Interesse) - da cookieless und ohne Personenbezug ist kein Opt-In zwingend erforderlich. Der Consent-Banner wird dennoch aus Transparenzgründen eingesetzt.
|
||||
|
||||
---
|
||||
|
||||
# PHASE 2: ENTSCHEIDUNG & DESIGN ✅
|
||||
# PHASE 2: ENTSCHEIDUNG & DESIGN
|
||||
|
||||
## **Entscheidung: CUSTOM BANNER**
|
||||
|
||||
**Gründe:**
|
||||
- Nur 1 Dienst → CMP wäre Overkill
|
||||
- Nur 1 Dienst - CMP wäre Overkill
|
||||
- Volle Kontrolle, keine Abhängigkeiten
|
||||
- Schneller (<5KB vs. 50-100KB)
|
||||
- Kostenlos vs. €50-500/Monat für CMP
|
||||
- Schneller (<5KB vs. 50-100KB für CMP)
|
||||
- Kostenlos
|
||||
|
||||
---
|
||||
|
||||
@@ -54,29 +57,31 @@
|
||||
### Banner (Primary):
|
||||
```
|
||||
┌─────────────────────────────────────────┐
|
||||
│ 🍪 Diese Website nutzt Cookies │
|
||||
│ Website-Analyse │
|
||||
│ │
|
||||
│ Text: Self-Hosted, Deutschland, keine │
|
||||
│ Weitergabe an Dritte... │
|
||||
│ Text: Cookieless Analytics, Self- │
|
||||
│ Hosted in Deutschland, keine │
|
||||
│ Weitergabe an Dritte... │
|
||||
│ │
|
||||
│ [Details & Einstellungen] │
|
||||
│ [✓ Alle akzeptieren] [✗ Nur notw.] │
|
||||
│ [Details & Einstellungen] │
|
||||
│ [Alles akzeptieren] [Nur notwendige] │
|
||||
└─────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### Settings Modal:
|
||||
```
|
||||
┌─────────────────────────────────┐
|
||||
│ Cookie-Einstellungen [✕] │
|
||||
├─────────────────────────────────┤
|
||||
│ ☑ Notwendig (immer aktiv) │
|
||||
│ ☐ Statistik & Analyse │
|
||||
│ └─ IntelSight Analytics │
|
||||
│ • _insights_session (30min)│
|
||||
│ • Deutschland, kein 3rd │
|
||||
│ │
|
||||
│ [Auswahl speichern] [Alle ✓] │
|
||||
└─────────────────────────────────┘
|
||||
┌─────────────────────────────────────┐
|
||||
│ Analyse-Einstellungen [×] │
|
||||
├─────────────────────────────────────┤
|
||||
│ ☑ Notwendig (immer aktiv) │
|
||||
│ ☐ Statistik & Analyse │
|
||||
│ └─ AegisSight Analytics (Umami) │
|
||||
│ • Keine Cookies │
|
||||
│ • Keine IP-Speicherung │
|
||||
│ • Self-Hosted, Deutschland │
|
||||
│ │
|
||||
│ [Auswahl speichern] [Alle akz.] │
|
||||
└─────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
@@ -84,64 +89,82 @@
|
||||
## **Texte (DE/EN)**
|
||||
|
||||
**Deutsch:**
|
||||
- Titel: "Diese Website nutzt Cookies 🍪"
|
||||
- Text: "Selbst gehostet, Deutschland, keine Dritte..."
|
||||
- Buttons: "Alle akzeptieren" / "Nur notwendige"
|
||||
- Titel: "Website-Analyse"
|
||||
- Text: "Wir nutzen cookielose Analyse-Software auf unserem eigenen Server in Deutschland. Es werden keine persönlichen Daten gespeichert und nichts an Dritte weitergegeben."
|
||||
- Buttons: "Alles akzeptieren" / "Nur notwendige"
|
||||
|
||||
**Englisch:**
|
||||
- Title: "This website uses cookies 🍪"
|
||||
- Text: "Self-hosted, Germany, no third parties..."
|
||||
- Title: "Website Analytics"
|
||||
- Text: "We use cookieless analytics software on our own server in Germany. No personal data is stored and nothing is shared with third parties."
|
||||
- Buttons: "Accept all" / "Only necessary"
|
||||
|
||||
---
|
||||
|
||||
# PHASE 3: IMPLEMENTATIONSPLAN ✅
|
||||
# PHASE 3: IMPLEMENTATIONSPLAN
|
||||
|
||||
## **3.1 Gating-Pattern (Opt-In)**
|
||||
## **3.1 Gating-Pattern**
|
||||
|
||||
```
|
||||
Page Load
|
||||
↓
|
||||
Check LocalStorage['insights-consent']
|
||||
Check LocalStorage['analytics-consent']
|
||||
↓
|
||||
├─→ null → Show Banner + Block Tracking
|
||||
├─→ 'accepted' → Load /insights/t.js
|
||||
├─→ 'accepted' → Load Umami Script
|
||||
└─→ 'rejected' → Block Tracking
|
||||
```
|
||||
|
||||
**Kritisch:** Script `/insights/t.js` wird ERST nach Zustimmung geladen!
|
||||
**Ablauf:** Das Umami-Script `/analytics-und-so/datenblick.js` wird erst nach Zustimmung geladen.
|
||||
|
||||
---
|
||||
|
||||
## **3.2 Storage-Schema**
|
||||
## **3.2 Script-Einbindung**
|
||||
|
||||
### Umami Tracking-Script (wird dynamisch geladen bei Consent):
|
||||
|
||||
```html
|
||||
<script
|
||||
defer
|
||||
src="/analytics-und-so/datenblick.js"
|
||||
data-website-id="598ef5fd-d2dc-4540-9e65-602889981dac"
|
||||
></script>
|
||||
```
|
||||
|
||||
### API-Endpoint:
|
||||
```
|
||||
POST /analytics-und-so/api/erfassen
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **3.3 Storage-Schema**
|
||||
|
||||
### LocalStorage Keys:
|
||||
|
||||
```javascript
|
||||
// Consent Status
|
||||
"insights-consent": {
|
||||
"analytics-consent": {
|
||||
value: "accepted" | "rejected",
|
||||
expires: 1730832000000 // Timestamp
|
||||
expires: 1774051200000 // Timestamp (12 Monate)
|
||||
}
|
||||
|
||||
// Consent Details (Audit-Trail)
|
||||
"insights-consent-details": {
|
||||
timestamp: "2025-11-09T18:00:00Z",
|
||||
version: "1.0",
|
||||
"analytics-consent-details": {
|
||||
timestamp: "2026-03-20T12:00:00Z",
|
||||
version: "2.0",
|
||||
categories: { necessary: true, analytics: true },
|
||||
language: "de",
|
||||
userAgent: "Mozilla/5.0...",
|
||||
gpcSignal: false
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **3.3 Footer-Link (Persistent)**
|
||||
## **3.4 Footer-Link (Persistent)**
|
||||
|
||||
```html
|
||||
<footer>
|
||||
<a href="#" id="cookie-settings-link">Cookie-Einstellungen</a>
|
||||
<a href="#" id="cookie-settings-link">Analyse-Einstellungen</a>
|
||||
</footer>
|
||||
```
|
||||
|
||||
@@ -149,297 +172,183 @@ Check LocalStorage['insights-consent']
|
||||
|
||||
---
|
||||
|
||||
## **3.4 Re-Prompt Regeln**
|
||||
## **3.5 Re-Prompt Regeln**
|
||||
|
||||
**Banner erneut zeigen bei:**
|
||||
1. Consent abgelaufen (nach 12 Monaten)
|
||||
2. Version-Change (neue Dienste hinzugefügt)
|
||||
2. Version-Change (z.B. 2.0 → 2.1)
|
||||
3. User löscht LocalStorage
|
||||
4. Click auf "Cookie-Einstellungen"
|
||||
5. GPC-Signal erkannt (optional)
|
||||
4. Klick auf "Analyse-Einstellungen"
|
||||
|
||||
---
|
||||
|
||||
## **3.5 Global Privacy Control (GPC)**
|
||||
## **3.6 Global Privacy Control (GPC)**
|
||||
|
||||
**Was:** HTTP-Header `Sec-GPC: 1` → User will nicht getrackt werden
|
||||
|
||||
**Implementierung:**
|
||||
```javascript
|
||||
if (navigator.globalPrivacyControl === true) {
|
||||
// Auto-reject analytics
|
||||
localStorage.setItem('insights-consent', 'rejected');
|
||||
localStorage.setItem('analytics-consent', JSON.stringify({
|
||||
value: 'rejected',
|
||||
expires: Date.now() + 365 * 24 * 60 * 60 * 1000
|
||||
}));
|
||||
}
|
||||
```
|
||||
|
||||
**Rechtlich:** CCPA-bindend (Kalifornien), EU empfohlen
|
||||
|
||||
---
|
||||
|
||||
# PHASE 4: UMSETZUNG + TESTS ✅
|
||||
# PHASE 4: UMSETZUNG + TESTS
|
||||
|
||||
## **4.1 Dateien erstellt**
|
||||
## **4.1 Dateien**
|
||||
|
||||
### **1. cookie-consent.html** (Demo-Seite)
|
||||
- Test-Seite zum Testen des Banners
|
||||
- Live-Status-Anzeige
|
||||
- Test-Buttons (Reset, Show Banner)
|
||||
|
||||
### **2. cookie-consent.css** (2.4 KB)
|
||||
### **1. cookie-consent.css**
|
||||
- Responsive Design (Mobile-First)
|
||||
- Accessibility (Focus-Trap, ARIA, Keyboard)
|
||||
- Animations (Fade-In, Slide-Up)
|
||||
- Dark Mode kompatibel
|
||||
- High Contrast Support
|
||||
|
||||
### **3. cookie-consent.js** (14 KB)
|
||||
### **2. cookie-consent.js**
|
||||
- Consent Management Logic
|
||||
- GPC Detection
|
||||
- LocalStorage mit Expiry
|
||||
- Multilingual (DE/EN)
|
||||
- Public API
|
||||
- Version Control
|
||||
- Dynamisches Laden von `/analytics-und-so/datenblick.js`
|
||||
|
||||
### **4. DATENSCHUTZ_ANALYTICS.md**
|
||||
### **3. DATENSCHUTZ_ANALYTICS.md**
|
||||
- Fertige Datenschutzerklärung
|
||||
- DSGVO-konforme Texte
|
||||
- Cookie-Liste
|
||||
- FAQ-Sektion
|
||||
|
||||
---
|
||||
|
||||
## **4.2 Features implementiert**
|
||||
|
||||
✅ **Opt-In vor Tracking** (Gating)
|
||||
✅ **Backdrop-Overlay** (verhindert Interaktion)
|
||||
✅ **Two-Step Design** (Banner → Settings)
|
||||
✅ **Consent-Versionierung** (Re-Prompt bei Updates)
|
||||
✅ **GPC/DNT Support** (Auto-Reject)
|
||||
✅ **LocalStorage mit Expiry** (12 Monate)
|
||||
✅ **Audit-Trail** (Consent-Details)
|
||||
✅ **Multilingual** (DE/EN, erweiterbar)
|
||||
✅ **Accessibility** (ARIA, Focus-Trap, Keyboard)
|
||||
✅ **Responsive** (Mobile-optimiert)
|
||||
✅ **Public API** (programmatischer Zugriff)
|
||||
- **Opt-In vor Tracking** (Gating)
|
||||
- **Backdrop-Overlay** (verhindert Interaktion)
|
||||
- **Two-Step Design** (Banner → Settings)
|
||||
- **Consent-Versionierung** (Re-Prompt bei Updates)
|
||||
- **GPC/DNT Support** (Auto-Reject)
|
||||
- **LocalStorage mit Expiry** (12 Monate)
|
||||
- **Audit-Trail** (Consent-Details)
|
||||
- **Multilingual** (DE/EN)
|
||||
- **Accessibility** (ARIA, Focus-Trap, Keyboard)
|
||||
- **Responsive** (Mobile-optimiert)
|
||||
- **Public API** (programmatischer Zugriff)
|
||||
- **Cookieless Tracking** (keine Cookies nötig)
|
||||
|
||||
---
|
||||
|
||||
## **4.3 Test-Checkliste**
|
||||
|
||||
### **Desktop Tests:**
|
||||
### **Funktional:**
|
||||
- [ ] Banner erscheint beim ersten Besuch
|
||||
- [ ] "Alles akzeptieren" lädt `/analytics-und-so/datenblick.js`
|
||||
- [ ] "Nur notwendige" blockiert Script-Laden
|
||||
- [ ] Re-Visit: Kein Banner (Consent gespeichert)
|
||||
- [ ] Footer-Link öffnet Banner erneut
|
||||
- [ ] Widerruf funktioniert (Accept → Reject)
|
||||
- [ ] GPC-Signal wird erkannt und respektiert
|
||||
- [ ] Version-Change löst Re-Prompt aus
|
||||
|
||||
- [ ] **Chrome (Windows)**
|
||||
- [ ] Banner erscheint beim ersten Besuch
|
||||
- [ ] "Alle akzeptieren" lädt Tracking-Script
|
||||
- [ ] "Nur notwendige" blockiert Tracking
|
||||
- [ ] Cookie `_insights_session` wird gesetzt (bei Accept)
|
||||
- [ ] LocalStorage `insights-consent` wird gespeichert
|
||||
- [ ] Re-Visit: Kein Banner (Consent gespeichert)
|
||||
- [ ] Footer-Link öffnet Banner erneut
|
||||
- [ ] Settings Modal funktioniert
|
||||
- [ ] Analytics-Toggle funktioniert
|
||||
- [ ] "Auswahl speichern" speichert Einstellung
|
||||
### **Script-Integration:**
|
||||
- [ ] Script hat korrektes `data-website-id="598ef5fd-d2dc-4540-9e65-602889981dac"`
|
||||
- [ ] Pageview wird an `/analytics-und-so/api/erfassen` gesendet
|
||||
- [ ] Keine Cookies im Browser nach Tracking
|
||||
|
||||
- [ ] **Firefox (Windows)**
|
||||
- [ ] Alle oben genannten Tests
|
||||
- [ ] GPC-Signal wird erkannt (wenn aktiviert)
|
||||
|
||||
- [ ] **Safari (macOS)**
|
||||
- [ ] Alle oben genannten Tests
|
||||
- [ ] ITP (Intelligent Tracking Prevention) respektiert
|
||||
|
||||
- [ ] **Edge (Windows)**
|
||||
- [ ] Alle oben genannten Tests
|
||||
|
||||
### **Mobile Tests:**
|
||||
|
||||
- [ ] **Chrome Mobile (Android)**
|
||||
- [ ] Banner ist scrollbar
|
||||
- [ ] Buttons sind touchbar (mind. 44x44px)
|
||||
- [ ] Settings Modal ist lesbar
|
||||
- [ ] Overlay verhindert Scroll
|
||||
|
||||
- [ ] **Safari Mobile (iOS)**
|
||||
- [ ] Alle oben genannten Tests
|
||||
- [ ] Kein horizontal scroll
|
||||
|
||||
### **Sprach-Tests:**
|
||||
|
||||
- [ ] **Deutsch (`lang="de"`)**
|
||||
- [ ] Alle Texte auf Deutsch
|
||||
- [ ] Datenschutz-Link auf Deutsch
|
||||
|
||||
- [ ] **Englisch (`lang="en"`)**
|
||||
- [ ] Alle Texte auf Englisch
|
||||
- [ ] Privacy Policy Link auf Englisch
|
||||
|
||||
### **GPC-Tests:**
|
||||
|
||||
- [ ] **Firefox mit Tracking-Schutz**
|
||||
- [ ] Banner zeigt GPC-Notice
|
||||
- [ ] Analytics automatisch deaktiviert
|
||||
- [ ] User kann trotzdem manuell akzeptieren
|
||||
|
||||
- [ ] **Brave Browser**
|
||||
- [ ] GPC standardmäßig aktiv
|
||||
- [ ] Auto-Reject funktioniert
|
||||
|
||||
### **Accessibility Tests:**
|
||||
|
||||
- [ ] **Screen Reader (NVDA/JAWS)**
|
||||
- [ ] Banner wird vorgelesen
|
||||
- [ ] Buttons sind beschriftet
|
||||
- [ ] ARIA-Attribute korrekt
|
||||
|
||||
- [ ] **Keyboard Navigation**
|
||||
- [ ] Tab durchläuft alle Buttons
|
||||
- [ ] Enter/Space aktiviert Buttons
|
||||
- [ ] Esc schließt Settings Modal
|
||||
- [ ] Focus-Trap funktioniert
|
||||
|
||||
- [ ] **High Contrast Mode**
|
||||
- [ ] Banner ist lesbar
|
||||
- [ ] Borders sind sichtbar
|
||||
|
||||
### **Funktional Tests:**
|
||||
|
||||
- [ ] **Consent-Speicherung**
|
||||
- [ ] Akzeptiert → `/insights/t.js` geladen
|
||||
- [ ] Abgelehnt → Kein Script geladen
|
||||
- [ ] LocalStorage korrekt befüllt
|
||||
- [ ] Expiry-Timestamp korrekt
|
||||
|
||||
- [ ] **Widerruf**
|
||||
- [ ] Footer-Link öffnet Banner
|
||||
- [ ] Von Akzeptiert → Abgelehnt funktioniert
|
||||
- [ ] Script wird nicht mehr geladen
|
||||
- [ ] Cookie wird gelöscht
|
||||
|
||||
- [ ] **Ablauf (Expiry)**
|
||||
- [ ] Nach 12 Monaten: Re-Prompt
|
||||
- [ ] Vor Ablauf: Kein Banner
|
||||
|
||||
- [ ] **Version-Change**
|
||||
- [ ] Version 1.0 → 1.1: Re-Prompt
|
||||
- [ ] Consent Details werden aktualisiert
|
||||
|
||||
- [ ] **LocalStorage löschen**
|
||||
- [ ] Banner erscheint erneut
|
||||
- [ ] Consent muss neu erteilt werden
|
||||
|
||||
### **Integration Tests:**
|
||||
|
||||
- [ ] **Tracking-Script**
|
||||
- [ ] `/insights/t.js` lädt ERST nach Consent
|
||||
- [ ] Pageview wird getrackt (200 OK)
|
||||
- [ ] Cookie `_insights_session` gesetzt
|
||||
- [ ] Daten in DB (Nuremberg, DE, etc.)
|
||||
|
||||
- [ ] **Datenschutzerklärung**
|
||||
- [ ] Link funktioniert
|
||||
- [ ] Alle Dienste aufgelistet
|
||||
- [ ] Opt-Out erklärt
|
||||
### **Accessibility & Responsive:**
|
||||
- [ ] Keyboard-Navigation funktioniert (Tab, Enter, Esc)
|
||||
- [ ] Screen Reader liest Banner korrekt vor
|
||||
- [ ] Mobile: Buttons sind touchbar, kein horizontaler Scroll
|
||||
|
||||
---
|
||||
|
||||
## **4.4 Browser-Kompatibilität**
|
||||
|
||||
| Browser | Version | Getestet | Status |
|
||||
|---------|---------|----------|--------|
|
||||
| Chrome | 120+ | ⏳ Pending | - |
|
||||
| Firefox | 121+ | ⏳ Pending | - |
|
||||
| Safari | 17+ | ⏳ Pending | - |
|
||||
| Edge | 120+ | ⏳ Pending | - |
|
||||
| Chrome Mobile | 120+ | ⏳ Pending | - |
|
||||
| Safari iOS | 17+ | ⏳ Pending | - |
|
||||
| Browser | Version | Status |
|
||||
|---------|---------|--------|
|
||||
| Chrome | 120+ | - |
|
||||
| Firefox | 121+ | - |
|
||||
| Safari | 17+ | - |
|
||||
| Edge | 120+ | - |
|
||||
| Chrome Mobile | 120+ | - |
|
||||
| Safari iOS | 17+ | - |
|
||||
|
||||
**Minimum Support:** ES6 (2015+), LocalStorage, Fetch API
|
||||
|
||||
---
|
||||
|
||||
# PHASE 5: DATENSCHUTZERKLÄRUNG ✅
|
||||
# PHASE 5: DATENSCHUTZERKLÄRUNG
|
||||
|
||||
## **5.1 Textbausteine erstellt**
|
||||
## **5.1 Textbausteine**
|
||||
|
||||
**Datei:** `DATENSCHUTZ_ANALYTICS.md`
|
||||
|
||||
**Enthält:**
|
||||
- ✅ Art und Umfang der Datenverarbeitung
|
||||
- ✅ Rechtsgrundlage (Art. 6 Abs. 1 lit. a DSGVO)
|
||||
- ✅ Zweck der Verarbeitung
|
||||
- ✅ Empfänger (keine Dritte!)
|
||||
- ✅ Datenübermittlung Drittländer (keine!)
|
||||
- ✅ Speicherdauer (90 Tage)
|
||||
- ✅ Widerruf der Einwilligung
|
||||
- ✅ GPC-Unterstützung
|
||||
- ✅ Betroffenenrechte (Art. 15-21 DSGVO)
|
||||
- ✅ Opt-Out Möglichkeiten
|
||||
- ✅ Technische Sicherheitsmaßnahmen
|
||||
- ✅ Cookie-Liste (Tabellenform)
|
||||
- ✅ FAQ-Sektion
|
||||
- Art und Umfang der Datenverarbeitung
|
||||
- Rechtsgrundlage (Art. 6 Abs. 1 lit. f DSGVO - berechtigtes Interesse)
|
||||
- Hinweis auf cookieloses Tracking
|
||||
- Keine IP-Speicherung, kein Fingerprinting
|
||||
- Self-Hosted auf eigenem Server (Deutschland)
|
||||
- Keine Datenübermittlung an Dritte
|
||||
- Widerruf der Einwilligung
|
||||
- GPC-Unterstützung
|
||||
- Betroffenenrechte (Art. 15-21 DSGVO)
|
||||
|
||||
---
|
||||
|
||||
## **5.2 Integration in Website**
|
||||
|
||||
### **Datenschutz-Seite:**
|
||||
|
||||
```html
|
||||
<!-- /datenschutz.html -->
|
||||
<section id="analytics">
|
||||
<h2>4. Website-Analyse</h2>
|
||||
<!-- Inhalt aus DATENSCHUTZ_ANALYTICS.md einfügen -->
|
||||
<p>Wir nutzen AegisSight Analytics (Umami), eine cookielose, datenschutzfreundliche
|
||||
Analyse-Software. Diese wird auf unserem eigenen Server in Deutschland betrieben.
|
||||
Es werden keine Cookies gesetzt, keine IP-Adressen gespeichert und kein
|
||||
Fingerprinting eingesetzt. Die erhobenen Daten sind nicht auf einzelne Personen
|
||||
rückführbar.</p>
|
||||
</section>
|
||||
```
|
||||
|
||||
### **Impressum:** (Pflichtangaben)
|
||||
|
||||
```
|
||||
Verantwortlicher:
|
||||
[Firmenname]
|
||||
[Straße Hausnummer]
|
||||
[PLZ Ort]
|
||||
E-Mail: info@ihre-domain.de
|
||||
|
||||
Datenschutzbeauftragter: (falls vorhanden)
|
||||
E-Mail: datenschutz@ihre-domain.de
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **5.3 Rechtliche Checkliste**
|
||||
|
||||
- [x] **Opt-In vor Tracking** ✅
|
||||
- [x] **Widerruf ermöglichen** ✅ (Footer-Link)
|
||||
- [x] **Datenschutzerklärung** ✅ (vollständig)
|
||||
- [x] **Impressum** ⏳ (muss angepasst werden)
|
||||
- [x] **Cookie-Liste** ✅ (vollständig)
|
||||
- [x] **Rechtsgrundlage benannt** ✅ (Art. 6 I a DSGVO)
|
||||
- [x] **Speicherdauer angegeben** ✅ (90 Tage)
|
||||
- [x] **Betroffenenrechte** ✅ (Art. 15-21)
|
||||
- [x] **Aufsichtsbehörde** ⏳ (muss eingefügt werden)
|
||||
- [x] **Kontakt Datenschutz** ⏳ (muss eingefügt werden)
|
||||
- [x] Opt-In vor Tracking (Consent-Banner)
|
||||
- [x] Widerruf ermöglichen (Footer-Link)
|
||||
- [x] Datenschutzerklärung (vollständig)
|
||||
- [x] Rechtsgrundlage benannt (Art. 6 I f DSGVO)
|
||||
- [x] Hinweis cookieloses Tracking
|
||||
- [x] Betroffenenrechte (Art. 15-21)
|
||||
- [ ] Impressum vollständig (muss geprüft werden)
|
||||
- [ ] Aufsichtsbehörde (muss eingefügt werden)
|
||||
|
||||
---
|
||||
|
||||
# DEPLOYMENT-ANLEITUNG
|
||||
|
||||
## **1. Dateien auf Server kopieren**
|
||||
## **1. Dateien auf Server**
|
||||
|
||||
```bash
|
||||
# Cookie Consent Dateien
|
||||
```
|
||||
/var/www/html/
|
||||
├── cookie-consent.css
|
||||
├── cookie-consent.js
|
||||
└── cookie-consent-demo.html (optional, für Tests)
|
||||
└── cookie-consent-demo.html (optional)
|
||||
```
|
||||
|
||||
# Tracking-Script (bereits vorhanden)
|
||||
/opt/v2-Docker/aegis-website/insights/t.js
|
||||
## **2. Umami-Infrastruktur**
|
||||
|
||||
```
|
||||
Analytics-System: Umami v3.0.3 (Node.js/Next.js)
|
||||
Datenbank: PostgreSQL
|
||||
Script-Pfad: /analytics-und-so/datenblick.js
|
||||
API-Endpoint: /analytics-und-so/api/erfassen
|
||||
Website-ID: 598ef5fd-d2dc-4540-9e65-602889981dac
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **2. In alle HTML-Seiten integrieren**
|
||||
## **3. In HTML-Seiten integrieren**
|
||||
|
||||
```html
|
||||
<!DOCTYPE html>
|
||||
@@ -447,123 +356,45 @@ E-Mail: datenschutz@ihre-domain.de
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Ihre Seite</title>
|
||||
|
||||
<!-- Cookie Consent CSS -->
|
||||
<link rel="stylesheet" href="/cookie-consent.css">
|
||||
</head>
|
||||
<body>
|
||||
<!-- Ihr Inhalt -->
|
||||
<!-- Inhalt -->
|
||||
|
||||
<footer>
|
||||
<nav>
|
||||
<a href="/datenschutz">Datenschutz</a>
|
||||
<a href="/impressum">Impressum</a>
|
||||
<a href="#" id="cookie-settings-link">Cookie-Einstellungen</a>
|
||||
<a href="#" id="cookie-settings-link">Analyse-Einstellungen</a>
|
||||
</nav>
|
||||
</footer>
|
||||
|
||||
<!-- WICHTIG: Cookie Consent MUSS VOR Tracking-Script geladen werden! -->
|
||||
<!-- Cookie Consent MUSS VOR allem anderen JS geladen werden -->
|
||||
<script src="/cookie-consent.js"></script>
|
||||
|
||||
<!-- Tracking-Script wird automatisch geladen bei Zustimmung -->
|
||||
<!-- NICHT direkt einbinden: <script src="/insights/t.js"></script> -->
|
||||
<!-- Umami-Script wird automatisch bei Consent geladen -->
|
||||
<!-- NICHT direkt einbinden! -->
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **3. Datenschutzerklärung aktualisieren**
|
||||
## **4. Container neu laden**
|
||||
|
||||
```bash
|
||||
# Textbausteine aus DATENSCHUTZ_ANALYTICS.md kopieren
|
||||
cp DATENSCHUTZ_ANALYTICS.md /var/www/html/datenschutz-bausteine.md
|
||||
|
||||
# In /datenschutz.html einfügen (Abschnitt 4)
|
||||
```
|
||||
|
||||
**WICHTIG:** Folgende Platzhalter ersetzen:
|
||||
- `[Ihr Unternehmensname]`
|
||||
- `[Straße Hausnummer]`
|
||||
- `[PLZ Ort]`
|
||||
- `[Ihr Hosting-Provider]`
|
||||
- `datenschutz@ihre-domain.de`
|
||||
- Zuständige Aufsichtsbehörde
|
||||
|
||||
---
|
||||
|
||||
## **4. Container neu starten** (falls nötig)
|
||||
|
||||
```bash
|
||||
# Nginx neu laden
|
||||
docker exec aegis-website-nginx nginx -s reload
|
||||
|
||||
# PHP-FPM neu starten
|
||||
docker restart aegis-php-fpm
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **5. Tests durchführen**
|
||||
|
||||
### **Manueller Test:**
|
||||
|
||||
```bash
|
||||
# 1. Demo-Seite öffnen
|
||||
https://aegis-sight.de/cookie-consent-demo.html
|
||||
|
||||
# 2. Banner erscheint?
|
||||
# 3. "Alle akzeptieren" klicken
|
||||
# 4. LocalStorage prüfen:
|
||||
# - insights-consent: "accepted"
|
||||
# - insights-consent-details: {...}
|
||||
|
||||
# 5. Tracking-Script geladen?
|
||||
# Im DevTools Network-Tab: /insights/t.js (200 OK)
|
||||
|
||||
# 6. Pageview getrackt?
|
||||
curl -X POST https://aegis-sight.de/insights/api/track ...
|
||||
# Sollte {"status":"ok"} zurückgeben
|
||||
|
||||
# 7. Daten in DB?
|
||||
# Prüfen: city, country_code befüllt
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **6. Produktiv schalten**
|
||||
|
||||
- [ ] Tests erfolgreich
|
||||
- [ ] Datenschutzerklärung aktualisiert
|
||||
- [ ] Impressum vollständig
|
||||
- [ ] Alle Platzhalter ersetzt
|
||||
- [ ] Footer-Links funktionieren
|
||||
|
||||
**Dann:** In alle Website-Seiten integrieren!
|
||||
|
||||
---
|
||||
|
||||
# WARTUNG & UPDATES
|
||||
|
||||
## **Monatlich:**
|
||||
|
||||
- [ ] GeoIP-Datenbank aktualisieren
|
||||
```bash
|
||||
cd /opt/v2-Docker/aegis-website/insights/data/geoip
|
||||
wget -O GeoLite2-City.mmdb.new https://github.com/P3TERX/GeoLite.mmdb/raw/download/GeoLite2-City.mmdb
|
||||
mv GeoLite2-City.mmdb.new GeoLite2-City.mmdb
|
||||
```
|
||||
|
||||
## **Vierteljährlich:**
|
||||
|
||||
- [ ] Analytics-Daten prüfen (>90 Tage löschen)
|
||||
```bash
|
||||
php /opt/v2-Docker/aegis-website/insights/cleanup-old-data.php
|
||||
```
|
||||
- [ ] Umami-Version prüfen und ggf. updaten
|
||||
- [ ] Datenschutzerklärung überprüfen
|
||||
|
||||
## **Jährlich:**
|
||||
|
||||
- [ ] Datenschutzerklärung überprüfen
|
||||
- [ ] Rechtsgrundlagen aktualisieren
|
||||
- [ ] Consent-Version erhöhen (bei Änderungen)
|
||||
|
||||
@@ -573,12 +404,10 @@ curl -X POST https://aegis-sight.de/insights/api/track ...
|
||||
|
||||
## **Problem: Banner erscheint nicht**
|
||||
|
||||
**Ursache:** JavaScript-Fehler oder Consent bereits gesetzt
|
||||
|
||||
**Lösung:**
|
||||
```javascript
|
||||
// In Browser-Console:
|
||||
localStorage.clear();
|
||||
localStorage.removeItem('analytics-consent');
|
||||
localStorage.removeItem('analytics-consent-details');
|
||||
location.reload();
|
||||
```
|
||||
|
||||
@@ -588,34 +417,33 @@ location.reload();
|
||||
|
||||
**Check 1:** LocalStorage
|
||||
```javascript
|
||||
localStorage.getItem('insights-consent')
|
||||
// Sollte: {"value":"accepted","expires":...}
|
||||
JSON.parse(localStorage.getItem('analytics-consent'))
|
||||
// Erwartet: { value: "accepted", expires: ... }
|
||||
```
|
||||
|
||||
**Check 2:** Script geladen?
|
||||
```javascript
|
||||
document.querySelector('script[src="/insights/t.js"]')
|
||||
// Sollte: <script src="/insights/t.js"></script>
|
||||
document.querySelector('script[src="/analytics-und-so/datenblick.js"]')
|
||||
// Erwartet: <script> Element
|
||||
```
|
||||
|
||||
**Check 3:** Cookie gesetzt?
|
||||
**Check 3:** Website-ID korrekt?
|
||||
```javascript
|
||||
document.cookie
|
||||
// Sollte enthalten: _insights_session=...
|
||||
document.querySelector('script[data-website-id]')?.dataset.websiteId
|
||||
// Erwartet: "598ef5fd-d2dc-4540-9e65-602889981dac"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **Problem: GPC wird nicht erkannt**
|
||||
|
||||
**Check:**
|
||||
```javascript
|
||||
navigator.globalPrivacyControl
|
||||
// Firefox Tracking-Schutz: true
|
||||
// Firefox mit Tracking-Schutz: true
|
||||
// Normale Browser: undefined
|
||||
```
|
||||
|
||||
**Lösung:** GPC ist optional, nicht alle Browser unterstützen es
|
||||
GPC ist optional - nicht alle Browser unterstützen es.
|
||||
|
||||
---
|
||||
|
||||
@@ -645,9 +473,9 @@ const status = CookieConsent.getStatus();
|
||||
{
|
||||
consent: "accepted" | "rejected" | null,
|
||||
analytics: true | false,
|
||||
version: "1.0",
|
||||
timestamp: "2025-11-09T18:00:00Z",
|
||||
expires: 1730832000000,
|
||||
version: "2.0",
|
||||
timestamp: "2026-03-20T12:00:00Z",
|
||||
expires: 1774051200000,
|
||||
gpc: false
|
||||
}
|
||||
*/
|
||||
@@ -660,37 +488,48 @@ CookieConsent.setLanguage('en'); // oder 'de'
|
||||
|
||||
# CHANGELOG
|
||||
|
||||
## Version 2.0 (2026-03-20)
|
||||
|
||||
### Geändert:
|
||||
- **Umstieg auf Umami v3.0.3** (ersetzt altes PHP-basiertes System)
|
||||
- **Cookieless Tracking** - keine Cookies mehr nötig
|
||||
- **Neues Tracking-Script:** `/analytics-und-so/datenblick.js`
|
||||
- **Neuer API-Endpoint:** `/analytics-und-so/api/erfassen`
|
||||
- **PostgreSQL** als Datenbank (ersetzt SQLite/Flatfile)
|
||||
- **Rechtsgrundlage** auf Art. 6 I f DSGVO geändert (berechtigtes Interesse)
|
||||
- **LocalStorage-Keys** umbenannt (`analytics-consent` statt `insights-consent`)
|
||||
- Texte angepasst (keine Cookie-Referenzen mehr)
|
||||
- Test-Checklisten gekürzt
|
||||
|
||||
### Entfernt:
|
||||
- Cookie `_insights_session`
|
||||
- PHP-Backend und zugehörige Konfiguration
|
||||
- GeoIP-Datenbank (nicht mehr benötigt)
|
||||
- Monatliche GeoIP-Update-Routine
|
||||
|
||||
## Version 1.0 (2025-11-09)
|
||||
|
||||
### Added:
|
||||
- ✅ Custom Cookie Banner (Slim Layer Design)
|
||||
- ✅ Settings Modal (Two-Step)
|
||||
- ✅ GPC Support (Auto-Reject)
|
||||
- ✅ Multilingual (DE/EN)
|
||||
- ✅ LocalStorage mit Expiry
|
||||
- ✅ Consent Versioning
|
||||
- ✅ Audit-Trail (Consent Details)
|
||||
- ✅ Accessibility (ARIA, Focus-Trap)
|
||||
- ✅ Responsive Design
|
||||
- ✅ Public API
|
||||
- ✅ Datenschutzerklärung (vollständig)
|
||||
### Hinzugefügt:
|
||||
- Custom Cookie Banner (Slim Layer Design)
|
||||
- Settings Modal (Two-Step)
|
||||
- GPC Support, Multilingual (DE/EN)
|
||||
- LocalStorage mit Expiry, Consent Versioning
|
||||
- Accessibility (ARIA, Focus-Trap), Responsive Design
|
||||
- Public API, Datenschutzerklärung
|
||||
|
||||
---
|
||||
|
||||
# LIZENZ & CREDITS
|
||||
|
||||
**Erstellt für:** IntelSight / Aegis-Sight
|
||||
**Entwickler:** Claude Code (Anthropic AI)
|
||||
**Datum:** 2025-11-09
|
||||
**Lizenz:** Proprietär (IntelSight)
|
||||
**Erstellt für:** AegisSight UG
|
||||
**Datum:** 2026-03-20
|
||||
**Lizenz:** Proprietär (AegisSight)
|
||||
|
||||
**Rechtliche Hinweise:**
|
||||
- Keine Garantie für vollständige Rechtssicherheit
|
||||
- Datenschutzerklärung muss von Anwalt geprüft werden
|
||||
- Datenschutzerklärung sollte von einem Anwalt geprüft werden
|
||||
- Individuelle Anpassungen je nach Use Case erforderlich
|
||||
|
||||
---
|
||||
|
||||
**Status: ✅ READY FOR PRODUCTION**
|
||||
|
||||
Alle 5 Phasen erfolgreich abgeschlossen!
|
||||
**Status: PRODUKTIV**
|
||||
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren