Suchmaschine Meilisearch für Sharkey einrichten

Sharkey kann mithilfe der Suchmaschine Meilisearch in Notizen suchen.

Wer es sich einfach machen will, betreibt Meilisearch im sog. Development-Modus, bei dem keine Schlüssel für die Kommunikation zwischen Server und Client benötigt werden.

Ich empfehle aber, den Production-Modus zu verwenden. Dabei werden Schlüssel für die Kommunikation verwendet. Im Idealfall ein Schlüssel für genau eine Instanz.

Im Folgenden beschreibe ich, wie ich unter Ubuntu 22.04 vorgegangen bin.

Vorbemerkungen

Ich habe Meilisearch auf einem anderen Server als Sharkey installiert.

Meilisearch benötigt hauptsächlich viel RAM – und da gab der Server, den ich für Sharkey verwende, nicht genügend her.

Auf die Verwendung von Docker, um Meilisearch zu installieren, habe ich verzichtet.

Meilisearch installieren

sudo apt update
sudo apt install curl -y
sudo curl -L https://install.meilisearch.com | sh
sudo mv ./meilisearch /usr/local/bin
sudo chmod +x /usr/local/bin/meilisearch
sudo useradd -d /var/lib/meilisearch -b /bin/false -m -r meilisearch
sudo mkdir /var/lib/meilisearch/data /var/lib/meilisearch/dumps /var/lib/meilisearch/snapshots
sudo chown -R meilisearch:meilisearch /var/lib/meilisearch
sudo chmod 750 /var/lib/meilisearch

MASTER_KEY

Für den Betrieb von Meilisearch im sog. Production-Modus wird ein MASTER_KEY benötigt. Dieser sollte tunlichst geheim gehalten werden, da er Zugriff auf alle Funktionen von Meilisearch erlaubt.

Dieser MASTER_KEY muss ein mindestens 16 Byte langer alphanumerischer String sein.

Er kann z. B. mithilfe von uuidgen erzeugt werden. Ein mit uuidgen -r erzeugter MASTER_KEY lautet dann z.B. 0e5cff1c-50a3-4d15-885d-70847e167e55.

Konfiguration einrichten

Zuerst wird eine Konfigurationsdatei als Vorlage heruntergeladen:

sudo curl https://raw.githubusercontent.com/meilisearch/meilisearch/latest/config.toml > /etc/meilisearch.toml

Die Datei muss nun mit einem Editor angepasst werden: sudo nano /etc/meilisearch.toml Es sind folgende Einträge zu ändern:

env = "production"
master_key = "MASTER_KEY"
db_path = "/var/lib/meilisearch/data"
dump_dir = "/var/lib/meilisearch/dumps"
snapshot_dir = "/var/lib/meilisearch/snapshots"

env = "production" schaltet Meilisearch in den Production-Modus, in dem der Schlüssel benötigt werden, um auf Meilisearch zuzugreifen. Die Alternative wäre der Development-Modus, was ich jedoch nicht empfehle.

Systemd einrichten

Systemd sorgt dafür, dass Meilisearch automatisch gestartet werden kann. sudo nano /etc/systemd/system/meilisearch.service Mit folgendem Inhalt:

[Unit]
Description=Meilisearch
After=systemd-user-sessions.service

[Service]
Type=simple
WorkingDirectory=/var/lib/meilisearch
ExecStart=/usr/local/bin/meilisearch --config-file-path /etc/meilisearch.toml
User=meilisearch
Group=meilisearch

[Install]
WantedBy=multi-user.target

Meilisearch starten

Nun aktivieren und starten wir Meilisearch. sudo systemctl enable --now meilisearch.service

Zur Sicherheit überprüfen wir, ob Meilisearch einwandfrei funktioniert: sudo systemctl status meilisearch.service

Mit dem Befehl

curl \
  -X GET 'http://localhost:7700/keys' \
  -H 'Authorization: Bearer MASTER_KEY'

können wir sehen, welche Schlüssel Meilisearch automatisch generiert hat: einen Default Search Key und einen Default Admin API Key.

Wir wollen aber für Sharkey einen weiteren Schlüssel erzeugen:

API_KEY generieren

Es gibt nun eine Besonderheit: Wenn wir Sharkey so konfigurieren, dass er einen Index namens INDEX benutzen soll, will er unter der Haube einen Index namens INDEX---notes erstellen und verwenden. Wir müssen also den API_Key entsprechend anpassen.

curl \
  -X POST 'http://localhost:7700/keys' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer MASTER_KEY' \
  --data-binary '{
    "name": "NAME",
    "description": "BESCHREIBUNG",
    "actions": ["*"],
    "indexes": ["INDEX---notes"],
    "expiresAt": "2025-01-01T00:00:00Z"
  }' 

Ohne das ---notes wird Meilisearch den API_KEY nicht akzeptieren, es gibt dann eine Fehlermeldung ìnvalid API key`.

Meilisearch erlaubt die Verwendung von Wildcards. Alternativ zu INDEX---notes kann darum auch INDEX---* oder INDEX* verwendet werden.

Ersetzt INDEX durch eine geeignete Bezeichnung, z.B. “sharkey”, also “sharkey—-notes” oder “sharkey—-*”.

Für "expiresAt"habe ich ein Datum ein Jahr in der Zukunft angegeben.

Obiger Befehl erzeugt einen API_KEY, der auf dem Bildschirm angezeigt wird. Diesen bitte notieren, er wird im nächsten Schritt benötigt. Er lautet z.B. f52b90e969e68f23481c540e79b02f693d2f783968022379f52a2b859c41ce0c.

Sharkey für Meilisearch konfigurieren

Nun konfigurieren wir Sharkey für die Verwendung von Meilisearch.

su - sharkey
nano Sharkey/.config/default.yml

Den Abschnitt für Meilisearch suchen und dort eintragen:

meilisearch:
  host: localhost
  port: 7700
  apiKey: 'API_KEY'
  ssl: false
  index: 'INDEX'
  scope: global

Hier darf kein “—-notes” an den Namen des Index angehängt werden. Das erledigt Sharkey im Hintergrund.

Nun starten wir Sharkey neu: sudo systemctl restart sharkey.service

Zum Schluss als Sharkey-Admin in der Systemsteuerung die Rolle „Nutzung der Notizsuchfunktion“ aktivieren

SSL Reverse Proxy mit nginx einrichten

Da ich Meilisearch auf einem anderen Server installiert habe, nutze ich einen SSL Reverse Proxy auf dem Server, auf dem Meilisearch installiert ist.

Dafür verwende ich folgende Konfiguration für nginx:

server {
    listen 80;
    listen [::]:80;
    server_name SERVER_NAME;
    return 301 https://$server_name$request_uri;
}
server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name SERVER_NAME;
    access_log /var/log/nginx/access_meilisearch.log;
    error_log /var/log/nginx/error_meilisearch.log;
    ssl_certificate       /PATH/TO/SSL/CERTIFICATE;
    ssl_certificate_key   /PATH/TO/SSL/CERTIFICATE/KEY;
    location / {
        proxy_pass  http://localhost:7700;
    }
}

Sharkey muss nun wie folgt konfiguriert werden, um den SSL Reverse Proxy zu verwenden:

meilisearch:
  host: SERVER_NAME
  port: 443
  apiKey: 'API_KEY'
  ssl: true
  index: 'INDEX_NAME'
  scope: global

API_KEY anzeigen

Um den API _KEY anzuzeigen, bitte folgenden Befehl eingeben:

curl \
  -X GET 'http://localhost:7700/keys' \
  -H 'Authorization: Bearer MASTER_KEY'

Dieser Befehl zeigt alle API_KEYs an. Der API_KEY ist unter dem Tag "key" : zu finden. Jeder API_KEY hat auch eine uuid-Kennung, die notwendig ist, um einen API_Key zu aktualisieren oder zu löschen.

API_KEY löschen

Falls erforderlich, kann der API_KEY gelöscht und dann durch einen neuen ersetzt werden.

curl \
  -X DELETE 'http://localhost:7700/keys/UUID' \
  -H 'Authorization: Bearer MASTER_KEY'

#Meilisearch #Sharkey #Suchmaschine #Volltextsuche


Folge mir im Fediverse: @admina@meerjungfrauengrotte.de (Mastodon)