mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-12 01:37:06 +02:00
docker-entrypoint.sh reposait BIN=/app/llama-server à chaque démarrage du conteneur, sans regarder ce qu'il y avait avant. L'intention était saine — une mise à jour d'image ne doit pas laisser un BIN obsolète — mais elle écrasait aussi le moteur téléchargé depuis l'interface (« mettre à jour le moteur », /data/engine/<version>/), pourtant choisi par l'utilisateur et toujours présent sur le volume. Symptôme vécu : Qwen3.8-Flash-Next chargeait avec server-cuda-b10680 ; au redémarrage suivant, retour silencieux au moteur de l'image et « unknown model architecture: 'qwen4exp' », sans qu'aucun réglage ait bougé. Le journal alternait /app et /data/engine sans raison visible. On ne garde BIN que s'il désigne un moteur installé sous $LOKI_HOME/engine/ et encore exécutable ; sinon, comportement d'avant. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01961iDyM6pwn2dE2SW23gYX
63 lines
2.8 KiB
Bash
63 lines
2.8 KiB
Bash
#!/bin/sh
|
|
# Entrypoint du conteneur Loki : sème la configuration au premier démarrage,
|
|
# lance le moteur (supervision PID, sans systemd), puis l'UI au premier plan.
|
|
set -eu
|
|
|
|
: "${LOKI_HOME:=/data}"
|
|
export LOKI_HOME # les sous-commandes loki doivent voir le MEME dossier
|
|
mkdir -p "$LOKI_HOME"
|
|
|
|
# Garde-fou persistance : si /data n'est pas un point de montage, tout ce que
|
|
# l'utilisateur fera (modèles, discussions, fichiers) mourra avec le conteneur.
|
|
# On le dit au premier écran du journal — l'UI l'affiche aussi en bandeau.
|
|
if ! grep -qs " $LOKI_HOME " /proc/self/mountinfo; then
|
|
echo "[entrypoint] ⚠️ $LOKI_HOME n'est pas un volume monté : les données seront PERDUES à la recréation du conteneur."
|
|
echo "[entrypoint] Ajoute « -v /chemin/hote/data:/data » (docker run) ou le mapping volumes du docker-compose."
|
|
fi
|
|
|
|
# Le chemin du moteur est imposé par l'image (llama-server précompilé de
|
|
# l'image officielle llama.cpp, dans /app) : on le (re)pose à chaque boot,
|
|
# une mise à jour de l'image ne doit pas laisser un BIN obsolète en base.
|
|
#
|
|
# SAUF si l'utilisateur a mis le moteur à jour depuis l'interface : celui-là
|
|
# vit sous $LOKI_HOME/engine/<version>/ (volume de données, il survit au
|
|
# conteneur) et c'est lui qu'il a choisi. Le reposer sur /app à chaque
|
|
# redémarrage ramenait silencieusement l'ancien moteur — un modèle qui
|
|
# chargeait la veille ne chargeait plus le lendemain, « unknown model
|
|
# architecture », sans que rien n'ait été touché. On ne le garde que s'il
|
|
# existe encore : un dossier supprimé à la main ne doit pas laisser BIN dans
|
|
# le vide.
|
|
cur=$(loki config get BIN)
|
|
case "$cur" in
|
|
"$LOKI_HOME"/engine/*/llama-server) [ -x "$cur" ] || cur="" ;;
|
|
*) cur="" ;;
|
|
esac
|
|
if [ -n "$cur" ]; then
|
|
echo "[entrypoint] moteur mis à jour conservé : $cur"
|
|
else
|
|
loki config set "BIN=${LOKI_ENGINE_BIN:-/app/llama-server}"
|
|
fi
|
|
|
|
# Les autres clés ne sont semées QUE si absentes : ce que l'utilisateur règle
|
|
# ensuite dans l'UI (modèle, contexte…) est conservé d'un redémarrage à l'autre.
|
|
seed() { # seed CLÉ VALEUR
|
|
[ -n "$2" ] || return 0
|
|
cur=$(loki config get "$1")
|
|
[ -n "$cur" ] || loki config set "$1=$2"
|
|
}
|
|
seed HOST "${LOKI_ENGINE_HOST:-127.0.0.1}"
|
|
seed PORT "${LOKI_ENGINE_PORT:-8080}"
|
|
seed MODEL "${LOKI_MODEL:-}"
|
|
seed CTX "${LOKI_CTX:-}"
|
|
seed NGL "${LOKI_NGL:-}"
|
|
|
|
# Moteur : démarrage best-effort. Sans MODEL configuré, on laisse l'UI monter
|
|
# quand même — le moteur partira au premier modèle choisi/téléchargé dans l'UI.
|
|
if [ -n "$(loki config get MODEL)" ]; then
|
|
loki start || echo "[entrypoint] moteur non démarré (voir loki logs) — l'UI reste accessible"
|
|
else
|
|
echo "[entrypoint] aucun MODEL configuré — télécharge un modèle depuis l'UI pour démarrer le moteur"
|
|
fi
|
|
|
|
exec loki web "${LOKI_WEB_PORT:-8090}"
|