এনভায়রনমেন্ট ভেরিয়েবল ও সিক্রেট কী? একটি সহজ গাইড
একটি এনভায়রনমেন্ট ভেরিয়েবল হলো একটি নামযুক্ত সেটিং — যেমন DATABASE_URL বা STRIPE_SECRET_KEY — যা আপনার অ্যাপ চলার সময় তাকে দেওয়া হয়, কোডের ভেতরে লেখা হয় না। একটি সিক্রেট হলো এমন এনভায়রনমেন্ট ভেরিয়েবল যার মান গোপন রাখতে হবে: একটি API কী, একটি পাসওয়ার্ড, একটি সাইনিং কী। এই মানগুলো কোডের বাইরে রাখলে আপনি অ্যাপ সম্পাদনা না করেই সেগুলো বদলাতে পারেন, পরীক্ষা ও প্রকৃত গ্রাহকদের জন্য আলাদা মান ব্যবহার করতে পারেন, আর কোড শেয়ার বা প্রকাশ করার সময় সেগুলো ফাঁস হওয়া আটকাতে পারেন।
AI দিয়ে তৈরি করলে কেন গুরুত্বপূর্ণ
আপনার অ্যাপ যখনই অন্য কোনো সার্ভিসের সঙ্গে কিছু কাজের জন্য যুক্ত হয় — পেমেন্ট নেয়, ইমেইল পাঠায়, AI মডেল ডাকে — তখনই তার একটি কী লাগে। AI অ্যাপ বিল্ডাররা নিয়মিত এসব কী চায়, আর কী কোথায় গিয়ে থামে তা-ই ঠিক করে আপনার অ্যাপ নিরাপদ কি না।
AI দিয়ে তৈরি অ্যাপে সাধারণত দুটি জিনিস ভুল হয়:
- কী চ্যাট বা কোডে পেস্ট করা হয়। তখন তা চ্যাট ইতিহাস, প্রজেক্ট ফাইল, যেকোনো এক্সপোর্ট ও রিপোজিটরিতে থেকে যায়। যে কেউ তা দেখলে আপনার অ্যাকাউন্ট ব্যবহার করতে পারে।
- কী ব্রাউজারে ব্যবহার হয়। Stripe বা OpenAI-কে ডাকার কোড যদি পেজের ভেতরে চলে, তবে কী প্রতিটি দর্শকের কাছে পৌঁছায়। মানুষ সত্যিই দেখে — আর স্বয়ংক্রিয় স্ক্যানাররা অরক্ষিত কী খুঁজতে সব সময় ব্যস্ত থাকে।
এনভায়রনমেন্ট ভেরিয়েবল বুঝলে আপনি দুটোই চিনতে পারবেন এবং সমাধান চাইতে পারবেন।
একটি দৈনন্দিন উপমা: হোটেলের সেফ
আপনার অ্যাপের কোড হলো হোটেলের ঘর। অতিথি (এবং পরিচ্ছন্নতাকর্মী, আর যাদের কী-কার্ড দিয়েছেন তারা) সেই ঘরে ঢোকে। আপনি নিশ্চয়ই টেবিলে পাসপোর্ট ফেলে রাখবেন না।
এনভায়রনমেন্ট ভেরিয়েবল হলো ঘরের ভেতরের সেফ। ঘর জানে যে একটি সেফ আছে এবং দরকারে কীভাবে খুলতে হয়, কিন্তু পাসপোর্ট এদিক-ওদিক পড়ে থাকে না। আর আপনি যদি এক ঘর থেকে অন্য ঘরে যান — আপনার টেস্ট সেটআপ থেকে লাইভ সাইটে — তাহলে ঘরটি না সাজিয়েই সেই ঘরের সেফে আলাদা পাসপোর্ট রাখেন।
কীভাবে কাজ করে
আপনার কোড একটি নাম উল্লেখ করে, মান নয়। সার্ভারে JavaScript-এ এটি দেখতে হয় process.env.STRIPE_SECRET_KEY-এর মতো। অ্যাপ শুরু হলে যে প্ল্যাটফর্মে সেটি চলে, সে ওই নামের জন্য মান বসিয়ে দেয়। প্ল্যাটফর্মের সেটিংসে মান বদলালে এবং রিস্টার্ট বা রিডিপ্লয় করলে অ্যাপ নতুন মান ব্যবহার করে — কোড বদলাতে হয় না।
মানগুলো কোথা থেকে আসে তা নির্ভর করে অ্যাপ কোথায় চলে তার উপর:
| কোথায় চলে | কোথায় মান রাখা হয় |
|---|---|
| ডেভেলপারের ল্যাপটপে | সাধারণত .env নামের একটি স্থানীয় ফাইল, যা কখনো git-এ কমিট করা যাবে না |
| AI বিল্ডারের প্রিভিউয়ে | প্রজেক্টের সিক্রেট বা সেটিংস প্যানেল |
| হোস্টিং প্ল্যাটফর্মে | ওই প্ল্যাটফর্মের এনভায়রনমেন্ট ভেরিয়েবল সেটিংস |
| GitHub Actions বা অন্য অটোমেশনে | সার্ভিসের নিজস্ব এনক্রিপ্টেড সিক্রেট স্টোর |
প্রকাশ্য বনাম সিক্রেট ভেরিয়েবল
সব এনভায়রনমেন্ট ভেরিয়েবল গোপন নয়। দুই দলে ভাগ করে দেখা সাহায্যকর:
| ধরন | উদাহরণ | ব্রাউজার কি দেখতে পায়? |
|---|---|---|
| প্রকাশ্য কনফিগারেশন | সাইটের নাম, পাবলিক অ্যানালিটিক্স ID, Stripe-এর পাবলিশেবল কী, ফিচার সুইচ | হ্যাঁ, এটা ঠিক আছে |
| সিক্রেট | Stripe-এর সিক্রেট কী, OpenAI বা Anthropic API কী, ডেটাবেস কানেকশন স্ট্রিং, ইমেইল প্রদানকারীর কী, ওয়েবহুক সাইনিং সিক্রেট | কখনোই না |
ওয়েব ফ্রেমওয়ার্কগুলো এই বিভাজন স্পষ্ট করে। Vite-এ শুধু VITE_ দিয়ে শুরু হওয়া নামের ভেরিয়েবল ব্রাউজার কোডে যায়; Next.js-এ প্রিফিক্স NEXT_PUBLIC_। এটি একটি নিরাপত্তা ব্যবস্থা: এই প্রিফিক্সওয়ালা সবকিছু প্রতিটি দর্শকের ডাউনলোড করা ফাইলে পৌঁছায়, তাই সিক্রেটকে কখনো এমন প্রিফিক্স দেওয়া যাবে না।
একটি বাস্তব উদাহরণ: একটি AI সারাংশ বাটন
আপনি চান একটি “এই নোটের সারাংশ করো” বাটন, যা একটি AI মডেলকে ডাকে।
অনিরাপদ উপায়: বাটনের কোড, ব্রাউজারে চলে, সরাসরি AI প্রদানকারীকে ডাকে এবং তার ভেতরে API কী লেখা থাকে। প্রিভিউতে এটি কাজ করে। কিন্তু এর মানে হলো যে কেউ ব্রাউজারের ডেভেলপার টুলস খুলে কীটি কপি করে আপনার অ্যাকাউন্টে বিল বাড়াতে পারে।
নিরাপদ উপায়:
- আপনি AI প্রদানকারীর কাছে কীটি তৈরি করেন এবং আপনার প্রজেক্ট সেটিংসে
OPENAI_API_KEY(বা অনুরূপ) নামে একটি সিক্রেট হিসেবে রাখেন। - ব্যাকএন্ডে একটি রুট থাকে,
POST /api/summarise, যাprocess.env.OPENAI_API_KEYপড়ে, ব্যবহারকারী লগ-ইন করা আছে কি না যাচাই করে এবং প্রদানকারীকে ডাকে। - বাটন ডাকে আপনার রুট, প্রদানকারীকে নয়। ব্রাউজার কখনো কীটি দেখে না।
- প্রকাশিত অ্যাপের সেটিংসেও একই সিক্রেট যোগ করেন এবং আবার ডিপ্লয় করেন, যাতে লাইভ সাইটেও তা থাকে।
এই প্যাটার্ন — ব্রাউজার আপনার সার্ভারকে ডাকে, সার্ভার কী ধরে রাখে এবং সার্ভিসকে ডাকে — পেমেন্ট, ইমেইল, ম্যাপ ও অন্যান্য সব পেইড API-এর ক্ষেত্রেও প্রযোজ্য। AI-এর ক্ষেত্রে আরও গভীরভাবে জানতে দেখুন LLM API ব্যবহারের গাইড।
মূল পরিভাষা
.envফাইল: স্থানীয় ডেভেলপমেন্টে ব্যবহৃতNAME=valueলাইনের একটি টেক্সট ফাইল। এটি.gitignore-এ রাখুন, যাতে কমিট না হয়।.env.example: নাম আছে কিন্তু প্রকৃত মান নেই, এমন একটি কপি, যা অন্যদের জানাতে কমিট করা হয় কোন কোন ভেরিয়েবল সেট করতে হবে।- রোটেট: একটি সিক্রেট নতুন দিয়ে বদলানো এবং পুরনোটি বাতিল করা।
- স্কোপ / অনুমতি: অনেক প্রদানকারী এমন কী তৈরি করতে দেয় যা শুধু নির্দিষ্ট কাজ করতে পারে। যে কী শুধু ইমেইল পাঠাতে পারে, সেটি সবকিছু করতে পারে এমন কীয়ের চেয়ে কম বিপজ্জনক।
- টেস্ট বনাম লাইভ কী: Stripe-এর মতো প্রদানকারী টেস্টিং ও আসল টাকার জন্য আলাদা কী দেয়। লঞ্চ না করা পর্যন্ত টেস্ট কী ব্যবহার করুন।
- সাইনিং সিক্রেট: একটি সিক্রেট যা দিয়ে যাচাই করা হয় যে একটি বার্তা, যেমন একটি ওয়েবহুক, সত্যিই প্রেরক থেকে এসেছে।
সাধারণ ভুল ও ভুল ধারণা
- “আমার রিপোজিটরি প্রাইভেট, তাই তার ভেতরে কী রাখা ঠিক আছে।” প্রাইভেট রিপোজিটরিও শেয়ার, ফর্ক, এক্সপোর্ট এবং ল্যাপটপে ক্লোন হয়। কী সেখানে থাকা উচিত নয়। আপনি যদি একটি প্রজেক্ট GitHub-এর সঙ্গে যুক্ত করেন, তাহলে নিশ্চিত হন যে কোনো
.envফাইল যুক্ত হয়নি। - “আমি তো মুছে দিয়েছি, তাই সেটি আর নেই।” Git ইতিহাস রাখে, আর চ্যাট লগও বার্তা রাখে। কোনো কী একবার ফাঁস হয়ে থাকলে তা রোটেট করুন।
- সিক্রেটে প্রকাশ্য প্রিফিক্স ব্যবহার।
VITE_OPENAI_KEYআপনার কী ব্রাউজার বান্ডেলে পৌঁছে দেয়। - রিডিপ্লয় করতে ভুলে যাওয়া। সেটিংসে ভেরিয়েবল বদলালে সাধারণত অ্যাপ রিস্টার্ট বা আবার প্রকাশ হওয়ার পরই তা কার্যকর হয়।
- সব কিছুর জন্য একটি কী। টেস্ট ও লাইভের জন্য এবং প্রতিটি অ্যাপের জন্য আলাদা কী থাকলে একটি বাতিল করা যায়, বাকিগুলো না ভেঙে।
- কোনো খরচের সীমা নেই। পেইড API-এর জন্য কী ফাঁস হলে যেন ক্ষতি সীমিত থাকে, প্রদানকারীর ড্যাশবোর্ডে বাজেট বা সীমা নির্ধারণ করুন।
আপনার AI বিল্ডারের কাছে কী চাইবেন
- “
STRIPE_SECRET_KEYনামের একটি এনভায়রনমেন্ট ভেরিয়েবল থেকে Stripe সিক্রেট কী পড়ো। শুধু সার্ভারে ব্যবহার করো।” - “নিশ্চিত করো যে কোনো সিক্রেট ক্লায়েন্ট-সাইড কোডে ব্যবহার হয় না এবং তাকে
VITE_/NEXT_PUBLIC_প্রিফিক্স দেওয়া হয়নি।” - “অ্যাপের প্রয়োজনীয় প্রতিটি ভেরিয়েবলের তালিকা সহ একটি
.env.exampleতৈরি করো, মান ছাড়া, এবং নিশ্চিত করো.envgit-ignored।” - “বিল্ট ফ্রন্টএন্ড ফাইলে API কীর মতো দেখতে কোনো স্ট্রিং আছে কি না যাচাই করো।”
লঞ্চের আগে সুরক্ষা যাচাইয়ের অন্যান্য বিষয়ের সঙ্গে সিক্রেট নিয়েও আলোচনা আছে আমাদের AI দিয়ে তৈরি অ্যাপের নিরাপত্তা চেকলিস্ট-এ।
Mythex-এ সিক্রেট
Mythex-এ সিক্রেট হলো প্রজেক্টের এনভায়রনমেন্ট ভেরিয়েবল, যা প্রিভিউ স্যান্ডবক্স এবং আপনার প্রকাশিত অ্যাপ — দুটোতেই দেওয়া হয়। আপনি প্রজেক্ট সেটিংস → Secrets-এর অধীনে অথবা চ্যাটে /secrets লিখে এগুলো যোগ করেন। এজেন্টের কোনো কী দরকার হলে সে চ্যাটে একটি সিক্রেট কার্ড দেখায়, ফলে মানটি চ্যাটের ট্রান্সক্রিপ্টে না গিয়ে একটি ফর্ম ফিল্ডে যায়। লাইভ অ্যাপের কোনো সিক্রেট বদলালে আবার প্রকাশ করুন, যাতে ডিপ্লয়ে তা কার্যকর হয়। প্রজেক্ট এক্সপোর্টে সিক্রেট বাদ পড়ে এবং আমদানি করা .env ফাইল থেকে সেগুলো সরিয়ে ফেলা হয়, তাই সেটিংসে আবার যোগ করতে হয়। ডকুমেন্টেশনে দেখুন এনভায়রনমেন্ট ভেরিয়েবল ও সিক্রেট এবং চ্যাটে সিক্রেট।
প্রশ্নোত্তর
এনভায়রনমেন্ট ভেরিয়েবল কী?
এনভায়রনমেন্ট ভেরিয়েবল হলো একটি নামযুক্ত সেটিং, যেমন STRIPE_SECRET_KEY বা DATABASE_URL, যা প্রোগ্রাম চলার সময় তাকে দেওয়া হয়, কোডের ভেতরে লেখা হয় না। একই কোড তাই ডেভেলপমেন্ট ও প্রোডাকশনে ভিন্ন ভিন্ন মান ব্যবহার করতে পারে।
এনভায়রনমেন্ট ভেরিয়েবল ও সিক্রেটের পার্থক্য কী?
সিক্রেট হলো এমন একটি এনভায়রনমেন্ট ভেরিয়েবল যার মান অবশ্যই গোপন রাখতে হবে, যেমন API কী, ডেটাবেস পাসওয়ার্ড বা ওয়েবহুক সাইনিং সিক্রেট। অন্য এনভায়রনমেন্ট ভেরিয়েবল, যেমন সাইটের নাম বা কোনো ফিচার সুইচ, প্রকাশ্য হতে পারে।
আমার ফ্রন্টএন্ডে API কী রাখা কি নিরাপদ?
না। ফ্রন্টএন্ড কোডের যেকোনো কিছু প্রতিটি দর্শকের ব্রাউজারে ডাউনলোড হয় এবং পড়া যায়। সিক্রেট কী শুধু সার্ভারে ব্যবহার করতে হবে; ব্রাউজার আপনার সার্ভারকে ডাকবে, আর সার্ভার প্রদানকারীকে ডাকবে।
আমার API কী ফাঁস হলে কী করব?
সঙ্গে সঙ্গে প্রদানকারীর কাছে সেটি বাতিল বা রোটেট করুন, একটি নতুন কী তৈরি করুন, যেখানে আপনার অ্যাপ সিক্রেট রাখে সেখানে আপডেট করুন এবং আবার ডিপ্লয় করুন। শুধু কোড বা চ্যাট ইতিহাস থেকে কী মুছে ফেলা যথেষ্ট নয়, কারণ এর কপি আগেই থেকে যেতে পারে।