دليل
كيف تستضيف 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 في وضع الخمول | نحو 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 (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:
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. تطلب صفحة البروكسي العكسي ثلاثة أشياء:
- اضبط
N8N_WEBHOOK_URLعلى العنوان العام، مثلhttps://n8n.example.com/. لقد حلّ محلWEBHOOK_URL، الذي أصبح مهملًا (deprecated) بدءًا من n8n 2.35.0. على الإصدارات الأقدم من 2.30.0، استخدمWEBHOOK_URL. - اضبط
N8N_PROXY_HOPS=1عندما يكون أمام n8n بروكسي واحد. - اجعل آخر بروكسي يمرّر
X-Forwarded-ForوX-Forwarded-HostوX-Forwarded-Proto.
أي بروكسي يعمل إذا نفّذ هذه الثلاثة. مع Caddy، يتكون الإعداد كله من أربعة أسطر. يضبط توجيه reverse_proxy في Caddy الترويسات الثلاث كلها ويمرّر اتصالات WebSocket دون إعدادات إضافية، ويطلب Caddy شهادة النطاق بنفسه بمجرد أن يشير DNS إلى السيرفر:
# /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) تنفّذ عمليات التشغيل.
# 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) من دون المفتاح أن يستعيدها.
# 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 التحديث مرة واحدة في الشهر على الأقل، حتى لا تقفز أبدًا عبر إصدارات كثيرة دفعة واحدة، وقراءة ملاحظات الإصدار لكل إصدار بين إصدارك والإصدار المستهدف.
# 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 هكذا:
# 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 بهولندا.
المصادر
المعلومات في هذا الدليل مأخوذة من هذه الصفحات.