Environment Variables
এই page-এ শিখবেন server-এ .env ফাইল কিভাবে তৈরি করতে হয়, কোন তথ্য কখনো Git-এ push করা যাবে না এবং কেন এই বিষয়টি production security-র সবচেয়ে গুরুত্বপূর্ণ অংশ।
Why Environment Variables?
আপনার app-এ অনেক sensitive তথ্য থাকে — database password, API key, payment gateway secret। এই তথ্যগুলো সরাসরি code-এ লিখলে যে সমস্যা হয়:
git pushকরলে GitHub-এ সবার কাছে দৃশ্যমান হয়- কোনো team member চলে গেলেও সে এই secrets দেখতে পারবে
- আলাদা server-এ deploy করতে হলে code পরিবর্তন করতে হয়
Environment Variable হলো এই সমস্যার সমাধান। এটি আপনার code থেকে secret তথ্যগুলোকে আলাদা করে রাখে। Code থাকে GitHub-এ, secrets থাকে শুধু server-এ।
Next.js-এ environment variable-এর নাম NEXT_PUBLIC_ দিয়ে শুরু হলে browser-এও পাঠানো হয়, অন্যথায় শুধু server-side-এ থাকে।
Real Breach Example: ২০২২ সালে একটি বড় company-র developer ভুল করে .env ফাইল GitHub-এ push করেন। সেই ফাইলে AWS access key ছিল। কয়েক মিনিটের মধ্যে automated bots সেই key ব্যবহার করে হাজার হাজার EC2 instance চালু করে crypto mine করতে শুরু করে। সেই company-র এক রাতেই ৫০,০০০ ডলারের বেশি AWS bill আসে।
Ensure .gitignore is Correct
সার্ভারে repository clone করার আগে নিশ্চিত করুন আপনার project-এ .gitignore ফাইলে .env listed আছে। Local machine-এ চেক করুন:
grep "\.env" .gitignoreOutput-এ .env দেখলে ঠিক আছে। না দেখলে .gitignore-এ যোগ করুন:
# environment files
.env
.env.local
.env.production
.env*.localএরপর commit এবং push করুন — তারপরেই server-এ কাজ করুন।
Create .env on Server
Server-এ আপনার project folder-এ যান এবং .env ফাইল তৈরি করুন:
cd ~/myapp
nano .envআপনার project অনুযায়ী প্রয়োজনীয় variables লিখুন:
# Database
DATABASE_URL=postgresql://user:password@localhost:5432/mydb
# Authentication
NEXTAUTH_SECRET=your-long-random-secret-here
NEXTAUTH_URL=https://yourdomain.com
# Third-party APIs
STRIPE_SECRET_KEY=sk_live_xxxxxCtrl+O, Enter দিয়ে সেভ করুন এবং Ctrl+X দিয়ে বের হন।
NEXTAUTH_SECRET কিভাবে তৈরি করবেন? একটি random, অনুমান করা যায় না এমন string দরকার। নিচের command দিয়ে তৈরি করুন:
openssl rand -base64 32Output-টি copy করে NEXTAUTH_SECRET-এর value হিসেবে দিন।
Secure the File
.env ফাইলে server-এর সবচেয়ে sensitive তথ্য থাকে। File permission সীমিত করুন যাতে শুধু current user পড়তে পারে:
chmod 600 .envchmod 600 কী করে? এটি file-এর permission এমনভাবে সেট করে যে শুধু file-এর owner (আপনার ubuntu user) পড়তে এবং লিখতে পারবে। অন্য কোনো user এই file দেখতে পারবে না।
Verify করুন:
ls -la .envOutput-এ -rw------- দেখলে সঠিক।
Verify the File
.env ফাইলটি সঠিকভাবে তৈরি হয়েছে কিনা দেখুন:
cat .envআপনার লেখা variable-গুলো দেখতে পাবেন।
Next.js কখন .env পড়ে? Next.js নিজে থেকেই project root-এর .env ফাইল পড়ে — কোনো extra package (যেমন dotenv) install করতে হয় না। এটি next build এবং next start — দুই সময়েই কাজ করে।
তাই এখানে আলাদা করে test করার দরকার নেই। পরের page-এ PM2 দিয়ে app চালু করার পর pm2 logs myapp দেখলেই বুঝবেন variable ঠিকমতো load হয়েছে কিনা।
NODE_ENV কখনো .env-এ লিখবেন না। Next.js এটি নিজে সেট করে — npm run dev দিলে development, npm run build ও npm run start দিলে production। .env-এ লিখলে Next.js সেটি উপেক্ষা করে এবং একটি warning দেখায়।
How Next.js Reads Variables
Next.js automatically .env ফাইল থেকে variable পড়ে। কিন্তু কোনটি কোথায় পাওয়া যাবে তার নিয়ম আছে:
| Variable Name | Server-side | Browser |
|---|---|---|
DATABASE_URL | পাওয়া যাবে | পাওয়া যাবে না |
NEXTAUTH_SECRET | পাওয়া যাবে | পাওয়া যাবে না |
NEXT_PUBLIC_API_URL | পাওয়া যাবে | পাওয়া যাবে |
NEXT_PUBLIC_ prefix আছে এমন variable browser-এ পাঠানো হয় — তাই এখানে কখনো secret রাখবেন না।
Real-World Note
GitHub Secret Scanning: যদি আপনি ভুলে .env ফাইল push করেন, GitHub নিজেই কিছু API key এবং token detect করে এবং আপনাকে email করে। তবে সব secret GitHub detect করতে পারে না।
একবার কোনো secret GitHub-এ push হয়ে গেলে শুধু ফাইল delete করলেই নিরাপদ নন — Git history-তে সেটি থেকে যায়। এক্ষেত্রে করণীয়:
- তৎক্ষণাৎ সেই API key বা secret revoke করুন (invalidate করুন)
- নতুন key তৈরি করুন
- Git history থেকে সরাতে
git filter-repoব্যবহার করুন
সবচেয়ে ভালো হলো এই পরিস্থিতিতে না পড়া — .gitignore সঠিকভাবে configure করুন।
Quick Check
-
.gitignore-এ.envlisted আছে? - Server-এ
.envফাইল তৈরি হয়েছে? -
chmod 600 .envকরা হয়েছে? -
ls -la .envদেখাচ্ছে-rw-------? -
NEXT_PUBLIC_prefix ছাড়া কোনো secret রাখা হয়নি?
পরবর্তী → PM2 — Process Manager