কম্পিউটার টিউটোরিয়াল

রেইলস ডিপ্লয়মেন্ট: প্রোডাকশন কনফিগারেশনের ধাপে ধাপে গাইড

আপনি আপনার প্রথম প্রোডাকশন অ্যাপ্লিকেশন লঞ্চ করার জন্য প্রস্তুত, এবং এখন এটি কিছু বাহ্যিক সার্ভিসের সাথে সংযোগ স্থাপনের সময়। সবকিছু সঠিকভাবে হুক আপ করা বাকি। তবে আপনার ডেভেলপমেন্ট মেশিনকে জটিল না করে প্রোডাকশনে সার্ভিসগুলো কনফিগার করার সেরা উপায় কী?

পরিবেশ সেট আপ করুন

প্রোডাকশন অ্যাপ্লিকেশন কনফিগার করার জন্য আজকের সেরা অনুশীলন হলো এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করা (যেগুলো ENV["REDIS_HOST"] এর মতো দেখায়)।

কেন?

  • প্রোডাকশন কীগুলো ভুলে কমিট করার সম্ভাবনা কম।

    যদি আপনি সতর্ক না হন, তবে গুরুত্বপূর্ণ গোপন কী ধারণকারী ফাইল git push করে দিতে পারেন। এটা খুব ব্যয়বহুল ভুল হতে পারে।

  • কনফিগারেশনের জন্যই এনভায়রনমেন্ট ভেরিয়েবল বানানো হয়েছে।

    প্রায় সব ধরনের সিস্টেমে অ্যাপ্লিকেশন কনফিগার করার জন্য এনভায়রনমেন্ট ভেরিয়েবল একটি সাধারণ পদ্ধতি। অন্যান্য অনেক প্রোগ্রাম (রুবি সহ) কনফিগারেশনের জন্য এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করে, তাই আপনার অ্যাপ্লিকেশনে এটি প্রয়োগ করা যৌক্তিক।

  • প্রোডাকশনে এনভায়রনমেন্ট ভেরিয়েবল সেট আপ করা সহজ।

    হেরোকু (Heroku) এর ওয়েব ইউআই এবং কমান্ড লাইন টুল আছে এনভায়রনমেন্ট ভেরিয়েবল সহজে সেট করার জন্য। এবং যদি আপনি নিজের সার্ভার বানান, তবে শেফ (Chef) এবং ডকার (Docker) যেমন সার্ভার ম্যানেজমেন্ট টুলগুলো এনভায়রনমেন্ট ভেরিয়েবল সেট করা খুব সহজ করে দেয়।

রেইলস সাইডে কীভাবে দেখায়?

এনভায়রনমেন্ট ভেরিয়েবলের ওপর নির্ভরশীল একটি অ্যাপ্লিকেশন কীভাবে নিজেকে কনফিগার করতে পারে, তার উদাহরণ:

config/my_service.yml
production: host: <%= ENV["MY_SERVICE_HOST"] %> port: <%= ENV["MY_SERVICE_PORT"] %>
config/initializers/my_service.rb
my_service_config = Rails.application.config_for(:my_service) my_service = MyService.new(my_service_config["host"], my_service_config["port"])

ইনিশিয়ালাইজারটি রেইলস ৪.২-এর config_for মেথড ব্যবহার করে সঠিক .yml ফাইল খুঁজে বের করে এবং সঠিক এনভায়রনমেন্ট বেছে নেয়।

তারপর config_for my_service.yml ফাইলের ভিতরে থাকা ERB কোডটি রান করে, এবং এনভায়রনমেন্ট থেকে MY_SERVICE_HOST এবং MY_SERVICE_PORT মানগুলো বের করে। সেগুলো MyService-এ পাস করে দেয়।

আপনি চাইলে ইনিশিয়ালাইজারের মধ্য থেকেই সরাসরি ENV["MY_SERVICE_HOST"] পড়তে পারেন। কিন্তু আমি সেগুলো .yml ফাইলে রাখতে পছন্দ করি, কারণ শীঘ্রই তা বুঝতে পারবেন।

ডেভেলপমেন্টে আপনার অ্যাপ্লিকেশনের কনফিগারেশন

এনভায়রনমেন্ট ভেরিয়েবল প্রোডাকশনের জন্য ঠিক আছে। তবে প্রোডাকশন কনফিগারেশন সেট আপ করার পর, ডেভেলপমেন্ট এবং টেস্ট মোড কীভাবে হ্যান্ডল করবেন?

কয়েকটি অপশন আছে। কিন্তু আমি সাধারণত রেইলসের config/secrets.yml-এর কনভেনশন ফলো করি: প্রোডাকশনে এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করুন, এবং ডেভেলপমেন্ট ও টেস্টে নন-সিক্রেট মানগুলো হার্ডকোড করুন।

ডেভেলপমেন্ট এবং টেস্ট এনভায়রনমেন্টের সাথে, config/my_service.yml ফাইলটি এভাবে দেখতে পারে:

config/my_service.yml
production: host: <%= ENV["MY_SERVICE_HOST"] %> port: <%= ENV["MY_SERVICE_PORT"] %> development: host: localhost port: 8081 test: host: localhost port: 8081

খুব সুন্দরভাবে, ইনিশিয়ালাইজার একদম একই থাকে। ডেভেলপমেন্ট এবং টেস্ট এনভায়রনমেন্টে এই ফাইলের মানগুলো ব্যবহার হবে, আর প্রোডাকশন এনভায়রনমেন্টে মানগুলো এনভায়রনমেন্ট ভেরিয়েবল থেকে আসবে।

কেন হার্ডকোড করবেন?

  • কনফিগারেশন মানগুলো দেখতে ও পরিবর্তন করা সহজ।

    নতুন ফিচারের সাথে পরীক্ষা করার সময় আপনি কনফিগারেশন টিউন করতে পারেন, যা ডেভেলপমেন্টে দরকার কিন্তু প্রোডাকশনে নয়।

  • নতুন ডেভেলপাররা সহজে শুরু করতে পারেন।

    যদি সমস্ত স্যাম্পল কনফিগারেশন গিট রিপোজিটরিতে চেক-ইন করা থাকে, তবে একজন নতুন ডেভেলপার শুধু ক্লোন করে অ্যাপ্লিকেশন চালাতে পারবে। সে সঠিক মান সেট করার ঝামেলায় পড়বে না।

  • কনফ্লিক্টিং এনভায়রনমেন্ট ভেরিয়েবলের চিন্তা করতে হবে না।

    আপনার ডেভেলপমেন্ট মেশিনে আপনি প্রোডাকশন মেশিনের চেয়ে অনেক বেশি অ্যাপ্লিকেশনে কাজ করবেন। যদি সিস্টেম-ওয়াইড এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করে সব অ্যাপ্লিকেশন কনফিগার করেন, তবে দুটো অ্যাপ্লিকেশন একে অপরের মান পরিবর্তন করার সম্ভাবনা থাকে।

তাই, প্রোডাকশনে এনভায়রনমেন্ট ভেরিয়েবল এবং ডেভেলপমেন্টে হার্ডকোডেড .yml কনফিগারেশন ব্যবহার করে দেখুন। এটি সহজ, পঠনযোগ্য, এবং রেইলসের বিল্ট-ইন সাপোর্ট আছে এই ধরনের কনফিগারেশন ফাইল হ্যান্ডল করার জন্য।

ডেভেলপমেন্টের জন্য আরেকটি অপশন

ডেভেলপমেন্ট মোডে কনফিগারেশন হ্যান্ডল করার আরেকটি উপায় আছে: dotenv। এটি খুব সুন্দর দেখায়, কিন্তু আমি নিজের কোনো অ্যাপ্লিকেশনে এখনও এটি ট্রাই করিনি।

dotenv-র সাথে, আপনি আপনার রেইলস অ্যাপ্লিকেশনের রুট ডিরেক্টরিতে .env নামে একটি ফাইলে এনভায়রনমেন্ট ভেরিয়েবল রাখতে পারেন, এবং আপনার অ্যাপ্লিকেশন সেগুলো অটোমেটিক্যালি পিক আপ করবে। এটি সুবিধাজনক, কারণ আপনার ডেভেলপমেন্ট এনভায়রনমেন্ট আপনার প্রোডাকশন এনভায়রনমেন্টের মতই বিয়র্ভব করে। এটি প্রোডাকশন-এ কেবল হয় এমন বাগ এড়াতে সাহায্য করে।

এটি আমি ভবিষ্যতে ট্রাই করব। কিন্তু এখন পর্যন্ত, .yml এবং config_for-এর চেয়ে সুবিধাজনক কিছু খুঁজে পাইনি।

বেশিরভাগ প্রোডাকশন অ্যাপ্লিকেশনকে কনফিগারেশনের কিছু ন কিছু প্রকার দরকার पड़ে। তাই আপনার পরবর্তী অ্যাপ্লিকেশন ডিপ্লয় করার সময়, .yml ফাইল এবং প্রোডাকশনে এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করে কনফিগার করার চেষ্টা করুন। আপনি যে লچილapan, সহজতা, এবং নির্ভরযোগ্যতা খুঁজছেন, সেটা পাবেন।

আপনার প্রোডাকশন অ্যাপ্লিকেশন কনফিগার করার অন্য কোনো পছন্দের উপায় আছে? কমেন্টে জানান, আমি জানতে চাই!

  1. ডকারে আপনার রেইলস অ্যাপ সহজে টেস্ট করুন: ধাপে ধাপে গাইড

  2. উইন্ডোজ ১১-এ Phone App ডিজেবল করার ধাপে ধাপ গাইড

  3. পিসিতে টেলিগ্রাম নিরাপদে অ্যাক্সেস করার ধাপে ধাপে গাইড

  4. উইন্ডোজ ১০ের Your Phone অ্যাপ দিয়ে ফটো ও ফাইলস সিমলেসলি সিঙ্ক করুন