Управление файловым сервером
Коннектор содержимого filesystem (olivares.fs-content) превращает дерево
каталогов — локальный путь, экспорт NFS или mount SMB — в управляемые документы
знаний. Они проходят тот же pipeline, что и любой другой источник содержимого
(redact → classify → chunk → embed → index → предоставление через MCP), причём
ACL документов отображаются из владения POSIX, а классификация — из xattr. Это
источник содержимого, отличный от sink журналов filelog (который
передаёт журналы наружу).
Для оператора self-hosted файловый сервер часто является старейшим и крупнейшим хранилищем документов, поэтому это один из самых ценных коннекторов каталога.
Безопасность чтения по конструкции
Заголовок раздела «Безопасность чтения по конструкции»Коннектор читает данные, ограниченные настроенным корнем, что гарантируется
os.Root из стандартной библиотеки Go:
- Символическая ссылка за пределы корня, абсолютный путь или обход через
..отклоняются: коннектор физически не может прочитать файл, на который вы его не направили. - При обходе символические ссылки не переходятся (они подсчитываются, но никогда не разрешаются).
- Тело каждого файла ограничено по размеру (более крупные файлы обрезаются и помечаются), читаются только текстовые типы/типы документов (бинарные файлы пропускаются и подсчитываются), содержимое никогда не исполняется, а обход ограничен бюджетами количества файлов и общего числа байтов, поэтому не может исчерпать большой или медленный mount NFS.
Состязательные тесты доказывают отказ от выхода через symlink и обхода пути.
Укажите дерево
Заголовок раздела «Укажите дерево»// OLIVARES_SOURCES_CONFIG — document sources live under "documents"{ "documents": [ { "name": "file-server", "kind": "filesystem", "config": { "root": "/mnt/fileserver/shared", // local path or an NFS/SMB mount "include": "*.md,*.txt,docs/*", // globs (path or basename); empty = all text "exclude": "**/archive/*,*.tmp", "max_file_bytes": "1048576", // per-file cap (hard-capped at 1 MiB) "max_files": "100000", // walk budget "max_total_bytes": "1073741824", // read budget "text_only": "true", // skip binaries (counted) "map_posix_acl": "true", // owner/group + POSIX.1e ACL → Document ACL "classification": "internal", // default label (an xattr overrides per file) "classification_xattr": "user.classification", "labels_xattr": "user.olivares.labels" } } ]}Каждый файл становится Document: телом служит содержимое файла, DocID — путь
относительно корня, а атрибуты происхождения содержат owner, group, mode,
size, world_readable и path.
Отображение владения и ACL — честная матрица
Заголовок раздела «Отображение владения и ACL — честная матрица»Коннектор отображает только то, что выражает файловая система, и объявляет то, что отобразить не может:
| Файловая система | owner / group / mode | ACL POSIX.1e (getfacl) | ACL Windows / NFSv4 |
|---|---|---|---|
| Локальная (ext4/xfs/btrfs) | Отображаются: owner → user:<name>, group (если группе разрешено чтение) → group:<name> | Отображается: каждая именованная запись пользователя/группы с битом чтения → ссылка на принципала | не применимо |
| NFS | Отображается, если uid/gid согласованно сопоставлены (idmapd / один и тот же каталог с обеих сторон) | Отображается, когда mount предоставляет system.posix_acl_access | Нативные ACL NFSv4 НЕ разбираются (заявленное ограничение) |
| SMB / CIFS | Отображается из uid=/gid=/file_mode= mount, то есть его параметров, а не реального владельца Windows | Обычно отсутствует | Дескрипторы безопасности Windows НЕ разбираются (system.cifs_acl — бинарный SD; заявленное ограничение) |
Имена принципалов разрешаются службой имён хоста (она может включать LDAP,
чтобы uid→имя пользователя совпадало с вашим каталогом). Если uid/gid не
разрешается, используется его числовой id. Файл, для которого невозможно
вывести ACL, наследует ACL базы знаний по умолчанию, и она по-прежнему
применяется при извлечении. Коннектор никогда не выдумывает ACL, которой нет
у файла.
Классификация
Заголовок раздела «Классификация»classificationпо умолчанию применяется к каждому файлу.- xattr отдельного файла (по умолчанию
user.classification) её переопределяет. - xattr внешних меток (
user.olivares.labels, значения через запятую) добавляет метки чувствительности для DLP извлечения; они применяются deny-closed вместе с классификацией.
Честные ограничения
Заголовок раздела «Честные ограничения»- Только текстовые файлы/документы. Бинарные файлы пропускаются и подсчитываются. Богатые форматы, требующие извлечения (PDF/DOCX), этот коннектор не загружает (это заявленная последующая работа, а не молчаливый пропуск).
- Тело ограничено 1 МиБ; более крупные файлы обрезаются и получают метку
truncated. - SMB: коннектор видит синтетическое POSIX-представление вашего mount, а не настоящую ACL Windows.
- Коннектор читает, но никогда не пишет в дерево (путь записи отсутствует по конструкции).
Доказательство на реальном соединении
Заголовок раздела «Доказательство на реальном соединении»Гарантии безопасности покрыты состязательными тестами: выход через symlink, обход, ограничение размера, пропуск бинарных файлов, отображение владельца, группы и ACL POSIX, классификация xattr. Полное доказательство на реальном соединении — дерево fixtures за привязкой папки, предоставленное через MCP: сессия Claude Code видит только разрешённое её привязкой и ACL файла, а отказ для поддерева доказан. Это интеграционная задача CI, которая собирает движок.