技術仕様
AIビジョン搭載のモダンなRAGアーキテクチャ。
アーキテクチャの概要
ManualNinjaは、Pythonバックエンド、React SPAフロントエンド、PostgreSQLデータベース、Qdrantベクトルストアを持つマルチテナントRAGアプリケーションです。PDFは解析、チャンク化、埋め込みされ、出典付き回答としてチャットインターフェースで提供されます。プラットフォームにはAIビジョンによる画像分析、OAuthソーシャルログイン、Stripeによるサブスクリプション請求が含まれます。
バックエンドAPI
FastAPI + Uvicorn(Python 3.13)。認証、マニュアル、チャット、請求、管理用のRESTエンドポイント。OAuth2によるJWTベース認証。
フロントエンド
React 18 + Vite。チャットUI、管理パネル、請求ポータル、スーパー管理ダッシュボードを備えたシングルページアプリケーション。
データベース
PostgreSQL 17。組織、ユーザー、マニュアル、チャットセッション、使用量追跡、構成可能な設定を保存。
ベクトルストア
Qdrant 1.19。組織スコープフィルタリング付きのマニュアルチャンクのセマンティック検索。
エンベディング
BAAI/bge-small-en-v1.5 (384 dimensions, CPU). Local inference — no external embedding API calls.
LLM(テキスト)
OpenAI互換API。デフォルトモデル:deepseek/deepseek-v3-0324。スーパー管理ダッシュボードから構成可能。
セキュリティのためのローカルAIをご希望ですか?問題ありません。 お問い合わせ
LLM(ビジョン)
Novita AI vision model — google/gemma-3-27b-it. Analyzes uploaded images (device labels, error screens, nameplates) with OCR and structured extraction.
PDF抽出
PyMuPDF(fitz)。正確な出典のためのメタデータ保持付きページレベルチャンク化。
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.
認証
JWTトークン + Google OAuth 2.0 + LinkedIn OAuth 2.0(OpenID Connect)。構成可能なSMTP付きメール認証。
支払い
Stripe — recurring subscriptions via Checkout, customer portal for self-service management, webhook-driven lifecycle events.
リバースプロキシ
Caddy — automatic HTTPS via Let’s Encrypt, HTTP/2, HTTP/3 support.
マルチテナンシー & 分離
各顧客組織は完全に分離されたワークスペースを取得します:
- 組織スコープのユーザー、マニュアル、チャットセッション
- Qdrant payloads include org_id — vector search is always filtered
- ティアベースの制限:月間質問数、ストレージ、質問の長さ、マニュアル数
- すべての統合キー(Stripe、Google、LinkedIn、LLM、SMTP、reCAPTCHA)は管理UIからデプロイごとに構成可能
セキュリティ & データ保護
ManualNinjaはセキュリティを最優先事項として構築されています。スタックのすべてのレイヤーがデータと顧客の信頼を保護するために強化されています。
エンドツーエンド暗号化
すべてのトラフィックはCaddyと自動Let’s Encrypt証明書によりTLS 1.2/1.3でHTTPS経由で提供されます。平文接続は受け入れられません。
セキュアな認証
強力なシークレット付きJWTベース認証、bcryptパスワードハッシュ、CSRF保護付きOAuth 2.0、URLではなく短命交換コードを使用。
ブルートフォース保護
ログインレート制限(IPごとに5分間に10回)、登録レート制限(IPごとに1日3回)、公開登録時の必須Google reCAPTCHA。
マルチテナント分離
Every database query and vector search is scoped by organization_id. No cross-tenant data leakage is possible — your manuals and chats are yours alone.
安全なファイルアップロード
PDF uploads are validated by magic bytes, content type, and a 50 MB hard size limit. Files are stored with UUID names — no path traversal possible.
検証済みWebhook
Stripe payment webhooks are always signature-verified. No unauthenticated payment events are ever processed — the system fails closed if the secret is missing.
内部サービスのみ
The FastAPI backend and Qdrant vector database bind to 127.0.0.1 only. They are never directly accessible from the internet — all external traffic goes through the Caddy reverse proxy.
メール認証
登録には有効期限付きトークン(24時間)によるメール認証が必要です。未認証のアカウントはログインできません。
監査ログ
All admin and superadmin actions — organization creation, user management, settings changes — are logged to a dedicated audit trail for accountability and compliance.