लारवेल एन्वॉय आपके दूरस्थ सर्वर पर चलाए जाने वाले सामान्य कार्यों को निष्पादित करने के लिए एक उपकरण है।
मेरा मानना है कि Envoy
कम आंका गया है; मैं इसे बहुत बार इस्तेमाल होते हुए नहीं देखता, भले ही मैंने इसे हमेशा बहुत उपयोगी पाया हो। इस लेख में, हम यह पता लगाएंगे कि Envoy
आपकी उत्पादकता बढ़ाने में कैसे मदद कर सकता है🚀।
Laravel Envoy केवल Laravel डेवलपर्स के लिए ही नहीं है या Laravel परियोजनाओं तक सीमित नहीं है, कोई भी इसका उपयोग कर सकता है ❤️।
सबसे पहले, आइए Envoy
में दो प्रमुख अवधारणाओं पर चर्चा करें:
कार्य : यह किसी विशिष्ट कार्य को दर्शाता है, जैसे सर्वर को अद्यतन करना या रिपोजिटरी को क्लोन करना।
कहानियाँ : जो कि कार्यों का एक संग्रह है।
अभी आपको बस इतना ही जानना है; आप सभी सुविधाओं के बारे में दस्तावेज़ों में पढ़ सकते हैं।
इस लेख में, हम उन दो चीजों को स्वचालित करेंगे जो अधिकांश डेवलपर्स अपने एप्लिकेशन तैनात करते समय करते हैं:
Nginx को कॉन्फ़िगर करना.
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 को सेटअप करना चाहते हैं। अगर हम प्रक्रिया को तोड़ें, तो यह इस तरह होगा:
हम 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
अब जब हमने 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
इस समय, आप इस प्रक्रिया में शामिल चरणों के बारे में सोच रहे होंगे। खैर, हम इसे दो चरणों में विभाजित कर सकते हैं:
SSH कुंजियाँ उत्पन्न करें
सार्वजनिक कुंजी को 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 से कहीं अधिक काम करता है 😛😛