Встановлення MeiliSearch на VPS: Швидкий та потужний пошук для ваших застосунків
TL;DR
У цьому посібнику ми покроково налаштуємо та запустимо MeiliSearch — високопродуктивний пошуковий рушій з відкритим вихідним кодом — на вашому віртуальному або виділеному сервері. Ви навчитеся встановлювати MeiliSearch з використанням Docker, конфігурувати його для безпечного доступу через HTTPS за допомогою Caddy, а також налаштовувати базове обслуговування та резервне копіювання, щоб забезпечити надійну роботу пошуку для ваших веб-застосунків.
- Налаштування безпечного та продуктивного пошукового сервера на VPS.
- Використання Docker для простої та надійної установки MeiliSearch.
- Конфігурація HTTPS з автоматичним керуванням сертифікатами через Caddy.
- Основи захисту сервера за допомогою Fail2ban та UFW.
- Створення простого скрипту для резервного копіювання даних MeiliSearch.
- Рекомендації щодо вибору оптимального VPS-конфігу для пошукових завдань.
Що ми налаштовуємо і навіщо
У сучасному світі швидкість доступу до інформації є критично важливою. Для будь-якого веб-застосунку, інтернет-магазину, блогу або системи управління контентом наявність швидкого та релевантного пошуку є ключовим фактором користувацького досвіду. Саме це завдання вирішує MeiliSearch — потужний і легкий пошуковий рушій з відкритим вихідним кодом, написаний на Rust.
MeiliSearch надає RESTful API, який дозволяє легко інтегрувати його в будь-який застосунок. Він відрізняється високою швидкістю індексації та пошуку, релевантністю результатів "з коробки" завдяки розумним алгоритмам ранжування, підтримкою фасетного пошуку, фільтрації та морфології. У підсумку читач отримає повністю функціонуючий сервер MeiliSearch, готовий до прийому даних та обробки пошукових запитів від його застосунків.
Існують різні підходи до реалізації пошуку: використання хмарних сервісів (наприклад, Algolia, Elastic Cloud) або самостійне розгортання (self-hosted) таких рішень, як Elasticsearch, Solr або MeiliSearch. Хмарні сервіси зручні, але можуть бути дорогими при великих обсягах даних або запитів, а також накладають обмеження на контроль над інфраструктурою. Самостійне розгортання на VPS або виділеному сервері, навпаки, забезпечує повний контроль, гнучкість і часто нижчі операційні витрати в довгостроковій перспективі. MeiliSearch у цьому контексті виділяється своєю простотою встановлення, низькими вимогами до ресурсів порівняно з Elasticsearch та відмінною продуктивністю, що робить його ідеальним вибором для розгортання на власному VPS.
Який VPS-конфіг потрібен під це завдання
Вибір відповідного VPS-конфігу для MeiliSearch залежить від обсягу даних, які ви плануєте індексувати, та очікуваного навантаження на пошук. MeiliSearch ефективно використовує ресурси, але для стабільної роботи потрібні певні мінімуми.
Мінімальні вимоги:
- CPU: 1-2 ядра. MeiliSearch добре масштабується з кількістю ядер, особливо при індексації.
- RAM: 2 ГБ. Цього вистачить для невеликих та середніх обсягів даних (до кількох мільйонів документів) та помірного навантаження. MeiliSearch завантажує індекс в оперативну пам'ять для швидкого пошуку.
- Диск: 20-40 ГБ NVMe SSD. Швидкість диска критична для індексації та запису даних. NVMe значно перевершує SATA SSD.
- Мережа: 100 Мбіт/с. Для більшості застосунків цього достатньо.
Рекомендований VPS-план для старту (актуально на 2026 рік):
Для більшості проєктів, де обсяг даних не перевищує 10-20 мільйонів документів і очікується до кількох сотень пошукових запитів на хвилину, оптимальним буде VPS наступної конфігурації:
- CPU: 2-4 vCPU (наприклад, Intel Xeon E5 або AMD EPYC).
- RAM: 4-8 ГБ. Це забезпечить запас для більшого індексу та операційної системи.
- Диск: 50-100 ГБ NVMe SSD. Достатньо для зберігання індексу та системних файлів.
- Мережа: 1 Гбіт/с. Забезпечить швидку передачу даних між застосунком та MeiliSearch.
Можна взяти VPS із зазначеними характеристиками, щоб забезпечити стабільну роботу MeiliSearch із запасом на зростання.
Коли потрібен dedicated, а не VPS:
Виділений сервер стає необхідним, коли:
- Обсяг індексованих даних перевищує сотні мільйонів або мільярди документів.
- Потрібна дуже висока пропускна здатність для тисяч пошукових запитів на секунду.
- Застосунок має суворі вимоги до затримок (latency) та стабільної продуктивності, яку VPS не може гарантувати через "шумних сусідів".
- Необхідний повний контроль над апаратним забезпеченням, включаючи специфічні процесори (наприклад, з великим кешем) або RAID-масиви.
У таких випадках варто розглянути відповідний dedicated сервер.
Локація: на що впливає
Розташування сервера впливає на затримку (latency) між вашим основним застосунком та MeiliSearch, а також між користувачами та вашим застосунком. Бажано розміщувати VPS з MeiliSearch якомога ближче до основного застосунку, щоб мінімізувати затримки при індексації та пошуку. Якщо ваш застосунок знаходиться в Європі, вибирайте європейський дата-центр. Якщо цільова аудиторія в Північній Америці, то й сервер має бути там.
Підготовка сервера
Перед встановленням MeiliSearch необхідно виконати базове налаштування безпеки та оновити операційну систему. Ми будемо використовувати Ubuntu Server 24.04 LTS, актуальну та підтримувану версію на 2026 рік.
1. Підключення по SSH та створення користувача з sudo:
Після отримання даних для доступу до VPS, підключіться до нього як користувач root:
ssh root@ВАША_IP_АДРЕСА
Створіть нового користувача для повсякденної роботи (наприклад, meiliuser) та додайте його до групи sudo:
adduser meiliuser
usermod -aG sudo meiliuser
Встановіть SSH-ключі для нового користувача. Скопіюйте ваш публічний SSH-ключ з локальної машини:
# На вашій локальній машині
ssh-copy-id meiliuser@ВАША_IP_АДРЕСА
Вимкніть вхід по SSH для root та вхід за паролем, залишивши тільки вхід за ключами для meiliuser. Відредагуйте файл /etc/ssh/sshd_config:
sudo nano /etc/ssh/sshd_config
Знайдіть та змініть наступні рядки:
PermitRootLogin no
PasswordAuthentication no
Перезапустіть SSH-сервіс:
sudo systemctl restart sshd
Вийдіть із сесії root та увійдіть як meiliuser.
2. Оновлення системи:
Завжди починайте з оновлення пакетної бази та встановлених пакетів:
sudo apt update # Оновлюємо список доступних пакетів
sudo apt upgrade -y # Оновлюємо всі встановлені пакети до останніх версій
sudo apt autoremove -y # Видаляємо непотрібні залежності
3. Встановлення базових утиліт та Fail2ban:
Встановимо необхідні утиліти та Fail2ban для захисту SSH від брутфорсу:
sudo apt install -y curl wget git htop fail2ban unzip
Fail2ban налаштований за замовчуванням для захисту SSH. Щоб увімкнути його, достатньо встановити. Для більш тонкого налаштування можна створити файл /etc/fail2ban/jail.local:
sudo nano /etc/fail2ban/jail.local
Додайте наступний вміст:
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 1h
Перезапустіть Fail2ban:
sudo systemctl restart fail2ban
4. Налаштування брандмауера UFW:
Увімкніть UFW (Uncomplicated Firewall) та дозвольте тільки необхідні порти:
sudo ufw allow OpenSSH # Дозволяємо SSH (порт 22)
sudo ufw allow http # Дозволяємо HTTP (порт 80)
sudo ufw allow https # Дозволяємо HTTPS (порт 443)
sudo ufw enable # Вмикаємо брандмауер
sudo ufw status verbose # Перевіряємо статус брандмауера
Підтвердіть увімкнення брандмауера, натиснувши y.
Встановлення ПЗ — покроково
Ми будемо встановлювати MeiliSearch з використанням Docker, оскільки це найбільш гнучкий та рекомендований спосіб, що забезпечує ізоляцію та просте керування версіями. Актуальні версії на 2026 рік: Docker Engine 26.x, MeiliSearch 1.9.x, Caddy 2.8.x.
1. Встановлення Docker Engine:
Встановіть необхідні пакети для Docker:
sudo apt install -y ca-certificates curl gnupg lsb-release
Додайте офіційний GPG ключ Docker:
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
Додайте репозиторій Docker до APT джерел:
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Оновіть список пакетів та встановіть Docker Engine, Docker CLI та containerd:
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Додайте поточного користувача до групи docker, щоб запускати команди Docker без sudo:
sudo usermod -aG docker meiliuser
Вийдіть з SSH та увійдіть знову, щоб зміни груп набули чинності. Перевірте встановлення Docker:
docker run hello-world # Запускаємо тестовий контейнер Docker
2. Встановлення MeiliSearch з Docker Compose:
Створіть директорію для MeiliSearch та файл docker-compose.yml:
mkdir ~/meilisearch
cd ~/meilisearch
nano docker-compose.yml
Вставте наступний вміст у docker-compose.yml. Вкажіть актуальну версію MeiliSearch (наприклад, v1.9) та ваш власний MEILI_MASTER_KEY:
version: '3.8'
services:
meilisearch:
image: getmeili/meilisearch:v1.9 # Використовуємо актуальну версію MeiliSearch
container_name: meilisearch
ports:
- "127.0.0.1:7700:7700" # Прив'язуємо до локального інтерфейсу, доступ буде через Caddy
volumes:
- ./data.ms:/meili_data # Директорія для зберігання даних індексу
environment:
- MEILI_MASTER_KEY=ВАШ_СЕКРЕТНИЙ_МАСТЕР_КЛЮЧ # Обов'язково замініть на складний ключ
- MEILI_ENV=production # Вказуємо, що це продакшн-оточення
- MEILI_HTTP_ADDR=0.0.0.0:7700 # MeiliSearch буде слухати на всіх інтерфейсах всередині контейнера
restart: always # Автоматичний перезапуск контейнера у разі збою
Запустіть MeiliSearch за допомогою Docker Compose:
docker compose up -d # Запускаємо контейнер MeiliSearch у фоновому режимі
Перевірте, що контейнер запущено:
docker ps # Показує запущені контейнери
Ви повинні побачити контейнер meilisearch, що працює на порту 7700 (прив'язаний до 127.0.0.1).
3. Встановлення Caddy (зворотний проксі та HTTPS):
Caddy — це потужний і простий у використанні веб-сервер, який автоматично налаштовує HTTPS з Let's Encrypt. Він ідеально підходить для проксування запитів до MeiliSearch.
Додайте GPG ключ Caddy:
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
Додайте репозиторій Caddy:
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
Оновіть список пакетів та встановіть Caddy:
sudo apt update
sudo apt install -y caddy
Перевірте статус Caddy:
sudo systemctl status caddy # Перевіряємо, що Caddy запущений і працює
Конфігурація
Тепер, коли MeiliSearch і Caddy встановлені, необхідно налаштувати Caddy для проксіювання запитів до MeiliSearch та забезпечення HTTPS-доступу.
1. Налаштування Caddyfile:
Відредагуйте основний конфігураційний файл Caddy — Caddyfile:
sudo nano /etc/caddy/Caddyfile
Видаліть весь вміст за замовчуванням і вставте наступне, замінивши your-domain.com на ваше доменне ім'я (наприклад, search.mydomain.com) і ВАШ_СЕКРЕТНЫЙ_МАСТЕР_КЛЮЧ на той самий ключ, що ви використовували в docker-compose.yml:
your-domain.com {
# Автоматичне отримання SSL-сертифіката від Let's Encrypt
tls {
dns cloudflare {env.CLOUDFLARE_API_TOKEN} # Приклад для Cloudflare. Використовуйте ваш DNS-провайдер або залиште tls, якщо використовуєте A/AAAA записи
}
# Захист API ключем (додатковий рівень безпеки)
header Authorization "Bearer ВАШ_СЕКРЕТНЫЙ_МАСТЕР_КЛЮЧ"
# Проксіювання запитів до MeiliSearch, запущеного на локальному порту 7700
reverse_proxy 127.0.0.1:7700 {
header_up Host {host}
header_up X-Real-IP {remote_ip}
header_up X-Forwarded-Proto {scheme}
}
# Налаштування логування (опціонально)
log {
output file /var/log/caddy/meilisearch_access.log
format json
}
# Обробка помилок (опціонально)
handle_errors {
respond "{http.error.status_code} {http.error.status_text}" {http.error.status_code}
}
}
Важливо: Для автоматичного отримання TLS-сертифіката з використанням DNS-провайдера (як у прикладі з Cloudflare), вам потрібно буде встановити відповідний плагін Caddy та налаштувати змінні середовища. Якщо ви використовуєте A/AAAA записи і ваш домен доступний ззовні, то достатньо просто вказати tls без додаткових опцій, і Caddy сам отримає сертифікат. Якщо ви використовуєте DNS-плагін, переконайтеся, що змінні середовища (наприклад, CLOUDFLARE_API_TOKEN) встановлені у файлі служби Caddy або через системні змінні.
Для Caddy з Cloudflare DNS, встановіть плагін:
# Приклад встановлення плагіна Caddy для Cloudflare DNS.
# Цей крок може відрізнятися залежно від вашого DNS-провайдера.
# Якщо ви не використовуєте DNS-плагін, пропустіть цей крок.
sudo apt install -y caddy-dns-cloudflare # Або інший плагін, наприклад caddy-dns-digitalocean
Якщо використовуєте DNS-плагін, додайте змінні середовища до файлу служби Caddy. Відредагуйте файл /etc/systemd/system/caddy.service.d/override.conf (створіть, якщо його немає):
sudo systemctl edit caddy
Додайте наступні рядки (замініть на ваш токен):
[Service]
Environment="CLOUDFLARE_API_TOKEN=ВАШ_API_ТОКЕН_CLOUDFLARE"
Збережіть файл і перезавантажте Caddy:
sudo systemctl daemon-reload # Перезавантажуємо systemd, щоб він побачив зміни у службі
sudo systemctl restart caddy # Перезапускаємо Caddy для застосування конфігурації та отримання сертифіката
sudo systemctl status caddy # Перевіряємо статус Caddy
Переконайтеся, що Caddy успішно запустився та отримав SSL-сертифікат. У логах не повинно бути помилок, пов'язаних з TLS.
2. Перевірка працездатності:
Використовуйте curl для перевірки доступності MeiliSearch через Caddy:
curl -I https://your-domain.com/health # Перевіряємо статус здоров'я MeiliSearch
Якщо все налаштовано правильно, ви повинні отримати відповідь з HTTP статусом 200 OK. Також можете перевірити версію MeiliSearch:
curl -X GET 'https://your-domain.com/version' \
-H 'Authorization: Bearer ВАШ_СЕКРЕТНЫЙ_МАСТЕР_КЛЮЧ'
Ви повинні побачити JSON-відповідь з інформацією про версію MeiliSearch.
3. Відкриття порту в брандмауері (якщо не зроблено раніше):
Переконайтеся, що порти 80 і 443 відкриті в UFW:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw reload