Деплой Laravel проекта с Envoy
Перевод: 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