paint-brush
Laravel Elçisi - Sıkıcı Şeyler Nasıl Otomatikleştirilirile@oussamamater
1,009 okumalar
1,009 okumalar

Laravel Elçisi - Sıkıcı Şeyler Nasıl Otomatikleştirilir

ile Oussama Mater9m2024/07/10
Read on Terminal Reader

Çok uzun; Okumak

Laravel Envoy sıkıcı görevleri otomatikleştirmenize yardımcı olabilir ve CI/CD'den çok daha fazlasını yapabilir. Nginx kurulumunu otomatikleştirmek ve GitHub'a SSH anahtarlarını eklemek için bunu nasıl kullanabileceğimizi görelim.
featured image - Laravel Elçisi - Sıkıcı Şeyler Nasıl Otomatikleştirilir
Oussama Mater HackerNoon profile picture

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:


  1. Görevler : Bu, sunucuyu güncellemek veya bir depoyu klonlamak gibi belirli bir eylemi temsil eder.


  2. Hikayeler : Görevlerin bir koleksiyonudur.


Şimdilik bilmeniz gereken tek şey bu; tüm özellikleri her zaman dokümanlarda okuyabilirsiniz.

Neyi Otomatikleştiriyoruz?

Bu makalede çoğu geliştiricinin uygulamalarını dağıtırken yaptığı 2 şeyi otomatikleştireceğiz:


  1. Nginx'i yapılandırma


  2. Ö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.

Elçi Kurulumu

Ö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! 😁

Nginx'i yapılandırın

Yepyeni bir sunucumuz var ve Nginx kurmak istiyoruz. Süreci parçalara ayırırsak şöyle olur:


  1. Sunucuyu güncelle
  2. Nginx'i yükleyin
  3. Nginx'i yapılandırın


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

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 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:


  1. SSH anahtarları oluşturun


  2. 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

Çözüm

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 😛😛