Как автоматически развертывать приложения Laravel с помощью Deployer в Ubuntu 16.04

Вступление

Laravel - это веб-инфраструктура PHP с открытым исходным кодом, предназначенная для упрощения общих задач веб-разработки, таких как аутентификация, маршрутизация и кэширование. Deployer - это инструмент развертывания PHP с открытым исходным кодом с готовой поддержкой ряда популярных платформ, включая Laravel, CodeIgniter, Symfony и Zend Framework.

Deployer автоматизирует развертывание путем клонирования приложения из репозитория Git на сервер, установки зависимостей с помощью Composer и настройки приложения, так что вам не придется делать это вручную. Это позволяет тратить больше времени на разработку, а не на загрузку и настройку, и позволяет выполнять развертывание чаще.

В этом руководстве вы автоматически развернете приложение Laravel без каких-либо простоев. Для этого вы подготовите локальную среду разработки, из которой вы будете развертывать код, а затем сконфигурируете производственный сервер с Nginx и базой данных MySQL для обслуживания приложения.

Предпосылки

Прежде чем начать это руководство, вам понадобится следующее:

Шаг 1 - Настройка вашей локальной среды разработки

Поскольку вы будете создавать и развертывать приложение с локального компьютера, начните с настройки локальной среды разработки. Deployer будет контролировать весь процесс развертывания с вашего локального компьютера, поэтому начните с его установки.

На вашем * локальном компьютере * откройте терминал и загрузите установщик Deployer, используя + curl +:

curl -LO https://deployer.org/deployer.phar

Затем запустите короткий PHP-скрипт, чтобы убедиться, что установщик соответствует хешу SHA-1 для последнего установщика, найденного на Deployer - страница загрузки. Замените выделенное значение последним хешем:

php -r "if (hash_file('sha1', 'deployer.phar') === '') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('deployer.phar'); } echo PHP_EOL;"
OutputInstaller verified

Сделать Deployer доступным для всей системы. Обратите внимание, что если вы используете Windows или macOS на локальном компьютере, вам может потребоваться создать каталог + / usr / local / bin / dep + перед выполнением этой команды:

sudo mv deployer.phar /usr/local/bin/dep

Сделайте его исполняемым:

sudo chmod +x /usr/local/bin/dep

Затем создайте проект Laravel на вашем * локальном компьютере *:

composer create-project --prefer-dist laravel/laravel  "5.5.*"

Вы установили все необходимое программное обеспечение на свой локальный компьютер. Имея это в виду, мы перейдем к созданию Git-репозитория для приложения.

Шаг 2 - Подключение к вашему удаленному Git-репозиторию

Deployer был разработан, чтобы позволить пользователям развертывать код из любого места. Чтобы разрешить эту функцию, пользователям необходимо отправить код в Интернет-хранилище, из которого Deployer затем скопирует код на рабочий сервер. Мы будем использовать Git, систему контроля версий с открытым исходным кодом, для управления исходным кодом приложения Laravel. Вы можете подключиться к серверу Git по протоколу SSH, и для этого вам нужно сгенерировать ключи SSH. Это более безопасно, чем аутентификация на основе паролей, и позволяет вам не вводить пароль перед каждым развертыванием.

Выполните следующую команду на вашем * локальном компьютере *, чтобы сгенерировать ключ SSH. Обратите внимание, что + -f + указывает имя файла ключа, и вы можете заменить его своим именем. Он сгенерирует пару ключей SSH (с именами ++ и + .pub +) в папку + ~ / .ssh / +.

ssh-keygen -t rsa -b 4096 -f  ~/.ssh/

Возможно, у вас есть больше ключей SSH на вашем локальном компьютере, поэтому настройте клиент SSH, чтобы знать, какой закрытый ключ SSH использовать при подключении к вашему Git-серверу.

Создайте файл конфигурации SSH * на своем локальном компьютере *:

touch ~/.ssh/config

Откройте файл и добавьте ярлык на ваш сервер Git. Он должен содержать директиву + HostName + (указывающую на имя хоста вашего сервера Git) и директиву + IdentityFile + (указывающую на путь к файлу только что созданного ключа SSH:

~ / .Ssh / конфигурации

Host
   HostName
   IdentityFile ~/.ssh/

Сохраните и закройте файл, а затем ограничьте его разрешения:

chmod 600 ~/.ssh/config

Теперь ваш SSH-клиент будет знать, какой закрытый ключ использовать для подключения к Git-серверу.

Отобразите содержимое файла с открытым ключом с помощью следующей команды:

cat ~/.ssh/.pub

Скопируйте вывод и добавьте открытый ключ на ваш Git-сервер.

Если вы используете хостинг Git, ознакомьтесь с его документацией о том, как добавить ключи SSH в свою учетную запись:

Теперь вы сможете подключиться к вашему Git-серверу с вашей локальной машины. Проверьте соединение с помощью следующей команды:

ssh -T

Если эта команда приводит к ошибке, убедитесь, что вы правильно добавили свои ключи SSH, обратившись к документации службы Git-хостинга, и попробуйте подключиться снова.

Прежде чем помещать приложение в удаленный репозиторий Git и развертывать его, давайте сначала настроим рабочий сервер.

Шаг 3 - Настройка пользователя Deployer

Deployer использует протокол SSH для безопасного выполнения команд на сервере. По этой причине первым шагом к настройке рабочего сервера будет создание пользователя, которого Deployer сможет использовать для входа и выполнения команд на вашем сервере через SSH.

Войдите на свой сервер LEMP с пользователем не-root sudo и создайте нового пользователя с именем «* deployer *» с помощью следующей команды:

sudo adduser deployer

Laravel нужны некоторые доступные для записи каталоги для хранения кэшированных файлов и загрузок, поэтому каталоги, созданные пользователем * deployer *, должны быть доступны для записи на веб-сервере Nginx. Добавьте пользователя в группу * www-data *, чтобы сделать это:

sudo usermod -aG www-data deployer

Разрешение по умолчанию для файлов, созданных пользователем * deployer *, должно быть + 644 + для файлов и + 755 + для каталогов. Таким образом, пользователь * deployer * сможет читать и записывать файлы, а группа и другие пользователи смогут их читать.

Сделайте это, установив umask по умолчанию для * deployer * в + 022 +:

sudo chfn -o umask=022 deployer

Мы будем хранить приложение в каталоге + / var / www / html / +, поэтому измените владельца каталога на пользователя * deployer * и группу * www-data *.

sudo chown deployer:www-data /var/www/html

Пользователь * deployer * должен иметь возможность изменять файлы и папки в каталоге + / var / www / html +. Учитывая это, все новые файлы и подкаталоги, созданные в каталоге + / var / www / html, должны наследовать идентификатор группы папки (* www-data *). Для этого установите идентификатор группы в этом каталоге с помощью следующей команды:

sudo chmod g+s /var/www/html

Deployer будет клонировать репозиторий Git на рабочий сервер с использованием SSH, поэтому вы хотите убедиться, что соединение между вашим сервером LEMP и сервером Git является безопасным. Мы будем использовать тот же подход, который мы использовали для нашей локальной машины, и мы сгенерируем SSH-ключ для пользователя * deployer *.

Переключитесь на пользователя * deployer * на вашем сервере:

su - deployer

Затем сгенерируйте пару ключей SSH как пользователь * deployer *. На этот раз вы можете принять имя файла ключей SSH по умолчанию:

ssh-keygen -t rsa -b 4096

Показать открытый ключ:

cat ~/.ssh/id_rsa.pub

Скопируйте открытый ключ и добавьте его на свой Git-сервер, как это делалось на предыдущем шаге.

Ваш локальный компьютер также будет взаимодействовать с сервером по SSH, поэтому вы должны сгенерировать ключи SSH для пользователя * deployer * на локальном компьютере и добавить открытый ключ на сервер.

На вашем * локальном компьютере * выполните следующую команду. Не стесняйтесь заменить имя файла на ваш выбор:

ssh-keygen -t rsa -b 4096 -f  ~/.ssh/

Скопируйте вывод следующей команды, который содержит открытый ключ:

cat ~/.ssh/.pub

На * вашем сервере * как пользователь * deployer * выполните следующее:

nano ~/.ssh/authorized_keys

Вставьте открытый ключ в редактор и нажмите + CTRL-X +, + Y +, затем + ENTER +, чтобы сохранить и выйти.

Ограничьте права доступа к файлу:

chmod 600 ~/.ssh/authorized_keys

Теперь переключитесь обратно на пользователя sudo:

exit

Теперь ваш сервер может подключаться к серверу Git, и вы можете войти на сервер с пользователем * deployer * с вашего локального компьютера.

Войдите с локального компьютера на сервер как пользователь * deployer *, чтобы проверить соединение:

ssh deployer@  -i ~/.ssh/

После того, как вы вошли в систему как * deployer *, также проверьте соединение между вашим сервером и сервером Git:

ssh -T

Наконец, выйдите из сервера:

exit

Отсюда мы можем перейти к настройке Nginx и MySQL на нашем веб-сервере.

Шаг 4 - Настройка Nginx

Теперь мы готовы настроить веб-сервер, который будет обслуживать приложение. Это потребует настройки корневого каталога и структуры каталогов, которые мы будем использовать для хранения файлов Laravel. Мы настроим Nginx для обслуживания наших файлов из каталога + / var / www / laravel +.

Во-первых, нам нужно создать конфигурацию блока https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-server-blocks-virtual-hosts-on-ubuntu-16-04. файл] для нового сайта.

Войдите на сервер как пользователь sudo и создайте новый файл конфигурации. Не забудьте заменить своим доменным именем:

sudo nano /etc/nginx/sites-available/

Добавьте блок + server + в начало файла конфигурации:

example.com ’> / etc / nginx / sites-available /

server {
       listen 80;
       listen [::]:80;

       root /var/www/html//current/public;
       index index.php index.html index.htm index.nginx-debian.html;

       server_name  www.;
}

Две директивы + listen + в верхней части указывают Nginx, какие порты прослушивать, а директива + + root + определяет корень документа, в который будет установлен Laravel. `+ Current / public + в пути к корневому каталогу является символической ссылкой, указывающей на последний выпуск приложения. Добавляя директиву + index, мы говорим Nginx обслуживать любые файлы` + index.php`, прежде чем искать их HTML-аналоги при запросе расположения каталога. За директивой + server_name + должен следовать ваш домен и любые его псевдонимы.

Мы также должны изменить способ обработки запросов Nginx. Это делается с помощью директивы + try_files +. Мы хотим, чтобы он сначала попытался обработать запрос как файл, и, если он не может найти файл с правильным именем, он должен попытаться обработать индексный файл по умолчанию для каталога, соответствующего запросу. В противном случае он должен передать запрос в файл + index.php + в качестве параметра запроса.

example.com ’> / etc / nginx / sites-available /

server {
       listen 80;
       listen [::]:80;

       root /var/www/html//current/public;
       index index.php index.html index.htm index.nginx-debian.html;

       server_name  www.;

       location / {
               try_files $uri $uri/ /index.php?$query_string;
       }

Далее нам нужно создать блок, который обрабатывает фактическое выполнение любых файлов PHP. Это будет применяться ко всем файлам, которые заканчиваются на .php. Он попробует сам файл, а затем попытается передать его в качестве параметра в файл + index.php +.

Мы установим директивы + fastcgi +, чтобы указать Nginx использовать фактический путь приложения (разрешенный после перехода по символической ссылке) вместо символической ссылки. Если вы не добавите эти строки в конфигурацию, путь, по которому будут кэшироваться символьные точки ссылки, означает, что старая версия вашего приложения будет загружена после развертывания. Без этих директив вам пришлось бы вручную очищать кеш после каждого развертывания, и запросы к вашему приложению потенциально могли завершиться ошибкой. Кроме того, директива + fastcgi_pass + гарантирует, что Nginx использует сокет, который php7-fpm использует для связи, и что файл + index.php + используется в качестве индекса для этих операций.

example.com ’> / etc / nginx / sites-available /

server {
       listen 80;
       listen [::]:80;

       root /var/www/html//current/public;
       index index.php index.html index.htm index.nginx-debian.html;

       server_name  www.;

       location / {
               try_files $uri $uri/ /index.php?$query_string;
       }


       location ~ \.php$ {







       }

Наконец, мы хотим убедиться, что Nginx не разрешает доступ к каким-либо скрытым файлам + .htaccess +. Мы сделаем это, добавив еще один блок местоположения, называемый + location ~ / \. Ht +, и внутри этого блока директиву, определяющую + deny all; +.

После добавления этого последнего блока местоположения файл конфигурации будет выглядеть так:

example.com ’> / etc / nginx / sites-available /

server {
       listen 80;
       listen [::]:80;

       root /var/www/html//current/public;
       index index.php index.html index.htm index.nginx-debian.html;

       server_name  www.;

       location / {
               try_files $uri $uri/ /index.php?$query_string;
       }


       location ~ \.php$ {
               include snippets/fastcgi-php.conf;

               fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
               fastcgi_param DOCUMENT_ROOT $realpath_root;

               fastcgi_pass unix:/run/php/php7.0-fpm.sock;

       }

       location ~ /\.ht {
               deny all;
       }

}

Сохраните и закройте файл (+ CTRL-X +, + Y +, затем + ENTER +), а затем включите новый блок сервера, создав символическую ссылку на каталог + sites-enabled +:

sudo ln -s /etc/nginx/sites-available/ /etc/nginx/sites-enabled/

Проверьте файл конфигурации на наличие синтаксических ошибок:

sudo nginx -t

Если вы видите какие-либо ошибки, вернитесь и перепроверьте файл, прежде чем продолжить.

Перезапустите Nginx, чтобы внести необходимые изменения:

sudo systemctl restart nginx

Сервер Nginx настроен. Далее мы настроим базу данных MySQL приложения.

Шаг 5 - Настройка MySQL

После установки MySQL по умолчанию создает пользователя * root *. Однако этот пользователь имеет неограниченные привилегии, поэтому использование пользователя * root * для базы данных вашего приложения является плохой практикой безопасности. Вместо этого мы создадим базу данных для приложения с выделенным пользователем.

Войдите в консоль MySQL как * root *:

mysql -u root -p

Это попросит вас ввести пароль * root *.

Далее создайте новую базу данных для приложения:

CREATE DATABASE  DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Затем создайте новую базу данных пользователя. В целях данного руководства мы будем называть этого пользователя ` с паролем `, хотя вам следует заменить пароль надежным паролем по вашему выбору.

CREATE USER ''@'localhost' IDENTIFIED BY '';

Предоставьте пользователю права доступа к базе данных:

GRANT ALL ON .* TO ''@'localhost';

Далее перезагрузите привилегии:

FLUSH PRIVILEGES;

И, наконец, выход из консоли MySQL:

EXIT;

База данных и пользователь вашего приложения теперь настроены, и вы почти готовы к первому развертыванию.

Шаг 6 - Развертывание приложения

Итак, вы настроили все инструменты и программы, необходимые для работы Deployer. Все, что осталось сделать перед запуском первого развертывания, - это завершить настройку приложения Laravel и самого Deployer, а также инициализировать и отправить приложение в удаленный репозиторий Git.

Откройте терминал на вашем * локальном компьютере * и измените рабочий каталог на папку приложения с помощью следующей команды:

cd

Из этого каталога выполните следующую команду, которая создает файл с именем + deploy.php + в папке ++, который будет содержать информацию о конфигурации и задачи для развертывания:

dep init -t Laravel

Затем откройте файл + deploy.php + в предпочитаемом вами текстовом редакторе или IDE. Третья строка содержит PHP-скрипт, который содержит необходимые задачи и конфигурации для развертывания приложения Laravel:

deploy.php

<?php
namespace Deployer;

require 'recipe/laravel.php';

. . .

Ниже приведены некоторые поля, которые вы должны отредактировать для соответствия вашей конфигурации:

  • Под + // Project Name + добавьте имя вашего проекта Laravel.

  • Под + // Project Repository + добавьте ссылку на ваш Git-репозиторий.

  • В разделе + // Hosts + добавьте IP-адрес или доменное имя вашего сервера в директиву + host () +, имя вашего пользователя Deployer (* deployer * в наших примерах) к + user () + `директива. Вам также следует добавить ключ SSH, созданный на шаге 3, в директиву `+ identifFile () +. Наконец, вы должны добавить путь к файлу папки, содержащей ваше приложение.

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

deploy.php

...
// Project name
set('application', '');

// Project repository
set('repository', '');

. . .

// Hosts

host('')

   ->identityFile('~/.ssh/')
   ->set('deploy_path', '/var/www/html/');

Далее, закомментируйте последнюю строку файла, + before ('deploy: symlink', 'artisan: migrate'); +. Эта строка указывает Deployer на автоматический запуск миграций базы данных, и, комментируя его, мы отключаем его. Если вы не закомментируете это, развертывание завершится неудачей, поскольку для этой строки требуются соответствующие учетные данные базы данных на сервере, которые можно добавить только с помощью файла, который будет создан во время первого развертывания:

deploy.php

...
// Migrate database before symlink new release.

//before('deploy:symlink', 'artisan:migrate');

Прежде чем мы сможем развернуть проект, мы должны сначала отправить его в удаленный репозиторий Git.

На вашем * локальном компьютере * измените рабочий каталог на папку вашего приложения:

cd

Запустите следующую команду в вашем каталоге ++, чтобы инициализировать Git-репозиторий в папке проекта:

git init

Затем добавьте все файлы проекта в хранилище:

git add .

Зафиксируйте изменения:

git commit -m ''

Добавьте ваш Git-сервер в локальный репозиторий с помощью следующей команды. Обязательно замените выделенный текст URL-адресом вашего собственного удаленного репозитория:

git remote add origin

Отправьте изменения в удаленный репозиторий Git:

git push origin master

Наконец, запустите ваше первое развертывание, используя команду + dep +:

dep deploy

Если все идет хорошо, вы должны увидеть такой вывод с + Успешно развернуто! + В конце:

Deployer's output✈︎ Deploying master on
✔ Executing task deploy:prepare
✔ Executing task deploy:lock
✔ Executing task deploy:release
➤ Executing task deploy:update_code
✔ Ok
✔ Executing task deploy:shared
✔ Executing task deploy:vendors
✔ Executing task deploy:writable
✔ Executing task artisan:storage:link
✔ Executing task artisan:view:clear
✔ Executing task artisan:cache:clear
✔ Executing task artisan:config:cache
✔ Executing task artisan:optimize
✔ Executing task deploy:symlink
✔ Executing task deploy:unlock
✔ Executing task cleanup
Successfully deployed!

Следующая структура будет создана на вашем сервере внутри каталога + / var / www / html / +:

├── .dep
├── current -> releases/1
├── releases
│   └── 1
└── shared
   ├── .env
   └── storage

Проверьте это, выполнив следующую команду * на вашем сервере *, которая выведет список файлов и каталогов в папке:

ls /var/www/html/
Outputcurrent  .dep  releases  shared

Вот что содержит каждый из этих файлов и каталогов:

  • Каталог + Releases + содержит выпуски развертывания приложения Laravel.

  • + current + - символическая ссылка на последний выпуск.

  • Каталог + .dep + содержит специальные метаданные для Deployer.

  • Каталог + shared + содержит файл конфигурации + .env + и каталог + storage +, который будет связан с каждым выпуском.

Однако приложение пока не будет работать, поскольку файл + .env + пуст. Этот файл используется для хранения важных конфигураций, таких как ключ приложения - случайная строка, используемая для шифрования. Если он не установлен, ваши пользовательские сеансы и другие зашифрованные данные не будут защищены. В приложении есть файл + .env + на вашем * локальном компьютере *, но файл Laravel + .gitignore + исключает его из репозитория Git, поскольку хранение конфиденциальных данных, таких как пароли, в репозитории Git не является хорошей идеей, а также, приложение требует различных настроек на вашем сервере. Файл + .env + также содержит настройки подключения к базе данных, поэтому мы отключили миграцию базы данных для первого развертывания.

Давайте настроим приложение на вашем сервере.

Войдите на свой сервер как пользователь * deployer *:

ssh deployer@  -i ~/.ssh/

Запустите следующую команду * на вашем сервере *, скопируйте и вставьте локальный файл + .env + в редактор:

nano /var/www/html//shared/.env

Прежде чем вы сможете сохранить его, необходимо внести некоторые изменения. Установите + APP_ENV + в + production,` + APP_DEBUG` в + false,` + APP_LOG_LEVEL` в + error + и не забудьте заменить базу данных, пользователя базы данных и пароль своими. Вам также следует заменить ++ своим собственным доменом:

/var/www/html/laravel-app/shared/.env

APP_NAME=Laravel
APP_ENV=
APP_KEY=base64:cA1hATAgR4BjdHJqI8aOj8jEjaaOM8gMNHXIP8d5IQg=
APP_DEBUG=
APP_LOG_LEVEL=
APP_URL=http://

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=
DB_USERNAME=
DB_PASSWORD=

BROADCAST_DRIVER=log
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

Сохраните файл и закройте редактор.

Теперь раскомментируйте последнюю строку файла + deploy.php + на вашем локальном компьютере:

deploy.php

...
// Migrate database before symlink new release.

before('deploy:symlink', 'artisan:migrate');

Чтобы убедиться, что эта конфигурация работает, разверните приложение еще раз. Запустите следующую команду * на вашем локальном компьютере *:

dep deploy

Теперь ваше приложение будет работать правильно. Если вы посетите доменное имя вашего сервера (), вы увидите следующую целевую страницу:

изображение: https: //assets.digitalocean.com/laraveldeployer/deployerimg.png [целевая страница Laravel]

Вам не нужно редактировать файл + .env + на вашем сервере перед всеми развертываниями. Типичное развертывание не так сложно, как первое, и выполняется всего несколькими командами.

Шаг 7 - Запуск типичного развертывания

В качестве последнего шага в этом разделе будет описан простой процесс развертывания, который вы можете использовать ежедневно.

Начните с изменения приложения перед повторным развертыванием. Например, вы можете добавить новый маршрут в файл + routs / web.php +:

/routes/web.php

<?php

. . .

Route::get('/', function () {
   return view('welcome');
});

Передайте эти изменения:

git commit -am 'Your commit message.'

Отправьте изменения в удаленный репозиторий Git:

git push origin master

И, наконец, разверните приложение:

dep deploy

Вы успешно развернули приложение на своем сервере.

Заключение

Вы настроили свой локальный компьютер и сервер для простого развертывания приложения Laravel с нулевым временем простоя. Статья охватывает только основы Deployer и имеет много полезных функций. Вы можете развернуть на нескольких серверах одновременно и создавать задачи; Например, вы можете указать задачу резервного копирования базы данных перед миграцией. Если вы хотите узнать больше о функциях Deployer, вы можете найти больше информации в документации Deployer.

Related