النسخ الاحتياطي لموقعك باستخدام git و Makefile

تسمح لك ترجمة الموقع إلى مجموعة من صفحات الويب الثابتة بتقليل الحمل على الخادم أو حتى الاستفادة من التخزين المجاني ، بالإضافة إلى زيادة موثوقية الموقع وسرعته وأمانه. في هذه المقالة ، سأتحدث عن كيفية القيام بذلك باستخدام أدوات git و Makefile المألوفة. بالإضافة إلى هذا النهج هو القدرة على التحكم في إصدارات محتوى صفحة الويب.


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


يستخدم المؤلف مكدس django / uwsgi / nginx ، خادم مخصص ظاهري يعمل بنظام GNU / Linux ، ولكن محتوى المقالة يكاد يكون مستقلاً عن تقنيات معينة.


تحميل الصفحات


سنحفظ صفحات الموقع باستخدام برنامج wget القياسي. سنحفظ كل موقع في دليل منفصل (قد لا يكون مرتبطًا باسم نطاق الموقع).


داخل كل دليل ، سيتم حفظ الصفحات بشكل متكرر باستخدام مفتاح wget -r (من المفترض أنه يمكن الوصول إلى جميع الصفحات عبر روابط من الصفحة الرئيسية). بشكل افتراضي ، يرتفع النسخ العودي إلى المستوى 5 ، ولكن يمكن تغيير ذلك باستخدام -l .


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


يبدو الأمر الكامل مثل هذا:


mkdir primer cd primer wget -r -nH -X ,static --restrict-file-names=nocontrol . 

-nH يعني - لا الدلائل المضيف . بشكل افتراضي ، يضع wget -r example.com كل شيء في دليل example.com/ ، ويلغي هذا الخيار إنشاء الدليل باسم المضيف.


يشير الخيار --restrict-file-names إلى هروب الأحرف في عنوان URL عند إنشاء ملفات محلية. تعني قيمة nocontrol تعطيل الهروب وهي مهمة جدًا لحفظ الصفحات ذات الروابط السيريلية. بدونها ، يتم حفظ الصفحات في ملفات بأسماء متغيرة قليلاً ، وليس من الواضح تمامًا كيفية إصدارها إلى الخادم. لسوء حظ مستخدمي Windows ، --restrict-file-names = nocontrol لن يعمل معهم ، هذه مشكلة معروفة.


أضف إلى بوابة


يتم إنشاء مستودع جديد باستخدام الأمر git init . بشكل افتراضي ، يتم إنشاؤه داخل الدليل الحالي في المجلد .git ، ولكننا نريد أن يكون لدى الخادم حق الوصول فقط إلى الملفات التي تتوافق مع أسماء الصفحات المفتوحة للموقع. لذلك ، يبدو الأمر الكامل الذي يقوم بإنشاء مستودع نظيف (مجرد) في المجلد ../.git-primer كما يلي:


 git init --bare ../.git-primer 

لاستخدام هذا المستودع غير القياسي ، تحتاج إلى تمرير git-dir وخيارات شجرة العمل :


 git --git-dir=../.git-primer --work-tree=. add . 

كتابة ملف Makefile


لنبدأ بالإعلان عن مشاريعنا:


 SITES := example primer all : $(SITES) .PHONY : $(SITES) 

يحتوي متغير SITES على أسماء مشاريعنا. الهدف الافتراضي هو الهدف الأول ، أي ، لإكمال جميع الخطوات ، فقط اكتب الأمر one make . جميع الأهداف في SITES وهمية ( PHONY ): سيتم تنفيذ الوصفة لكل منها بغض النظر عن وجود الدليل والوقت الذي تم تغييره فيه.
يمكن قراءة المقدمة الأساسية لعمل ، على سبيل المثال ، هنا ، والدليل الأساسي هو جعل المعلومات ( الأصل ، الترجمة ).


تبدو القاعدة لكل مشروع كما يلي:


 $(SITES) : if [[ -d .git-$@ ]]; \ then \ $(get-data); \ $(mgit) add . && \ if [[ -n "`$(mgit) status --porcelain`" ]]; then \ $(mgit) commit -m "Update $@."; \ fi \ else \ $(init-git); \ fi 

هذه القاعدة هي في الأساس أمر قذيفة واحد.
$ @ هو متغير تلقائي يحتوي على اسم الهدف الحالي (على سبيل المثال ، التمهيدي).
نتحقق أولاً من وجود دليل .git-primer. إذا كان الأمر كذلك ، فانتقل إلى دليل المشروع ، وقم بتنزيل الصفحات وإضافتها إلى git.
إذا لم يتغير محتوى الصفحات ، فلن يقوم git بإضافة أي شيء ، ولكن في هذه الحالة ، سيؤدي الالتزام إلى حدوث خطأ وتوقف تنفيذ ملف Makefile. لذلك ، نسمي أولاً حالة git مع الخيار - الخزف ، المخصص للاستخدام في البرامج النصية. إذا كان طول خط الإخراج لحالة git - الخزف ليس صفرًا ، فيمكننا الالتزام ( من هنا ).


get-data و mgit و init-git هي وصفات معلبة في ملف Makefile. على سبيل المثال ، mgit هو استدعاء git يحدد دليلاً يحتوي على ملفات دليل ومستودع العمل:


 define mgit = git --git-dir=../.git-$@ --work-tree=. endef 

يتم إنشاء الوصفات المعلبة عندما يمكن استخدام تسلسل واحد من الأوامر في عدة وصفات. يمكن أن تتكون من عدة خطوط ، يتم تمييز كل منها تلقائيًا بعلامة تبويب في الوصفات (بتعبير أدق ، مع الرمز .RECIPEPREFIX ). في مثالنا ، يتم عمل مسافة بادئة فقط لقراءة ملف Makefile.
أثناء تنفيذ الوصفات ، يتم تفسير كل سطر من التسلسلات المعدة كخط منفصل للوصفة ، أي على وجه الخصوص ، يمكنهم استخدام المتغيرات التلقائية لهذا الغرض .


يبدو ملف Makefile الكامل كما يلي:


 SITES := primer example SERVERHOST := example # .  punicode SERVERHOSTNAME := xn--e1afmkfd.xn--p1ai SERVERPATH := ~/archive all : $(SITES) .PHONY : $(SITES) # target-specific variables primer : DOMAIN := . primer : EXCLUDEDIRS := ,static example : DOMAIN := example.com ifeq ($(SERVERHOSTNAME),$(shell hostname)) # Server define mgit = git --git-dir=../.git-$@ --work-tree=. endef define init-git = mkdir -p $@ && \ $(get-data) && \ git init --bare ../.git-$@ && \ $(mgit) add . && \ $(mgit) commit -m "Initial commit of $@." endef define get-data = cd $@ && \ wget -r -nH -X $(EXCLUDEDIRS) --restrict-file-names=nocontrol $(DOMAIN) endef else # Workstation define init-git = git clone $(SERVERHOST):$(SERVERPATH)/.git-$@ $@ endef endif $(SITES) : ifeq ($(SERVERHOSTNAME),$(shell hostname)) # Server if [[ -d .git-$@ ]]; \ then \ $(get-data); \ $(mgit) add . && \ if [[ -n "`$(mgit) status --porcelain`" ]]; then \ $(mgit) commit -m "Update $@."; \ fi \ else \ $(init-git); \ fi else # Workstation if [[ -d $@/.git ]]; \ then \ cd $@ && git pull; \ else \ $(init-git); \ fi endif 

في الفقرة الرابعة ، هناك متغيرات خاصة بالهدف : لكل هدف ، يمكنك تعيين القيمة الخاصة بك لهذا المتغير. يتم أيضًا إرسال هذه القيم اعتمادًا على المتطلبات الأساسية لكل هدف والوصفات المعدة المستخدمة ، أي يمكننا التأكد من أن وصفة كل موقع سيتم تنفيذها باستخدام اسم الموقع الصحيح ودليله.
لكل مشروع ، يمكننا نقل أدلةنا غير المؤرشفة من خلال متغير EXCLUDEDIRS أو تركها فارغة. وبالمثل ، يمكنك تغيير اسم الخادم للأرشفة من كمبيوتر عامل ( SERVERHOST ) والمسار على الخادم إلى الدليل باستخدام أرشيف الموقع ( SERVERPATH ). للتبسيط ، في هذا المثال ، جميع المواقع موجودة على نفس الخادم وأرشفتها في نفس الدليل.
نظرًا لأن كل سطر من الوصفة (بما في ذلك الخط المعد) يتم تنفيذه في غلاف منفصل ، بحيث يبقى الانتقال إلى الدليل صالحًا للأوامر التالية ، فإننا نستخدم عامل التشغيل "and" && ونهرب من نهاية السطر \.


التالي هو بناء Makefile الشرطي : باستخدام الأمر shell hostname ، نتحقق مما إذا كان يتم تشغيله على الخادم أو على الكمبيوتر المحلي. يتم تجاهل الخطوط التي لا تفي بالفرع الحالي من التوجيه الشرطي تمامًا بواسطة Makefile.


الفرق بين المستودعات المحلية والخوادم

يتم استخدام الكمبيوتر المحلي بشكل أساسي لتخزين البيانات ، لذلك نقوم بنسخ البيانات فقط من الخادم ( سحب git ) إليه ، ولراحة العمل المحلي باستخدام git (عرض السجلات أو إصدارات الملفات) ، نستخدم بنية المستودع الافتراضية (المستودع المعتاد في مجلد .git )
في كلتا الحالتين ، يكفي أمر صنع واحد. للنسخ التلقائي ، يمكنك استخدام جدولة cron . من أجل عدم إدخال كلمة المرور للوصول إلى الخادم في كل مرة ، يتم إنشاء مفاتيح ssh.


لراحة العمل على الخادم ، يمكنك إنشاء بوابة مستعارة من دليل الموقع الحالي مع التكوين المحدد:


 alias mgit="git --work-tree=. --git-dir=../.git-${PWD##*/}" 

يحتوي المتغير $ {PWD ## * /} على اسم الدليل الحالي بدون مسار إليه وهو جزء من معيار POSIX ، أي أنه يمكن استخدامه في جميع الأصداف التي تدعم POSIX.


يمكن أيضًا استخدام التوجيه الشرطي في الوصفات ، والقيد الوحيد هو أن بدايته ونهايته لا يمكن أن يكونا في ملفات مختلفة.


الخادم

بعد تشغيل الأمر ، يبدو دليل الأرشيف كما يلي:


 $ ls -a . .. .git-example .git-primer Makefile example primer $ ls -a primer . .. index.html - - $ # ,     .    ./-  ./- 

قد يبدو ملف التكوين nginx على سبيل المثال. rf كما يلي:


 server { server_name xn--e1afmkfd.xn--p1ai; charset utf-8; location = / { root /home/user/archive/primer; try_files /index.html =404; } location / { root /home/user/archive/primer; default_type "text/html"; try_files $uri =404; } location = /index.html { return 404; } } 

يتوافق الموقع الأول مع الصفحة الرئيسية للموقع ، example.rf. يتم حفظه بواسطة wget كملف index.html. إذا لم يكن كذلك ، يتم إصدار خطأ 404.


بالنسبة لجميع عناوين URI الأخرى ، يتم التحقق من الملفات الموجودة في دليل التمهيدي باسم URI. إذا لم يتم العثور عليها ، يتم إرجاع 404.


في النهاية ، لتجنب تكرار المحتوى ، نرفض صراحة الوصول إلى الرابط example.rf / index.html (404). تتم كتابة المزيد من التفاصيل حول هذا التكوين هنا .


الخلاصة


يمكن إجراء النسخ الاحتياطي للمواقع باستخدام الأدوات القياسية wget ، git ، make . يمكنك نسخ جميع صفحات الموقع أو استبعاد الوسائط وعدد من الملفات الأخرى بدقة تسمح Wget . وبالمثل ، باستخدام .gitignore ، يمكنك التحكم في الصفحات الثابتة التي ستتم إضافتها إلى المستودع للنسخ الاحتياطي وأيها لا. يتيح لك Makefile إدارة مختلف التكوينات بمرونة لمشاريع مختلفة. يحتوي مثال Makefile الكامل للعميل والخادم أعلاه على حوالي 60 سطرًا فقط.


من المفترض أن يتم تغيير وإضافة محتوى الموقع من خلال الآليات القياسية ، أي يتم إطلاق CMS أو CMF لهذا الغرض. إذا حدث هذا نادرًا ، فيمكن بعد ذلك إيقاف تشغيله وتحرير موارد النظام وعرض الصفحات الثابتة المحفوظة. قد يستحق مثال عن أتمتة كاملة مقال منفصل.


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


يمكن أيضًا حفظ إصدارات محتوى الموقع من خلال قاعدة البيانات عند تغيير صفحاتها. لكن هذا يتطلب دعم الإصدار بواسطة نماذج CMF ، بالإضافة إلى تحكم أكبر في تفريغ قاعدة البيانات (انسخها بالكامل بعد أي تحرير للصفحة). في الطريقة المقترحة ، في حالة حدوث تغيير بسيط في المحتوى ، سيتم إضافة هذا التغيير فقط إلى المستودع ، ولا يلزم استخدام نسخة كاملة من قاعدة البيانات. بالإضافة إلى ذلك ، يمكن استخدام الصفحات الثابتة التي تم إنشاؤها مباشرةً بواسطة الخادم أو عرضها في متصفح (سيتم أيضًا تغيير التصميم أو رمز الموقع الآخر).


يتم سرد برامج النسخ الاحتياطي البديلة هنا . لتخزين ومزامنة ملفات الوسائط ، يجب الانتباه إلى الملحق git . كما تم استخدام فصل مستودع .git من شجرة العمل بنجاح لإدارة ملفات تكوين المستخدم (ملفات نقطية ). توجد اليوم خوادم تدعم العمل مباشرة مع مستودعات git.

Source: https://habr.com/ru/post/ar425259/


All Articles