Tropic Host

n8n: ما هو وكيفية تثبيته على VPS باستخدام Docker Compose

3 دقيقة للقراءة
Tropic
n8n: ما هو وكيفية تثبيته على VPS باستخدام Docker Compose

n8n على VPS: منصة الأتمتة الخاصة بك دون أعمال يدوية متكررة

يصل طلب من الموقع. يتحقق n8n من البيانات، ويفحص التكرارات، وينشئ صفقة، ويجهز مسودة رد باستخدام الذكاء الاصطناعي، ثم يرسل إشعاراً إلى المدير في Telegram. لا يتدخل الشخص إلا عندما تكون هناك حاجة إلى قرار، وليس لنقل البيانات بين علامات تبويب المتصفح.

فيما يلي سنوضح طريقة عمل n8n وكيفية تثبيته على VPS باستخدام Docker Compose وPostgreSQL وHTTPS وتنفيذ التعليمات البرمجية في بيئة معزولة.

n8n في سبع خطوات

خطة تشغيل مختصرة:

  1. أنشئ VPS واربط نطاقاً فرعياً به، مثل n8n.example.com.
  2. ثبّت Docker وDocker Compose.
  3. شغّل n8n مع PostgreSQL وtask runner خارجي وCaddy.
  4. افتح الواجهة عبر HTTPS وأنشئ حساب المالك.
  5. اربط Telegram أو نظام CRM أو البريد الإلكتروني أو أي API خارجي.
  6. اضبط معالجة الأخطاء والمدة التي تحتفظ فيها ببيانات التنفيذ.
  7. أتمت إنشاء نسخ احتياطية لقاعدة البيانات والبيانات ومفتاح التشفير.

بالنسبة إلى تثبيت إنتاجي صغير، من المناسب البدء بمعالجين افتراضيين وذاكرة RAM سعتها 4 GB. تكفي 2 GB للاختبار غالباً، لكن PostgreSQL وDocker والعمليات المتزامنة تستهلك المساحة الاحتياطية المتبقية بسرعة.

ما هو n8n وكيف يعمل؟

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

يبدو سير العمل البسيط هكذا:

Webhook → التحقق من البيانات → CRM → Telegram → استجابة الموقع

يمكن تشغيل السلسلة بواسطة webhook أو جدول زمني أو بريد إلكتروني أو رسالة أو حدث في خدمة خارجية. وتتوفر بين العقد شروط وحلقات ومرشحات وعمليات انتظار ومعالجة للأخطاء.

من نقاط قوة n8n أن الأتمتة لا تقتصر على التكاملات الجاهزة. يمكنك استدعاء أي خدمة لها API من خلال HTTP Request، كما يمكنك كتابة منطق مخصص في عقدة Code باستخدام JavaScript أو Python. لذلك يقع n8n بين أداة no-code بسيطة وكود مخصص يعمل على الخادم.

لماذا يتجاوز مجرد تمرير البيانات؟

يكون n8n مفيداً عندما تمتد العملية عبر عدة أنظمة وتتطلب قراراً:

نموذج → التحقق → البحث عن التكرار → تقييم بالذكاء الاصطناعي → موافقة المدير → CRM

يمكن إبقاء الشخص في نقطة التحكم فقط. فعلى سبيل المثال، يجهز الذكاء الاصطناعي الرد، لكن لا تُرسل الرسالة إلى العميل إلا بعد موافقة الموظف.

حالات الاستخدام الشائعة:

  • المبيعات والدعم: جمع الطلبات وتوزيع العملاء المحتملين وإنشاء الصفقات؛
  • المحتوى والذكاء الاصطناعي: إعداد المسودات وتصنيف الاستفسارات والنشر بعد الموافقة؛
  • DevOps: إشعارات الأعطال وGit webhooks وفحوصات API؛
  • العمليات الداخلية: مزامنة جداول البيانات والبريد الإلكتروني والتقويمات والأنظمة المؤسسية.

يمنحك التثبيت المستضاف ذاتياً التحكم في العملية وقاعدة البيانات، لكنه لا يجعل الخدمات الخارجية محلية. فالبيانات المرسلة إلى Telegram أو CRM أو نموذج ذكاء اصطناعي سحابي تغادر VPS.

n8n Cloud أم خادمك الخاص؟

المعاملn8n Cloudn8n على VPS
التشغيللا حاجة إلى إعداد خادمتحتاج إلى نطاق وDocker وHTTPS
التحديثاتيتولاها n8nيتولاها المالك
قاعدة البيانات والملفاتفي بنية الخدمة التحتيةعلى الخادم الذي تختاره
التوسعةحسب خطة السحابةتضبطها بشكل مستقل
المسؤوليةإدارة أقلالنسخ الاحتياطية والأمان والمراقبة مسؤولية المالك
الأنسب لـبدء سريع دون DevOpsالتحكم والتخصيص والعمليات التي تعمل دائماً

يمكن استضافة Community Edition مجاناً على خادمك واستخدامها للعمليات الشخصية والداخلية في الشركة. لكن n8n لا يوزع بموجب ترخيص مفتوح المصدر تقليدي، بل بموجب ترخيص الاستخدام المستدام fair-code. يسمح ذلك بالاستخدام الداخلي والتعديل، لكنه لا يسمح لك ببساطة بنشر n8n وإضافة شعارك وبيع الوصول إليه كخدمة SaaS مستقلة. إذا كنت تنوي إنشاء منتج من هذا النوع، فراجع شروط الترخيص بشكل منفصل.

متطلبات خادم n8n

يعتمد الحمل على حجم البيانات والتزامن ونوع العمليات. تحتاج الملفات والقوائم الطويلة وعقد Code وسير العمل المعتمد على الذكاء الاصطناعي إلى ذاكرة أكبر من تمرير حمولات JSON صغيرة بين واجهات API.

السيناريوالإعداد الابتدائي
الاختبارات وسير العمل النصي الشخصيمعالج افتراضي واحد، RAM بسعة 2 GB، و20 GB NVMe
تثبيت إنتاجي صغيرمعالجان افتراضيان، RAM بسعة 4 GB، و25–40 GB NVMe
عمليات متزامنة أو ذكاء اصطناعي أو ملفات4 معالجات افتراضية وRAM بسعة 8 GB أو أكثر
عدة عمليات worker في وضع queueحدد الحجم وفقاً لحجم التنفيذ

تصلح SQLite للتعلم ولإعداد صغير يعمل بنسخة واحدة. أما PostgreSQL فهي أكثر ملاءمة للإنتاج: فالنسخ الاحتياطية أسهل، كما أن الانتقال إلى وضع queue لاحقاً أبسط.

كيفية تثبيت n8n على VPS

يستخدم هذا المثال Ubuntu 24.04 وPostgreSQL وCaddy وtask runner خارجياً. استبدل n8n.example.com والمنطقة الزمنية بالقيم الخاصة بك.

1. اضبط DNS وجهز الخادم

أنشئ سجل DNS من نوع A يشير إلى عنوان IPv4 الخاص بـVPS، ثم اتصل عبر SSH:

ssh root@SERVER_IP
apt update && apt upgrade -y
apt install -y ca-certificates curl ufw openssl

ثبّت Docker Engine وCompose plugin من المستودع الرسمي:

install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
  -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc

cat > /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF

apt update
apt install -y docker-ce docker-ce-cli containerd.io \
  docker-buildx-plugin docker-compose-plugin
docker compose version

اسمح باتصالات SSH وHTTP وHTTPS فقط:

ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable

لا تغلق جلسة SSH الحالية قبل التأكد من أن اتصالاً جديداً يعمل.

2. أنشئ متغيرات البيئة

جهز المجلد:

mkdir -p /opt/n8n
cd /opt/n8n

أنشئ ملف .env. تولد الأوامر التالية فوراً أسراراً عشوائية منفصلة لـPostgreSQL وتشفير n8n وtask runner:

cat > .env <<EOF
N8N_VERSION=stable
N8N_HOST=n8n.example.com
GENERIC_TIMEZONE=Europe/Berlin

POSTGRES_DB=n8n
POSTGRES_USER=n8n
POSTGRES_PASSWORD=$(openssl rand -hex 32)

N8N_ENCRYPTION_KEY=$(openssl rand -hex 32)
RUNNERS_AUTH_TOKEN=$(openssl rand -hex 32)
EOF

chmod 600 .env

تعد علامة stable ملائمة للتشغيل الأول. وبعد التأكد من نجاح التثبيت، من الأفضل تثبيت إصدار n8n محدد حتى لا يحدث تحديث صورة الحاوية التالية بشكل غير متوقع.

يجب ألا تفقد N8N_ENCRYPTION_KEY. يستخدم n8n هذا المفتاح لتشفير كلمات المرور والرموز المميزة وبيانات الاعتماد الأخرى المخزنة. إذا استعدت PostgreSQL وحدها دون المفتاح، فستبقى السجلات في قاعدة البيانات، لكن n8n لن يتمكن من قراءتها.

3. أنشئ ملف Docker Compose

أنشئ compose.yaml:

services:
  postgres:
    image: postgres:18-alpine
    restart: unless-stopped
    environment:
      POSTGRES_DB: ${POSTGRES_DB}
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      PGDATA: /var/lib/postgresql/data
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
      interval: 5s
      timeout: 5s
      retries: 10

  n8n:
    image: docker.n8n.io/n8nio/n8n:${N8N_VERSION}
    restart: unless-stopped
    environment:
      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}

      N8N_HOST: ${N8N_HOST}
      N8N_PORT: "5678"
      N8N_PROTOCOL: https
      N8N_EDITOR_BASE_URL: https://${N8N_HOST}
      N8N_WEBHOOK_URL: https://${N8N_HOST}/
      N8N_PROXY_HOPS: "1"
      GENERIC_TIMEZONE: ${GENERIC_TIMEZONE}
      TZ: ${GENERIC_TIMEZONE}

      N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
      N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS: "true"
      N8N_BLOCK_ENV_ACCESS_IN_NODE: "true"

      N8N_RUNNERS_MODE: external
      N8N_RUNNERS_AUTH_TOKEN: ${RUNNERS_AUTH_TOKEN}
      N8N_RUNNERS_BROKER_LISTEN_ADDRESS: 0.0.0.0

      EXECUTIONS_DATA_PRUNE: "true"
      EXECUTIONS_DATA_MAX_AGE: "168"
      EXECUTIONS_DATA_PRUNE_MAX_COUNT: "10000"
    volumes:
      - n8n_data:/home/node/.n8n
    expose:
      - "5678"
    depends_on:
      postgres:
        condition: service_healthy

  n8n-runner:
    image: n8nio/runners:${N8N_VERSION}
    restart: unless-stopped
    environment:
      N8N_RUNNERS_AUTH_TOKEN: ${RUNNERS_AUTH_TOKEN}
      N8N_RUNNERS_TASK_BROKER_URI: http://n8n:5679
    depends_on:
      - n8n

  caddy:
    image: caddy:2-alpine
    restart: unless-stopped
    environment:
      N8N_HOST: ${N8N_HOST}
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy_data:/data
      - caddy_config:/config
    depends_on:
      - n8n

volumes:
  postgres_data:
    name: n8n_postgres_data
  n8n_data:
    name: n8n_data
  caddy_data:
    name: n8n_caddy_data
  caddy_config:
    name: n8n_caddy_config

ينفذ task runner الخارجي التعليمات البرمجية بعيداً عن عملية n8n الأساسية. وهذا أكثر أماناً من الوضع الداخلي، ويقلل احتمال أن يؤثر خطأ في عقدة Code على المحرر ومعالجة webhooks.

4. فعّل HTTPS

أنشئ Caddyfile:

{$N8N_HOST} {
    reverse_proxy n8n:5678
}

سيحصل Caddy تلقائياً على شهادة TLS إذا كان DNS يشير مسبقاً إلى VPS ويمكن الوصول إلى المنفذين 80 و443. لا يكون المنفذ الداخلي 5678 مكشوفاً على الإنترنت: فالمنفذان 80 و443 فقط متاحان خارجياً، بينما يصل Caddy إلى n8n عبر شبكة Docker.

يلزم متغيرا N8N_WEBHOOK_URL وN8N_PROXY_HOPS لكي ينشئ المحرر عناوين webhook عامة صحيحة ويثق بالرؤوس الواردة من reverse proxy واحد.

5. شغّل n8n

تحقق من الإعداد النهائي وشغّل الحاويات:

docker compose config
docker compose up -d
docker compose ps
docker compose logs --tail=100 n8n caddy

افتح:

https://n8n.example.com

أنشئ حساب المالك. لا تشارك كلمة المرور مع الزملاء؛ وللعمل الجماعي استخدم حسابات منفصلة وامنح كل شخص الصلاحيات التي يحتاج إليها فقط.

أول سير عمل مفيد

يعد التعامل مع طلب من موقع الويب اختباراً جيداً:

  1. أضف عقدة Webhook باستخدام طريقة POST.
  2. استخدم Edit Fields للإبقاء على الاسم وعنوان البريد الإلكتروني والمصدر فقط.
  3. استخدم عقدة If لرفض الطلب الذي يفتقد بيانات مطلوبة.
  4. أنشئ صفقة في CRM أو أرسل الطلب عبر HTTP Request.
  5. أضف إشعاراً في Telegram.
  6. أنهِ السلسلة بعقدة Respond to Webhook.
  7. بعد الاختبار، فعّل سير العمل واستبدل webhook التجريبي بعنوان URL الإنتاجي.

يتحقق هذا المثال فوراً من النطاق وHTTPS والطلبات الواردة وبيانات الاعتماد والتكامل الخارجي. بعد ذلك أضف Error Workflow منفصلاً ليبلغك عند فشل السلسلة الأساسية.

تأمين n8n بعد التثبيت

لا يعني تثبيت n8n أنه أصبح موثوقاً تلقائياً. بعد التشغيل تأكد من الأمور التالية:

  • لا يمكن الوصول إلى المحرر إلا عبر HTTPS؛
  • يمتلك .env الصلاحيات 600 ولا تتم إضافته إلى Git؛
  • مفاتيح API الخارجية لها أقل الصلاحيات المطلوبة؛
  • يتحقق كل webhook من توقيع المصدر أو سره؛
  • تُحذف سجلات التنفيذ تلقائياً؛
  • تُرسل أخطاء سير العمل المهمة إلى المسؤول.

تُثبّت community nodes كحزم وقد تحصل على وصول إلى بيانات سير العمل والخادم. لا تضف عقداً مجهولة دون مراجعتها. وإذا لم تكن بحاجة إليها، عطّلها باستخدام N8N_COMMUNITY_PACKAGES_ENABLED=false.

شغّل التدقيق المدمج:

docker compose exec n8n n8n audit

يساعد ذلك في اكتشاف webhooks غير المحمية والعقد الخطرة ومشكلات بيانات الاعتماد، لكنه لا يغني عن المراجعة اليدوية.

سجل التنفيذ والبيانات الشخصية

يخزن n8n بيانات الإدخال والإخراج لأغراض تصحيح الأخطاء. وقد تبقى معها رسائل البريد الإلكتروني وأرقام الهواتف والمستندات واستجابات API في قاعدة البيانات.

في الإعداد أعلاه، تُحذف عمليات التنفيذ بعد سبعة أيام ويقتصر عددها على 10,000 عملية. بالنسبة إلى العمليات الحساسة، اختر مدة الاحتفاظ وفق سياسة الاحتفاظ بالبيانات لديك، واحذف الحقول غير الضرورية قبل انتهاء سير العمل.

النسخ الاحتياطية والتحديثات

تتطلب الاستعادة نسخة PostgreSQL وvolume باسم n8n_data وملفات الإعداد و.env الذي يحتوي على N8N_ENCRYPTION_KEY. قبل النسخ، أوقف المعالجات مع إبقاء PostgreSQL قيد التشغيل. يؤدي ذلك إلى انقطاع قصير في تنفيذ سير العمل:

cd /opt/n8n
mkdir -p backup
docker compose stop n8n n8n-runner

docker compose exec -T postgres sh -c \
  'pg_dump -U "$POSTGRES_USER" "$POSTGRES_DB"' \
  | gzip > "backup/n8n-db-$(date +%F).sql.gz"

docker run --rm \
  -v n8n_data:/source:ro \
  -v "$PWD/backup":/backup \
  alpine sh -c \
  'tar -czf /backup/n8n-data-$(date +%F).tar.gz -C /source .'

tar -czf "backup/n8n-config-$(date +%F).tar.gz" \
  .env compose.yaml Caddyfile

docker compose start n8n n8n-runner

يحتوي الأرشيف الذي يضم .env على أسرار؛ لذلك شفّره وخزنه خارج VPS. تحقق دورياً من النسخة الاحتياطية بإجراء استعادة تجريبية.

قبل التحديث، أنشئ نسخة احتياطية وراجع ملاحظات الإصدار:

cd /opt/n8n
docker compose pull
docker compose up -d
docker compose ps

يجب أن يستخدم task runner والحاوية الأساسية علامة الإصدار نفسها.

متى تصبح التوسعة ضرورية؟

لا تبدأ باستخدام Redis وعدة workers قبل وجود حمل فعلي. فالنسخة الواحدة مع PostgreSQL أسهل في الصيانة وتغطي عادةً العمليات الداخلية الصغيرة.

يصبح وضع queue ضرورياً عندما تؤخر المهام الطويلة webhooks، أو تبدأ سير عمل كثيرة في الوقت نفسه، أو تستهلك معالجة الملفات الذاكرة المتاحة باستمرار. في هذا الإعداد تستقبل النسخة الأساسية الأحداث، ويوزع Redis المهام، وينفذ workers المهام بالتوازي. يجب أن تتصل جميع المكونات بقاعدة PostgreSQL نفسها وأن تستخدم N8N_ENCRYPTION_KEY نفسه.

أي VPS تختار لـ n8n؟

بالنسبة إلى n8n وPostgreSQL وCaddy وtask runner معاً، من المناسب البدء بمعالجين افتراضيين وRAM بسعة 4 GB ومحرك NVMe. في tropic.host تتوافق خطة Light مع هذا الإعداد: معالجان افتراضيان و4 GB RAM و25 GB NVMe. وهذا يكفي لأول سير عمل إنتاجي دون معالجة ملفات كثيفة.

للمستندات ومجموعات البيانات الكبيرة والعديد من عمليات الذكاء الاصطناعي المتزامنة، تعد RAM بسعة 8 GB خياراً أفضل. كما أن الشبكة المستقرة مهمة: يجب أن تبقى webhooks وعمليات OAuth الراجعة والمهام المجدولة متاحة باستمرار.

الخلاصة

يحول n8n العمليات المتكررة إلى تدفقات مرئية واضحة: تسرّع العقد الجاهزة التشغيل، وتربط HTTP Request أي API تقريباً، وتتيح عقدة Code إضافة منطقك الخاص.

يمنحك الإصدار المستضاف ذاتياً التحكم في الخادم وقاعدة البيانات، لكنه يتطلب HTTPS ومفاتيح مقيدة وتنظيف السجل ونسخاً احتياطية تم التحقق منها. خزّن N8N_ENCRYPTION_KEY مع PostgreSQL: فبدونه لا يمكن فك تشفير بيانات الاعتماد المستعادة.

الأسئلة الشائعة

هل يمكن استخدام n8n مجاناً؟

نعم. يمكن استضافة Community Edition مجاناً على خادمك للعمليات الشخصية والداخلية. ويقيد ترخيص fair-code إعادة بيع n8n المستضاف كخدمة SaaS مستقلة.

هل يمكن تثبيت n8n دون نطاق؟

نعم للاختبار المحلي. أما webhooks العامة وOAuth فمن الأفضل استخدام نطاق وHTTPS.

كم يحتاج n8n من RAM؟

تعمل سير العمل الشخصية البسيطة غالباً مع 2 GB RAM. أما n8n مع PostgreSQL وCaddy وtask runner، فـ4 GB أكثر ملاءمة؛ وقد تتطلب الملفات والتنفيذات المتزامنة 8 GB أو أكثر.

هل تبقى كل البيانات داخل VPS؟

تبقى داخله فقط البيانات التي لا يرسلها سير العمل إلى جهة أخرى. تُخزن قاعدة البيانات وسجل التنفيذ على VPS، لكن عقد Telegram أو CRM أو نموذج الذكاء الاصطناعي الخارجي ترسل البيانات المحددة إلى الخدمة المعنية.

ماذا يجب أن تتضمن نسخة n8n الاحتياطية؟

نسخة PostgreSQL وvolume n8n_data وcompose.yaml وCaddyfile و.env الذي يحتوي على N8N_ENCRYPTION_KEY. خزّن النسخة خارج VPS بصيغة مشفرة وتحقق منها باستعادتها.