سيناريو توضيحي (افتراضي): يدير جوردان خادم Nextcloud صغيرًا يعمل بنظام Ubuntu. توجد ملفات التطبيق في مجلد معين /var/www/nextcloud، وملفات المستخدم في مجلد /srv/nextcloud-dataآخر، ويتم تخزين قاعدة بيانات Nextcloud بواسطة MariaDB، ويتوفر خادم Linux خارجي عبر SSH. يريد جوردان نسخة احتياطية يومية يمكن فحصها واستعادتها، وليس مجرد مهمة مجدولة تعمل بدون أخطاء.
يُقدّم هذا المثال لجوردان سير عمل قابل للتكرار باستخدام Restic وcron. المسارات وحسابات الخدمة وأسماء قواعد البيانات والجدول الزمني هي أمثلة فقط؛ استبدلها بالقيم الموجودة في تثبيتك. لا تعني الأوامر أن هذا الإعداد قد تم تشغيله أو اختباره على خادم حقيقي.
ما يجب أن يحتويه ملف النسخ الاحتياطي القابل للاستخدام في Nextcloud
قد يؤدي نسخ المجلد وحده إلى حذف المعلومات التي يحتاجها Nextcloud لإعادة ربط الملفات والمستخدمين والمشاركات والإعدادات. يذكر دليل إدارة Nextcloud 35 الحالي خمسة عناصر يجب الاحتفاظ بها: دليل التكوين، والتطبيقات المخصصة إن وجدت، ودليل البيانات، ودليل السمات، وقاعدة البيانات. ويشير دليل الاستعادة إلى أن قاعدة البيانات ودليل البيانات وملفات التكوين أساسية. يُرجى قراءة الدليل الخاص بإصدار Nextcloud المُثبّت لديك قبل تطبيق هذا المثال.
يختار جوردان نسخ مجلد التطبيق بالكامل احتياطيًا، بما في ذلك الإعدادات والتطبيقات والقوالب، بالإضافة إلى مجلد البيانات المنفصل ونسخة احتياطية من قاعدة البيانات. كما يلزم وجود نسخة منفصلة من كل موقع تخزين خارجي إذا كان Nextcloud يخزن محتوى المستخدم خارجه /srv/nextcloud-data. لا يستطيع Restic حماية سوى المسارات التي يمكن لعملية النسخ الاحتياطي قراءتها.
توضح تعليمات النسخ الاحتياطي الرسمية لـ Nextcloud وضع الصيانة ونسخ قواعد البيانات احتياطياً. وتبين تعليمات الاستعادة سبب ضرورة استعادة قاعدة البيانات وشجرة الملفات من نقطة استعادة متوافقة.
1. تجهيز ملف Restic ووثائق اعتماده
قم بتثبيت Restic من مصدر موثوق، وتأكد من توفره للحساب الذي سيُشغّل المهمة. يفترض المثال أن المهمة تُشغّل بصلاحيات المستخدم الجذر (root) لتتمكن من قراءة ملفات Nextcloud ونسخة قاعدة البيانات الاحتياطية. يستخدم هذا المثال مستودع SFTP عن بُعد، لذا فإن تعطل خادم تطبيق Jordan لن يؤدي إلى حذف النسخة الاحتياطية الوحيدة.
restic version
install -d -m 700 /root/.config/restic
install -d -m 700 /root/.config/nextcloud
أنشئ كلمة مرور قوية لمستودع Restic واحفظها /root/.config/restic/nextcloud-passwordبصلاحيات المستخدم الجذر فقط. احتفظ بنسخة احتياطية آمنة من كلمة المرور في مكان منفصل عن الخادم والمستودع. يقوم Restic بتشفير بيانات المستودع، ولكن فقدان كلمة المرور قد يجعل النسخ الاحتياطية المشفرة غير قابلة للاستخدام. لا تضع كلمة المرور مباشرةً في سطر البرنامج النصي أو أمر cron.
قم بتهيئة وصول SSH غير التفاعلي لحساب النسخ الاحتياطي على المضيف البعيد، وتحقق من مفتاح المضيف الخاص به عبر قناة موثوقة. حدد موقع المستودع أدناه إلى دليل يمكن لهذا الحساب الكتابة فيه:
export RESTIC_REPOSITORY='sftp:backup@vault.example.net:/srv/restic/nextcloud'
export RESTIC_PASSWORD_FILE='/root/.config/restic/nextcloud-password'
restic init
قم بتهيئة المستودع مرة واحدة فقط. يوثق دليل إعداد المستودع في Restic أنظمة التخزين الخلفية المدعومة وعملية التهيئة. تعامل مع ملف كلمة المرور ومفتاح SSH كبيانات اعتماد حساسة، وقم بتقييد الوصول إليهما.
2. حافظ على قاعدة البيانات والملفات في حالة توافق.
يوصي Nextcloud بوضع الصيانة لعمليات النسخ الاحتياطي لأنه يمنع تسجيل الدخول الجديد ويقفل الجلسات الحالية لتجنب تناقضات البيانات. يجب تشغيل الأمر بصلاحيات مستخدم HTTP؛ في إعداد حزمة Ubuntu النموذجي، يكون هذا المستخدم هو www-data. تستمر فترة صيانة Jordan طوال فترة تفريغ قاعدة البيانات ونسخ Restic الاحتياطي، لذا لا يمكن للمستخدمين العمل على Nextcloud خلال هذه الفترة.
بالنسبة لـ MariaDB، يستخدم دليل Nextcloud ما يلي mariadb-dump --single-transaction: قم بتخزين بيانات اعتماد قاعدة البيانات في ملف إعدادات العميل المحمي، على سبيل المثال /root/.config/nextcloud/mariadb.cnf، بدلاً من تضمين كلمة المرور في الأمر:
[client]
user=nextcloud_backup
password=REPLACE_WITH_A_SECRET
host=localhost
قم بتقييد الوصول إلى الملف chmod 600 /root/.config/nextcloud/mariadb.cnf. أنشئ حساب قاعدة بيانات بالصلاحيات المطلوبة فقط لخادمك وإجراء النسخ الاحتياطي. إذا كان Nextcloud يستخدم PostgreSQL أو SQLite، فاستبدل طريقة النسخ الاحتياطي الموثقة؛ ولا تُشغّل أمر MariaDB دون تغيير.
3. أنشئ برنامج نسخ احتياطي محمي
يحفظ برنامج جوردان ما يلي /usr/local/sbin/nextcloud-restic-backupويجعله قابلاً للتنفيذ. ويستخدم قفلًا لتجنب تداخل عمليات التشغيل، ويقوم بتشغيل وضع الصيانة قبل إنشاء النسخة الاحتياطية، وينسخ النسخة الاحتياطية مع مجلدات التطبيق والبيانات، ويحاول إيقاف وضع الصيانة حتى في حالة فشل أمر لاحق.
#!/usr/bin/env bash
set -Eeuo pipefail
umask 077
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
export RESTIC_REPOSITORY='sftp:backup@vault.example.net:/srv/restic/nextcloud'
export RESTIC_PASSWORD_FILE='/root/.config/restic/nextcloud-password'
NC_DIR='/var/www/nextcloud'
DATA_DIR='/srv/nextcloud-data'
DB_NAME='nextcloud'
DB_CNF='/root/.config/nextcloud/mariadb.cnf'
DUMP_DIR='/var/backups/nextcloud'
LOCK_FILE='/run/lock/nextcloud-restic-backup.lock'
STAMP=$(date -u +%Y%m%dT%H%M%SZ)
DUMP_FILE="$DUMP_DIR/nextcloud-$STAMP.sql"
maintenance_started=0
mkdir -p "$DUMP_DIR"
exec 9>"$LOCK_FILE"
flock -n 9 || { echo 'A Nextcloud backup is already running.' >&2; exit 1; }
finish() {
result=$?
trap - EXIT
if [[ "$maintenance_started" == 1 ]]; then
sudo -u www-data -- php "$NC_DIR/occ" maintenance:mode --off || result=1
fi
rm -f -- "$DUMP_FILE" || result=1
exit "$result"
}
trap finish EXIT
sudo -u www-data -- php "$NC_DIR/occ" maintenance:mode --on
maintenance_started=1
mariadb-dump --defaults-extra-file="$DB_CNF" --single-transaction \
--default-character-set=utf8mb4 --databases "$DB_NAME" > "$DUMP_FILE"
restic backup --tag nextcloud "$NC_DIR" "$DATA_DIR" "$DUMP_FILE"
بعد مراجعة المسارات، أنشئ الملف التنفيذي بصلاحيات المستخدم الجذر ووضع التشغيل 700. يفترض البرنامج النصي أن التثبيت يستخدم www-dataMariaDB والمسارات المذكورة؛ تحقق من هذه المعلومات config/config.phpمع إعدادات خادم الويب الخاص بك أولاً. كما يفترض عدم قيام أي مسؤول آخر بتفعيل وضع الصيانة. في حال فشل الأمر أو عملية النسخ الاحتياطي أو تحميل Restic، سيتم إغلاق نافذة الأوامر مع ظهور خطأ، وسيحاول النظام استعادة الخدمة؛ راجع السجلات للتأكد من ذلك. يتم تخزين النسخة الاحتياطية بصلاحيات محدودة وتُحذف بعد انتهاء التشغيل.
يُبقي هذا النمط البسيط الموقع غير متاح طوال فترة فحص Restic وتحميل الملفات. قد تستغرق هذه المدة وقتًا طويلاً جدًا بالنسبة لمجلدات البيانات الكبيرة. استخدم نسخة احتياطية منسقة لقاعدة البيانات ولقطة تخزين، أو تصميمًا آخر للنسخ الاحتياطي متوافقًا مع التطبيق، إذا كان نظام الملفات أو منصة التخزين لديك يدعم ذلك. تأكد من أن قاعدة البيانات ولقطة الملفات تمثلان نقطة زمنية متوافقة؛ إذ إن نسخ قاعدة بيانات نشطة ومجلد بيانات متغير بشكل منفصل قد ينتج عنه نسخة احتياطية يصعب استعادتها.
4. جدولة المهمة باستخدام cron
بعد اكتمال التشغيل اليدوي بنجاح، يقوم جوردان بتثبيت البرنامج النصي وجدولة تشغيله لفترة هادئة. بصفتك مستخدمًا ذا صلاحيات الجذر، عدّل ملف crontab الخاص بالمستخدم ذي الصلاحيات الجذرية sudo crontab -eوأضف ما يلي:
15 2 * * * /usr/local/sbin/nextcloud-restic-backup >> /var/log/nextcloud-restic.log 2>&1
يبدأ هذا المثال في تمام الساعة 2:15 صباحًا وفقًا للتوقيت المحلي لخادم Cron؛ اختر وقتًا مناسبًا لوقت الصيانة. بيئة Cron أصغر من بيئة سطر الأوامر التفاعلية، لذا يُحدد البرنامج النصي PATHالمسارات صراحةً ويستخدم المسارات المطلقة. أنشئ ملف السجل بصلاحيات محدودة، وقم بتهيئة تدوير السجلات، أو أرسل المخرجات إلى خدمة تسجيل النظام العادية. جدولة Cron تبدأ المهمة فقط، ولا تُؤكد اكتمال النسخ الاحتياطي أو نجاح عملية الاستعادة.
5. حدد مدة الاحتفاظ وتحقق من النتيجة
بعد نجاح عملية النسخ الاحتياطي، يتحقق جوردان من ظهور لقطة الشاشة:
restic snapshots --tag nextcloud
restic check
restic checkيتحقق من بنية المستودع. restic check --read-dataكما يقوم هذا الإجراء الدوري بقراءة البيانات المخزنة، وقد يستهلك وقتًا كبيرًا من الشبكة والقرص، لذا يُنصح بجدولته وفقًا لحجم المستودع واحتياجات الاسترداد. يوضح دليل الاحتفاظ باللقطات في Restic أن حذف اللقطات وحذف البيانات غير المُشار إليها عمليتان منفصلتان، وأن عملية الحذف تُقفل المستودع. ابدأ بتجربة أولية وسياسة تتوافق مع متطلبات الاحتفاظ لديك.
restic forget --tag nextcloud --keep-daily 7 --keep-weekly 5 \
--keep-monthly 12 --dry-run
راجع اللقطات التي يقترح البرنامج إزالتها. عند التأكد من ذلك، قم بإزالة اللقطات --dry-runوإضافة اللقطات المطلوبة --prune؛ وشغّل عملية التقليم عندما لا تتعارض مع النسخ الاحتياطي الليلي. تُعدّ هذه الأرقام الخاصة بالاحتفاظ مثالًا توضيحيًا، وليست سياسة عامة. ضع في اعتبارك مدة الاحتفاظ القانونية، ومساحة التخزين المتاحة، ومدى الحاجة إلى استعادة البيانات القديمة.
الاختبار الحقيقي هو عملية استعادة البيانات. استعد نسخة احتياطية حديثة إلى مجلد مؤقت على نظام منفصل، وليس فوق مسارات Nextcloud المباشرة الخاصة بجوردان.
restic restore latest --tag nextcloud --target /tmp/nextcloud-restore-check
تأكد من أن الشجرة المستعادة تحتوي على التكوين والبيانات ونسخة احتياطية من قاعدة البيانات المتوقعة، وافحص الملفات النموذجية. لإجراء عملية استعادة كاملة، اتبع دليل استعادة Nextcloud في بيئة معزولة، وتحقق من تسجيل الدخول والوصول إلى الملفات والمجلدات المشتركة المتوقعة قبل البدء في العملية. توضح وثائق الاستعادة الخاصة بـ Restic كيفية اختيار اللقطات وأهداف الاستعادة.
كيف تعرف متى يجب تغيير هذا النهج
لا يُناسب استخدام وظيفة cron الخاصة بجوردان إلا إذا كانت فترة الصيانة تتناسب مع مدة النسخ الاحتياطي، وكان كل مسار بيانات مطلوب محليًا وقابلًا للقراءة. غيّر التصميم عند ظهور أي من هذه العلامات:
- يبقى الموقع في وضع الصيانة لفترة أطول مما يتحمله المستخدمون: لذا خطط لأخذ لقطات منسقة أو استخدم طريقة أخرى متسقة مع التطبيق.
- تُظهر السجلات مسارات مفقودة، وأخطاء في الأذونات، وفشلًا في تفريغ قاعدة البيانات، أو خروج Restic غير صفري: قم بإصلاح هذه الأمور قبل اعتبار اللقطة كاملة.
- توجد البيانات في وحدة تخزين خارجية أو على خادم آخر: يجب تضمين نسخة احتياطية متسقة من وحدة التخزين هذه في خطة الاسترداد.
- يفتقر اختبار الاستعادة إلى الملفات أو التكوين أو حالة قاعدة البيانات أو رمز التطبيق/السمة المطلوب: قم بتحديث مدخلات النسخ الاحتياطي وكرر العملية.
- توجد كلمة مرور Restic أو بيانات اعتماد SSH فقط على الخادم الذي يتم نسخه احتياطيًا: قم بتخزين بيانات اعتماد الاسترداد بشكل منفصل وتحقق من أن المسؤول المصرح له يمكنه الوصول إليها.
بالنسبة لجوردان، النجاح واضح للعيان: يُظهر سجلّ cron اكتمال العملية، restic snapshotsويُدرج لقطة مُوسومة حديثة، ولا تُشير فحوصات المستودع إلى وجود أي أخطاء، كما تُعيد عملية الاستعادة نسخة Nextcloud متماسكة. يُعدّ الأمر المُجدول بدايةً لعملية النسخ الاحتياطي؛ إذ لا يُمكن تحقيق مسار استعادة عملي إلا من خلال مجموعة كاملة وقابلة للاستعادة من بيانات قاعدة البيانات، والتكوين، والتطبيق، والمستخدم.
المراجع الرسمية