Статьи

Как развертывать приложения Symfony с Capifony

Скажем, у вас есть приложение Symfony. В какой-то момент вы хотели бы развернуть его на своем сервере и показать его всему миру. Конечно, вы можете сделать все это вручную, но в наши дни вы также можете использовать такой инструмент, как Capifony .

Если вы разрабатывали приложения на Ruby в прошлом, вы, возможно, знакомы с Capistrano . Capistrano — это инструмент для развертывания вашего приложения Ruby на вашем сервере. Capifony был создан поверх Capistrano и представляет собой набор рецептов развертывания.

В этой статье мы собираемся развернуть приложение Symfony на сервере с Capifony.

Как работает Capifony?

Прежде чем мы начнем, важно понять, как работает Capifony. Запустив команду deploy, Capifony запускает определенные команды, выполняющие различные задачи. Например, он загрузит composer, установит зависимости и очистит кеш.

Структура каталогов очень важна. Capifony нужны две директории и одна символическая ссылка. Первый каталог, который ему нужен, называется releases . Каждый раз при развертывании в этом каталоге создается новый каталог. Capifony загружает ваш git-репозиторий и запускает все команды в этом новом каталоге.

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

Рядом с этими двумя каталогами у нас есть символическая ссылка под названием current . Эта символическая ссылка указывает на последний успешный выпуск. Таким образом, при развертывании новой версии в каталоге releases будет создан новый каталог. Если в этом каталоге все задачи выполнены успешно, current символическая ссылка будет указывать на эту новую версию.
Вы должны указать вашему веб-серверу читать эту символическую ссылку, чтобы он всегда использовал правильную, последнюю версию.

Установка Capifony

Давайте разберем теоретическую часть и погрузимся в развертывание. Для этого нам нужно установить Capifony. Убедитесь, что Ruby установлен в вашей системе, прежде чем продолжить. Вы можете установить гем Capifony, запустив gem install capifony .

В каталоге вашего приложения запустите команду capifony . , Эта команда создаст файл с именем Capfile в вашем корневом каталоге и файл Capfile в вашем каталоге конфигурации. В ходе этой статьи вы будете изменять файл deploy.rb , поэтому убедитесь, что он открыт в вашем любимом редакторе.

Теперь вы должны решить, какой будет ваша стратегия развертывания. Либо вы решаете разрешить производственному серверу доступ к вашему SCM (Source Control Management), либо ваш локальный компьютер извлекает ваш репозиторий из SCM и копирует его на рабочий сервер.

В этой статье мы рассмотрим первую стратегию. Если вас интересует вторая стратегия, загляните на официальный сайт Capifony для получения инструкций.

Настройте свой проект

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

 $ capifony . [add] writing './Capfile' [add] writing './app/config/deploy.rb' [done] symfony 2 project capifonied! 

Когда вы deploy.rb сценарий deploy.rb , вы увидите следующее содержимое.

 set :application, "set your application name here" set :domain, "#{application}.com" set :deploy_to, "/var/www/#{domain}" set :app_path, "app" set :repository, "#{domain}:/var/repos/#{application}.git" set :scm, :git # Or: `accurev`, `bzr`, `cvs`, `darcs`, `subversion`, `mercurial`, `perforce`, or `none` set :model_manager, "doctrine" # Or: `propel` role :web, domain # Your HTTP server, Apache/etc role :app, domain, :primary => true # This may be the same as your `Web` server set :keep_releases, 3 # Be more verbose by uncommenting the following line # logger.level = Logger::MAX_LEVEL 

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

 set :application, "Jumph" set :domain, "peternijssen.nl" set :deploy_to, "/srv/www/jumph" set :app_path, "app" 

Давайте настроим наш репозиторий. Поскольку мы используем репозиторий git, мы должны настроить SCM на git и указать репозиторий на наш репозиторий Github.

 set :repository, "[email protected]:jumph-io/Jumph.git" set :scm, :git 

Далее мы определяем нашего менеджера моделей. В моем случае я использую Doctrine, но если вы используете Propel, вам следует изменить значение конфигурации на «propel».

Мы можем пропустить роли. Они просто повторно используют ваш домен.

Последний параметр — это параметр keep_releases . С помощью этого параметра вы можете определить, сколько выпусков вы хотите сохранить, что позволит вам вернуться к предыдущей версии.

Пока что мы изменили все переменные конфигурации по умолчанию на правильные значения. Однако Symfony требует больше настроек для развертывания. В моем случае я использую как Assetic, так и Composer. Это означает, что я должен добавить следующие настройки в файл.

 set :dump_assetic_assets, true set :use_composer, true 

Теперь нам нужно настроить общие файлы. Например, ваш файл parameters.yml должен быть общим для каждого выпуска. Кроме того, разумно также делиться вашими загрузками, вашими журналами и вашим поставщиком между выпусками. Если вы не разделяете своего поставщика между каждым выпуском, это означает, что ваше развертывание устанавливает всех поставщиков каждый раз. Чтобы установить эти общие пути, мы просто добавляем следующую конфигурацию.

 set :shared_files, ["app/config/parameters.yml"] set :shared_children, [app_path + "/logs", web_path + "/uploads", "vendor", app_path + "/sessions"] 

Обратите внимание, что в моем случае я также переместил каталог сеанса за пределы каталога кэша. Таким образом, я могу поделиться этим каталогом между выпусками, и никто не выходит из системы при новом развертывании. Обратите внимание, что вам необходимо изменить конфигурацию в Symfony также, чтобы отразить это изменение.

 session: save_path: "%kernel.root_dir%/sessions/" 

Настройте свой сервер

Пока все готово для нашего приложения Symfony. Теперь пришло время настроить все для нашего сервера. Мы делаем это в том же конфигурационном файле, что и выше.

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

 set :use_sudo, false set :user, "peter" 

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

 set :writable_dirs, ["app/cache", "app/logs", "app/sessions"] set :webserver_user, "www-data" set :permission_method, :acl set :use_set_permissions, true 

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

Теперь мы можем сказать Capifony подготовить каталоги на вашем сервере. Мы можем сделать это, запустив cap deploy:setup . Убедитесь, что у вас есть SSH-доступ к серверу, и каталог, конечно, доступен для записи вашему пользователю.

Примечание. В моем случае мне пришлось добавить default_run_options[:pty] = true в мою конфигурацию из-за известной проблемы .

После выполнения команды вы заметите, что она создала releases и shared каталоги на вашем сервере.

Теперь вы сможете развернуть, запустив cap deploy в командной строке. Если вы столкнетесь с какими-либо проблемами, вы можете добавить следующую строку в ваш файл конфигурации, чтобы получить больше информации об ошибке.

 logger.level = Logger::MAX_LEVEL 

В моем случае я не смог получить доступ к репозиторию git из-за неверного открытого ключа. Так как мой локальный компьютер может получить доступ к хранилищу, мне просто нужно было переслать мой агент SSH на сервер. Это можно сделать, добавив следующую строку в сценарий развертывания.

 ssh_options[:forward_agent] = true 

Поскольку это ваше первое развертывание, Capifony запросит у вас учетные данные файла parameters.yml . Вы должны заполнить их только один раз, так как мы настроили файл для совместного использования между выпусками.

Добавление дополнительных команд

Если вы попытались развернуть репозиторий, о котором я упоминал ранее, вы заметите, что он потерпит неудачу, когда Assetic попытается сбросить свои файлы. Это связано с тем, что я управляю своими зависимостями JavaScipt и CSS через Bower . Поэтому, прежде чем Assetic создаст дамп файлов, я должен сначала запустить bower install .

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

 before 'symfony:assetic:dump', 'bower:install' namespace :bower do desc 'Run bower install' task :install do capifony_pretty_print "--> Installing bower components" invoke_command "sh -c 'cd #{latest_release} && bower install'" capifony_puts_ok end end 

Задача довольно проста для понимания. Сначала мы определяем, когда задача должна выполняться. В этом случае мы хотим запустить его до того, как Assetic создаст дамп своих файлов. Далее мы определяем, какую задачу он должен выполнить.

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

Кроме того, я добавил некоторые выходные данные до и после команды. Таким образом, он будет отображаться в команде cap deploy при запуске. Это дает вам дополнительную обратную связь, как вы можете видеть ниже.

 $ cap deploy --> Updating code base with checkout strategy --> Creating cache directory................................ --> Creating symlinks for shared directories................ --> Creating symlinks for shared files...................... --> Normalizing asset timestamps............................ --> Downloading Composer.................................... --> Installing Composer dependencies........................ --> Installing bower components............................. --> Dumping all assets to the filesystem.................... --> Warming up cache........................................ --> Clear controllers....................................... --> Setting permissions..................................... --> Successfully deployed! 

Дополнительные команды

Сначала мы решили сохранить как минимум 3 релиза. Если что-то пойдет не так в новом выпуске, вы можете выполнить откат, выполнив команду cap deploy:rollback .

Кроме того, вы также можете активировать или деактивировать страницу обслуживания Symfony, выполнив команду cap deploy:web:disable или cap deploy:web:enable .

Capifony состоит из нескольких команд, которые могут пригодиться. Для полного списка вы можете запустить cap -vT .

Полная конфигурация

Как ссылка, это полный файл конфигурации, который мы создали в этой статье.

 set :application, "Jumph" set :domain, "peternijssen.nl" set :deploy_to, "/srv/www/jumph" set :app_path, "app" set :repository, "[email protected]:jumph-io/Jumph.git" set :scm, :git set :model_manager, "doctrine" role :web, domain role :app, domain, :primary => true set :use_sudo, false set :user, "peter" set :keep_releases, 3 set :dump_assetic_assets, true set :use_composer, true set :shared_files, ["app/config/parameters.yml"] set :shared_children, [app_path + "/logs", web_path + "/uploads", "vendor", app_path + "/sessions"] set :writable_dirs, ["app/cache", "app/logs", "app/sessions"] set :webserver_user, "www-data" set :permission_method, :acl set :use_set_permissions, true ssh_options[:forward_agent] = true default_run_options[:pty] = true before 'symfony:assetic:dump', 'bower:install' namespace :bower do desc 'Run bower install' task :install do capifony_pretty_print "--> Installing bower components" invoke_command "sh -c 'cd #{latest_release} && bower install'" capifony_puts_ok end end 

Вывод

Capifony делает вашу жизнь проще, если речь идет о развертывании приложения Symfony. Хотя мы уже видели много вариантов, которые предлагает Capifony, вы можете копать глубже. Вы можете проверить их веб-сайт для получения дополнительной информации. Используете ли вы Capifony для развертывания приложений Symfony? Дайте нам знать, если у вас возникнут какие-либо трудности или у вас возникнут вопросы!