Деплой Laravel проекта с Envoy

Категория: Laravel

Перевод: https://serversforhackers.com/video/deploying-with-envoy-cast

В данной статье Мы научимся использовать Larave'l Envoy чтобы справиться с размещением через SSH.

Краткое изложение команд

Мы используем Laravel's Envoy чтобы применить PHP приложение к рабочему серверу. Это создаст новую папку, клонирует хранилище (репозиторий) в неё, запустит все нужные процессы и в итоге заменит новый код на старый, чтобы Nginx и PHP - FPM смогли обслуживать новый код.

Установка

Удалённый сервер находится под IP адресом 104.236.85.162.  На нём есть пользователь deployer и я создал локальный SSH ключ чтобы подключится к нему. Ключ называется id_deployex.

Чтобы сгенерировать этот ключ я использовал следующую команду :

ssh-keygen -t ed25519 -q -N "" -C "service,user" -f ~/.ssh/id_ed25519_service_user
ssh-keygen -t ecdsa -b 521 -q -N "" -C "service,user" -f ~/.ssh/id_ecdsa_service_user
ssh-keygen -t rsa -b 4096 -C "fideloper@gmail.com" -f id_deployex

To copy that to remove server (since I'm on a Vagrant server, not my Mac, which may not have this command), I can use the following to copy the public key into the deployer user's authorized_keys file:

# Since not running on mac, we have this command
# This will ask for the user's password to log in with, and assumes
# the server allows password-based authentication
ssh-copy-id -o "PubkeyAuthentication no" deployer@104.236.85.162

Чтобы скопировать это на отдалённый сервер (поскольку я на Vagrant сервере, а не на Mac, который может не иметь этой команды), я могу использовать следующее, чтобы скопировать публично открытый ключ в authorized_keys файл пользователя deployer:

На удалённом рабочем сервере мы создали SSH ключ чтобы использовать в GitHub как Deploy Key.  Это позволяет нам переместится с рабочего сервера в хранилище Github, которое мы используем для того чтобы развернуть новый код.

# Create key, by default named "id_rsa"
ssh-keygen -t rsa -b 4096 -C "fideloper@gmail.com"

# Echo out the public key,
# so we can copy it and paste it into GitHub
cat ~/.ssh/id_rsa.pub

Затем мы может приступить к использованию Envoy с приложением Laravel.

Глобальная установка Envoy

# Install envoy globally. May need to ensure that
# the composer vendor/bin directory is in your PATH
# so the envoy command is found
composer global require "laravel/envoy=~1.0"

# fails, if the PATH variable is not set with composer's
# bin directory
which envoy
vim ~/.profile

Если which envoy тест провалится (если выдаёт no_output) отредактируйте .profile, .bashrc или то подобное подходящее для вашей системы. В этом файле мы добавим вниз следующее. Отрегулируйте путь файла как нужно для сервера разработки.

# Prepend the composer bin directory to your PATH
# This path is specific to my vagrant server
export PATH=/home/vagrant/.composer/vendor/bin:$PATH

Наконец мы можем создать envoy файл для нашего проекта:

cd /vagrant/app
vim Envoy.blade.php

Вот пример того, что мы можем использовать что бы проверить сможет ли Envoy подключиться к нашему серверу:

@servers(['web' => 'deploy-ex'])

<?php $whatever = 'hola, whatever'; ?>

@task('deploy', ['on' => 'web'])
    echo {{ $whatever }}
@endtask

Чтобы запустить это:

envoy run deploy

Теперь мы можем внедрить стратегию размещение с Envoy:

@servers(['web' => 'deploy-ex'])

<?php
$repo = 'git@github.com:Servers-for-Hackers/deploy-ex.git';
$release_dir = '/var/www/releases';
$app_dir = '/var/www/app';
$release = 'release_' . date('YmdHis');
?>

@macro('deploy', ['on' => 'web'])
    fetch_repo
    run_composer
    update_permissions
    update_symlinks
@endmacro

@task('fetch_repo')
    [ -d {{ $release_dir }} ] || mkdir {{ $release_dir }};
    cd {{ $release_dir }};
    git clone {{ $repo }} {{ $release }};
@endtask

@task('run_composer')
    cd {{ $release_dir }}/{{ $release }};
    composer install --prefer-dist;
@endtask

@task('update_permissions')
    cd {{ $release_dir }};
    chgrp -R www-data {{ $release }};
    chmod -R ug+rwx {{ $release }};
@endtask

@task('update_symlinks')
    ln -nfs {{ $release_dir }}/{{ $release }} {{ $app_dir }};
    chgrp -h www-data {{ $app_dir }};
@endtask

Запустите это и протестируйте через:

envoy run deploy

Важная команда это создание символьной ссылки, чтобы оживить новый файлы кода. Это команда 1n с использование -nfs флагов.

  • -s Создаём символическую ссылку.
  • -f Способствует созданию символической ссылку даже если файл,папка или символическая ссылка уже существует в это локации.
  • -n Если целевая папка или файл который является символической ссылкой, не следует по ней. Часто используется с флагом -f.

После этого теста, мы добавляем новый путь к app/http/routes.php, этим самым меняем код чтобы симулировать настоящий развивающие-размещающий цикл.

Route::get('/test', function()
{
    Return Request::header();
});

Обновите удалённое Github хранилище:

git add --all
git commit -m "added new test route"
git push origin master

Затем мы можем заново запустить раскрывающийся скрипт и посмотреть как он работает:

envoy run deploy

Заметки и ресурсы

Здесь находится Envoy репозиторий (https://github.com/laravel/envoy) и документация - http://laravel.com/docs/5.0/ssh#envoy-task-runner.
Создайте приложение Laravel в Vagrant:

cd /vagrant
composer create-project laravel/laravel app

Nginx Config на Vagrant и рабочем сервере (единственная разница между тестовым и рабочим сервером -  server_name значение).

server {
    listen 80;
    root /vagrant/app/public;
    index index.html index.htm index.php app.php app_dev.php;        

    # Make site accessible from ...
    server_name 192.168.22.45.xip.io vaprobash.dev;
    access_log /var/log/nginx/vagrant.com-access.log;
    error_log /var/log/nginx/vagrant.com-error.log error;

    charset utf-8;

    location / {
        try_files $uri $uri/ /app.php?$query_string /index.php?$query_string;
    }
    location = /favicon.ico { log_not_found off; access_log off; }
    location = /robots.txt { access_log off; log_not_found off; }

    error_page 404 /index.php;

    # pass the PHP scripts to php5-fpm
    # Note: .php$ is susceptible to file upload attacks
    # Consider using: "location ~ ^/(index|app|app_dev|config).php(/|$) {"
    location ~ .php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+.php)(/.+)$;
        # With php5-fpm:
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param LARA_ENV local; # Environment variable for Laravel
        fastcgi_param HTTPS off;
    }

    # Deny .htaccess file access
    location ~ /\.ht {
        deny all;
    }
}

#deploy laravel

категория: Laravel