Skip to content

Meilisearch backup naar Hetzner Storage Box (Restic)

Terug naar klant: Brekz

Overzicht

Op de server FL09PLO-MEI01 (Hetzner VPS CPX11, beheerd via Ploi.io) draait een Meilisearch instantie. Elke nacht wordt een volledige dump van Meilisearch aangemaakt via de REST API. Deze dump wordt vervolgens door Restic via SFTP gesynchroniseerd naar de Hetzner Storage Box.

Er wordt bewust gekozen voor een dump in plaats van een snapshot. Een dump is versie-onafhankelijk (moet wel dezelfde versie of nieuwer zijn) en kan worden geïmporteerd in elke Meilisearch versie, wat herstel aanzienlijk flexibeler maakt.

Restic deduplicatie

Restic slaat alleen gewijzigde blokken op (content-addressed deduplicatie). De opslag groeit daardoor beperkt, ook bij dagelijkse volledige dumps.

Configuratie overzicht

Onderdeel Waarde
Server FL09PLO-MEI01
Meilisearch user root
Meilisearch data /home/ploi/data.ms
Dump directory /var/backups/meilisearch/dumps
Backup script /usr/local/bin/meilisearch-backup.sh
Restic repository sftp:storagebox-brekz-384620:/home/restic
Logbestand /var/log/meilisearch-backup.log
Schema Dagelijks om 03:00 uur
Retentiebeleid Onbeperkt (geen automatische opschoning)
StorageBox Hetzner BX11 #384620

Installatie & configuratie

Stap 1 — Benodigde software installeren

Verbind via SSH als ploi met FL09PLO-MEI01 via je SSH-client, en start een root sessie:

sudo -i

Installeer vervolgens Restic en jq:

apt update && apt install -y restic jq

Controleer de installatie:

restic version
jq --version

Stap 2 — SSH sleutel aanmaken voor de Storage Box

Maak een toegewijd SSH sleutelpaar aan voor de Restic verbinding:

ssh-keygen -t ed25519 -f /root/.ssh/storagebox_384620_restic -N "" -C "restic@fl09plo-mei01"

Voeg de publieke sleutel toe aan de Hetzner Storage Box via de door Hetzner aanbevolen methode:

cat /root/.ssh/storagebox_384620_restic.pub | ssh -p 23 <storagebox-user>@<storagebox-user>.your-storagebox.de install-ssh-key

Voer het wachtwoord van de Storage Box in wanneer daarom gevraagd wordt (beschikbaar in 1Password).

Hetzner Storage Box inloggegevens

De inloggegevens van de Hetzner Storage Box zijn beschikbaar in 1Password.

Hetzner - Storage box BX11 Brekz (FTP) BX11 #384620

Stap 3 — SSH alias configureren

Voeg een SSH alias toe in /root/.ssh/config zodat Restic de Storage Box kan bereiken:

Host storagebox-brekz-384620
    HostName <storagebox-user>.your-storagebox.de
    User <storagebox-sub-user>
    Port 23
    IdentityFile /root/.ssh/storagebox_384620_restic

Poortnummer

Hetzner Storage Box gebruikt poort 23 voor SSH/SFTP, niet de standaard poort 22.

Test de verbinding, je zou geen wachtwoord in hoeven te vullen hiervoor:

ssh storagebox-brekz-384620

Stap 4 — Dump directory aanmaken

Maak de lokale directory aan waar Meilisearch de dumps in wegschrijft:

mkdir -p /var/backups/meilisearch/dumps

Stap 5 — Meilisearch dump directory configureren in Ploi

De dump directory moet worden meegegeven als opstartparameter aan Meilisearch.

Ga in de Ploi UI naar de parameters van de Meilisearch service en voeg toe:

--dump-dir /var/backups/meilisearch/dumps

Herstart vereist

Na het aanpassen van de parameter moet Meilisearch opnieuw worden gestart via Ploi voordat de instelling actief is.

Stap 6 — Master key bestand aanmaken

De Meilisearch master key staat hardcoded als parameter in de systemd service. Maak een apart bestand aan zodat het backup script de key kan uitlezen:

nano /root/.meilisearch-master-key
chmod 600 /root/.meilisearch-master-key

Plak de master key in de editor en sla op en sluit nano.

Master key plakken

Let op dat als je de master key plakt, dat je niet daarna nog een enter of iets anders toevoegd.

De key zou dan niet meer overeenkomen met wat Meilisearch verwacht, en de backup zal dan falen.

Master key ophalen

De master key is op twee manieren op te halen:

Via de Ploi UI: navigeer naar de Meilisearch service en bekijk de ingestelde parameters.

Via de server: lees de systemd service definitie uit:

systemctl cat meilisearch

Stap 7 — Restic wachtwoord instellen

Restic versleutelt de repository met een wachtwoord. Het wachtwoord is beschikbaar in 1Password onder:

Sla het wachtwoord op in een bestand op de server:

nano /root/.meilisearch-restic-password
chmod 600 /root/.meilisearch-restic-password

Plak het repository wachtwoord in de editor en sla op en sluit nano.

Stap 8 — Restic repository initialiseren

Maak eerst de doeldirectory aan op de Storage Box via SFTP:

sftp -P 23 storagebox-brekz-384620
mkdir restic
exit

Initialiseer daarna de Restic repository op de Storage Box:

restic -r sftp:storagebox-brekz-384620:/home/restic --password-file /root/.meilisearch-restic-password init

Controleer of de initialisatie geslaagd is:

restic -r sftp:storagebox-brekz-384620:/home/restic --password-file /root/.meilisearch-restic-password snapshots

Stap 9 — Backup script aanmaken

Maak het backup script aan:

nano /usr/local/bin/meilisearch-backup.sh

Plak de volgende inhoud:

#!/bin/bash

set -euo pipefail

MEILI_URL="http://localhost:7700"
MEILI_MASTER_KEY_FILE="/root/.meilisearch-master-key"
DUMP_DIR="/var/backups/meilisearch/dumps"
RESTIC_REPO="sftp:storagebox-brekz-384620:/home/restic"
RESTIC_PASSWORD_FILE="/root/.meilisearch-restic-password"
LOG_PREFIX="[$(date '+%Y-%m-%d %H:%M:%S')]"

MEILI_MASTER_KEY=$(cat "$MEILI_MASTER_KEY_FILE")

if [ -z "$MEILI_MASTER_KEY" ]; then
    echo "$LOG_PREFIX ERROR: MEILI_MASTER_KEY not found in $MEILI_MASTER_KEY_FILE." >&2
    exit 1
fi

echo "$LOG_PREFIX Starting Meilisearch dump..."

# Trigger dump via REST API
TASK_RESPONSE=$(curl -s -f -X POST "$MEILI_URL/dumps" \
    -H "Authorization: Bearer $MEILI_MASTER_KEY")
TASK_UID=$(echo "$TASK_RESPONSE" | jq -r '.taskUid')

if [ -z "$TASK_UID" ] || [ "$TASK_UID" = "null" ]; then
    echo "$LOG_PREFIX ERROR: Failed to start dump task. Response: $TASK_RESPONSE" >&2
    exit 1
fi

echo "$LOG_PREFIX Dump started (task UID: $TASK_UID). Waiting for completion..."

# Wait for dump to complete
MAX_WAIT=300
ELAPSED=0
while true; do
    STATUS=$(curl -s -f "$MEILI_URL/tasks/$TASK_UID" \
        -H "Authorization: Bearer $MEILI_MASTER_KEY" | jq -r '.status')

    if [ "$STATUS" = "succeeded" ]; then
        echo "$LOG_PREFIX Dump completed successfully."
        break
    elif [ "$STATUS" = "failed" ] || [ "$STATUS" = "canceled" ]; then
        echo "$LOG_PREFIX ERROR: Dump failed (status: $STATUS)." >&2
        exit 1
    fi

    if [ "$ELAPSED" -ge "$MAX_WAIT" ]; then
        echo "$LOG_PREFIX ERROR: Dump timed out after ${MAX_WAIT}s." >&2
        exit 1
    fi

    sleep 5
    ELAPSED=$((ELAPSED + 5))
done

echo "$LOG_PREFIX Starting Restic backup of $DUMP_DIR..."

restic -r "$RESTIC_REPO" --password-file "$RESTIC_PASSWORD_FILE" backup "$DUMP_DIR"

echo "$LOG_PREFIX Restic backup done. Cleaning up local dumps (keeping last 7)..."

# Remove all but the 7 most recent dumps (sorted by filename = timestamp)
ls -t "$DUMP_DIR"/*.dump 2>/dev/null | tail -n +8 | xargs -r rm -f

echo "$LOG_PREFIX Backup completed successfully."

Maak het script uitvoerbaar:

chmod +x /usr/local/bin/meilisearch-backup.sh

Stap 10 — Script handmatig testen

Voer het script eenmalig handmatig uit om te controleren of alles werkt:

/usr/local/bin/meilisearch-backup.sh

Controleer of er een dumpbestand is aangemaakt:

ls -lh /var/backups/meilisearch/dumps/

Controleer of de Restic snapshot is aangemaakt:

restic -r sftp:storagebox-brekz-384620:/home/restic --password-file /root/.meilisearch-restic-password snapshots

Stap 11 — Cronjob instellen

Voeg de cronjob toe aan de root crontab. Zorg dat je in een root sessie zit (sudo -i) voordat je dit uitvoert:

crontab -e

Voeg de volgende regel toe:

0 3 * * * /usr/local/bin/meilisearch-backup.sh >> /var/log/meilisearch-backup.log 2>&1

De cronjob draait dagelijks om 03:00 uur en doet het volgende in volgorde:

  1. Triggert een Meilisearch dump via de REST API
  2. Wacht tot de dump volledig is
  3. Voert een Restic backup uit van de dump directory naar de Storage Box

Verificatie

Logs controleren

tail -f /var/log/meilisearch-backup.log

Restic snapshots bekijken

restic -r sftp:storagebox-brekz-384620:/home/restic --password-file /root/.meilisearch-restic-password snapshots

Inhoud van een snapshot inspecteren

restic -r sftp:storagebox-brekz-384620:/home/restic --password-file /root/.meilisearch-restic-password ls latest

Herstel procedure

Stap 1 — Dump ophalen uit Restic

Herstel de meest recente backup naar een tijdelijke directory:

mkdir -p /tmp/meilisearch-restore
restic -r sftp:storagebox-brekz-384620:/home/restic --password-file /root/.meilisearch-restic-password \
    restore latest --target /tmp/meilisearch-restore

Het herstelde dumpbestand (.dump) bevindt zich dan in /tmp/meilisearch-restore/var/backups/meilisearch/dumps/.

Stap 2 — Dump importeren in Meilisearch

Stop Meilisearch via Ploi, importeer de dump via de --import-dump vlag, en start daarna opnieuw:

# Voorbeeld — pas het pad aan naar het gewenste .dump bestand
meilisearch --db-path /home/ploi/data.ms \
    --import-dump /tmp/meilisearch-restore/var/backups/meilisearch/dumps/<bestandsnaam>.dump

Dataverlies bij importeren

Het importeren van een dump overschrijft de bestaande Meilisearch data. Zorg dat dit bewust wordt gedaan, bij voorkeur na het stoppen van de service.

Versie-onafhankelijkheid

Een Meilisearch dump kan worden geïmporteerd in een andere (nieuwere) versie van Meilisearch. Dit is het voornaamste voordeel ten opzichte van snapshots.