Files
Loki/internal/loki/cli_config.go
T
Loki d5d0ed1f35 Conteneurisation : image CUDA autonome (moteur + UI, un seul conteneur)
- Dockerfile 3 étapes : llama.cpp CUDA (flags de backend_build.go, sauf
  GGML_NATIVE=OFF — l'image est bâtie sur un runner, pas sur la machine
  cible), binaire Go statique, runtime CUDA léger (tini, git, nodejs pour
  les serveurs MCP npx).
- docker-entrypoint.sh : sème BIN/HOST/PORT (+ MODEL/CTX/NGL depuis l'env,
  au premier boot seulement), lance le moteur en supervision PID puis
  'loki web' au premier plan. UI seule exposée (8090) ; le moteur (8080,
  non authentifié) reste interne.
- Nouvelle commande 'loki config [get|set]' : configuration non interactive
  (la config vit dans bbolt, pas dans un fichier plat).
- docker-compose.yml (build local, réservation GPU) + variante Unraid
  (image GHCR, runtime nvidia) ; volumes /data (LOKI_HOME) et /models.

Un seul conteneur car llm_client.go joint le moteur sur localhost (hérité
de l'amont).
2026-08-14 21:47:57 +00:00

57 lines
1.5 KiB
Go

package loki
// cli_config.go — lecture/écriture non interactive de la configuration du
// moteur (l'équivalent scriptable de `loki edit`). Ajout du fork Loki : le
// docker-entrypoint s'en sert pour semer BIN/MODEL/CTX/NGL au premier
// démarrage du conteneur, où aucun $EDITOR n'est disponible.
import (
"fmt"
"sort"
"strings"
)
// cmdConfigKV :
//
// loki config affiche toute la configuration (KEY=VALUE)
// loki config get KEY affiche la valeur (vide si absente)
// loki config set K=V [K=V…] définit des clés ; une valeur vide supprime
func cmdConfigKV(args []string) error {
if len(args) == 0 {
cfg := ReadConfig()
keys := make([]string, 0, len(cfg))
for k := range cfg {
keys = append(keys, k)
}
sort.Strings(keys)
for _, k := range keys {
fmt.Printf("%s=%s\n", k, cfg[k])
}
return nil
}
switch args[0] {
case "get":
if len(args) != 2 {
return fmt.Errorf("usage : loki config get KEY")
}
fmt.Println(ReadConfig()[args[1]])
return nil
case "set":
if len(args) < 2 {
return fmt.Errorf("usage : loki config set KEY=VALUE [KEY=VALUE…]")
}
for _, kv := range args[1:] {
k, v, ok := strings.Cut(kv, "=")
k = strings.TrimSpace(k)
if !ok || k == "" {
return fmt.Errorf("argument invalide %q — attendu KEY=VALUE", kv)
}
if err := SetConfigKey(k, strings.TrimSpace(v)); err != nil {
return err
}
}
return nil
}
return fmt.Errorf("usage : loki config [get KEY | set KEY=VALUE…]")
}