Meilisearch на Ubuntu 24.04: пошаговая установка
Когда поиск по сайту или каталогу нужен быстрый и терпимый к опечаткам, а поднимать Elasticsearch с его JVM и гигабайтами оперативки не хочется, есть более лёгкий путь. Meilisearch — поисковый движок на Rust, который запускается одним бинарником, ест на порядок меньше ресурсов и из коробки понимает, что пользователь написал «айфон» вместо «айфонн». Ниже — установка на чистый VPS с Ubuntu 24.04, настройка через systemd и первые шаги по индексации данных.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Зачем Meilisearch, а не Elasticsearch
Elasticsearch — мощный инструмент, но избыточный для задачи «быстрый поиск по каталогу товаров или статьям блога». Ему нужна JVM, разумный минимум 2-4 ГБ RAM только под сам процесс, а настройка релевантности требует разбираться в анализаторах и маппингах. Meilisearch решает более узкую задачу — full-text поиск с опечатко-устойчивостью — и делает это без лишних слоёв: один бинарник на Rust, встроенный веб-интерфейс для отладки запросов, разумные дефолты по релевантности, которые в большинстве случаев не нужно тюнить руками.
Обратная сторона — это не замена Elasticsearch там, где нужна сложная аналитика, агрегации по логам или геопоиск. Meilisearch — это поиск, а не аналитическая платформа. Если задача — «пользователь вводит текст в строку поиска и получает релевантные результаты за миллисекунды», Meilisearch почти всегда закрывает её быстрее и дешевле по ресурсам. Для интернет-магазина, базы знаний, блога или внутреннего поиска по документам это типично комфортный выбор.
По требованиям к серверу движок нетребователен на старте: 1 ядро и 1-2 ГБ RAM достаточно для индекса на десятки-сотни тысяч документов, дальше объём RAM растёт вместе с размером индекса и количеством одновременных запросов — точных цифр без вашего датасета никто не назовёт, ориентируйтесь и замеряйте на своих данных.
Подготовка сервера и установка бинарника
Возьмите чистый VPS с Ubuntu 24.04 и root-доступом. Обновите систему и поставьте базовые утилиты:
apt update && apt upgrade -y
apt install -y curl ca-certificates
Локацию сервера выбирайте по тому, откуда идёт основной трафик к поиску: если аудитория в России или СНГ — RU-площадка даст меньшую задержку между фронтендом и Meilisearch, если проект ориентирован на зарубежных пользователей — есть смысл смотреть на US или UK. У MAATRIX доступны все три локации, оплата принимается картой из России, через СБП или криптовалютой — не придётся искать окольные пути ради подписки на зарубежный сервис.
Официальный способ поставить сам Meilisearch — скачать готовый бинарник через установочный скрипт проекта:
curl -L https://install.meilisearch.com | sh
Скрипт определит архитектуру (x86_64 или ARM), скачает актуальный релиз и положит исполняемый файл meilisearch в текущую директорию. Проверьте, что бинарник появился и рабочий:
./meilisearch --version
Перенесите его в системный путь, чтобы запускать без указания директории:
mv ./meilisearch /usr/local/bin/meilisearch
chmod +x /usr/local/bin/meilisearch
Альтернативный вариант — Docker-образ getmeili/meilisearch, если у вас уже есть инфраструктура на контейнерах. В этой статье рассматривается вариант с systemd-сервисом — он даёт предсказуемое поведение при перезагрузке сервера и не тянет за собой Docker там, где он не нужен для остального проекта.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверПользователь, конфигурация и systemd-сервис
Не запускайте Meilisearch от root. Создайте отдельного системного пользователя и рабочие директории:
useradd -r -s /bin/false -M meilisearch
mkdir -p /var/lib/meilisearch/data /var/lib/meilisearch/dumps /var/lib/meilisearch/snapshots
chown -R meilisearch:meilisearch /var/lib/meilisearch
Master key — это ключ, которым защищён весь API Meilisearch: без него, если сервер слушает на внешнем интерфейсе, любой сможет читать и менять ваши индексы. Сгенерируйте случайный ключ длиной от 16 байт:
openssl rand -base64 32
Сохраните вывод — он понадобится и в конфиге, и в клиентском коде. Потерянный master key означает, что придётся сгенерировать новый и заново авторизовать все API-ключи, которые от него порождались.
Создайте конфигурационный файл:
mkdir -p /etc/meilisearch
nano /etc/meilisearch/config.toml
Минимальный рабочий конфиг:
env = "production"
db_path = "/var/lib/meilisearch/data"
dump_dir = "/var/lib/meilisearch/dumps"
snapshot_dir = "/var/lib/meilisearch/snapshots"
http_addr = "127.0.0.1:7700"
master_key = "вставьте_сюда_сгенерированный_ключ"
Обратите внимание на env = "production" — в этом режиме Meilisearch требует master key для всех запросов, включая встроенный веб-интерфейс. В режиме development ключ можно не задавать, но это допустимо только на локальной машине, не на публичном сервере. http_addr намеренно указан как 127.0.0.1 — сервис слушает только локально, наружу его отдаёт реверс-прокси с HTTPS и, при необходимости, дополнительными ограничениями.
Создайте unit-файл systemd:
nano /etc/systemd/system/meilisearch.service
[Unit]
Description=Meilisearch search engine
After=network.target
[Service]
Type=simple
User=meilisearch
Group=meilisearch
ExecStart=/usr/local/bin/meilisearch --config-file-path /etc/meilisearch/config.toml
Restart=on-failure
RestartSec=5
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
Права на конфиг стоит ограничить, поскольку в нём лежит master key открытым текстом:
chown root:meilisearch /etc/meilisearch/config.toml
chmod 640 /etc/meilisearch/config.toml
Запустите сервис и включите автозапуск:
systemctl daemon-reload
systemctl enable --now meilisearch
systemctl status meilisearch
Проверьте, что API отвечает:
curl -H "Authorization: Bearer вставьте_сюда_ключ" http://127.0.0.1:7700/health
Ответ {"status":"available"} означает, что сервис поднялся и авторизация работает.
Реверс-прокси и фаервол
Наружу Meilisearch отдавать напрямую не стоит — нужен HTTPS и единая точка входа. Если на сервере уже стоит Caddy, добавить проксирование можно буквально в несколько строк — этот вариант разобран в статье про установку Caddy с авто-SSL на Ubuntu 24.04. Пример конфига для Caddyfile:
search.example.com {
reverse_proxy 127.0.0.1:7700
}
Для Nginx блок будет чуть длиннее, с явным указанием заголовков проксирования:
server {
listen 443 ssl;
server_name search.example.com;
location / {
proxy_pass http://127.0.0.1:7700;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Настройку фаервола ufw для базовой защиты сервера — какие порты открывать наружу, а какие держать закрытыми — я подробно разбирал в статье про установку UFW на Ubuntu 24.04. Для Meilisearch правило простое: порт 7700 наружу не открывается вообще, доступ к нему — только с localhost, через который и работает реверс-прокси.
Индексация, релевантность и API-ключи
Проверив, что API доступен, создайте индекс и загрузите документы. Meilisearch принимает JSON-массив объектов, у каждого из которых обязательно есть уникальное поле-идентификатор (по умолчанию Meilisearch пытается угадать его сам, но явно указать надёжнее):
curl -X POST 'http://127.0.0.1:7700/indexes' \
-H "Authorization: Bearer ваш_ключ" \
-H 'Content-Type: application/json' \
--data-binary '{"uid":"products","primaryKey":"id"}'
Загрузка документов:
curl -X POST 'http://127.0.0.1:7700/indexes/products/documents' \
-H "Authorization: Bearer ваш_ключ" \
-H 'Content-Type: application/json' \
--data-binary '[
{"id":1,"name":"Смартфон Айфон 15","category":"Электроника","price":79990},
{"id":2,"name":"Кроссовки беговые","category":"Обувь","price":6990}
]'
Индексация асинхронная — запрос сразу вернёт taskUid, по которому можно проверить статус:
curl -H "Authorization: Bearer ваш_ключ" \
http://127.0.0.1:7700/tasks/0
Как только статус сменится на succeeded, документы доступны для поиска:
curl -X POST 'http://127.0.0.1:7700/indexes/products/search' \
-H "Authorization: Bearer ваш_ключ" \
-H 'Content-Type: application/json' \
--data-binary '{"q":"айфонн"}'
Опечатка в запросе не помешает найти «Смартфон Айфон 15» — опечатко-устойчивость (typo tolerance) включена по умолчанию и не требует отдельной настройки. Для источника данных из PostgreSQL — если ваш каталог уже там — базовую установку и настройку самой СУБД на Ubuntu 24.04 можно посмотреть в статье про установку PostgreSQL; дальше документы выгружаются оттуда скриптом и заливаются в Meilisearch через тот же API.
Дефолтные настройки поиска покрывают большинство случаев, но иногда нужно точечно вмешаться. Список полей, которые участвуют в поиске, задаётся через searchableAttributes:
curl -X PUT 'http://127.0.0.1:7700/indexes/products/settings/searchable-attributes' \
-H "Authorization: Bearer ваш_ключ" \
-H 'Content-Type: application/json' \
--data-binary '["name","category"]'
Фильтруемые и сортируемые атрибуты (например, чтобы фильтровать по цене или категории) нужно объявить явно — по умолчанию фильтрация недоступна ни по одному полю:
curl -X PUT 'http://127.0.0.1:7700/indexes/products/settings/filterable-attributes' \
-H "Authorization: Bearer ваш_ключ" \
-H 'Content-Type: application/json' \
--data-binary '["category","price"]'
Для фронтенда мастер-ключ отдавать нельзя — он даёт полный доступ, включая удаление индексов. Создайте отдельный ключ с правами только на поиск:
curl -X POST 'http://127.0.0.1:7700/keys' \
-H "Authorization: Bearer ваш_master_key" \
-H 'Content-Type: application/json' \
--data-binary '{
"description": "Search-only key for frontend",
"actions": ["search"],
"indexes": ["products"],
"expiresAt": null
}'
Именно этот ключ, с правами только на чтение и поиск, безопасно встраивать в клиентский JavaScript. Master key должен оставаться только на бэкенде — в переменных окружения или в конфиге сервера, но никогда в коде, который отдаётся браузеру.
Резервное копирование и обновление
У Meilisearch есть встроенный механизм снапшотов и дампов — оба варианта проще, чем бэкапить сырые файлы db_path вручную, поскольку движок сам гарантирует консистентность на момент снятия копии. Снапшот создаётся флагом при запуске (--schedule-snapshot 3600 — раз в час) или через API вручную:
curl -X POST 'http://127.0.0.1:7700/snapshots' \
-H "Authorization: Bearer ваш_master_key"
Файлы снапшотов ложатся в snapshot_dir из конфига — их стоит забирать на отдельное хранилище тем же способом, каким вы уже бэкапите остальной сервер.
Обновление до новой версии — это замена бинарника и рестарт сервиса:
systemctl stop meilisearch
curl -L https://install.meilisearch.com | sh
mv ./meilisearch /usr/local/bin/meilisearch
systemctl start meilisearch
Перед крупным обновлением (смена мажорной версии) стоит свериться с changelog проекта — формат хранения данных между версиями иногда меняется, и разработчики явно указывают, нужна ли миграция дампом. Снятый заранее дамп или снапшот — это ваш путь назад, если что-то пойдёт не так.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Сколько RAM нужно для индекса на миллион документов?
Точной универсальной цифры нет — расход зависит от количества полей, их размера и того, сколько из них попадает в searchableAttributes. Начните с 2-4 ГБ и следите за потреблением через systemctl status meilisearch или мониторинг, при необходимости увеличивайте.
Можно ли использовать Meilisearch вместо основной базы данных?
Нет, это не предназначено для этой роли. Это поисковый индекс поверх основной БД — данные должны храниться в PostgreSQL, MySQL или другой СУБД, а в Meilisearch синхронизироваться отдельным процессом или на лету через API при изменении записи.
Чем master key отличается от обычного API-ключа?
Master key задаётся в конфиге при запуске и даёт полный доступ, включая создание и удаление ключей. Остальные ключи создаются через API, у них можно ограничить действия (только поиск, например) и индексы, к которым есть доступ — именно их и стоит использовать в клиентском коде.
Meilisearch поддерживает русский язык?
Да, токенизация и typo tolerance работают с кириллицей без дополнительной настройки, специальных языковых плагинов, как в некоторых конкурентах, не требуется.
Нужен ли для Meilisearch отдельный сервер или его можно поставить рядом с приложением?
Для небольших и средних проектов вполне можно ставить рядом с основным приложением на одном VPS — движок легковесный. Разносить на отдельный сервер имеет смысл, когда индекс большой, поисковых запросов много и они начинают заметно конкурировать за ресурсы с основным приложением.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →