+31648934831 hello@manualninja.com

Spécifications techniques

Une architecture RAG moderne avec vision IA.

L'architecture en un coup d'œil

ManualNinja est une application RAG multi-tenant avec un backend Python, un frontend React SPA, une base de données PostgreSQL et une base de données vectorielle Qdrant.

API Backend
FastAPI + Uvicorn (Python 3.13). Endpoints REST pour l'authentification, les manuels, le chat, la facturation et l'administration. Authentification basée sur JWT avec des secrets forts.
Frontend
React 18 + Vite. Application monopage avec interface de chat, panneau d'administration, portail de facturation et tableau de bord superadmin.
Base de données
PostgreSQL 17. Stocke les organisations, les utilisateurs, les manuels, les sessions de chat, le suivi d'utilisation et les paramètres configurables.
Magasin vectoriel
Qdrant 1.19. Recherche sémantique sur les chunks de manuels avec filtrage par organisation.
Embeddings
BAAI/bge-small-en-v1.5 (384 dimensions, CPU). Inférence locale — aucun appel d'API d'embedding externe.
LLM (texte)

API compatible OpenAI. Modèle par défaut : deepseek/deepseek-v3-0324. Configurable via le tableau de bord superadmin.
Vous voulez une IA locale pour la sécurité ? Aucun problème. Contactez-nous

LLM (vision)
Modèle de vision Novita AI — google/gemma-3-27b-it. Analyse les images téléchargées (étiquettes d'appareils, écrans d'erreur, plaques signalétiques) avec OCR et identification.
Extraction PDF
PyMuPDF (fitz). Découpage au niveau des pages avec préservation des métadonnées pour des citations précises.
Web URL ingestion
Add manuals by URL instead of uploading a PDF. ManualNinja fetches the page, follows pagination across all sub-pages, and extracts the full manual text. SSRF-protected (internal IPs blocked), 50 MB per page limit, up to 200 pages per manual.
Authentification
Jetons JWT + Google OAuth 2.0 + LinkedIn OAuth 2.0 (OpenID Connect). Vérification par e-mail avec SMTP configurable.
Paiements
Stripe — abonnements récurrents via Checkout, portail client pour la gestion en libre-service, événements de cycle de vie pilotés par webhook.
Proxy inverse
Caddy — HTTPS automatique via Let's Encrypt, support HTTP/2, HTTP/3.

Multi-tenant et isolation

Chaque organisation cliente dispose d'un espace de travail entièrement isolé :

  • Utilisateurs, manuels et sessions de chat limités par organisation
  • Les charges utiles Qdrant incluent org_id — la recherche vectorielle est toujours filtrée
  • Limites par palier : questions/mois, stockage, longueur des questions, nombre de manuels
  • Toutes les clés d'intégration (Stripe, Google, LinkedIn, LLM, SMTP, reCAPTCHA) sont configurables par déploiement via l'interface d'administration

Sécurité et protection des données

ManualNinja est conçu avec la sécurité comme priorité de premier ordre. Chaque couche de la stack est durcie pour protéger vos données et votre vie privée.

Chiffrement de bout en bout

Tout le trafic est servi sur HTTPS avec TLS 1.2/1.3 via Caddy avec certificats Let's Encrypt automatiques. Aucune connexion en texte clair n'est jamais exposée.

Authentification sécurisée

Authentification basée sur JWT avec des secrets forts, hachage de mot de passe bcrypt, OAuth 2.0 avec validation d'état protégée CSRF, et jetons à courte durée de vie.

Protection contre les attaques par force brute

Limitation de débit de connexion (10 tentatives par 5 minutes par IP), limitation de débit d'inscription (3 par IP par jour), et Google reCAPTCHA obligatoire.

Isolation multi-tenant

Chaque requête de base de données et chaque recherche vectorielle est limitée par organization_id. Aucune fuite de données entre tenants n'est possible — vos manuels ne sont jamais mélangés avec ceux d'un autre client.

Téléchargements de fichiers sécurisés

Les téléchargements PDF sont validés par magic bytes, type de contenu, et une limite de taille stricte de 50 Mo. Les fichiers sont stockés avec des noms UUID et ne sont jamais servis directement.

Webhooks vérifiés

Les webhooks de paiement Stripe sont toujours vérifiés par signature. Aucun événement de paiement non authentifié n'est jamais traité — le système ignore les requêtes falsifiées.

Services internes uniquement

Le backend FastAPI et la base de données vectorielle Qdrant se lient uniquement à 127.0.0.1. Ils ne sont jamais directement accessibles depuis Internet.

Vérification par e-mail

L'inscription nécessite une vérification par e-mail avec des jetons à durée limitée (expiration de 24 heures). Les comptes non vérifiés ne peuvent pas se connecter.

Journalisation d'audit

Toutes les actions d'admin et de superadmin — création d'organisation, gestion d'utilisateurs, modifications de paramètres — sont journalisées dans une table d'audit dédiée.

Vous voulez voir ça en action ?