فاکتور سوم: Config
فاکتور سوم در 12-Factor App به پیکربندی اپلیکیشن (Config) مربوط میشود. پیکربندی شامل تمام اطلاعاتی است که ممکن است بین deployهای مختلف اپلیکیشن متفاوت باشد، مانند محیط توسعه، staging و production.
مثالهایی از پیکربندی:
- اتصال به پایگاه داده، Memcached و سایر سرویسهای پشتیبان
- اطلاعات ورود و کلیدهای امنیتی سرویسهای خارجی مانند Amazon S3 یا Twitter
- مقادیر ویژه هر deploy، مانند hostname اصلی یا تنظیمات شبکه
برخی اپلیکیشنها پیکربندی را بهصورت ثابت در کد ذخیره میکنند که این نقض اصول 12-Factor است، زیرا کد باید ثابت باشد و پیکربندی باید جداگانه مدیریت شود. یک معیار ساده برای بررسی این موضوع این است که آیا میتوان کدبیس را به صورت متنباز منتشر کرد بدون اینکه اطلاعات حساسی مانند کلیدها یا پسوردها فاش شود.

راهکارهای معمول و محدودیتهای آنها
یک روش رایج ذخیره پیکربندی، استفاده از فایلهای config است که وارد سیستم کنترل نسخه نمیشوند، مانند config/database.yml در Rails. این روش نسبت به ثابتکردن مقادیر در کد بهتر است، اما هنوز مشکلاتی دارد:
- امکان اشتباه و وارد شدن فایل config به مخزن کد
- فایلهای پیکربندی پراکنده در مکانها و فرمتهای مختلف که مدیریت را دشوار میکند
- وابستگی به زبان یا فریمورک خاص، و عدم استاندارد بودن برای محیطهای مختلف
راهکار 12-Factor: استفاده از Environment Variables
اپلیکیشنهای 12-Factor پیکربندی را در متغیرهای محیطی (Environment Variables یا env vars) ذخیره میکنند. مزایای این روش:
- قابل تغییر بین deployها بدون نیاز به تغییر کد
- خطر وارد شدن تصادفی به مخزن کد بسیار کم است
- استاندارد و مستقل از زبان و سیستمعامل
برخلاف روش “گروهبندی پیکربندی به محیطها” (مثلاً development, test, production)، هر متغیر محیطی بهصورت مستقل مدیریت میشود و هیچ وابستگی متقابل ندارد. این مدل بهخوبی با رشد اپلیکیشن و ایجاد deployهای جدید مقیاسپذیر است، بدون اینکه پیچیدگی یا ناسازگاری ایجاد شود.
مثال عملی
فرض کنید اپلیکیشن شما به پایگاه داده MySQL متصل میشود. در یک اپلیکیشن سنتی، ممکن است اطلاعات اتصال در فایل config ثابت یا به صورت گروهبندی محیطها ذخیره شود. اما در مدل 12-Factor:
- هر deploy یک متغیر محیطی جداگانه برای
DB_HOST،DB_USERوDB_PASSWORDدارد. - تغییر سرور پایگاه داده برای staging یا production تنها با تغییر این متغیرها انجام میشود و کد تغییر نمیکند.
- یک توسعهدهنده جدید که کد را روی ماشین خود اجرا میکند، کافی است همین متغیرها را روی سیستم خود تعریف کند تا اپلیکیشن بدون تغییر کد اجرا شود.
این روش تضمین میکند که هر deploy مستقل و قابل کنترل است و مدیریت پیکربندی با رشد اپلیکیشن ساده باقی میماند.