Деплой 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