যদি আপনি ডেভেলপমেন্ট এবং প্রোডাকশনে ওয়েব অ্যাপস দক্ষতার সাথে পরিচালনা করতে চান, তবে এনভায়রনমেন্ট ভেরিয়েবল বুঝতে হবে।
এটা সবসময় এমন ছিল না। কয়েক বছর আগে কেউই রেলস অ্যাপ কনফিগার করতে এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করত না। কিন্তু তারপর হেরোকু এসেছে।
হেরোকু ডেভেলপারদের ১২-ফ্যাক্টর অ্যাপ পদ্ধতির সাথে পরিচয় করিয়েছে। তাদের ১২-ফ্যাক্টর অ্যাপ ম্যানিফেস্টোতে সহজে ডিপ্লয় করা অ্যাপ তৈরি করার জন্য সেরা অনুশীলনগুলো বর্ণনা করা আছে। এনভায়রনমেন্ট ভেরিয়েবল वाला অংশ বিশেষভাবে প্রভাবশালী হয়েছে।
বারহ-ফ্যাক্টর অ্যাপ কনফিগারেশন এনভায়রনমেন্ট ভেরিয়েবলে সংরক্ষণ করে (সাধারণত এনভ ভার বা এনভ বলা হয়)। এনভ ভারগুলো ডিপ্লয়ের মধ্যে সহজে পরিবর্তন করা যায় কোনো কোড ছাড়া; কনফিগারেশন ফাইলের বিপরীতে, এনভ ভারগুলো অকস্মাত কোড রিপোতে চেক-ইন হওয়ার সম্ভাবনা খুব কম; এবং কাস্টম কনফিগারেশন ফাইল বা জাভা সিস্টেম প্রপার্টিজের মতো অন্যান্য কনফিগারেশন মেকানিজমের বিপরীতে, এনভ ভারগুলো একটি ভাষা-এবং ওএস-নিরপেক্ষ মানদণ্ড।
এখন অধিক রুবিস্টরা আপনার চেয়ে বেশি এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করছেন। কিন্তু প্রায়শই এটা একটি কার্গো-কাল্ট পদ্ধতিতে। আমরা এগুলো ব্যবহার করি কিন্তু সত্যিকারের অর্থে কিভাবে কাজ করে সেটা বুঝি না।
এই পোস্টে আপনাকে দেখানো হবে এনভায়রনমেন্ট ভেরিয়েবল আসলে কিভাবে কাজ করে—এবং সম্ভবত আরও গুরুত্বপূর্ণ, কিভাবে কাজ করে না। আমরা রেলস অ্যাপসে এনভায়রনমেন্ট ভেরিয়েবল পরিচালনার সবচেয়ে সাধারণ পদ্ধতিগুলোও অন্বেষণ করব। চলুন শুরু করি!
দ্রষ্টব্য: এনভায়রনমেন্ট ভেরিয়েবল সিকিউর করার বিষয়ে এখানে পড়ুন।
প্রতিটি প্রসেসের নিজস্ব এনভায়রনমেন্ট ভেরিয়েবল সেট রয়েছে
আপনার সার্ভারে চালানো প্রতিটি প্রোগ্রামের কমপক্ষে একটি প্রসেস থাকে। সেটা নিজস্ব এনভায়রনমেন্ট ভেরিয়েবল সেট পায়। একবার পেলে, সেই প্রসেসের বাইরের কিছুই সেগুলো পরিবর্তন করতে পারে না।
বিগিনাররা যে বোঝাবুঝি ভুল করেন সেটা হলো এনভায়রনমেন্ট ভেরিয়েবল যেন সার্ভার-ব্যাপী। হেরোকু যেন দেখিয়েছে যেন এনভায়রনমেন্ট ভেরিয়েবল সেট করা ডিস্কে কনফিগারেশন ফাইল এডিট করার সমান। কিন্তু এনভায়রনমেন্ট ভেরিয়েবল কনফিগারেশন ফাইলের মতো কিছুই নয়।
আপনার সার্ভারে চালানো প্রতিটি প্রোগ্রাম শুরু করার মুহূর্তে নিজস্ব এনভায়রনমেন্ট ভেরিয়েবল সেট পায়।
প্রতিটি প্রসেসের নিজস্ব এনভায়রনমেন্ট।
এনভায়রনমেন্ট ভেরিয়েবল তাদের প্রসেসের সাথে মরে যায়
আপনি কি কখনো এনভায়রনমেন্ট ভেরিয়েবল সেট করেছেন, রিবুট করেছেন এবং পেয়েছেন সেটা গিয়ে ফেলেছে? যেহেতু এনভায়রনমেন্ট ভেরিয়েবল প্রসেসের অন্তর্গত, তাই যখনই প্রসেস বন্ধ হয়, আপনার এনভায়রনমেন্ট ভেরিয়েবল চলে যায়।
এটা আপনি একটি আইআরবি সেশনে এনভায়রনমেন্ট ভেরিয়েবল সেট করে, সেটা বন্ধ করে, এবং দ্বিতীয় আইআরবি সেশনে ভেরিয়েবলটি অ্যাক্সেস করার চেষ্টা করে দেখতে পারেন।
প্রসেস বন্ধ হলে, এর এনভায়রনমেন্ট ভেরিয়েবলগুলো হারায়।
সার্ভার রিবুট হলে বা শেল থেকে বের হলে এনভায়রনমেন্ট ভেরিয়েবল হারানোর পেছনে একই কারণ কাজ করে। আপনি যদি সেশনগুলোতে এনভ ভারগুলো টিকিয়ে রাখতে চান, তবে .bashrc এর মতো কোনো কনফিগারেশন ফাইলে সেগুলো সংরক্ষণ করতে হবে।
একটি প্রসেস তার পেরেন্ট থেকে এনভায়রনমেন্ট ভেরিয়েবল পায়
প্রতিটি প্রসেসের একটি পেরেন্ট থাকে। কারণ প্রতিটি প্রোগ্রামকে কোনো অন্য প্রোগ্রাম শুরু করতে হয়।
আপনি যদি ব্যাশ শেল ব্যবহার করে ভিম চালান, তবে ভিমের পেরেন্ট হলো শেল। আপনার রেলস অ্যাপ যদি ইমেজম্যাজিক ব্যবহার করে ইমেজ আইডেন্টিফাই করে, তবে identify প্রোগ্রামের পেরেন্ট হবে আপনার রেলস অ্যাপ।
চাইল্ড প্রসেস পেরেন্ট থেকে এনভ ভার ইনহেরিট করে।
নিচের উদাহরণে, আমি আমার আইআরবি প্রসেসে $MARCO এনভায়রনমেন্ট ভেরিয়েবলের মান সেট করছি। তারপর ব্যাক-টিক ব্যবহার করে শেল আউট করি এবং সেটার মান ইচো করি।
যেহেতু আইআরবি সম্প্রতিমূর্ত তৈরি করা শেলের পেরেন্ট প্রসেস, তাই সেটা $MARCO এনভায়রনমেন্ট ভেরিয়েবলের একটি কপি পায়।
রুবিতে সেট করা এনভায়রনমেন্ট ভেরিয়েবল চাইল্ড প্রসেসে ইনহেরিট হয়।
পেরেন্টরা তাদের চাইল্ডদের পাঠানো এনভায়রনমেন্ট ভেরিয়েবল কাস্টোমাইজ করতে পারেন
ডিফল্টভাবে একটি চাইল্ড তার পেরেন্টের সব এনভায়রনমেন্ট ভেরিয়েবলের কপি পায়। কিন্তু পেরেন্ট এই বিষয়ে নিয়ন্ত্রণ রাখে।
কমান্ড লাইন থেকে, আপনি env প্রোগ্রাম ব্যবহার করতে পারেন। এবং ব্যাশে পেরেন্টে সেট না করে চাইল্ডে এনভ ভার সেট করার জন্য একটি বিশেষ সিনট্যাক্স আছে।
env কমান্ড ব্যবহার করে পেরেন্টে সেট না করে চাইল্ডের জন্য এনভায়রনমেন্ট ভেরিয়েবল সেট করুন।
আপনি যদি রুবি থেকে শেল আউট করেন, তবে আপনার ENV হ্যাশ গর্দ না করে চাইল্ড প্রসেসে কাস্টোম এনভায়রনমেন্ট ভেরিয়েবল পাস করতে পারেন। system মেথডের সাথে নিচের সিনট্যাক্স ব্যবহার করুন:
রুবির system মেথডে কাস্টোম এনভায়রনমেন্ট ভেরিয়েবল পাস করার পদ্ধতি।
চাইল্ডরা তাদের পেরেন্টদের এনভায়রনমেন্ট ভেরিয়েবল সেট করতে পারে না
যেহেতু চাইল্ডরা শুধু তাদের পেরেন্টদের এনভায়রনমেন্ট ভেরিয়েবলগুলোর কপি পায়, তাই চাইল্ড দ্বারা করা পরিবর্তন পেরেন্টে কোনো প্রভাব ফেলে না।
এনভায়রনমেন্ট ভেরিয়েবল "পাস বাই ভ্যালু" নয় "পাস বাই রেফারেন্স"।
এখানে, আমরা ব্যাক-টিক সিনট্যাক্স ব্যবহার করে শেল আউট করি এবং একটি এনভায়রনমেন্ট ভেরিয়েবল সেট করার চেষ্টা করি। যদিও ভেরিয়েবলটি চাইল্ডের জন্য সেট হবে, নতুন মান পেরেন্টে বাবল আপ হবে না।
চাইল্ড প্রসেস তাদের পেরেন্টের এনভ ভার পরিবর্তন করতে পারে না।
চলমান প্রসেসগুলোর মধ্যে এনভায়রনমেন্ট পরিবর্তন সিঙ্ক হয় না
নিচের উদাহরণে আমি দুটি আইআরবি কপি পাশাপাশি চালাচ্ছি। একটি আইআরবি সেশনের এনভায়রনমেন্টে ভেরিয়েবল যোগ করলে অন্য আইআরবি সেশনে কোনো প্রভাব পড়ে না।
একটি প্রসেসে এনভায়রনমেন্ট ভেরিয়েবল যোগ করলে অন্য প্রসেসের জন্য সেটা পরিবর্তন হয় না।
আপনার শেল এনভায়রনমেন্ট ভেরিয়েবল সিস্টেমের একটি ইউআই।
সিস্টেমটিই ওএস কার্নেলের অংশ। অর্থাৎ শেলের এনভায়রনমেন্ট ভেরিয়েবলের ওপর কোনো ম্যাজিক্যাল পাওয়ার নেই। এটি আপনার চালানো অন্য সব প্রোগ্রামের মতো একই নিয়ম মানতে হয়।
এনভায়রনমেন্ট ভেরিয়েবল শেল ভেরিয়েবলের সাথে একই নয়
সবচেয়ে বড় গলতফহমির একটি কারণ হলো শেল নিজস্ব "লোকাল" শেল ভেরিয়েবল সিস্টেম প্রদান করে। লোকাল ভেরিয়েবল ব্যবহারের সিনট্যাক্স প্রায়শই এনভায়রনমেন্ট ভেরিয়েবলের মতোই। এবং বিগিনাররা দুটোকে গুলিয়ে ফেলে।
কিন্তু লোকাল ভেরিয়েবলগুলো চাইল্ড প্রসেসে কপি হয় না।
এনভায়রনমেন্ট ভেরিয়েবল শেল ভেরিয়েবলের সাথে একই নয়।
একটি উদাহরণ দেখি। প্রথমে আমি MARCO নামে একটি লোকাল শেল ভেরিয়েবল সেট করি। যেহেতু এটা লোকাল ভেরিয়েবল, তাই কোনো চাইল্ড প্রসেসে কপি হয় না। ফলস্বরূপ, যখন আমি রুবি দিয়ে সেটা প্রিন্ট করার চেষ্টা করি, কাজ করে না।
তারপর, আমি export কমান্ড ব্যবহার করে লোকাল ভেরিয়েবলকে এনভায়রনমেন্ট ভেরিয়েবলে রূপান্তর করি। এখন শেল যে যেকোনো নতুন প্রসেস তৈরি করবে, সেটাতে সেটা কপি হয়ে যাবে। এখন এনভায়রনমেন্ট ভেরিয়েবলটি রুবিতে উপলব্ধ।
লোকাল ভেরিয়েবল চাইল্ড প্রসেসে উপলব্ধ নয়। export লোকাল ভেরিয়েবলকে এনভায়রনমেন্ট ভেরিয়েবলে রূপান্তর করে।
ব্যবহারিকভাবে এনভায়রনমেন্ট ভেরিয়েবল ব্যবস্থাপনা
রিয়েল ওয়ার্ল্ডে এটা কিভাবে কাজ করে? একটি উদাহরণ দিই:
ধরুন, আপনার একটি কম্পিউটারে দুটি রেলস অ্যাপ চলছে। আপনি হানিব্যাজার ব্যবহার করে এই অ্যাপগুলো মনিটর করছেন এক্সেপশনের জন্য। কিন্তু একটি সমস্যায় পড়েছেন।
আপনি আপনার হানিব্যাজার এপিআই কী $HONEYBADGER_API_KEY এনভায়রনমেন্ট ভেরিয়েবলে সংরক্ষণ করতে চান। কিন্তু আপনার দুটি অ্যাপের দুটি আলাদা এপিআই কী আছে।
একটি এনভায়রনমেন্ট ভেরিয়েবলে দুটি আলাদা মান কিভাবে থাকবে?
এখন পর্যন্ত আপনি উত্তরটা জানতে পারেন। যেহেতু এনভ ভার প্রসেস-প্রতি, এবং আমার দুটি রেলস অ্যাপ আলাদা প্রসেসে চলে, তাই তাদের প্রত্যেকের $HONEYBADGER_API_KEY এর জন্য আলাদা মান থাকতে পারে কোনো সমস্যা নেই।
এখন একমাত্র প্রশ্ন হলো কিভাবে সেটআপ করবেন। خوشবর হলো কিছু জেম আছে যা এটা খুব সহজ করে দেয়।
ফিগারো (Figaro)
আপনি আপনার রেলস অ্যাপে ফিগারো জেম ইনস্টল করলে, config/application.yml-এ আপনি যে মানগুলো দিবেন, সেগুলো স্টার্টআপে রুবি ENV হ্যাশে লোড হয়ে যাবে।
শুধু জেমটি ইনস্টল করুন:
# Gemfile
gem "figaro"
এবং application.yml-এ আইটেম যোগ করা শুরু করুন। খুব জরুরি যে আপনি এই ফাইলটি আপনার .gitignore-এ যোগ করুন, যাতে আপনার সিক্রেটগুলো অকস্মাত কমিট হয় না।
# config/application.yml
HONEYBADGER_API_KEY: 12345
ডটএনভি (Dotenv)
ডটএনভি জেম ফিগারোর খুব সমান, ব্যতীত এটি .env ফাইল থেকে এনভায়রনমেন্ট ভেরিয়েবল লোড করে, এবং এটি YAML ব্যবহার করে না।
শুধু জেমটি ইনস্টল করুন:
# Gemfile
gem 'dotenv-rails'
এবং আপনার কনফিগারেশন মানগুলো .env-এ যোগ করুন—এবং নিশ্চিত করুন যে আপনি ফাইলটি গিট ইگنোর করেছেন যাতে অকস্মাত গিটহাবে পাবলিশ হয় না।
HONEYBADGER_API_KEY=12345
তারপর আপনি আপনার রুবি ENV হ্যাশ থেকে মানগুলো অ্যাক্সেস করতে পারেন:
ENV["HONEYBADGER_API_KEY"]
আপনি প্রি-ডিফাইন করা এনভ ভার সেট দিয়ে শেল কমান্ডও রান করতে পারেন:
dotenv ./my_script.sh
secrets.yml?
দুঃখিত। secrets.yml—যদিও কুল—এনভায়রনমেন্ট ভেরিয়েবল সেট করে না। তাই ফিগারো এবং ডটএনভি এর মতো জেমের বিকল্প নয়।
সাদা পুরানো লিনাক্স
বেসিক লিনাক্স কমান্ড ব্যবহার করে প্রতি অ্যাপের জন্য یونিক এনভায়রনমেন্ট ভেরিয়েবল সেট রক্ষা করা সম্ভব। একটি পদ্ধতি হলো আপনার সার্ভারে প্রতিটি অ্যাপ আলাদা ইউজারের অধীনে চালানো। তারপর সেই ইউজারের .bashrc-এ অ্যাপ-স্পেসিফিক মানগুলো সংরক্ষণ করা।