عقدة Read/Write Files from Disk تظهر خطأ "is not writable" على بيئات متعددة (Windows و Docker) - v2.26.4

وصف المشكلة/الخطأ/السؤال

مرحبا بالجميع،
أواجه مشكلة مستمرة مع عقدة Read/Write Files from Disk (v1.1) عند محاولة تنفيذ عملية “Write File to Disk”. فهي تطرح باستمرار خطأ بأن الملف غير قابل للكتابة، بغض النظر عن المجلد أو أذونات المستخدم أو وضع التنفيذ.

بيئتي:

  • إصدار n8n: 2.26.4 (Self Hosted)
  • وضع التنفيذ: تم الاختبار على كل من Windows الأصلي (إعداد Node.js) و Docker Desktop (WSL2 backend).
  • وضع قاعدة البيانات: تم الاختبار مع كل من binaryDataMode: filesystem و binaryDataMode: database.

ما حاولت حتى الآن:

  1. Windows الأصلي: استهدفت المجلدات المحلية (C:\n8n\poema.json) ومسارات مؤقتة. حصلت على خطأ “غير قابل للكتابة”.
  2. Docker (مستخدم عادي): حجم مثبت -v c:/n8n:/data واستهدفت /data/poema.json. فشل.
  3. Docker Isolated Path: حاولت الكتابة مباشرة إلى مسارات محلية في حاوية Docker مثل /tmp/poema.json و /home/node/poema.json. فشل برسالة الخطأ نفسها.
  4. إنشاء الملف مسبقاً: قمت بإنشاء ملف poema.json فارغ يدويًا (0 كيلوبايت) داخل المجلد الوجهة للتحقق مما إذا كانت مشكلة إنشاء مقابل تحديث. لا يزال يطرح “غير قابل للكتابة”.
  5. مستخدم جذر Docker: أعدت إنشاء الحاوية مع فرض مستخدم جذر (-u root) للالتفاف حول أي تضاربات محتملة بين المضيف والحاوية على الحجم المثبت. السلوك يستمر.

مكدس تتبع الأخطاء:

{
  "errorMessage": "The file \"/data/poema.json\" is not writable.",
  "errorDetails": {
    "rawErrorMessage": [
      "The file \"/data/poema.json\" is not writable."
    ]
  },
  "n8nDetails": {
    "nodeName": "Read/Write Files from Disk",
    "nodeType": "n8n-nodes-base.readWriteFile",
    "nodeVersion": 1.1,
    "operation": "write",
    "itemIndex": 0,
    "n8nVersion": "2.26.4 (Self Hosted)",
    "stackTrace": [
      "NodeApiError: The file \"/data/poema.json\" is not writable.",
      "    at ExecuteContext.execute (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/n8n-nodes-base@file+packages+nodes-base_@aws-sdk+credential-providers@3.808.0_asn1.js@5_8da18263ca0574b0db58d4fefd8173ce/node_modules/n8n-nodes-base/nodes/Files/ReadWriteFile/actions/write.operation.ts:130:10)"
    ]
  }
}
بما أن هذا يحدث حتى بداخل /tmp/ في حاوية تعمل بصلاحيات جذر، يبدو أنه تنبيه خاطئ في منطق التحقق الداخلي للعقدة (تحديداً حول write.operation.ts:130).
هل هذا انحدار معروف في v2.26.x أم هناك أي متغير بيئة محدد يجب أن أعدّله لإصلاح فحص التحقق هذا؟
شكراً لك مقدماً على مساعدتك!

## ما هي رسالة الخطأ (إن وجدت)؟

{
"errorMessage": "The file "/data/poema.json" is not writable.",
"errorDetails": {
"rawErrorMessage": [
"The file "/data/poema.json" is not writable."
]
},
"n8nDetails": {
"nodeName": "Read/Write Files from Disk",
"nodeType": "n8n-nodes-base.readWriteFile",
"nodeVersion": 1.1,
"operation": "write",
"itemIndex": 0,
"n8nVersion": "2.26.4 (Self Hosted)",
"stackTrace": [
"NodeApiError: The file "/data/poema.json" is not writable.",
"    at ExecuteContext.execute (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/n8n-nodes-base@file+packages+nodes-base\_@aws-sdk+credential-providers@3.808.0_asn1.js@5_8da18263ca0574b0db58d4fefd8173ce/node_modules/n8n-nodes-base/nodes/Files/ReadWriteFile/actions/write.operation.ts:130:10)"
]
}
}

## يرجى مشاركة سير العمل الخاص بك

سير العمل عبارة عن هيكل بسيط من 3 عقد:
HTTP Request ➡️ Convert to File ➡️ Read/Write Files from Disk (Write operation).

تُخرج عقدة Convert to File بيانات ثنائية بنجاح (تقريباً 27.5 كيلوبايت)، لكن التنفيذ يتوقف تماماً عند عقدة Read/Write Files from Disk.

## مشاركة المخرجات التي أرجعتها العقدة الأخيرة

أواجه مشكلة مستمرة مع عقدة Read/Write Files from Disk (v1.1) عند محاولة تنفيذ عملية "Write File to Disk". فهي تطرح باستمرار خطأ "غير قابل للكتابة"، بغض النظر عن المجلد أو أذونات المستخدم أو وضع التنفيذ.
ما حاولت حتى الآن لعزل المشكلة:
1. Windows الأصلي: استهدفت المجلدات المحلية (C:\n8n\poema.json) ومسارات مؤقتة. حصلت على الخطأ.
2. Docker (مستخدم عادي): حجم مثبت -v c:/n8n:/data واستهدفت /data/poema.json. فشل.
3. Docker Isolated Path: حاولت الكتابة مباشرة إلى مسارات محلية في حاوية Docker مثل /tmp/poema.json و /home/node/poema.json. فشل برسالة الخطأ نفسها.
4. إنشاء الملف مسبقاً: قمت بإنشاء ملف poema.json فارغ يدويًا (0 كيلوبايت) داخل المجلد الوجهة للتحقق مما إذا كانت مشكلة إنشاء مقابل تحديث. لا يزال يطرح "غير قابل للكتابة".
5. مستخدم جذر Docker: أعدت إنشاء الحاوية مع فرض مستخدم جذر (-u root) للالتفاف حول أي تضاربات محتملة بين المضيف والحاوية على الحجم المثبت. السلوك يستمر.
بما أن هذا يحدث حتى بداخل /tmp/ في حاوية تعمل بصلاحيات جذر، يبدو أنه تنبيه خاطئ في منطق التحقق الداخلي للعقدة (تحديداً حول write.operation.ts:130).

## معلومات حول إعداد n8n الخاص بك

* **إصدار n8n:**
* **قاعدة البيانات (الافتراضي: SQLite):**
* **إعداد n8n EXECUTIONS_PROCESS (الافتراضي: own, main):**
* **تشغيل n8n عبر (Docker, npm, n8n cloud, desktop app):**
* **نظام التشغيل:**


* إصدار n8n: 2.26.4 (Self Hosted)
* قاعدة البيانات: SQLite (الافتراضي)
* وضع التنفيذ: عادي (وتم الاختبار عبر Docker / WSL2 backend)
* وضع البيانات الثنائية: database (تم الاختبار أيضاً مع filesystem)

@uidb4056 عزل رائع، فهو يشير مباشرة إلى السبب: هذا ليس متعلقًا بأذونات نظام التشغيل، بل هو بوابة وصول الملفات الخاصة بـ n8n. أطلقت الإصدارة 2.0 تغييرًا جذريًا يقيد الوصول إلى نظام الملفات لعقدة Read/Write Files، لذا فهو يحظر الكتابة قبل أن يراها نظام التشغيل. هذا هو السبب في أن root و777 و/tmp والماس اليدوي لا يغيرون شيئًا، إنها قائمة سماح على مستوى التطبيق، وليست إذن نظام ملفات.

متغير البيئة الذي تريده هو N8N_RESTRICT_FILE_ACCESS_TO، عيّنه إلى المجلد المستهدف (مفصول بفاصلة منقوطة لأكثر من واحد)، على سبيل المثال /data، ثم أعد تشغيل n8n. تحقق أيضًا من عدم حظر المسار بواسطة N8N_BLOCK_FILE_ACCESS_TO_N8N_FILES (مفعل بشكل افتراضي، يحظر .n8n).

إذا فشل الأمر زالت، فهو انحدار معروف في 2.x (GitHub #23318 / #24829)، والحل البديل هو عقدة Execute Command، التي تكتب بشكل جيد حيث ترفض هذه العقدة.

بالإضافة إلى ما ذكره achamm، إذا كانت هناك عدة دلائل فإن متغير البيئة أعلاه لن يعمل. ستحتاج بعد ذلك إلى تعيينه بهذه الطريقة:

N8N_RESTRICT_FILE_ACCESS_TO: ""

السيناريو أ: إذا كنت تكتب نصًا خامًا أو بيانات JSON

مرر البيانات ديناميكيًا باستخدام التعبيرات:

Bash

echo '{{ JSON.stringify($json) }}' > /data/poema.json

(أو استهدف خاصيتك المحددة، على سبيل المثال، {{ $json.myText }})

السيناريو ب: إذا كنت تتعامل مع البيانات الثنائية

إذا كان محتوى الملف يأتي من عقدة سابقة كائن ثنائي، يمكنك كتابة التدفق الثنائي مباشرة إلى القرص باستخدام أوامر shell القياسية:

Bash

cat {{ $binary.data }} > /data/poema.json

يعمل هذا كحل قوي وموثوق به في انتظار إصدار تصحيح لمنطق التحقق الأساسي في عقدة readWriteFile.

مرحبا @achamm،

شكرا جزيلا! لقد نجحت تماما.

المشكلة كانت فعلا قيد التقييد على مستوى التطبيق الذي تم إدخاله في الإصدار v2.x. إعادة إنشاء حاوية Docker مع متغيرات البيئة التي قدمتها حلت المشكلة بالكامل:

-e N8N_RESTRICT_FILE_ACCESS_TO=/data -e N8N_BLOCK_FILE_ACCESS_TO_N8N_FILES=false

عند تعيين تلك المتغيرات، عملت عقدة القراءة/الكتابة بشكل مثالي داخل الحجم المثبت بدون أخطاء أذونات. تم تحديده كحل!

أهلاً وسهلاً! يسعدني أن أساعدك!