إدارة الأسرار
التطبيقات الحقيقية تحتاج إلى بيانات اعتماد حقيقية: مفتاح Stripe الحي، وكلمة مرور قاعدة البيانات، ورمز API. المكان الخاطئ لوضعها هو في المستودع، لأن النسخة ترث كل ما بداخل الصورة المشفرة. وفجأة يصبح صندوق الرمل الخاص بك يُحاسب بطاقات العملاء الحقيقيين.
المكان الصحيح هو rdc repo secret. وضعان للتسليم، كتابة فقط حسب التصميم، والنسخة تبدأ بلا شيء.
شاهد الدرس التعليمي
الفخ: .env في المستودع
معظم الفرق تضع .env في المستودع. إنها الخطوة الواضحة.
ثم ينسخون.
النسخة هي نسخة بايت للبايت من صورة الأصل. ما هو في .env موجود في .env الخاصة بالنسخة. تشتغل حاويات النسخة. تقرأ نفس مفتاح Stripe. تستدعي نفس Stripe API ببيانات اعتماد الإنتاج. من منظور Stripe، ذلك الاستدعاء هو أنت.
هذا يوم سيء.
تعيين سر
الحل هو rdc repo secret. عيّن سرًا في وضع env. يصل كمتغير بيئة في الحاوية:
time rdc repo secret set --name my-app --key DB_HOST --value postgres.internal --mode env --current ""
شيئان للانتباه:
--mode env. تصل القيمة كمتغير بيئة.--current "". سلسلة فارغة. نُعلن أن هذا سر جديد كليًا بدون قيمة سابقة.
عيّن آخر، في وضع file، لأي شيء حساس:
time rdc repo secret set --name my-app --key STRIPE_KEY --value sk_test_xxx --mode file --current ""
وضع file لا يضع القيمة أبدًا في بيئة الحاوية. يكتبها إلى /run/secrets/stripe_key بدلًا من ذلك، باستخدام آلية Docker القياسية.
أدرج ما لديك:
time 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 للأصول والنسخ. لكل نسخة معرف شبكة خاص بها.
انشر:
time rdc repo up --name my-app -m my-server
التحقق داخل الحاوية
كلا الوضعين يجب أن يكونا داخل الحاوية الآن. تحقق من سر وضع env:
time rdc term connect -m my-server -r my-app -c 'docker exec $(docker ps -q -f name=api) printenv DATABASE_HOST'
postgres.internal. وصل سر وضع env إلى بيئة الحاوية.
الآن وضع file:
time rdc term connect -m my-server -r my-app -c 'docker exec $(docker ps -q -f name=api) cat /run/secrets/stripe_key'
sk_test_xxx. الملف مُثبَّت عبر آلية الأسرار القياسية في Docker.
لا يمكنك قراءته مرة أخرى
الآن الجزء الذي يُفاجئ الناس:
time rdc repo secret get --name my-app --key STRIPE_KEY
تحصل على بصمة. ليس القيمة. لا توجد علامة تجعله يُرجع القيمة. لا يوجد أمر في أي مكان سيعطيك النص الصريح مرة أخرى.
هذا نموذج GitHub Actions: كتابة فقط. يمكنك إثبات أنك تعرف ما هو السر بتمرير --current <value> ومشاهدة الشرط المسبق ينجح. لا يمكنك مطالبة Rediacc بإخبارك بما هو.
ضاعت القيمة؟ لا تُطلع. دوّر.
time rdc repo secret set --name my-app --key STRIPE_KEY --value sk_test_new --mode file --rotate-secret
--rotate-secret يتخطى الشرط المسبق. يُعلّم سجل التدقيق عليه كتدوير: صريح ومتعمد.
إذا كنت تتذكر القيمة القديمة، أثبتها عوضًا عن ذلك:
time rdc repo secret set --name my-app --key STRIPE_KEY --value sk_test_new --mode file --current sk_test_xxx
هذا المسار الأكثر أمانًا. يكتشف خطأ “أنا في الطرفية الخاطئة”.
الخلاصة المفاجئة للنسخ
تذكر الفخ؟ انسخ المستودع وانظر:
time rdc repo fork --parent my-app --tag test -m my-server
time rdc repo secret list --name my-app:test
فارغة.
ليس لدى النسخة مفتاح Stripe. لا كلمة مرور قاعدة بيانات. لا رمز API. لا تستطيع حاويات النسخة توسيع ${REDIACC_SECRET_STRIPE_KEY}. الملف في /var/run/rediacc/secrets/<fork-id>/STRIPE_KEY غير موجود.
النسخة لا تستطيع التظاهر بأنها أنت.
إذا أردت أسرارًا في النسخة للاختبار، عيّنها على النسخة صراحةً بقيم صندوق الرمل:
time rdc repo secret set --name my-app:test --key STRIPE_KEY --value sk_sandbox_yyy --mode file --current ""
الآن تتحدث النسخة مع صندوق رمل Stripe. بيانات اعتماد الإنتاج لم تغادر الإنتاج أبدًا.
الخلاصة
rdc repo secretيضع بيانات اعتمادك خارج صورة المستودع.- لا تستطيع النسخة الوصول إليها.
- يُرجع
getبصمة، وليس القيمة. - دوّر عندما تنسى. لا تُطلع.
أسرار لا تستطيع النسخة اتباعها.
التالي: الشبكات والنطاقات.