অপ্রযুক্তিগত নির্মাতাদের জন্য পরিবেশ ভ্যারিয়েবল ব্যাখ্যা: কী কখনো প্রম্পট বা রেপোতে রাখবেন না, dev/staging/prod আলাদা করুন, এবং কী নিরাপদভাবে রোটেট করুন।

একটি API কী এমন একটি পাসওয়ার্ডের মতো, যেটা আপনার অ্যাপ যে সার্ভিসগুলোর সঙ্গে কথা বলে (পেমেন্ট, ইমেইল, মানচিত্র, AI, অ্যানালিটিক্স) তাদের কাছে বলে "এই অনুরোধ আমার অ্যাকাউন্ট থেকে আসছে," — যাতে সার্ভিসটি আপনাকে চার্জ করতে পারে, সীমা প্রয়োগ করতে পারে, এবং এক্সেস দেবে।
কী লিক হয় কারণ সাধারণত এগুলো দ্রুত কপি-পেস্ট করে ব্যবহার করার জন্য তৈরি হয়। আপনি এটা চ্যাটে, একটা সেটিংস ফাইলে, বা নোটে "এখনই জন্য" পেস্ট করেন, এবং পরে সেটা এমন কোথাও সেভ হয়ে যায় যা আপনি ভাগ করতে চাচ্ছেন না।
সাধারণ দুর্ঘটনাজনিত লিকের পথগুলোর মধ্যে রয়েছে: চ্যাট প্রম্পট (বিশেষ করে যখন আপনি দ্রুত তৈরি করছেন), কীকে কোনো রেপোজিটরিতে কমিট করা বা রিভিউয়ের জন্য zip আপলোড করা, স্ক্রিনশট বা স্ক্রিন রেকর্ডিং-এ কী থাকা, শেয়ার করা ডক বা টিম চ্যাটে রাখা, অথবা ফ্রন্ট-এন্ড কোডে হার্ডকোড করা যেটা যে কেউ ব্রাউজারে পড়তে পারে।
ঝুকি কল্পনাগত নয়। দ্রুততম ব্যথা হলো অপ্রত্যাশিত বিল: কেউ আপনার কী দিয়ে হাজার হাজার কল চালিয়ে দেয়। পরবর্তী ঝুঁকি হলো ডেটা অ্যাক্সেস: যদি কীটা গ্রাহক ডেটা পড়তে বা ইমেইল পাঠাতে পারে, অ্যাটাকারও সেটাই করতে পারবে। খারাপতম ক্ষেত্রে, বিস্তৃত অনুমতির একটি কী অ্যাকাউন্ট অপব্যবহারে নিয়ে যেতে পারে (উদাহরণস্বরূপ, যদি তা নতুন কী তৈরি করতে পারে)।
আপনাকে নিরাপত্তা বিশেষজ্ঞ হতে হবে না অধিকাংশ লাভ পেতে। ছোট অভ্যাসের পরিবর্তন অনেক দূর যায়: কীকে "গোপন" হিসেবে বিবেচনা করুন এবং সেগুলোকে প্রম্পট ও রেপো থেকে দূরে রাখুন। এটাই পরিবেশ ভ্যারিয়েবলগুলোর উদ্দেশ্য: সিক্রেটকে একটি রক্ষিত জায়গায় রাখুন, এবং আপনার অ্যাপকে রানটাইমে সেটা পড়তে দিন, কোড বা স্ক্রিনশটের মাঝে না রেখে।
যদি একটি নিয়ম মনে রাখতে চান, এটি ব্যবহার করুন: কোড হচ্ছে আপনার অ্যাপ যা করে, কনফিগ হচ্ছে কিভাবে এটা আচরণ করে, এবং সিক্রেট হচ্ছে যা কখনো প্রকাশ করে চলবে না।
কোড হলো আপনি যে লজিক বানান এবং শিপ করেন (স্ক্রিন, বাটন, হিসাব, API কল)। এটা টিমমেটদের সাথে ভাগ করা নিরাপদ হওয়া উচিত, এবং প্রায়শই একটি রেপোতে থাকে।
কনফিগ হলো এমন সেটিং যা প্রকাশ্য হলে ক্ষতি করে না। ভাবুন: আপনার অ্যাপের নাম, কোন রিজিয়নে রান করবে, ফিচার ফ্ল্যাগ, বা কোনো সার্ভিসের বেস URL। যদি কেউ এটি দেখে, তারা আপনার টাকা খরচ করতে, প্রাইভেট ডেটা অ্যাক্সেস করতে বা আপনার ছদ্মবেশে আচরণ করতে পারে না।
সিক্রেট হলো রাজ্যের চাবি: API কী, ডেটাবেস পাসওয়ার্ড, প্রাইভেট টোকেন, সাইনিং কী। অপরিচিত কেউ এগুলো পেলে আপনার অ্যাপের মত কাজ করতে পারবে।
একটি environment variable শুধু একটি লেবেলকৃত স্লট যা আপনার অ্যাপ রান করার সময় পড়ে। আপনার কোড একটি লেবেল (যেমন STRIPE_SECRET_KEY) খুঁজে দেখে এবং সেখানে রাখা মান ব্যবহার করে। এই বিচ্ছিন্নতার কারণেই environment variables API কী-গুলোর জন্য খুব সুবিধাযুক্ত: কোড একই থাকতে পারে, কিন্তু গোপন মানটি prompts, ফাইল বা রেপো থেকে বাইরে থাকে।
কোড এবং সিক্রেট আলাদা জায়গায় রাখলে ফিক্সও সহজ হয়। যদি ভুলবশত একটি সিক্রেট প্রকাশ হয়, আপনি কোড বদল না করেই মানটি পরিবর্তন করতে পারবেন।
পরিবেশ নিয়ে একটি ব্যবহারিক ভাবনা: একই লেবেল, ভিন্ন মান।
উদাহরণ: আপনি PAYMENTS_KEY লেবেলটি সব জায়গায় ব্যবহার করতে পারেন, কিন্তু dev-এ টেস্ট কী, staging-এ সীমিত কী, এবং prod-এ লাইভ কী। যদি আপনি Koder.ai-এর মতো প্ল্যাটফর্মে ডিপ্লয় করেন, এটা সহজে মেপে যায় কারণ আপনি একই অ্যাপ বিভিন্ন environment-এ বিভিন্ন সেটিংস নিয়ে ডিপ্লয় করতে পারবেন।
কোনো অপরিচিত মানুষকে ক্ষমতা দেয় এমন যেকোনো মান গোপন। যদি কেউ এটি পায়, তারা লগ ইন করতে, টাকা খরচ করতে, বা আপনার অ্যাপের ছদ্মবেশে কাজ করতে পারবে।
সাধারণ গোপনগুলোর মধ্যে রয়েছে API কী, ডেটাবেস পাসওয়ার্ড, প্রাইভেট অ্যাক্সেস টোকেন, সাইনিং কী, এবং webhook সিক্রেট। যদি এটি তৈরি, মুছা, চার্জ করা, প্রাইভেট ডেটা পড়া, বা অনুরোধ সাইন করতে পারে, এটিকে গোপন হিসেবে দেখুন।
কয়েকটি মান আকৃষ্টভাবে ক্ষুদ্র মনে হতে পারে কিন্তু সংবেদনশীল। Write টোকেনগুলো তারই ক্লাসিক ফাঁদ: এগুলো দেখতে পাসওয়ার্ড না হলেও এগুলো দিয়ে একজন আক্রমণকারী পরিবর্তন পুশ করতে, ফাইল আপলোড করতে, ইমেইল পাঠাতে বা ডেটাবেসে লিখতে পারে। একই কথা অ্যাডমিন কী, সার্ভিস অ্যাকাউন্ট JSON ফাইল, এবং যে কোনো দীর্ঘ র্যান্ডম স্ট্রিং-এর জন্য প্রযোজ্য।
সবকিছুই গোপন হ্যান্ডলিং প্রয়োজন নেই। সাধারণত এগুলো নন-সিক্রেট: ফিচার ফ্ল্যাগ (যদি শুধু UI বা আচরণ বদলায়), পাবলিক URL, UI টেক্সট, অ্যানালিটিক্স মেজারমেন্ট আইডি, এবং অভ্যন্তরীণ আইডি যেগুলো একা দিয়ে ডেটা অ্যাক্সেস করা যায় না। যদি সেটি আপনার অ্যাপের ফ্রন্ট-এন্ড বা ডকুমেন্টসে দেখা যাওয়ার উদ্দেশ্য থাকে, হয়ত সেটা গোপন নয়।
একটি দ্রুত পরীক্ষাঃ যদি আপনি কোনো পাবলিক চ্যাটে এটি পেস্ট দেখে আপনি রেগে যাবেন বা পাবলিক রেপোতে কমিট দেখলে বিরক্ত হবেন, তবে সেটি গোপন।
আপনার অ্যাপ যে গোপন ব্যবহার করে তার একটি ছোট লিখিত তালিকা রাখুন। প্রতিটির জন্য লিখে রাখুন কি উদ্দেশ্য (পেমেন্ট, ইমেইল, ডেটাবেস, স্টোরেজ), কোথায় থাকা উচিত (dev, staging, prod), কে মালিক (আপনি, কোন টিমমেট, বা ভেন্ডর অ্যাকাউন্ট), এবং এটি রিড-অনলি না রাইট অনুমতি। এই তালিকা পরে কী রোটেট করতে গেলে আপনার মানচিত্র হিসেবে কাজ করবে।
গণিতের হ্যাকাররা সব লিক করে না। বেশিরভাগ লিক ঘটে যখন কেউ মান কপি করে দ্রুত সমস্যার সমাধান করতে চায়, তারপর ভুলে যায় সেটা কোথায় দেখা যাচ্ছে। একটি ভাল নিয়ম: যদি এটি সার্চ করা যায়, সিঙ্ক হয়, ফরওয়ার্ড করা যায়, বা স্ক্রিন-শেয়ার করা যায়, তাহলে এটিকে পাবলিক ভাবুন।
চ্যাট একটি বড় উৎস। মানুষ সমস্যার দ্রুত সমাধানের জন্য সম্পূর্ণ API কী প্রম্পটে, টিম চ্যাটে বা সাপোর্ট মেসেজে পেস্ট করে। কিন্তু চ্যাটগুলো সেভ হয়ে যায় এবং শেয়ার হয়। যদি সাহায্য দরকার হয়, কেবল লাস্ট 4-6 অক্ষর এবং কী নামই পেস্ট করুন, যেমন STRIPE_SECRET_KEY ...9f2a।
Git ক্লাসিক ফাঁদ। আপনি একটি ফাইলে আখনের জন্য কী যোগ করেন, কমিট করেন এবং পরে মুছে ফেলেন। সিক্রেটটি তখনও কমিট ইতিহাসে থাকে। এটি forks, কপি করা স্নিপেট বা pull request diff-এর মাধ্যমে ছড়াতে পারে।
স্ক্রিনশট এবং স্ক্রিন রেকর্ডিং প্রত্যাশার চেয়ে বেশি লিক করে। একটি ডেমো ভিডিও সেটিংস স্ক্রিন, টার্মিনাল কমান্ড, বা একটি ত্রুটি মেসেজে থাকা টোকেন ক্যাপচার করতে পারে। এমনকি ব্লার করা টেক্সটও ঝুঁকিপূর্ণ হতে পারে যদি অন্য অংশ দেখা যায়।
ইস্যু ট্র্যাকার এবং নোট অ্যাপও একটি চুপিচুপি উৎস। টিকেট, চেকলিস্ট, এবং শেয়ার করা ডক টিম এবং ভেন্ডরদের মধ্যে কপি হয়ে যায়। এগুলোকে পাবলিক লগ হিসেবে ধরুন।
কিছু অভ্যাস বেশিরভাগ লিক বন্ধ করে:
আপনি যদি Koder.ai-তে তৈরি করে থাকেন, একই মানসিকতা ব্যবহার করুন: সংবেদনশীল মানগুলো environment settings-এ রাখুন, না যে চ্যাটে আপনার অ্যাপ ডিফাইন করেন সেখানে।
লক্ষ্য সহজ: আপনার অ্যাপ সিক্রেটগুলো environment- থেকে পড়ুক, না প্রম্পট থেকে, না কোড থেকে, এবং না এমন ফাইল থেকে যা Git-এ চলে যায়।
একটি .env ফাইল আপনার মেশিনে সাদাসিধে টেক্সট ফাইল যা কী-মূল্য জোড়া রাখে। এটি লোকাল সেটআপ সহজ করে, কিন্তু সহজেই লিকও করে, তাই এটিকে একটি ওয়ালেটের মতোই বিবেচনা করুন।
লোকালি একটি .env ফাইল তৈরি করুন এবং নিশ্চিত করুন এটি Git দ্বারা_IGNORE_ করা আছে (সাধারণত .gitignore-এ)। যদি আপনাকে ভ্যারিয়েবল নাম শেয়ার করতে হয়, একটি উদাহরণ ফাইল যেমন .env.example শেয়ার করুন যেখানে কেবল প্লেসহোল্ডার থাকবে, বাস্তব মান নয়।
পরিষ্কার নাম নির্বাচন করুন যেন পরে বোঝা যায় কোথায় ব্যবহার হবে:
OPENAI_API_KEYSTRIPE_SECRET_KEYDATABASE_URLSENDGRID_API_KEYS3_ACCESS_KEY_IDভাল নাম পরে dev, staging, এবং production সেট করার সময় ভুল কমায়।
অ্যাপ শুরু হলে অপারেটিং সিস্টেমকে জিজ্ঞাসা করে, "OPENAI_API_KEY-এর কি কোনো মান আছে?" যদি মান থাকে, অ্যাপ সেটি ব্যবহার করবে। যদি অনুপস্থিত থাকে, অ্যাপটি স্পষ্ট এক ত্রুটি দেখিয়ে আগে থেকে থেমে উচিত, ভাঙা আচরণ নিয়ে চালিয়ে না যাওয়া।
একটি ব্যবহারিক অভ্যাস: একটি ভ্যারিয়েবল আছে কি না তা লগ করুন (হ্যাঁ/না), কিন্তু কখনো গোপনটি নিজে প্রিন্ট করবেন না।
কী গুলো চ্যাট থ্রেড বা টিকেটে পেস্ট করবেন না। একটি পাসওয়ার্ড ম্যানেজার (শেয়ার্ড ভল্ট) বা অন্য কোনো নিরাপদ চ্যানেল ব্যবহার করুন, এবং শুধু প্রয়োজনীয় লোককে শেয়ার করুন। কেউ টিম ছেড়ে গেলে কী রোটেট করুন।
উদাহরণ: একজন ফাউন্ডার একটি Koder.ai প্রকল্প এক্সপোর্ট করে লোকালি চালান। তারা .env তাদের ল্যাপটপে রাখে, কেবল .env.example কমিট করে, এবং প্রকৃত কী টিমমেটদের একটি শেয়ার্ড পাসওয়ার্ড ম্যানেজারের মাধ্যমে দেয়।
পরিবেশগুলোকে তিনটি আলাদা কক্ষ হিসেবে ভাবুন।
Dev আপনার ল্যাপটপ বা একটি ব্যক্তিগত স্যান্ডবক্স যেখানে আপনি দ্রুত পরিবর্তন করেন। Staging প্রোডাকশনের একটি নিরাপদ নকল যেখানে আপনি পুরো অ্যাপ টেস্ট করেন কিন্তু গ্রাহকদের ওপর বাস্তব প্রভাব নেই। Prod হলো যেখানে গ্রাহকরা ব্যবহার করে।
সরল নিয়ম: প্রতিটি environment-এ ভ্যারিয়েবল নাম একরকম রাখুন, এবং শুধু মান পরিবর্তন করুন। আপনার কোড প্রতিটি environment-এ STRIPE_SECRET_KEY পড়বে, কিন্তু প্রতিটি পরিবেশ আলাদা কী প্রদান করবে।
একটি ছোট ম্যাপিং টেবিল (এমনকি একটি সহজ নোটও) সহায়ক:
| Variable name (same everywhere) | Dev value | Staging value | Prod value |
|---|---|---|---|
PAYMENTS_API_KEY | test key | staging key | live key |
APP_BASE_URL | localhost URL | staging domain | custom domain |
DATABASE_URL | local DB | staging DB | prod DB |
প্রোড ডেভ কী পুনরায় ব্যবহার করা উচিত নয়। Dev কী প্রায়শই টিমমেটদের মধ্যে শেয়ার করা হয় এবং কখনো কখনো বিস্তৃত অনুমতি থাকে।
ছোট টিমে environment মানগুলো সংগঠিত রাখতে কয়েকটি নিয়মে সম্মত হন:
STRIPE_KEY বনাম STRIPE_API_KEY না রাখুন)।আপনি যদি Koder.ai-এর মতো হোস্টেড বিল্ডার ব্যবহার করেন, প্রতিটি ডিপ্লয়মেন্ট টার্গেট (dev, staging, prod) আলাদা environment হিসেবে বিবেচনা করুন যার নিজস্ব সিক্রেট মান আছে, যদিও কোড একই।
রোটেট করা মানে ইচ্ছাকৃতভাবে একটি API কী বদলানো, আপনার নির্ধারিত সময়ে। সঠিকভাবে করলে রোটেশন বিরক্তিকর নয়: আপনি কীটি বদলাবেন, কাজ চলছে তা নিশ্চিত করবেন, তারপর পুরনোটি নিষ্ক্রিয় করবেন।
सबচেয়ে নিরাপদ মানসিক মডেল হলো "স্বল্প সময়ের জন্য দুটো কী।" অনেক সার্ভিস একাধিক সক্রিয় কী তৈরি করার অনুমতি দেয়। ওভারল্যাপই আপনার অ্যাপ চালু রাখে যখন আপনি কনফিগ পরিবর্তন করেন।
একটি সাধারণ রোটেশন উইন্ডো:
যদি প্রোভাইডার একাধিক কী সমর্থন না করে, কম-ট্রাফিক সময় বেছে একটি ক্ষুদ্র পুনরারম্ভের জন্য প্রস্তুত থাকুন। লক্ষ্য অপরিবর্তিত থাকে: এক জায়গায় সিক্রেট বদলানো, কোডে না ছুঁয়ে।
আপনি যদি মনে করেন একটি কী লিক হয়েছে, প্রথমে ব্যবস্থা নিন এবং পরে তদন্ত করুন। কীটি অবিলম্বে প্রত্যাহার বা নিষ্ক্রিয় করুন, তারপর একটি নতুন কী ইস্যু করে environment variable আপডেট করুন। অ্যাপ স্থিতিশীল হলে, কোথায় লিক হয়েছে তা খুঁজে বের করুন: চ্যাট প্রম্পট, বিল্ড লগ, স্ক্রিনশট, পুরোনো কমিট, বা শেয়ার করা ডক।
উদাহরণ: আপনি Koder.ai-তে একটি ছোট CRM বানিয়েছেন যা একটি ইমেইল API ব্যবহার করে। আপনি একটি নতুন ইমেইল কী জেনারেট করেন, সেটা অ্যাপের environment settings-এ সেট করেন, একটি টেস্ট ইমেইল চালান, তারপর পুরনো কী প্রত্যাহার করেন।
CI/CD হল একটি অটোমেটেড পাইপলাইন যা আপনার কোড পুশ করলে বিল্ড ও ডিপ্লয় করে, এবং এটিরও প্রায়শই একই সিক্রেটগুলোর প্রয়োজন হয়।
প্রধান নিয়ম: API কী বিল্ড লগ, সোর্স কোড, বা চ্যাট প্রম্পটগুলোর মধ্যে চুভলবেন না। পাইপলাইনটিকেও আরেকটি কম্পিউটার হিসেবে বিবেচনা করুন যা সিক্রেট নিয়ন্ত্রিতভাবে গ্রহণ করবে।
বিল্ড-টাইম সিক্রেটগুলো কেবল বিল্ড ধাপে দরকার (উদাহরণ: একটি প্রাইভেট প্যাকেজ ডাউনলোড করা)। রানটাইম সিক্রেটগুলো ডিপ্লয় পর দরকার (উদাহরণ: Stripe কল করা বা ইমেইল পাঠানো)। যদি আপনি কীগুলোকে রানটাইম-এই রাখেন, তাহলে এগুলো বান্ডলে বেক না হয়ে, আর্টিফ্যাক্টে ক্যাশ না হয়ে বা বিল্ড আউটপুটে প্রিন্ট না হওয়ার সম্ভাবনা কমে।
একটি দ্রুত আত্মপরীক্ষা: যদি কীটি ব্যবহারকারীর ব্রাউজারে প্রয়োজন হয়, তা আর সিক্রেট নয়। ব্রাউজারে দৃশ্যমান "পাবলিক কিজ" ঠিক আছে, কিন্তু সার্ভার API কী সার্ভারে থাকতে হবে।
আপনার হোস্টিং প্ল্যাটফর্মের environment-specific সিক্রেট স্টোর ব্যবহার করুন যাতে dev, staging, prod আলাদা মান পায়।
আপনি যদি Koder.ai হোস্টিং দিয়ে ডিপ্লয় করেন, environment-ভিত্তিক environment variables-এ সিক্রেট সেট করুন কোডে কী পেস্ট করার বদলে। তারপর আপনার অ্যাপ রানটাইমে সেগুলো পড়বে (উদাহরণ: production-এ PAYMENTS_API_KEY এবং staging-এ টেস্ট কী)।
প্রোড সুরক্ষিত রাখতে, প্রোড সিক্রেট ভিউ বা এডিট করার অনুমতি সীমিত রাখুন। "view secrets" গ্রুপ ছোট রাখুন, এবং যেখানে সম্ভব ডেপ্লয় অনুমতি আলাদা করে রাখুন। এছাড়া প্রতিটি environment-এর জন্য আলাদা কী রাখুন যাতে staging প্রোড ডেটা দেখতে না পারে।
বেশিরভাগ লিক দৈনন্দিন শর্টকাট থেকে হয় যা পরে নতুন প্রকল্পে কপি হয়ে যায়।
.env কমিট করা)যদি একটি কী সোর্স ফাইলের ভিতরে থাকে, তা ব্যাকআপ, স্ক্রিনশট, শেয়ার্ড জিপ এবং git ইতিহাসে শেষ পর্যন্ত থাকে।
ফিক্স:
.env-কে ignore ফাইলে যোগ করুন।আপনি যখন বাস্তব কী কোনো চ্যাটে পেস্ট করেন, তখন আপনি আর নিয়ন্ত্রণ রাখেন না ঐ টেক্সট কোথায় সেভ বা কপি বা শেয়ার হয়। যদি আপনি Koder.ai-র মতো vibe-coding টুল ব্যবহার করেন, সব কিছু চ্যাটে ফেলে দেওয়ার প্রলোভন থাকবে। বদলে প্লেসহোল্ডার ব্যবহার করুন যেমন PAYMENTS_API_KEY=REDACTED এবং সমস্যা বর্ণনা করুন।
ভাল অভ্যাস: error message কপি করুন, কখনো credentials কপি করবেন না।
একটি কী dev, staging, এবং prod জুড়ে ব্যবহৃত হলে একটি লিক বড় ঘটনার দিকে নিয়ে যায়। যদি একাধিক টিমমেট একই কী ব্যবহার করে, আপনি কাউকে দায়ী করে বলতে পারবেন না কে কী ব্যবহার করেছে।
ফিক্স: প্রতিটি environment-এর জন্য আলাদা কী তৈরি করুন, এবং যদি প্রোভাইডার সমর্থন করে তবে প্রতিটি ব্যক্তির বা প্রতিটি অ্যাপের জন্য আলাদা কী রাখুন।
স্টার্টআপে "all config" প্রিন্ট করা একটি সাধারণ ফাঁদ। তাতে প্রায়ই টোকেন থাকে।
ফিক্স: কেবল দরকারি কিছু লগ করুন (উদাহরণ: "Stripe key loaded: yes"), এবং মানগুলিকে মাস্ক করুন (যদি কোন অংশ দেখাতে হয়, শেষ 4 অক্ষর দেখান) যখন আপনাকে নিশ্চিত করতে হয় কোন কীটি সক্রিয় আছে।
উদাহরণ: যদি স্টেজিং ব্যর্থ হয়, পুরো কী প্রিন্ট করবেন না। প্রিন্ট করুন STRIPE_KEY ending in 9K2P যাতে আপনি নিশ্চিত হতে পারেন সঠিক কী ডেপ্লয় হয়েছে কিন্তু সেটি প্রকাশ না হয়।
আপনি শিপ করার আগে, শুধুমাত্র সিক্রেট নিয়ে এক শান্তি পাস করুন।
api_key, secret, token, এবং প্রোভাইডার নামের মতো প্যাটার্নগুলি সার্চ করুন। যদি কোনো কী কখনো git-এ বা ডক-এ দেখা যায়, ধরে নিন তা বার্নড এবং পরিবর্তন করুন।দ্রুত উদাহরণ: যদি আপনার অ্যাপ একটি পেমেন্টস API এবং একটি ইমেইল API ব্যবহার করে, আপনার dev, staging, এবং prod-র জন্য দুইটি আলাদা কী সেট থাকা উচিত এবং প্রতিটির জন্য একটি স্পষ্ট মালিক থাকতে হবে। যখন আপনি ডিপ্লয় করবেন (আপনার হোস্টিং সেটআপের মাধ্যমে বা Koder.ai-এর মতো প্ল্যাটফর্মে), আপনি সঠিক env vars সঠিক environment-এ ম্যাপ করছেন, না সেগুলোকে প্রম্পট, কোড, বা রেপোতে কপি করছেন।
Maya একজন অপ্রযুক্তিগত প্রতিষ্ঠাতা, একটি সরল ওয়েব অ্যাপ বানাচ্ছেন: ব্যবহারকারীরা সাবস্ক্রিপশন পে করে, এবং অ্যাপ রিসিট ও পাসওয়ার্ড রিসেট ইমেইল পাঠায়। তিনি তার প্রম্পট এবং রেপো পরিষ্কার রাখেন কারণ তিনি সিক্রেটগুলোকে কোডের বাইরে সেটিংস হিসেবে বিবেচনা করেন, এবং রানটাইমে environment variables ব্যবহার করে ইনজেক্ট করেন।
এখানে কিছু ছোট, ব্যবহারিক env vars তার জন্য (নাম সব জায়গায় একই থাকবে; কেবল মান বদলাবে):
APP_ENV = development / staging / productionAPP_BASE_URL = http://localhost:3000 / https://staging.example.com / https://example.comPAYMENTS_PROVIDER_SECRET_KEY = test key (dev) / test key (staging) / live key (prod)EMAIL_PROVIDER_API_KEY = sandbox key (dev) / restricted key (staging) / full key (prod)DATABASE_URL = local DB (dev) / staging DB (staging) / production DB (prod)একটি সহজ নিয়ম: dev এবং staging-এ টেস্ট মোড ও আলাদা ডেটা ব্যবহার করুন। প্রোডাকশন লাইভ কী এবং বাস্তব ডেটা ব্যবহার করবে। এতে স্টেজিং-এ একটি ভুল বাস্তব কার্ড চার্জ বা বাস্তব গ্রাহকে ইমেইল পাঠাবে না।
এখানে একটি বাস্তব রোটেশন ইভেন্ট: একজন কন্ট্রাক্টর যিনি অ্যাক্সেস পেয়েছিলেন, টিম থেকে চলে গেলেন। Maya ধরে নেন পুরনো কীগুলো কম্প্রোমাইজড হতে পারে। তিনি পেমেন্টস ও ইমেইল ড্যাশবোর্ডে নতুন কী বানান, প্রতিটি পরিবেশের environment মান আপডেট করেন, প্রথমে প্রোড-এ রোটেট করেন শান্ত সময়ে, সাইনআপ, পেমেন্ট, এবং ইমেইল কাজ করছে কিনা যাচাই করেন, তারপর স্টেজিং ও ডেভ রোটেট করেন। যদি কিছু ভাঙে, তিনি দ্রুত পূর্বের কাজ করা কনফিগ রিস্টোর করে রোলব্যাক করবেন।
এইকে পরে গণ্ডগোল হওয়া থেকে রক্ষা করার পরবর্তী ধাপগুলো:
এক পাতার "Env Var List" লিখে রাখুন (নাম, কোন কাজে লাগে, কোথায় সেট করা হয়, এবং কে অ্যাক্সেস করে)। মাসে একবার ১০ মিনিটের রিভিউ ক্যালেন্ডারে রাখুন অপ্রয়োগী কী সরাতে এবং হাই-রিস্ক আইটেম রোটেট করতে।
আপনি যদি ইতিমধ্যেই Koder.ai-এ তৈরি করে থাকেন (koder.ai), এটা গুছিয়ে রাখা সহজ করে কারণ আপনি ডিপ্লয়মেন্ট এবং environment সেটিংস এক জায়গায় ম্যানেজ করতে পারবেন। Snapshots এবং rollback ও দরকার হলে দ্রুত পুনরুদ্ধার করতে সহায়ক যখন কোনো কনফিগ চেঞ্জ আউটেজ করে এবং আপনাকে দ্রুত ফিরে আসতে হয়।
একটি API কী দ্রুত অপ্রত্যাশিত বিল তৈরি করতে পারে এবং অনেকসময় এটিই গোপন ডেটা পড়া বা ইমেইল পাঠানোর মতো কাজের অনুমতি দেয়। এটিকে একটি পাসওয়ার্ডের মতোই বিবেচনা করুন: কেউ যদি কীটি পেয়ে যায়, তারা প্রায়শই আপনার অ্যাপ হিসেবে কাজ করতে পারবে।
গোপনীয় মানগুলি কোডে রাখার পরিবর্তে environment variables-এ রাখুন যাতে মানটি আপনার কোড, পেস্ট করা টেক্সট বা স্ক্রিনশটে না চলে। আপনার অ্যাপ রানটাইম-এ নাম (যেমন STRIPE_SECRET_KEY) দেখে মানটি পড়ে, আর কোডটি নিরাপদ থাকে ভাগ করার জন্য।
যে কোনো মান যা অপরিচিত কেউ পেলে টাকা খরচ করতে পারে, গোপন ডেটা পড়তে পারে বা আপনার অ্যাপের ছদ্মবেশে কাজ করতে পারে — তা গোপন। API কী, ডেটাবেস পাসওয়ার্ড, প্রাইভেট টোকেন, সাইনিং কী এবং webhook সিক্রেটগুলো গোপন। আর UI-শুধু সেটিংস বা পাবলিক আইডি সাধারণত গোপন নয়।
সর্বাধিক লিক ঘটে চ্যাট প্রম্পট, টিম চ্যাট, টিকেট, স্ক্রিনশট এবং git কমিট (বিশেষ করে কমিট ইতিহাস) থেকে। একটি ভাল অভ্যাস: সার্চ, সিঙ্ক বা স্ক্রিনশেয়ার করা যেকোনো জায়গাকে পাবলিক ধরে নিন।
লোকাল .env ফাইল সুবিধার জন্য ব্যবহার ঠিক আছে, কিন্তু কখনও তা কমিট করবেন না। teammates-কে ভ্যারিয়েবল নাম শেয়ার করতে হলে .env.example-এ প্লেসহোল্ডার রাখুন, বাস্তব মান নয়।
প্রতিটি environment-এ একই ভ্যারিয়েবল নাম ব্যবহার করুন এবং শুধুই মান পরিবর্তন করুন। উদাহরণস্বরূপ, PAYMENTS_API_KEY dev-এ একটি টেস্ট কী, staging-এ একটি সীমিত কী এবং prod-এ লাইভ কী থাকবে।
না। সার্ভার API কী কখনোই ফ্রন্ট-এন্ড কোডে থাকা উচিত নয় কারণ ব্রাউজারে যে কেউ সেটি পড়তে পারে। নিরাপদভাবে সার্ভিস কল করতে হলে অনুরোধ ব্যাকএন্ডের মাধ্যমে রাউট করুন এবং কীটি সার্ভারে রাখুন।
নতুন কী তৈরি করুন (পুরনোটি এখনও মুছবেন না), environment variable আপডেট করুন, অ্যাপ রিস্টার্ট বা ডেপ্লয় করুন, আসল ওয়ার্কফ্লো পরীক্ষা করুন (টেস্ট ইমেইল বা পেমেন্ট), সব ঠিক থাকলে পুরনো কী প্রত্যাহার করুন।
ততক্ষণের জন্য কীটি অবরোধ বা ডিসেবল করে দিন এবং নতুন কী জারি করুন, তারপর environment সেটিংস আপডেট করে রিডেপ্লয় করুন। স্থিতিশীল হলে লিকের উৎস (চ্যাট, কমিট, স্ক্রিনশট ইত্যাদি) খুঁজে বের করুন যাতে পরবর্তীবার তা না ঘটে।
প্রতিটি environment-এর জন্য environment settings-এ সিক্রেট সংরক্ষণ করুন এবং প্রোজেক্ট চ্যাট বা সোর্স কোডে সেগুলো রাখবেন না। কনফিগ বদলে প্রড নষ্ট হলে snapshots ও rollback ব্যবহার করে আগে যে কাজ করছিল তা দ্রুত ফিরিয়ে আনুন।