GET /api/user/instances/:id ne retournait pas tags → champ vide dans le formulaire. Ajout du champ. Commit 8f7a522token_metadata, le mdp chiffre disparaissait. Fix: merge au lieu de remplacer. Commit 9ad24618567b64.answer. Commit 5842adf (connectors-front)connectors-api/searxng:latest). Commit d711ff5~/tasks/07-02-2026-20-22-fixes-connectors-searxng-sidecar.mdgpu_id par outil, active_tools per-GPU.bat dedie sur win11cmd /c wrapping pour .bat, detection auto outils deja en marche/api/gpu au chargement + pollingai_status() mis a jour pour format multi-GPU2327c62, mcp-claude-tools, dashboard-33800 e853836~/propositions/07-02-2026-21-00-multi-gpu-ai-orchestrator.md~/tasks/07-02-2026-17-35-multi-gpu-ai-orchestrator.md~/propositions/06-02-2026-21-58-modification-hardware-pve.md/ws/screencast sur browser-connector, CDP frames JPEG base64 en continuhttps://browser.33800.nowhere84.com (fix 404)202bf5a, connectors-front 962d88d~/tasks/05-02-2026-00-30-ws-screencast-canvas-interactions.md~/backlog/05-02-2026-scrapper-right-click.mdconnector_type_id absent du mapping GET /api/user/instances → endpoints jamais chargesconnector_type_id dans le retour instances (1 ligne)connector_type (nom) quand connector_type_id absent, dans new + edit (3 endroits)e26aa27 (api), a0ce369 (front) | Push main OK~/tasks/02-02-2026-21-00-fix-endpoint-loading-actions.mdparam_1 au lieu de '' (evite disparition)4f86faa | Push main OK~/tasks/02-02-2026-23-30-fix-ai-save-modal-inputschema.md/actions/[id]suggestCommand, testCommand, updateActiondf -h → correction → powershell.exe -Command "Get-PSDrive..." → succes9e3ad2c | Pipeline #686 success~/tasks/01-02-2026-22-13-boucle-correction-ia-actions.mdtrack() sur loc.params.id dans useVisibleTask$h-full au lieu de h-[calc(100vh-8rem)] + propagation hauteur layouth-screen overflow-hidden au lieu de min-h-screendd56de0, 12dd4de, 06efa9a | Pipelines #672-#674~/tasks/01-02-2026-17-00-fix-chat-ui-bugs.mdRemplacement du prompt LLM (~4500 tokens) par une detection d'intent deterministe (code pur) pour les appels aux connecteurs. Le LLM ne sert plus qu'a formater les resultats (~300 tokens).
Nouveaux fichiers :
intentDetector.ts : detection par mots-cles, 3 niveaux confiance (high/medium/none), resolution auto instanceintentExecutor.ts : execution directe API, prompts formatage/classification, YOLO multipartConnecteurs testes OK : jellyfin, web-search (SearXNG), scraper (Playwright), yolo (detection objets)
Upload fichiers dans le chat :
Fix session nocturne :
Fix session matin :
 + [Telecharger](url)Pipelines : API #640, #643-#651 success / Front #641 success Tests curl : tous OK (14/14) Tests navigateur : en attente (20 tests manuels a faire)
Task : ~/tasks/01-02-2026-00-30-intent-detection-layer-upload-fichiers.md
Ajout d'un bouton "Corriger" dans l'interface instance SSH quand le test d'une commande suggeree par l'IA echoue. Le bouton renvoie un prompt enrichi avec le contexte d'erreur (commande, exit code, stderr, stdout) pour obtenir une commande corrigee.
connectors-front :
aiRetryCount : compteur de correctionshandleAiRetry : prompt enrichi + rappel api.suggestCommand()btn-warning btn-xs) visible uniquement quand aiTestResult.success === false16caaf5 | Pipeline #597 : successAmelioration majeure de la gestion memoire et du mode d'affichage :
ai-orchestrator :
chat : utilise /api/chat Ollama avec format natif messages (role/content)418fc1aconnectors-api :
summary + RPC search_memory (pgvector cosine similarity)supabase.ts : methode rpc() pour appels fonctions PostgRESTaiChat.ts reecrit : format natif chat Ollama, auto-summarization (>15 msgs), RAG memoire vectorielle (nomic-embed-text), estimation tokens (budget 6000), sauvegarde memoire auto tous les 5 msgs4b9416econnectors-front :
aiChatExpandedd62c6efSidebar de chat IA integree a connectors-front. Conversations persistees Supabase, generation via Ollama/ai-orchestrator.
011_ai_chat.sql : tables ai_conversations, ai_messages, ai_memory, ai_attachmentsai-orchestrator (proxyFetch)Nouveau connecteur gemini dans connector-types.ts (7 endpoints) :
oauth-providers.ts : scopes Gemini retriever + Cloud Platform48b88e4 + 0af51244 endpoints manquants ajoutes au connecteur CalDAV :
PROPPATCH : modifier proprietes calendrier (nom, couleur, description)PUT/DELETE todo : CRUD complet sur les VTODOPROPFIND event ETag : verification sync sur ressource individuelle48b88e4Ajout de syncBuiltinTypes() dans registry.ts : synchronise les 31 CONNECTOR_TYPES definis dans connector-types.ts vers la table config en base au demarrage.
Systeme de credentials OAuth2 partages : un credential Google (client_id + secret + refresh_token) reutilisable sur toutes les instances Google (Drive, Sheets, Calendar, Gmail, CalDAV).
Backend :
010_oauth_credentials.sql : table oauth_credentials + FK sur user_connectorssrc/data/oauth-providers.ts : config statique Google (scopes, URLs)src/services/oauth.ts : CRUD credentials, flow OAuth2, auto-refresh tokensrc/services/instances.ts : support oauth_credential_idsrc/services/fetch.ts : auto-refresh token depuis credential partage/api/oauth/* dans index.tsFrontend :
/settings/oauth : gestion credentials (creer, autoriser, supprimer)/connect : modal selection credential OAuth pour connecteurs GoogleFixes appliques :
Response.redirect() au lieu de set.redirect ElysiaFeature public_paths dans smart-deploy (nginx.sh + parse-yaml.sh) : permet de bypasser les restrictions IP pour certains chemins (OAuth callback, health). Utilise parse_yaml_list() pour lire les listes YAML.
Le bouton retour depuis /connectors/[id]/test/[endpoint] ramenait sur la page connector type au lieu de la page instance. Fix : passage instance ID en query param ?instance=<id>.
Ajout d'un assistant IA sur Connectors Hub utilisant Ollama via ai-orchestrator :
Backend (connectors-api) :
src/services/ai.ts : suggestCommand, buildContext, buildSystemPrompt, pollJobResultPOST /api/ai/suggest-command : suggere une commande depuis un prompt en langage naturelPOST /api/ai/test-command : teste une commande sur une instance SSHFrontend (connectors-front) :
Fix applique : format input_params ai-orchestrator (temperature/max_tokens au premier niveau, system prompt separe, lecture output_result.response)
Test OK : "voir les containers docker en cours" -> docker ps en ~300ms
resolved_path manquait du schema de reponse Elysia pour /api/ssh/sftp/list. Elysia filtrait ce champ, empechant la navigation Windows (remonter aux lecteurs).
Test creation + execution action API Jellyfin System Info : fonctionne en 119ms.
28-01-2026-actions-input-params.mdconnectors-actions-routines.md (Phase 2)Pages frontend créées pour les Actions :
/actions - Liste avec filtres et exécution/actions/templates - Sélection de templates/actions/new - Création action custom/actions/[id] - Détails + exécution/actions/[id]/edit - Édition/actions/[id]/history - Historique d'exécutionProbleme : Port 5400 conflit + VPN cassé après redéploiement
Solution finale :
network_mode: container:wireguard-sidecar dans smart-deploynetwork_mode ajouté dans strategies/docker.shArchitecture :
wireguard-sidecar (docker-compose)
└── expose 5403, 5410
└── reseau supabase-prod
connectors-api (smart-deploy)
└── network_mode: container:wireguard-sidecar
└── SUPABASE_URL: http://192.168.1.12:8200
Pipeline #520 OK - Health: ok, Database: connected
Page detail instance /connectors/instance/[id]/ avec :
Templates SSH : Uptime, Disk, Memory, Docker ps, Top, Logs Templates Jellyfin : Films, Séries, Récents, Sessions, System info Templates Proxmox : Nodes, VMs, Storage Templates AI : Status GPU, Tools, Jobs
Page live monitoring CI/CD : gitlab-jobs.html
URL : https://dashboard.nowhere84.com/gitlab-jobs.html
wireguard-connectors-integration (HAUTE) :
sidecar: dans smart-deployCréation d'un serveur MCP pour donner à Claude Code un accès direct aux services.
Repo : https://gitlab.33800.nowhere84.com/gouroubleu/mcp-claude-tools
| Outil | Description |
|---|---|
memory_search |
Recherche sémantique mémoire vectorielle |
memory_namespaces |
Stats namespaces |
connector_fetch |
Appeler APIs via Connectors Hub |
connector_list |
Liste connecteurs/instances |
ssh_execute |
Commandes SSH distantes |
notify_send |
Notifications push/mail |
ai_job |
Jobs AI Orchestrator |
ai_status |
Status GPU/queue/outils |
ai_job_status |
Status d'un job |
| Instance | Host |
|---|---|
| PVE-SSH | 192.168.1.4 |
| prod-portainer-SSH | 192.168.1.12 |
| nginx-SSH | 192.168.1.104 |
| win11-SSH | 192.168.1.30 |
| gitlab-SSH | 192.168.1.196 |
~/.claude/settings.jsonPour activer : Relancer Claude Code
Bug : parse_yaml_section créait CFG_nginx_domain mais le code cherchait CFG_domain
Impact : Toutes les configs nginx ont été créées manuellement depuis toujours
| Fichier | Modification |
|---|---|
| smart-deploy.sh | 4x CFG_domain → CFG_nginx_domain |
| lib/nginx.sh | 1x dans resolve_domain() |
| lib/parse-yaml.sh | Documentation convention nommage |
Test : Redéploiement claude-memory-front → memory.33800.nowhere84.com.conf créée automatiquement
Bug : Dashboard affichait "Généré le 24 janvier" malgré cron OK
Cause : services-registry.json owned by root → git add échouait silencieusement
Fix : Ajout chown -R gouroubleu:gouroubleu *.json data/ avant git add dans generate.sh
| Problème | Cause | Solution |
|---|---|---|
| Watcher ne détectait rien | inotify ne fonctionne pas sur NFS | PollingObserver(timeout=60) |
| Volumes manquants | conf.prod utilisé, pas docker-compose | Ajout 7 volumes en format virgules |
| Secret non injecté | Format secrets: non supporté |
Utiliser @VAR dans env: |
| Stale file handle | Montage fichiers individuels | Monter dossier /data/claude/ |
volumes: "/mnt/.../memory:/data/memory:ro,/mnt/.../claude:/data/claude:ro,..."
env:
SUPABASE_SERVICE_KEY: "@SUPABASE_PROD_SERVICE_ROLE_KEY"
Probleme : generateBodyTemplate is not defined sur pages try-it
Cause : Fonction declaree avec const apres son utilisation (hoisting)
Fix : Deplace la fonction avant useVisibleTask$
Commit : ba1c4a0 (connectors-front)
| Instance | Status | Credentials |
|---|---|---|
| Proxmox | OK | PVEAPIToken configuré |
| Supabase | OK | Service role key |
| Mailjet | OK | API key:secret |
| Nextcloud | OK | App password Gouroubleu:LwcPr-QpJJC... |
proxyFetch.execute recevait body.instance (undefined) au lieu de instanceName resoluOCS-APIRequest: trueextra_headers n'existait pas dans connectors.configDemande utilisateur : "faut l'ajouter de maniere global on sait jamais d'autre pourrait en avoir besoin"
| Action | Detail |
|---|---|
| DB | ALTER TABLE connectors.config ADD COLUMN extra_headers JSONB |
| Nextcloud | UPDATE SET extra_headers = '{"OCS-APIRequest": "true"}' |
| Type | Ajout extra_headers: Record<string, string> | null dans ConnectorConfig |
| fetch.ts | if (connector.extra_headers) Object.assign(headers, connector.extra_headers) |
| Commit | Description |
|---|---|
| ba1c4a0 | Fix generateBodyTemplate hoisting (front) |
| 039b220 | Add extra_headers support initial |
| 64f1c61 | Fix default instance credentials |
| 40705bb | Remove hardcoded header, use DB |
| f6f1d59 | Add extra_headers to ConnectorConfig type |
| Connecteur | Resultat |
|---|---|
| GitHub | 4/4 OK |
| Jellyfin | 5/5 OK |
| Proxmox | 5/5 OK |
| Supabase | 3/3 OK |
| Mailjet | 3/3 OK |
| Nextcloud | 3/3 OK |
~/backlog/connectors-endpoints-audit.md - Audit complet des endpoints~/backlog/connectors-actions-routines.md - Vision Actions & Routines (type n8n)Problème : Smart-deploy ne créait jamais les configs nginx automatiquement
Cause : parse_yaml_section crée CFG_nginx_domain mais le code cherchait CFG_domain
Impact : Toutes les configs nginx ont été créées manuellement depuis toujours
| Fichier | Modification |
|---|---|
| smart-deploy.sh | 4 occurrences CFG_domain → CFG_nginx_domain |
| lib/nginx.sh | 1 occurrence dans resolve_domain() |
| lib/parse-yaml.sh | Documentation convention nommage ajoutée |
8d2449c : fix: use CFG_nginx_domain instead of CFG_domainfc09639 : docs: document parse_yaml_section variable naming conventionRedéploiement claude-memory-front → memory.33800.nowhere84.com.conf créée automatiquement à 22:58
Problème : Dashboard affichait "Généré le 24 janvier"
Cause : services-registry.json owned by root → git add échouait silencieusement
Fix : chown gouroubleu:gouroubleu + commit manuel
| Namespace | Contenu | Fichiers |
|---|---|---|
| claude | ~/.claude/memory/*.md | 23 |
| claude-md | CLAUDE.md | 1 |
| status | STATUS.md | 1 |
| propositions | ~/propositions/*.md | ~50 |
| tasks | ~/tasks/*.md | ~80 |
| backlog | ~/backlog/*.md | ~30 |
| docs | ~/docs/*.md | ~30 |
| scripts | ~/scripts/*.sh | ~20 |
Stats : 3734 chunks, 235 fichiers indexés
/watcher/status, /watcher/restartFonctionnalités :
Problème : Plus de notifications depuis le 25/01
Cause : notif-logger et apprise sur réseaux Docker différents
Fix : docker network connect notifications_notifications notif-logger
Problème : Dashboard affichait "Généré le 24 janvier" malgré cron OK
Cause : services-registry.json owned by root → git add échouait silencieusement
Fix : chown gouroubleu:gouroubleu + commit manuel
Objectif : Remplacer grep par recherche sémantique vectorielle pour éviter perte d'info après compression contexte.
┌─────────────────────────────────────────────────────────────────┐
│ CLAUDE MEMORY SYSTEM │
│ │
│ 8 namespaces (memory, propositions, tasks, backlog, docs...) │
│ │ │
│ ▼ │
│ ┌─────────────────┐ callbacks ┌──────────────────┐ │
│ │ claude-memory │◄─────────────────►│ ai-orchestrator │ │
│ │ :5510 │ │ :5501 │ │
│ └────────┬────────┘ └────────┬─────────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌─────────────────┐ ┌──────────────────┐ │
│ │ Supabase PROD │ │ Ollama (win11) │ │
│ │ claude_memory │ │ nomic-embed-text │ │
│ └─────────────────┘ └──────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ claude-memory- │ │
│ │ front :5511 │ │
│ └─────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
| Service | Port | Description |
|---|---|---|
| claude-memory | 5510 | API recherche vectorielle |
| claude-memory-front | 5511 | Interface web Qwik |
| ai-orchestrator | 5501 | Queue jobs Ollama |
| supabase-rest-prod | - | Schema claude_memory exposé |
| Endpoint | Méthode | Description |
|---|---|---|
| /health | GET | Status service |
| /stats | GET | Chunks, fichiers, dernière sync |
| /search | POST | Recherche sémantique |
| /namespaces | GET | Liste namespaces avec stats |
| /namespaces/{ns}/sync | POST | Sync un namespace (reset=true) |
| /watcher/status | GET | Status file watcher |
| /callback/{job_id} | POST | Réception résultats ai-orchestrator |
Commits déployés sur connectors-front :
| Commit | Description |
|---|---|
0291648 |
Fix audit logs UUID bug - utilisait le type name au lieu de l'UUID |
d1667a7 |
Validation des paramètres requis dans tryit form |
9c7e2c9 |
Exemples d'utilisation adaptés au type de connecteur |
375627e |
Terminal popup: tmux optionnel + alerte fermeture |
2fda568 |
Terminal fullscreen (fixed positioning, z-9999) |
Commit connectors-api :
| 4130b13 | Remove invalid /Users/Me endpoint from Jellyfin |
Tryit form - Validation paramètres requis
/Items/Latest (userId requis) et /Search/Hints (searchTerm requis)Exemples d'utilisation par type de connecteur
/Users, /System/Info, /Search/Hints/nodes, /nodes/pve/qemu, /cluster/status/endpoints, /docker/containers/json, /stacks/projects, /user, /pipelinesTerminal popup amélioré
beforeunload si session active à la fermeturefixed inset-0 z-[9999] - bypass le layout parentObjectif : Système de profils VPN WireGuard réutilisables pour instances SSH
Solution finale : Stack Docker unifiée avec network namespace partagé
┌─────────────────────────────────────────────────────┐
│ connectors-stack │
│ ┌────────────────────────────────────────────────┐ │
│ │ wireguard-sidecar │ │
│ │ - WireGuard API :5410 │ │
│ │ - Ports exposés: 5400, 5410 │ │
│ │ - Tunnels: wg-{instanceId} │ │
│ │ │ │
│ │ connectors-api (network_mode: service:...) │ │
│ │ - Partage namespace réseau du sidecar │ │
│ │ - Accès direct aux tunnels VPN │ │
│ └────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘
L'ancienne architecture avait 2 containers séparés sur le même réseau Docker mais avec des namespaces réseau différents. Le tunnel VPN créé dans le sidecar n'était pas accessible depuis connectors-api.
Solution : network_mode: "service:wireguard-sidecar" permet à connectors-api de partager le stack réseau du sidecar et d'utiliser ses tunnels VPN directement.
| Fichier | Chemin |
|---|---|
| docker-compose.yml | /home/gouroubleu/apps/connectors-stack/ |
| .env | /home/gouroubleu/apps/connectors-stack/ |
# SSH via VPN vers serveur Rhinov
curl -X POST 'http://localhost:5400/api/ssh/execute' \
-d '{"instance_id":"67beec52...","command":"whoami"}'
# Résultat: {"success":true,"stdout":"rhinov\nWireguard-Begles\n"}
| Variable | Usage |
|---|---|
SSH_ENCRYPTION_KEY |
Chiffrement AES-256 passwords/keys |
WIREGUARD_SIDECAR_URL |
http://localhost:5410 (même namespace) |
Task : /home/gouroubleu/tasks/27-01-2026-21-30-vpn-profiles-final.md
Objectif : Permettre a chaque instance SSH de configurer un tunnel VPN WireGuard
Architecture : Sidecar WireGuard
connectors-api (5400) --HTTP--> wireguard-sidecar (5410) --WireGuard--> Peers
| Projet | Pipeline | Status |
|---|---|---|
| wireguard-sidecar | #459 | SUCCESS |
| connectors-api | #457 | SUCCESS |
| connectors-front | #458 | SUCCESS |
| smart-deploy | (push direct) | Merged |
| Fichier | Description |
|---|---|
connectors-api/src/services/wireguard.ts |
Service VPN (generate keys, configure, connect, disconnect, status) |
wireguard-sidecar/app.py |
FastAPI sidecar exposant API REST pour WireGuard |
wireguard-sidecar/Dockerfile |
Python Alpine + wireguard-tools |
connectors-front/src/components/VpnConfig.tsx |
UI config VPN pour instances SSH |
| Endpoint | Methode | Description |
|---|---|---|
/api/instances/:id/vpn/generate-keys |
POST | Genere paire de cles |
/api/instances/:id/vpn |
PUT | Configure VPN |
/api/instances/:id/vpn/connect |
POST | Demarre tunnel |
/api/instances/:id/vpn/disconnect |
POST | Arrete tunnel |
/api/instances/:id/vpn/status |
GET | Status tunnel |
cap_add, devices, sysctls pour containers privilegiesvolumes: top-level pour named volumesdocker: dans conf.gouroubleu.ymlTask : /home/gouroubleu/tasks/27-01-2026-13-30-wireguard-vpn-per-instance.md
Objectif : Permettre de tester les endpoints API + terminal SSH persistant
| Element | Details |
|---|---|
| Route | /connectors/[id]/test/[endpoint] |
| Fonctionnalites | Formulaire dynamique (Path/Query/Headers/Body), execution, resultat JSON |
| Bouton | Ajoute sur les 3 pages (connector, public, instance) |
| Menu contextuel | Clic droit sur endpoint -> Tester / Copier path |
Fichiers modifies :
src/lib/api.ts : Support query et headers dans fetch()src/routes/connectors/[id]/index.tsxsrc/routes/connectors/public/[type]/index.tsxsrc/routes/connectors/instance/[id]/index.tsxsrc/routes/connectors/[id]/test/[endpoint]/index.tsx (NEW)| Element | Details |
|---|---|
| Route | /connectors/instance/[id]/terminal |
| Fonctionnalites | Plein ecran, tmux pour persistance, toggle on/off |
| Detection | Si tmux non installe -> instructions d'installation |
Backend modifie :
ssh.ts : createShell() avec option useTmuxindex.ts : WebSocket accepte ?tmux=truessh.shell_input dans l'audit| Probleme | Solution |
|---|---|
| Disque plein prod-portainer (100%) | docker system prune -af --volumes -> 57% |
| Pipeline echouee ENOSPC | Relancee apres nettoyage -> SUCCESS |
Pipelines : #455 (connectors-front) SUCCESS
Task : /home/gouroubleu/tasks/27-01-2026-02-31-connectors-tryit-terminal-tmux.md
Problème : SSH "All configured authentication methods failed" malgre credentials corrects
Cause identifiee : Le serveur SSH 192.168.1.12 avait PasswordAuthentication no dans /etc/ssh/sshd_config
Solution appliquee : Active PasswordAuthentication yes sur le serveur
Note : L'option "auto-certif" du connecteur SSH genere une cle SSH et l'installe automatiquement - plus securise que l'auth par mot de passe.
Backlog mis a jour : /home/gouroubleu/backlog/26-01-2026-ssh-improvements.md
Objectif : Séparer les logs par instance (Jellyfin Perso vs Famille) + améliorations UI
| Fichier | Modification |
|---|---|
src/index.ts |
Audit log avec instance name + auto-résolution default |
src/services/audit.ts |
Méthode countByInstance() |
/api/user/instances |
Retourne logs_count par instance |
| Fichier | Modification |
|---|---|
routes/index.tsx |
Cards cliquables, affiche type, compteur requêtes |
routes/layout.tsx |
Suppression mini-menu |
routes/connectors/instance/[id]/index.tsx |
Accordéons endpoints/logs, filtre par instance |
routes/connectors/public/[type]/index.tsx |
Accordéons endpoints/logs |
{container="connectors-api"} |= "fetch.execute"instance, user_id, connector, method, pathTask : /home/gouroubleu/tasks/26-01-2026-20-23-connectors-multi-instance-logs.md
Objectif : Ajouter connecteurs pour tous les services internes utilisés
| Nom | Type | Auth | Endpoints | Status |
|---|---|---|---|---|
| jellyfin | jellyfin | api_key (X-Emby-Token) | 18 | ✅ Testé |
| ai-orchestrator | ai-orchestrator | none | 17 | ✅ Testé |
| yolo | yolo | none | 4 | ✅ Testé |
| supabase | supabase | api_key (apikey) | 15 | Prêt |
| proxmox | proxmox | custom (PVE Token) | 18 | Prêt |
| nextcloud | nextcloud | basic | 12 | Prêt |
| Bug | Fix |
|---|---|
description: null rejeté par Elysia |
t.Union([t.String(), t.Null()]) |
| Endpoints enrichis non retournés | Ajout champs au schéma response |
| Front n'affichait pas les détails | Refacto en accordéons |
| Appels /api/fetch non loggés | Ajout audit.log() dans endpoint |
| Services sans auth échouaient | Ajout auth_type: none |
58f2d19 fix: skip TLS verification for internal network URLs
91d6f37 fix: accept self-signed certificates for internal services
a8f2686 feat: add YOLO, Supabase, Proxmox, Nextcloud connector types
af9d539 feat: add auth_type 'none' for services without auth
6fff6a9 feat: log fetch.execute calls to audit trail
404deed fix: allow null description in connectors list response
238da78 feat: add Jellyfin and AI Orchestrator connectors
09b1fb4 fix: add enriched fields to endpoint response schema
| Connecteur | Status |
|---|---|
| jellyfin | ✅ API key (X-Emby-Token) |
| ai-orchestrator | ✅ Pas d'auth (none) |
| yolo | ✅ Pas d'auth (none) |
| supabase | ✅ service_role_key |
| proxmox | ✅ API Token PVE |
| nextcloud | ⚠️ User non créé |
Task : /home/gouroubleu/tasks/25-01-2026-22-00-connectors-jellyfin-ai-orchestrator.md
Objectif : Connecteurs typés avec endpoints prédéfinis + connecteurs automatiques (recherche web, scraper)
Problème : Endpoints vides car découverte par user (pas global)
Solution : CONNECTOR_TYPES avec endpoints prédéfinis dans le code
type ajouté à connectors.config (séparé du name)GET /connectors/:id/endpoints retourne les endpoints du type directement (pas de BDD)Types prédéfinis (6 total) : | Type | Endpoints | Version API | |------|-----------|-------------| | github | 35 | 2022-11-28 | | linkedin | 7 | v2 (202401) | | mailjet | 17 | v3.1 | | o2switch | 20 | UAPI (cPanel 118) | | web-search | 3 | SearXNG 2024 | | scraper | 4 | Playwright 1.x |
Container : searxng sur prod-portainer (port 8888)
URL : https://search.33800.nowhere84.com
Config : /home/gouroubleu/apps/searxng/
# Test recherche JSON
curl "https://search.33800.nowhere84.com/search?q=test&format=json"
Nouveaux endpoints :
POST /scrape - Scrape JSON (JSONPath) ou HTML (CSS/XPath)POST /screenshot - Capture PNGPOST /pdf - Génère PDF# Scrape version Node.js
curl -X POST https://browser.33800.nowhere84.com/scrape \
-d '{"url":"https://nodejs.org/dist/index.json","jsonPath":"$[0].version"}'
# → {"data":"v25.4.0"}
# Scrape titre HTML
curl -X POST https://browser.33800.nowhere84.com/scrape \
-d '{"url":"https://example.com","selector":"h1"}'
# → {"data":"Example Domain"}
Pour connecteurs sans type prédéfini :
POST /api/connectors/:id/endpoints - Créer endpointPUT /api/endpoints/:id - ModifierDELETE /api/endpoints/:id - Supprimerconnectors-api (6 commits) :
browser-connector (1 commit) :
Problème : dashboard.nowhere84.com inaccessible depuis le réseau local 33800
Cause : O2switch voit l'IP publique (82.65.119.221), pas l'IP privée (192.168.1.x). Le .htaccess autorisait 192.168.1.0/24 mais c'est inutile pour O2switch.
Fix : Mis à jour sync-allowed-ips.sh pour ajouter automatiquement les IPs publiques 33800 :
82.65.119.221 (IPv4 publique Freebox)2a01:e0a:2c:a320::/64 (IPv6 33800)Fichiers modifiés :
/stock_8to/33800-stack/scripts/security/sync-allowed-ips.sh~/.claude/memory/acces-reseau.mdTest : curl -sI https://dashboard.nowhere84.com → HTTP 200 ✅
| Wildcard | A (IPv4) | AAAA (IPv6) |
|---|---|---|
*.33800.nowhere84.com |
82.65.119.221 | 2a01:e0a:2c:a320::1 |
*.86000.nowhere84.com |
82.67.42.47 | 2a01:e0a:fb8:78c0::1 |
Commande utilisée (UAPI cPanel) :
uapi DNS mass_edit_zone zone=nowhere84.com serial=... add-0='{"dname":"*.86000","ttl":14400,"record_type":"A","data":["82.67.42.47"]}'
Prochaines étapes pour 86000 :
*.86000.nowhere84.comLe préfixe IPv6 de 33800 (2a01:e0a:2c:a320::/64) n'était pas dans les IPs autorisées.
Ajouté à :
/etc/nginx/snippets/allowed-ips.conf.htaccess (via sync script)Problèmes découverts et corrigés :
| Problème | Étendue | Correction |
|---|---|---|
| O2switch PUBLIC | dashboard, claude, status | .htaccess créés |
| Nginx sans restriction | 48 configs | allow/deny ajoutés |
| Mémoire incorrecte | pihole-split-dns.md | Réécrit entièrement |
Raph (ami Poitiers) ajouté :
Fichiers modifiés :
Commits :
6227383 feat(nginx): add Raph (86000) IPs to private templateAutomatisation mise en place :
/etc/nginx/snippets/allowed-ips.confinclude (plus de duplication)/stock_8to/33800-stack/scripts/security/sync-allowed-ips.shMémoire mise à jour :
raph-86000.md : Infos Raph + procédure automatisationfreebox.md : API Freebox, VPN WireGuard, port forwardingpihole-split-dns.md : Corrigé (Pi-hole ≠ protection externe)Leçon apprise :
allow/deny) + .htaccess O2switchObjectif : Rendre l'API connectors-hub autonome et complète
Phases terminées :
| Phase | Contenu | Status |
|---|---|---|
| Phase 2 | Auto-discovery | ✅ Déployé |
| Phase 3 | Audit logs | ✅ Déployé |
| Phase 4 | Versioning endpoints | ✅ Déployé |
Nouveaux services :
src/services/autodiscovery.ts - Recherche intelligente swagger + exploration endpointssrc/services/audit.ts - Tracking toutes les actionssrc/services/versioning.ts - Historique versions + rollbackNouveaux endpoints :
| Endpoint | Usage |
|----------|-------|
| POST /api/connectors/:id/rediscover | Relancer discovery |
| GET /api/audit/logs | Liste logs avec filtres |
| GET /api/audit/stats | Statistiques |
| GET /api/connectors/:id/logs | Logs d'un connecteur |
| GET /api/endpoints/:id/versions | Historique versions |
| POST /api/endpoints/:id/rollback/:v | Rollback |
| GET /api/endpoints/:id/diff/:v1/:v2 | Diff entre versions |
Migrations SQL :
002_audit_logs.sql - Table audit_logs avec indexes003_endpoint_versions.sql - Table endpoint_versions + colonne current_versionPipelines :
Version : 2.5.0
Prochaine étape : Phase 5 - Front Qwik séparé (connectors-front)
Proposition mise à jour : /home/gouroubleu/propositions/25-01-2026-15-00-connectors-hub-v3.md
Task : /home/gouroubleu/tasks/25-01-2026-14-10-connectors-api-phases-2-3-4.md
Résultat : POC concluant, roadmap établie pour la suite
Documents créés :
/home/gouroubleu/tasks/25-01-2026-23-00-qig-etat-des-lieux.md/home/gouroubleu/propositions/26-01-2026-qig-roadmap.mdPoints clés documentés :
Utilisation des docs API :
connectorService.getSchema() existe mais retourne souvent {}{} dans le code)Composants dynamiques vs fixes :
Forms fonctionnels :
handleSubmit existe et appelle fetchService.executeOptions identifiées pour demain : | Option | Description | Effort | |--------|-------------|--------| | A | Améliorer schema discovery (connectors-hub) | MOYEN-ÉLEVÉ | | B | Parser OpenAPI on-the-fly | MOYEN | | C | Base de connaissances API statique | FAIBLE initial | | D | Hybrid LLM + Schema hints | FAIBLE-MOYEN | | E | Focus POC simple | MINIMAL |
Recommandation : Option E + D progressif (finir POC, puis enrichir KNOWN_ENDPOINTS avec schemas)
Problèmes résolus :
/users/search au lieu de /search/usersFixes appliqués :
| Fichier | Modification |
|---|---|
src/lib/connector/client.ts |
Ajout search dans KNOWN_ENDPOINTS + resolveEndpoint gère action search |
src/lib/ollama/prompts.ts |
Ajout search_term dans le prompt intent |
src/lib/ui-spec/types.ts |
Ajout champ search_term dans Interface Intent |
src/routes/index.tsx |
Ajout ?q=search_term + extraction data.items pour search results |
src/lib/ui-spec/normalize.ts |
Normalisation colonnes {name,field} → {id,label,type} |
GUIDELINES.md |
Documentation Search API et learnings |
Commits :
8e583cb feat: normalize DisplaySpec from Ollama responses8db7353 feat: add search endpoints support for GitHubPipeline : #346 SUCCESS
Problème : Le health check échouait sur les apps Qwik qui retournent du HTML sur /
Causes :
jq retournait chaîne vide sur HTML (pas "unknown")store_health_data crashait avec set -eo pipefail sur jq errorFixes :
| Fichier | Modification |
|---------|--------------|
| lib/health.sh | Vérifie si JSON valide avant parsing, HTTP 200 = healthy si non-JSON |
| lib/health.sh | store_health_data : stocke status simple si non-JSON, || true pour éviter pipefail |
Commits (smart-deploy) :
dcf9c0e fix: handle non-JSON responses in health checkb834edd fix: prevent pipefail crash in store_health_dataProblèmes identifiés :
data.job, API retourne {job_id, status}Fixes appliqués :
| Fichier | Modification |
|---------|--------------|
| src/lib/ollama/client.ts | Adapter structure réponse API (job_id → id) |
| src/routes/index.tsx | Bloquer si non auth + message warning + bouton disabled |
Commit : 0870da5 fix: API response structure + require auth
Pipeline : #336 (health check timeout mais container healthy)
Proposition : /home/gouroubleu/propositions/25-01-2026-00-10-qig-fix-jobs-auth.md
private: true dans Smart-Deploy ✅ IMPLÉMENTÉProblème identifié : QIG et connectors-api étaient accessibles publiquement Fix manuel appliqué : Restrictions IP ajoutées dans nginx configs
Implémentation Smart-Deploy :
| Fichier | Modification |
|---------|--------------|
| /scripts/deploy/lib/nginx.sh | Ajout CFG_nginx_private (default: true) |
| /scripts/nginx/generate.sh | Ajout paramètre $7 private |
| QIG conf.prod.gouroubleu.yml | Ajout nginx.private: true |
| connectors-api conf.prod.gouroubleu.yml | Ajout nginx.private: true |
Comportement :
private: true (défaut) → restrictions IP allow 192.168.1.0/24; deny all;private: false → accessible publiquementCommits pushés :
bbc3b17 feat(nginx): add private option with true as defaultf2478dc chore(nginx): add private: truee50cc70 chore(nginx): add private: trueProposition : /home/gouroubleu/propositions/24-01-2026-21-10-smart-deploy-private-option.md → ✅ IMPLÉMENTÉ
Commits :
accf18e feat: Phase 3 - Display mode for read/list actionse40626d fix: QRL serialization in DisplayRendereraa53327 fix: Move isDisplayAction to module level for serializationNouveaux composants :
DisplayRenderer.tsx - Dispatcher principal avec pagination/triTableDisplay.tsx - Affichage tableauCardsDisplay.tsx - Grille de cartesListDisplay.tsx - Liste verticaleDetailDisplay.tsx - Vue détail itemFlux display :
"Lister mes repos GitHub" → Intent (action=list) → Fetch API → DisplaySpec → Rendu auto
Types ajoutés : DisplaySpec, DisplayType, Column, ItemTemplate, DisplayRelation, etc.
URL: https://qig.33800.nowhere84.com (RÉSEAU LOCAL UNIQUEMENT) GitLab: https://gitlab.nowhere84.com/gouroubleu/qwik-interface-generator Port: 5505 Container: qwik-interface-generator (prod-portainer) - healthy
Refonte complète du générateur d'interfaces :
Vision : Fin des frontends. Juste des APIs + ce générateur.
Architecture :
Input naturel → Ollama (intention) → Ollama (UISpec) → Qwik SSR → Micro-bundles
↓
connectors-hub /api/fetch
Fonctionnalités :
Qwik exploité correctement :
q:container="paused")Tests Ollama Live RÉUSSIS (24/01/2026 19:30) :
| Test | Temps | Résultat |
|------|-------|----------|
| Intent Analysis | ~20s | ✅ {"connector": "gitlab", "action": "create", "entity": "projet"} |
| UISpec Generation | ~8s | ✅ Formulaire 2 groupes, 6 champs |
Commits :
00bbb52 feat(v2): Universal Interface Generator with Ollama323378a fix: Switch to Qwik City Express adapter for SSR91a72cf fix: Rename config files to .cjs for ESM compatibilityd0a5264 fix: Add undici to production dependenciesPipeline : #329 - Build OK, container healthy
Proposition : /home/gouroubleu/propositions/24-01-2026-18-22-qig-v2-architecture.md
Task : /home/gouroubleu/tasks/24-01-2026-18-41-qig-v2-universal-interface.md
Prochaines étapes :
URL: https://connectors.33800.nowhere84.com Swagger: https://connectors.33800.nowhere84.com/swagger Pipeline: #330 SUCCESS
Hub centralisé pour authentification, proxy fetch et schema discovery.
Nouvelles fonctionnalités v2.4.0 (Phase 1 QIG):
Discovery System:
v2.3.0 (precedent):
User account créé:
Connecteurs configurés (migrés vers gouroubleu@gmail.com): | Connecteur | Auth Type | Status | |------------|-----------|--------| | github | bearer | ✅ Connecté | | mailjet | basic | ✅ Connecté | | o2switch | custom (cPanel) | ✅ Connecté | | linkedin | oauth2 | ⏳ OAuth requis |
Endpoints principaux: | Endpoint | Usage | |----------|-------| | POST /api/fetch | Proxy fetch - Appeler n'importe quelle API | | POST /api/auth/login | Connexion (retourne JWT) | | POST /api/auth/register | Inscription | | GET /api/auth/me | Profil utilisateur | | GET /api/connectors | Liste connecteurs + statut | | POST /api/user/connectors/:id/token | Définir son token |
Exemple /api/fetch:
{
"connector": "github",
"method": "GET",
"path": "/user/repos"
}
Commits: b2fa8ca (auth endpoints), e2ec8bc (swagger complet)
Task: /home/gouroubleu/tasks/24-01-2026-14-50-connectors-hub-auth.md
Backlog évolution: /home/gouroubleu/backlog/24-01-2026-connectors-hub-evolution.md
URL : https://qig.33800.nowhere84.com GitLab : https://gitlab.nowhere84.com/gouroubleu/qwik-interface-generator Port : 5505 Container : qwik-interface-generator (prod-portainer)
Générateur d'interfaces UI à partir de Swagger/OpenAPI.
MVP Fonctionnel :
Composants créés (pour Phase 2) :
Prochaines étapes (Phase 2) :
Task : /home/gouroubleu/tasks/24-01-2026-17-30-qig-deployment-complete.md
Backlog : /home/gouroubleu/backlog/24-01-2026-qwik-interface-generator.md
Objectif : Permettre de mettre en pause le traitement des jobs IA pour libérer le GPU (gaming)
Comportement :
Endpoints API : | Endpoint | Usage | |----------|-------| | GET /api/worker/status | État du worker (running/paused) | | POST /api/worker/pause?stop_tools=true | Pause + arrête outils (libère VRAM) | | POST /api/worker/resume | Reprend le traitement (outils auto-start) |
Dashboard : https://dashboard.nowhere84.com/ai-jobs.html
Commits :
332d0bc Add worker pause/resume systemd71d938 Fix: auto-start tools before processing jobscb4b474 Fix: stop tools based on health checkIncident résolu : 5232 jobs avaient échoué après un test de pause car Ollama n'avait pas redémarré → corrigé et jobs relancés
Stats NeedFinder actuelles : | Élément | Valeur | |---------|--------| | Posts analysés | 18,647 | | Needs détectés | 16,583 | | Queue restante | ~88K jobs |
Objectif : Faire un état des lieux des projets récemment modifiés (webhooks, affichage)
Résultats :
| Élément | Constat |
|---|---|
| Container | était unhealthy (API OK) |
| Cause | type: "node" dans config (app Python) |
| Fix | type: "python" → Pipeline #287 SUCCESS |
| Status final | healthy ✅ |
Webhooks ajoutés (commits récents) :
a4aa249 Enhance webhook payload with full job data9177ab1 Add webhook callback support for job completion| Élément | Valeur |
|---|---|
| Container | healthy ✅ |
| Posts collectés | 158,897 |
| Needs détectés | 510 |
| Non traités | 158,379 |
| Sources | Reddit 158K, HN 187 |
Problème initial : 158K posts non traités, analyse synchrone (25/6h)
Solution implémentée :
Post → Submit job (status=submitted) → Webhook analyse → Need créé → Webhook traduction → FR
| Endpoint | Usage |
|---|---|
| POST /api/analyze/all | Lance traitement complet (background) |
| POST /api/analyze/async?batch=N | Soumet N posts |
| GET /api/analyze/stats | Stats pending/submitted/completed/failed |
| POST /api/webhook/analysis | Reçoit résultats analyse |
| POST /api/webhook/translation | Reçoit résultats traduction |
Commits : 9bc45a3, c4a9164, 096fd1d, fccbdab
Traitement lancé : 23/01/2026 23:50 - batch=500
Progression (24/01/2026 00:35) : | État | Count | % | |------|-------|---| | pending | 140,363 | 88.3% | | submitted | 15,638 | 9.8% | | completed | 2,262 | 1.42% | | failed | 667 | 0.4% |
Needs créés : 2,176 | Non traduits : 1,959
Optimisation : 2 jobs Ollama en parallèle (réduit de 3 pour thermal GPU)
| Critère | Valeur |
|---|---|
| OLLAMA_NUM_PARALLEL | 3 (configuré sur win11) |
| Worker parallel batch | 2 jobs simultanés (était 3, réduit pour thermal) |
| Modèles exclus | 70b, 32b, 8x7b, mixtral (restent séquentiels) |
Commits : 07192dd (3 parallel), bbe2e19 (réduit à 2)
Modification : Affiche tous les jobs en cours (pas juste 1)
Fix O2switch : Permissions assets corrigées (403 sur style.css)
chmod 644 dans post-receive hookFix NeedFinder Dashboard :
generate-needfinder.sh pointait sur DEV (.51) → corrigé vers PROD (.12)Fix services-registry.json : Owned by root → chown gouroubleu
Estimation : ~27h restantes (2 parallel au lieu de 3)
Objectif : Migrer NeedFinder de DEV vers PROD et passer le dashboard en données live
Résultat :
| Étape | Status |
|---|---|
| Backup données DEV (794 KB) | ✅ |
| Création schema needfinder sur PROD | ✅ |
| Restauration données (450 posts, 295 needs) | ✅ |
| conf.prod.gouroubleu.yml créé | ✅ |
| Merge develop → main | ✅ |
| Pipeline #272 | ✅ SUCCESS |
| Container prod-portainer:5200 | ✅ healthy |
| Changement | Avant | Après |
|---|---|---|
| Fichier | 3747 lignes (hardcodé) | 707 lignes (API) |
| Données | Statiques (générées) | Live depuis API |
| Stats | Figées | Temps réel |
| Element | Action |
|---|---|
Database needfinder |
DROP DATABASE |
Container needfinder-collector-dev |
docker rm |
Configuration finale :
Mémoire mise à jour : ~/.claude/memory/needfinder.md
Objectif : Tests complets des 10 outils AI + améliorations dashboard
Résultats :
/api/inputsTask file : ~/tasks/22-01-2026-21-00-ai-orchestrator-dashboard-improvements.md
Objectif : Vérifier tous les projets Smart-Deploy et corriger les healthchecks
Résultat : Tous les containers sont maintenant healthy
| Container | Pipeline | Status |
|---|---|---|
| ai-orchestrator | #236 | ✅ healthy |
| authentificator | #231 | ✅ healthy |
| browser-connector | #197 | ✅ healthy |
| connectors-api | #198 | ✅ healthy |
| notif-logger | #196 | ✅ healthy |
| qwikpress | #232 | ✅ healthy |
| qwikpress-file | #237 | ✅ healthy |
| test-deploy | #229 | ✅ healthy |
| yolo-api | - | ✅ healthy (déjà déployé) |
Problèmes identifiés et corrigés :
Healthcheck incompatible : Les containers utilisaient wget qui n'existe pas dans les images Node.js slim
get_healthcheck_cmd() selon le type d'imagenode/bun/qwik/next → node -e require('http').get(...)python/custom → curl -sf ...Docker networks saturés : "all predefined address pools have been fully subnetted"
docker network prune -f (9 réseaux supprimés)Container name conflict : qwikpress-file existait déjà
docker rm -f avant redéploiementCommits Smart-Deploy :
b76f85b : healthcheck wget → nodea25997e : healthcheck curl || wget66750b6 : healthcheck adapté selon type (final)Note yolo-api : Pipeline timeout après 1h (runner limit) mais image ~7GB nécessite 2h. Container déjà healthy, pas besoin de redéployer.
Objectif : Nettoyer GitLab en archivant les projets inutilisés
Résultat :
Projets archivés :
Gardés sur demande : user-bucket, user-bucket-m, json-editor
Résultat : CI/CD fonctionnel, app démarre mais erreur applicative
| Étape | Status |
|---|---|
| conf.prod.gouroubleu.yml créé | ✅ |
| .gitlab-ci.yml Smart-Deploy | ✅ |
| Fix lint errors (eslint + qwik) | ✅ |
| Build Docker OK | ✅ |
| Push registry OK | ✅ |
| Deploy port 3002 | ✅ |
| Nginx config | ✅ |
| Health check | ✅ |
Erreur applicative résolue :
DATA_MODE=file dans Dockerfile avait priorité sur STORAGE_MODE=supabaseDATA_MODE=supabase dans conf.prod.gouroubleu.ymlqwikpress dans Supabase (tables config, pages, common_modules, connectors, redirections, medias)SUPABASE_SERVICE_ROLE_KEY et réseau supabase-prod_supabase-prodCorrections ESLint apportées :
eslint.config.js : @typescript-eslint/no-unused-vars → "warn" avec patternscode-editor/index.tsx : Fix qwik/valid-lexical-scope (extraction valeurs sérialisables)@ts-ignore → @ts-expect-errorURLs :
Deux instances en parallèle pour tester les deux modes de stockage :
| Branche | Mode | Domaine | Port | Container |
|---|---|---|---|---|
| main | Supabase | qwikpress.33800.nowhere84.com | 3002 | qwikpress |
| file-mode | Fichier | qwikpress-file.33800.nowhere84.com | 3003 | qwikpress-file |
Améliorations Smart-Deploy apportées :
container_name séparé du name (pour déployer la même image avec différents containers)yolo-api : API de détection d'objets avec YOLOv8
| Élément | Valeur |
|---|---|
| URL | https://yolo.33800.nowhere84.com |
| Port | 9200 |
| Modèle | yolov8n (nano) |
| Status | ✅ Healthy |
Configuration Smart-Deploy :
conf.prod.gouroubleu.yml : type "custom", port 9200.gitlab-ci.yml : job deploy-prod-master (branche master, pas main)Note : Image très lourde, le premier build prend ~10min, push registry peut timeout avec le défaut 1h.
Problème : notif-logger ne pouvait pas atteindre apprise/ntfy (réseaux Docker différents)
notif-logger-networknotifications_notificationsFix temporaire : docker network connect notifications_notifications notif-logger
Fix permanent : Ajouter network_external: notifications_notifications dans conf.prod.gouroubleu.yml de notif-logger
Objectif : Migrer les projets restants vers Smart-Deploy
Résultat : | Projet | Pipeline | Target | Status | |--------|----------|--------|--------| | notif-logger | #196 | prod-portainer | ✅ | | browser-connector | #197 | prod-portainer | ✅ | | connectors-api | #198 | prod-portainer | ✅ | | needfinder | #204 | dev-portainer | ✅ | | authentificator | #212 | prod-portainer | ✅ |
Corrections apportées :
health.sh : Accepte "ok" et HTTP 200 sans champ status comme healthyservices.sh : Ajout inject_custom_env() pour résoudre @VAR depuis secretsdocker.sh : Support network_external: true pour réseaux Docker existantsdocker.sh : Docker login pour remote deploysChangements libs npm :
qwikjs-lib : Scope changé @nowhere → @gouroubleuulias-lib : Scope changé @nowhere → @gouroubleu@gouroubleu/*Configuration needfinder :
supabase_default (external)supabase-db:5432/needfinder (connexion directe, pas via pooler)Résultat :
deploy_strategy: "zero-downtime" ou "simple")Corrections apportées au template :
| Problème | Solution |
|---|---|
| ci-templates private | Changé en internal via API |
| docker:27 sans bash | apk add bash jq curl openssh-client |
| Registry access forbidden | docker login avec CI_JOB_TOKEN |
| SSH vers nginx impossible | Mount /root/.ssh dans config runner |
| scp "hostname invalid" | Redirect logs vers stderr dans nginx.sh |
| Check symlinks | [ -e ] au lieu de [ -f ] |
Objectif : Réduire CLAUDE.md (1355 lignes) et créer un système modulaire
Résultat :
Fichiers créés :
generate-claude-index.sh : Génère index/ depuis current.jsondata-loader.js : Chargement JS dynamique pour pages livegenerate.d/26-claude.sh : Page claude.html dans dashboard~/.claude/index/ : 6 fichiers (~309 lignes total)Dashboard :
Intégration :
Backlog :
Documentation :
/stock_8to/33800-stack/scripts/deploy/README.md)Health Check Enrichi :
lib/health.sh crééPage Dashboard Services :
generate.d/25-services.sh crééTest CI/CD Réussi :
Corrections apportées :
lib/common.sh : Ajout log_debug(), log_warn(), LOG_PREFIXlib/health.sh : Fix unbound variable ${LOG_PREFIX:-}| Service | Target | Status | URL |
|---|---|---|---|
| test-deploy | prod-portainer | running | https://test-deploy.33800.nowhere84.com |
Ajout système de notifications et registre des services :
lib/notifications.sh :
lib/registry.sh :
/stock_8to/33800-stack/monitoring/services-registry.jsonrollback.sh (nouveau script) :
rollback.sh conf.gouroubleu.yml [steps]smart-deploy.sh :
Corrections supplémentaires :
get_ssh_dest()ls -1td dans rollback_remote pour lister les dossiersTests validés :
Améliorations des stratégies de déploiement non-Docker :
files.sh (release + symlinks pour nginx, pve, etc.) :
CFG_shared pour dossiers partagés (logs, data)pre_deploy et post_deployrollback_files() pour rollbackkeep_releases configurableremote.sh (rsync/git pour o2switch) :
rollback_remote()smart-deploy.sh :
Tests validés :
rm -rf /mnt/raid1/supabase/db/data/* exécuté lors d'une session précédentepostgres.public perdues :needfinder.needfinder (264 posts, 158 needs) - données v1 d'une collecte antérieuresrc/services/orchestrator-client.ts (nouveau)src/services/analyzer.ts, src/services/matcher.ts (utilisent orchestrator)docker-compose.yml (ORCHESTRATOR_URL ajouté)/home/gouroubleu/tasks/20-01-2026-00-40-needfinder-orchestrator-integration.md/mnt/stock_1to échouait/etc/systemd/system/docker.service.d/wait-for-mount.conf[Unit]
BindsTo=mnt-stock_1to.mount
RequiresMountsFor=/mnt/stock_1to
btoa(unescape(encodeURIComponent(...))) pour encoder les caractères Unicode/home/gouroubleu/tasks/20-01-2026-00-05-fix-dashboard-live-refresh.md| Service | Container | Port | Status |
|---|---|---|---|
| ntfy | ntfy | 8080 | ✅ Running |
| apprise | apprise | 8000 | ✅ Running |
| notif-logger | notif-logger | 5300 | ✅ Running |
| connectors-api | connectors-api | 5400 | ✅ Running |
| browser-connector | browser-connector | 5401 | ✅ Running |
| notifications-webapp | notifications-webapp | 8082 | ✅ Running |
| authentificator | authentificator | 8284 | ✅ Running |
| open-webui | open-webui | 3001 | ✅ Running |
| ai-orchestrator | ai-orchestrator | 5501 | ✅ Running v2.0.0 (Queue System) |
| needfinder | needfinder | 5200 | ✅ Running |
| Service | Container | Port | Status | Notes |
|---|---|---|---|---|
| supabase-db | supabase-db | 5432 | ✅ Running | PostgreSQL |
Note : NeedFinder migré vers PROD le 23/01/2026
| Service | Port | Status | API Testée |
|---|---|---|---|
| Ollama | 11434 | ✅ Running (16 modèles) | ✅ |
| ComfyUI | 8188 | ✅ Testé via Orchestrator | ✅ |
| Fooocus | 7865 | ✅ Testé via Orchestrator | ✅ |
| Wan2.1 | 7860 | ✅ CLI mode (bypass Gradio) | ✅ |
| Applio | 6969 | ✅ Full API mode (model_name requis) | ✅ |
| Bark TTS | 7866 | ✅ Testé - Génération audio OK | ✅ |
| MusicGen | 7867 | ✅ Testé - Génération musique OK | ✅ |
| SadTalker | 7868 | ✅ CLI mode (NumPy patches) | ✅ |
| FaceFusion | 7869 | ✅ CLI mode headless-run (bypass Gradio) | ✅ |
| TripoSR | 7870 | ✅ Full API mode (patch PyMCubes) | ✅ |
| Faster-Whisper | CLI | ✅ Installé | CLI |
| Piper TTS | CLI | ✅ Installé (FR + EN) | CLI |
| Projet | Status | Notes |
|---|---|---|
| notif-logger | ✅ Déployé | - |
| ffmpeg-api | ✅ Déployé | - |
| tintech-api | ✅ Déployé | - |
| ulias | ✅ Déployé | - |
| medias-api | ✅ Déployé | - |
| jellylink-api | ✅ Déployé | - |
| browser-connector | ✅ Déployé | - |
| connectors-api | ✅ Déployé | - |
| authentificator | ✅ Déployé | - |
| qwikpress | ✅ Déployé | Port 3002, mode Supabase, schema qwikpress |
| ai-front | ❌ Échec | code error |
| tintech-front | ❌ Échec | ESLint errors |
| Package | Version | Projet GitLab |
|---|---|---|
| @gouroubleu/ulias-lib | 0.0.12 | 65 |
| @gouroubleu/qwikjs-lib | 0.0.43 | 74 |
/update_1 échouait avec erreursheadless-run au lieu de l'API Gradiocd /d I:\facefusion &&)--processors puis --face-swapper-model AVANT -s -t -otaskkill /F /IM python.exe)wmic process where "commandline like '%run_{job_id}%'" delete
os.environ['PYTHONIOENCODING'] = 'utf-8'run_ssh_commandescaped_command = command.replace('"', '\\"') (main.py:330)start_applio.bat (nécessite cd /d I:\Applio)model_name (pas model)"model_name": "logs/Haruka/VT-TTS_Haruka.pth"source_image, driven_audioheadless-runinference.py fonctionne parfaitementmy_awing_arch.py : np.float → floatpreprocess.py : extraction scalaires float(s), float(t[0]), float(t[1])/stock_8to/backups/win11-patches/sadtalker_*.py/gradio_apienforce_terms)/gradio_api/call/change_choices → rafraîchit dropdowns/gradio_api/call/enforce_terms → inférence (60 params)/gradio_api/call/enforce_terms/{event_id} → résultat SSEgenerate.py) au lieu de Gradiomodel.py utilise attention() avec fallback PyTorch/I:/path)isosurface.py pour utiliser PyMCubes au lieu de torchmcubes (pas besoin de compiler CUDA)I:\TripoSR\tsr\models\isosurface.py (patch PyMCubes)ai-orchestrator/app/main.py (4 executors Full API)Problème : jellyfin.33800.nowhere84.com timeout depuis 4G (depuis le 12/01)
Cause : Gateway nginx incorrecte !
AVANT : default via 192.168.1.1 ← IP INEXISTANTE
APRÈS : default via 192.168.1.254 ← Freebox
Solution :
/etc/netplan/90-custom.yaml sur nginx.localnetplan applyOrigine : Probablement modifié lors de l'installation Pi-hole le 12/01
/ai/ → /mnt/stock_8to/33800-stack/ai-data/outputs/https://downloads.33800.nowhere84.com/ai/{job_id}/{filename}download_url dans output_result10 outils centralisés - toutes les requêtes GPU passent par l'orchestrator
| Outil | Catégorie | Status | Paramètres principaux |
|---|---|---|---|
| ollama | LLM | ✅ | prompt, model, system, temperature |
| comfyui | Image | ✅ | prompt, steps, cfg, seed |
| fooocus | Image | ✅ | prompt, style, performance |
| wan21 | Video | ✅ | prompt, resolution, steps |
| bark | Audio TTS | ✅ | text, voice |
| musicgen | Audio Music | ✅ | description, duration |
| applio | Audio RVC | 🆕 | audio_file, model, pitch |
| facefusion | Face Swap | 🆕 | source_file, target_file |
| sadtalker | Talking Head | ✅ | image_file, audio_file |
| triposr | Image→3D | ✅ | image_file, mc_resolution (patch PyMCubes) |
Avantages :
À implémenter : Algorithme de groupement (éviter trop de switch si jobs similaires)
/gradio_api/call/t2v_generationI:\Fooocus-API sur win11 (port 7865)POST /api/jobs : Créer job (bark, musicgen, comfyui)GET /api/jobs : Lister historiqueGET /api/jobs/{id} : Status détailléGET /api/jobs/{id}/output/{file} : Télécharger outputGET /api/queue : Stats queue (pending, running)/stock_8to/33800-stack/ai-data/outputs/pip install scipynumpy==1.26.4, scipy==1.10.1, gradio==3.50.2GET /api/tools : Liste tous les outilsGET /api/tools/refresh : Détecte les outils actifsPOST /api/tools/{id}/start : Démarre un outil (arrête l'actif si besoin)POST /api/tools/{id}/stop : Arrête un outilGET /api/gpu : Status GPU (VRAM, température, utilisation)| Service | URL |
|---|---|
| Open WebUI | https://openwebui.33800.nowhere84.com |
| ComfyUI | https://comfyui.33800.nowhere84.com |
| Fooocus | https://fooocus.33800.nowhere84.com |
| Wan2.1 | https://wan.33800.nowhere84.com |
| Applio | https://applio.33800.nowhere84.com |
| Bark TTS | https://bark.33800.nowhere84.com |
| MusicGen | https://musicgen.33800.nowhere84.com |
| SadTalker | https://sadtalker.33800.nowhere84.com |
| FaceFusion | https://facefusion.33800.nowhere84.com |
| TripoSR | https://triposr.33800.nowhere84.com |
| authentificator | https://auth.33800.nowhere84.com |
| ntfy | https://ntfy.33800.nowhere84.com |
| dashboard | https://dashboard.nowhere84.com |
| IA Tools | https://dashboard.nowhere84.com/ai-tools.html |
| AI Orchestrator API | https://ai-orchestrator.33800.nowhere84.com |
| AI Orchestrator Dashboard | https://dashboard.nowhere84.com/ai-orchestrator.html |
| AI Jobs Dashboard | https://dashboard.33800.nowhere84.com/ai-jobs.html |
| gitlab | https://gitlab.33800.nowhere84.com |
| Outil | Chemin |
|---|---|
| Ollama modèles | I:.ollama\models |
| ComfyUI | I:\ComfyUI_clean |
| Fooocus | I:\Fooocus |
| Wan2.1 | I:\Wan2.1 |
| Applio (RVC) | I:\Applio |
| Bark TTS | I:\Bark |
| MusicGen | I:\MusicGen |
| SadTalker | I:\SadTalker |
| FaceFusion | I:\facefusion |
| TripoSR | I:\TripoSR |
| Whisper | I:\Whisper |
| Piper TTS | I:\PiperTTS |
I:\Fooocus\start_fooocus.bat (modèles téléchargés)I:\Wan2.1\start_wan.bat (modèles téléchargés, ~12 Go RAM)I:\ComfyUI_clean\start_comfyui.batI:\Applio\start_applio.bat (modèles ~2 Go, PyTorch CUDA 12.8)I:\Bark\start_bark.bat (TTS avec émotions)I:\MusicGen\start_musicgen.bat (génération musique)I:\SadTalker\start_sadtalker.bat (talking head)I:\facefusion\start_facefusion.bat (face swap)I:\TripoSR\start_triposr.bat (image to 3D)L'API permet de gérer les outils IA via REST :
# Voir les outils disponibles
curl https://ai-orchestrator.33800.nowhere84.com/api/tools
# Détecter les outils actifs
curl https://ai-orchestrator.33800.nowhere84.com/api/tools/refresh
# Status GPU
curl https://ai-orchestrator.33800.nowhere84.com/api/gpu
# Démarrer ComfyUI (arrête l'outil actif si différent)
curl -X POST https://ai-orchestrator.33800.nowhere84.com/api/tools/comfyui/start?force=true
# Arrêter un outil
curl -X POST https://ai-orchestrator.33800.nowhere84.com/api/tools/comfyui/stop
Une page dédiée est disponible sur le dashboard avec documentation complète pour chaque outil: https://dashboard.nowhere84.com/ai-tools.html
L'API permet de soumettre des jobs IA en file d'attente :
# Créer job Bark TTS
curl -X POST https://ai-orchestrator.33800.nowhere84.com/api/jobs \
-H "Content-Type: application/json" \
-d '{"tool_id":"bark","job_type":"tts","input_params":{"text":"Hello","voice":"v2/en_speaker_3"}}'
# Créer job MusicGen
curl -X POST https://ai-orchestrator.33800.nowhere84.com/api/jobs \
-H "Content-Type: application/json" \
-d '{"tool_id":"musicgen","job_type":"music","input_params":{"description":"upbeat electronic","duration":15}}'
# Créer job ComfyUI (SDXL)
curl -X POST https://ai-orchestrator.33800.nowhere84.com/api/jobs \
-H "Content-Type: application/json" \
-d '{"tool_id":"comfyui","job_type":"image","input_params":{"prompt":"a sunset over mountains","steps":20}}'
# Status d'un job
curl https://ai-orchestrator.33800.nowhere84.com/api/jobs/{job_id}
# Télécharger output
curl https://ai-orchestrator.33800.nowhere84.com/api/jobs/{job_id}/output/output.png -o result.png
# Stats queue
curl https://ai-orchestrator.33800.nowhere84.com/api/queue
Dashboard jobs : https://dashboard.33800.nowhere84.com/ai-jobs.html
Problème : La page needfinder.html affichait des données obsolètes (16K needs vs 20K+ réels)
Cause : Régression de version live (707 lignes, appels API) vers version statique (8566 lignes, données codées en dur)
Fix : Restauration du commit 499d4e2 avec version live
Résultat :
https://needfinder-api.33800.nowhere84.comCommit : e2cb7c1 pushé vers O2switch
<!-- Test watcher Wed Jan 28 12:25:18 AM CET 2026 -->
<!-- Watcher test Wed Jan 28 12:39:31 AM CET 2026 -->
<!-- Final watcher test Wed Jan 28 12:45:31 AM CET 2026 -->