Laravel Envoy ist ein Tool zum Ausführen allgemeiner Aufgaben, die Sie auf Ihren Remote-Servern ausführen.
Ich glaube, Envoy
wird unterschätzt. Ich sehe nicht, dass es sehr oft verwendet wird, obwohl ich es immer sehr nützlich fand. In diesem Artikel werden wir untersuchen, wie Envoy
Ihnen helfen kann, Ihre Produktivität zu steigern🚀.
Laravel Envoy ist nicht exklusiv für Laravel-Entwickler oder auf Laravel-Projekte beschränkt, jeder kann es verwenden ❤️.
Lassen Sie uns zunächst zwei Schlüsselkonzepte in Envoy
besprechen:
Aufgaben : Dies stellt eine bestimmte Aktion dar, beispielsweise das Aktualisieren des Servers oder das Klonen eines Repository.
Stories : eine Sammlung von Aufgaben.
Das ist alles, was Sie im Moment wissen müssen. Alle Funktionen können Sie jederzeit in der Dokumentation nachlesen.
In diesem Artikel automatisieren wir zwei Dinge, die die meisten Entwickler beim Bereitstellen ihrer Anwendungen tun:
Nginx konfigurieren.
Generieren von SSH-Schlüsseln und Hinzufügen dieser zu GitHub, um auf private Repositories zugreifen zu können.
Ja, ich weiß, meistens wird Envoy
für CI/CD-Workflows verwendet, aber es kann buchstäblich ALLES.
Lassen Sie uns zunächst ein Verzeichnis erstellen:
mkdir tuto && cd $_
$ take tuto
, wenn Siezsh
verwenden.
Installieren Sie Envoy
, indem Sie den folgenden Befehl ausführen:
composer require laravel/envoy --dev
Stellen Sie sicher, dass Sie Composer installiert haben.
Erstellen Sie nun eine Datei namens Envoy.blade.php
. Ja, wir werden die Blade
Syntax verwenden, super cool, oder?
touch Envoy.blade.php
Das ist alles! Sie benötigen lediglich ein einziges Skript. Es muss nicht spezifisch für Laravel oder ein Laravel-bezogenes Projekt sein. Beginnen wir mit der Automatisierung! 😁
Wir haben einen brandneuen Server und möchten Nginx einrichten. Wenn wir den Prozess aufschlüsseln, würde er folgendermaßen aussehen:
Und genau das werden wir mit Envoy
tun: Betrachten Sie jeden Schritt als eine Task
und den gesamten Prozess als eine Story
.
Übersetzen wir also das gerade Gesagte in eine Geschichte:
@servers(['web' => '[email protected]', 'local' => '127.0.0.1']) @story('setup-nginx') update-server install-nginx copy-nginx-stub configure-nginx @endstory
Mit der Direktive
@servers
geben wir die Server an, auf denen wir unsere Aufgaben später ausführen werden.
Jetzt können wir mit der Definition der einzelnen Aufgaben fortfahren 😁
Unsere erste Aufgabe update-server
stellt sicher, dass die Pakete und Abhängigkeiten des Servers auf dem neuesten Stand sind:
@task('update-server', ['on' => ['web']]) echo "Updating server..." apt update && apt upgrade -y @endtask
Die zweite Aufgabe install-nginx
installiert Nginx auf unserem Server:
@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
Beachten Sie, dass wir den Standard-Nginx-Link entfernt und einen neuen für unsere Anwendung erstellt haben, wobei der Name aus der Variable $application_name
stammt.
Um diese Variable verwenden zu können, müssen Sie sie deklarieren. Daher müssen wir die Direktive @setup
einbinden:
@setup $application_name = 'your-application-name'; @endsetup
Nun können wir mit der dritten Aufgabe copy-nginx-stub
fortfahren. In meinem Fall stelle ich eine Laravel-Anwendung bereit, daher verwende ich die in den Dokumenten bereitgestellte Nginx-Konfigurationsdatei mit ein paar Anpassungen. Wenn Sie eine andere Anwendung bereitstellen, können Sie dasselbe Konzept auf Ihre eigene Konfigurationsdatei anwenden.
Führen Sie in dem Verzeichnis, das wir gerade erstellt haben, den folgenden Befehl aus:
mkdir stubs; nano stubs/nginx.conf
Fügen Sie dann den folgenden Inhalt in den Editor ein, speichern Sie ihn und beenden Sie ihn:
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; } }
Die public_ip
und app_name
sind vorerst Platzhalter und werden automatisch mit unseren Variablen aktualisiert.
Fahren wir mit dem Schreiben der Aufgabe selbst fort:
@task('copy-nginx-stub', ['on' => 'local']) scp -P{{ $production_port }} -r ./stubs/nginx.conf {{ $production_host }}:/etc/nginx/sites-available/{{ $application_name }}.conf @endtask
Diese Aufgabe wird auf unserem lokalen Computer ausgeführt, statt auf dem Remote-Server. Wir geben dies mit
'on' => 'local'
an.
Und vergessen Sie nicht, die @setup
Direktive mit den erforderlichen Variablen zu aktualisieren:
@setup $application_name = 'your-application-name'; $production_port = 22; $production_host = '[email protected]'; @endsetup
Die vierte und letzte Aufgabe configure-nginx
aktualisiert die Platzhalter, damit wir die Anwendung korrekt bereitstellen können:
@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
Beachten Sie den Befehl
cd
. Dies liegt daran, dass jede Aufgabe separat ausgeführt wird und daher immer im Home-Verzeichnis des Remote-Servers gestartet wird.
Den symbolischen Link haben wir bereits bei der Installation von Nginx erstellt, darum müssen wir uns jetzt nicht mehr kümmern.
Und wir sind mit diesem Abschnitt fertig! Ihr Skript sollte folgendermaßen aussehen:
@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
Nachdem wir Nginx nun konfiguriert haben und es bereit ist, unsere Anwendung bereitzustellen, müssen wir SSH-Schlüssel generieren und den öffentlichen Schlüssel zu GitHub hinzufügen, damit wir die privaten Repositories abrufen können.
Hierzu verwenden wir die GitHub REST API . Bevor wir beginnen, müssen Sie also ein Token erstellen .
Achten Sie beim Erstellen Ihres Tokens darauf, dass Sie nur den Bereich „admin:public_key“ auswählen.
Nachdem Sie nun Ihr Token erstellt haben, beginnen wir mit der Definition einiger Variablen:
@setup $ssh_key = '~/.ssh/id_rsa_github'; $github_api_key = 'your-github-token'; $email = '[email protected]'; @endsetup
An dieser Stelle fragen Sie sich vielleicht, welche Schritte dieser Prozess umfasst. Nun, wir können ihn in zwei Schritte unterteilen:
SSH-Schlüssel generieren
Kopieren Sie den öffentlichen Schlüssel nach GitHub
Dieser Prozess wird noch einmal unsere Geschichte sein:
@story('setup-ssh-keys') generate-ssh-keys add-ssh-keys-to-github @endstory
Die erste Aufgabe, generate-ssh-keys
, kann durch Ausführen eines einzigen Befehls erledigt werden:
@task('generate-ssh-keys', ['on' => ['web']]) echo "Generating ssh keys..." ssh-keygen -t ed25519 -f {{ $ssh_key }} -N '' -q -C "{{ $email }}" @endtask
Sobald wir unsere SSH-Schlüssel generiert haben, können wir den öffentlichen Schlüssel mithilfe der GitHub-API zu GitHub hinzufügen. Dies kann mit einer einzigen Anfrage erfolgen:
@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
Und das war’s! Wenn Sie Ihre GitHub-Entwicklereinstellungen aufrufen, sollten Sie Ihren neu erstellten Schlüssel sehen.
Durch die Kombination der beiden Abschnitte sollte Ihr endgültiges Skript folgendermaßen aussehen:
@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
Wir haben gelernt, wie man mit Envoy
gängige Aufgaben automatisiert. Es ist ein leistungsstarkes Tool mit noch mehr Funktionen, als wir hier erkundet haben. Beschränken Sie sich nicht nur auf die Bereitstellung Ihrer Anwendungen; Envoy
kann JEDEN Terminalbefehl automatisieren, buchstäblich alles, was Ihnen in den Sinn kommt.
Wenn Sie das nächste Mal dieselben Befehle wiederholen, sollten Sie es verwenden. Ich verspreche Ihnen, es kann viel mehr als CI/CD 😛😛