MAATRIX / Блог / Elasticsearch на Ubuntu 24.04: пошаговая установка

Elasticsearch на Ubuntu 24.04: пошаговая установка

MAATRIX

Если поиск по сайту работает через LIKE '%запрос%' в MySQL, а логи с десятка серверов приходится собирать grep'ом по очереди — рано или поздно приходишь к Elasticsearch. Это тот самый индустриальный стандарт, на котором держится половина корпоративного полнотекстового поиска и почти весь стек ELK для логов и метрик. Ниже — установка на чистый Ubuntu 24.04 с нуля: от репозитория Elastic до первого запроса к API и защищённого доступа через Kibana.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Что такое Elasticsearch и где он пригодится

Elasticsearch — это распределённая поисковая и аналитическая система на базе Apache Lucene. В отличие от обычной БД, она заточена под быстрый полнотекстовый поиск, фасетную фильтрацию и агрегации по большим объёмам документов. Типичные сценарии:

  • поиск по каталогу товаров, статьям, документам — с опечатками, синонимами, весами полей;
  • централизованный сбор и анализ логов (связка Elasticsearch + Logstash/Beats + Kibana, она же ELK/Elastic Stack);
  • метрики и APM — мониторинг производительности приложений;
  • аналитика поверх больших массивов JSON-документов без строгой схемы.

Если задача проще — например, нужен поиск по каталогу из пары тысяч товаров без сложной аналитики — присмотритесь к Meilisearch или Typesense: они легче в администрировании и не требуют JVM-тюнинга. Elasticsearch оправдан, когда данных много, нагрузка растёт, а из коробки нужны агрегации, шардирование и репликация.

Из минусов сразу стоит сказать честно: Elasticsearch прожорлив по памяти (JVM-heap плюс файловый кэш ОС), требователен к диску (лучше NVMe SSD) и не любит, когда его настраивают «по умолчанию» в проде — дефолты рассчитаны на быстрый старт, а не на нагрузку.

Требования к серверу и подготовка Ubuntu 24.04

Для тестов и разработки хватит 2 ГБ RAM и 1-2 vCPU. Для прод-нагрузки с реальными индексами закладывайте от 4-8 ГБ RAM и SSD/NVMe — Elasticsearch активно использует файловый кэш ОС поверх JVM-heap, и при нехватке памяти первым делом просядет именно поиск.

Обновите систему и поставьте базовые утилиты:

sudo apt update && sudo apt upgrade -y
sudo apt install -y curl gnupg apt-transport-https

Elasticsearch требует, чтобы vm.max_map_count был не меньше 262144 — иначе сервис не стартует и падает с ошибкой про memory map areas. Проверьте и поднимите постоянно:

sysctl vm.max_map_count
echo "vm.max_map_count=262144" | sudo tee /etc/sysctl.d/99-elasticsearch.conf
sudo sysctl --system

Также стоит явно отключить или ограничить swap — если ОС начнёт свопить heap JVM, задержки поиска взлетают непредсказуемо:

sudo swapoff -a

Если своп нужен для других сервисов на этом же сервере, вместо полного отключения задайте bootstrap.memory_lock: true в конфиге Elasticsearch (об этом ниже) — тогда JVM-heap блокируется в памяти и не свопится, а остальная система свопом пользуется как обычно. Общие принципы настройки памяти под нагрузку разобраны в статье про swap и производительность на Ubuntu 24.04.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Установка Java и репозитория Elastic

Начиная с 7-й ветки Elasticsearch поставляется с собственным бандловым JDK — устанавливать Java отдельно не нужно, пакет уже содержит всё необходимое. Это упрощает жизнь: не приходится следить за совместимостью системной версии OpenJDK с конкретным релизом Elasticsearch.

Добавьте официальный GPG-ключ и репозиторий Elastic (актуальная на конец августа 2026 года ветка — 8.x, ей и следуем):

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | \
  sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg

echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] \
https://artifacts.elastic.co/packages/8.x/apt stable main" | \
  sudo tee /etc/apt/sources.list.d/elastic-8.x.list

sudo apt update

Перед установкой сверьтесь с официальной страницей Elastic на предмет актуального минорного релиза 8.x — точные номера версий и даты выхода меняются, и лучше ставить свежую стабильную сборку из репозитория, а не ориентироваться на цифры из чужих статей.

Установка и первый запуск Elasticsearch

Устанавливаем пакет из подключённого репозитория:

sudo apt install elasticsearch

При установке пакет автоматически включает security (TLS для транспортного и HTTP-слоя, аутентификацию) и печатает в консоль важные данные — сохраните их сразу, они не показываются повторно:

  • пароль встроенного пользователя elastic;
  • HTTP CA-фингерпринт для проверки сертификата;
  • если ставите на несколько узлов — команду enrollment-токена для присоединения новых нод.

Если пропустили вывод или пароль потерялся, сбросить его можно так:

sudo /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic

Запускаем сервис и добавляем в автозагрузку:

sudo systemctl daemon-reload
sudo systemctl enable --now elasticsearch
sudo systemctl status elasticsearch

Первый запуск может занять полминуты-минуту — JVM прогревается, инициализируются служебные индексы. Если статус active (running), а порт 9200 не отвечает — дайте сервису ещё немного времени и проверьте логи: sudo journalctl -u elasticsearch -n 100 --no-pager.

Настройка elasticsearch.yml: сеть, heap и безопасность

Основной конфиг лежит в /etc/elasticsearch/elasticsearch.yml. Из коробки Elasticsearch слушает только localhost — это разумный дефолт, менять его на 0.0.0.0 без дополнительной защиты (firewall, reverse proxy, VPN) не стоит: открытый в интернет порт 9200 без ограничений — частая причина утечек данных с незащищённых инсталляций.

Минимально осмысленные правки для одиночного сервера:

cluster.name: my-cluster
node.name: node-1
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 127.0.0.1
http.port: 9200

# если нужен доступ с других серверов внутри приватной сети:
# network.host: 10.0.0.5

bootstrap.memory_lock: true

Если оставили bootstrap.memory_lock: true, добавьте лимиты для юнита systemd — иначе блокировка памяти не сработает:

sudo mkdir -p /etc/systemd/system/elasticsearch.service.d
cat <<'EOF' | sudo tee /etc/systemd/system/elasticsearch.service.d/override.conf
[Service]
LimitMEMLOCK=infinity
EOF
sudo systemctl daemon-reload
sudo systemctl restart elasticsearch

Отдельно — размер JVM-heap. Правило по умолчанию: heap не больше 50% физической RAM и не больше ~30-31 ГБ (выше этого порога JVM теряет оптимизацию compressed oops, и прирост heap может даже ухудшить производительность). Задаётся через отдельный файл, а не правкой основного jvm.options:

cat <<'EOF' | sudo tee /etc/elasticsearch/jvm.options.d/heap.options
-Xms4g
-Xmx4g
EOF
sudo systemctl restart elasticsearch

-Xms и -Xmx держите равными — это исключает паузы на изменение размера heap во время работы. На сервере с 8 ГБ RAM 4 ГБ heap — разумный старт, остальное отдаётся файловому кэшу ОС и накладным расходам ОС/JVM.

Проверка кластера, первые запросы и установка Kibana

Проверьте, что кластер отвечает (пароль — тот, что сохранили при установке):

curl -k -u elastic:ВАШ_ПАРОЛЬ https://localhost:9200
curl -k -u elastic:ВАШ_ПАРОЛЬ https://localhost:9200/_cluster/health?pretty

Здоровый ответ покажет "status": "green" или "yellow" (жёлтый для одного узла — норма, реплики просто некуда раскладывать). Создайте тестовый индекс и документ:

curl -k -u elastic:ВАШ_ПАРОЛЬ -X PUT "https://localhost:9200/test-index"
curl -k -u elastic:ВАШ_ПАРОЛЬ -X POST "https://localhost:9200/test-index/_doc" \
  -H 'Content-Type: application/json' \
  -d '{"title": "Первая статья", "views": 42}'
curl -k -u elastic:ВАШ_ПАРОЛЬ "https://localhost:9200/test-index/_search?q=title:статья&pretty"

Флаг -k в curl отключает проверку самоподписанного сертификата, автоматически сгенерированного при установке — для внутренних запросов с самого сервера это приемлемо, для внешних клиентов лучше подложить сертификат Let's Encrypt через reverse proxy (см. nginx как reverse proxy на Ubuntu 24.04).

Kibana — веб-интерфейс для визуализации и управления — ставится тем же способом из уже подключённого репозитория:

sudo apt install kibana
sudo systemctl enable --now kibana

По умолчанию Kibana тоже слушает localhost:5601. Сгенерируйте токен для подключения Kibana к Elasticsearch и код регистрации для интерфейса:

sudo /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana
sudo /usr/share/kibana/bin/kibana-verification-code

Наружу Kibana лучше не пробрасывать напрямую — заведите nginx с базовой авторизацией или SSO перед ней и откройте только 80/443 через ufw, оставив 5601 и 9200 доступными только с localhost или из приватной сети (пример настройки firewall — в статье про ufw на Ubuntu 24.04). Если стоит выбор между Kibana и Grafana для дашбордов — сравнение подходов есть в материале Grafana или Kibana: что выбрать.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

Частые вопросы

Сервис не стартует с ошибкой про max virtual memory areas — что делать?

Это про vm.max_map_count. Проверьте sysctl vm.max_map_count, значение должно быть не меньше 262144. Если меньше — примените фикс из раздела про подготовку сервера и перезапустите elasticsearch.

Сколько реально нужно RAM для продакшена?

Зависит от объёма индексов и нагрузки на поиск, универсальной цифры нет. Ориентир: heap = 50% RAM (не больше ~30 ГБ), остальное — под файловый кэш ОС, который Lucene использует для быстрого чтения сегментов индекса. Для небольшого проекта старт с 4-8 ГБ RAM обычно достаточен, дальше смотрите по метрикам.

Можно ли отключить security, чтобы не возиться с сертификатами и паролями на тестовом стенде?

Технически да, через xpack.security.enabled: false, но делать это стоит только в полностью изолированной среде без доступа из сети — иначе индекс окажется открытым для любого, кто найдёт порт 9200.

Elasticsearch съедает всю память сервера — это нормально?

Отчасти да: Elasticsearch и ОС агрессивно используют свободную RAM под файловый кэш, это не утечка, а расчётное поведение Lucene. Смотрите не на общее потребление, а на heap usage внутри JVM (_cluster/health, _nodes/stats) — если heap стабильно упирается в -Xmx, пора добавлять RAM или узлы.

Чем Elasticsearch отличается от Meilisearch/Typesense для простого поиска по сайту?

Elasticsearch мощнее в агрегациях, шардировании и работе с большими объёмами разнородных данных, но тяжелее в администрировании и требовательнее к ресурсам. Для поиска по каталогу из нескольких тысяч-десятков тысяч записей без сложной аналитики Meilisearch часто оказывается быстрее в настройке и легче по ресурсам.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →