Übersicht
Der Slack-Konnektor bietet die Funktionalität, Channel-Nachrichten aus Slack-Workspaces abzurufen und im Fess-Index zu registrieren.
Für diese Funktion ist das Plugin fess-ds-slack erforderlich.
Unterstützte Inhalte
Nachrichten in öffentlichen Kanälen
Nachrichten in privaten Kanälen
Antwortnachrichten in Threads (abgerufen über
conversations.replies)Dateianhänge (optional)
Folgendes ist nicht enthalten:
Systemereignis-Nachrichten (
channel_join,channel_topic,pinned_itemusw.) werden standardmäßig von der Indexierung ausgeschlossen (ignore_system_events)Direktnachrichten (DMs) und Gruppen-DMs
Huddle-Transkripte und Clips (Slack bietet hierfür keine öffentliche API, daher können sie nicht gecrawlt werden)
Voraussetzungen
Die Installation des Plugins ist erforderlich
Eine Slack-App muss erstellt und Berechtigungen konfiguriert werden
Ein OAuth Access Token muss abgerufen werden
Plugin-Installation
Installieren Sie über die Administrationsoberfläche unter „System“ -> „Plugins“:
Laden Sie
fess-ds-slack-X.X.X.jarvon Maven Central herunterLaden Sie es über die Plugin-Verwaltungsoberfläche hoch und installieren Sie es
Starten Sie Fess neu
Oder weitere Details finden Sie unter Plug-ins.
Konfiguration
Konfigurieren Sie über die Administrationsoberfläche unter „Crawler“ -> „Datenspeicher“ -> „Neu erstellen“.
Grundeinstellungen
| Einstellung | Beispielwert |
|---|---|
| Name | Company Slack |
| Handler-Name | SlackDataStore |
| Aktiviert | Ein |
Parameter-Einstellungen
Parameterliste
| Parameter | Erforderlich | Beschreibung |
|---|---|---|
token | Ja | OAuth Access Token der Slack-App |
channels | Nein | Zu crawlende Kanäle (kommagetrennt oder *all). Wenn nicht angegeben, werden alle Kanäle abgerufen (gleiches Verhalten wie *all) |
file_crawl | Nein | Auch Dateien crawlen (Standard: false) |
include_private | Nein | Private Kanäle einschließen (Standard: false) |
number_of_threads | Nein | Anzahl der parallelen Verarbeitungs-Threads (Standard: 1) |
max_filesize | Nein | Maximale Dateigröße in Bytes (Standard: 10000000) |
ignore_error | Nein | Verarbeitung bei Fehler fortsetzen (Standard: true) |
supported_mimetypes | Nein | Regex für erlaubte MIME-Typen (Standard: .*) |
include_pattern | Nein | Regex-Muster für einzuschließende URLs |
exclude_pattern | Nein | Regex-Muster für auszuschließende URLs |
proxy_host | Nein | HTTP-Proxy-Host |
proxy_port | Nein | HTTP-Proxy-Port (erforderlich, wenn proxy_host angegeben) |
file_types | Nein | Dateitypfilter für die Slack-API (Standard: all) |
channel_count | Nein | Anzahl der Kanäle pro API-Seite (Standard: 100) |
message_count | Nein | Anzahl der Nachrichten pro API-Seite (Standard: 100) |
file_count | Nein | Anzahl der Dateien pro API-Seite (Standard: 20) |
user_count | Nein | Anzahl der Benutzer pro API-Seite (Standard: 100) |
user_cache_size | Nein | Maximale Anzahl von Einträgen im Benutzerinformations-Cache (Standard: 10000) |
bot_cache_size | Nein | Maximale Anzahl von Einträgen im Bot-Informations-Cache (Standard: 10000) |
channel_cache_size | Nein | Maximale Anzahl von Einträgen im Kanal-Informations-Cache (Standard: 10000) |
Erweiterte Parameter
Die folgenden Parameter steuern das Verbindungs- und Wiederholungsverhalten, die feingranulare Steuerung des Crawling-Umfangs sowie die Berechtigungssynchronisierung:
| Parameter | Beschreibung |
|---|---|
connection_timeout | Verbindungstimeout für jede Slack-API-Anfrage (Millisekunden, Standard: 20000) |
read_timeout | Lesetimeout für jede Slack-API-Anfrage (Millisekunden, Standard: 20000) |
max_retry_count | Maximale Anzahl an Wiederholungsversuchen nach einer 429-Antwort (Rate Limit) oder einer 5xx-Antwort (Standard: 3) |
retry_interval | Wartezeit in Millisekunden bis zum ersten Wiederholungsversuch, wenn die Antwort keinen Retry-After-Header enthält (Standard: 3000). Verdoppelt sich mit jedem weiteren Versuch, gedeckelt bei 60000 Millisekunden. Enthält die Antwort einen Retry-After-Header, wird stattdessen dessen Wert (in Sekunden) verwendet |
executor_timeout | Wartezeit in Sekunden am Ende eines Crawls, bis in der Warteschlange verbleibende Aufgaben abgeschlossen sind, bevor der Abbruch erzwungen wird (Standard: 60) |
exclude_archived | Gibt an, ob archivierte Kanäle aus den Ergebnissen von conversations.list ausgeschlossen werden (Standard: false). Bei true kann ein in channels per Name angegebener archivierter Kanal nicht mehr aufgelöst werden (Details siehe Fehlerbehebung) |
ignore_system_events | Gibt an, ob von Slack automatisch erzeugte Kanalverwaltungsnachrichten (channel_join, channel_topic, pinned_item usw.) von der Indexierung ausgeschlossen werden (Standard: true) |
read_interval | Wartezeit in Millisekunden nach der Verarbeitung jeder Nachricht oder Datei (Standard: 0 = keine Wartezeit). Damit lässt sich das Crawling bei einem Workspace mit strengem Rate Limit verlangsamen |
max_content_length | Maximale Anzahl an Zeichen, die die Inhaltsextraktion (Tika) aus einer Datei extrahieren darf (Standard: nicht gesetzt, es gilt dann das MIME-Typ-spezifische Limit von Fess). max_filesize ist das übertragungsseitige Limit, das Dateien anhand ihrer Größe bereits vor dem Download ablehnt, während max_content_length das extraktionsseitige Limit für die nach dem Download extrahierte Textmenge ist; beide wirken unabhängig voneinander. Ein kleineres max_filesize ersetzt max_content_length nicht (z. B. kann ein 1-MB-Archiv nach der Extraktion in weit mehr Text resultieren) |
permission_sync | Gibt an, ob die Mitgliedschaft in privaten Kanälen in Suchberechtigungen (Rollen) umgewandelt wird (Standard: false). Details siehe Abschnitt „Berechtigungssynchronisierung (ACL)“ weiter unten |
default_permissions | Zusätzliche Berechtigungen, die unabhängig von der Kanalmitgliedschaft allen indexierten Dokumenten zugewiesen werden (Format {user}/{group}/{role}, kommagetrennt, Standard: leer). Wird nur angewendet, wenn permission_sync aktiviert ist |
Bemerkung
ignore_system_events hat den Standardwert true. Selbst eine bestehende Crawl-Konfiguration, die diesen Parameter nicht setzt, indexiert nach einem Upgrade von Fess keine Systemereignis-Nachrichten wie channel_join mehr – die Anzahl indexierter Dokumente sinkt ohne Fehler oder Warnung. Setzen Sie ignore_system_events=false explizit, um diese Nachrichten wie bisher zu indexieren.
Skript-Einstellungen
Verfügbare Felder
| Feld | Beschreibung |
|---|---|
message.title | Titel (leerer String für Nachrichten, Dateiname und Titel für Dateieinträge) |
message.text | Textinhalt der Nachricht (bei Dateieinträgen: Dateiname und der extrahierte Dateiinhalt) |
message.user | Anzeigename des Nachrichtenabsenders (falls nicht gesetzt, wird in der Reihenfolge echter Name, Benutzername, dann Benutzer-ID aufgelöst) |
message.channel | Kanalname, in dem die Nachricht gesendet wurde |
message.timestamp | Sendezeitpunkt der Nachricht |
message.permalink | Permalink der Nachricht |
message.attachments | Fallback-Informationen zu Dateianhängen |
message.roles | Liste der Suchberechtigungen (Rollen), die diese Nachricht oder Datei sehen dürfen. Nur vorhanden, wenn permission_sync=true. Wird im Skript nicht role=message.roles zugewiesen, werden die berechneten Rollen nie in das indexierte Dokument übernommen |
Slack-App konfigurieren
1. Slack-App erstellen
Besuchen Sie https://api.slack.com/apps:
Klicken Sie auf „Create New App“
Wählen Sie „From scratch“
Geben Sie den App-Namen ein (z.B.: Fess Crawler)
Wählen Sie den Workspace
Klicken Sie auf „Create App“
2. OAuth & Permissions konfigurieren
Im Menü „OAuth & Permissions“:
Fügen Sie zu den Bot Token Scopes hinzu:
Basis-Scopes (immer erforderlich):
channels:history- Lesen von Nachrichten in öffentlichen Kanälenchannels:read- Lesen von Informationen zu öffentlichen Kanälenusers:read- Lesen von Benutzerinformationen (erforderlich für die Auflösung von Anzeigenamen)team:read- Lesen von Workspace-Informationen.team.infowird bei jedem Crawl aufgerufen, daher ist dieser Scope erforderlich; ohne ihn weicht dieser Konnektor für jede Nachricht auf einen zusätzlichenchat.getPermalink-Aufruf aus, was die Anzahl der API-Aufrufe deutlich erhöht
Bei zusätzlicher Einbeziehung privater Kanäle (include_private=true):
groups:history- Lesen von Nachrichten in privaten Kanälengroups:read- Lesen von Informationen zu privaten Kanälen
Beim zusätzlichen Crawlen von Dateien (file_crawl=true):
files:read- Lesen von Dateiinhalten
Bei zusätzlicher Synchronisierung von Berechtigungen privater Kanäle (permission_sync=true):
users:read.email- Lesen der E-Mail-Adressen von Mitgliedern (erforderlich für die Berechtigungssynchronisierung)
3. App installieren
Im Menü „Install App“:
Klicken Sie auf „Install to Workspace“
Überprüfen Sie die Berechtigungen und klicken Sie auf „Zulassen“
Kopieren Sie das „Bot User OAuth Token“ (beginnt mit
xoxb-)
Bemerkung
Normalerweise wird das Bot User OAuth Token verwendet, das mit xoxb- beginnt, aber in den Parametern kann auch das User OAuth Token verwendet werden, das mit xoxp- beginnt.
4. Zu Kanälen hinzufügen
Fügen Sie die App zu den zu crawlenden Kanälen hinzu:
Öffnen Sie den Kanal in Slack
Klicken Sie auf den Kanalnamen
Wählen Sie den Tab „Integrationen“
Klicken Sie auf „App hinzufügen“
Fügen Sie die erstellte App hinzu
Berechtigungssynchronisierung (ACL)
Der Slack-Konnektor kann die Mitgliedschaft eines privaten Kanals in Fess-Suchberechtigungen (Rollen) umwandeln, sodass nur die Mitglieder dieses Kanals dessen Inhalt durchsuchen können. Diese Funktion ist standardmäßig deaktiviert.
Bemerkung
permission_sync berechnet Rollen lediglich; es wendet sie nicht automatisch an. Erst wenn Sie im Skript role=message.roles ergänzen, werden die berechneten Rollen in den indexierten Dokumenten übernommen. Wird diese Zuordnung vergessen, entstehen dennoch die zusätzlichen API-Aufrufe und übersprungenen privaten Kanäle, die permission_sync=true verursacht – ohne dass irgendeine Zugriffskontrolle stattfindet.
Aktivierung
Fügen Sie der Slack-App den Scope
users:read.emailhinzu (erforderlich zur Auflösung der E-Mail-Adressen der Mitglieder)Setzen Sie in den Parametern
permission_sync=trueFügen Sie im Skript
role=message.roleshinzu
Parameter:
Skript:
Fail-Closed-Verhalten
Ein privater Kanal wird in einem gegebenen Crawl überhaupt nicht indexiert, wenn einer der folgenden Fälle zutrifft (dies ist ein „Fail-Closed“-Verhalten: das Risiko besteht in einer Unter-Indexierung, niemals darin, Inhalte versehentlich für alle offenzulegen):
Das Abrufen der Mitgliederliste des Kanals ist fehlgeschlagen
Die Mitgliederliste kam leer zurück (dies passiert, wenn der Bot-Benutzer des crawlenden Tokens selbst kein Mitglied des privaten Kanals ist)
Der Kanal hat Mitglieder, aber für keinen von ihnen konnte eine E-Mail-Adresse aufgelöst werden (meist weil der Scope
users:read.emailfehlt)
Öffentliche Kanäle rufen conversations.members niemals auf und gelten stets als für alle sichtbar.
Übereinstimmung des Principal-Namens
Die Berechtigungsprüfung zur Suchzeit verwendet den Fess-Anmeldenamen (den Principal-Namen). Da die von dieser Funktion berechneten Rollen aus Slack-E-Mail-Adressen abgeleitet werden, muss der Fess-Anmeldename mit der Slack-E-Mail-Adresse übereinstimmen. Slack normalisiert E-Mail-Adressen auf Kleinschreibung, halten Sie daher auch die Fess-Anmeldenamen in Kleinschreibung. Eine Abweichung legt nicht die Inhalte eines anderen Benutzers offen – sie führt lediglich dazu, dass die Suchergebnisse des betroffenen Benutzers stets leer sind, was leicht mit einem unabhängigen Fehler verwechselt werden kann.
Weitere Hinweise
Slack-Benutzergruppen (User Groups) werden nicht verwendet; Berechtigungen werden direkt aus der E-Mail-Adresse jedes einzelnen Mitglieds berechnet
Mit
default_permissionskönnen Sie unabhängig von der Kanalmitgliedschaft zusätzliche Berechtigungen für jedes Dokument vergeben (wird nur angewendet, wennpermission_sync=true)Bleibt
permission_sync=false, währendinclude_private=truegesetzt ist, wird der Inhalt privater Kanäle ausschließlich anhand der im Feld „Berechtigung“ der Datenspeicher-Konfiguration hinterlegten Berechtigungen indexiert; bleibt dieses Feld leer, ist der Inhalt de facto für alle öffentlichWird
permission_syncerst nachträglich aktiviert, werden bereits durch einen früheren, uneingeschränkten Crawl indexierte Inhalte nicht rückwirkend abgesichert. Um Rollen auf diese Inhalte anzuwenden, setzen Siepermission_sync=trueundrole=message.rolesund crawlen Sie danach erneut. Ebenso entfernt eine spätere Deaktivierung vonpermission_synckeine Rollen, die bereits auf zuvor indexierte Dokumente angewendet wurden
Anwendungsbeispiele
Bestimmte Kanäle crawlen
Parameter:
Skript:
Alle Kanäle crawlen
Parameter:
Skript:
Private Kanäle einschließen
Parameter:
Skript:
Mit Dateien crawlen
Parameter:
Skript:
Detaillierte Nachrichteninformationen einschließen
Skript:
Mit Berechtigungssynchronisierung crawlen
Beschränkt den Inhalt privater Kanäle so, dass nur die Mitglieder dieses Kanals ihn durchsuchen können. Fügen Sie der Slack-App vorher den Scope users:read.email hinzu.
Parameter:
Skript:
Bemerkung
Vergessen Sie role=message.roles, werden die berechneten Rollen nie in den indexierten Dokumenten übernommen. Details siehe „Berechtigungssynchronisierung (ACL)“.
Fehlerbehebung
Funktionsweise der Fehlerbehandlung
Der Slack-Konnektor unterscheidet bei Slack-API-Fehlern drei Arten:
Fatale Fehler(
invalid_auth,token_revoked,account_inactive,missing_scope,not_authed,token_expired): Das Token selbst ist unbrauchbar, daher schlägt der gesamte Crawl-Job fehlVorübergehende Fehler(
ratelimited,internal_error,fatal_error,service_unavailable,request_timeout): Löst sich der Fehler auch durch Wiederholungsversuche nicht, schlägt der gesamte Crawl-Job fehl (zum Wiederholungsverhalten siehe „API-Ratenbegrenzung“ weiter unten)Kanalbezogene Fehler(
channel_not_found,not_in_channelusw.): Nur dieser Kanal wird mit einer Warnung übersprungen, das Crawling der übrigen Kanäle wird fortgesetzt
In früheren Versionen konnte ein fataler Fehler dennoch als „erfolgreicher“ Crawl gemeldet werden, der stillschweigend null oder nur einen Teil der Dokumente indexierte. Diese Dreiteilung stellt nun sicher, dass fatale und vorübergehende Fehler stets als Job-Fehlschlag gemeldet werden.
Authentifizierungsfehler
Symptom: invalid_auth oder not_authed
Zu überprüfen:
Überprüfen Sie, ob das Token korrekt kopiert wurde
Überprüfen Sie das Token-Format:
Bot User OAuth Token: beginnt mit
xoxb-User OAuth Token: beginnt mit
xoxp-
Überprüfen Sie, ob die App im Workspace installiert ist
Überprüfen Sie, ob die erforderlichen Berechtigungen erteilt wurden
Kanal nicht gefunden
Symptom: channel_not_found
Zu überprüfen:
Überprüfen Sie, ob der Kanalname korrekt ist (# ist nicht erforderlich)
Überprüfen Sie, ob die App zum Kanal hinzugefügt wurde
Bei privaten Kanälen
include_private=truesetzenPrüfen Sie, ob
exclude_archived=truegesetzt ist. Standardmäßig (exclude_archived=false) werden auch archivierte Kanäle weiterhin aufgelistet und gecrawlt; nur beitruekann ein inchannelsper Name angegebener archivierter Kanal nicht mehr aufgelöst werden
Nachrichten können nicht abgerufen werden
Symptom: Der Crawl ist erfolgreich, aber es werden nur wenige oder gar keine Dokumente indexiert
Zu überprüfen:
ignore_system_eventshat den Standardwerttrue. Bestehen die Nachrichten eines Kanals ausschließlich aus Systemereignissen wiechannel_join, werden für ihn null Dokumente indexiert (siehe „Erweiterte Parameter“)Prüfen Sie, ob tatsächlich Nachrichten im Kanal vorhanden sind
Prüfen Sie, ob die App zum Kanal hinzugefügt wurde
Bei
permission_sync=truewird ein privater Kanal, dessen Mitgliedschaft nicht aufgelöst werden kann, in diesem Crawl nicht indexiert (Fail-Closed; siehe „Berechtigungssynchronisierung (ACL)“)
Bemerkung
In früheren Versionen konnte ein fehlender Scope (missing_scope) den Crawl dennoch mit null Nachrichten „erfolgreich“ abschließen lassen. Fatale Fehler, einschließlich missing_scope, lassen den gesamten Crawl-Job jetzt fehlschlagen. Schlägt Ihr Job fehl, prüfen Sie stattdessen den folgenden Abschnitt „Fehler wegen fehlender Berechtigungen“.
Fehler wegen fehlender Berechtigungen
Symptom: missing_scope (lässt den gesamten Crawl-Job fehlschlagen)
Lösung:
Fügen Sie die erforderlichen Scopes in den Slack-App-Einstellungen hinzu:
Basis(immer erforderlich):
channels:historychannels:readusers:readteam:read
Private Kanäle:
groups:historygroups:read
Dateien:
files:read
Berechtigungssynchronisierung(
permission_sync=true):users:read.email
Installieren Sie die App neu
Starten Sie Fess neu
Dateien werden nicht gecrawlt
Symptom: Dateien werden trotz file_crawl=true nicht abgerufen
Zu überprüfen:
Überprüfen Sie, ob der Scope
files:readerteilt wurdeÜberprüfen Sie, ob tatsächlich Dateien im Kanal gepostet wurden
Überprüfen Sie die Zugriffsberechtigungen für die Dateien
Eine Datei, die größer als
max_filesizeist, wird nicht heruntergeladen (prüfen Sie das Log auf eine Warnung)
API-Ratenbegrenzung
Symptom: ratelimited (lässt den gesamten Crawl-Job fehlschlagen)
Lösung:
Erhöhen Sie
max_retry_countundretry_interval, falls die Standardwerte das Problem nicht lösenSetzen Sie
read_interval, um das Crawling zu verlangsamenReduzieren Sie die Anzahl der Kanäle, oder teilen Sie in mehrere Datenspeicher auf und verteilen Sie die Zeitpläne
Ein ratelimited-Fehler der Slack-API wird automatisch wiederholt: entweder unter Verwendung des Retry-After-Header-Werts in Sekunden, sofern vorhanden, oder andernfalls mit einem exponentiellen Backoff ausgehend von retry_interval (bis zu max_retry_count Versuchen, gedeckelt bei 60 Sekunden). Besteht die Ratenbegrenzung nach Ausschöpfen aller Wiederholungsversuche weiterhin, schlägt der gesamte Crawl-Job fehl.
Slack-API-Tiers (Obergrenzen für die Aufrufhäufigkeit):
Tier 1: 1+ Anfragen/Minute
Tier 2: 20+ Anfragen/Minute –
conversations.list,users.list(werden zu Beginn jedes Crawls bedingungslos vollständig abgerufen, wodurch dieser Tier am ehesten ausgeschöpft wird)Tier 3: 50+ Anfragen/Minute –
conversations.history,conversations.replies,files.listTier 4: 100+ Anfragen/Minute –
conversations.members(nur beipermission_sync=true),files.info(wird vom Crawling dieses Konnektors derzeit nicht aufgerufen)
Bemerkung
Die Verschärfung der Slack-Ratenbegrenzung vom 29. Mai 2025 (Begrenzung von conversations.history und conversations.replies auf 50+ Anfragen/Minute) gilt nur für Apps, die außerhalb des Workspace verteilt werden, der sie erstellt hat, etwa über den Slack Marketplace. Sie gilt nicht für eine interne, für Fess erstellte App, die nur in dem Workspace installiert ist, der sie erstellt hat.
Bei großen Nachrichtenmengen
Symptom: Crawling dauert lange oder Timeout
Lösung:
Teilen Sie Kanäle auf und konfigurieren Sie mehrere Datenspeicher
Verteilen Sie die Crawl-Zeitplanung
Erweiterte Skript-Beispiele
Nachrichten formatieren
Zusammenfassung langer Nachrichten:
Kanalnamen formatieren:
Weiterführende Informationen
Übersicht der Datenspeicher-Konnektoren - Übersicht der Datenspeicher-Konnektoren
Atlassian-Konnektor - Atlassian-Konnektor
Datenspeicher-Crawl - Leitfaden zur Datenspeicher-Konfiguration
Konfiguration rollenbasierter Suche - Leitfaden zur rollenbasierten Suchkonfiguration