تطبيق مع قاعدة بيانات

واجهة API وقاعدة PostgreSQL مُدارة، يربط بينهما سرّ، تعملان بنسختين، مع نسخة احتياطية استعدتها مرة واحدة.

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

افعل هذا بشيء لا يضيرك أن يتعطّل.

قبل أن تبدأ

  • مؤسّسة فيها بعض الرصيد.
  • الـ CLI مثبّتة ومسجَّل الدخول بها. انظر تثبيت واجهة سطر الأوامر.
  • مستودع مربوط بمؤسّستك، يحتوي على API تستمع على منفذ وتقرأ عنوان قاعدة بياناتها من متغيّر بيئة واحد. يسمّي هذا الدرس المتغيّر DATABASE_URL، والتطبيق shop-api، وقاعدة البيانات shop-db. ضع مستودعك مكان acme/shop-api.

1. اطلب قاعدة البيانات

في وحدة التحكّم، افتح مثيلات قواعد البيانات واضغط مثيل جديد. سمِّه shop-db، واختر المنطقة، واترك الشبكة على المعروضة (وهي شبكة مؤسّستك)، واختر عقدة واحدة تحت البنية، وخذ أصغر حجم، ثم اضغط نشر.

ينبغي أن ترى shop-db في القائمة بالحالة قيد التجهيز، ثم قيد التشغيل. قد يستغرق الإقلاع الأول عدّة دقائق. تتحدّث الصفحة من تلقاء نفسها.

لا تستخدم قواعد البيانات المصغّرة لهذا. فالقاعدة المصغّرة لا يُوصَل إليها إلا عبر عنوان عام. أمّا المثيل فينضمّ إلى شبكتك الخاصة، ومن هناك سيصل إليه التطبيق.

دوّن اسم الشبكة. يجب أن يكون التطبيق على الشبكة نفسها.

2. اقرأ سلسلة الاتصال

افتح المثيل بـ إدارة. في تبويب نظرة عامة، تحت الاتصال، اضغط إظهار تفاصيل الاتصال.

ينبغي أن ترى سطرًا واحدًا يبدأ بـ postgresql://، وتحته المضيف والمنفذ وقاعدة البيانات والمستخدم. هذا السطر هو بيانات الاعتماد كاملة: دورك الإداري، وكلمة مروره، والعنوان الخاص.

قبل أن تغادر الصفحة، اضغط اختبار الاتصالات تحت قابلية الاتصال. ينبغي أن تُظهر نقطة الوصول الخاصة يقبل الاتصالات. إن لم تفعل، فانتظر نصف دقيقة واختبر من جديد: يُعلَّم المثيل على أنه يعمل قبل أن يقبل الاتصالات بقليل.

هذا السطر يحتوي على كلمة مرور. لا تلصقه في محادثة ولا في تذكرة ولا في commit.

3. أنشئ التطبيق، والسلسلة سرّ

ضع السلسلة أولًا في متغيّر في الصدفة، دون أن تظهر على الشاشة ولا في سجلّ أوامرك. في bash أو zsh:

read -rs DATABASE_URL

الصق السطر واضغط Enter. ثم أنشئ التطبيق:

isogrid apps create --name shop-api \
  --url https://github.com/acme/shop-api \
  --replicas 2 --public \
  --secret-env DATABASE_URL="$DATABASE_URL" \
  --wait

يحفظ --secret-env القيمة سرًّا ويسلّمها للتطبيق متغيّرَ بيئة. لا تستخدم --env لها: فالمتغيّر العادي يقرؤه كل من يستطيع رؤية التطبيق. وإن كانت شيفرتك تقرأ أسرارها من ملفات، فاستخدم --secret، الذي يسلّم القيمة نفسها في الملف /run/secrets/DATABASE_URL.

يشغّل --replicas 2 نسختين، فلا يترك النشر فجوة بعد الآن.

ينبغي أن ترى Created shop-api in …, on network …، ثم Build #1 succeeded.، ثم shop-api is running. وعنوانه.

تحقّق من الشبكة في ذلك السطر الأول. إن لم تكن شبكة الخطوة 1، فسيُقلع التطبيق ولن يجد قاعدة البيانات أبدًا. سمِّ الشبكة الصحيحة بـ --network؛ ويعرض isogrid networks list شبكاتك.

4. تحقّق منه

isogrid apps status shop-api
isogrid apps secrets shop-api

ينبغي أن يطبع الأول shop-api running 2/2 running. ويطبع الثاني DATABASE_URL ولا شيء غيره: الاسم، لا القيمة أبدًا. لا أمر ولا صفحة يعيدان القيمة.

افتح الآن العنوان واستدعِ شيئًا يقرأ من قاعدة البيانات.

إن ظلّت النسخ تتوقّف، فإن status يسردها مع الخطأ، وهذا يعرض ما طبعه التطبيق:

isogrid apps logs shop-api --search 'level:error' --since 15m

والأسباب بحسب الأرجحية: التطبيق على شبكة غير شبكة قاعدة البيانات؛ أو الشيفرة تقرأ متغيّرًا باسم آخر؛ أو كل نسخة تفتح اتصالات أكثر ممّا تقبله قاعدة البيانات. نسختان تعنيان مجمّعَي اتصالات. انظر قواعد البيانات.

5. خذ نسخة احتياطية

النسخ الاحتياطي مفعّل أصلًا للمثيل: يوميًا، في الساعة 03:00 بتوقيت UTC، ويُحتفظ بالنسخ إلى أن تقرّر غير ذلك. لا تنتظر الليل لتعرف هل يعمل. افتح تبويب النسخ الاحتياطية واضغط نسخ احتياطي الآن.

ينبغي أن ترى «جارٍ أخذ النسخة… ستظهر هنا عند اكتمالها.»، ثم صفًّا لكل قاعدة بيانات على المثيل مع حجمها والحالة ناجحة، وبجانبه تنزيل واستعادة.

تحت جدول النسخ الاحتياطي يمكنك تغيير الساعة ومدة الاحتفاظ (بالأيام). وإن تُركت فارغة، فستُحفظ كل النسخ الاحتياطية.

ليس هذا ما تمنحك إيّاه نسخ قاعدة البيانات. فالنسخ المتماثل يكرّر أمر DELETE خاطئًا بأمانة. والنسخة الاحتياطية وحدها هي ما يسبقه.

6. استعدها

النسخة الاحتياطية التي لم تستعدها قط أمل، لا نسخة احتياطية. اضغط استعادة في الصفّ. يُطلب منك تسمية قاعدة بيانات جديدة، ويُقترح عليك الاسم الأصلي متبوعًا بـ _restored. اقبله.

ينبغي أن ترى «جارٍ الاستعادة إلى «…». ستظهر القاعدة بمجرد اكتمال العملية.»

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

وللتحقّق منها، افتح تبويب الاستعلام، واكتب الاسم الجديد في حقل قاعدة البيانات، وعُدّ صفوف جدول تعرفه:

SELECT count(*) FROM orders;

ينبغي أن تحصل على العدد الذي كان في الجدول لحظة أخذ النسخة الاحتياطية.

7. وجّه التطبيق إلى البيانات المستعادة

فقط في اليوم الذي تحتاج فيه فعلًا إلى العودة. سلسلة الاتصال هي سلسلة الخطوة 2 مع وضع الاسم الجديد مكان اسم قاعدة البيانات في آخرها:

read -rs RESTORED_URL
isogrid apps update shop-api --secret-env DATABASE_URL="$RESTORED_URL"
isogrid apps deploy shop-api --wait

ينبغي أن ترى Updated shop-api: secrets.، ثم shop-api is running.

حفظ السرّ لا يعيد تشغيل شيء. الأمر الثاني هو ما يجعل النسخ تلتقطه: يعيد نشر البناء الذي يملكه التطبيق أصلًا، دون بناء جديد.

ماذا تقرأ بعد ذلك