LoreMind channel switcher
Sidecar qui bascule LoreMind entre les canaux stable et beta depuis l'UI,
sans manipulation manuelle du .env ni de docker-compose.
Principe
Le switcher est un container minimal (Alpine + docker-cli + bash) qui :
- Watch un fichier
command.jsondans un volume partagé avec le Core - Quand une commande arrive :
- Valide le canal cible (
stable|beta) - Sed la ligne
IMAGE_NAMESPACEdu.envdu host - Lance
docker compose pullpuisdocker compose up -dsur core/brain/web
- Valide le canal cible (
- Écrit son résultat dans
result.json(le Core remonte ça à l'UI via polling)
Sécurité
Le switcher a accès au socket Docker et au répertoire compose du host (RW), donc beaucoup de pouvoir. Pour éviter qu'une compromission du Core devienne un RCE sur l'hôte :
- Le Core n'a pas accès au socket Docker — il dépose une commande dans un fichier, point.
- Le switcher valide strictement le contenu :
channeldoit valoir exactementstableoubeta(case statement, pas de regex laxiste). - Aucun port n'est exposé. La communication se fait uniquement via volume partagé.
Architecture
┌──────────────┐ ┌──────────────────┐ ┌──────────────┐ ┌────────────┐
│ User clique │ │ Core │ │ switcher │ │ Docker │
│ "Passer beta"│─▶│ écrit command.json│─▶│ sed .env │─▶│ daemon │
│ dans UI │ │ dans volume │ │ docker compose│ │ (recreate) │
└──────────────┘ └──────────────────┘ └──────────────┘ └────────────┘
│
▼
┌─────────────┐
│ result.json │ ◄── Core poll
└─────────────┘
Upgrade pour les installs existantes
Le sidecar est arrivé dans LoreMind 0.9.0. Pour les installs antérieures qui
ne l'ont pas dans leur docker-compose.yml, l'utilisateur doit faire une
dernière manipulation :
- Récupérer le nouveau
docker-compose.ymldu repo - Lancer
docker compose pull && docker compose up -d
Après ça, tous les switchs futurs se font depuis l'UI sans intervention CLI.
Pourquoi le switcher n'est PAS dans IMAGE_NAMESPACE
L'image du switcher est codée en dur (ghcr.io/igmlcreation/loremind-switcher)
plutôt que d'utiliser ${IMAGE_NAMESPACE}. Raison : pendant un switch, le
switcher exécute docker compose up -d. Si son propre image faisait partie
de IMAGE_NAMESPACE, le compose voudrait le recréer en même temps que
core/brain/web — et il se tuerait au milieu de sa propre commande. Race
condition fatale.
Pour la même raison, le docker compose up -d dans switch.sh cible
explicitement core brain web --no-deps — jamais le switcher lui-même.