تخطّى إلى المحتوى
العودة للمدونة

نشر n8n على Cloudflare: دليل أتمتة ذاتية الاستضافة

تعلّم كيفية نشر n8n مع Docker و Cloudflare Tunnel لأتمتة ذاتية الاستضافة وآمنة مع SSL ونطاقات مخصصة وأفضل الممارسات.

MH محمود هاشم · ٢٥ أغسطس ٢٠٢٤ · 7 دقيقة قراءة
Server infrastructure for self-hosted automation deployment

مقدمة

تمنحك الاستضافة الذاتية لـ n8n تنفيذات سير عمل غير محدودة، وتحكمًا كاملًا في البيانات، ولا تكاليف لكل مهمة. لكن إعداد نشر آمن وقابل للوصول يتطلب معالجة الشبكات و SSL وتكوين النطاق. يوفّر Cloudflare Tunnel حلاً أنيقًا — ينشئ اتصالًا آمنًا من خادمك إلى شبكة Cloudflare دون تعريض أي منافذ للإنترنت العام.

يستعرض هذا الدليل نشر n8n مع Docker، وتأمينه بـ Cloudflare Tunnel، وتكوين نطاق مخصص مع SSL تلقائي.

لماذا Cloudflare Tunnel؟

تتطلب الاستضافة الذاتية التقليدية فتح منافذ على جدار الحماية وإدارة شهادات SSL. يلغي Cloudflare Tunnel (سابقًا Argo Tunnel) هذه المتطلبات:

  • لا منافذ مفتوحة: ينشئ النفق اتصالًا صادرًا من خادمك إلى Cloudflare
  • SSL تلقائي: تتعامل Cloudflare مع شهادات SSL/TLS
  • حماية DDoS: شبكة Cloudflare تحمي نسختك
  • لا تعرض للـ IP: لا يُكشف عنوان IP لخادمك أبدًا
  • نطاقات مخصصة سهلة: تكوين النطاقات عبر Cloudflare DNS

المتطلبات المسبقة

قبل البدء، تحتاج:

  • خادم (VPS، خادم مخصص، أو جهاز محلي) مع Docker مثبت
  • حساب Cloudflare مع نطاق مسجّل
  • إلمام أساسي بـ Docker وأدوات سطر الأوامر

الخطوة 1: نشر n8n مع Docker

إنشاء تكوين Docker Compose

# docker-compose.yml
version: '3.8'

services:
  n8n:
    image: n8nio/n8n:latest
    restart: always
    ports:
      - "127.0.0.1:5678:5678"
    environment:
      # التكوين الأساسي
      - N8N_HOST=n8n.yourdomain.com
      - N8N_PORT=5678
      - N8N_PROTOCOL=https
      - N8N_EDITOR_BASE_URL=https://n8n.yourdomain.com
      - WEBHOOK_URL=https://n8n.yourdomain.com/
      
      # الأمان
      - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
      - N8N_BASIC_AUTH_ACTIVE=true
      - N8N_BASIC_AUTH_USER=${N8N_BASIC_AUTH_USER}
      - N8N_BASIC_AUTH_PASSWORD=${N8N_BASIC_AUTH_PASSWORD}
      
      # قاعدة البيانات (PostgreSQL للإنتاج)
      - DB_TYPE=postgresdb
      - DB_POSTGRESDB_HOST=postgres
      - DB_POSTGRESDB_PORT=5432
      - DB_POSTGRESDB_DATABASE=n8n
      - DB_POSTGRESDB_USER=${POSTGRES_USER}
      - DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}
      
      # إعدادات التنفيذ
      - EXECUTIONS_DATA_PRUNE=true
      - EXECUTIONS_DATA_MAX_AGE=168
      - N8N_METRICS=true
      
      # المنطقة الزمنية
      - GENERIC_TIMEZONE=America/New_York
      
    volumes:
      - n8n_data:/home/node/.n8n
    depends_on:
      - postgres

  postgres:
    image: postgres:16-alpine
    restart: always
    environment:
      - POSTGRES_DB=n8n
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
    volumes:
      - postgres_data:/var/lib/postgresql/data
    # لا تعرض المنافذ - يمكن الوصول فقط داخل شبكة Docker

volumes:
  n8n_data:
  postgres_data:

إنشاء ملف البيئة

# ملف .env
N8N_ENCRYPTION_KEY=generate-a-random-32-char-string-here
N8N_BASIC_AUTH_USER=admin
N8N_BASIC_AUTH_PASSWORD=your-secure-password
POSTGRES_USER=n8n
POSTGRES_PASSWORD=your-secure-db-password

ولّد مفتاح تشفير آمن:

openssl rand -hex 32

بدء الخدمات

# بدء n8n و PostgreSQL
docker compose up -d

# التحقق من أن الخدمات تعمل
docker compose ps

# عرض السجلات
docker compose logs -f n8n

يجب أن يعمل n8n الآن على localhost:5678. لاحظ أننا ربطنا المنفذ بـ 127.0.0.1 فقط، لذا لا يمكن الوصول إليه من خارج الخادم.

الخطوة 2: تثبيت وتكوين Cloudflare Tunnel

تثبيت cloudflared

# على Ubuntu/Debian
curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb -o cloudflared.deb
sudo dpkg -i cloudflared.deb

# التحقق من التثبيت
cloudflared --version

المصادقة مع Cloudflare

cloudflared tunnel login

يفتح هذا نافذة متصفح للمصادقة مع حساب Cloudflare. اختر النطاق الذي تريد استخدامه لـ n8n.

إنشاء نفق

# إنشاء نفق مسمى
cloudflared tunnel create n8n-tunnel

# ينشئ هذا نفقًا بمعرّف فريد وملف بيانات اعتماد
# لاحظ معرّف النفق ومسار ملف بيانات الاعتماد

تكوين النفق

أنشئ ملف تكوين للنفق:

# ~/.cloudflared/config.yml
tunnel: <your-tunnel-id>
credentials-file: /root/.cloudflared/<your-tunnel-id>.json

ingress:
  - hostname: n8n.yourdomain.com
    service: http://localhost:5678
  - service: http_status:404

إنشاء سجل DNS

# إنشاء سجل CNAME يشير إلى النفق
cloudflared tunnel route dns n8n-tunnel n8n.yourdomain.com

ينشئ هذا تلقائيًا سجل CNAME في Cloudflare DNS يشير إلى n8n.yourdomain.com للنفق.

اختبار النفق

# تشغيل النفق في المقدمة للاختبار
cloudflared tunnel run n8n-tunnel

افتح متصفحًا وانتقل إلى https://n8n.yourdomain.com. يجب أن ترى صفحة إعداد n8n.

الخطوة 3: تشغيل Cloudflare Tunnel كخدمة

إنشاء خدمة Systemd

# /etc/systemd/system/cloudflared.service
[Unit]
Description=Cloudflare Tunnel for n8n
After=network.target

[Service]
TimeoutStartSec=0
Type=notify
ExecStart=/usr/bin/cloudflared tunnel --config /root/.cloudflared/config.yml run n8n-tunnel
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target

تفعيل وبدء الخدمة

# إعادة تحميل systemd
sudo systemctl daemon-reload

# تفعيل الخدمة للبدء عند الإقلاع
sudo systemctl enable cloudflared

# بدء الخدمة
sudo systemctl start cloudflared

# التحقق من الحالة
sudo systemctl status cloudflared

الخطوة 4: تكوين إعدادات Cloudflare

إعدادات SSL/TLS

في لوحة تحكم Cloudflare:

  1. انتقل إلى إعدادات SSL/TLS
  2. اضبط وضع التشفير على Full (ليس Flexible، الذي قد يسبب حلقات إعادة توجيه)
  3. فعّل Always Use HTTPS
  4. فعّل Automatic HTTPS Rewrites

سياسات الوصول (اختياري)

قيّد الوصول لعناوين IP محددة أو اطلب مصادقة Cloudflare:

# في لوحة Cloudflare Zero Trust
# Access > Applications > Add Application
# النوع: Self-hosted
# النطاق: n8n.yourdomain.com

# السياسة:
# - السماح ببريدات محددة أو نطاقات بريد
# - أو السماح بنطاقات IP محددة

تحديد المعدل

احمِ نسخة n8n من الإساءة:

# قاعدة تحديد معدل Cloudflare
# إذا: طلبات إلى n8n.yourdomain.com/*
# ثم: تحديد المعدل إلى 100 طلب لكل 10 ثوان لكل IP
# الإجراء: حظر لمدة 60 ثانية

الخطوة 5: أفضل ممارسات الأمان

تأمين نشر Docker

# أضف إلى docker-compose.yml لأمان إضافي
services:
  n8n:
    # التشغيل كمستخدم غير جذر
    user: "node:node"
    
    # نظام ملفات للقراءة فقط حيثما أمكن
    read_only: false
    
    # إسقاط جميع القدرات
    cap_drop:
      - ALL
    
    # لا امتيازات جديدة
    security_opt:
      - no-new-privileges:true
    
    # حدود الموارد
    deploy:
      resources:
        limits:
          memory: 1G
          cpus: '1.0'

أمان البيئة

# تأمين ملف .env
chmod 600 .env
chown root:root .env

# تدوير مفتاح التشفير بانتظام (يتطلب إعادة تشفير بيانات الاعتماد)
# انسخ ملف .env بأمان

أمان قاعدة البيانات

# أمان PostgreSQL في docker-compose.yml
services:
  postgres:
    # لا تعرض أي منافذ
    # يمكن الوصول فقط داخل شبكة Docker
    
    # أضف فحص صحة
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U n8n"]
      interval: 10s
      timeout: 5s
      retries: 5

نسخ احتياطية منتظمة

#!/bin/bash
# backup-n8n.sh - شغّل يوميًا عبر cron

BACKUP_DIR="/backups/n8n"
DATE=$(date +%Y%m%d_%H%M%S)

# نسخ احتياطي لـ PostgreSQL
docker compose exec -T postgres pg_dump -U n8n n8n | gzip > \
  "$BACKUP_DIR/db_$DATE.sql.gz"

# نسخ احتياطي لحجم بيانات n8n
docker run --rm -v n8n_data:/data -v $BACKUP_DIR:/backup \
  alpine tar czf /backup/n8n_data_$DATE.tar.gz -C /data .

# الاحتفاظ بآخر 30 يومًا فقط من النسخ الاحتياطية
find $BACKUP_DIR -type f -mtime +30 -delete
# أضف إلى crontab
0 2 * * * /path/to/backup-n8n.sh

الخطوة 6: المراقبة والصيانة

فحوصات الصحة

#!/bin/bash
# health-check.sh

# التحقق من استجابة n8n
HTTP_STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:5678)

if [ "$HTTP_STATUS" != "200" ] && [ "$HTTP_STATUS" != "302" ]; then
    echo "n8n معطل! حالة HTTP: $HTTP_STATUS"
    # إرسال تنبيه
    curl -X POST "https://alerts.example.com/api" \
         -d "message=n8n معطل (HTTP $HTTP_STATUS)"
    
    # محاولة إعادة التشغيل
    docker compose restart n8n
fi

# التحقق من تشغيل النفق
if ! systemctl is-active --quiet cloudflared; then
    echo "نفق Cloudflare معطل!"
    systemctl restart cloudflared
fi

تحديث n8n

# سحب أحدث صورة
docker compose pull

# إعادة إنشاء الحاويات بالصورة الجديدة
docker compose up -d

# التحقق من التحديث
docker compose logs n8n | tail -20

مراقبة استخدام الموارد

# التحقق من استخدام موارد Docker
docker stats

# التحقق من مساحة القرص
df -h

# التحقق من أحجام حاويات Docker
docker system df -v

استكشاف الأخطاء

مشكلات شائعة

n8n يعرض “connection refused”: تأكد من تشغيل n8n وأن المنفذ صحيح في تكوين النفق.

حلقات إعادة التوجيه: اضبط وضع Cloudflare SSL على “Full” وليس “Flexible”.

Webhooks لا تعمل: تأكد من ضبط WEBHOOK_URL بشكل صحيح على URL العام.

انقطاع النفق: تحقق من سجلات خدمة cloudflared وتأكد من أن خادمك لديه اتصال إنترنت مستقر.

# التحقق من سجلات النفق
journalctl -u cloudflared -f

# التحقق من سجلات n8n
docker compose logs -f n8n

خاتمة

نشر n8n مع Cloudflare Tunnel يوفّر منصة أتمتة ذاتية الاستضافة وآمنة دون تعريض خادمك للإنترنت العام. مزيج Docker للحاويات، و PostgreSQL لتخزين البيانات الموثوق، و Cloudflare Tunnel للوصول الآمن يخلق إعدادًا جاهزًا للإنتاج يكلّف بضعة دولارات شهريًا في الاستضافة.

المزايا الرئيسية — لا منافذ مفتوحة، SSL تلقائي، حماية DDoS، وتنفيذات سير عمل غير محدودة — تجعل هذا الإعداد مثاليًا للأفراد والفرق الصغيرة الذين يريدون قوة n8n دون قيود خطط السحابة. مع النسخ الاحتياطية المناسبة، والمراقبة، وتكوين الأمان، ستعمل نسخة n8n ذاتية الاستضافة بشكل موثوق وآمن على المدى الطويل.

#n8n #Cloudflare #DevOps

مقالات ذات صلة

لنبني شيئاً رائعاً معاً

هل أنت مستعد لأتمتة عمليات عملك وتوفير مئات الساعات كل شهر؟ لنتحدث عن مشروعك.