Aller au contenu principal

Architecture

Loch Panel se compose de trois projets, chacun dans son propre dépôt Git, regroupés dans un même répertoire de travail.

ProjetRôleTechnologies
host-panel-apiAPI REST et WebSocket, pilote Docker (port 2538)Go 1.27, net/http standard, SDK Docker Moby
host-panel-interfaceInterface web (port 5173 en développement), en 10 languesReact 19, TypeScript, Vite, Ant Design 6, TanStack Query
host-panel-cliCLI loch et serveur MCPGo, Cobra, Viper

Communication entre les projets​

DeVersCanalAuthentification
InterfaceAPIREST (Axios, withCredentials: true)Cookie de session
InterfaceAPIWebSocket /ws : shell, logs et statistiques en directCookie de session
CLIAPIREST et WebSocket /ws (y compris le proxy de ports TCP)En-tête X-API-Key
APIDockerSocket Docker—
APISFTPGoAPI REST d'administration de SFTPGo (si SFTP_ENABLED)En-tête X-SFTPGO-API-KEY

Session (navigateur). L'API gère elle-même la connexion OIDC (/openid-connect/login, puis /openid-connect/redirect). Elle stocke le jeton dans un cookie signé authorization et le vérifie à chaque requête avec les JWKS du fournisseur. Quand l'API répond 401, l'interface redirige vers /openid-connect/login. Une session dispose de toutes les permissions de son utilisateur.

Clé API (CLI, scripts, MCP). L'en-tête X-API-Key est vérifié en premier. Une clé porte le profil de son utilisateur et peut être limitée par des scopes. Voir la référence de l'API.

Parcours d'une requête dans l'API​

  1. Middlewares globaux, dans cet ordre : Recovery, Logging, AuditRequests, RateLimit (120 requêtes par minute et par IP), SecurityHeaders, CORS(FRONT_URL), SameOrigin(FRONT_URL) (CSRF).
  2. Enveloppe de route : authenticated (clé API, sinon JWT et utilisateur) ou adminOnly (idem, plus la vérification admin). Les routes sont déclarées dans cmd/server/main.go.
  3. Handler : vérifie le scope de la clé API avec middleware.RequireScope, puis répond avec writeJSON / writeError.

Paquets de l'API​

PaquetRôle
cmd/serverPoint d'entrée : configuration, assemblage, routes, enregistrement des moteurs de services (serviceEngines())
internal/config, internal/envChargement, validation et contrôle de l'environnement
internal/authFournisseurs OIDC, JWKS, cookies signés
internal/middlewareAuthentification, CSRF, CORS, limitation de débit, audit, logs
internal/handlerHandlers HTTP et WebSocket, codes d'erreur
internal/wsHub WebSocket : logs, shell, statistiques, proxy de ports
internal/dockerClient Docker, cache des conteneurs (3 s), exec, réseaux
internal/store, internal/modelPersistance JSON atomique ; utilisateurs, clés API
internal/cronTâches planifiées : planificateur, exécuteur, stockage
internal/auditÉcriture et lecture du journal d'audit
internal/hosting, internal/composekitHébergement web ; outils pour écrire et lancer des projets compose
internal/sftpgoClient d'administration SFTPGo
internal/servicesCœur des services managés ; un sous-paquet par moteur (postgres, mysqlfamily, mongodb, redisfamily, nats, rabbitmq, elasticmq, mosquitto, s3)
internal/networksRéseaux privés : registre, vérification, membres
internal/functionsFonctions (travail en cours) : gestionnaire, rendu compose, envoi du code, binaire du runtime, invocation
internal/registry, internal/releasesRéférences d'images (mirror.gcr.io, ghcr.io) ; découverte des versions

L'API stocke son état dans des fichiers JSON sous DATA_DIR (users.json, apikeys.json, cron.json, networks.json) et écrit le journal d'audit dans audit.log, dans son répertoire de logs.

Structure de l'interface​

CheminContenu
src/config.tsConfiguration d'exécution : window.__APP_CONFIG__, puis variables VITE_*, puis valeurs par défaut
src/i18n/Configuration i18next, clés typées, fichiers de langue
src/Services/<Domaine>/Appels à l'API (service.ts), modèles, hooks React Query
src/Pages/<Domaine>/Un dossier par page
src/Components/Composants partagés ; menu dans Components/Layout/MenuLayout.tsx
src/App.tsxRoutes
tests/API simulée, configuration Vitest, tests Playwright

Bon à savoir​

  • Chaque projet a son propre dépôt Git : committez dans le projet que vous avez modifié.
  • La CLI n'accède pas à Docker : tout passe par l'API.
  • Les notes de conception détaillées restent dans le dépôt de l'API (host-panel-api/docs/).