33800 Docs

← Retour

Proposition : Multi-instances, auth_type none et connecteurs publics

Date : 26/01/2026 Projet : connectors-api Status : En attente validation

Contexte

Trois problèmes identifiés :

  1. Services sans auth : affichent une option credentials inutile
  2. Multi-comptes : impossible d'avoir 2 comptes Jellyfin (perso + famille)
  3. Connecteurs publics : les services internes sans auth ne sont pas disponibles par défaut

État actuel des connecteurs

Connecteur auth_type actuel Réalité Disponible par défaut ?
ai-orchestrator none Pas d'auth Non (devrait être oui)
yolo none Pas d'auth Non (devrait être oui)
scraper custom Pas d'auth Non (devrait être oui)
web-search custom Pas d'auth Non (devrait être oui)
github bearer Token requis Non
jellyfin api_key API key requise Non
... ... ... ...

Architecture actuelle

config (connecteur)          tokens (credentials)
├── id                       ├── connector_id ─┐
├── name (UNIQUE)            ├── user_id ──────┼── UNIQUE ensemble
├── type                     ├── api_key       │
├── auth_type                └── access_token  │
└── base_url                                   │
                                               ▼
                             1 seul token par connector/user

Solution proposée

1. Supporter auth_type: none proprement

Backend :

Frontend :

2. Système d'instances (multi-comptes)

Nouvelle architecture :

connector_types (prédéfinis)     user_connectors (instances)
├── type (github, jellyfin)      ├── id
├── display_name                 ├── user_id
├── auth_type                    ├── connector_type ──► type
├── endpoints[]                  ├── name (ex: "Jellyfin Perso")
└── default_base_url             ├── base_url (override)
                                 ├── api_key / token
                                 └── is_default

Avantages :

3. Migration

Option A : Évolution douce (recommandée)

Option B : Refactoring complet

Schéma SQL (Option A)

-- Nouvelle table pour les instances utilisateur
CREATE TABLE connectors.user_connectors (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  user_id UUID NOT NULL,
  connector_type_id UUID NOT NULL REFERENCES connectors.config(id),

  -- Instance config
  name TEXT NOT NULL,                    -- "Jellyfin Perso"
  base_url TEXT,                         -- Override de l'URL par défaut

  -- Credentials (fusionné depuis tokens)
  api_key TEXT,
  access_token TEXT,
  refresh_token TEXT,
  expires_at TIMESTAMPTZ,
  token_metadata JSONB DEFAULT '{}',

  -- Metadata
  is_default BOOLEAN DEFAULT false,      -- Instance par défaut pour ce type
  created_at TIMESTAMPTZ DEFAULT NOW(),
  updated_at TIMESTAMPTZ DEFAULT NOW(),

  UNIQUE(user_id, name)                  -- Nom unique par utilisateur
);

API modifiée

# Lister les instances de l'utilisateur
GET /api/user/connectors
→ [{"id": "...", "name": "Jellyfin Perso", "type": "jellyfin", ...}]

# Créer une nouvelle instance
POST /api/user/connectors
{
  "type": "jellyfin",
  "name": "Jellyfin Famille",
  "base_url": "https://jellyfin-famille.example.com",
  "api_key": "..."
}

# Appeler via une instance spécifique
POST /api/fetch
{
  "connector": "jellyfin",           // type OU
  "instance": "Jellyfin Famille",    // nom d'instance
  "method": "GET",
  "path": "/System/Info"
}

Effort estimé

Tâche Effort
Migration SQL Faible
Backend (endpoints) Moyen
Frontend (UI instances) Moyen
Tests Faible
Total ~4-6h

3. Connecteurs publics (sans auth)

Problème

Solution

Nouveau champ is_public dans la table config :

ALTER TABLE connectors.config ADD COLUMN is_public BOOLEAN DEFAULT false;

-- Connecteurs publics (sans auth, disponibles pour tous)
UPDATE connectors.config SET is_public = true, auth_type = 'none'
WHERE name IN ('ai-orchestrator', 'yolo', 'scraper', 'web-search');

Comportement :

⚠️ Important : "public" ne signifie PAS accessible sans auth !

Liste des connecteurs publics : | Connecteur | Usage | |------------|-------| | ai-orchestrator | Queue IA, GPU status | | yolo | Détection objets | | web-search | Recherche web (SearXNG) | | scraper | Web scraping (Playwright) |

⚠️ Préservation des données

Aucune donnée ne sera perdue !

Toutes les migrations sont additives :

Script de migration sécurisé :

-- Transaction pour rollback si erreur
BEGIN;

-- 1. Ajouter colonne (sans impact sur données)
ALTER TABLE connectors.config ADD COLUMN IF NOT EXISTS is_public BOOLEAN DEFAULT false;

-- 2. Mettre à jour UNIQUEMENT les connecteurs sans auth
UPDATE connectors.config
SET is_public = true, auth_type = 'none'
WHERE name IN ('ai-orchestrator', 'yolo', 'scraper', 'web-search');

-- 3. Vérifier avant commit
SELECT name, auth_type, is_public FROM connectors.config;

COMMIT;

Résumé des changements

Changement Table Effort Impact données
Ajouter none à CHECK constraint config 5 min Aucun
Corriger auth_type scraper/web-search config 5 min Aucun
Ajouter is_public config 10 min Aucun
Table user_connectors (multi-instances) nouvelle 1h Aucun (nouvelle table)
Backend endpoints modifiés index.ts 2h Aucun
Frontend (masquer credentials, multi-instances) front 2h Aucun

Questions pour validation

  1. Option A ou B pour la migration multi-instances ?
  2. Nommage : "instance" ou "account" ou autre ?
  3. Priorité :
    • Quick fix (is_public + auth_type) → maintenant ?
    • Multi-instances → plus tard ?