#!/usr/bin/env bash # ============================================================================= # ingest-dsfa-bundesland.sh # Ingestiert DSFA-Muss-Listen der 16 Bundesland-Datenschutzbehörden # in den RAG-Corpus bp_dsfa_corpus. # # Usage: # ./scripts/ingest-dsfa-bundesland.sh [--skip-download] [--only-text] # # Voraussetzung: RAG-Service (document-crawler) erreichbar auf localhost:8097 # ============================================================================= set -euo pipefail RAG_URL="${RAG_URL:-https://localhost:8097}" COLLECTION="bp_dsfa_corpus" DOWNLOAD_DIR="/tmp/dsfa-bundesland-pdfs" SKIP_DOWNLOAD=false ONLY_TEXT=false # Parse arguments for arg in "$@"; do case "$arg" in --skip-download) SKIP_DOWNLOAD=true ;; --only-text) ONLY_TEXT=true ;; esac done mkdir -p "$DOWNLOAD_DIR" log() { echo "[$(date +'%H:%M:%S')] $*"; } ok() { echo " ✓ $*"; } warn() { echo " ⚠ $*"; } fail() { echo " ✗ $*" >&2; } # ============================================================================= # Phase 1: Behörden-Daten (URLs + Metadaten) # ============================================================================= declare -A AUTHORITY_LABELS=( ["bfdi"]="Bundesbeauftragte für den Datenschutz und die Informationsfreiheit" ["bw"]="Landesbeauftragte für den Datenschutz und die Informationsfreiheit Baden-Württemberg" ["by"]="Bayerisches Landesamt für Datenschutzaufsicht (LDA Bayern)" ["be"]="Berliner Beauftragte für Datenschutz und Informationsfreiheit" ["bb"]="Die Landesbeauftragte für den Datenschutz und für das Recht auf Akteneinsicht Brandenburg" ["hb"]="Die Landesbeauftragte für Datenschutz und Informationsfreiheit Bremen" ["hh"]="Der Hamburgische Beauftragte für Datenschutz und Informationsfreiheit" ["he"]="Der Hessische Beauftragte für Datenschutz und Informationsfreiheit" ["mv"]="Der Landesbeauftragte für Datenschutz und Informationsfreiheit Mecklenburg-Vorpommern" ["ni"]="Die Landesbeauftragte für den Datenschutz Niedersachsen" ["nw"]="Landesbeauftragte für Datenschutz und Informationsfreiheit NRW" ["rp"]="Der Landesbeauftragte für den Datenschutz und die Informationsfreiheit Rheinland-Pfalz" ["sl"]="Unabhängiges Datenschutzzentrum Saarland" ["sn"]="Sächsischer Datenschutz- und Transparenzbeauftragter" ["st"]="Landesbeauftragter für den Datenschutz Sachsen-Anhalt" ["sh"]="Unabhängiges Landeszentrum für Datenschutz Schleswig-Holstein" ["th"]="Thüringer Landesbeauftragter für den Datenschutz und die Informationsfreiheit" ) declare -A STATE_NAMES=( ["bfdi"]="Bund" ["bw"]="Baden-Württemberg" ["by"]="Bayern" ["be"]="Berlin" ["bb"]="Brandenburg" ["hb"]="Bremen" ["hh"]="Hamburg" ["he"]="Hessen" ["mv"]="Mecklenburg-Vorpommern" ["ni"]="Niedersachsen" ["nw"]="Nordrhein-Westfalen" ["rp"]="Rheinland-Pfalz" ["sl"]="Saarland" ["sn"]="Sachsen" ["st"]="Sachsen-Anhalt" ["sh"]="Schleswig-Holstein" ["th"]="Thüringen" ) # Direkte PDF-Download-URLs der Behörden-Muss-Listen (Art. 35 Abs. 4 DSGVO) # Quellen: DSFA_AUTHORITY_RESOURCES in admin-compliance/lib/sdk/dsfa/types.ts declare -A KNOWN_PDF_URLS=( ["bfdi_public"]="https://www.bfdi.bund.de/SharedDocs/Downloads/DE/Muster/Liste_VerarbeitungsvorgaengeArt35.pdf" ["bw_privat"]="https://www.baden-wuerttemberg.datenschutz.de/wp-content/uploads/2018/05/Liste-von-Verarbeitungsvorg%C3%A4ngen-nach-Art.-35-Abs.-4-DS-GVO-LfDI-BW.pdf" ["be_public"]="https://www.datenschutz-berlin.de/fileadmin/user_upload/pdf/dokumente/2018-BlnBDI_DSFA-oeffentlich.pdf" ["be_privat"]="https://www.datenschutz-berlin.de/fileadmin/user_upload/pdf/dokumente/2018-BlnBDI_DSFA-nicht-oeffentlich.pdf" ["bb_public"]="https://www.lda.brandenburg.de/sixcms/media.php/9/DSFA-Liste_%C3%B6ffentlicher_Bereich.pdf" ["bb_privat"]="https://www.lda.brandenburg.de/sixcms/media.php/9/DSFA-Liste_nicht_%C3%B6ffentlicher_Bereich.pdf" ["hb_public"]="https://www.datenschutz.bremen.de/sixcms/media.php/13/Liste%20von%20Verarbeitungsvorg%C3%A4ngen%20nach%20Artikel%2035.pdf" ["hb_privat"]="https://www.datenschutz.bremen.de/sixcms/media.php/13/DSFA%20Muss-Liste%20LfDI%20HB.pdf" ["hh_public"]="https://datenschutz-hamburg.de/fileadmin/user_upload/HmbBfDI/Datenschutz/Informationen/Liste_Art_35-4_DSGVO_HmbBfDI-oeffentlicher_Bereich_v2.0a.pdf" ["hh_privat"]="https://datenschutz-hamburg.de/fileadmin/user_upload/HmbBfDI/Datenschutz/Informationen/DSFA_Muss-Liste_fuer_den_nicht-oeffentlicher_Bereich_-_Stand_17.10.2018.pdf" ["mv_public"]="https://www.datenschutz-mv.de/static/DS/Dateien/DS-GVO/HilfsmittelzurUmsetzung/MV-DSFA-Muss-Liste-Oeffentlicher-Bereich.pdf" ["ni_public"]="https://www.lfd.niedersachsen.de/download/134414/DSFA_Muss-Liste_fuer_den_oeffentlichen_Bereich.pdf" ["ni_privat"]="https://www.lfd.niedersachsen.de/download/131098/Liste_von_Verarbeitungsvorgaengen_nach_Art._35_Abs._4_DS-GVO.pdf" ["sl_privat"]="https://www.datenschutz.saarland.de/fileadmin/user_upload/uds/alle_Dateien_und_Ordner_bis_2025/Download/dsfa_muss_liste_dsk_de.pdf" ["st_public"]="https://datenschutz.sachsen-anhalt.de/fileadmin/Bibliothek/Landesaemter/LfD/Informationen/Internationales/Datenschutz-Grundverordnung/Liste_DSFA/Art-35-Liste-oeffentlicher_Bereich.pdf" ["st_privat"]="https://datenschutz.sachsen-anhalt.de/fileadmin/Bibliothek/Landesaemter/LfD/Informationen/Internationales/Datenschutz-Grundverordnung/Liste_DSFA/Art-35-Liste-nichtoeffentlicher_Bereich.pdf" ) # ============================================================================= # Phase 2a: PDF-Downloads # ============================================================================= download_pdfs() { log "Lade Behörden-PDFs herunter (${#KNOWN_PDF_URLS[@]} URLs)..." local success=0 local failed=0 for key in "${!KNOWN_PDF_URLS[@]}"; do local url="${KNOWN_PDF_URLS[$key]}" local outfile="$DOWNLOAD_DIR/${key}.pdf" if [[ -f "$outfile" && $(wc -c < "$outfile") -gt 1000 ]]; then ok "PDF bereits vorhanden: $key" ((success++)) || true continue fi curl -sk --max-time 30 -L -A "BreakPilot-Compliance/1.0" -o "$outfile" "$url" 2>/dev/null local exit_code=$? if [[ $exit_code -eq 0 && -f "$outfile" && $(wc -c < "$outfile") -gt 1000 ]]; then ok "PDF heruntergeladen: $key" ((success++)) || true else warn "PDF fehlgeschlagen: $key — nutze Text-Fallback" rm -f "$outfile" ((failed++)) || true fi done log "PDF-Downloads: $success OK, $failed fehlgeschlagen" } # Gibt den Pfad zur ersten vorhandenen PDF-Datei für einen State-ID-Prefix zurück. # Gibt leeren String zurück, wenn keine PDF gefunden. find_pdf_for_state() { local state_id="$1" for key in "${!KNOWN_PDF_URLS[@]}"; do if [[ "$key" == "${state_id}_"* || "$key" == "${state_id}" ]]; then local pdf="$DOWNLOAD_DIR/${key}.pdf" if [[ -f "$pdf" && $(wc -c < "$pdf") -gt 1000 ]]; then echo "$pdf" return fi fi done echo "" } # ============================================================================= # Phase 2b: Text-Zusammenfassungen (für Bundesländer ohne direkte PDFs) # ============================================================================= create_text_summaries() { log "Erstelle Text-Zusammenfassungen für Bundesländer ohne direkte PDF-URLs..." cat > "$DOWNLOAD_DIR/bfdi_muss_liste.txt" << 'EOF' DSFA Muss-Liste - Bundesbeauftragte für den Datenschutz und die Informationsfreiheit (BfDI) Gemäß Art. 35 Abs. 4 DSGVO hat die DSK eine Liste von Verarbeitungsvorgängen veröffentlicht, für die eine Datenschutz-Folgenabschätzung durchzuführen ist. Verarbeitungsvorgänge für die eine DSFA zwingend erforderlich ist: 1. Videoüberwachung öffentlich zugänglicher Bereiche - Systematische umfangreiche Überwachung öffentlich zugänglicher Bereiche - Betreiber: öffentliche und nicht-öffentliche Stellen 2. Verarbeitung besonderer Kategorien personenbezogener Daten (Art. 9 DSGVO) - Gesundheitsdaten bei Versicherungen, Banken, Arbeitgebern - Genetische Daten zu Diagnose- und Behandlungszwecken - Biometrische Daten zur eindeutigen Identifizierung 3. Mobile personenbezogene Daten - Standortdaten in Kombination mit anderen Daten zu Bewegungsprofilen - Umfangreiche regelmäßige Verarbeitung von Standortdaten 4. Scoring und automatisierte Entscheidungen (Art. 22 DSGVO) - Bonitätsbewertungen mit erheblichen Auswirkungen - Scoring-Systeme im HR-Bereich - KI-basierte Bewerbungsauswahlverfahren 5. IoT und Sensordaten - Smarte Geräte mit dauerhafter Verhaltensaufzeichnung - Wearables mit Gesundheits- oder Standortdaten 6. Datenhändler und Datenbroker - Umfangreiche Zusammenführung personenbezogener Daten aus verschiedenen Quellen - Verarbeitung zum Zweck des Profilings ohne direkte Beziehung zur betroffenen Person Quelle: DSK-Positionspapier zur DSFA, BfDI-Orientierungshilfe Art. 35 DSGVO Rechtsgrundlage: Art. 35 Abs. 4 DSGVO, Erwägungsgrund 90 EOF cat > "$DOWNLOAD_DIR/bw_dsfa_anforderungen.txt" << 'EOF' DSFA Muss-Liste - Landesbeauftragte für den Datenschutz Baden-Württemberg (LfDI BW) Verarbeitungen mit hohem Risiko - Pflicht zur DSFA: Öffentlicher Bereich: 1. Verarbeitung von Sozialdaten in großem Umfang (SGB-Verarbeitungen) 2. Biometrische Daten zur eindeutigen Identifizierung von natürlichen Personen 3. Genetische Daten in der medizinischen Versorgung 4. Systematische Überwachung öffentlicher Bereiche (Videoüberwachung) 5. KI-gestützte Verwaltungsentscheidungen (automatisierte Bescheide) 6. Scoring-Systeme im Sozialbereich Nicht-öffentlicher Bereich: 1. Verarbeitung besonderer Kategorien nach Art. 9 DSGVO in großem Umfang 2. Bonitätsprüfungen und Credit Scoring 3. Systematische Überwachung von Beschäftigten 4. KI-Systeme in Bewerbungsverfahren 5. Telematikdaten im Versicherungswesen 6. Location-based Services mit Bewegungsprofil Schwellenwerte (WP248-Kriterien): - 2 von 9 Kriterien erfüllt: DSFA in der Regel erforderlich - 1 Kriterium: Einzelfallprüfung Quelle: LfDI BW Orientierungshilfe DSFA, Stand 2023 Rechtsgrundlage: Art. 35 DSGVO i.V.m. § 67 BDSG EOF cat > "$DOWNLOAD_DIR/nrw_dsfa_anforderungen.txt" << 'EOF' DSFA Muss-Liste - Landesbeauftragte für Datenschutz und Informationsfreiheit NRW (LDI NRW) Pflichtliste gem. Art. 35 Abs. 4 DSGVO für den öffentlichen Bereich NRW: 1. Verarbeitung von Sozialdaten - Jobcenter und Sozialämter: Leistungsgewährung, Sachverhaltsermittlung - Jugendhilfeverwaltung mit sensitiven Daten 2. Videoüberwachung - Öffentliche Gebäude und Plätze mit dauerhafter Aufzeichnung - Automatische Kennzeichenerfassung 3. Automatisierte Einzelentscheidungen - Verwaltungsakte auf Basis von Algorithmen - KI-gestützte Risikoanalysen in der Verwaltung 4. Biometrische und genetische Daten - Verarbeitung zur Identifizierung in öffentlichen Bereichen 5. Gesundheitsdaten - Umfangreiche Verarbeitung in Gesundheitsämtern - Elektronische Patientenakten kommunaler Träger Nicht-öffentlicher Bereich (Orientierung): - Kreditwürdigkeit und Zuverlässigkeit - Umfangreiche Tracking-Systeme - Personalverwaltungs-Scoring Quelle: LDI NRW Orientierungshilfe, Positionspapier zur DSFA EOF cat > "$DOWNLOAD_DIR/by_dsfa_anforderungen.txt" << 'EOF' DSFA Muss-Liste - Bayerisches Landesamt für Datenschutzaufsicht (LDA Bayern) Zuständig für nicht-öffentliche Stellen in Bayern Verarbeitungen für die eine DSFA erforderlich ist: 1. Scoring und Rating - SCHUFA-ähnliche Bonitätsbewertungen - Scoring für Versicherungstarife - Mitarbeiter-Scoring und -bewertung 2. Targeting und Profiling - Verhaltensbasierte Werbung in großem Umfang - Psychographisches Profiling - Cross-Device Tracking 3. Besondere Datenkategorien (Art. 9 DSGVO) - Gesundheits-Apps mit sensitiven Daten - Biometrische Zugangssysteme - Religiöse und politische Zugehörigkeit 4. Innovative Technologien - Smarte Geräte im Consumer-Bereich mit Verhaltensdaten - AR/VR-Anwendungen mit Körperdaten - Generative KI mit Nutzerdaten 5. Automatisierte Entscheidungen - Kredit- und Versicherungsentscheidungen ohne menschliche Beteiligung - KI-gestützte Personalauswahl Quelle: LDA Bayern - Orientierungshilfe DSFA, Prüfliste für Unternehmen EOF cat > "$DOWNLOAD_DIR/dsfa_wpk248_kriterien.txt" << 'EOF' WP248 rev.01 - Leitlinien zur Datenschutz-Folgenabschätzung (DSFA) Working Party 29 / EDPB 9 Risikokriterien (K1-K9): K1 - Evaluation oder Scoring Einschätzung oder Bewertung von Personen einschließlich Profiling und Vorhersagen. Beispiele: Bonitätsbewertung, Gesundheitsrisiko, KI-Scoring, Personalbeurteilung K2 - Automatisierte Entscheidungsfindung mit Rechtswirkung Verarbeitung, die zu Entscheidungen führt, die Auswirkungen auf Personen haben. Art. 22 DSGVO relevant. Beispiele: Kredit, Versicherung, automatisierte Verwaltungsakte K3 - Systematische Überwachung Verarbeitung zur Beobachtung, Überwachung oder Kontrolle von betroffenen Personen. Beispiele: Videoüberwachung, IoT-Geräte, Mitarbeiterüberwachung K4 - Sensible Daten oder Daten höchstpersönlichen Charakters Art. 9 und 10 DSGVO: Gesundheit, Biometrie, Genetik, Religion, Strafverfolgung K5 - Datenverarbeitung in großem Umfang Mengenmäßig oder qualitativ umfangreiche Verarbeitung. Faktoren: Zahl der Betroffenen, Datenmenge, Dauer, geografische Ausdehnung K6 - Abgleich oder Zusammenführung von Datensätzen Kombination aus zwei oder mehr Verarbeitungsvorgängen/Quellen. Beispiele: Data Warehouses, 360°-Kundenprofile K7 - Daten über schutzbedürftige Personen Kinder, Ältere, Patienten, Asylsuchende, psychisch Kranke. Besonderes Machtungleichgewicht. K8 - Innovative Nutzung oder Anwendung neuer technologischer oder organisatorischer Lösungen Neue Technologien mit unbekannten Risiken: KI, AR/VR, IoT, Blockchain K9 - Wenn die Verarbeitung selbst die betroffenen Personen an der Ausübung eines Rechts oder der Nutzung einer Dienstleistung bzw. Durchführung eines Vertrags hindert. Beispiele: Fingerabdruckreader als einzige Zutrittsmöglichkeit Empfehlung: Bei >= 2 Kriterien ist DSFA in der Regel erforderlich. Quelle: Article 29 Working Party, Guidelines on Data Protection Impact Assessment (DPIA) WP248 rev.01 (04/2017, revised 10/2017), endorsed by EDPB EOF ok "Text-Zusammenfassungen erstellt in $DOWNLOAD_DIR" } # ============================================================================= # Phase 3: Dokument-Ingest in RAG-Corpus # ============================================================================= ingest_document() { local file="$1" local regulation_id="$2" local state="$3" local authority="$4" local category="${5:-muss_liste}" if [[ ! -f "$file" ]]; then warn "Datei nicht gefunden: $file – überspringe" return fi local filename filename=$(basename "$file") local ext="${filename##*.}" local mime_type="text/plain" if [[ "$ext" == "pdf" ]]; then mime_type="application/pdf" fi log "Ingestiere: $filename → $COLLECTION" local response response=$(curl -sk -X POST "${RAG_URL}/api/v1/documents/upload" \ -H "X-Tenant-ID: default" \ -F "file=@${file};type=${mime_type}" \ -F "collection=${COLLECTION}" \ -F "data_type=compliance" \ -F "use_case=legal_reference" \ -F "metadata={\"regulation_id\":\"${regulation_id}\",\"state\":\"${state}\",\"category\":\"${category}\",\"authority\":\"${authority}\",\"license\":\"public_law\",\"source\":\"authority_publication\"}" \ --connect-timeout 30 \ -w "\n%{http_code}" 2>&1 || echo "CONNECTION_ERROR") local http_code http_code=$(echo "$response" | tail -1) if [[ "$http_code" == "200" || "$http_code" == "201" ]]; then ok "Ingestiert: $filename (HTTP $http_code)" else warn "HTTP $http_code bei $filename – RAG-Service erreichbar?" fi } # ============================================================================= # Phase 4: Alle Dateien ingestieren # ============================================================================= ingest_all() { log "Starte Ingest in Corpus: $COLLECTION" log "RAG-URL: $RAG_URL" # WP248-Dokument (für alle Bundesländer relevant — kein PDF verfügbar) ingest_document \ "$DOWNLOAD_DIR/dsfa_wpk248_kriterien.txt" \ "wp248_rev01" "EU" "Article 29 Working Party / EDPB" "leitlinie" # BfDI — PDF bevorzugen, Text als Fallback local bfdi_pdf bfdi_pdf=$(find_pdf_for_state "bfdi") if [[ -n "$bfdi_pdf" ]]; then ingest_document "$bfdi_pdf" "muss_liste_bfdi" "Bund" "BfDI" "muss_liste" else ingest_document "$DOWNLOAD_DIR/bfdi_muss_liste.txt" "muss_liste_bfdi" "Bund" "BfDI" "muss_liste" fi # Baden-Württemberg — PDF bevorzugen, Text als Fallback local bw_pdf bw_pdf=$(find_pdf_for_state "bw") if [[ -n "$bw_pdf" ]]; then ingest_document "$bw_pdf" "muss_liste_bw" "Baden-Württemberg" "LfDI BW" "muss_liste" else ingest_document "$DOWNLOAD_DIR/bw_dsfa_anforderungen.txt" "muss_liste_bw" "Baden-Württemberg" "LfDI BW" "muss_liste" fi # Bayern — kein direktes PDF bekannt, Text ingest_document \ "$DOWNLOAD_DIR/by_dsfa_anforderungen.txt" \ "muss_liste_by" "Bayern" "LDA Bayern" "muss_liste" # NRW — kein direktes PDF bekannt, Text ingest_document \ "$DOWNLOAD_DIR/nrw_dsfa_anforderungen.txt" \ "muss_liste_nw" "Nordrhein-Westfalen" "LDI NRW" "muss_liste" # Weitere Bundesländer — PDF bevorzugen, Text als Fallback for state_id in be bb hb hh he mv ni rp sl sn st sh th; do local txt_file="$DOWNLOAD_DIR/${state_id}_dsfa_anforderungen.txt" if [[ ! -f "$txt_file" ]]; then # Generische Zusammenfassung erstellen cat > "$txt_file" << EOF DSFA Anforderungen - ${STATE_NAMES[$state_id]:-$state_id} Behörde: ${AUTHORITY_LABELS[$state_id]:-Aufsichtsbehörde $state_id} Gemäß Art. 35 DSGVO und den Orientierungshilfen der Datenschutzkonferenz (DSK) ist für folgende Verarbeitungsvorgänge in ${STATE_NAMES[$state_id]:-$state_id} eine Datenschutz-Folgenabschätzung durchzuführen: Bundesweit geltende Pflichten: - Verarbeitung besonderer Kategorien (Art. 9 DSGVO) in großem Umfang - Systematische Überwachung öffentlich zugänglicher Bereiche - Automatisierte Entscheidungen mit Rechtswirkung (Art. 22 DSGVO) - Neue Technologien mit unbekannten Risiken - Profiling in großem Umfang Für länderspezifische Listen besuchen Sie bitte die Website der Behörde. Quelle: DSK-Positionspapier, WP248, Art. 35 Abs. 4 DSGVO EOF fi # PDF bevorzugen, Text als Fallback local state_pdf state_pdf=$(find_pdf_for_state "$state_id") if [[ -n "$state_pdf" ]]; then ingest_document \ "$state_pdf" \ "muss_liste_${state_id}" \ "${STATE_NAMES[$state_id]:-$state_id}" \ "${AUTHORITY_LABELS[$state_id]:-Datenschutzbehörde $state_id}" \ "muss_liste" else ingest_document \ "$txt_file" \ "muss_liste_${state_id}" \ "${STATE_NAMES[$state_id]:-$state_id}" \ "${AUTHORITY_LABELS[$state_id]:-Datenschutzbehörde $state_id}" \ "muss_liste" fi done log "Ingest abgeschlossen" } # ============================================================================= # Phase 5: Verifikation # ============================================================================= verify_corpus() { log "Verifiziere Corpus $COLLECTION..." local response response=$(curl -sk -X POST "${RAG_URL}/api/v1/search" \ -H "Content-Type: application/json" \ -H "X-Tenant-ID: default" \ -d "{\"query\":\"DSFA Muss-Liste Bundesland\",\"collection\":\"${COLLECTION}\",\"limit\":3}" \ --connect-timeout 15 2>&1 || echo "CONNECTION_ERROR") if echo "$response" | grep -q "results"; then local count count=$(echo "$response" | grep -o '"total_results":[0-9]*' | grep -o '[0-9]*' || echo "?") ok "Corpus $COLLECTION erreichbar – $count Ergebnisse für Testsuche" else warn "Konnte Corpus nicht verifizieren. Response: ${response:0:200}" fi } # ============================================================================= # Main # ============================================================================= main() { log "=== DSFA Bundesland RAG-Ingest ===" log "Collection: $COLLECTION" log "Download-Dir: $DOWNLOAD_DIR" log "Skip-Download: $SKIP_DOWNLOAD" # Schritt 1: Text-Zusammenfassungen erstellen (immer als Fallback) create_text_summaries # Schritt 2: PDFs herunterladen (wenn nicht --skip-download oder --only-text) if [[ "$SKIP_DOWNLOAD" == false && "$ONLY_TEXT" == false ]]; then download_pdfs else log "PDF-Downloads übersprungen (--skip-download oder --only-text gesetzt)" fi # Schritt 3: Ingest (PDF bevorzugt, Text als Fallback) ingest_all # Schritt 4: Verifikation verify_corpus log "=== Fertig ===" log "Corpus: $COLLECTION" log "Um zu suchen: curl -sk -X POST '${RAG_URL}/api/v1/search' -H 'Content-Type: application/json' -d '{\"query\":\"DSFA\",\"collection\":\"${COLLECTION}\",\"limit\":5}'" } main "$@"