ข้อมูลจำเพาะทางเทคนิค
สถาปัตยกรรม RAG สมัยใหม่พร้อม AI Vision
ภาพรวมสถาปัตยกรรม
ManualNinja เป็นแอปพลิเคชัน RAG แบบผู้เช่าหลายราย มีแบ็คเอนด์ Python ฟรอนต์เอนด์ React SPA ฐานข้อมูล PostgreSQL และคลังเวกเตอร์ Qdrant PDF ถูกแยกวิเคราะห์ แบ่งส่วน ฝัง และนำเสนอเป็นคำตอบที่มีอ้างอิงผ่านอินเทอร์เฟซแชท แพลตฟอร์มประกอบด้วย AI Vision สำหรับวิเคราะห์ภาพ ล็อกอินโซเชียล OAuth และการเรียกเก็บเงินสมัครสมาชิกผ่าน Stripe
API แบ็คเอนด์
FastAPI + Uvicorn (Python 3.13) REST endpoints สำหรับการยืนยันตัวตน คู่มือ แชท การเรียกเก็บเงิน และการจัดการ การยืนยันตัวตน JWT กับ OAuth2
ฟรอนต์เอนด์
React 18 + Vite แอปพลิเคชันหน้าเดียวพร้อม UI แชท แผงผู้ดูแล พอร์ทัลเรียกเก็บเงิน และแดชบอร์ดผู้ดูแลสูงสุด
ฐานข้อมูล
PostgreSQL 17 เก็บองค์กร ผู้ใช้ คู่มือ เซสชันแชท การติดตามการใช้งาน และการตั้งค่าที่ปรับได้
คลังเวกเตอร์
Qdrant 1.19 การค้นหาเชิงความหมายเหนือส่วนคู่มือพร้อมการกรองตามองค์กร
Embeddings
BAAI/bge-small-en-v1.5 (384 dimensions, CPU). Local inference — no external embedding API calls.
LLM (ข้อความ)
API ที่รองรับ OpenAI โมเดลเริ่มต้น: 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 tokens + 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.
Reverse proxy
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 สร้างขึ้นโดยมีความปลอดภัยเป็นลำดับแรก ทุกชั้นของระบบได้รับการเสริมความแข็งแกร่งเพื่อปกป้องข้อมูลและความไว้วางใจของลูกค้า
การเข้ารหัสจากต้นทางถึงปลายทาง
การรับส่งข้อมูลทั้งหมดผ่าน HTTPS ด้วย TLS 1.2/1.3 ผ่าน Caddy พร้อมใบรับรอง Let’s Encrypt อัตโนมัติ ไม่รับการเชื่อมต่อแบบข้อความธรรมดา
การยืนยันตัวตนที่ปลอดภัย
การยืนยันตัวตน JWT กับรหัสลับที่แข็งแกร่ง แฮชรหัสผ่าน bcrypt OAuth 2.0 กับการตรวจสอบ state ป้องกัน CSRF และใช้รหัสแลกเปลี่ยนอายุสั้นแทนโทเค็นใน URL
การป้องกัน Brute-force
การจำกัดอัตราการล็อกอิน (10 ครั้งต่อ 5 นาทีต่อ IP) การจำกัดอัตราการสมัคร (3 ครั้งต่อ IP ต่อวัน) และบังคับ 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.