دليل

كيف تستضيف n8n بنفسك على VPS

يُعدّ هذا الدليل n8n على VPS بنظام Linux باستخدام Docker Compose وPostgres وHTTPS، ثم يتناول القرارات التي تأتي لاحقًا: متى تشغّل وضع queue، وما الذي تنسخه احتياطيًا، وكيف تحدّث دون أن تفقد بيانات الاعتماد (credentials). أرقام الإصدارات وأسماء المتغيرات والحدود مأخوذة من توثيق n8n كما هو في نوفمبر 2026. راجع الصفحات المرتبطة قبل أن تعتمد على أي تفصيل، لأن n8n يتغير بسرعة.

بقلم فريق Evorxaتاريخ النشر

ما الذي تسمح به الرخصة

يُنشر n8n المستضاف ذاتيًا بموجب Sustainable Use License، وهي رخصة من نوع fair-code كتبتها n8n عام 2022. تتيح لك استخدام البرنامج وتعديله وإعادة توزيعه مجانًا، مع ثلاثة قيود: يمكنك استخدامه فقط لأغراض عملك الداخلية أو للاستخدام غير التجاري والشخصي؛ ويمكنك تقديمه للآخرين مجانًا فقط ولأغراض غير تجارية؛ ولا يجوز لك إزالة إشعارات الترخيص أو حقوق النشر الخاصة بـ n8n.

السطر الذي يحسم معظم الحالات هو أول سطر في الأسئلة الشائعة عن الرخصة لدى n8n: إذا كانت مسارات العمل (workflows) تُنشأ أو تُعدَّل فقط بواسطتك أو بواسطة أشخاص في مؤسستك، فيمكنك استخدام رخصة Community مجانًا.

مسموح بموجب رخصة Community

  • تشغيل عملك الخاص عليه، والمشاريع الشخصية، والتعلّم أو البحث.
  • بناء عمليات أتمتة للعملاء على نسختك (instance)، طالما لا يستطيع العملاء إنشاءها أو تعديلها.
  • تقاضي أجر من العملاء مقابل بناء مسارات العمل وإعدادها وصيانتها، ومقابل التدريب والاستشارات.
  • استخدام n8n في الخلفية داخل منتجك الخاص، حيث يُشغّل المستخدمون عمليات أتمتة بنيتها أنت، بل ويربطون حساباتهم الخاصة.
  • تشغيل عدة نسخ.

غير مسموح من دون اتفاقية تجارية

  • استضافة n8n كخدمة يبني فيها عملاؤك مسارات العمل.
  • السماح لمستخدمين من خارج مؤسستك ببناء مسارات العمل الخاصة بهم أو ضبطها عبر منتجك، سواء عبر واجهتك الخاصة أو API أو MCP أو وكيل ذكاء اصطناعي يتصرف نيابة عنهم.
  • عمل fork للكود لإطلاق منتج أتمتة خاص بك، أو تقديم n8n تحت علامتك (white-label) بإزالة علامته التجارية.
  • استخدام ميزات المؤسسات التي تطلب مفتاح ترخيص من دون رخصة Enterprise.

إذا كانت خطتك تقع بين القائمتين، تطلب منك n8n أن تراسل license@n8n.io قبل أن تبنيها.

ما الحجم الذي يحتاجه السيرفر

n8n خفيف على المعالج. تقول صفحة المتطلبات المسبقة إن متطلبات الذاكرة عادةً أهم من المعالج، وإن نسخة n8n Cloud في وضع الخمول تستهلك نحو 100 MB. ما يرفع استهلاك الذاكرة هو العمل نفسه: حمولات JSON الكبيرة، والملفات الثنائية مثل ملفات PDF والصور، وكثرة العقد (nodes) في مسار عمل واحد، وعقدة Code، وعمليات التشغيل التجريبية اليدوية التي تحتفظ بنسخة إضافية من البيانات للمحرر.

الأحجام التي يذكرها توثيق n8n
الإعدادالرقم الموثّقالمصدر
n8n في وضع الخمولنحو 100 MB RAMصفحة المتطلبات المسبقة، n8n Cloud في وضع الخمول
عملية n8n، النطاق المعتادمن 320 MB إلى 2 GB RAMصفحة المتطلبات المسبقة
تخزين قاعدة البياناتمن 512 MB إلى 4 GB SSDصفحة المتطلبات المسبقة
حزمة Compose كاملة مع بيئة n8n Assistant المعزولة (sandbox)4 GB RAM و2 vCPU على الأقلدليل التثبيت عبر Docker Compose

أضف Postgres والبروكسي العكسي (reverse proxy) ونظام التشغيل فوق رقم n8n. الرقم الذي يجب أن تخطط له هو الذروة أثناء أثقل مسار عمل لديك، لا رقم الخمول: شغّل ذلك المسار مرة واحدة على السيرفر الجديد وراقب docker stats أثناء تنفيذه. إذا كنت تنوي تشغيل بيئة n8n Assistant المعزولة من ملف Compose الرسمي، فاعتبر 4 GB و2 vCPU حدًا أدنى.

Docker Compose مع Postgres

افتراضيًا يخزّن n8n كل شيء في SQLite. يقول دليل Docker Compose إن SQLite مناسب للتجربة، لكن النسخة الإنتاجية التي يستخدمها أكثر من عدد قليل من المستخدمين، أو التي تعمل فيها مسارات العمل على مدار الساعة، يجب أن تستخدم Postgres. وضع queue لا يدعم SQLite إطلاقًا، لذا فإن البدء على Postgres يوفّر عليك عملية ترحيل لاحقًا.

ثبّت Docker Engine مع إضافة Compose، وأنشئ مجلدًا مثل ~/n8n، وضع فيه ملفين. أولًا ملف .env. ثبّت N8N_VERSION على رقم إصدار حقيقي من صفحة إصدارات n8n على GitHub، وولّد مفتاح التشفير بنفسك حتى يكون مدوّنًا في مكان آخر غير السيرفر:

.env
# .env (keep it out of version control)
N8N_VERSION=2.xx.x
N8N_HOST=n8n.example.com
N8N_ENCRYPTION_KEY=change-me-long-random-string
POSTGRES_USER=n8n
POSTGRES_PASSWORD=change-me-password
POSTGRES_DB=n8n
GENERIC_TIMEZONE=Europe/Amsterdam

ثم compose.yaml:

compose.yaml
services:
  postgres:
    image: postgres:18
    restart: always
    environment:
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: ${POSTGRES_DB}
      PGDATA: /var/lib/postgresql/data
    volumes:
      - db-storage:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -h localhost -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
      interval: 5s
      timeout: 5s
      retries: 10

  n8n:
    image: n8nio/n8n:${N8N_VERSION}
    restart: always
    ports:
      - "127.0.0.1:5678:5678"
    environment:
      N8N_HOST: ${N8N_HOST}
      N8N_PORT: 5678
      N8N_PROTOCOL: https
      NODE_ENV: production
      N8N_WEBHOOK_URL: https://${N8N_HOST}/
      N8N_PROXY_HOPS: 1
      N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
      GENERIC_TIMEZONE: ${GENERIC_TIMEZONE}
      TZ: ${GENERIC_TIMEZONE}
      DB_TYPE: postgresdb
      DB_POSTGRESDB_HOST: postgres
      DB_POSTGRESDB_PORT: 5432
      DB_POSTGRESDB_DATABASE: ${POSTGRES_DB}
      DB_POSTGRESDB_USER: ${POSTGRES_USER}
      DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD}
    volumes:
      - n8n_data:/home/node/.n8n
    depends_on:
      postgres:
        condition: service_healthy

volumes:
  db-storage:
  n8n_data:
  • أبقِ سطر PGDATA. غيّر Postgres 18 موقع البيانات الافتراضي، ومن دون هذا السطر تُكتب قاعدة البيانات خارج وحدة التخزين (volume) وتبدأ فارغة بعد إعادة إنشاء الحاوية.
  • المنفذ 5678 مربوط بـ 127.0.0.1، لذا لا يستطيع الوصول إلى n8n إلا البروكسي العكسي الموجود على السيرفر نفسه. لا يلزم فتح أي منفذ للإنترنت سوى 80 و443.
  • وحدة التخزين n8n_data في /home/node/.n8n تظل مهمة مع Postgres: فهي تحتوي على ملف مفتاح التشفير والسجلات وملفات التحكم بالمصدر (source control).

شغّله عبر docker compose up -d. ينشئ n8n جداوله في Postgres عند أول تشغيل. البيانات من نسخة SQLite سابقة لا تنتقل تلقائيًا؛ صدّر مسارات العمل وبيانات الاعتماد بأوامر CLI الموجودة في قسم النسخ الاحتياطي ثم استوردها.

HTTPS والبروكسي العكسي وروابط webhook

يبني n8n روابط webhook من N8N_PROTOCOL وN8N_HOST وN8N_PORT. وخلف البروكسي ينتج عن ذلك رابط خاطئ، لأن n8n يستمع على المنفذ 5678 بينما الرابط العام على 443. تطلب صفحة البروكسي العكسي ثلاثة أشياء:

  1. اضبط N8N_WEBHOOK_URL على العنوان العام، مثل https://n8n.example.com/. لقد حلّ محل WEBHOOK_URL، الذي أصبح مهملًا (deprecated) بدءًا من n8n 2.35.0. على الإصدارات الأقدم من 2.30.0، استخدم WEBHOOK_URL.
  2. اضبط N8N_PROXY_HOPS=1 عندما يكون أمام n8n بروكسي واحد.
  3. اجعل آخر بروكسي يمرّر X-Forwarded-For وX-Forwarded-Host وX-Forwarded-Proto.

أي بروكسي يعمل إذا نفّذ هذه الثلاثة. مع Caddy، يتكون الإعداد كله من أربعة أسطر. يضبط توجيه reverse_proxy في Caddy الترويسات الثلاث كلها ويمرّر اتصالات WebSocket دون إعدادات إضافية، ويطلب Caddy شهادة النطاق بنفسه بمجرد أن يشير DNS إلى السيرفر:

Caddyfile
# /etc/caddy/Caddyfile
n8n.example.com {
    reverse_proxy 127.0.0.1:5678
}

إذا ظهرت روابط webhook في المحرر بالشكل localhost:5678، أو رفضت خدمات خارجية الرابط، فإن N8N_WEBHOOK_URL غير مضبوط أو أن الحاوية لم يُعَد إنشاؤها بعد ضبطه. شغّل docker compose up -d مرة أخرى بعد أي تغيير في متغيرات البيئة.

وضع queue: متى تحتاج إلى Redis وعمّال (workers)

في الوضع الافتراضي، تشغّل عملية n8n واحدة المحرر، وتستقبل webhooks، وتنفّذ كل مسارات العمل. هذا يكفي لمعظم النسخ التي يستخدمها فريق واحد. وهناك علامتان على أنه لم يعد كافيًا: تتراكم عمليات التنفيذ خلف العمليات الطويلة، أو يتوقف المحرر عن الاستجابة أثناء تشغيل مسارات العمل الثقيلة.

جرّب الحل الأرخص أولًا. يضع N8N_CONCURRENCY_PRODUCTION_LIMIT حدًا لعدد عمليات التنفيذ الإنتاجية التي تعمل في الوقت نفسه ويضع الباقي في طابور؛ وهو معطّل افتراضيًا. إذا ظلت العملية الواحدة هي عنق الزجاجة، فإن وضع queue يقسّم العمل: العملية الرئيسية تستقبل المشغّلات (triggers) وwebhooks، وRedis يحتفظ بالطابور، وعمليات العمّال (workers) تنفّذ عمليات التشغيل.

إضافات compose.yaml
# 1. in the n8n service: name the environment block, add the queue settings
    environment: &n8n-env
      # ...everything from before, plus:
      EXECUTIONS_MODE: queue
      QUEUE_BULL_REDIS_HOST: redis
      QUEUE_BULL_REDIS_PORT: 6379
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_started

# 2. two new services
  redis:
    image: redis:7
    restart: always

  n8n-worker:
    image: n8nio/n8n:${N8N_VERSION}
    restart: always
    command: worker --concurrency=10
    environment: *n8n-env
    depends_on:
      - postgres
      - redis
  • تحتاج كل عملية إلى N8N_ENCRYPTION_KEY نفسه، وإعدادات قاعدة البيانات نفسها، وإصدار الصورة نفسه.
  • ينفّذ العامل الواحد 10 مهام في الوقت نفسه افتراضيًا. توصي n8n بـ 5 أو أكثر لكل عامل: فالكثير من العمّال بتزامن منخفض قد يستنفدون مجمع اتصالات قاعدة البيانات (connection pool).
  • وضع queue مع SQLite غير مدعوم، ولا يمكن أن تبقى البيانات الثنائية على نظام الملفات المحلي؛ وتشير n8n إلى التخزين الخارجي S3 لهذا الغرض.
  • لحركة webhook الكثيفة، أضف معالجات webhook (n8n webhook) واضبط N8N_DISABLE_PRODUCTION_MAIN_PROCESS=true على العملية الرئيسية. تشغيل عدة عمليات رئيسية يحتاج إلى رخصة Enterprise.

نسخ احتياطية تستطيع استعادة بيانات الاعتماد

تتكون النسخة الاحتياطية الكاملة من جزأين، وفقًا لـ صفحة النسخ الاحتياطي والاستعادة لدى n8n: مجلد .n8n الذي يحتوي على مفتاح التشفير، وقاعدة بيانات Postgres. بيانات الاعتماد في قاعدة البيانات مشفّرة بذلك المفتاح، لذا لا يمكن لتفريغ قاعدة البيانات (dump) من دون المفتاح أن يستعيدها.

shell
# workflows and credentials as JSON, one file each
docker compose exec n8n n8n export:workflow --backup --output=/home/node/.n8n/backups/workflows/
docker compose exec n8n n8n export:credentials --backup --output=/home/node/.n8n/backups/credentials/

# the whole Postgres database
docker compose exec -T postgres pg_dumpall -U n8n > n8n-db-$(date +%F).sql
  • الخيار --backup يكتب كل مسار عمل وكل بيان اعتماد في ملف JSON مستقل. استخدم مجلدات منفصلة لمسارات العمل ولبيانات الاعتماد؛ يفشل استيراد بيانات الاعتماد عندما تشاركها ملفات مسارات العمل المجلد نفسه.
  • عمليات التصدير عبر CLI لا تشمل المستخدمين وسجل التنفيذ والمتغيرات وإعدادات النسخة، بما في ذلك المفتاح. إنها تنقل مسارات العمل بين النسخ، ولا تعيد بناء نسخة.
  • انسخ ملف التفريغ وملفات التصدير ووحدة التخزين .n8n إلى خارج السيرفر. النسخة الاحتياطية الموجودة على القرص نفسه لا تنجو إذا فقدت السيرفر.
  • تصل مسارات العمل المستوردة وهي معطّلة. خطط لإعادة تفعيلها بعد الاستعادة.

التحديث من دون مفاجآت

تقترح صفحة التحديث لدى n8n التحديث مرة واحدة في الشهر على الأقل، حتى لا تقفز أبدًا عبر إصدارات كثيرة دفعة واحدة، وقراءة ملاحظات الإصدار لكل إصدار بين إصدارك والإصدار المستهدف.

shell
# 1. back up first (see above), then set the new N8N_VERSION in .env
docker compose pull
docker compose up -d
docker compose logs -f n8n

خذ النسخة الاحتياطية الكاملة أولًا. تشغّل كل عملية عمليات ترحيل قاعدة البيانات المعلّقة عند بدء تشغيلها، وإعادة وسم الصورة (image tag) إلى الإصدار القديم لا تعكسها. التراجع يعني تشغيل n8n db:revert لكل عملية ترحيل على حدة باستخدام الصورة الأحدث، أو استعادة النسخة الاحتياطية. في وضع queue، حدّث العملية الرئيسية والعمّال ومعالجات webhook إلى الوسم نفسه معًا.

الأعطال الشائعة وحلولها

الأعراض وسببها المعتاد
ما تراهالسبب المرجّحما الذي تفعله
«Execution stopped at this node (n8n may have run out of memory while executing it)» أو «Connection Lost» أو أخطاء 503نفدت ذاكرة العملية فأُعيد تشغيلهاقسّم البيانات إلى دفعات (200 صف بدلًا من 10,000)، وانقل الخطوات الثقيلة إلى مسارات عمل فرعية (sub-workflows)، وتجنّب عقدة Code والتشغيل اليدوي مع البيانات الكبيرة
«Allocation failed - JavaScript heap out of memory» في السجلاتبلغت ذاكرة heap في Node.js حدهاارفع الحد عبر NODE_OPTIONS (انظر أدناه) إذا كانت لدى السيرفر RAM متاحة، أو أضف RAM
روابط webhook تُظهر localhost أو منفذًا خاطئًاN8N_WEBHOOK_URL غير مضبوط أو لم يُعَد إنشاء الحاويةاضبطه على رابط HTTPS العام وشغّل docker compose up -d
يفشل فك تشفير بيانات الاعتماد بعد النقلمفتاح تشفير مختلفاستعد مجلد .n8n الأصلي أو اضبط N8N_ENCRYPTION_KEY الأصلي
يتوقف Postgres مع الرسالة «database files are incompatible with server»انتقلت الصورة إلى إصدار رئيسي جديد فوق مجلد بيانات قديمارجع إلى الوسم القديم، ونفّذ pg_dumpall، ثم اتبع دليل الترقية الخاص بـ PostgreSQL
القرص يمتلئ باستمرارسجل التنفيذالحذف التلقائي (pruning) مفعّل افتراضيًا (14 يومًا أو 10,000 عملية تنفيذ)؛ اخفض EXECUTIONS_DATA_MAX_AGE أو EXECUTIONS_DATA_PRUNE_MAX_COUNT

حلول الذاكرة مأخوذة من صفحة n8n عن الأخطاء المتعلقة بالذاكرة. يبدو رفع حد heap هكذا:

compose.yaml
# n8n service environment: raise the Node.js heap limit (value in MB)
      NODE_OPTIONS: --max-old-space-size=2048

تشغيل هذا على Evorxa

كل ما سبق يعمل على سيرفر Evorxa، مع صلاحيات root ووصول SSH. يمكنك البدء من صورة Ubuntu أو Debian عادية، وتكون جاهزة عادةً خلال دقيقة تقريبًا، أو اختيار تطبيق n8n بنقرة واحدة، الذي يستغرق تثبيته بضع دقائق إضافية. تبدأ الخطط من $2.99 شهريًا، وتُدفع مسبقًا شهريًا أو لستة أشهر أو سنويًا. تعمل السيرفرات في منطقة واحدة هي Eygelshoven بهولندا.

المصادر

المعلومات في هذا الدليل مأخوذة من هذه الصفحات.

  1. n8n: رخصة Sustainable Use License والأسئلة الشائعة عنها
  2. n8n: التثبيت باستخدام Docker Compose (قسم Postgres)
  3. n8n: ضبط روابط webhook مع بروكسي عكسي
  4. n8n: تفعيل وضع queue
  5. n8n: النسخ الاحتياطي والاستعادة
  6. n8n: الأخطاء المتعلقة بالذاكرة