Интеграция с Seafile
seafile синхронизирует выбранные папки и файлы из библиотеки Seafile в базу знаний. Поддерживает плановый запуск, инкрементальную синхронизацию, докачку с места обрыва и сверку удаления на стороне источника. Совместим с Seafile Community Server 10.0.1 (API v2). Общий процесс синхронизации см. в Синхронизация источников данных.
Учётная запись и API-токен
Используйте учётную запись, которая может входить в Seafile и имеет как минимум права только на чтение целевой библиотеки. Область синхронизации определяется правами этой учётной записи. В качестве учётных данных используется пользовательский API-токен этой учётной записи. Коннектор хранит и использует только токен, не обрабатывает пароль, SSO-авторизацию или библиотечные токены.
На Seafile 10.0.1 в разделе «Персональные настройки» пункт «Web API Auth Token» по умолчанию не отображается — администратор должен включить ENABLE_GET_AUTH_TOKEN_BY_SESSION = True в seahub_settings.py и перезапустить Seahub. Также можно получить токен, вызвав POST /api2/auth-token/ с логином и паролем. Если включена двухфакторная аутентификация, потребуется передать код подтверждения в заголовке X-Seafile-OTP согласно ответу.
Тест подключения в aihelpme.ru вызывает /api2/auth/ping/ для проверки токена. Доступность библиотек и каталогов проверяется только при загрузке дерева ресурсов.
Настройка в базе знаний
- Настройки базы знаний → Источники данных → Создать, выбрать «Seafile».
- Указать адрес Seafile и API-токен, выполнить тест подключения. Адрес может содержать префикс пути развёртывания, например
https://example.com/seafile. - В дереве ресурсов выбрать корень библиотеки, любую папку или отдельный файл. На верхнем уровне отображаются только те библиотеки, к которым у учётной записи есть доступ и которые не зашифрованы. Папки разворачиваются по уровням. Один источник данных может выбирать только одну библиотеку — попытка выбрать вторую будет отклонена.
- Выбрать режим полной/инкрементальной синхронизации, расписание, стратегию разрешения конфликтов и опцию синхронизации удалений. После сохранения сначала выполнить ручную синхронизацию небольшого набора файлов, проверить логи и результаты разбора.
Выбор папки означает рекурсивную синхронизацию — новые файлы и подпапки будут автоматически включаться в следующий раз. Выбор отдельного файла синхронизирует только его. При перекрытии дочерних элементов родительской папкой сохраняется только родительская. В дереве выбора отображаются только те расширения, которые aihelpme.ru поддерживает для импорта (.zip и неподдерживаемые форматы не отображаются и не синхронизируются).
Сеть и SSRF
| Запрос | Цель | Токен в запросе |
|---|---|---|
API (/api2/...) | Указанный адрес Seafile | Да, Authorization: Token ... |
| Загрузка файла | Ссылка fileserver, возвращаемая Seafile (обычно /seafhttp/... на том же домене, либо отдельный домен) | Нет |
Оба типа адресов проходят проверку SSRF. Если Seafile развёрнут во внутренней сети или использует отдельный домен fileserver, необходимо добавить соответствующий хост в SSRF_WHITELIST в .env. Иначе при сохранении учётных данных может появиться ошибка base_url SSRF validation failed, а в логах синхронизации — seafile_ssrf_blocked.
Папки, форматы и размеры
Файлы, загруженные в результате синхронизации, помещаются в каталог базы знаний по пути <имя_библиотеки>/<путь_внутри_библиотеки>. Метка источника — «Seafile». Имя библиотеки фиксируется при первой синхронизации и не меняется при переименовании в Seafile — это не приведёт к повторной загрузке. Имена папок и файлов нормализуются с удалением недопустимых символов.
Диапазон поддерживаемых форматов совпадает с загрузкой файлов в базу знаний (PDF, Office, Markdown, HTML, распространённые изображения, аудио и др.), он определяется в internal/utils/import_filetypes.go. Для изображений требуется настроить VLM в базе знаний, для аудио — ASR. Если конфигурация отсутствует, запись будет помечена в журнале синхронизации как неуспешно загруженная, другие файлы при этом продолжат обработку.
Максимальный размер одного файла ограничен MAX_FILE_SIZE_MB (по умолчанию 50 МБ). Файлы, превышающие лимит, в списке каталогов сразу помечаются как seafile_file_too_large и не скачиваются; если при скачивании фактический размер превысит лимит — загрузка также отклоняется (без обрезки). При увеличении этого значения необходимо одновременно увеличить DOCREADER_GRPC_MAX_FILE_SIZE_MB в DocReader, перезапустить app, docreader и frontend — иначе файл может быть скачан, но отклонён на этапе разбора через gRPC.
Поведение синхронизации
Для каждого файла формируется отпечаток (fingerprint) из «ID объекта + время изменения + размер» и сохраняется в курсоре. Если все три значения совпадают — скачивание пропускается. При изменении отпечатка файл скачивается повторно и перезаписывает старую запись (удаление старой с последующим созданием новой; в момент разбора этот документ может быть временно недоступен). В проходе без изменений выполняется только сканирование каталогов, количество запросов равно количеству каталогов.
| Операция на стороне Seafile | Поведение |
|---|---|
| Добавление файла или подпапки | Будет включено при следующей синхронизации |
| Изменение содержимого | Будет скачано повторно и обновлено |
| Удаление файла | Если включена опция «Синхронизировать удаления» — соответствующая запись в БЗ будет удалена. Иначе только курсор освободит ссылку на этот файл |
| Переименование/перемещение | Трактуется как удаление старого пути и создание по новому. При включённой синхронизации удалений старое знание удаляется, новое добавляется как отдельная запись (исторические ссылки не сохраняются автоматически) |
| Переименование библиотеки | Имя библиотеки фиксировано при первой синхронизации — переименование в Seafile не повлияет на каталог в БЗ и не вызовет повторной загрузки |
При ручном повторном запуске синхронизации (force resync) всё содержимое выбранных папок помечается как требующее переоценки отпечатка и повторно скачивается/перерабатывается. Эта операция не удаляет знания, отсутствующие в текущем дереве, если синхронизация удалений не включена. Количество одновременных загрузок файлов ограничено конфигурацией источника данных (параллелизм), чтобы не перегружать Seafile.
