الدليل‹الكود والتصدير
الكود والتصديرمتوسّط‏٨ دقائق قراءة

متغيّرات البيئة

أبقِ الأسرار خارج كودك. كل مفتاح API، وعنوان قاعدة بيانات، وبيانات اعتماد لجهة خارجية مكانها في متغيّرات البيئة — لا مكتوبة بشكل ثابت في الكود.

لماذا تهمّ متغيّرات البيئة

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

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

⚠
انتبه.لا تلصق أبدًا مفاتيح API، أو كلمات مرور قواعد البيانات، أو أسرار OAuth مباشرةً في مطالبة مايندلاب. فالمطالبات تُخزَّن في سجلّ البناء الخاص بك. أبقِ كل بيانات الاعتماد في متغيّرات البيئة حيث يكون الوصول مضبوطًا.

ضبط المتغيّرات في مايندلاب

لكل مشروع في مايندلاب لوحة بيئة تُعرّف فيها متغيّراتك. وللوصول إليها:

1
افتح Project Settings
انقر على أيقونة الإعدادات في الزاوية العلوية من شاشة البناء، أو اضغط ⌘ K واكتب 'Project Settings'.
2
اختر تبويب Environment
سترى قسمين: Development وProduction. ولكلٍّ مجموعته المستقلّة من المتغيّرات.
3
أضف متغيّرًا
انقر على 'Add variable'. أدخل اسم المتغيّر في حقل Key (والعرف هو أحرف كبيرة مع شرطات سفلية: STRIPE_SECRET_KEY وDATABASE_URL) والقيمة في حقل Value. وانقر على أيقونة العين لتبديل إخفاء القيمة في الواجهة.
4
احفظ
انقر على Save. يصبح المتغيّر متاحًا فورًا في عملية البناء والنشر التالية. ولا حاجة إلى تشغيل توليد كود جديد — فمايندلاب يحقن متغيّرات البيئة وقت النشر، لا وقت توليد الكود.
ℹ
ملاحظة.أسماء المتغيّرات حسّاسة لحالة الأحرف. فـ STRIPE_SECRET_KEY وstripe_secret_key يُعامَلان كمتغيّرين مختلفين. والعرف هو ALL_CAPS_WITH_UNDERSCORES لكل متغيّرات البيئة، في جميع اللغات.

قيم التطوير مقابل الإنتاج

يحتفظ مايندلاب بمخازن متغيّرات منفصلة لبيئتي Development وProduction. وهذا يتيح لك استخدام مفتاح Stripe تجريبي وعنوان قاعدة بيانات محلي أثناء التطوير، بينما تستخدم بيئة الإنتاج بيانات اعتماد حيّة وقاعدة بياناتك السحابية — دون أي تغييرات في الكود.

1
متغيّرات التطوير
تُستخدَم عند معاينة تطبيقك داخل نافذة المعاينة المدمجة في مايندلاب وعند تشغيل المشروع محليًا بعد التصدير أو المزامنة مع GitHub. اضبطها على بيانات اعتماد تجريبية/اختبارية من مزوّدي API لديك — مفاتيح Stripe التجريبية، ونطاق Mailgun اختباري، وعنوان نسخة Postgres محلية.
2
متغيّرات الإنتاج
تُستخدَم عندما ينشر مايندلاب إلى وجهة استضافتك الحيّة (Vercel أو Railway أو Fly.io وغيرها). اضبطها على بيانات اعتماد API الحيّة لديك. ومتغيّرات الإنتاج لا تُكشف أبدًا في الكود المولّد أو التزامات GitHub.
3
المتغيّرات المشتركة
المتغيّرات التي تعلّمها كـ Shared تُنسَخ إلى كلتا البيئتين تلقائيًا. استخدم هذا للإعدادات غير السرّية المتطابقة عبر البيئات — على سبيل المثال، APP_NAME أو راية ميزة تنطبق في كل مكان.

عندما يدفع مايندلاب عملية نشر إلى Vercel أو Railway، يحقن متغيّرات الإنتاج مباشرةً في مخزن أسرار منصّة الاستضافة عبر واجهات API الخاصة بها. ولا تحتاج أبدًا إلى نسخ بيانات الاعتماد ولصقها في لوحة استضافة يدويًا.

الإشارة إلى المتغيّرات في الكود المولّد

يولّد مايندلاب كودًا يقرأ متغيّرات البيئة باستخدام النمط الاصطلاحي لكل لغة. وإليك الحالتين الأكثر شيوعًا:

في خادم FastAPI (Python)، تُحمَّل المتغيّرات باستخدام المكتبة القياسية:

python
import os
from fastapi import FastAPI

app = FastAPI()

# Loaded from the environment at startup — never hardcoded
DATABASE_URL = os.environ.get("DATABASE_URL")
STRIPE_SECRET_KEY = os.environ.get("STRIPE_SECRET_KEY")
OPENAI_API_KEY = os.environ.get("OPENAI_API_KEY")

if not DATABASE_URL:
    raise RuntimeError(
        "DATABASE_URL environment variable is not set. "
        "Add it in Project Settings > Environment."
    )

@app.get("/health")
def health():
    return {"status": "ok"}

في واجهة React الأمامية (Vite)، يجب أن تُسبَق المتغيّرات ببادئة VITE_ كي تُعرَض لحزمة المتصفّح. وهذه البادئة إجراء أمني — فالمتغيّرات التي تخلو منها لا تُضمَّن أبدًا في كود جانب العميل، حتى لو كانت موجودة في البيئة.

typescript
// Vite exposes only VITE_-prefixed variables to the browser
const apiBaseUrl = import.meta.env.VITE_API_BASE_URL;
const stripePublicKey = import.meta.env.VITE_STRIPE_PUBLISHABLE_KEY;

// Never put secrets in VITE_ variables — they're visible in the browser
// Use VITE_ only for public, non-sensitive configuration

if (!apiBaseUrl) {
  console.error(
    "VITE_API_BASE_URL is not set. " +
    "Check Project Settings > Environment."
  );
}
⚠
انتبه.لا تضع أبدًا مفاتيح سرّية (مفتاح Stripe السرّي، أو كلمات مرور قواعد البيانات، أو رموز API الخاصة) في متغيّرات VITE_. ولأن المتغيّرات ذات البادئة VITE_ تُحزَم في JavaScript الذي يُرسَل إلى المتصفّحات، فهي مرئية لأي شخص يفتح أدوات المطوّر. استخدمها فقط للإعدادات العامة مثل عنوان API الأساسي أو مفتاح Stripe القابل للنشر.

في خادم Express (Node.js)، النمط مشابه لـ Python لكنه يستخدم process.env:

typescript
import express from "express";

const app = express();

const DATABASE_URL = process.env.DATABASE_URL;
const JWT_SECRET = process.env.JWT_SECRET;

if (!DATABASE_URL || !JWT_SECRET) {
  throw new Error(
    "Required environment variables are missing. " +
    "Check Project Settings > Environment."
  );
}

app.listen(process.env.PORT ?? 3001, () => {
  console.log("Server started");
});

المزامنة مع GitHub

عندما يزامن مايندلاب مشروعك مع GitHub، تُعالَج متغيّرات البيئة بعناية لمنع التسرّب العرضي:

1
يُلتزَم بملف .env.example
يولّد مايندلاب ملف .env.example يحتوي على كل أسماء متغيّراتك بقيم فارغة أو نائبة. ويُلتزَم بهذا الملف في GitHub كي يعرف أي شخص يستنسخ المستودع بالضبط أي متغيّرات يحتاج إلى ضبطها، دون رؤية أي أسرار فعلية.
2
لا يُلتزَم أبدًا بملف .env الحقيقي
يضيف مايندلاب .env و.env.local إلى .gitignore تلقائيًا. وقيم متغيّراتك الفعلية لا تظهر أبدًا في المستودع، ولا في سجلّ git، ولا في أي فرق طلب سحب.
3
أسرار GitHub Actions (اختياري)
إذا كنت تستخدم تكامل CI الخاص بـ GitHub Actions في مايندلاب، تُدفَع متغيّرات الإنتاج إلى GitHub Actions Secrets عبر واجهة GitHub البرمجية أثناء أول عملية نشر. وعمليات CI اللاحقة تقرأ من تلك الأسرار — فلا تديرها يدويًا في واجهة GitHub على الويب.
bash
# .env.example — committed to GitHub (no real values)
DATABASE_URL=
STRIPE_SECRET_KEY=
STRIPE_PUBLISHABLE_KEY=
OPENAI_API_KEY=
JWT_SECRET=
APP_URL=http://localhost:3000

# .env — local only, never committed (in .gitignore)
DATABASE_URL=postgresql://postgres:password@localhost:5432/myapp_dev
STRIPE_SECRET_KEY=sk_test_...
STRIPE_PUBLISHABLE_KEY=pk_test_...
OPENAI_API_KEY=sk-...
JWT_SECRET=a-long-random-string-here
APP_URL=http://localhost:3000

تدوير سرّ

تدوير السرّ — استبدال بيانات اعتماد مخترَقة أو منتهية الصلاحية بأخرى جديدة — ينبغي أن يتمّ بعناية لتجنّب التوقّف. وإليك التسلسل الآمن الذي تتبعه في مايندلاب:

1
ولّد السرّ الجديد لدى مزوّدك
أنشئ مفتاح API أو كلمة المرور الجديدة في لوحة الخدمة الخارجية أولًا. ولا تُبطل القديمة بعد — فتطبيقك الحيّ لا يزال يستخدمها.
2
حدّث متغيّر الإنتاج في مايندلاب
اذهب إلى Project Settings > Environment > Production. انقر على المتغيّر الذي تدوّره، والصق القيمة الجديدة، واحفظ. ولا يدفع مايندلاب هذا التغيير إلى منصّة استضافتك حتى تُطلَق عملية نشر.
3
أطلق عملية نشر
اضغط ⌘ Enter وأكّد عملية النشر، أو انقر على Deploy في شاشة البناء. يدفع مايندلاب قيمة المتغيّر الجديدة إلى منصّة استضافتك كجزء من عملية النشر. وتصبح القيمة الجديدة فعّالة عند اكتمال النشر (عادةً في أقل من ٦٠ ثانية لمعظم المنصّات).
4
تحقّق من سلامة التطبيق
تحقّق من نقطة فحص سلامة تطبيقك أو شغّل اختبار دخان سريعًا — سجّل الدخول، ونفّذ إجراءً رئيسيًا — للتأكّد من أن بيانات الاعتماد الجديدة تعمل بشكل صحيح.
5
أبطل السرّ القديم
الآن فقط، بعد أن تأكّدت من سلامة التطبيق ببيانات الاعتماد الجديدة، عُد إلى لوحة مزوّدك وأبطل السرّ القديم. هذا التسلسل يضمن تدويرًا دون أي توقّف.
💡
نصيحة.إذا اشتبهت في أن سرًّا قد اختُرق، فأعطِ الأولوية لإبطاله فورًا — حتى قبل أن يكون لديك بديل جاهز. فنافذة قصيرة من الأداء المتدهور (على سبيل المثال، فشل مدفوعات Stripe) أقل ضررًا بكثير من بيانات اعتماد حيّة في يد مهاجم. أعدّ بيانات الاعتماد الجديدة واستعد الخدمة بأسرع ما يمكن بعد الإبطال.
الخطوات التالية
→ العودة إلى الدليل