আমি gầnে Nuno Maduro-র প্রজেক্ট Pyre থেকে অনুপ্রাণিত হয়েছিলাম। এটি একটি ওয়েব অ্যাপ যা আপনাকে যেকোনোর কাছে অল্প সময়ের জন্য সিক্রেট মেসেজ পাঠাতে দেয়। এই মেসেজগুলো বিশ্রাম অবস্থায় এনক্রিপ্টেড থাকে, এবং শুধু আপনি বা যে ব্যক্তির সাথে আপনি ডিক্রিপশন লিংক শেয়ার করেছেন, সে কেই সেগুলো পড়তে পারে।
আমি Upstash Redis দিয়ে কিছু একই ধরনের কিছুর উপর কাজ করতে চেয়েছিলাম, তাই একটি নিচে নির্বাচন করলাম: এনভায়রনমেন্ট ভেরিয়েবল শেয়ার করা। আমি শর্তিয়াত আপনিও কখনো নাকি টিমমেটদের সাথে সিক্রেট শেয়ার করতে হয়েছে এবং ভাবলেন কীভাবে একটি সিস্টেম বানানো যায় যাতে নিরাপদে করা যায়।
Envflow পেশ করছি, একটি Laravel স্যাম্পল প্রজেক্ট যা আমি তৈরি করেছি যা Upstash Redis কে প্রাইমারি ডেটাবেস হিসেবে ব্যবহার করে এনক্রিপ্টেড ডেটা স্টোর এবং শেয়ার করার জন্য।
আমি আপনাকে এই প্রজেক্ট বানানোর প্রক্রিয়ায় নিয়ে যাব, শুরু থেকে শেষ পর্যন্ত, উবোউ التفاصيل বাদ দিয়ে।
স্ট্যাক
প্রথমে, আমি PHP গ্রহণ করেছি এবং প্রজেক্টটি বিখ্যাত TALL স্ট্যাক দিয়ে বানানো:
- Tailwind CSS
- Alpine JS
- Laravel
- Livewire
- Upstash Redis
ডেটাবেস
আমাকে একটি জায়গা দরকার ছিল যেখানে এনক্রিপ্টেড ডেটা স্টোর করা যায় যা নির্দিষ্ট সময়ের পরে এক্সপায়ার হয়, درত এবং খরচ-প্রভাবী হয়। আপনি حدس করুন, আমি Upstash Redis বেছে নিলাম।
Upstash Redis একটি সার্ভারлес, Redis-সামঞ্জস্যপূর্ণ ডেটাবেস তাই এটি এই ইউজ-কেসের জন্য একদম পারফেক্ট ছিল।
Psst… আমাদের Upstash Redis এবং Laravel-এর জন্য একটি গেটিং স্টার্টেড গাইড আছে!
আরও জানুন
রুটস / এন্ডপয়েন্টস
Envflow তিনটি মূল রুটে চলে, পлюস একটি অক্সিলিয়ারি রুট যা প্রজেক্ট সম্পর্কে ব্যাখ্যা করে। সেই রুটগুলো routes/web.php ফাইলে পাওয়া যায়।
হোমপেজ
হোমপেজ রুট শুধু প্রজেক্টের জন্য একটি ল্যান্ডিং পেজ নয়, এতে একটি Livewire ফর্মও আছে যা আপনাকে আপনার এনভায়রনমেন্ট ভেরিয়েবলগুলো এনক্রিপ্ট করতে দেয়। এই পেজে আপনি সেট করতে পারেন এনভায়রনমেন্ট ভেরিয়েবলগুলো কতবার ডিক্রিপ্ট করা যাবে এবং কতক্ষণ ভ্যালিড থাকবে।

Livewire পেজ কম্পোনেন্টটি পাওয়া যাবে app/Livewire/EncryptEnvPage.php-তে এবং αντίহ টেমপ্লেট resources/views/livewire/encrypt-env-page.blade.php-তে।
সাকসেস পেজ
সাকসেস পেজ একটি সহজ পেজ যা ডিক্রিপশন লিংক শেয়ার করার দুটি উপায় দেখায়: একটি ডিক্রিপশন কীসহ লিংকটি অন্তর্ভুক্ত করে, অন্যটি ডিক্রিপশন কীকে লিংক থেকে পৃথক রাখে।

Livewire পেজ কম্পোনেন্টটি পাওয়া যাবে app/Livewire/SuccessPage.php-তে এবং টেমপ্লেট resources/views/livewire/success-page.blade.php-তে।
ডিক্রিপশন পেজ
এই পেজটি হলো যেখানে ডিক্রিপশনের সকল জাদু ঘটে, মনে রাখবেন আমরা এনক্রিপশন কীটি আমাদের Upstash Redis ডেটাবেসে স্টোর করি না, আমরা শুধু এনক্রিপ্টেড ভ্যালুটা স্টোর করি যা একদম গিবারিশ। ডিক্রিপশন পেজের মূল কাজ হলো ডিক্রিপশন কী নেওয়া এবং এনভায়রনমেন্ট ভেরিয়েবলগুলো ডিক্রিপ্ট করার চেষ্টা করা।

Livewire পেজ কম্পোনেন্টটি পাওয়া যাবে app/Livewire/DecryptEnvPage.php-তে এবং টেমপ্লেট resources/views/livewire/decrypt-env-page.blade.php-তে।
অ্যাকশনস
এই প্রজেক্টের জন্য আমি Action/Executor প্যাটার্ন ব্যবহার করেছি অ্যাপ্লিকেশনের প্রধান বিজনেস লজিক কম্পোনেন্টগুলো সংগঠিত করতে। এটি ভবিষ্যতে রিযোজাবিলিটি, টেস্টাবিলিটি এবং মেইনটেইনবিলিটি নিশ্চিত করে যখন কোড বড় হবে, এটি ভিন্ন পার্টগুলোর মধ্যে আচরণ শেয়ার করতে দেয়, যেন একটি ভবিষ্যত API... কে জানে?...
অ্যাকশনগুলো পাওয়া যাবে app/Actions-এ কিন্তু আমি আপনাকে Encrypt এবং Decrypt অ্যাকশনগুলো দেখাতে চাই যেহেতু এনভায়রনমেন্ট ভেরিয়েবল এনক্রিপ্ট এবং ডিক্রিপ্ট হ্যান্ডেল করার মূল কম্পোনেন্টগুলো।
এনক্রিপশন
আমি খুব সুফলভাবে Laravel-র বিল্ট-ইন এনক্রিপশন হেল্পার পেয়েছিলাম কিন্তু আমাকে কিছু ভিন্ন জিনিস দরকার ছিল যেহেতু আমি রানটাইমে জেনারেট হওয়া একটি কাস্টম এনক্রিপশন কী দিতে চেয়েছিলাম।
কিছু খোঁজার পর, আমি একটি পথ পেলাম! আমরা Laravel-র অন্তর্নিহিত ক্লাস Illuminate\Encryption\Encrypter ব্যবহার করতে পারি।
use Illuminate\Encryption\Encrypter; $encrypter = new Encrypter( 'custom-encryption-key', // এটি হলো যা আমরা জেনারেট করতে চাই config('app.cipher'), // আমরা Laravel-এর ডিফল্ট সিফার ব্যবহার করব ); // উরাহ! এখন আমরা আমাদের ভ্যালু এনক্রিপ্ট করতে পারি $encryptedValue = $encrypter->encryptString($value);
ঠিক আছে... এনক্রিপশন কাজ করছে, আপনি যদি আমি শেয়ার করা ফাইলগুলো চেক করে থাকেন, তবে লক্ষ্য করুন এই কোডটি Encrypt এবং Decrypt অ্যাকশন-এ পাওয়া যায়।
স্টোরেজ
আমরা কভার করেছি কীভাবে আমরা Actions এবং Laravel-এর নেটিভ Encrypter ক্লাস ব্যবহার করি এনক্রিপ্ট এবং ডিক্রিপ্ট করার জন্য, কিন্তু আমরা এখনো কভার করিনি কীভাবে আমরা সেগুলো Upstash Redis-এ স্টোর করি।
সেই কোডটি থাকে StoreEnvFile অ্যাকশনে।
আমি সেটি থেকে কিছু জিনিস হাইলাইট করতে চাই, নিচের কোডটি।
// ... RedisFacade::pipeline(function (Redis $pipe) use (...) { $options = ['EX' => $ttl]; // এখানে আমরা এক্সপায়ারেশন টাইম সেট করি $pipe->set("envfile:$id", $encrypted->value, $options); $pipe->set("envfile:$id:shareLimit", $shareLimit, $options); }); // ...
উপরের কোডে আপনি একটি Redis পাইপলাইন ব্যবহার করা দেখতে পাচ্ছেন, যা নিশ্চিত করে সব কমান্ড একই ট্রানজ্যাকশনে এক্সিকিউট হয়। এটি গুরুত্বপূর্ণ কারণ আমরা চাই না এনক্রিপ্টেড ভ্যালু স্টোর হয় যদি সেট কমান্ডগুলো ফেইল করে।
ডিপ্লয়মেন্ট
ডিপ্লয়মেন্টের জন্য আমি সম্প্রতি রিলিজ হওয়া Laravel Cloud ব্যবহার করেছি।
Laravel Cloud-এ ডিপ্লয় করা অত্যন্ত সহজ ছিল, এতে আমার রিপোজিটরি থেকে একটি ফুলি ডিপ্লয়েড অ্যাপে রেডিস ইনস্ট্যান্স এবং প্রোভিশন্ড ডোমেনসহ যেতে এক মিনিটের কম সময় লাগল। এখনো, ডিপ্লয়মেন্ট ৩০ সেকেন্ডের কম সময় নেয়। 🚀

আপনি প্রোডাকশন এনভায়রনমেন্টটি দেখতে পারেন: https://envflow.laravel.cloud
উপসংহার
আশা করি আপনি এই পোস্টটি উপভোগ করেছেন এবং এটি আপনাকে Envflow কীভাবে বানানো হয়েছে তা বুঝতে সাহায্য করেছে।
আমি মনে করি অনেক অ্যাপ্লিকেশন আছে যা Upstash Redis কে প্রাইমারি ডেটাবেস হিসেবে ব্যবহার করতে পারে, যদিও এখানে Redis একটি KV স্টোর হিসেবে ব্যবহার হয়েছে তবে এটি এর চেয়ে অনেক বেশি করতে পারে এবং আমি ভবিষ্যতের আর্টিকেলগুলোর মধ্যে এটি কভার করব অন্য একটি প্রজেক্ট দিয়ে যা আমি কাজ করছি।
এই প্রজেক্টের সোর্স কোড GitHub-এ উপলব্ধ, বিনামূল্যে চেক আউট করুন এবং কন্ট্রিবিউট করুন আপনার কোনো আইডিয়া, সাজেশন বা বাগ থাকলে।