Индекс журналаDockup / заметка с места
Note / self-host-typesense

Как самостоятельно разместить Typesense в 2026 году: API-ключи, коллекции и резервные копии

Самостоятельно разместите Typesense с корректными портами, постоянным хранилищем, HTTPS, секретами, резервными копиями и проверками обновлений. Узнайте, как исправить ситуацию, когда в команде отсутствует --data-dir.

Краткая демонстрация Typesense подтверждает лишь то, что процесс прослушивает порт 8108. Для production требуется более убедительное подтверждение работоспособности. Система должна проходить этот сценарий даже после замены контейнера: определить схему коллекции, импортировать примеры документов, выполнить поиск с опечатками, проверить facets и filters, а затем протестировать health endpoint.

Typesense разворачивают для конкретной задачи: мгновенного поиска с понятным HTTP API. Самая распространённая проблема при развёртывании — отсутствие --data-dir в команде или обращение health checks не к тому пути. Поэтому обработке публичного URL и сохранению состояния нужно уделять не меньше внимания, чем запуску образа.

Уменьшите уровень привилегий Typesense

Основной риск безопасности на уровне приложения — встраивание bootstrap admin API key в браузерный код. Правильный подход: никогда не передавать bootstrap administrator key в браузер, а генерировать search keys с ограниченной областью действия для публичных клиентов. Завершите bootstrap через защищённый маршрут и сразу после этого удалите временный доступ для настройки.

Обращайтесь с TYPESENSE_API_KEY с учётом его роли в Typesense: храните конфиденциальные значения вне Git, документируйте последствия ротации и никогда не подставляйте публичный пример в production. Предоставьте процессу Typesense только документированные mounts и маршруты к зависимостям; избегайте доступа к корню хоста и Docker socket. Записывайте в логи неудачные попытки аутентификации и ошибки конфигурации, но удаляйте из них токены, строки подключения и пользовательские данные.

Production-архитектура Typesense

HTTP-процесс Typesense прослушивает порт 8108; оставьте этот порт во внутренней сети приложения и публикуйте только маршрут платформы. Локальное требование среды выполнения — дисковое пространство для коллекций и достаточный объём памяти для активного набора данных. Документируйте ожидаемую ёмкость, владельца и сценарий отказа, а не оставляйте их настройками образа по умолчанию.

Зафиксируйте границу ответственности в виде короткого контракта: кто отвечает за требование, какие учётные данные используются, какой timeout допустим и как выглядит ошибка. Затем выполните эту транзакцию: определите схему коллекции, импортируйте примеры документов, выполните поиск с опечатками, проверьте facets и filters, а затем протестируйте health endpoint. Во время выполнения отслеживайте объём RAM для активных индексов, размер bulk import, сохранность данных на диске и трафик репликации кластера, поскольку такая нагрузка даёт более полезную отправную точку для sizing, чем простаивающий контейнер.

Настройки контейнера, которые стоит проверить

Первый контейнер должен легко удаляться и создаваться заново. Храните данные не в writable layer, привязывайте порт 8108 только там, откуда до него может достучаться proxy, и передавайте конфигурацию во время запуска.

docker run -d \
  --name typesense \
  --restart unless-stopped \
  -p 127.0.0.1:8108:8108 \
  -v typesense-data:/data \
  -e TYPESENSE_API_KEY=replace-with-a-long-random-value \
  -e TYPESENSE_DATA_DIR=/data \
  typesense/typesense:latest

После первоначального тестирования зафиксируйте версию образа. Читайте самую раннюю ошибку запуска, а не итоговое сообщение о перезапуске, проверяйте каждый mount с помощью docker inspect и следите за логами, пока определяете схему коллекции, импортируете примеры документов, выполняете поиск с опечатками, проверяете facets и filters, а затем тестируете health endpoint. Такая последовательность помогает отличить некорректную команду запуска образа от проблемы с зависимостью или правами доступа.

Release gate для Typesense

Кандидат на выпуск Typesense получает рабочий трафик только после прохождения фиксированного сценария: определить схему коллекции, импортировать примеры документов, выполнить поиск с опечатками, проверить facets и filters, а затем протестировать health endpoint. Зафиксируйте digest образа, действующую конфигурацию без секретов, публичный origin и временные метки этого сценария. Тестовые данные должны быть удаляемыми, но достаточно реалистичными, чтобы проходить тот же путь, что и пользовательские запросы.

Запускайте этот тест после замены среды выполнения, затем пересоберите сервис из каталога данных, а для кластеров — из согласованных snapshots каждого узла. Восстановление считается успешным, если возвращаются коллекции, aliases, overrides и synonyms, а тот же запрос выдаёт эквивалентный результат ранжирования. Сравните с предыдущим выпуском показатели RAM для активных индексов, размер bulk import, сохранность данных на диске и трафик репликации кластера; заметные отклонения изучите до продвижения версии.

Наконец, воспроизведите контролируемый сбой: отправьте безвредные данные, близкие к ограничению по размеру или формату для этой границы: в команде отсутствует --data-dir или health checks обращаются не к тому пути. Убедитесь, что Typesense объясняет причину сбоя, не повреждает существующее состояние и возобновляет работу после восстановления корректного условия. Сохраните обезличенный фрагмент лога и время восстановления. Вместе эти проверки охватывают поведение, сохранность данных и эксплуатационные характеристики, а не только доступность процесса.

Настройте маршрут Typesense без ложного HTTPS

Публичной границей Typesense должны быть один canonical hostname, автоматический TLS и один внутренний target на 8108. Маршрутизируйте HTTP API, оставляя peering ports закрытыми, чтобы клиенты обращались к адресу, который распознаёт сервис.

Если acceptance transaction завершается ошибкой, классифицируйте первую проблему. Ошибки DNS, сертификата и 502 относятся к чек-листу проверки TLS. Условие «в команде отсутствует --data-dir или health checks обращаются не к тому пути» относится к стороне приложения, если запрос уже успешно достиг Typesense.

Отрепетируйте рискованное изменение Typesense

Используйте определение схемы коллекции, импорт примеров документов, поиск с опечатками, проверку facets и filters, а затем тестирование health endpoint как smoke test Typesense после каждого развёртывания. Сопутствующие метрики — RAM для активных индексов, размер bulk import, сохранность данных на диске и трафик репликации кластера; установите оповещения на случай приближения этих ресурсов к уровню, при котором ухудшается пользовательское действие.

Основной риск изменений связан с тем, что изменения схемы коллекций и snapshots требуют репетиции: откат образа не может отменить изменение формата данных. Безопасный выпуск начинается с восстанавливаемого snapshot и проверки любого необратимого изменения состояния до переключения трафика. Если в команде отсутствует --data-dir или health checks обращаются не к тому пути, не удаляйте неисправный контейнер, пока не изучите его конфигурацию и первую ошибку.

Докажите, что Typesense переживает замену

До создания первой настоящей записи перечислите состояние, которое нужно сохранить: каталог данных и, для кластеров, согласованные snapshots каждого узла. Подключите /data до bootstrap, запишите безвредные тестовые данные и замените контейнер, чтобы доказать фактическую сохранность этого пути. Подтвердите mount: запишите безвредные данные, замените Typesense и прочитайте их снова.

Snapshots удобны для быстрого отката, но при исчезновении хоста или volume необходима независимая резервная копия. Восстановите данные в пустой среде с зафиксированным образом и убедитесь, что возвращаются коллекции, aliases, overrides и synonyms, а тот же запрос выдаёт эквивалентный результат ранжирования. Используйте постоянные volumes и snapshots, чтобы разделять эти два механизма восстановления.

Развёртывание в Dockup всё равно требует acceptance test для Typesense

Маршрутизация, сертификаты, замена сервисов и подключённое хранилище — разумные цели для автоматизации. Dockup обрабатывает их для Typesense и может подготовить связанную managed database либо подключиться к сервисам на собственном сервере клиента.

Но политика доверия Typesense не должна создаваться автоматически. После развёртывания маршрутизируйте HTTP API, оставляя peering ports закрытыми, применяйте эту границу — никогда не передавайте bootstrap administrator key в браузер, а генерируйте search keys с ограниченной областью действия для публичных клиентов — и проверяйте результат следующего сценария: определить схему коллекции, импортировать примеры документов, выполнить поиск с опечатками, проверить facets и filters, а затем протестировать health endpoint. В результате получается инфраструктура в один клик с acceptance test, специфичным для приложения.

Часто задаваемые вопросы

Что нужно Typesense для production-развёртывания?

Маршрутизируйте контейнер Typesense на порту 8108 через один HTTPS origin. Локальное требование среды выполнения — дисковое пространство для коллекций и достаточный объём памяти для активного набора данных. Не объявляйте Typesense готовым, пока не сможете определить схему коллекции, импортировать примеры документов, выполнить поиск с опечатками, проверить facets и filters, а затем протестировать health endpoint.

Какие данные Typesense нужно включать в резервную копию?

Сохраняйте /data и включайте каталог данных, а для кластеров — согласованные snapshots каждого узла в один recovery manifest. Корректное восстановление Typesense подтверждается только тогда, когда возвращаются коллекции, aliases, overrides и synonyms, а тот же запрос выдаёт эквивалентный результат ранжирования.

Нужен ли Typesense HTTPS за reverse proxy?

Используйте HTTPS для публичного Typesense origin и оставляйте порт 8108 во внутреннем маршруте. Корректно применяйте настройку Typesense: маршрутизируйте HTTP API, оставляя peering ports закрытыми. Для Typesense HTTPS защищает учётные данные и пользовательские данные при передаче и обеспечивает согласованное поведение клиентов, зависящее от origin.

Как тестировать обновление Typesense?

Восстановите текущее состояние Typesense в изолированном развёртывании, примените версию-кандидат и повторите acceptance transaction. Уделите особое внимание тому, что изменения схемы коллекций и snapshots требуют репетиции: откат образа не может отменить изменение формата данных. Сохраняйте предыдущий образ Typesense, пока не будут понятны границы миграции данных и отката.