مقدمة حول سير العمل
سير عمل يحوّل Nextcloud من مساحة تخزين ملفات إلى قاعدة معرفة ذكية: كل ملف يُرفع يُفهرس تلقائياً، يمكن للفريق سؤال ‘أين معلومة X؟’ أو ‘لخّص المستند Y’ من تطبيق Nextcloud نفسه.
الهدف من سير العمل
تفعيل البحث الذكي عبر ملفات الفريق المخزّنة في Nextcloud دون الحاجة لرفعها لأي خدمة سحابية. الفريق يستخدم Nextcloud كالعادة، الـ AI يعمل في الخلفية ويُجيب عند الطلب.
الأدوات والتقنيات المستخدمة
تم استخدام الأدوات التالية: nextcloud و open-webui و ollama و qdrant و n8n و tika
تفاصيل تنفيذ سير العمل
- مستوى الصعوبة: متوسط
- الوقت المتوقع للإعداد:
- محفز التشغيل (Trigger):
خطوات العمل (الآلية)
- تثبيت Nextcloud وتفعيل تطبيق ‘Flow’ (Workflow scripts) للأحداث.
- في Nextcloud Flow، أنشئ rule: عند إنشاء/تعديل/حذف ملف، POST webhook إلى n8n endpoint.
- في n8n، Webhook trigger يستقبل events من Nextcloud. Code Node يحلّل الـ payload: action, file_id, path, mime_type, user.
- Switch على mime_type: PDF/DOCX/MD/TXT/HTML → معالجة. غيرها (صور، فيديو، zip) → تخطّي.
- HTTP Request إلى Nextcloud API لتنزيل الملف باستخدام app password.
- HTTP Request إلى Tika لاستخراج النص.
- Code Node: chunking إلى 800 tokens مع overlap 100.
- لكل chunk: HTTP Request إلى Ollama (/api/embeddings) مع bge-m3 للحصول على vector.
- HTTP Request إلى Qdrant: upsert نقاط بـ ID = `{file_id}_{chunk_index}`، payload يحوي: file_id, file_path, page (إن متاح), excerpt, user, last_updated.
- إذا الـ action = delete: Qdrant query لكل النقاط بنفس file_id ثم delete.
- للاستعلام: Open WebUI متصل بـ Qdrant كـ external vector DB. Workspace باسم ‘Nextcloud Knowledge’ يحوي إعداد RAG على هذا الـ collection.
- Workspace prompt: ‘أنت مساعد ملفات الفريق. أجب من الملفات فقط، اذكر اسم الملف ومساره. إذا لم تجد، اقترح ملفات قد تكون ذات صلة بناء على عنوانها.’
- نشر bot في Nextcloud Talk (اختياري): الفريق يسأل في غرفة Talk مخصصة، البوت يجيب باستخدام نفس الـ pipeline.
- صلاحيات: عند الاستعلام، n8n يتحقق من صلاحيات المستخدم على الملفات قبل عرض الإجابة — يستبعد ملفات لا يحق له رؤيتها.
- Audit log: من سأل ماذا، أي ملفات استُرجِعت.
وصف مفصل
## المشكلة فرق تستخدم Nextcloud لتخزين ومشاركة الملفات. مع نمو المحتوى (آلاف الملفات على عدة سنوات)، البحث عن معلومة يصبح صعباً. Nextcloud Search يعمل على أسماء الملفات والنصوص الحرفية، لكن لا يفهم استعلامات بلغة طبيعية مثل ‘ما الميزانية المخصصة للمشروع X في تقارير 2023؟’. ## المُدخلات – Nextcloud instance مُعَدّ ويُستخدم من الفريق – Apache Tika لاستخراج النصوص – Ollama: qwen2.5:14b محلياً – embedding model: bge-m3 – Qdrant أو Chroma للـ vector storage – n8n لـ pipeline الفهرسة والاستعلام – Webhook من Nextcloud عند رفع/تعديل ملف ## المُخرجات – Vector index متزامن مع محتوى Nextcloud الفعلي – Chat interface (Open WebUI أو Nextcloud Talk bot) للأسئلة على المحتوى – إجابات مع citations: اسم الملف، المسار في Nextcloud، رابط مباشر – تنبيهات للفريق عند إضافة ملفات بمواضيع ذات اهتمام ## مخطط Mermaid “`mermaid graph TD A[User uploads file to Nextcloud] –> B[Nextcloud Flow webhook] B –> C[n8n receives event] C –> D{File type?} D –>|PDF/DOCX/MD/TXT| E[Tika extract text] D –>|Other| F[Skip] E –> G[Chunk 800 tokens] G –> H[bge-m3 embedding] H –> I[(Qdrant – upsert with file_id)] J[User question in Open WebUI/Talk bot] –> K[Embed query] K –> I I –>|Top-K| L[Ollama qwen2.5] L –>|Answer + Nextcloud links| J M[File deleted] -.event.-> C C –>|Delete from Qdrant| I “` ## نقاط الفشل – Nextcloud Flow لا يدعم كل أنواع الأحداث المطلوبة: قد تحتاج external script يفحص دورياً. – ملفات كبيرة جداً (>50MB): Tika قد يفشل أو يأخذ وقتاً طويلاً. الحل: حد أقصى للحجم، إشعار للمستخدم. – ملفات بصلاحيات حساسة: الـ pipeline يجب أن يحترم صلاحيات Nextcloud — لا يفهرس ملفات لا يستطيع المستخدم العادي رؤيتها. وإلا تسريب. – تكرار الفهرسة: ملف يُعَدَّل 10 مرات في دقيقة يُعاد فهرسته 10 مرات. الحل: debounce في n8n (انتظار 5 دقائق بعد آخر تعديل قبل الفهرسة). – Qdrant out-of-sync: ملف حُذِف لكن Qdrant لم يُحدَّث. الحل: cron job أسبوعي يفحص الـ consistency. – Encoding في metadata: أسماء ملفات عربية قد تظهر مشوّهة. تأكد من UTF-8 في كل الـ pipeline. – الاستعلام يرجع ملفاً قديم النسخة: تحقق من last_updated قبل تقديم الإجابة. ## نقاط المراجعة البشرية – الإجابات تحوي روابط لملفات Nextcloud — المستخدم يفتح الملف ويتحقق – النموذج يفهرس ولا يفسّر السياسات: لا يقرر بل يرشد إلى الوثيقة – للملفات الحساسة (HR، مالي)، صلاحيات الـ index يجب أن تطابق صلاحيات Nextcloud بدقة – مراجعة دورية للـ logs: هل يصل المستخدمون لمعلومات لا يحق لهم؟ إذا نعم، خلل في الصلاحيات – إجابات بـ confidence منخفض تُمَيَّز للمستخدم: ‘لم أجد إجابة قاطعة، الملفات التالية قد تساعد…’ ## اعتبارات الخصوصية البنية كلها على بنية المنظمة. لا يخرج شيء. تحديات: • الصلاحيات: يجب أن تحترم Qdrant صلاحيات Nextcloud. حلان: filtering عند الاستعلام بناء على هوية المستخدم، أو collections منفصلة لكل مجموعة صلاحيات. • Audit: من سأل ماذا — يحفظ. • الملفات الحساسة (مالية، طبية، HR): قد ترغب في استبعادها من الفهرسة بالكامل عبر tag أو folder. • embedding model يعالج كل النص محلياً، لا يخرج. • نسخ احتياطي لـ Qdrant بنفس مستوى أمان Nextcloud. ## ملاحظات الصيانة إعادة فهرسة كاملة سنوياً (embedding model قد يتطور). مراقبة حجم Qdrant — مع نمو Nextcloud، Qdrant ينمو خطياً. تنظيف دوري للنقاط الـ orphaned (ملفات حُذِفت لكن Qdrant لم يلاحظ). اختبار permissions كل ربع سنة بمحاكاة مستخدم بصلاحيات محدودة.