كيفية أخذ نسخة احتياطية من n8n واستعادتها (قاعدة البيانات وبيانات الاعتماد ومفتاح التشفير)
لأخذ نسخة احتياطية من n8n، احفظ أربعة أشياء: مجلد بيانات n8n (/home/node/.n8n داخل الحاوية، ويحتوي على قاعدة بيانات SQLite وملف config الذي يضم مفتاح التشفير)، وقاعدة بيانات Postgres إن كنت تستخدمها، وملف docker-compose.yml، وملف .env. وللاستعادة، أعد هذه الملفات إلى السيرفر نفسه أو إلى سيرفر جديد، ثم شغّل الحزمة باستخدام N8N_ENCRYPTION_KEY نفسه. إذا فقدت هذا المفتاح فلن يتمكن n8n من فك تشفير بيانات الاعتماد المحفوظة.
يتناول هذا الدليل التثبيت باستخدام Docker Compose على Ubuntu 24.04 أو 22.04، ويوضح كيفية إعداد نسخ احتياطية ليلية، ونسخها خارج السيرفر، واستعادتها. وهو ينطبق على التثبيتات التي تديرها بنفسك وعلى استضافة n8n من Cloudesta، حيث يعمل n8n داخل Docker على VPS سحابي تتحكم فيه بصلاحيات root.
المتطلبات الأساسية
- وصول SSH بصلاحيات root إلى السيرفر الذي يعمل عليه n8n.
- تشغيل n8n باستخدام Docker Compose (
docker composeالإصدار v2). - موقع ثانٍ لحفظ النسخ خارج السيرفر، مثل VPS آخر أو جهازك الخاص.
- إمكانية تحمّل توقف لمدة 10 ثوانٍ تقريبًا كل ليلة إذا كنت تستخدم SQLite.
1. ما الذي تحتاج بالضبط إلى أخذ نسخة احتياطية منه في n8n؟
ابدأ بتحديد مجلد Compose وأسماء الخدمات ووحدة تخزين البيانات (volume):
docker compose ls
cd /opt/n8n # use the directory shown in CONFIG FILES
docker compose ps
docker volume ls | grep -i n8n
يستخدم هذا الدليل المجلد /opt/n8n، وخدمة باسم n8n، ووحدة تخزين باسم n8n_n8n_data. استبدل هذه الأسماء بالأسماء الخاصة بك.
بعد ذلك، حدّد مكان تخزين مفتاح التشفير. إذا كان ملف .env يحتوي على N8N_ENCRYPTION_KEY فإن n8n يستخدم هذه القيمة. وإن لم يكن كذلك، فقد أنشأ n8n مفتاحًا عند التشغيل الأول وحفظه في وحدة تخزين البيانات:
grep N8N_ENCRYPTION_KEY .env
docker compose exec n8n cat /home/node/.n8n/config
.env باستخدام القيمة الحالية من ملف config، والتأكد من أن ملف Compose يمرّره إلى الحاوية. لا تغيّر المفتاح أبدًا على نسخة n8n قائمة.2. كيف تُصدّر مسارات العمل وبيانات الاعتماد باستخدام n8n CLI؟
تمنحك عمليات التصدير عبر CLI طبقة حماية ثانية، فهي ملفات JSON قابلة للنقل يمكنك استيرادها إلى أي نسخة من n8n:
docker compose exec -u node n8n n8n export:workflow --all --output=/tmp/workflows.json
docker compose exec -u node n8n n8n export:credentials --all --output=/tmp/credentials.json
docker compose cp n8n:/tmp/workflows.json ./
docker compose cp n8n:/tmp/credentials.json ./
يظل تصدير بيانات الاعتماد أعلاه مشفّرًا، لذا لا يعمل إلا مع المفتاح نفسه. لنقل بيانات الاعتماد إلى نسخة تستخدم مفتاحًا مختلفًا، أضف --decrypted:
docker compose exec -u node n8n n8n export:credentials --all --decrypted --output=/tmp/credentials-plain.json
docker compose exec n8n rm /tmp/credentials-plain.json.3. كيف تُنشئ سكربت نسخ احتياطي ليلي لـ n8n؟
لا ينبغي نسخ SQLite أثناء كتابة n8n إليها، لذا يوقف السكربت n8n لفترة وجيزة أثناء أرشفة وحدة التخزين. أما قاعدة بيانات Postgres فيمكن تفريغها (dump) بأمان أثناء تشغيلها، لأن pg_dump يُنتج لقطة متسقة.
أنشئ الملف /usr/local/bin/n8n-backup.sh:
#!/usr/bin/env bash
set -euo pipefail
COMPOSE_DIR=/opt/n8n
VOLUME=n8n_n8n_data
BACKUP_DIR=/root/n8n-backups
USE_POSTGRES=no # set to yes if n8n uses Postgres
PG_USER=n8n
PG_DB=n8n
KEEP_DAYS=14
STAMP=$(date +%F_%H%M)
DEST="$BACKUP_DIR/$STAMP"
umask 077
mkdir -p "$DEST"
cd "$COMPOSE_DIR"
cp docker-compose.yml .env "$DEST/"
docker compose exec -T -u node n8n n8n export:workflow --all --output=/tmp/workflows.json
docker compose cp n8n:/tmp/workflows.json "$DEST/"
if [ "$USE_POSTGRES" = "yes" ]; then
docker compose exec -T postgres pg_dump -U "$PG_USER" -d "$PG_DB" -Fc > "$DEST/n8n.dump"
fi
docker compose stop n8n
trap 'docker compose start n8n' EXIT
docker run --rm -v "$VOLUME":/data:ro -v "$DEST":/backup alpine \
tar czf /backup/n8n_data.tar.gz -C /data .
find "$BACKUP_DIR" -mindepth 1 -maxdepth 1 -type d -mtime +"$KEEP_DAYS" -exec rm -rf {} +
echo "Backup finished: $DEST"
يعيد سطر trap تشغيل n8n حتى لو فشلت خطوة الأرشفة. اجعل السكربت قابلًا للتنفيذ، وشغّله مرة واحدة يدويًا، ثم جدوله ليعمل في الساعة 02:30 كل ليلة:
chmod 700 /usr/local/bin/n8n-backup.sh
/usr/local/bin/n8n-backup.sh
echo '30 2 * * * root /usr/local/bin/n8n-backup.sh >> /var/log/n8n-backup.log 2>&1' > /etc/cron.d/n8n-backup
ستفشل طلبات Webhook التي تصل خلال الثواني القليلة التي يكون فيها n8n متوقفًا، لذا اختر وقتًا هادئًا للجدولة.
4. كيف تنسخ النسخ الاحتياطية لـ n8n خارج السيرفر؟
النسخة الاحتياطية الموجودة على السيرفر نفسه فقط تضيع بضياع ذلك السيرفر. ادفع كل نسخة احتياطية إلى جهاز ثانٍ باستخدام rsync عبر SSH. أولًا، اضبط تسجيل الدخول بالمفاتيح للمستخدم root إلى المستخدم البعيد، ثم أضف هذا السطر إلى نهاية السكربت:
rsync -az "$BACKUP_DIR/" backupuser@203.0.113.20:/srv/backups/n8n/
يُعد VPS سحابي صغير في منطقة مختلفة وجهةً مناسبة للنسخ الاحتياطية. ويمكنك أيضًا سحب النسخ الاحتياطية إلى جهازك الخاص:
scp -r root@203.0.113.10:/root/n8n-backups ./
5. كيف تستعيد n8n على السيرفر نفسه أو على سيرفر جديد؟
على السيرفر الجديد، ثبّت Docker أولًا. ثم انسخ مجلد نسخة احتياطية واحدًا إلى /root/restore وضع ملفات Compose في مكانها:
mkdir -p /opt/n8n && cd /opt/n8n
cp /root/restore/docker-compose.yml /root/restore/.env ./
docker compose down # only if a stack is already running here
docker compose up --no-start
docker volume ls | grep -i n8n
ينشئ الأمر up --no-start وحدات التخزين بالأسماء التي يتوقعها Compose. يسمّي Compose وحدات التخزين بناءً على اسم المجلد، لذا فإن الإبقاء على /opt/n8n يحافظ على الاسم n8n_n8n_data.
بعد ذلك، فكّ ضغط البيانات داخل وحدة التخزين وامنح ملكيتها للمستخدم node الخاص بالحاوية (UID 1000):
docker run --rm -v n8n_n8n_data:/data -v /root/restore:/backup alpine \
sh -c "rm -rf /data/* /data/.[!.]* ; tar xzf /backup/n8n_data.tar.gz -C /data && chown -R 1000:1000 /data"
إذا كنت تستخدم Postgres، فشغّل قاعدة البيانات فقط، وحمّل ملف التفريغ، ثم شغّل كل شيء:
docker compose up -d postgres
sleep 10
docker compose exec -T postgres pg_restore -U n8n -d n8n --clean --if-exists < /root/restore/n8n.dump
docker compose up -d
ضع هذه النقاط في اعتبارك عند الاستعادة:
- استخدم إصدار صورة n8n نفسه أو إصدارًا أحدث. لا تستعد أبدًا إلى إصدار أقدم.
- إذا تغيّر عنوان IP الخاص بالسيرفر، فحدّث سجل A في DNS. وتحقق أيضًا من أن
WEBHOOK_URLفي.envلا يزال صحيحًا. - إذا لم يكن لديك سوى ملفات التصدير عبر CLI، فشغّل نسخة جديدة من n8n واستوردها إليها:
docker compose cp workflows.json n8n:/tmp/workflows.json
docker compose cp credentials-plain.json n8n:/tmp/credentials.json
docker compose exec -u node n8n n8n import:workflow --input=/tmp/workflows.json
docker compose exec -u node n8n n8n import:credentials --input=/tmp/credentials.json
التحقق من نجاح العملية
docker compose ps
docker compose logs --tail=50 n8n
ثم افحص النسخة المستعادة في المتصفح:
- سجّل الدخول بحساب المالك الحالي. يجب ألا تظهر لك شاشة الإعداد.
- افتح بعض بيانات الاعتماد وتأكد من أنها تُحمَّل دون أخطاء في فك التشفير.
- شغّل مسار عمل واحدًا يدويًا.
كرّر اختبار الاستعادة هذا على VPS احتياطي كل بضعة أشهر. فالنسخة الاحتياطية التي لم تستعدها قط هي نسخة غير مُختبَرة.
المشكلات الشائعة
- تظهر رسالة "could not be decrypted" لبيانات الاعتماد بعد الاستعادة: مفتاح التشفير لا يطابق المفتاح الذي حُفظت به البيانات. أعد المفتاح الأصلي إلى
.envأو إلى ملفconfig، ثم شغّلdocker compose up -d --force-recreate n8n. - لا يبدأ n8n في العمل ويسجّل "Mismatching encryption keys": المفتاح الموجود في
/home/node/.n8n/configيختلف عنN8N_ENCRYPTION_KEY. اضبط كليهما على القيمة الأصلية. - الخطأ
EACCES: permission deniedعلى/home/node/.n8n: الملفات مملوكة للمستخدم root. أعد تنفيذ خطوةchown -R 1000:1000 /dataعلى وحدة التخزين. - الخطأ
SQLITE_BUSY: database is locked: نُسخت النسخة الاحتياطية أثناء تشغيل n8n، أو أن حاويتين تتشاركان وحدة تخزين واحدة. أوقف n8n قبل الأرشفة، وتأكد من أن حاوية n8n واحدة فقط مرتبطة بوحدة التخزين. - تظهر شاشة الإعداد ومسارات العمل مفقودة: وُضعت البيانات في وحدة تخزين مختلفة عن التي يربطها Compose. قارن ناتج
docker volume lsبناتجdocker inspectعلى حاوية n8n، ثم استعد البيانات إلى وحدة التخزين الصحيحة.
الأسئلة الشائعة
هل يمكنني استرداد بيانات اعتماد n8n بدون مفتاح التشفير؟
لا. بيانات الاعتماد مشفّرة بهذا المفتاح، لذا عليك بدونه إعادة إدخال كل بيانات الاعتماد يدويًا. أما مسارات العمل نفسها فلا يزال من الممكن استعادتها.
هل تكفي لقطة (snapshot) من الـ VPS كنسخة احتياطية لـ n8n؟
اللقطة مفيدة، لكنها ليست بديلًا. فالنسخ الاحتياطية على مستوى الملفات المحفوظة خارج السيرفر تتيح لك الاستعادة على أي سيرفر، وتسمح لك باسترداد مسار عمل واحد دون إرجاع الجهاز بأكمله إلى حالة سابقة.
هل أحتاج إلى إيقاف n8n لأخذ نسخة احتياطية من Postgres؟
لا. يأخذ pg_dump لقطة متسقة أثناء تشغيل قاعدة البيانات. لا يلزم إيقاف n8n إلا لملف SQLite الموجود في وحدة تخزين البيانات.
هل تحتاج إلى مساعدة؟ إذا فشلت عملية الاستعادة، أو كنت بحاجة إلى وضع الإنقاذ (rescue mode) أو تغيير عنوان IP أو ترقية الباقة، فافتح تذكرة دعم عبر https://cloudesta.com/submitticket.php.