Настройка полнотекстового поиска по документам в TrueNAS SCALE с помощью Apache Tika и Elasticsearch | AdminWiki

Настройка полнотекстового поиска по документам в TrueNAS SCALE с помощью Apache Tika и Elasticsearch

22 августа 2026 7 мин. чтения

Введение: зачем нужен полнотекстовый поиск в TrueNAS SCALE

Корпоративные документы разбросаны по SMB-шарам, и поиск по именам файлов перестаёт работать, когда нужно найти конкретный абзац внутри PDF или DOCX. Системный администратор тратит десятки минут на ручное открытие файлов, а сотрудники простаивают в ожидании нужной информации. Полнотекстовый поиск решает эту проблему: он индексирует содержимое документов и возвращает результаты за секунды.

В этом руководстве мы развернём связку Apache Tika и Elasticsearch в Docker-контейнерах на TrueNAS SCALE. Tika извлечёт текст из файлов разных форматов, Elasticsearch проиндексирует его и обеспечит быстрый поиск. Настроим интеграцию с SMB-шарами, разграничим права доступа через пользовательские учётные записи и проверим работу системы тестовыми запросами. Инструкция ориентирована на практикующих специалистов: все шаги проверены на актуальной версии TrueNAS SCALE 2026 года.

Для базовой настройки сетевого доступа к файлам рекомендую предварительно изучить руководство по настройке SMB, NFS и FTP в TrueNAS, где разобраны создание ZFS пулов и управление ACL.

Архитектура решения: как работают Apache Tika и Elasticsearch

Схема взаимодействия компонентов проста: файлы хранятся в SMB-шаре TrueNAS, Apache Tika извлекает из них текст, Elasticsearch индексирует полученный текст и обрабатывает поисковые запросы. Оба сервиса запускаются в Docker-контейнерах на самом TrueNAS SCALE, что изолирует их от основной системы и упрощает обновление.

Почему Apache Tika?

Apache Tika - это open-source библиотека для извлечения текста и метаданных из более чем 1000 форматов файлов. Она поддерживает PDF, DOCX, XLSX, PPTX, HTML, TXT и многие другие форматы без установки дополнительных конвертеров. Tika предоставляет REST API, что позволяет использовать её как отдельный сервис в Docker-контейнере. Для нашей задачи это оптимальный выбор: один инструмент покрывает все типы офисных документов, с которыми работает бизнес.

Почему Elasticsearch?

Elasticsearch - распределённый поисковый движок на базе Apache Lucene. Он обеспечивает полнотекстовый поиск с релевантностью, поддержку сложных запросов, масштабирование на несколько узлов и встроенную систему безопасности X-Pack. Для корпоративного хранилища документов критичны два свойства: скорость поиска по миллионам записей и гибкое разграничение доступа на уровне индексов и операций. Elasticsearch закрывает оба требования.

Подготовка TrueNAS SCALE к развертыванию

Перед запуском контейнеров подготовьте среду. Проверьте, что TrueNAS SCALE обновлён до последней стабильной версии: в веб-интерфейсе откройте раздел System Settings → Update. Для работы Docker-контейнеров в SCALE используется встроенный Kubernetes, но для простоты мы будем использовать Docker через CLI. Подключитесь к TrueNAS по SSH с правами root.

Создание dataset для Elasticsearch

Elasticsearch хранит индекс на диске, поэтому нужен отдельный dataset с достаточным объёмом. В веб-интерфейсе TrueNAS перейдите в Storage → Pools, выберите пул и нажмите Add Dataset. Назовите его elasticsearch-data. Установите права: dataset должен быть доступен пользователю, под которым будет работать контейнер. Создайте пользователя elastic с UID 1000 через Accounts → Users и назначьте его владельцем dataset через Edit Permissions.

Настройка SMB-шары с документами

Убедитесь, что SMB-шара с документами создана и доступна. Если вы ещё не настраивали общий доступ, обратитесь к полному руководству по настройке SMB в TrueNAS. Запомните путь к шаре внутри TrueNAS, например /mnt/pool/documents. Этот путь потребуется для настройки индексации. Проверьте, что у пользователя, от имени которого будет работать FSCrawler, есть права на чтение всех файлов в этой директории.

Развертывание Elasticsearch и Apache Tika в Docker

Создайте директорию для конфигурации, например /opt/search-stack, и перейдите в неё. Здесь разместим файл docker-compose.yml с описанием двух сервисов.

Создание docker-compose.yml

version: '3.8'

services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0
    container_name: elasticsearch
    environment:
      - discovery.type=single-node
      - xpack.security.enabled=true
      - ELASTIC_PASSWORD=ChangeMe123!
      - ES_JAVA_OPTS=-Xms1g -Xmx1g
    ports:
      - "9200:9200"
    volumes:
      - /mnt/pool/elasticsearch-data:/usr/share/elasticsearch/data
    restart: unless-stopped

  tika:
    image: apache/tika:2.9.1.0-full
    container_name: tika
    ports:
      - "9998:9998"
    restart: unless-stopped

Параметры Elasticsearch: discovery.type=single-node запускает один узел без кластеризации, xpack.security.enabled=true включает систему безопасности, ELASTIC_PASSWORD задаёт пароль для встроенного пользователя elastic, ES_JAVA_OPTS ограничивает heap-память. Volume монтирует созданный dataset для хранения индекса. Образ Tika с тегом full включает поддержку всех форматов, включая OCR для отсканированных PDF.

Запуск и проверка работоспособности

docker-compose up -d

После запуска проверьте Elasticsearch:

curl -u elastic:ChangeMe123! http://localhost:9200

Ответ должен содержать JSON с информацией о кластере. Проверьте Tika:

curl http://localhost:9998/version

Сервис вернёт номер версии. Если контейнеры не запустились, проверьте логи командой docker logs elasticsearch или docker logs tika.

Настройка индексации документов из SMB-шары

Для автоматической индексации файлов используем FSCrawler - open-source инструмент, который сканирует файловую систему, извлекает текст через Tika и отправляет его в Elasticsearch. FSCrawler работает как отдельный контейнер и поддерживает планирование повторных сканирований.

Использование FSCrawler для интеграции

Создайте директорию для конфигурации FSCrawler:

mkdir -p /opt/search-stack/fscrawler

Создайте файл _settings.json в этой директории:

{
  "name": "documents",
  "fs": {
    "url": "/mnt/pool/documents",
    "update_rate": "15m"
  },
  "elasticsearch": {
    "nodes": [
      {
        "url": "http://elasticsearch:9200",
        "username": "elastic",
        "password": "ChangeMe123!"
      }
    ],
    "index": "documents",
    "bulk_size": 100,
    "flush_interval": "5s"
  },
  "tika": {
    "url": "http://tika:9998"
  }
}

Параметр update_rate задаёт периодичность повторного сканирования - каждые 15 минут FSCrawler будет проверять изменения в директории. Добавьте сервис FSCrawler в docker-compose.yml:

  fscrawler:
    image: dadoonet/fscrawler:latest
    container_name: fscrawler
    volumes:
      - /mnt/pool/documents:/mnt/pool/documents:ro
      - /opt/search-stack/fscrawler:/root/.fscrawler
    depends_on:
      - elasticsearch
      - tika
    restart: unless-stopped

Запустите обновлённый стек и выполните первую индексацию:

docker-compose up -d
docker exec -it fscrawler fscrawler documents

FSCrawler начнёт сканировать SMB-шару, извлекать текст через Tika и отправлять документы в индекс Elasticsearch. Проверить результат можно запросом:

curl -u elastic:ChangeMe123! http://localhost:9200/documents/_count

Ответ покажет количество проиндексированных документов.

Альтернативный вариант: собственный скрипт

Если FSCrawler не подходит, напишите скрипт на Python с библиотеками tika и elasticsearch. Скрипт обходит директорию, для каждого файла вызывает Tika для извлечения текста и отправляет результат в Elasticsearch через bulk API. Запускайте скрипт через cron с нужной периодичностью. Этот подход даёт полный контроль над логикой, но требует больше времени на разработку и поддержку.

Разграничение прав доступа к поиску

Безопасность критична: не все сотрудники должны видеть все документы. Elasticsearch X-Pack позволяет создавать роли с ограничением по индексам и операциям, а затем назначать эти роли пользователям.

Включение безопасности Elasticsearch

Безопасность уже включена через переменную xpack.security.enabled=true в docker-compose.yml. Пароль пользователя elastic задан переменной ELASTIC_PASSWORD. Для продакшена измените пароль на более сложный и храните его в защищённом месте.

Создание ролей и пользователей

Создайте роль с правами только на чтение индекса documents:

curl -u elastic:ChangeMe123! -X POST "http://localhost:9200/_security/role/documents_read" -H 'Content-Type: application/json' -d '{
  "indices": [
    {
      "names": ["documents"],
      "privileges": ["read"]
    }
  ]
}'

Создайте пользователя и назначьте ему эту роль:

curl -u elastic:ChangeMe123! -X POST "http://localhost:9200/_security/user/user1" -H 'Content-Type: application/json' -d '{
  "password": "UserPassword123!",
  "roles": ["documents_read"],
  "full_name": "Пользователь 1"
}'

Проверьте доступ: выполните поисковый запрос от имени нового пользователя. Пользователь user1 сможет искать в индексе documents, но не сможет создавать или удалять документы. Для разных отделов создавайте отдельные индексы и роли, чтобы изолировать доступ к конфиденциальным данным.

Тестирование поиска и устранение неполадок

Пример поискового запроса

Выполните тестовый полнотекстовый поиск:

curl -u user1:UserPassword123! -X GET "http://localhost:9200/documents/_search?q=квартальный_отчёт"

Elasticsearch вернёт JSON с найденными документами, отсортированными по релевантности. Для более сложных запросов используйте Query DSL:

curl -u user1:UserPassword123! -X POST "http://localhost:9200/documents/_search" -H 'Content-Type: application/json' -d '{
  "query": {
    "match": {
      "content": "договор аренды"
    }
  }
}'

Типичные проблемы и их решение

Контейнер Elasticsearch не запускается. Причина часто в нехватке памяти или неправильных правах на dataset. Проверьте логи: docker logs elasticsearch. Убедитесь, что у пользователя elastic есть права на запись в /mnt/pool/elasticsearch-data. Увеличьте лимит памяти через ES_JAVA_OPTS, если heap превышает доступный объём.

FSCrawler не видит файлы. Проверьте, что путь /mnt/pool/documents смонтирован в контейнер FSCrawler и доступен на чтение. Выполните docker exec -it fscrawler ls /mnt/pool/documents для проверки.

Документы не индексируются. Проверьте соединение FSCrawler с Tika: docker exec -it fscrawler curl http://tika:9998/version. Если Tika недоступен, проверьте логи контейнера Tika. Убедитесь, что в _settings.json указаны правильные URL сервисов.

Ошибка аутентификации. Если Elasticsearch возвращает 401, проверьте пароли в _settings.json и в запросах. После изменения пароля перезапустите FSCrawler.

Заключение: итоги и дальнейшие шаги

Вы развернули полнотекстовый поиск по документам в TrueNAS SCALE: Elasticsearch индексирует содержимое файлов из SMB-шары, Apache Tika извлекает текст из разных форматов, FSCrawler автоматизирует индексацию, а роли X-Pack ограничивают доступ пользователей. Система готова к работе в корпоративной среде.

Для развития решения настройте расписание индексации под нагрузку вашей организации, добавьте Kibana для визуализации поисковых запросов и мониторинга кластера. При росте объёма документов масштабируйте Elasticsearch на несколько узлов. Если вы планируете расширять файловое хранилище, изучите тонкую настройку ZFS dataset для производительности и аудит безопасности TrueNAS.

Поделиться:
Сохранить гайд? В закладки браузера