Laravel Envoy হল একটি টুল যা আপনি আপনার রিমোট সার্ভারে চালান এমন সাধারণ কাজগুলি সম্পাদন করার জন্য।
আমি বিশ্বাস করি Envoy
আন্ডাররেট করা হয়েছে; আমি এটিকে প্রায়শই ব্যবহার করতে দেখি না যদিও আমি এটিকে সর্বদা খুব দরকারী বলে মনে করেছি। এই নিবন্ধে, আমরা অন্বেষণ করব কিভাবে Envoy
আপনার উৎপাদনশীলতা বাড়াতে সাহায্য করতে পারে🚀।
লারাভেল দূত লারাভেল ডেভেলপারদের জন্য একচেটিয়া নয় বা লারাভেল প্রকল্পের মধ্যে সীমাবদ্ধ নয়, যে কেউ এটি ব্যবহার করতে পারে ❤️।
প্রথমে, Envoy
দুটি মূল ধারণা নিয়ে আলোচনা করা যাক:
কার্য : এটি সার্ভার আপডেট করা বা একটি সংগ্রহস্থল ক্লোন করার মতো একটি নির্দিষ্ট ক্রিয়াকে প্রতিনিধিত্ব করে।
গল্প : যা টাস্কের একটি সংগ্রহ।
আপাতত আপনার এতটুকুই জানা দরকার; আপনি সবসময় ডক্সের সমস্ত বৈশিষ্ট্য সম্পর্কে পড়তে পারেন।
এই নিবন্ধে, আমরা 2টি জিনিস স্বয়ংক্রিয় করব যা বেশিরভাগ বিকাশকারীরা তাদের অ্যাপ্লিকেশনগুলি স্থাপন করার সময় করে:
Nginx কনফিগার করা হচ্ছে।
ব্যক্তিগত সংগ্রহস্থলগুলি অ্যাক্সেস করতে সক্ষম হতে SSH কী তৈরি করা এবং GitHub-এ যোগ করা।
হ্যাঁ আমি জানি, বেশিরভাগ সময় Envoy
ব্যবহার করা হয় CI/CD কর্মপ্রবাহের জন্য, কিন্তু এটি আক্ষরিক অর্থে সবকিছু করতে পারে।
প্রথমে একটি ডিরেক্টরি তৈরি করা যাক:
mkdir tuto && cd $_
$ take tuto
যদি আপনিzsh
ব্যবহার করেন।
নিম্নলিখিত কমান্ডটি চালিয়ে Envoy
ইনস্টল করুন:
composer require laravel/envoy --dev
আপনি সুরকার ইনস্টল করা আছে তা নিশ্চিত করুন.
এখন, Envoy.blade.php
নামে একটি ফাইল তৈরি করুন। হ্যাঁ, আমরা Blade
সিনট্যাক্স ব্যবহার করব, সুপার কুল ডান?
touch Envoy.blade.php
এটাই! আপনার যা দরকার তা হল একটি একক স্ক্রিপ্ট। এটি লারাভেল বা কোন লারাভেল-সম্পর্কিত প্রকল্পের জন্য নির্দিষ্ট হতে হবে না। এর স্বয়ংক্রিয় শুরু করা যাক! 😁
আমাদের একটি ব্র্যান্ড নতুন সার্ভার আছে, এবং আমরা 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
এ যেতে পারি। আমার ক্ষেত্রে, আমি একটি লারাভেল অ্যাপ্লিকেশন স্থাপন করছি, তাই আমি ডক্স দ্বারা প্রদত্ত 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 এর চেয়ে অনেক বেশি কাজ করে 😛😛