Laravel Envoy là một công cụ để thực thi các tác vụ phổ biến mà bạn chạy trên các máy chủ từ xa của mình.
Tôi tin rằng Envoy
bị đánh giá thấp; Tôi không thấy nó được sử dụng thường xuyên mặc dù tôi luôn thấy nó cực kỳ hữu ích. Trong bài viết này, chúng ta sẽ khám phá cách Envoy
có thể giúp tăng năng suất của bạn🚀.
Laravel Envoy không dành riêng cho các nhà phát triển Laravel hay giới hạn cho các dự án Laravel, ai cũng có thể sử dụng ❤️.
Đầu tiên, hãy thảo luận về hai khái niệm chính trong Envoy
:
Nhiệm vụ : Điều này thể hiện một hành động cụ thể như cập nhật máy chủ hoặc sao chép kho lưu trữ.
Câu chuyện : là tập hợp các Nhiệm vụ.
Đó là tất cả những gì bạn cần biết bây giờ; bạn luôn có thể đọc về tất cả các tính năng trong tài liệu .
Trong bài viết này, chúng tôi sẽ tự động hóa 2 việc mà hầu hết các nhà phát triển đều làm khi triển khai ứng dụng của họ:
Cấu hình Nginx.
Tạo khóa SSH và thêm chúng vào GitHub để có thể truy cập vào kho lưu trữ riêng tư.
Có, tôi biết, phần lớn thời gian Envoy
được sử dụng cho quy trình công việc CI/CD, nhưng nó có thể thực hiện MỌI THỨ , theo nghĩa đen.
Đầu tiên, hãy tạo một thư mục:
mkdir tuto && cd $_
$ take tuto
nếu bạn đang sử dụngzsh
.
Cài đặt Envoy
bằng cách chạy lệnh sau:
composer require laravel/envoy --dev
Hãy chắc chắn rằng bạn đã cài đặt trình soạn nhạc.
Bây giờ, hãy tạo một tệp có tên Envoy.blade.php
. Vâng, chúng ta sẽ sử dụng cú pháp Blade
, cực hay phải không?
touch Envoy.blade.php
Đó là nó! Tất cả những gì bạn cần chỉ là một kịch bản duy nhất. Nó không nhất thiết phải dành riêng cho Laravel hoặc bất kỳ dự án nào liên quan đến Laravel. Hãy bắt đầu tự động hóa! 😁
Chúng tôi có một máy chủ hoàn toàn mới và chúng tôi muốn thiết lập Nginx. Nếu chúng ta chia nhỏ quy trình, nó sẽ như thế này:
Đó chính xác là những gì chúng ta sẽ làm với Envoy
; hãy coi mỗi bước là một Task
và toàn bộ quá trình là một Story
.
Vì vậy, hãy dịch những gì chúng ta vừa nói thành một câu chuyện:
@servers(['web' => '[email protected]', 'local' => '127.0.0.1']) @story('setup-nginx') update-server install-nginx copy-nginx-stub configure-nginx @endstory
Lệnh
@servers
được sử dụng để chỉ định các máy chủ mà chúng ta sẽ chạy các tác vụ của mình sau này.
Bây giờ chúng ta có thể tiến hành xác định từng nhiệm vụ 😁
update-server
nhiệm vụ đầu tiên của chúng tôi sẽ đảm bảo rằng các gói và phần phụ thuộc của máy chủ được cập nhật:
@task('update-server', ['on' => ['web']]) echo "Updating server..." apt update && apt upgrade -y @endtask
Nhiệm vụ thứ hai install-nginx
sẽ cài đặt Nginx trên máy chủ của chúng tôi:
@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
Lưu ý rằng chúng tôi đã xóa liên kết Nginx mặc định và tạo một liên kết mới cho ứng dụng của mình, với tên đến từ biến $application_name
.
Để có thể sử dụng biến đó, bạn cần phải khai báo nó nên chúng ta cần thêm chỉ thị @setup
:
@setup $application_name = 'your-application-name'; @endsetup
Bây giờ, chúng ta có thể chuyển sang nhiệm vụ thứ ba copy-nginx-stub
. Trong trường hợp của mình, mình đang triển khai một ứng dụng Laravel nên sẽ sử dụng file cấu hình Nginx do docs cung cấp, kèm theo một vài chỉnh sửa. Nếu bạn đang triển khai một ứng dụng khác, bạn có thể áp dụng khái niệm tương tự cho tệp cấu hình của riêng mình.
Trong thư mục chúng ta vừa tạo, hãy chạy lệnh sau:
mkdir stubs; nano stubs/nginx.conf
Sau đó, dán nội dung sau vào trình chỉnh sửa, lưu và thoát:
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
và app_name
hiện là phần giữ chỗ và sẽ được tự động cập nhật với các biến của chúng tôi.
Hãy chuyển sang viết nhiệm vụ:
@task('copy-nginx-stub', ['on' => 'local']) scp -P{{ $production_port }} -r ./stubs/nginx.conf {{ $production_host }}:/etc/nginx/sites-available/{{ $application_name }}.conf @endtask
Tác vụ này sẽ được thực thi trên máy cục bộ của chúng tôi thay vì máy chủ từ xa. Chúng tôi chỉ định điều này bằng cách sử dụng
'on' => 'local'
.
Và đừng quên cập nhật lệnh @setup
với các biến cần thiết:
@setup $application_name = 'your-application-name'; $production_port = 22; $production_host = '[email protected]'; @endsetup
Nhiệm vụ thứ tư và cuối cùng configure-nginx
sẽ cập nhật các phần giữ chỗ, để chúng ta có thể phục vụ ứng dụng một cách chính xác:
@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
Lưu ý lệnh
cd
. Điều này là do mỗi tác vụ được thực thi riêng biệt nên nó luôn bắt đầu từ thư mục chính của máy chủ từ xa.
Chúng tôi đã tạo liên kết tượng trưng khi cài đặt Nginx, bây giờ chúng tôi không phải lo lắng về nó.
Và chúng ta đã hoàn thành phần này! Kịch bản của bạn sẽ trông như thế này:
@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
Bây giờ chúng ta đã định cấu hình Nginx và nó đã sẵn sàng phục vụ ứng dụng của chúng ta, chúng ta cần tạo khóa SSH và thêm khóa chung vào GitHub để có thể lấy các kho lưu trữ riêng tư.
Để làm điều này, chúng tôi sẽ sử dụng API GitHub REST , vì vậy trước khi bắt đầu, bạn cần tạo mã thông báo .
Khi tạo mã thông báo, hãy đảm bảo rằng bạn chỉ chọn phạm vi "admin:public_key".
Bây giờ bạn đã tạo mã thông báo của mình, hãy bắt đầu bằng cách xác định một số biến:
@setup $ssh_key = '~/.ssh/id_rsa_github'; $github_api_key = 'your-github-token'; $email = '[email protected]'; @endsetup
Tại thời điểm này, bạn có thể thắc mắc về các bước liên quan đến quy trình này. Vâng, chúng ta có thể chia nó thành hai bước:
Tạo khóa SSH
Sao chép khóa chung vào GitHub
Một lần nữa, quá trình này sẽ là câu chuyện của chúng ta:
@story('setup-ssh-keys') generate-ssh-keys add-ssh-keys-to-github @endstory
Tác vụ đầu tiên, generate-ssh-keys
, có thể được thực hiện bằng cách chạy một lệnh duy nhất:
@task('generate-ssh-keys', ['on' => ['web']]) echo "Generating ssh keys..." ssh-keygen -t ed25519 -f {{ $ssh_key }} -N '' -q -C "{{ $email }}" @endtask
Khi chúng tôi đã tạo khóa SSH, chúng tôi có thể thêm khóa chung vào GitHub bằng API GitHub. Điều này có thể được thực hiện với một yêu cầu duy nhất:
@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
Và thế là xong! Nếu bạn truy cập cài đặt dành cho nhà phát triển GitHub, bạn sẽ thấy khóa mới tạo của mình.
Bằng cách kết hợp hai phần, tập lệnh cuối cùng của bạn sẽ trông như thế này:
@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
Chúng tôi đã học cách sử dụng Envoy
để tự động hóa các tác vụ thông thường. Đó là một công cụ mạnh mẽ với nhiều khả năng hơn những gì chúng tôi đã khám phá ở đây. Đừng giới hạn bản thân chỉ triển khai các ứng dụng của mình; Envoy
có thể tự động hóa BẤT KỲ lệnh đầu cuối nào, theo nghĩa đen là bất cứ điều gì bạn nghĩ đến.
Lần tới khi bạn thấy mình lặp lại các lệnh tương tự, hãy cân nhắc sử dụng nó, tôi hứa với bạn rằng nó còn hiệu quả hơn CI/CD 😛😛