Source : CLAUDE.md lignes 1070-1192
| Service | Container | Port | Usage |
|---|---|---|---|
| ntfy | ntfy | 8080:80 | Push notifications |
| apprise | apprise | 8000 | Gateway multi-canal |
| notif-logger | notif-logger | 5300 | API logging + dispatch |
| Service | Port | Usage |
|---|---|---|
| supabase | 8001 | BDD PostgreSQL + API |
| redis | 6379 | Cache |
| Service | Container | Port | Usage |
|---|---|---|---|
| connectors-api | connectors-api | 5403 (via wireguard-sidecar) | Hub API multi-connecteurs |
| connectors-front | connectors-front-blue | 5402 (blue-green) | Interface Qwik |
| browser-connector | browser-connector | 5404 | Playwright automation + Scraper |
| searxng | connectors-api-searxng | 8888 | Meta search engine |
ATTENTION : connectors-api écoute sur port 5403 (env PORT=5403). Le wireguard-sidecar expose 5403 + 5410 (API WireGuard).
Domaines :
GitLab repos :
Swagger : https://connectors.33800.nowhere84.com/swagger
User account : gouroubleu@gmail.com / MyUlia75$w
session.access_token (pas token)Architecture Multi-Instance (26/01/2026) :
user_connectors : Instances utilisateur (credentials séparés)is_default: true → instance utilisée si non spécifiée dans /api/fetchinstance pour tracking par instanceextra_headers (28/01/2026) :
extra_headers JSONB dans connectors.config{"OCS-APIRequest": "true"}Sync builtin types (29/01/2026) :
registry.syncBuiltinTypes() au demarrage : sync les 31 CONNECTOR_TYPES vers la table configis_builtin: trueOAuth2 Credentials Partages (29/01/2026) :
oauth_credentials : credentials OAuth reutilisables (client_id, secret, tokens)oauth_credential_id sur user_connectors → instance liee a un credential/api/oauth/providers, /api/oauth/credentials (CRUD), /api/oauth/credentials/:id/authorize, /api/oauth/callback/settings/oauth (gestion), modal credential dans /connect et instanceSystème de types :
type predefini → endpoints depuis CONNECTOR_TYPES (31 types syncronises)Connecteurs configures (31 types builtin) : | Connecteur | Type | Auth | Endpoints | Status | |------------|------|------|-----------|--------| | github | github | bearer | 35 | Connecte | | mailjet | mailjet | basic | 17 | Connecte | | o2switch | o2switch | custom | 20 | Connecte | | linkedin | linkedin | oauth2 | 7 | OAuth requis | | jellyfin | jellyfin | api_key | 18 | 2 instances | | ai-orchestrator | ai-orchestrator | none | 17 | Public | | yolo | yolo | none | 4 | Public | | supabase | supabase | api_key | 15 | Connecte | | proxmox | proxmox | custom | 18 | Connecte | | nextcloud | nextcloud | basic | 12 | Connecte (app pwd) | | ssh | ssh | password/key | 8 | tmux + SFTP | | gmail | gmail | oauth2 | - | OAuth Google | | google-drive | google-drive | oauth2 | - | OAuth Google | | google-sheets | google-sheets | oauth2 | - | OAuth Google | | google-calendar | google-calendar | oauth2 | - | OAuth Google | | + 16 autres types | ... | ... | - | Builtin sync |
Endpoints principaux : | Endpoint | Méthode | Description | |----------|---------|-------------| | /api/fetch | POST | Proxy fetch - Appeler n'importe quelle API | | /api/auth/login | POST | Connexion (retourne session.access_token) | | /api/auth/register | POST | Inscription | | /api/connectors | GET | Liste connecteurs (types) | | /api/user/instances | GET | Liste instances user (avec logs_count) | | /api/user/instances/:id | GET | Détails instance | | /api/user/instances/:id/default | POST | Définir comme défaut | | /api/audit/logs | GET | Logs d'audit (filtrable par instance) | | /api/oauth/providers | GET | Liste providers OAuth (Google) | | /api/oauth/credentials | GET/POST | CRUD credentials OAuth | | /api/oauth/credentials/:id | DELETE | Supprimer credential | | /api/oauth/credentials/:id/authorize | GET | URL autorisation OAuth2 | | /api/oauth/callback | GET | Callback OAuth2 (public, bypass IP) |
Exemple /api/fetch :
{
"connector": "jellyfin",
"instance": "Jellyfin Perso",
"method": "GET",
"path": "/Users"
}
Si instance omis → utilise l'instance par défaut du user pour ce connector.
Chat AI (connectors-front) - maj 01/02/2026 :
/chat/[id] : conversation avec IA (Ollama via ai-orchestrator)getMessages vérifie le job status si dernier message = placeholderai_background_jobs : tracking des jobs en coursPOST /api/ai/webhook/job-complete (appelé par ai-orchestrator)/connectors n'existe PAS — la liste des connecteurs est sur / (page d'accueil)Frontend (connectors-front) - maj 27/01/2026 :
/connectors/[id]/test/[endpoint]?instance=<id> - formulaire dynamique + execution, retour vers instance/settings/oauth - gestion credentials OAuth (creer, autoriser, supprimer)/connectors/instance/[id]/terminal - plein ecran avec tmuxArchitecture VPN :
connectors-api (network_mode: service:wireguard-sidecar)
↓
wireguard-sidecar (tunnels WireGuard)
↓
VPN Server → Réseau distant (192.168.11.0/24, etc.)
Stack unifiée : /home/gouroubleu/apps/connectors-stack/
wireguard-sidecar : Gère tunnels WireGuard (port 5410)connectors-api : Partage le namespace réseau du sidecarFonctionnalites :
| Feature | Description |
|---------|-------------|
| Execution commande | POST /api/ssh/execute avec instance_id |
| Terminal WebSocket | wss://connectors.../api/ssh/shell?instance_id=...&tmux=true |
| SFTP | Liste, upload, download, mkdir, delete |
| Auto-certif | Generation + installation cle SSH automatique |
| Jump Host | Support bastion (ProxyJump) |
| tmux | Session persistante (survit a la fermeture navigateur) |
| VPN WireGuard | Connexion auto avant SSH si profil configuré |
VPN Profiles :
connectors.vpn_profiles (RLS par user)Endpoints SSH : | Endpoint | Methode | Description | |----------|---------|-------------| | /api/ssh/execute | POST | Executer commande | | /api/ssh/shell | WS | Terminal interactif (WebSocket) | | /api/ssh/sftp/list | POST | Lister fichiers | | /api/ssh/sftp/upload | POST | Upload fichier | | /api/ssh/sftp/download | POST | Download fichier | | /api/ssh/sftp/mkdir | POST | Creer dossier | | /api/ssh/sftp/delete | POST | Supprimer fichier/dossier | | /api/ssh/setup-key | POST | Installer cle SSH auto |
Endpoints AI Assistant (28/01/2026) : | Endpoint | Methode | Description | |----------|---------|-------------| | /api/ai/suggest-command | POST | Suggerer commande via Ollama (mistral:latest) | | /api/ai/test-command | POST | Tester commande sur instance SSH |
output_result.response (inline, pas fichier)Endpoints VPN Profiles : | Endpoint | Methode | Description | |----------|---------|-------------| | /api/vpn/profiles | GET | Liste profils user | | /api/vpn/profiles | POST | Créer profil | | /api/vpn/profiles/import | POST | Importer .conf WireGuard | | /api/vpn/profiles/:id | GET/PUT/DELETE | CRUD profil |
Audit actions SSH :
ssh.execute : Commande executeessh.shell_start / ssh.shell_end : Session terminalssh.shell_input : Commande saisie dans terminal (loggee)ssh.sftp_* : Operations SFTPEndpoints SSH supplementaires :
| Endpoint | Methode | Description |
|----------|---------|-------------|
| /api/ssh/instance | POST | Creer instance SSH (endpoint dedie) |
| /api/ssh/test | POST | Tester connexion sans sauvegarder (retourne fingerprint) |
| /api/ssh/upload | POST | Upload fichier texte (content + remote_path + mode) |
| /api/ssh/download | POST | Download fichier (avec option tail: N lignes) |
Body detaille /api/ssh/execute :
{
"instance_id": "uuid",
"command": "ls -la",
"cwd": "/home/user",
"timeout": 30000,
"force": false
}
// Response: { success, stdout, stderr, exit_code, duration_ms }
Commandes dangereuses detectees : rm -rf, mkfs, dd if=, > /dev/, chmod -R 777, shutdown, reboot, systemctl stop sshd. Ajouter "force": true pour passer outre.
Messages WebSocket /api/ssh/shell :
Client → Server: { type: "input", data: "ls\n" } | { type: "resize", cols: 120, rows: 40 }
Server → Client: { type: "output", data: "..." } | { type: "ready" } | { type: "close" } | { type: "error" }
SFTP details : Upload/download en base64 (content_base64). Limite: 50MB (env SFTP_MAX_SIZE).
Securite credentials SSH : Chiffrement AES-256-CBC, format iv_hex:encrypted_hex, cle dans env SSH_ENCRYPTION_KEY.
BDD : Config SSH dans user_connectors.token_metadata (JSONB) : host, port, username, auth_method, password_encrypted, fingerprint, jump_host (avec sous-champs).
Endpoints VPN WireGuard detailles : | Endpoint | Methode | Description | |----------|---------|-------------| | /api/instances/:id/vpn/generate-keys | POST | Genere paire cles WireGuard | | /api/instances/:id/vpn | PUT | Configure VPN (endpoint, peer, allowed_ips, address, dns) | | /api/instances/:id/vpn/connect | POST | Demarre tunnel | | /api/instances/:id/vpn/disconnect | POST | Arrete tunnel | | /api/instances/:id/vpn/status | GET | Status (connected, transfer, handshake) | | /api/instances/:id/vpn/config | GET | Config sans cle privee | | /api/instances/:id/vpn | DELETE | Supprime config VPN | | /api/vpn/active | GET | Liste tunnels actifs |
Sidecar WireGuard : Python/FastAPI (port 5410), image Alpine + wireguard-tools, capabilities NET_ADMIN + SYS_MODULE, max 5 tunnels/user.
Fichiers sources :
src/services/ssh.ts, src/services/wireguard.ts, src/index.ts, src/data/connector-types.tsSshShell.tsx (one-shot), SshWebTerminal.tsx (xterm.js, theme Tokyo Night), VpnConfig.tsxssh2 (backend), @xterm/xterm + addons (frontend)Endpoints browser-connector : | Endpoint | Description | |----------|-------------| | GET /api/linkedin/login | Connexion LinkedIn | | GET /api/linkedin/profile | Profil complet | | GET /api/linkedin/messages | Messages recents | | GET /api/linkedin/connections | Liste connexions | | POST /api/linkedin/message | Envoyer message |
| Service | Container | Port | Usage |
|---|---|---|---|
| qwik-interface-generator | qwik-interface-generator | 5505 | Générateur UI depuis Swagger |
Domaine : qig.33800.nowhere84.com
GitLab : https://gitlab.nowhere84.com/gouroubleu/qwik-interface-generator
Fonctionnalités MVP :
Auth : Utilise connectors-api pour authentification
| Service | Container | Port | Usage |
|---|---|---|---|
| needfinder | needfinder | 5200 | Collecte Reddit/HN + Analyse IA |
Domaine : needfinder-api.33800.nowhere84.com
GitLab : https://gitlab.nowhere84.com/gouroubleu/needfinder
Dashboard : https://dashboard.nowhere84.com/needfinder.html (live)
Traitement async : Utilise AI Orchestrator via webhooks
Stats actuelles : ~85K jobs en queue (analyse + traduction)
| Service | Container | Port | Usage |
|---|---|---|---|
| ai-orchestrator | ai-orchestrator | 5501 | Gestion outils IA win11 + Queue |
Domaine : ai-orchestrator.33800.nowhere84.com
GitLab : https://gitlab.33800.nowhere84.com/gouroubleu/ai-orchestrator
Endpoints Tools : | Endpoint | Méthode | Description | |----------|---------|-------------| | /api/tools | GET | Liste tous les outils | | /api/tools/refresh | GET | Détecte les outils actifs | | /api/tools/{id} | GET | Status d'un outil | | /api/tools/{id}/start | POST | Démarre un outil (force=true pour switch) | | /api/tools/{id}/stop | POST | Arrête un outil | | /api/gpu | GET | Status GPU (VRAM, temp, usage) |
Endpoints Jobs (Queue System) : | Endpoint | Méthode | Description | |----------|---------|-------------| | /api/jobs | POST | Créer job (avec callback_url optionnel) | | /api/jobs | GET | Lister jobs (limit, offset) | | /api/jobs/{id} | GET | Status d'un job | | /api/jobs/stats | GET | Stats globales (completed, failed, etc.) | | /api/queue | GET | Stats queue (pending, current_job) | | /api/inputs | GET/POST/DELETE | Gestion fichiers input |
Endpoints Worker Control (24/01/2026) : | Endpoint | Méthode | Description | |----------|---------|-------------| | /api/worker/status | GET | État du worker (running/paused) | | /api/worker/pause?stop_tools=true | POST | Pause worker + arrête outils (libère VRAM) | | /api/worker/resume | POST | Reprend le traitement (outils auto-start) |
Webhooks : Supporte callback_url dans job creation pour notification async
https://connectors.33800.nowhere84.com comme callback_url (pas d'IP:port)POST /api/ai/webhook/job-complete sur connectors-apigetMessages vérifie le job status à l'ouverture de la conversationSystème de Priorité :
priority: 1 = HIGH (traité en premier)priority: 0 = NORMAL (défaut)priority: -1 = LOW# Soumettre un job haute priorité
curl -X POST https://ai-orchestrator.33800.nowhere84.com/api/jobs \
-H "Content-Type: application/json" \
-d '{"tool_id":"ollama","job_type":"chat","priority":1,"input_params":{...}}'
Traitement Parallèle (24/01/2026) :
OLLAMA_PARALLEL_JOBS = 2 (réduit de 3 pour thermal GPU)Outils gérés : Ollama, ComfyUI, Fooocus, Wan2.1, Applio, Bark, MusicGen, SadTalker, FaceFusion, TripoSR
Patches win11 (à préserver lors de mises à jour) :
| Outil | Fichier | Patch | Raison |
|---|---|---|---|
| Wan2.1 | I:\Wan2.1\wan\modules\model.py |
from .attention import attention as flash_attention |
Flash Attention non dispo Windows |
| TripoSR | I:\TripoSR\tsr\models\isosurface.py |
Utilise mcubes au lieu de torchmcubes |
Évite compilation CUDA |
Notes techniques :
generate.py) au lieu de Gradio pour éviter crash connexion/I:/path| Stack | Chemin |
|---|---|
| notifications | /stock_8to/33800-stack/docker/stacks/notifications/ |
| supabase | (docker run direct, voir tasks) |
| ai-orchestrator | /stock_8to/33800-stack/projects/ai-orchestrator/ |
[Script/App] → POST /api/notify/push → [notif-logger:5300]
↓
[apprise:8000] → ntfy + mail
| Endpoint | Methode | Usage |
|---|---|---|
| /api/notify/push | POST | Envoi push (ntfy) |
| /api/notify/mail | POST | Envoi email |
| /api/notify/all | POST | Push + mail |
| /health | GET | Healthcheck |
{
"title": "Titre notification",
"body": "Corps du message",
"level": "info|warning|critical"
}
curl -X POST "http://192.168.1.12:5300/api/notify/push" \
-H "Content-Type: application/json" \
-d '{"title": "TEST", "body": "Message test"}'