Laravel Envoy, uzak sunucularınızda çalıştırdığınız ortak görevleri yürütmeye yönelik bir araçtır. küçümsendiğine inanıyorum; Her zaman süper yararlı bulmama rağmen çok sık kullanıldığını görmüyorum. Bu yazıda üretkenliğinizi artırmaya nasıl yardımcı olabileceğini keşfedeceğiz🚀. Envoy Envoy Laravel Envoy, Laravel geliştiricilerine özel veya Laravel projeleriyle sınırlı değildir, kullanabilir ❤️. herkes Öncelikle iki temel kavramı tartışalım: Envoy : Bu, sunucuyu güncellemek veya bir depoyu klonlamak gibi belirli bir eylemi temsil eder. Görevler : Görevlerin bir koleksiyonudur. Hikayeler Şimdilik bilmeniz gereken tek şey bu; tüm özellikleri her zaman okuyabilirsiniz. dokümanlarda Neyi Otomatikleştiriyoruz? Bu makalede çoğu geliştiricinin uygulamalarını dağıtırken yaptığı 2 şeyi otomatikleştireceğiz: Nginx'i yapılandırma Özel depolara erişebilmek için SSH anahtarları oluşturmak ve bunları GitHub'a eklemek. Evet biliyorum, çoğu zaman CI/CD iş akışları için kullanılıyor, ancak kelimenin tam anlamıyla yapabilir. Envoy HER ŞEYİ Elçi Kurulumu Öncelikle bir dizin oluşturalım: mkdir tuto && cd $_ kullanıyorsanız tuto'yu alın. $ take tuto zsh Aşağıdaki komutu çalıştırarak yükleyin: Envoy composer require laravel/envoy --dev Bestecinizin kurulu olduğundan emin olun. Şimdi adında bir dosya oluşturun. Evet, sözdizimini kullanacağız, çok hoş değil mi? Envoy.blade.php Blade touch Envoy.blade.php Bu kadar! Tek ihtiyacınız olan tek bir komut dosyası. Laravel'e veya Laravel ile ilgili herhangi bir projeye özel olması gerekmez. Otomatikleştirmeye başlayalım! 😁 Nginx'i yapılandırın Yepyeni bir sunucumuz var ve Nginx kurmak istiyoruz. Süreci parçalara ayırırsak şöyle olur: Sunucuyu güncelle Nginx'i yükleyin Nginx'i yapılandırın ile tam da bunu yapacağız; her adımı bir , tüm süreci ise bir olarak düşünün. Envoy Task Story O halde az önce söylediklerimizi bir hikayeye çevirelim: @servers(['web' => '[email protected]', 'local' => '127.0.0.1']) @story('setup-nginx') update-server install-nginx copy-nginx-stub configure-nginx @endstory yönergesi daha sonra görevlerimizi çalıştıracağımız sunucuları belirtmek için kullanılır. @servers Artık her görevi tanımlamaya devam edebiliriz 😁 İlk görev sunucunun paketlerinin ve bağımlılıklarının güncel olmasını sağlayacaktır: update-server @task('update-server', ['on' => ['web']]) echo "Updating server..." apt update && apt upgrade -y @endtask İkinci görev Nginx'i sunucumuza yükleyecektir: install-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 Varsayılan Nginx bağlantısını kaldırdığımıza ve uygulamamız için adı değişkeninden gelen yeni bir tane oluşturduğumuza dikkat edin. $application_name Bu değişkeni kullanabilmek için onu bildirmeniz gerekir, dolayısıyla yönergesini eklememiz gerekir: @setup @setup $application_name = 'your-application-name'; @endsetup Artık üçüncü göreve geçebiliriz. Benim durumumda, bir Laravel uygulaması dağıtıyorum, bu yüzden tarafından sağlanan Nginx yapılandırma dosyasını birkaç ayarlamayla kullanacağım. Farklı bir uygulamayı dağıtıyorsanız aynı konsepti kendi yapılandırma dosyanıza uygulayabilirsiniz. copy-nginx-stub docs Yeni oluşturduğumuz dizinde aşağıdaki komutu çalıştırın: mkdir stubs; nano stubs/nginx.conf Ardından aşağıdaki içeriği düzenleyiciye yapıştırın, kaydedin ve çıkın: 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; } } ve şimdilik yer tutuculardır ve değişkenlerimizle otomatik olarak güncellenecektir. public_ip app_name Görevin kendisini yazmaya geçelim: @task('copy-nginx-stub', ['on' => 'local']) scp -P{{ $production_port }} -r ./stubs/nginx.conf {{ $production_host }}:/etc/nginx/sites-available/{{ $application_name }}.conf @endtask Bu görev uzak sunucu yerine yerel makinemizde yürütülecektir. Bunu kullanarak belirtiyoruz. 'on' => 'local' yönergesini gerekli değişkenlerle güncellemeyi de unutmayın: @setup @setup $application_name = 'your-application-name'; $production_port = 22; $production_host = '[email protected]'; @endsetup Dördüncü ve son görev , uygulamayı doğru bir şekilde sunabilmemiz için yer tutucuları güncelleyecektir: 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 komutunu not edin. Bunun nedeni, her görevin ayrı ayrı yürütülmesi ve dolayısıyla her zaman uzak sunucunun ana dizininden başlamasıdır. cd Nginx'i kurarken sembolik bağlantıyı zaten oluşturduk, artık endişelenmemize gerek yok. Ve bu bölümle işimiz bitti! Senaryonuz şöyle görünmeli: @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 Anahtarı Yapılandırması Artık Nginx'i yapılandırdığımıza ve uygulamamıza hizmet vermeye hazır olduğuna göre, özel depoları çekebilmemiz için SSH anahtarları oluşturmamız ve ortak anahtarı GitHub'a eklememiz gerekiyor. Bunun için kullanacağız, dolayısıyla başlamadan önce gerekiyor. GitHub REST API bir token oluşturmanız Belirtecinizi oluştururken yalnızca "admin:public_key" kapsamını seçtiğinizden emin olun. Artık jetonunuzu oluşturduğunuza göre bazı değişkenleri tanımlayarak başlayalım: @setup $ssh_key = '~/.ssh/id_rsa_github'; $github_api_key = 'your-github-token'; $email = '[email protected]'; @endsetup Bu noktada bu süreçteki adımları merak ediyor olabilirsiniz. Bunu iki adıma ayırabiliriz: SSH anahtarları oluşturun Ortak anahtarı GitHub'a kopyalayın Bir kez daha bu süreç bizim hikayemiz olacak: @story('setup-ssh-keys') generate-ssh-keys add-ssh-keys-to-github @endstory İlk görev olan tek bir komut çalıştırılarak yapılabilir: 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 anahtarlarımızı oluşturduktan sonra GitHub API'sini kullanarak ortak anahtarı GitHub'a ekleyebiliriz. Bu tek bir istekle yapılabilir: @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 Ve bu kadar! GitHub geliştirici ayarlarınızı ziyaret ederseniz yeni oluşturulan anahtarınızı görmelisiniz. İki bölümü birleştirdiğinizde son komut dosyanız şöyle görünmelidir: @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 Çözüm Ortak görevleri otomatikleştirmek için nasıl kullanacağımızı öğrendik. Burada keşfettiklerimizden çok daha fazla yeteneğe sahip güçlü bir araçtır. Kendinizi yalnızca uygulamalarınızı dağıtmakla sınırlamayın; terminal komutunu, kelimenin tam anlamıyla akla gelen her şeyi otomatikleştirebilir. Envoy Envoy HERHANGİ bir Bir dahaki sefere kendinizi aynı komutları tekrarlarken bulduğunuzda, onu kullanmayı düşünün, size söz veriyorum CI/CD'den çok daha fazlasını yapar 😛😛