হ্যালো! আমি আপনার “Simple Coding Tutor”। আপনার দেওয়া লেকচার ট্র্যান্সক্রিপ্টটি ASP.NET Core-এ Environment Variables Configuration (লেকচার ১৫৭) নিয়ে আলোচনা করেছে। এটি Production Environment-এ sensitive ডেটা সুরক্ষিত রাখার জন্য অত্যন্ত গুরুত্বপূর্ণ একটি টপিক। চলুন, পুরো বিষয়টি বিস্তারিতভাবে শিখে নেওয়া যাক।
📝 সারসংক্ষেপ (Quick Summary for Revision)
ভবিষ্যতে দ্রুত রিভিশন দেওয়ার জন্য মূল পয়েন্টগুলো নিচে লিস্ট করা হলো:
- সমস্যা: Production Server-এ Visual Studio বা
User Secretsব্যবহার করা যায় না। সোর্স কোডে (appsettings.json) sensitive ডেটা রাখাও নিরাপদ নয়। - সমাধান: Production বা Staging environment-এর জন্য sensitive ডেটা Environment Variables হিসেবে সংরক্ষণ করতে হয়।
- Process-Level Security: Terminal বা PowerShell-এ সেট করা Environment Variables শুধুমাত্র সেই নির্দিষ্ট Terminal উইন্ডোর (Process) জন্যই কাজ করে, যা অত্যন্ত সুরক্ষিত।
- Syntax Rule: ASP.NET Core-এ Parent এবং Child key আলাদা করতে Environment Variable-এ দুটি আন্ডারস্কোর (
__) ব্যবহার করতে হয় (যেমন:WeatherApi__ClientId)। - Command Example: PowerShell-এ ভ্যালু সেট করার নিয়ম:
$env:WeatherApi__ClientId="YourValue". - Execution:
launchSettings.json-এর প্রোফাইল ইগনোর করে সরাসরি অ্যাপ রান করতেdotnet run --no-launch-profileকমান্ড ব্যবহার করতে হয়।
🧠 Comprehensive Breakdown
১. Environment Variables কেন প্রয়োজন? (The “Why”) [Priority: 10/10]
Development environment-এ আমরা sensitive ডেটা (যেমন: API Keys, Database Passwords) সুরক্ষিত রাখতে User Secrets ব্যবহার করি। কিন্তু Production Server-এ (যেখানে আসল অ্যাপ্লিকেশন হোস্ট করা থাকে) Visual Studio থাকে না এবং User Secrets-ও কাজ করে না।
সেখানে আপনার কাছে শুধু Terminal বা Command Line-এর অ্যাক্সেস থাকে। তাই Production Server-এ সোর্স কোডের বাইরে কনফিগারেশন সেট করার সবচেয়ে নিরাপদ উপায় হলো Environment Variables ব্যবহার করা। এটি নিশ্চিত করে যে আপনার sensitive ডেটা সোর্স কন্ট্রোল (যেমন GitHub)-এ যাচ্ছে না।
২. Process-Level Environment Variables [Priority: 9/10]
আপনি চাইলে পুরো কম্পিউটারের জন্য (Machine-level) Environment Variable সেট করতে পারেন (Control Panel থেকে)। কিন্তু সবচেয়ে ভালো ও সুরক্ষিত উপায় হলো Process-level Environment Variable ব্যবহার করা। Process-level মানে হলো, আপনি যে PowerShell বা Terminal উইন্ডোটি ওপেন করেছেন, ভ্যালুগুলো শুধু সেই উইন্ডোর ভেতরেই কাজ করবে। অন্য কোনো উইন্ডো বা ইউজার এই ভ্যালুগুলো দেখতে বা অ্যাক্সেস করতে পারবে না।
৩. PowerShell-এ Environment Variables সেট করা [Priority: 10/10]
Terminal বা PowerShell-এ Environment Variable সেট করার জন্য $env: কমান্ড ব্যবহার করা হয়।
ASP.NET Core Naming Convention:
appsettings.json-এ আমরা সাধারণত Parent-Child রিলেশন বোঝাতে কোলন (:) ব্যবহার করি। কিন্তু Environment Variable-এ কোলন সব অপারেটিং সিস্টেমে সাপোর্ট করে না। তাই ASP.NET Core-এ এর পরিবর্তে দুটি আন্ডারস্কোর (__) ব্যবহার করতে হয়। এটি Case-sensitive, তাই ছোট-বড় হাতের অক্ষর ঠিক রাখতে হবে।
Step-by-Step Implementation:
১. প্রথমে আপনার প্রজেক্ট ফোল্ডারে (যেখানে .csproj ফাইল আছে) প্রবেশ করুন।
২. নিচের কমান্ডগুলো দিয়ে Environment Variables সেট করুন:
# ClientId সেট করা
$env:WeatherApi__ClientId="client ID from environment variables"
# ClientSecret সেট করা
$env:WeatherApi__ClientSecret="client secret from environment variables"
এখানে WeatherApi হলো Parent Key এবং ClientId হলো Child Key।
৪. Application Run এবং Test করা [Priority: 8/10]
ভ্যালু সেট করার পর একই Terminal উইন্ডো থেকে অ্যাপ্লিকেশনটি রান করতে হবে।
যেহেতু আমরা চাই না আমাদের অ্যাপ্লিকেশনটি launchSettings.json-এর ডিফল্ট প্রোফাইলগুলো থেকে কোনো environment variable লোড করুক, তাই আমরা --no-launch-profile ফ্ল্যাগটি ব্যবহার করব।
Command:
dotnet run --no-launch-profile
এটি অ্যাপ্লিকেশনটিকে ডিফল্ট পোর্টে (সাধারণত http://localhost:5000) রান করবে। আপনি ব্রাউজারে http://localhost:5000 এ গেলে দেখতে পাবেন আপনার কনফিগারেশনগুলো লোকাল ফাইল থেকে না এসে সরাসরি Environment Variables থেকে লোড হচ্ছে।
৫. Environment Variables Update করা [Priority: 6/10]
যদি কোনো কারণে Environment Variable-এর ভ্যালু পরিবর্তন করতে হয়, তবে:
১. Terminal-এ Ctrl + C চেপে চলতি অ্যাপ্লিকেশনটি স্টপ করুন।
২. নতুন ভ্যালু দিয়ে আবার কমান্ড দিন:
$env:WeatherApi__ClientSecret="updated secret from environment variables"
৩. পুনরায় dotnet run --no-launch-profile কমান্ড দিয়ে অ্যাপ রান করুন।
💡 Best Practices & .NET 10 Context
Environment Variables নিয়ে কাজ করার কিছু আধুনিক গাইডলাইন নিচে দেওয়া হলো:
- Modern Production Deployments: বর্তমান সময়ে Production server-এ ম্যানুয়ালি
$env:দিয়ে ভ্যালু সেট করা খুব একটা হয় না। আধুনিক আর্কিটেকচারে Docker/Kubernetes ব্যবহার করা হয়। সেখানে.envফাইল বা Kubernetes ConfigMaps/Secrets-এর মাধ্যমে স্বয়ংক্রিয়ভাবে Environment Variables পাস করা হয়। - Hierarchical Keys .NET 10-এ:
.NET 10-এও Parent-Child সেপারেটর হিসেবে ডাবল আন্ডারস্কোর (__) স্ট্যান্ডার্ড। লিনাক্স (Linux) এনভায়রনমেন্টেও এটি চমৎকার কাজ করে। - Prefixing Environment Variables (.NET 10 Feature/Best Practice):
যখন আপনার সার্ভারে অনেক অ্যাপ চলে, তখন কনফ্লিক্ট এড়ানোর জন্য Custom Prefix ব্যবহার করা Best Practice। .NET 10-এ
Program.cs-এ আপনি নির্দিষ্ট Prefix যুক্ত Environment Variables লোড করতে পারেন। Code Implementation (.NET 10):
var builder = WebApplication.CreateBuilder(args);
// ডিফল্ট কনফিগারেশন মুছে ফেলে শুধু নির্দিষ্টগুলো রাখা (Optional, for clean setup)
builder.Configuration.Sources.Clear();
builder.Configuration.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
// শুধু "MYAPP_" প্রিফিক্স আছে এমন Environment Variables লোড করবে
builder.Configuration.AddEnvironmentVariables(prefix: "MYAPP_");
var app = builder.Build();
এই ক্ষেত্রে PowerShell-এ সেট করার সময় আপনার কমান্ড হবে: $env:MYAPP_WeatherApi__ClientId="12345"। অ্যাপটি লোড করার সময় সে অটোমেটিক্যালি MYAPP_ অংশটুকু বাদ দিয়ে WeatherApi:ClientId হিসেবে রিড করবে।