Laravel Envoy, uzak sunucularınızda çalıştırdığınız ortak görevleri yürütmeye yönelik bir araçtır.
Envoy
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 Envoy
üretkenliğinizi artırmaya nasıl yardımcı olabileceğini keşfedeceğiz🚀.
Laravel Envoy, Laravel geliştiricilerine özel veya Laravel projeleriyle sınırlı değildir, herkes kullanabilir ❤️.
Öncelikle Envoy
iki temel kavramı tartışalım:
Görevler : Bu, sunucuyu güncellemek veya bir depoyu klonlamak gibi belirli bir eylemi temsil eder.
Hikayeler : Görevlerin bir koleksiyonudur.
Şimdilik bilmeniz gereken tek şey bu; tüm özellikleri her zaman dokümanlarda okuyabilirsiniz.
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, Envoy
çoğu zaman CI/CD iş akışları için kullanılıyor, ancak kelimenin tam anlamıyla HER ŞEYİ yapabilir.
Öncelikle bir dizin oluşturalım:
mkdir tuto && cd $_
$ take tuto
zsh
kullanıyorsanız tuto'yu alın.
Aşağıdaki komutu çalıştırarak Envoy
yükleyin:
composer require laravel/envoy --dev
Bestecinizin kurulu olduğundan emin olun.
Şimdi Envoy.blade.php
adında bir dosya oluşturun. Evet, Blade
sözdizimini kullanacağız, çok hoş değil mi?
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! 😁
Yepyeni bir sunucumuz var ve Nginx kurmak istiyoruz. Süreci parçalara ayırırsak şöyle olur:
Envoy
ile tam da bunu yapacağız; her adımı bir Task
, tüm süreci ise bir Story
olarak düşünün.
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
@servers
yönergesi daha sonra görevlerimizi çalıştıracağımız sunucuları belirtmek için kullanılır.
Artık her görevi tanımlamaya devam edebiliriz 😁
İlk görev update-server
sunucunun paketlerinin ve bağımlılıklarının güncel olmasını sağlayacaktır:
@task('update-server', ['on' => ['web']]) echo "Updating server..." apt update && apt upgrade -y @endtask
İkinci görev install-nginx
Nginx'i sunucumuza yükleyecektir:
@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ı $application_name
değişkeninden gelen yeni bir tane oluşturduğumuza dikkat edin.
Bu değişkeni kullanabilmek için onu bildirmeniz gerekir, dolayısıyla @setup
yönergesini eklememiz gerekir:
@setup $application_name = 'your-application-name'; @endsetup
Artık üçüncü göreve copy-nginx-stub
geçebiliriz. Benim durumumda, bir Laravel uygulaması dağıtıyorum, bu yüzden docs 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.
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; } }
public_ip
ve app_name
şimdilik yer tutuculardır ve değişkenlerimizle otomatik olarak güncellenecektir.
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
'on' => 'local'
kullanarak belirtiyoruz.
@setup
yönergesini gerekli değişkenlerle güncellemeyi de unutmayın:
@setup $application_name = 'your-application-name'; $production_port = 22; $production_host = '[email protected]'; @endsetup
Dördüncü ve son görev configure-nginx
, uygulamayı doğru bir şekilde sunabilmemiz için yer tutucuları güncelleyecektir:
@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
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.
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
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 GitHub REST API kullanacağız, dolayısıyla başlamadan önce bir token oluşturmanız gerekiyor.
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 generate-ssh-keys
tek bir komut çalıştırılarak yapılabilir:
@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
Ortak görevleri otomatikleştirmek için Envoy
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; Envoy
HERHANGİ bir terminal komutunu, kelimenin tam anlamıyla akla gelen her şeyi otomatikleştirebilir.
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 😛😛