paint-brush
लारवेल एन्वॉय - बोरिंग चीजों को स्वचालित कैसे करेंद्वारा@oussamamater
1,005 रीडिंग
1,005 रीडिंग

लारवेल एन्वॉय - बोरिंग चीजों को स्वचालित कैसे करें

द्वारा Oussama Mater9m2024/07/10
Read on Terminal Reader

बहुत लंबा; पढ़ने के लिए

Laravel Envoy आपको थकाऊ कार्यों को स्वचालित करने में मदद कर सकता है, और यह सिर्फ़ CI/CD से कहीं ज़्यादा काम कर सकता है। आइए देखें कि हम इसका उपयोग Nginx को स्वचालित रूप से सेट करने और GitHub में SSH कुंजियाँ जोड़ने के लिए कैसे कर सकते हैं।
featured image - लारवेल एन्वॉय - बोरिंग चीजों को स्वचालित कैसे करें
Oussama Mater HackerNoon profile picture

लारवेल एन्वॉय आपके दूरस्थ सर्वर पर चलाए जाने वाले सामान्य कार्यों को निष्पादित करने के लिए एक उपकरण है।


मेरा मानना है कि Envoy कम आंका गया है; मैं इसे बहुत बार इस्तेमाल होते हुए नहीं देखता, भले ही मैंने इसे हमेशा बहुत उपयोगी पाया हो। इस लेख में, हम यह पता लगाएंगे कि Envoy आपकी उत्पादकता बढ़ाने में कैसे मदद कर सकता है🚀।


Laravel Envoy केवल Laravel डेवलपर्स के लिए ही नहीं है या Laravel परियोजनाओं तक सीमित नहीं है, कोई भी इसका उपयोग कर सकता है ❤️।


सबसे पहले, आइए Envoy में दो प्रमुख अवधारणाओं पर चर्चा करें:


  1. कार्य : यह किसी विशिष्ट कार्य को दर्शाता है, जैसे सर्वर को अद्यतन करना या रिपोजिटरी को क्लोन करना।


  2. कहानियाँ : जो कि कार्यों का एक संग्रह है।


अभी आपको बस इतना ही जानना है; आप सभी सुविधाओं के बारे में दस्तावेज़ों में पढ़ सकते हैं।

हम क्या स्वचालित कर रहे हैं?

इस लेख में, हम उन दो चीजों को स्वचालित करेंगे जो अधिकांश डेवलपर्स अपने एप्लिकेशन तैनात करते समय करते हैं:


  1. Nginx को कॉन्फ़िगर करना.


  2. SSH कुंजियाँ उत्पन्न करना और उन्हें GitHub में जोड़ना ताकि निजी रिपॉजिटरी तक पहुँच प्राप्त की जा सके।


हां, मुझे पता है, अधिकांश समय Envoy उपयोग CI/CD वर्कफ़्लो के लिए किया जाता है, लेकिन यह वस्तुतः सब कुछ कर सकता है।

दूत सेटअप

सबसे पहले, आइए एक निर्देशिका बनाएं:

 mkdir tuto && cd $_


$ यदि आप zsh उपयोग कर रहे हैं तो $ take tuto


निम्नलिखित कमांड चलाकर Envoy स्थापित करें:

 composer require laravel/envoy --dev


सुनिश्चित करें कि आपके पास कंपोजर स्थापित है।


अब, Envoy.blade.php नामक एक फ़ाइल बनाएँ। हाँ, हम Blade सिंटैक्स का उपयोग करेंगे, बहुत बढ़िया है ना?

 touch Envoy.blade.php


बस इतना ही! आपको बस एक स्क्रिप्ट की ज़रूरत है। यह Laravel या किसी Laravel-संबंधित प्रोजेक्ट के लिए विशिष्ट नहीं होना चाहिए। चलो स्वचालन शुरू करते हैं! 😁

Nginx कॉन्फ़िगर करें

हमारे पास बिल्कुल नया सर्वर है, और हम Nginx को सेटअप करना चाहते हैं। अगर हम प्रक्रिया को तोड़ें, तो यह इस तरह होगा:


  1. सर्वर को अपडेट करें
  2. Nginx स्थापित करें
  3. Nginx कॉन्फ़िगर करें


हम Envoy के साथ ठीक यही करेंगे; प्रत्येक चरण को एक Task और सम्पूर्ण प्रक्रिया को एक Story के रूप में सोचेंगे।


तो, आइये हमने जो कुछ कहा उसे एक कहानी में बदल दें:

 @servers(['web' => '[email protected]', 'local' => '127.0.0.1']) @story('setup-nginx') update-server install-nginx copy-nginx-stub configure-nginx @endstory


@servers निर्देश का उपयोग उन सर्वरों को निर्दिष्ट करने के लिए किया जाता है जिन पर हम बाद में अपने कार्य चलाएंगे।


अब, हम प्रत्येक कार्य को परिभाषित करने के लिए आगे बढ़ सकते हैं 😁


हमारा पहला कार्य update-server यह सुनिश्चित करेगा कि सर्वर के पैकेज और निर्भरताएं अद्यतन हैं:

 @task('update-server', ['on' => ['web']]) echo "Updating server..." apt update && apt upgrade -y @endtask


दूसरा कार्य install-nginx हमारे सर्वर पर Nginx स्थापित करेगा:

 @task('install-nginx', ['on' => ['web']]) echo "Installing nginx..." apt install nginx -y rm /etc/nginx/sites-enabled/default /etc/nginx/sites-available/default touch /etc/nginx/sites-available/{{ $application_name }}.conf ln -s /etc/nginx/sites-available/{{ $application_name }}.conf /etc/nginx/sites-enabled/{{ $application_name }}.conf @endtask


ध्यान दें कि हमने डिफ़ॉल्ट Nginx लिंक को हटा दिया है और हमारे एप्लिकेशन के लिए एक नया लिंक बनाया है, जिसका नाम $application_name वेरिएबल से लिया गया है।


उस चर का उपयोग करने में सक्षम होने के लिए, आपको इसे घोषित करने की आवश्यकता है, इसलिए हमें @setup निर्देश को शामिल करने की आवश्यकता है:

 @setup $application_name = 'your-application-name'; @endsetup

अब, हम तीसरे कार्य copy-nginx-stub पर जा सकते हैं। मेरे मामले में, मैं एक Laravel एप्लिकेशन तैनात कर रहा हूं, इसलिए मैं कुछ बदलावों के साथ दस्तावेज़ों द्वारा प्रदान की गई Nginx कॉन्फ़िगरेशन फ़ाइल का उपयोग करूंगा। यदि आप एक अलग एप्लिकेशन तैनात कर रहे हैं, तो आप उसी अवधारणा को अपनी कॉन्फ़िगरेशन फ़ाइल पर लागू कर सकते हैं।


हमने अभी जो निर्देशिका बनाई है, उसमें निम्नलिखित कमांड चलाएँ:

 mkdir stubs; nano stubs/nginx.conf


फिर, निम्नलिखित सामग्री को संपादक में चिपकाएँ, उसे सहेजें, और बाहर निकलें:

 server { listen 80; listen [::]:80; server_name public_ip; root /var/www/app_name/public; add_header X-Frame-Options "SAMEORIGIN"; add_header X-Content-Type-Options "nosniff"; index index.php; charset utf-8; location / { try_files $uri $uri/ /index.php?$query_string; } location = /favicon.ico { access_log off; log_not_found off; } location = /robots.txt { access_log off; log_not_found off; } error_page 404 /index.php; location ~ \.php$ { fastcgi_pass unix:/var/run/php/php8.0-fpm.sock; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; include fastcgi_params; } location ~ /\.(?!well-known).* { deny all; } }

public_ip और app_name अभी प्लेसहोल्डर हैं और हमारे वेरिएबल्स के साथ स्वचालित रूप से अपडेट हो जाएंगे।


आइये अब कार्य को स्वयं लिखने की ओर आगे बढ़ें:

 @task('copy-nginx-stub', ['on' => 'local']) scp -P{{ $production_port }} -r ./stubs/nginx.conf {{ $production_host }}:/etc/nginx/sites-available/{{ $application_name }}.conf @endtask


यह कार्य रिमोट सर्वर के बजाय हमारी स्थानीय मशीन पर निष्पादित किया जाएगा। हम इसे 'on' => 'local' उपयोग करके निर्दिष्ट करते हैं।


और @setup निर्देश को आवश्यक चरों के साथ अद्यतन करना न भूलें:

 @setup $application_name = 'your-application-name'; $production_port = 22; $production_host = '[email protected]'; @endsetup



चौथा और अंतिम कार्य configure-nginx प्लेसहोल्डर्स को अपडेट करेगा, ताकि हम एप्लिकेशन को सही ढंग से प्रस्तुत कर सकें:

 @task('configure-nginx', ['on' => 'web']) echo "Configuring nginx..." cd /etc/nginx/sites-available/ sed -i 's/app_name/{{ $application_name }}/g' {{ $application_name }}.conf sed -i 's/public_ip/{{ $production_ip }}/g' {{ $application_name }}.conf @endtask


cd कमांड पर ध्यान दें। ऐसा इसलिए है क्योंकि प्रत्येक कार्य अलग-अलग निष्पादित होता है, इसलिए यह हमेशा रिमोट सर्वर की होम डायरेक्टरी से शुरू होता है।


हमने Nginx को स्थापित करते समय पहले ही सिमलिंक बना लिया है, अब हमें इसके बारे में चिंता करने की आवश्यकता नहीं है।


और हमने इस भाग का काम पूरा कर लिया है! आपकी स्क्रिप्ट कुछ इस तरह दिखनी चाहिए:

 @servers(['web' => '[email protected]', 'local' => '127.0.0.1']) @setup $application_name = 'your-application-name'; $production_port = 22; $production_host = '[email protected]'; @endsetup @story('setup-nginx') update-server install-nginx copy-nginx-stub configure-nginx @endstory @task('update-server', ['on' => ['web']]) echo "Updating server..." apt update && apt upgrade -y @endtask @task('install-nginx', ['on' => ['web']]) echo "Installing nginx..." apt install nginx -y rm /etc/nginx/sites-enabled/default /etc/nginx/sites-available/default touch /etc/nginx/sites-available/{{ $application_name }}.conf ln -s /etc/nginx/sites-available/{{ $application_name }}.conf /etc/nginx/sites-enabled/{{ $application_name }}.conf @endtask @task('copy-nginx-stub', ['on' => 'local']) scp -P{{ $production_port }} -r ./stubs/nginx.conf {{ $production_host }}:/etc/nginx/sites-available/{{ $application_name }}.conf @endtask @task('configure-nginx', ['on' => 'web']) echo "Configuring nginx..." cd /etc/nginx/sites-available/ sed -i 's/app_name/{{ $application_name }}/g' {{ $application_name }}.conf sed -i 's/public_ip/{{ $production_ip }}/g' {{ $application_name }}.conf @endtask

SSH कुंजी कॉन्फ़िगरेशन

अब जब हमने Nginx को कॉन्फ़िगर कर लिया है, और यह हमारे एप्लिकेशन को सेवा देने के लिए तैयार है, तो हमें SSH कुंजियाँ उत्पन्न करने और GitHub में सार्वजनिक कुंजी जोड़ने की आवश्यकता है ताकि हम निजी रिपॉजिटरी खींच सकें।


इसके लिए, हम GitHub REST API का उपयोग करेंगे, इसलिए शुरू करने से पहले, आपको एक टोकन बनाना होगा।


अपना टोकन बनाते समय, सुनिश्चित करें कि आप केवल "admin:public_key" स्कोप का ही चयन करें।


अब जब आपने अपना टोकन बना लिया है, तो आइए कुछ चर परिभाषित करके शुरू करें:

 @setup $ssh_key = '~/.ssh/id_rsa_github'; $github_api_key = 'your-github-token'; $email = '[email protected]'; @endsetup

इस समय, आप इस प्रक्रिया में शामिल चरणों के बारे में सोच रहे होंगे। खैर, हम इसे दो चरणों में विभाजित कर सकते हैं:


  1. SSH कुंजियाँ उत्पन्न करें


  2. सार्वजनिक कुंजी को GitHub पर कॉपी करें


एक बार फिर, यह प्रक्रिया हमारी कहानी होगी:

 @story('setup-ssh-keys') generate-ssh-keys add-ssh-keys-to-github @endstory


पहला कार्य, generate-ssh-keys , एक ही कमांड चलाकर किया जा सकता है:

 @task('generate-ssh-keys', ['on' => ['web']]) echo "Generating ssh keys..." ssh-keygen -t ed25519 -f {{ $ssh_key }} -N '' -q -C "{{ $email }}" @endtask


एक बार जब हम अपनी SSH कुंजियाँ बना लेते हैं, तो हम GitHub API का उपयोग करके GitHub में सार्वजनिक कुंजी जोड़ सकते हैं। यह एक ही अनुरोध के साथ किया जा सकता है:

 @task('add-ssh-keys-to-github', ['on' => ['web']]) echo "Adding ssh keys to github..." key=$(cat {{ $ssh_key }}.pub) curl --request POST \ --url https://api.github.com/user/keys \ --header 'Accept: application/vnd.github+json' \ --header 'Authorization: Bearer {{ $github_api_key }}' \ --header 'Content-Type: application/json' \ --header 'X-GitHub-Api-Version: 2022-11-28' \ --data '{ "title": "[Envoy] Public key", "key": "'"$key"'" }' @endtask

और बस! यदि आप अपने GitHub डेवलपर सेटिंग्स पर जाते हैं, तो आपको अपनी नई बनाई गई कुंजी दिखाई देगी।


दोनों खंडों को मिलाकर आपकी अंतिम स्क्रिप्ट इस प्रकार दिखेगी:

 @servers(['web' => '[email protected]', 'local' => '127.0.0.1']) @setup $application_name = 'your-application-name'; $production_port = 22; $production_host = '[email protected]'; $ssh_key = '~/.ssh/id_rsa_github'; $github_api_key = 'your-github-token'; $email = '[email protected]'; @endsetup @story('setup-nginx') update-server install-nginx copy-nginx-stub configure-nginx @endstory @story('setup-ssh-keys') generate-ssh-keys add-ssh-keys-to-github @endstory @task('update-server', ['on' => ['web']]) echo "Updating server..." apt update && apt upgrade -y @endtask @task('install-nginx', ['on' => ['web']]) echo "Installing Nginx..." apt install nginx -y rm /etc/nginx/sites-enabled/default /etc/nginx/sites-available/default touch /etc/nginx/sites-available/{{ $application_name }}.conf ln -s /etc/nginx/sites-available/{{ $application_name }}.conf /etc/nginx/sites-enabled/{{ $application_name }}.conf @endtask @task('copy-nginx-stub', ['on' => 'local']) scp -P{{ $production_port }} -r ./stubs/nginx.conf {{ $production_host }}:/etc/nginx/sites-available/{{ $application_name }}.conf @endtask @task('configure-nginx', ['on' => 'web']) echo "Configuring nginx..." cd /etc/nginx/sites-available/ sed -i 's/app_name/{{ $application_name }}/g' {{ $application_name }}.conf sed -i 's/public_ip/{{ $production_ip }}/g' {{ $application_name }}.conf @endtask @task('generate-ssh-keys', ['on' => ['web']]) echo "Generating ssh keys..." ssh-keygen -t ed25519 -f {{ $ssh_key }} -N '' -q -C "{{ $email }}" @endtask @task('add-ssh-keys-to-github', ['on' => ['web']]) echo "Adding ssh keys to github..." key=$(cat {{ $ssh_key }}.pub) curl --request POST \ --url https://api.github.com/user/keys \ --header 'Accept: application/vnd.github+json' \ --header 'Authorization: Bearer {{ $github_api_key }}' \ --header 'Content-Type: application/json' \ --header 'X-GitHub-Api-Version: 2022-11-28' \ --data '{ "title": "creating from script", "key": "'"$key"'" }' @endtask

निष्कर्ष

हमने सीखा कि सामान्य कार्यों को स्वचालित करने के लिए Envoy उपयोग कैसे करें। यह एक शक्तिशाली उपकरण है जिसमें हमने यहां जो बताया है उससे भी अधिक क्षमताएं हैं। अपने आप को केवल अपने अनुप्रयोगों को तैनात करने तक सीमित न रखें; Envoy किसी भी टर्मिनल कमांड को स्वचालित कर सकता है, वस्तुतः जो कुछ भी दिमाग में आता है।


अगली बार जब आप खुद को एक ही कमांड दोहराते हुए पाएं, तो इसका उपयोग करने पर विचार करें, मैं आपसे वादा करता हूं कि यह CI/CD से कहीं अधिक काम करता है 😛😛