50% discount in conference replays
2020 and 2021 events
In English, French, German, Polish and Spanish

С нуля до развёртывания

С нуля до развёртывания

Мне нравится работать быстро. Я хочу, чтобы наш маленький проект был доступен в продакшене как можно скорее. Вот прямо сейчас. Поскольку мы ещё ничего не сделали, начнём с развёртывания простой и понятной страницы-заглушки типа "Under construction". Вам это понравится!

Потратьте немного времени, чтобы найти в интернете наиболее подходящую, старомодную анимированную картинку с надписью "Under construction". Вот эту GIF-картинку я собираюсь использовать:

Я же вам говорил, что будет очень весело.

Инициализация проекта

Создайте новый Symfony-проект с помощью CLI-утилиты symfony, которую мы ранее установили:

1
2
$ symfony new guestbook --version=6.0 --php=8.1 --webapp --docker --cloud
$ cd guestbook

Эта команда представляет собой обертку над Composer, которая облегчает создание проектов на Symfony. Она использует заготовку проекта, которая включает в себя минимальный набор зависимостей; компоненты Symfony, необходимые практически для любого проекта: консольная утилита и HTTP-абстракция, используемая для создания веб-приложений.

Поскольку мы создаём полнофункциональное веб-приложение, мы добавили несколько опций, которые облегчат нам жизнь:

  • --webapp: По умолчанию создаётся приложение с наименьшим количеством возможных зависимостей. Для большинства веб-проектов рекомендуется использовать пакет webapp. Он содержит большинство пакетов, необходимых для "современных" веб-приложений. Пакет webapp добавляет множество пакетов Symfony, включая Symfony Messenger и PostgreSQL через Doctrine.
  • --docker: На вашем компьютере мы будем использовать Docker для управления такими сервисами, как PostgreSQL. Эта опция включает Docker, так что Symfony будет автоматически добавлять сервисы Docker на основе необходимых пакетов (например, сервис PostgreSQL при добавлении ORM или перехватчик почты при добавлении Symfony Mailer).
  • --cloud: Если вы хотите развернуть проект на Platform.sh, эта опция автоматически сгенерирует готовую конфигурацию Platform.sh. Platform.sh — это предпочтительный и самый простой способ развертывания тестовых, временных и продакшен-окружений Symfony в облаке.

Если вы посмотрите на скелет проекта в репозитории на GitHub, то заметите, что он почти пуст. Там только лишь файл composer.json. Однако в директории guestbook полно файлов. Как это вообще возможно? Ответ кроется в пакете symfony/flex. Symfony Flex — это плагин для Composer, который внедряется в процесс установки. Когда он обнаруживает пакет, который содержит так называемый рецепт, Composer выполняет его.

Основной точкой входа рецептов Symfony является файл манифеста, в котором описаны операции, которые необходимо выполнить, чтобы автоматически зарегистрировать пакет в Symfony-приложении. Вам никогда не придётся заглядывать в файл README для установки пакета Symfony. Автоматизация — ключевая особенность Symfony.

Учитывая, что Git установлен на вашем компьютере, команда symfony new также создала Git-репозиторий и сделала в нём первый коммит.

Посмотрите на структуру директорий:

1
2
3
4
5
6
7
8
9
├── bin/
├── composer.json
├── composer.lock
├── config/
├── public/
├── src/
├── symfony.lock
├── var/
└── vendor/

Директория bin/ содержит основной скрипт командной строки console. Вы будете использовать его постоянно.

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

Директория public/ — это корневая директория сайта, а скрипт index.php в ней — основная точка входа для всех динамических HTTP-ресурсов.

Директория src/ содержит весь код, который вы напишете — в ней вы будете проводить большую часть времени. По умолчанию все классы в этой директории используют пространство имён App. Это ваша рабочая директория, ваш код, ваша бизнес-логика. Symfony имеет мало общего с этим.

Директория var/ содержит кеш-файлы, логи и прочие файлы, сгенерированные приложением во время выполнения; не обращайте внимания на неё. Это единственная директория, которая должна быть доступна для записи в продакшене.

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

Это всё, что вам нужно знать на данный момент.

Создание публичных ресурсов

К всему, что находится в директории public/, можно обратиться из браузера. Например, если вы переместите анимированный GIF-файл (назовите его under-construction.gif) в новую директорию public/images/, он будет доступен по URL-адресу, такому как https://localhost/images/under-construction.gif.

Вы можете скачать мой GIF-файл отсюда:

1
2
$ mkdir public/images/
$ php -r "copy('http://clipartmag.com/images/website-under-construction-image-6.gif', 'public/images/under-construction.gif');"

Запуск локального веб-сервера

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

Запустите веб-сервер в фоновом режиме прямо из директории проекта, используя флаг -d:

1
$ symfony server:start -d

Сервер запустится на первом доступном порту, начиная с 8000. Вы можете открыть сайт по ссылке из CLI:

1
$ symfony open:local

В вашем браузере по умолчанию откроется новая вкладка, на которой будет примерно следующее:

/

Tip

Для поиска причин неполадок используйте команду symfony server:log; эта команда в режиме реального времени выводит последние строки из логов веб-сервера, PHP и самого приложения.

Перейдите к /images/under-construction.gif. Выглядит так же?

/images/under-construction.gif

Довольны результатом? Теперь давайте закоммитим нашу работу:

1
2
$ git add public/images
$ git commit -m'Add the under construction image'

Добавление фавиконки

Чтобы убрать из логов большое количество HTTP-ошибок 404 из-за отсутствующей фавиконки, которую автоматически запрашивают браузеры, давайте добавим её:

1
2
3
$ php -r "copy('https://symfony.com/favicon.ico', 'public/favicon.ico');"
$ git add public/
$ git commit -m'Add a favicon'

Подготовка к развёртыванию в продакшене

Как насчёт развёртывания нашей работы в продакшене? Я в курсе, что у нас пока ещё нет HTML-страницы, чтобы поприветствовать пользователей. Но даже если мы просто посмотрим на маленькую картинку с надписью "under construction" в продакшене — это будет большим шагом вперёд. Ну, вы наверняка знаете этот девиз: разворачивай приложение как можно раньше и чаще.

Вы можете разместить приложение у любого провайдера с поддержкой PHP... то есть почти на всех хостингах. Но учтите несколько требований: поддержка последней версии PHP, наличие баз данных, сервера очереди и т.п.

Я сделал свой выбор: это будет Platform.sh. У него есть всё необходимое, а кроме этого он помогает финансировать разработку Symfony.

Поскольку при создании проекта мы использовали опцию --cloud, Platform.sh уже инициализирован несколькими файлами, необходимыми Platform.sh, а именно: .platform/services.yaml, .platform/routes.yaml и .platform.app.yaml.

Развёртывание в продакшене

Не пора ли нам развернуть приложение?

Создайте новый удалённый проект Platform.sh:

1
$ symfony cloud:project:create --title="Guestbook" --plan=development

Эта команда выполняет ряд операций:

  • При первом запуске этой команды нужно пройти аутентификацию с помощью учётной записи Platform.sh, если вы ранее этого не сделали.
  • Команда создаст новый проект на Platform.sh (в течение 30 дней вы можете бесплатно разместить первый созданный вами проект).

Наконец, разворачиваем приложение:

1
$ symfony cloud:deploy

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

Убедитесь, что всё работает хорошо:

1
$ symfony cloud:url -1

Вы должны получить ошибку 404, но перейдя на /images/under-construction.gif, вы увидите GIF-изображение.

Обратите внимание, что вы не увидите стандартную красивую страницу Symfony на Platform.sh. Почему? Скоро вы узнаете, что Symfony поддерживает работу с несколькими окружениями, а Platform.sh автоматически развёрнул код в окружении продакшена.

Tip

Если вы хотите удалить проект на Platform.sh, воспользуйтесь командой cloud:project:delete.

This work, including the code samples, is licensed under a Creative Commons BY-NC-SA 4.0 license.