mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-19 13:08:15 +02:00
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).
This commit is contained in:
8 files changed
+292
No files matched your search
@@ -0,0 +1,56 @@
|
||||
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…]")
|
||||
}
|
||||
@@ -54,6 +54,8 @@ func Main() {
|
||||
mustExit(serviceLogs())
|
||||
case "edit":
|
||||
mustExit(editConfig())
|
||||
case "config":
|
||||
mustExit(cmdConfigKV(args))
|
||||
case "set-api-key":
|
||||
mustExit(cmdSetAPIKey(args))
|
||||
case "set-web-key":
|
||||
|
||||
Reference in new issue
Block a user