انتقل إلى المحتوى الرئيسي انتقل إلى الملاحة انتقل إلى التذييل
لفترة محدودة: برنامج Design Partner — خطة BUSINESS مجانية مدى الحياة

إدارة الأسرار

ضع بيانات اعتماد النشر في مكان لا تستطيع النسخ الوصول إليه. كتابة فقط حسب التصميم.

إدارة الأسرار

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

المكان الصحيح هو rdc repo secret. وضعان للتسليم، كتابة فقط حسب التصميم، والنسخة تبدأ بلا شيء. في هذا الدرس نضبط كلا النوعين، ننشر تطبيقًا يستهلكهما، نُثبت أن القيم تصل فعلًا إلى الحاوية، ثم نُشاهد نسخة تفشل في الانطلاق لأن الأسرار رفضت أن تُرافقها.

شاهد الدرس التعليمي

الفخ: .env في المستودع

A .env file inside the repo image gets cloned by every fork

معظم الفرق تضع .env في المستودع. إنها الخطوة الواضحة.

ثم ينسخون.

النسخة هي نسخة بايت تماماً من صورة الأصل. ما هو في .env موجود في .env الخاصة بالنسخة. تشتغل حاويات النسخة. تقرأ نفس مفتاح Stripe. تستدعي نفس Stripe API ببيانات اعتماد الإنتاج. من منظور Stripe، ذلك الاستدعاء هو أنت.

هذا يوم سيء. اسأل من يعرفها.

الخطوة 1: تعيين سر في وضع env

rdc repo secret set --name my-app --key DB_HOST --value postgres.internal --mode env

أولاً، قم بتعيين سر في وضع env. تصل القيمة كمتغير بيئة داخل container. الكتابات الأولى لا تتطلب أي إجراءات إضافية، الكتابة فوق سر موجود هي ما يستلزم تقديم دليل.

--mode env يجعل القيمة تصل كمتغير بيئة داخل الحاوية. الكتابة الأولى لا تحتاج إجراءات خاصة؛ الكتابة فوق سر موجود هي التي تتطلب إثبات القيمة الحالية.

الخطوة 2: تعيين سر في وضع file

rdc repo secret set --name my-app --key STRIPE_KEY --value sk_test_xxx --mode file

الآن عيّن سراً في وضع الملف. لا يكشف وضع الملف عن القيمة من خلال بيئة container، بل يكتب القيمة إلى ملف ضمن /run/secrets باستخدام آلية الأسرار القياسية في Docker. فضّل وضع الملف لأي شيء حساس.

وضع file لا يضع القيمة أبدًا في بيئة الحاوية. يكتبها إلى /run/secrets/stripe_key بدلًا من ذلك، باستخدام آلية Docker القياسية. يُفضَّل هذا لأي شيء حساس.

الخطوة 3: إدراج ما لديك

rdc repo secret list --name my-app

لنستعرض ما لدينا. الأسماء والأوضاع فقط. القائمة لا تعرض القيم أبداً، بغض النظر عمّن يسأل.

ترى الأسماء والأوضاع. لا قيم. لا تُظهر القائمة القيم أبدًا، بغض النظر عمن يسأل.

ربطه بـ compose

افتح docker-compose.yml. أشر إلى كلا الوضعين:

services:
  api:
    image: myapp:latest
    environment:
      DATABASE_HOST: ${REDIACC_SECRET_DB_HOST}
    secrets:
      - stripe_key

secrets:
  stripe_key:
    file: /var/run/rediacc/secrets/${REDIACC_NETWORK_ID}/STRIPE_KEY

${REDIACC_SECRET_DB_HOST} هو وضع env: يُوسّعه غلاف compose الخاص بـrenet من مخزن الأسرار وقت النشر.

كتلة secrets: هي وضع file، تستخدم آلية Docker القياسية. المسار المضيف يستخدم ${REDIACC_NETWORK_ID} حتى يعمل نفس الـ compose للأصول والنسخ. لكل نسخة معرف شبكة خاص بها.

لا يمكنك قراءته مرة أخرى

Write-only model: get returns a digest, never the value

هنا الجزء الذي يُفاجئ الناس في المرة الأولى، بمن فيهم أنا.

الخطوة 4: get يُرجع بصمة

rdc repo secret get --name my-app --key STRIPE_KEY

يُرجع أمر secret get ملخصاً، وليس القيمة، ولا يوجد خيار لاستعادة النص الصريح. هذا يتبع نموذج GitHub Actions: الأسرار للكتابة فقط بالتصميم.

تحصل على بصمة. ليس القيمة. لا توجد علامة تجعله يُرجع القيمة. لا يوجد أمر في أي مكان سيعطيك النص الصريح مرة أخرى.

هذا نموذج GitHub Actions: كتابة فقط. يمكنك إثبات أنك تعرف ما هو السر بتمرير --current <value> ومشاهدة الشرط المسبق ينجح. لا يمكنك مطالبة Rediacc بإخبارك بما هو.

الخطوة 5: دوّر عند النسيان

ضاعت القيمة؟ لا تُطلع. دوّر.

rdc repo secret set --name my-app --key STRIPE_KEY --value sk_test_new --mode file --rotate-secret

إذا فقدت قيمة سر، قم بتدويره بدلاً من محاولة استعادته. خيار rotate-secret يتخطى التحقق المسبق ويسجّل سجل التدقيق التغيير كتدوير مقصود.

--rotate-secret يتخطى الشرط المسبق. يُعلّم سجل التدقيق عليه كتدوير: صريح ومتعمد.

إذا كنت تتذكر القيمة القديمة، أثبتها بدلًا من ذلك مع --current <old-value>. هذا المسار الأكثر أمانًا. اكتشفته مفيدًا أكثر من مرة حين أكون في الطرفية الخاطئة أو على الجهاز الخاطئ.

النشر وإثبات التسليم

الأسرار التي لا تصل إلى التطبيق مجرد قاعدة بيانات فاخرة. انشر وتحقق من كلا مساري التسليم.

الخطوة 6: النشر مع كلا السرَّين

rdc repo up --name my-app --machine <machine-name>

انشر repo. يستخدم ملف compose كلا السرّين: قيمة env عبر الاستيفاء، وقيمة الملف عبر نقطة تركيب أسرار Docker.

الخطوة 7: السر بوضع env يصل

rdc term connect --machine <machine-name> --repository my-app --command 'docker exec app printenv DB_HOST'

اطبع المتغير داخل container: postgres.internal. وصل السر في وضع env إلى التطبيق وقت النشر.

الحاوية تطبع postgres.internal. التطبيق حصل فعلًا على القيمة، موسَّعة في بيئته وقت النشر.

الخطوة 8: السر بوضع file يصل

rdc term connect --machine <machine-name> --repository my-app --command 'docker exec app cat /run/secrets/stripe_key'

اقرأ /run/secrets/stripe_key داخل container: القيمة المُدوَّرة مُركَّبة هناك. التطبيق يحصل على النص الصريح، CLI فقط يرفض عرضه.

وهنا القيمة المُدوَّرة، مقروءة من /run/secrets/stripe_key داخل الحاوية. الكتابة فقط تسري على البشر وواجهة سطر الأوامر؛ تطبيقك يحصل على النص الصريح الحقيقي حيث يعده Docker.

الخلاصة المفاجئة للنسخ

After fork, the secrets list is empty

تذكر الفخ؟ انسخ المستودع وانظر.

الخطوة 9: نسخ المستودع

rdc repo fork --parent my-app --tag test --machine <machine-name>

قم بعمل fork للـ repo. الـ fork نسخة طابق بطابق من الصورة المشفرة للأصل.

الخطوة 10: النسخة تُدرج فارغة

rdc repo secret list --name my-app:test

استعراض أسرار fork يُرجع مجموعة فارغة: لا مفتاح Stripe، لا كلمة مرور قاعدة بيانات، لا رمز API. لا يستطيع fork انتحال هوية الأصل، وهذا ما يجعل نسخ الإنتاج آمناً.

فارغة.

ليس لدى النسخة مفتاح Stripe. لا كلمة مرور قاعدة بيانات. لا رمز API. لا تستطيع حاويات النسخة توسيع ${REDIACC_SECRET_STRIPE_KEY}. الملف في /var/run/rediacc/secrets/<fork-id>/STRIPE_KEY غير موجود.

النسخة لا تستطيع التظاهر بأنها أنت.

الخطوة 11: النسخة لا تستطيع حتى الانطلاق

rdc repo up --name my-app:test --machine <machine-name>

تشغيل fork باستخدام compose الأصل يفشل: ملف السر غير موجود ضمن معرف شبكة fork، لذا Docker يرفض ربط النقطة. بيانات اعتماد الإنتاج لا تتبع fork أبداً.

يفشل النشر عن قصد: bind source path does not exist: /var/run/rediacc/secrets/<fork-id>/STRIPE_KEY. ملف السر موجود تحت معرف شبكة الأصل لا معرف النسخة، لذا يرفض Docker التحميل. الفشل هو التجريب: بيانات اعتماد الإنتاج لا تُرافق النسخة أبدًا، حتى بالصدفة.

إذا أردت أسرارًا في النسخة للاختبار، عيّنها على النسخة صراحةً بقيم صندوق الرمل، مثلًا rdc repo secret set --name my-app:test --key STRIPE_KEY --value sk_sandbox_yyy --mode file. الآن تتحدث النسخة مع صندوق رمل Stripe وتنطلق بنجاح. بيانات اعتماد الإنتاج لم تغادر الإنتاج أبدًا.

الخلاصة

  • rdc repo secret يضع بيانات اعتمادك خارج صورة المستودع.
  • كلا الوضعين يصلان فعلًا إلى الحاوية: توسيع env و/run/secrets.
  • get يُرجع بصمة، وليس القيمة. دوّر عند النسيان؛ لا تُطلع.
  • النسخة تُدرج فارغة ولا تستطيع حتى تشغيل compose الأصل.

أسرار لا تستطيع النسخة اتباعها.


التالي: النسخ الاحتياطي والاستعادة.