Laravel Envoy ist ein Tool zum Ausführen allgemeiner Aufgaben, die Sie auf Ihren Remote-Servern ausführen. Ich glaube, 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 Ihnen helfen kann, Ihre Produktivität zu steigern🚀. Envoy Envoy Laravel Envoy ist nicht exklusiv für Laravel-Entwickler oder auf Laravel-Projekte beschränkt, kann es verwenden ❤️. jeder Lassen Sie uns zunächst zwei Schlüsselkonzepte in besprechen: Envoy : Dies stellt eine bestimmte Aktion dar, beispielsweise das Aktualisieren des Servers oder das Klonen eines Repository. Aufgaben : eine Sammlung von Aufgaben. Stories Das ist alles, was Sie im Moment wissen müssen. Alle Funktionen können Sie jederzeit in der nachlesen. Dokumentation Was automatisieren wir? 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 für CI/CD-Workflows verwendet, aber es kann ALLES. Envoy buchstäblich Envoy-Einrichtung Lassen Sie uns zunächst ein Verzeichnis erstellen: mkdir tuto && cd $_ , wenn Sie verwenden. $ take tuto zsh Installieren Sie , indem Sie den folgenden Befehl ausführen: Envoy composer require laravel/envoy --dev Stellen Sie sicher, dass Sie Composer installiert haben. Erstellen Sie nun eine Datei namens . Ja, wir werden die Syntax verwenden, super cool, oder? Envoy.blade.php Blade 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! 😁 Konfigurieren Sie Nginx Wir haben einen brandneuen Server und möchten Nginx einrichten. Wenn wir den Prozess aufschlüsseln, würde er folgendermaßen aussehen: Aktualisieren des Servers Installieren Sie Nginx Konfigurieren Sie Nginx Und genau das werden wir mit tun: Betrachten Sie jeden Schritt als eine und den gesamten Prozess als eine . Envoy Task 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 geben wir die Server an, auf denen wir unsere Aufgaben später ausführen werden. @servers Jetzt können wir mit der Definition der einzelnen Aufgaben fortfahren 😁 Unsere erste Aufgabe stellt sicher, dass die Pakete und Abhängigkeiten des Servers auf dem neuesten Stand sind: update-server @task('update-server', ['on' => ['web']]) echo "Updating server..." apt update && apt upgrade -y @endtask Die zweite Aufgabe installiert Nginx auf unserem Server: 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 Beachten Sie, dass wir den Standard-Nginx-Link entfernt und einen neuen für unsere Anwendung erstellt haben, wobei der Name aus der Variable stammt. $application_name Um diese Variable verwenden zu können, müssen Sie sie deklarieren. Daher müssen wir die Direktive einbinden: @setup @setup $application_name = 'your-application-name'; @endsetup Nun können wir mit der dritten Aufgabe fortfahren. In meinem Fall stelle ich eine Laravel-Anwendung bereit, daher verwende ich die in den bereitgestellte Nginx-Konfigurationsdatei mit ein paar Anpassungen. Wenn Sie eine andere Anwendung bereitstellen, können Sie dasselbe Konzept auf Ihre eigene Konfigurationsdatei anwenden. copy-nginx-stub Dokumenten 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 und sind vorerst Platzhalter und werden automatisch mit unseren Variablen aktualisiert. public_ip app_name 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 an. 'on' => 'local' Und vergessen Sie nicht, die Direktive mit den erforderlichen Variablen zu aktualisieren: @setup @setup $application_name = 'your-application-name'; $production_port = 22; $production_host = '[email protected]'; @endsetup Die vierte und letzte Aufgabe aktualisiert die Platzhalter, damit wir die Anwendung korrekt bereitstellen können: 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 Beachten Sie den Befehl . Dies liegt daran, dass jede Aufgabe separat ausgeführt wird und daher immer im Home-Verzeichnis des Remote-Servers gestartet wird. cd 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 SSH-Schlüsselkonfiguration 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 . Bevor wir beginnen, müssen Sie also . die GitHub REST API 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, , kann durch Ausführen eines einzigen Befehls erledigt werden: 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 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 Abschluss Wir haben gelernt, wie man mit 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; kann Terminalbefehl automatisieren, buchstäblich alles, was Ihnen in den Sinn kommt. Envoy Envoy JEDEN Wenn Sie das nächste Mal dieselben Befehle wiederholen, sollten Sie es verwenden. Ich verspreche Ihnen, es kann viel mehr als CI/CD 😛😛