Проблема и контекст
В изолированной корпоративной сети с сотнями тысяч файлов стандартные инструменты поиска неэффективны. Сотрудники тратят часы на ручной перебор каталогов, чтобы найти нужный документ по пути или названию. Облачные решения неприменимы из-за требований безопасности, а серверные поисковые системы требуют инфраструктуры и администрирования.
Типичные условия:
Сотни тысяч файлов в десятках каталогов на сетевом хранилище
Смешанный парк компьютеров: Windows и Linux-дистрибутивы
Нет доступа в интернет, строгие политики безопасности
Отсутствие выделенных ресурсов для администрирования
Суть решения: отказ от серверной архитектуры в пользу одного HTML-файла, содержащего данные, логику и интерфейс.
Архитектурное ядро
Почему один HTML-файл?

Выбор однофайловой модели решает три практические проблемы изолированных сетей:
Безопасность: антивирусное ПО редко блокирует HTML-файлы, в отличие от исполняемых скриптов
Портативность: нет зависимостей, работает в любом современном браузере
Простота распространения: один файл можно скопировать в любую точку сети
Двухэтапная модель работы

Система разделена на два независимых этапа:
Этап А: Фоновая индексация (Python)
Для каждого каталога в конфигурации:
Присвоить уникальный номер
Запомнить короткое имя и путь до каталога
Рекурсивно обойти все файлы внутри каталога
Отфильтровать по расширениям (pdf, docx, xlsx...)
Для каждого подходящего файла:
Вычислить путь относительно корня каталога
Сохранить: [номер_каталога, путь_внутри_каталога]
Упаковать массив + HTML-шаблон + CSS + JS → search.html
Этап Б: Клиентский поиск (JavaScript в браузере)
При загрузке страницы:
Загрузить массив каталогов и массив файлов в память
При вводе запроса:
Привести запрос к нижнему регистру, разбить на слова
Для каждого файла в массиве:
Получить путь внутри каталога
Если все слова содержатся в пути → добавить в результаты
Для каждого результата:
По номеру каталога получить его путь от search.html
Объединить: путь_каталога + путь_файла
Отсортировать и отобразить результаты
Ключевые решения
1. Структура индекса с разделением путей
Индекс строится в два уровня для экономии места:
Массив каталогов: содержит номер, короткое имя и путь от
search.htmlМассив файлов: содержит номер каталога и путь к файлу внутри него
Пример фактической структуры в HTML:
<script>
// Минималистичное хранение без имён полей
const catalogs = [
[1, "Договоры", "Общие/Документы/Договоры"],
[2, "Отчеты", "Финансы/Отчетности"]
];
const files = [
[1, "2024/Январь/договор_123.pdf"],
[2, "Квартальные/отчет_Q1.xlsx"]
];
</script>
Преимущества:
Сокращение размера данных (имена каталогов не дублируются)
Быстрая обработка при поиске
Простота обновления при изменении структуры
2. Алгоритм поиска с реконструкцией полного пути
функция поиск(запрос, каталоги, файлы):
слова = очистить_и_разбить_запрос(запрос)
результаты = []
для каждого файла в файлах:
если все_слова_в_пути(слова, файл.путь):
каталог = найти_каталог_по_id(каталоги, файл.id_каталога)
полный_путь = объединить_пути(каталог.путь, файл.путь)
добавить_в_результаты(результаты, каталог, полный_путь, файл)
отсортировать(результаты)
вернуть результаты
При отображении результатов JavaScript объединяет путь каталога (от search.html) с путем файла (внутри каталога), формируя полный относительный путь, который используется для навигации.
Развёртывание и администрирование

Настройка и поддержка системы выполняется администратором и сводится к минимальным действиям. В специальном каталоге находятся ярлыки для запуска процесса индексации и файл конфигурации config.ini, где задаются пути сканирования и параметры. Для обновления поискового файла администратор запускает скрипт generate_search_page.py, который выполняет полное сканирование указанных сетевых каталогов.

Процесс индексации выполняется в терминале с визуализацией прогресса: отображается текущий обрабатываемый каталог, количество найденных файлов и общее время выполнения. Для объёма в несколько сотен тысяч файлов процесс занимает до часа, но выполняется в фоновом режиме, обычно ночью по расписанию. По завершении в указанной сетевой папке появляется обновлённый файл search.html, готовый к использованию всеми сотрудниками. Таким образом, администрирование системы требует минимального вмешательства — только периодический запуск индексации и при необходимости корректировка конфигурации.

Интерфейс


Интерфейс сознательно минималистичен:
Строка поиска с мгновенными результатами
Счётчик найденных файлов
Список результатов с подсветкой совпадений
Рабочий процесс:
Пользователь открывает
search.htmlс сетевого дискаВводит слова из названия или пути искомого файла
Видит результаты в реальном времени с подсветкой совпадений
Навигация по результатам:
Клик по отображаемому пути → открытие папки в новом окне браузера
Клик по имени файла → открытие (PDF) или скачивание (DOCX, XLSX)


Интерфейс выступает мостом между поисковым запросом и файловой системой, позволяя перейти от поиска к работе с файлом за два клика.
Результаты и ограничения
Фактические результаты работы системы:
Обработано: 566 288 файлов в 47 каталогах
Размер итогового файла: 120 МБ
Время загрузки в браузере: 2-3 секунды
Время поиска: менее 1 секунды
Осознанные ограничения решения:
Только поиск по путям и именам файлов
Содержимое документов не индексируется.Работа в рамках одного сетевого ресурса
Все каталоги сканирования должны быть доступны из места размещенияsearch.html.Обновление данных по расписанию
Новые файлы появляются в поиске только после следующего запуска индексации.
Область эффективного применения:
Изолированные корпоративные сети
Стабильные файловые структуры, где важная информация содержится в путях
Ситуации, когда нет возможности развернуть серверное ПО
Смешанный парк операционных систем
Область неэффективного применения:
Системы, где требуется поиск по содержимому документов
Динамически изменяющиеся файловые хранилища
Сценарии, требующие поиска в реальном времени
Что сделано
Poisk — это рабочее решение конкретной проблемы: навигации по сотням тысяч файлов в изолированной корпоративной сети. Система доказала свою жизнеспособность на реальных данных.
Основные достижения:
Создан полностью автономный инструмент — один HTML-файл содержит всё необходимое для работы
Достигнута высокая производительность — поиск по сотням тысяч записей выполняется за доли секунды
Обеспечена кроссплатформенность — работает на Windows и Linux без дополнительных настроек
Решена проблема разнородности путей — механизм относительных путей работает независимо от способа монтирования сетевых дисков
Минимизированы требования к инфраструктуре — не нужны серверы, базы данных или специальное ПО
Система не претендует на замену полноценных корпоративных поисковых решений, но эффективно закрывает нишу быстрой навигации по файловой структуре в условиях, когда развёртывание серверных систем невозможно или нецелесообразно.
Архитектура Poisk демонстрирует, что для чётко очерченной задачи можно создать простое и эффективное решение, используя возможности современных браузеров как платформы выполнения.
Исходный код и дистрибутив: https://github.com/prog815/poisk
Комментарии (6)

fedokanez
27.01.2026 17:58Если это поиск , возможно подключить эластик серч будет хорошим решением ? Или какой другой микросервис ?

eavprog Автор
27.01.2026 17:58Полностью согласен. У меня диплом в магистратуре был именно на нем.
Но никто сервер мне не даст. И никакой другой микросервис мне не запустить. Я могу лишь выложить файл на общий диск. Потому и выбрал такую стратегию (в HTML файле собрать и базу и обработку).

vasilisc
27.01.2026 17:58Спасибо за наработку, посмотрел-пощупал, но коллегам ранее предложил под MS Windows и Astra Linux portable сборку DocFetcher. Работает исправно и дело своё делает. Рекомендую в закрытых сегментах без доступа в Интернет.

eavprog Автор
27.01.2026 17:58Если бы наши безопсники это в нашей сетке увидели, я бы даже заявление не успел написать...
myshkin_does_it
спасибо за кейс!
как устроен скрипт питона с индексацией с точки зрения разных ОС на нодах? у вас маппинг какой то для линукс, мак, винды в config.ini? или фабрика в коде?
как устроены списки кредов с доступами?
прямо из поиска пользователь получает прямой доступ к файлам на разных хостах с помощью каких-то открывающихся ssh-соединений? или вы просто пути до файлов подсказывает, а дальше пользак сам идет за файлом?
есть какие то ограничения с точки зрения ИБ кому что можно искать и что можно так идексировать?
eavprog Автор
Спасибо!
Все намного проще. У меня обычная пользовательская машина в сети как у всех остальных пользователей.
В сентябре нас всех стали переводить на АстраЛинукс. А там в отличии от Windows есть предустановленный Python. Решил воспользоваться такой возможностью.
И скрипт сборки поисковика запускаю у себя, а не на серверах. Скрипт видит сеть как любой рядовой пользователь сети.
В конфигурационном файле только пути до каталогов сканирования как они видны на моей машине. И путь куда нужно положить файл поисковика. Дальше внутри поисковика все пути до файлов и каталогов относительные от места расположения поисковика.
Поисковик отдает ссылку, а не сам файл. И открыть ссылку может тот у кого есть доступ по этому адресу. Но я индексирую наш общий диск и право на чтение там имею т все пользователи. А вот на запись есть права только в каталоги своих отделов.
Довольно удобно когда браузер может просматривать каталоги и открывать некоторые типы файлов (в частности PDF). А те файлы которые он не умеет открывать позволяет скачать на машину пользователя и открывать отдельной программой. Грех было бы не воспользоваться и этой возможностью.
Специально делал такое "толстое" клиентское решение. Сеть корпоративная. Безопасники ничего не позволят там завести. А информационщики сервера под это не дают. Я ведь не их сотрудник, а обычный клерк в тендерном отделе. Потому и собираем из палок и прочего связующего материала... Благо компьютеры теперь обладают большой операционной памятью и могут переваривать в себе сотню мегабайт.
Вроде на все вопросы ответил и даже на вопрос из следующего сообщения в этой ленте.