مقدمة
تمنحك الاستضافة الذاتية لـ 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:
- انتقل إلى إعدادات SSL/TLS
- اضبط وضع التشفير على Full (ليس Flexible، الذي قد يسبب حلقات إعادة توجيه)
- فعّل Always Use HTTPS
- فعّل 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 ذاتية الاستضافة بشكل موثوق وآمن على المدى الطويل.