मैं हाल ही में नूनो मादुरो के प्रोजेक्ट, पायर (Pyre) से प्रेरित हुआ। यह एक वेब ऐप है जो आपको किसी के साथ शॉर्ट-लिव्ड सीक्रेट मैसेज भेजने की अनुमति देता है। ये मैसेज रेस्ट पर एन्क्रिप्टेड होते हैं, और केवल आप या जिसके साथ आप डिक्रिप्शन लिंक शेयर करते हैं, उन्हें पढ़ सकते हैं।
मैं अपस्टैश रेडिस के साथ कुछ ऐसा ही बनाना चाहता था, इसलिए मैंने एक खास क्षेत्र चुना: एनवायरनमेंट वेरिएबल्स शेयर करना। मुझे यकीन है कि किसी न किसी बिंदु पर, आपको अपने साथियों के साथ सीक्रेट्स शेयर करने पड़े होंगे और आपने सोचा होगा कि ऐसा सिस्टम कैसे बनाया जाए जो आपको इसे सुरक्षित रूप से करने दे।
Envflow से मिलें, एक लारावेल सैंपल प्रोजेक्ट जिसे मैंने बनाया है जो एन्क्रिप्टेड डेटा को स्टोर और शेयर करने के लिए प्राइमरी डेटाबेस के रूप में अपस्टैश रेडिस का उपयोग करता है।
मैं आपको इस प्रोजेक्ट को बनाने की प्रक्रिया के माध्यम से ले चलूंगा, शुरुआत से अंत तक, बोरिंग डिटेल्स को छोड़कर।
टेक स्टैक
सबसे पहले, मैंने PHP को अपनाने और प्रसिद्ध TALL स्टैक का उपयोग करके प्रोजेक्ट बनाने का फैसला किया:
- Tailwind CSS
- Alpine JS
- Laravel
- Livewire
- Upstash Redis
डेटाबेस
मुझे एक ऐसी जगह चाहिए थी जहां एन्क्रिप्टेड डेटा स्टोर किया जा सके जो एक निश्चित समय के बाद एक्सपायर हो जाए, साथ ही तेज और किफायती भी हो। जैसा कि आपने अनुमान लगाया होगा, मैंने अपस्टैश रेडिस चुना।
अपस्टैश रेडिस एक सर्वरलेस, रेडिस-कम्पैटिबल डेटाबेस है इसलिए यह इस उपयोग के मामले के लिए वास्तव में परफेक्ट था।
Psst… हमारे पास अपस्टैश रेडिस और लारावेल के लिए एक गेटिंग स्टार्टेड गाइड है!
अधिक जानें
रूट्स / एंडपॉइंट्स
Envflow तीन मुख्य रूट्स पर चलता है, साथ ही एक सहायक रूट जो बताता है कि प्रोजेक्ट क्या है। ये रूट्स routes/web.php फ़ाइल में पाए जा सकते हैं।
होमपेज
होमपेज रूट न केवल प्रोजेक्ट के लिए लैंडिंग पेज के रूप में कार्य करता है बल्कि एक लाइववायर फॉर्म भी शामिल करता है जो आपको अपने एनवायरनमेंट वेरिएबल्स को एन्क्रिप्ट करने की अनुमति देता है। इस पेज पर आप सेट कर सकते हैं कि एनवायरनमेंट वेरिएबल्स को कितनी बार डिक्रिप्ट किया जा सकता है और वे कब तक वैध रहेंगे।

आप लाइववायर पेज कंपोनेंट को app/Livewire/EncryptEnvPage.php पर और संबंधित टेम्पलेट को resources/views/livewire/encrypt-env-page.blade.php पर पा सकते हैं।
सक्सेस पेज
सक्सेस पेज एक साधारण पेज है जो डिक्रिप्शन लिंक शेयर करने के दो तरीके दिखाता है: एक में डिक्रिप्शन की शामिल होती है, जबकि दूसरा डिक्रिप्शन की को लिंक से अलग करता है।

आप लाइववायर पेज कंपोनेंट को app/Livewire/SuccessPage.php पर और संबंधित टेम्पलेट को resources/views/livewire/success-page.blade.php पर पा सकते हैं।
डिक्रिप्शन पेज
यह वह पेज है जहां डिक्रिप्शन का सारा जादू होता है, याद रखें हम अपने अपस्टैश रेडिस डेटाबेस में एन्क्रिप्शन की स्टोर नहीं करते, हम केवल एन्क्रिप्टेड वैल्यू स्टोर करते हैं जो बकवास सा दिखता है। डिक्रिप्शन पेज का मुख्य काम डिक्रिप्शन की लेना और एनवायरनमेंट वेरिएबल्स को डिक्रिप्ट करने का प्रयास करना है।

आप लाइववायर पेज कंपोनेंट को app/Livewire/DecryptEnvPage.php पर और संबंधित टेम्पलेट को resources/views/livewire/decrypt-env-page.blade.php पर पा सकते हैं।
एक्शन्स
इस प्रोजेक्ट के लिए मैंने अपने एप्लिकेशन में बिजनेस लॉजिक के मुख्य कंपोनेंट्स को व्यवस्थित करने के लिए एक्शन/एग्जीक्यूटर पैटर्न का उपयोग किया है। यह मुझे भविष्य में पुन: उपयोगिता, टेस्टेबिलिटी और मेंटेनेबिलिटी की अनुमति देता है जब कोड बढ़ता है, यह मुझे ऐसे व्यवहारों को अपने एप्लिकेशन के विभिन्न हिस्सों के बीच शेयर करने की भी अनुमति देता है, मान लीजिए, एक भविष्य का API... कौन जानता है?...
आप app/Actions पर एक्शन्स पा सकते हैं लेकिन मैं आपको एन्क्रिप्ट और डिक्रिप्ट एक्शन्स दिखाना चाहूंगा क्योंकि वे एनवायरनमेंट वेरिएबल्स के एन्क्रिप्शन और डिक्रिप्शन को संभालने वाले मुख्य कंपोनेंट्स हैं।
एन्क्रिप्शन
मैं काफी भाग्यशाली था कि लारावेल में एक बिल्ट-इन एन्क्रिप्शन हेल्पर है लेकिन मुझे कुछ अलग चाहिए था क्योंकि मैं रनटाइम पर जनरेट की गई कस्टम एन्क्रिप्शन की प्रदान करना चाहता था।
कुछ खोजबीन के बाद, मुझे एक तरीका मिला! हम लारावेल के अंतर्निहित क्लास Illuminate\Encryption\Encrypter का उपयोग कर सकते हैं।
use Illuminate\Encryption\Encrypter;
$encrypter = new Encrypter(
'custom-encryption-key', // यह वही है जिसे हम जनरेट करना चाहेंगे
config('app.cipher'), // हम लारावेल के डिफॉल्ट सिफर का उपयोग करेंगे
);
// हो गया! अब हम अपनी वैल्यू एन्क्रिप्ट कर सकते हैं
$encryptedValue = $encrypter->encryptString($value);
ठीक है... तो हमें एन्क्रिप्शन काम कर रहा है, यदि आप उन फ़ाइलों को चेक कर रहे हैं जिन्हें मैं शेयर कर रहा हूं, तो आपने देखा होगा कि यह कोड एन्क्रिप्ट और डिक्रिप्ट एक्शन्स पर पाया जा सकता है।
स्टोरेज
हमने कवर किया है कि हम एक्शन्स और लारावेल के नेटिव Encrypter क्लास का उपयोग करके अपनी वैल्यूज को कैसे एन्क्रिप्ट और डिक्रिप्ट करते हैं, लेकिन हमने अभी तक कवर नहीं किया है कि हम उन्हें अपस्टैश रेडिस में कैसे स्टोर करते हैं।
वह कोड StoreEnvFile एक्शन पर रहता है।
मैं उस फ़ाइल से कुछ चीजें हाइलाइट करना चाहूंगा, निम्नलिखित कोड।
// ...
RedisFacade::pipeline(function (Redis $pipe) use (...) {
$options = ['EX' => $ttl]; // यहां हम एक्सपायरेशन टाइम सेट करते हैं
$pipe->set("envfile:$id", $encrypted->value, $options);
$pipe->set("envfile:$id:shareLimit", $shareLimit, $options);
});
// ...
ऊपर दिए कोड में आप एक रेडिस पाइपलाइन का उपयोग देख सकते हैं, जो सुनिश्चित करेगा कि सभी कमांड एक ही ट्रांजैक्शन में निष्पादित हों। यह महत्वपूर्ण है क्योंकि हम एन्क्रिप्टेड वैल्यू को स्टोर नहीं करना चाहते अगर सेट कमांड विफल हो जाएं।
डिप्लॉयमेंट
डिप्लॉयमेंट के लिए मैंने हाल ही में जारी लारावेल क्लाउड का उपयोग किया।
लारावेल क्लाउड पर डिप्लॉय करना अविश्वसनीय रूप से आसान था, मुझे रिपॉजिटरी से पूरी तरह से डिप्लॉय किए गए ऐप तक जाने में एक मिनट से भी कम समय लगा जिसमें एक अटैच्ड रेडिस इंस्टेंस और एक प्रोविज़न्ड डोमेन था। अभी भी, डिप्लॉयमेंट में 30 सेकंड से कम समय लगता है। 🚀

आप प्रोडक्शन एनवायरनमेंट पर https://envflow.laravel.cloud विजिट कर सकते हैं।
निष्कर्ष
मुझे उम्मीद है कि आपको यह पोस्ट पसंद आई होगी और इससे आपको यह समझने में मदद मिली होगी कि मैंने Envflow कैसे बनाया।
मुझे लगता है कि बहुत सारे एप्लिकेशन हैं जो अपस्टैश रेडिस को प्राइमरी डेटाबेस के रूप में उपयोग कर सकते हैं, भले ही यहां रेडिस को KV स्टोर के रूप में उपयोग किया गया था, यह उससे कहीं अधिक कर सकता है और मैं भविष्य के आर्टिकल्स में एक और प्रोजेक्ट के साथ इसे कवर करना सुनिश्चित करूंगा जिस पर मैं काम करूंगा।
इस प्रोजेक्ट का सोर्स कोड GitHub पर उपलब्ध है, बेझिझक इसे देखें और यदि आपके पास कोई विचार या सुझाव हैं (या कोई बग मिले) तो कंट्रीब्यूट करें।