• Час читання ~7 хв
  • 30.06.2023

Laravel Envoy - це інструмент для виконання поширених завдань, які ви виконуєте на ваших віддалених серверах.

Я вважаю, що Envoy це недооцінено, я не бачу, щоб його використовували дуже часто, хоча я завжди вважав його надзвичайно корисним. У цій статті ми розглянемо, як Envoy це може допомогти підвищити вашу продуктивність🚀.

Laravel Envoy не є ексклюзивним для розробників Laravel або обмежується проектами Laravel, кожен може використовувати його ❤️.

По-перше, давайте обговоримо два ключових поняття в :

  1. Tasks: which represents a specific action like updating the server or cloning a repository.
  2. Stories: which is a collection of Tasks.

Це все, що вам потрібно знати на даний момент, ви завжди можете прочитати про всі функції в Envoyдокументах.

Що ми автоматизуємо?

У цій статті ми автоматизуємо 2 речі, які більшість розробників роблять під час розгортання своєї програми:

  1. Configuring Nginx.
  2. Generating SSH keys and adding them to GitHub to be able to access private repositories.

Так, я знаю, що більшість випадків Envoy використовується для робочих процесів CI/CD, але він може робити ВСЕ, буквально.

Налаштування Envoy Спочатку

давайте створимо каталог

$ take tuto if you are using zsh.

ВстановитиEnvoy, запустивши таку команду:

composer require laravel/envoy --dev

Переконайтеся, що у вас встановлено композитор.

Тепер створіть файл з назвою Envoy.blade.php. Так, ми будемо використовувати Blade синтаксис, супер круто, правда?

Це воно! Все, що вам потрібно, це єдиний сценарій. Це не повинно бути специфічним для Laravel або будь-якого проекту, пов'язаного з Laravel. Приступаємо до автоматизації! 😁

Налаштуйте Nginx У нас є абсолютно новий сервер, і ми хочемо налаштувати Nginx

. Якщо ми розіб'ємо процес, це буде так:

  1. Update the server
  2. Install Nginx
  3. Налаштуйте Nginx У нас є абсолютно новий сервер, і ми хочемо налаштувати Nginx

Це саме те, що ми будемо робити з Envoy, думайте про кожен крок як про , а про весь процес як про StoryTask.

Отже, давайте переведемо те, що ми щойно сказали, в історію: директива @servers використовується для визначення серверів,

@servers(['web' => '[email protected]', 'local' => '127.0.0.1'])
@story('setup-nginx')
    update-server
    install-nginx
    copy-nginx-stub
    configure-nginx
@endstory

на яких ми будемо виконувати наші завдання пізніше.

Тепер ми можемо перейти до визначення кожного завдання Наше перше завдання забезпечить актуальність пакетів та залежностей сервера:Друге завдання 😁 update-server

install-nginx встановить Nginx на нашому сервері:

@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

Зверніть увагу, що ми видалили посилання Nginx за замовчуванням і створили нове для нашої програми, ім'я якого походить від $application_name змінної.

Щоб мати можливість використовувати цю змінну, вам потрібно оголосити її, тому нам потрібно включити директиву@setup:

@setup
    $application_name = 'your-application-name';
@endsetup

Тепер ми можемо перейти до третього завдання copy-nginx-stub. У моєму випадку я розгортання програми Laravel, тому я буду використовувати файл конфігурації Nginx, наданий документами, з невеликими налаштуваннями. Якщо ви розгортаєте іншу програму, ви можете застосувати ту саму концепцію до власного файлу конфігурації.

У каталозі, який ми щойно створили, запустіть таку команду:

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

І не забудьте оновити директиву необхідними змінними:Четверте і останнє завдання configure-nginx оновить заповнювачі, щоб ми могли правильно обслуговувати додаток:

@setup
    $application_name = 'your-application-name';
    $production_port = 22;
    $production_host = '[email protected]';
@endsetup

@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

Зверніть увагу на команду @setup 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

На цьому етапі вам може бути цікаво про кроки, пов'язані з цим процесом. Ну, ми можемо розбити це на два кроки:Знову цей процес буде нашою історією:Перше завдання generate-ssh-keys, можна виконати, запустивши одну команду:

  1. Generate SSH keys
  2. Copy the public key to Github

@story('setup-ssh-keys')
    generate-ssh-keys
    add-ssh-keys-to-github
@endstory

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

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

Про мене

Professional Fullstack Developer with extensive experience in website and desktop application development. Proficient in a wide range of tools and technologies, including Bootstrap, Tailwind, HTML5, CSS3, PUG, JavaScript, Alpine.js, jQuery, PHP, MODX, and Node.js. Skilled in website development using Symfony, MODX, and Laravel. Experience: Contributed to the development and translation of MODX3 i...

Про автора CrazyBoy49z
WORK EXPERIENCE
Контакти
Ukraine, Lutsk
+380979856297