Vse o WEB
Информация и размышления о Web технологиях

Скрипт загрузки приложения Symfony 4 на shared хостинг

Как вы все наверное знаете, после разработки приложения его необходимо разместить на хостинге. Делать это можно ручной выгрузкой по FTP c последующим выполнением всех необходимых действий на сервере, например, очистить кеш, build assets, composer install и другое. Метод этот, конечно, максимально простой в реализации и понимании - нужно просто знать, в каком месте приложения произошли изменения и что необходимо сделать после выгрузки на сервер. Но согласитесь, нет ничего приятнее, если весь этот процесс автоматизировать. В каждодневной разработке я предпочитаю использовать continuous integration (CI) системы, к примеру Jenkins или Jetbrains Teamcity. Но что если на хостинге нет возможности запускать необходимые команды через SSH окружение и даже rsync не поддерживается? С такой проблемой я столкнулся и пришлось искать выход и хотя бы простейшим способом автоматизировать процесс. Деталями реализации я и собираюсь поделиться с вами в этой статье.

Решение данной проблемы может быть следующим:

  • Выполнить все необходимые действия перед релизом (собственно билд приложения) на локальном компьютере
  • Запаковать необходимые файлы проекта и выгрузить архив на сервер по SSH
  • Распаковать архив на сервере с заменой старых файлов на новые
  • Почистить кеш приложения на сервере и удалить ненужные файлы

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

    1. Устанавливаем зависимости (опционально)

~$ composer install # or
~$ composer dump-autoload --optimize --no-dev --classmap-authoritative

 

    2. Устанавливаем зависимости для assets и билдим c с помощью webpack encore

~$ yarn install
~$ yarn encore production # генерируем финальные файлы css, js и др.

 

    3. Подготавливаем архив с файлами приложения

~$ tar -czf release.tar.gz     \
            bin             \
            config          \
            node_modules    \
            public          \
            src             \
            templates       \
            translations    \
            vendor          \
            .htaccess       \
            composer.json   \
            composer.lock

 

    4. Загружаем файлы на сервер

~$ scp release.tar.gz sshuser@example.com:/var/www/project
~$ scp ./.env sshuser@example.com:/var/www/project/.env

 

    5. Распаковываем архив на сервере, чистим кеш и удаляем ненужные нам файлы

~$ ssh sshuser@example.com "cd /var/www/project && tar -xzf blog.tar.gz && rm blog.tar.gz"
~$ ssh sshuser@example.com "cd /var/www/project && composer dump-env prod && php bin/console cache:clear --env=prod"
~$ rm release.tar.gz

 

Для удобства соберем все инструкции в bash файл и будем запускать его каждый раз, когда нужно обновить файлы на сервере. Но прежде решим проблему с вводом SSH пароля - команды scp и ssh будут каждый раз просить вводить пароль, если вы не используете ssh key.

Установим sshpass

~$ sudo apt install sshpass

 

Теперь все ssh команды запускаем через sshpass. Вынесем данные доступа к SSH и другие данные в переменные для удобства переиспользования. Получаем следующий простой скрипт:

#!/usr/bin/env bash

echo -n "SSH password: "
read password

echo "Start build ..."

dest_dir="/path/to/install/your/site/"
user="user"
host="example.com"
archive_name="release.tar.gz"
env="prod"

echo "Run composer ..."
composer install
#composer dump-autoload --optimize --no-dev --classmap-authoritative
echo "Done."

echo "Generate Fos JS routes ..."
php bin/console fos:js-routing:dump --target=public/js/fos_js_routes.json --env=prod --format=json
echo "Done."

echo "Install assets ..."
yarn install
echo "Done."

echo "Build assets ..."
yarn encore production
echo "Done."

echo "Compress files ..."
tar -czf $arhive_name            \
                bin             \
                config          \
                node_modules    \
                public          \
                src             \
                templates       \
                translations    \
                vendor          \
                .htaccess       \
                composer.json   \
                composer.lock
echo "Done."

echo "Deploy files to the server ..."
sshpass -p $password scp $arhive_name $user@$host:$dest_dir
sshpass -p $password scp ./.env $user@$host:$dest_dir.env
sshpass -p $password ssh $user@$host "cd $dest_dir && tar -xzf $archive_name && rm $archive_name"
sshpass -p $password ssh $user@$host "cd $dest_dir && composer dump-env $env && php bin/console cache:clear --env=$env"

echo "Cleanup files ..."
rm $archive_name
echo "Done."

echo "Finished."

 

Использовать скрипт очень просто. Для начала измените переменные в начале скрипта, а потом выполните следующие команды:

~$ sh deploy_live.sh 
SSH password: sshpassword

Start build ...
...
Done.

Run composer ...
...
Done.
...
...
...

Finished.

 

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

При незначительных изменениях данный скрипт можно использовать практически в любом Symfony 4 проекте. Надеюсь, что данная статья будет вам полезна, пишите в комментариях, если что-то не понятно или есть предложения, что изменить или улучшить.

А на этом я прощаюсь с вами до следующей статьи!

Наверх