আপনি যদি ওয়েব অ্যাপসকে ডেভেলপমেন্ট এবং প্রোডাকশনে কার্যকরভাবে পরিচালনা করতে চান, তাহলে আপনাকে এনভায়রনমেন্ট ভেরিয়েবল বুঝতে হবে।
এই সবসময় ক্ষেত্রে ছিল না. মাত্র কয়েক বছর আগে, খুব কমই কেউ এনভায়রনমেন্ট ভেরিয়েবলের সাথে তাদের রেল অ্যাপগুলি কনফিগার করছিল। কিন্তু তারপর হেরোকু ঘটল।
Heroku ডেভেলপারদের 12-ফ্যাক্টর অ্যাপ পদ্ধতির সাথে পরিচয় করিয়ে দিয়েছে। তাদের 12-ফ্যাক্টর অ্যাপ ম্যানিফেস্টো-এ তারা সহজে মোতায়েন করা যায় এমন অ্যাপ তৈরি করার জন্য তাদের অনেক সেরা অনুশীলন তুলে ধরে। পরিবেশের ভেরিয়েবলের বিভাগটি বিশেষভাবে প্রভাবশালী হয়েছে।
বারো-ফ্যাক্টর অ্যাপটি এনভায়রনমেন্ট ভেরিয়েবলে কনফিগার করে থাকে (প্রায়শই env vars বা env-এ ছোট করা হয়)। Env vars কোনো কোড পরিবর্তন না করেই স্থাপনার মধ্যে পরিবর্তন করা সহজ; কনফিগার ফাইলগুলির বিপরীতে, ভুলবশত কোড রেপোতে তাদের চেক করার সম্ভাবনা কম; এবং কাস্টম কনফিগারেশন ফাইল বা অন্যান্য কনফিগার পদ্ধতি যেমন জাভা সিস্টেম প্রোপার্টিজ থেকে ভিন্ন, এগুলি একটি ভাষা- এবং OS-অজ্ঞেয়বাদী মান।
আরও রুবিস্টরা আগের চেয়ে পরিবেশের ভেরিয়েবল ব্যবহার করছে। কিন্তু প্রায়ই এটি একটি পণ্যসম্ভার-কাল্টি উপায়. এগুলি কীভাবে কাজ করে তা না বুঝেই আমরা এই জিনিসগুলি ব্যবহার করছি৷
এই পোস্টটি আপনাকে দেখাবে কীভাবে পরিবেশের ভেরিয়েবলগুলি সত্যিই কাজ করে - এবং সম্ভবত আরও গুরুত্বপূর্ণ, তারা কীভাবে কাজ করে না। আমরা আপনার Rails অ্যাপে পরিবেশ ভেরিয়েবল পরিচালনা করার কিছু সাধারণ উপায়ও অন্বেষণ করব। চলুন শুরু করা যাক!
দ্রষ্টব্য:আপনি এখানে পরিবেশের ভেরিয়েবল সুরক্ষিত করার বিষয়ে পড়তে পারেন।
প্রতিটি প্রক্রিয়ার নিজস্ব পরিবেশ ভেরিয়েবলের সেট আছে
আপনি আপনার সার্ভারে চালান প্রতিটি প্রোগ্রাম অন্তত একটি প্রক্রিয়া আছে. সেই প্রক্রিয়াটি পরিবেশের ভেরিয়েবলের নিজস্ব সেট পায়। একবার সেগুলি পেয়ে গেলে, সেই প্রক্রিয়ার বাইরের কিছুই তাদের পরিবর্তন করতে পারে না৷
৷একটি বোধগম্য ভুল যা নতুনরা করে তা হল মনে করা যে পরিবেশের ভেরিয়েবলগুলি একরকম সার্ভার-ওয়াইড। Heroku এর মতো পরিষেবাগুলি নিশ্চিত করে যে পরিবেশের ভেরিয়েবল সেট করা ডিস্কে একটি কনফিগার ফাইল সম্পাদনার সমতুল্য। কিন্তু এনভায়রনমেন্ট ভেরিয়েবল কনফিগার ফাইলের মত কিছুই নয়।
আপনি আপনার সার্ভারে চালান এমন প্রতিটি প্রোগ্রাম আপনি এটি চালু করার মুহুর্তে তার নিজস্ব পরিবেশ ভেরিয়েবলের সেট পায়৷
প্রতিটি প্রক্রিয়ার নিজস্ব পরিবেশ আছে।
পরিবেশ ভেরিয়েবল তাদের প্রক্রিয়ার সাথে মারা যায়
আপনি কি কখনও একটি পরিবেশ পরিবর্তনশীল সেট করেছেন, রিবুট করেছেন এবং খুঁজে পেয়েছেন যে এটি চলে গেছে? যেহেতু এনভায়রনমেন্ট ভেরিয়েবল প্রসেসের অন্তর্গত, তার মানে যখনই প্রসেসটি বন্ধ হয়ে যায়, আপনার এনভায়রনমেন্ট ভেরিয়েবল চলে যায়।
আপনি একটি IRB সেশনে একটি এনভায়রনমেন্ট ভেরিয়েবল সেট করে, এটি বন্ধ করে এবং একটি 2nd irb সেশনে ভেরিয়েবল অ্যাক্সেস করার চেষ্টা করে এটি দেখতে পারেন৷
যখন একটি প্রক্রিয়া বন্ধ হয়ে যায়, তখন এর পরিবেশ ভেরিয়েবল হারিয়ে যায়
এটি একই প্রিন্সিপ্যাল যা আপনার সার্ভার রিবুট করার সময় বা যখন আপনি আপনার শেল থেকে প্রস্থান করেন তখন আপনি পরিবেশের ভেরিয়েবল হারাতে পারেন। আপনি যদি সেগুলি সেশন জুড়ে চলতে চান, তাহলে আপনাকে সেগুলিকে .bashrc
-এর মতো কনফিগারেশন ফাইলে সংরক্ষণ করতে হবে .
একটি প্রক্রিয়া তার পিতামাতার কাছ থেকে তার পরিবেশের ভেরিয়েবল পায়
প্রতিটি প্রক্রিয়ার একটি অভিভাবক আছে। কারণ প্রতিটি প্রোগ্রাম অন্য কোনো প্রোগ্রাম দিয়ে শুরু করতে হয়।
আপনি যদি ভিম চালু করতে আপনার ব্যাশ শেল ব্যবহার করেন, তাহলে ভিমের অভিভাবক হল শেল। যদি আপনার Rails অ্যাপ কোনো ছবি শনাক্ত করতে ইমেজম্যাজিক ব্যবহার করে, তাহলে identify
এর অভিভাবক প্রোগ্রাম আপনার রেল অ্যাপ হবে।
শিশু প্রক্রিয়াগুলি তাদের পিতামাতার কাছ থেকে env vars উত্তরাধিকার সূত্রে পায়
নীচের উদাহরণে, আমি আমার IRB প্রক্রিয়াতে $MARCO পরিবেশ পরিবর্তনশীলের মান সেট করছি। তারপরে আমি ব্যাক-টিক ব্যবহার করি শেল আউট করতে এবং সেই ভেরিয়েবলের মান প্রতিধ্বনিত করতে।
যেহেতু IRB হল আমার তৈরি শেলটির মূল প্রক্রিয়া, তাই এটি $MARCO এনভায়রনমেন্ট ভেরিয়েবলের একটি কপি পায়৷
রুবিতে সেট করা এনভায়রনমেন্ট ভেরিয়েবলগুলি শিশু প্রক্রিয়া দ্বারা উত্তরাধিকারসূত্রে প্রাপ্ত হয়
অভিভাবকরা তাদের সন্তানদের কাছে পাঠানো পরিবেশের ভেরিয়েবল কাস্টমাইজ করতে পারেন
ডিফল্টরূপে একটি শিশু তার পিতামাতার কাছে থাকা প্রতিটি পরিবেশ পরিবর্তনশীলের কপি পাবে। কিন্তু পিতামাতার এর উপর নিয়ন্ত্রণ আছে।
কমান্ড লাইন থেকে, আপনি env প্রোগ্রাম ব্যবহার করতে পারেন। এবং বাশ-এ একটি বিশেষ সিনট্যাক্স রয়েছে যা পিতামাতার উপর সেট না করেই সন্তানের উপর env vars সেট করতে পারে।
পিতামাতার উপর সেট না করে একটি সন্তানের জন্য পরিবেশের ভেরিয়েবল সেট করতে env কমান্ডটি ব্যবহার করুন
আপনি যদি রুবির ভিতর থেকে গোলাগুলি বের করেন তবে আপনি আপনার ENV হ্যাশ না ফেলে চাইল্ড প্রক্রিয়াতে কাস্টম পরিবেশের ভেরিয়েবল সরবরাহ করতে পারেন। system
দিয়ে নিচের সিনট্যাক্সটি ব্যবহার করুন পদ্ধতি:
রুবির সিস্টেম পদ্ধতিতে কাস্টম এনভায়রনমেন্ট ভেরিয়েবল কীভাবে পাস করবেন
শিশুরা তাদের পিতামাতার পরিবেশের ভেরিয়েবল সেট করতে পারে না
যেহেতু শিশুরা শুধুমাত্র কপি পায় তাদের পিতামাতার পরিবেশের পরিবর্তনশীল, সন্তানের দ্বারা করা পরিবর্তনগুলি পিতামাতার উপর কোন প্রভাব ফেলে না।
এনভায়রনমেন্ট ভেরিয়েবলগুলি "মান দ্বারা পাস করা হয়" "রেফারেন্স দ্বারা" নয়
এখানে, আমরা শেল আউট করার জন্য ব্যাক-টিক সিনট্যাক্স ব্যবহার করি এবং একটি পরিবেশ পরিবর্তনশীল সেট করার চেষ্টা করি। যদিও ভেরিয়েবলটি সন্তানের জন্য সেট করা হবে, নতুন মানটি পিতামাতার কাছে বাবল করে না।
শিশু প্রক্রিয়াগুলি তাদের পিতামাতার পরিবেশ পরিবর্তন করতে পারে না
পরিবেশের পরিবর্তন চলমান প্রক্রিয়াগুলির মধ্যে সিঙ্ক হয় না
নীচের উদাহরণে আমি পাশাপাশি IRB এর দুটি অনুলিপি চালাচ্ছি। একটি IRB সেশনের পরিবেশে একটি ভেরিয়েবল যোগ করলে অন্য IRB সেশনের উপর কোন প্রভাব পড়ে না।
একটি প্রসেসে এনভায়রনমেন্ট ভেরিয়েবল যোগ করলে তা অন্য প্রসেসের জন্য পরিবর্তন হয় না
আপনার শেল পরিবেশ পরিবর্তনশীল সিস্টেমের জন্য শুধুমাত্র একটি UI৷
সিস্টেম নিজেই OS কার্নেলের অংশ। এর মানে হল যে পরিবেশের ভেরিয়েবলের উপর শেলটির কোন জাদুকরী শক্তি নেই। এটিকে আপনি চালানো অন্যান্য প্রোগ্রামের মতো একই নিয়ম অনুসরণ করতে হবে৷
পরিবেশ ভেরিয়েবল শেল ভেরিয়েবলের মত নয়
সবচেয়ে বড় ভুল বোঝাবুঝির একটি ঘটে কারণ শেলগুলি তাদের নিজস্ব "স্থানীয়" শেল পরিবর্তনশীল সিস্টেম সরবরাহ করে। স্থানীয় ভেরিয়েবল ব্যবহার করার জন্য সিনট্যাক্স প্রায়শই পরিবেশের ভেরিয়েবলের মতই হয়। এবং নতুনরা প্রায়শই দুটিকে বিভ্রান্ত করে।
কিন্তু স্থানীয় ভেরিয়েবল বাচ্চাদের কাছে কপি করা হয় না।
এনভায়রনমেন্ট ভেরিয়েবল শেল ভেরিয়েবলের মত নয়
চলুন একটি উদাহরণ কটাক্ষপাত করা যাক. প্রথমে আমি MARCO নামে একটি স্থানীয় শেল ভেরিয়েবল সেট করেছি। যেহেতু এটি একটি স্থানীয় পরিবর্তনশীল, এটি কোনো চাইল্ড প্রসেসে কপি করা হয় না। ফলস্বরূপ, যখন আমি রুবির মাধ্যমে এটি প্রিন্ট করার চেষ্টা করি, এটি কাজ করে না৷
৷এর পরে, আমি স্থানীয় ভেরিয়েবলকে এনভায়রনমেন্ট ভেরিয়েবলে রূপান্তর করতে এক্সপোর্ট কমান্ড ব্যবহার করি। এখন এটি এই শেল তৈরি করা প্রতিটি নতুন প্রক্রিয়াতে অনুলিপি করা হয়েছে। এখন পরিবেশ ভেরিয়েবল রুবির কাছে উপলব্ধ।
স্থানীয় ভেরিয়েবল চাইল্ড প্রসেসের জন্য উপলব্ধ নয়। এক্সপোর্ট স্থানীয় ভেরিয়েবলকে এনভায়রনমেন্ট ভেরিয়েবলে রূপান্তর করে।
অভ্যাসের মধ্যে পরিবেশের ভেরিয়েবলগুলি পরিচালনা করা
কিভাবে এই সব বাস্তব জগতে কাজ করে? একটি উদাহরণ করা যাক:
ধরুন আপনার একটি কম্পিউটারে দুটি রেল অ্যাপ চলছে। আপনি ব্যতিক্রমের জন্য এই অ্যাপগুলি নিরীক্ষণ করতে Honeybadger ব্যবহার করছেন৷ কিন্তু আপনি একটি সমস্যায় পড়েছেন।
আপনি আপনার Honeybadger API কী $HONEYBADGER_API_KEY পরিবেশ ভেরিয়েবলে সংরক্ষণ করতে চান। কিন্তু আপনার দুটি অ্যাপে দুটি আলাদা API কী আছে৷
৷কিভাবে একটি পরিবেশ পরিবর্তনশীল দুটি ভিন্ন মান থাকতে পারে?
এখন পর্যন্ত আমি আশা করি আপনি উত্তর জানেন। যেহেতু env vars প্রতি-প্রক্রিয়া, এবং আমার দুটি রেল অ্যাপ বিভিন্ন প্রক্রিয়ায় চালিত হয়, তাই তাদের প্রত্যেকের $HONEYBADGER_API_KEY এর নিজস্ব মান থাকতে পারে না।
এখন একমাত্র প্রশ্ন কিভাবে এটি সেট আপ করতে হয়। সৌভাগ্যবশত কিছু রত্ন আছে যা এটিকে সত্যিই সহজ করে তোলে।
ফিগারো
আপনি যখন আপনার Rails অ্যাপে ফিগারো রত্নটি ইনস্টল করবেন, তখন আপনি config/application.yml-এ প্রবেশ করা যে কোনো মান স্টার্টআপে রুবি ENV হ্যাশে লোড হবে৷
আপনি শুধু রত্নটি ইনস্টল করুন:
# Gemfile
gem "figaro"
এবং application.yml এ আইটেম যোগ করা শুরু করুন। এটা খুবই গুরুত্বপূর্ণ যে আপনি এই ফাইলটি আপনার .gitignore-এ যোগ করুন, যাতে আপনি ভুলবশত আপনার গোপনীয়তা না করেন।
# config/application.yml
HONEYBADGER_API_KEY: 12345
ডোটেনভ
ডোটেনভ রত্নটি ফিগারোর অনুরূপ, এটি .env থেকে পরিবেশের ভেরিয়েবল লোড না করে এবং এটি YAML ব্যবহার করে না৷
শুধু রত্নটি ইনস্টল করুন:
# Gemfile
gem 'dotenv-rails'
এবং আপনার কনফিগারেশন মানগুলি .env-এ যোগ করুন - এবং নিশ্চিত করুন যে আপনি ফাইলটিকে উপেক্ষা করেছেন যাতে আপনি ভুলবশত এটিকে github-এ প্রকাশ না করেন৷
HONEYBADGER_API_KEY=12345
তারপরে আপনি আপনার রুবি ENV হ্যাশের মানগুলি অ্যাক্সেস করতে পারেন
ENV["HONEYBADGER_API_KEY"]
এছাড়াও আপনি শেল এ আপনার পূর্বনির্ধারিত env var এর সেট দিয়ে কমান্ড চালাতে পারেন:
dotenv ./my_script.sh
Secrets.yml?
দুঃখিত। Secrets.yml - যদিও শান্ত - পরিবেশের ভেরিয়েবল সেট করে না। তাই এটি সত্যিই ফিগারো এবং ডটেনভের মতো রত্নগুলির প্রতিস্থাপন নয়৷
৷সাধারণ পুরানো লিনাক্স
বেসিক লিনাক্স কমান্ড ব্যবহার করে অ্যাপ প্রতি পরিবেশ ভেরিয়েবলের অনন্য সেট বজায় রাখাও সম্ভব। একটি পদ্ধতি হল আপনার সার্ভারে চলমান প্রতিটি অ্যাপ একটি ভিন্ন ব্যবহারকারীর মালিকানাধীন। তারপরে আপনি অ্যাপ্লিকেশন-নির্দিষ্ট মান সংরক্ষণ করতে ব্যবহারকারীর .bashrc ব্যবহার করতে পারেন।