Laravel Envoy — это инструмент для выполнения типичных задач, которые вы выполняете на удаленных серверах. Я считаю, что недооценен; Я не вижу, чтобы его использовали очень часто, хотя я всегда находил его очень полезным. В этой статье мы рассмотрим, как может помочь повысить вашу продуктивность🚀. Envoy Envoy Laravel Envoy не предназначен исключительно для разработчиков Laravel и не ограничен только проектами Laravel, его может использовать ❤️. каждый Во-первых, давайте обсудим две ключевые концепции : Envoy : представляют собой конкретное действие, например обновление сервера или клонирование репозитория. Задачи : представляет собой набор задач. Истории Это все, что вам нужно знать на данный момент; Обо всех функциях вы всегда можете прочитать в . документации Что мы автоматизируем? В этой статье мы автоматизируем две вещи, которые большинство разработчиков делают при развертывании своих приложений: Настройка Нгинкса. Генерация ключей SSH и добавление их в GitHub для доступа к частным репозиториям. Да, я знаю, большую часть времени используется для рабочих процессов CI/CD, но он может буквально . Envoy ВСЕ Настройка посланника Сначала создадим каталог: mkdir tuto && cd $_ , если вы используете . $ take tuto zsh Установите , выполнив следующую команду: Envoy composer require laravel/envoy --dev Убедитесь, что у вас установлен композитор. Теперь создайте файл . Да, мы будем использовать синтаксис , очень круто, правда? Envoy.blade.php Blade touch Envoy.blade.php Вот и все! Все, что вам нужно, это один сценарий. Это не обязательно должно быть связано с Laravel или каким-либо проектом, связанным с Laravel. Начнем автоматизировать! 😁 Настроить Nginx У нас есть новый сервер, и мы хотим настроить Nginx. Если разобрать процесс, то это будет так: Обновить сервер Установить Нгинкс Настроить Nginx Именно это мы и будем делать с ; думайте о каждом шаге как о , а обо всем процессе как об . Envoy Task Story Итак, давайте переведем то, что мы только что сказали, в историю: @servers(['web' => '[email protected]', 'local' => '127.0.0.1']) @story('setup-nginx') update-server install-nginx copy-nginx-stub configure-nginx @endstory Директива используется для указания серверов, на которых мы будем запускать наши задачи позже. @servers Теперь можно приступить к определению каждой задачи 😁 Наша первая задача будет гарантировать актуальность пакетов и зависимостей сервера: update-server @task('update-server', ['on' => ['web']]) echo "Updating server..." apt update && apt upgrade -y @endtask Вторая задача установит Nginx на наш сервер: 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 Обратите внимание, что мы удалили ссылку Nginx по умолчанию и создали новую для нашего приложения с именем, полученным из переменной . $application_name Чтобы иметь возможность использовать эту переменную, вам необходимо ее объявить, поэтому нам нужно включить директиву : @setup @setup $application_name = 'your-application-name'; @endsetup Теперь мы можем перейти к третьей задаче . В моем случае я развертываю приложение Laravel, поэтому буду использовать файл конфигурации Nginx, предоставленный , с некоторыми изменениями. Если вы развертываете другое приложение, вы можете применить ту же концепцию к своему собственному файлу конфигурации. copy-nginx-stub документацией В только что созданном каталоге выполните следующую команду: mkdir stubs; nano stubs/nginx.conf Затем вставьте следующий контент в редактор, сохраните его и выйдите: 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 app_name Перейдем к написанию самой задачи: @task('copy-nginx-stub', ['on' => 'local']) scp -P{{ $production_port }} -r ./stubs/nginx.conf {{ $production_host }}:/etc/nginx/sites-available/{{ $application_name }}.conf @endtask Эта задача будет выполняться на нашем локальном компьютере, а не на удаленном сервере. Мы указываем это, используя . 'on' => 'local' И не забудьте обновить директиву необходимыми переменными: @setup @setup $application_name = 'your-application-name'; $production_port = 22; $production_host = '[email protected]'; @endsetup Четвертая и последняя задача обновит заполнители, чтобы мы могли правильно обслуживать приложение: 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 Обратите внимание на команду . Это связано с тем, что каждая задача выполняется отдельно, поэтому она всегда запускается из домашнего каталога удаленного сервера. cd Мы уже создали символическую ссылку при установке Nginx, сейчас нам не нужно об этом беспокоиться. И мы закончили с этим разделом! Ваш скрипт должен выглядеть так: @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-ключа Теперь, когда мы настроили Nginx и он готов обслуживать наше приложение, нам нужно сгенерировать ключи SSH и добавить открытый ключ в GitHub, чтобы мы могли получить частные репозитории. Для этого мы будем использовать , поэтому прежде чем начать, вам необходимо . GitHub REST API создать токен При создании токена убедитесь, что вы выбрали только область «admin:public_key». Теперь, когда вы создали свой токен, давайте начнем с определения некоторых переменных: @setup $ssh_key = '~/.ssh/id_rsa_github'; $github_api_key = 'your-github-token'; $email = '[email protected]'; @endsetup На этом этапе вам может быть интересно узнать, какие шаги входят в этот процесс. Ну, мы можем разбить его на два этапа: Генерация SSH-ключей Скопируйте открытый ключ на GitHub. Еще раз об этом процессе и будет наша история: @story('setup-ssh-keys') generate-ssh-keys add-ssh-keys-to-github @endstory Первую задачу, , можно выполнить с помощью одной команды: 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-ключи, мы можем добавить открытый ключ в GitHub с помощью API GitHub. Это можно сделать одним запросом: @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 Вот и все! Если вы посетите настройки разработчика GitHub, вы должны увидеть только что созданный ключ. Объединив эти два раздела, ваш окончательный сценарий должен выглядеть следующим образом: @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 Заключение Мы узнали, как использовать для автоматизации типичных задач. Это мощный инструмент с еще большими возможностями, чем мы здесь рассмотрели. Не ограничивайтесь простым развертыванием приложений; может автоматизировать команду терминала, буквально всё, что приходит в голову. Envoy Envoy ЛЮБУЮ В следующий раз, когда вы обнаружите, что повторяете одни и те же команды, подумайте об их использовании, я обещаю вам, что он делает гораздо больше, чем CI/CD 😛😛