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

Объяснение Laravel

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

Введение

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

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

Пререквизиты

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

  • Один сервер Ubuntu 16.04 с пользователем не root с привилегиями sudo, как описано в руководстве «Начальная настройка сервера Ubuntu 16.04».

  • Установите стек LEMP, как описано в руководстве «Как установить Linux, Nginx, MySQL, PHP (стек LEMP) в Ubuntu 16.04».

  • PHP, Composer и Git установлены на вашем сервере, следуя шагам 1 и 2 в статье «Как установить и использовать Composer на Ubuntu 16.04».

  • Пакеты php-xml и php-mbstring, установленные на вашем сервере. Установите их, выполнив: sudo apt-get install php7.0-mbstring php7.0-xml.

  • <#Git server. Вы можете использовать такие сервисы, как GitLab, Bitbucket или GitHub. GitLab и Bitbucket предлагают частные репозитории бесплатно, а GitHub предлагает частные репозитории по цене от $7 в месяц. Кроме того, вы можете создать частный Git-сервер, следуя руководству Как установить частный Git-сервер на VPS.

  • Доменное имя, указывающее на ваш сервер. Учебник DigitalOcean «Как установить имя хоста» поможет вам настроить это.

  • Composer и Git также установлены на вашем локальном компьютере. Точный способ установки зависит от вашей локальной операционной системы. Инструкции по установке Git доступны на странице загрузок проекта Git, а скачать Composer можно непосредственно с сайта проекта Composer.

Шаг 1 — Установка приложений Laravel на локальном компьютере

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


Примечание: Если вы используете Windows на локальной машине, вам следует использовать эмулятор BASH (например, Git bash) для выполнения всех локальных команд.
{: .alert .alert—info}


curl -LO https://deployer.org/deployer.phar
Войдите в полноэкранный режим Выход из полноэкранного режима

Затем введите команду

php -r "if (hash_file('sha1', 'deployer.phar') === '35e8dcd50cf7186502f603676b972065cb68c129') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('deployer.phar'); } echo PHP_EOL;"
Войдите в полноэкранный режим Выход из полноэкранного режима

И на выходе получается :

Installer verified
Войдите в полноэкранный режим Выход из полноэкранного режима

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

sudo mv deployer.phar /usr/local/bin/dep
Войдите в полноэкранный режим Выход из полноэкранного режима

Сделайте файл deployer.phar исполняемым:

sudo chmod +x /usr/local/bin/dep
Войдите в полноэкранный режим Выход из полноэкранного режима

Далее необходимо создать приложение Laravel на Local компьютере / PC или MAC.

В приведенном здесь примере устанавливается Laravel версии 5.5

composer create-project --prefer-dist laravel/laravel laravel-app "5.5.*"
Войдите в полноэкранный режим Выход из полноэкранного режима

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

Подключение к удаленному Git-репозиторию

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

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

ssh-keygen -t rsa -b 4096 -f  ~/.ssh/gitkey
Войдите в полноэкранный режим Выход из полноэкранного режима

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

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

touch ~/.ssh/config
Войдите в полноэкранный режим Выход из полноэкранного режима

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

Host mygitserver.com
    HostName mygitserver.com
    IdentityFile ~/.ssh/gitkey
Войдите в полноэкранный режим Выход из полноэкранного режима

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

chmod 600 ~/.ssh/config
Войдите в полноэкранный режим Выход из полноэкранного режима

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

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

cat ~/.ssh/gitkey.pub
Войдите в полноэкранный режим Выход из полноэкранного режима

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

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

  • Добавьте ключи SSH в GitHub
  • Добавьте ключи SSH в GitLab
  • Добавьте ключи SSH в Bitbucket

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

ssh -T git@mygitserver.com
Войдите в полноэкранный режим Выход из полноэкранного режима

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

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

Настройка пользователей развертывания

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

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

sudo adduser deployer
Войдите в полноэкранный режим Выход из полноэкранного режима

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

sudo usermod -aG www-data deployer
Войдите в полноэкранный режим Выход из полноэкранного режима

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

Для этого установите стандартный umask deploy на 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
Войдите в полноэкранный режим Выход из полноэкранного режима

Программа развертывания будет клонировать 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 на локальном компьютере и добавить открытый ключ на сервер.

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

ssh-keygen -t rsa -b 4096 -f  ~/.ssh/deployerkey
Войдите в полноэкранный режим Выход из полноэкранного режима

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

cat ~/.ssh/deployerkey.pub
Войдите в полноэкранный режим Выход из полноэкранного режима

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

nano ~/.ssh/authorized_keys
Войдите в полноэкранный режим Выход из полноэкранного режима

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

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

chmod 600 ~/.ssh/authorized_keys
Войдите в полноэкранный режим Выход из полноэкранного режима

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

exit
Войдите в полноэкранный режим Выход из полноэкранного режима

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

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

ssh deployer@your_server_ip  -i ~/.ssh/deployerkey
Войдите в полноэкранный режим Выход из полноэкранного режима

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

ssh -T git@mygitserver.com
Войдите в полноэкранный режим Выход из полноэкранного режима

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

exit
Войдите в полноэкранный режим Выход из полноэкранного режима

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

Настройка Nginx

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

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

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

sudo nano /etc/nginx/sites-available/example.com
Войдите в полноэкранный режим Выход из полноэкранного режима

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

#example.com '>/etc/nginx/sites-available/example.com

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

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

        server_name example.com www.example.com;
}
Войдите в полноэкранный режим Выход из полноэкранного режима

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

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

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

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

        server_name example.com www.example.com;

        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/example.com
server {
        listen 80;
        listen [::]:80;

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

        server_name example.com www.example.com;

        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;

        }
}
Войдите в полноэкранный режим Выход из полноэкранного режима

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

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

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

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

        server_name example.com www.example.com;

        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/example.com /etc/nginx/sites-enabled/
Войдите в полноэкранный режим Выход из полноэкранного режима

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

sudo nginx -t
Войдите в полноэкранный режим Выход из полноэкранного режима

Если вы видите какие-либо ошибки, вернитесь назад и перепроверьте свой файл, прежде чем продолжить. Перезапустите Nginx для внесения необходимых изменений:

sudo systemctl restart nginx
Войдите в полноэкранный режим Выход из полноэкранного режима

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

Конфигурирование MySQL

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

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

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *