Я новичок в Symfony, из мира .NET. Используя документацию Symfony (4), мне удалось создать простой веб-сайт. Теперь я хочу запустить его, но изо всех сил пытаюсь найти какую-либо полезную информацию, что мне делать, чтобы «упаковать» все необходимое и развернуть его. Действительно, есть страница с описанием развертывания (Как развернуть приложение Symfony), но мне не хватает информации о:
dev, и развертывание файлов composer также не имеет смысла).env, содержащий APP_ENV и APP_SECRET - где мне использовать эти значения?)www для публичной презентации, нужно ли мне что-то менять / настраивать перед переименованием каталога public только в www?.htaccess, чтобы не маршрутизировать изображения / css / js через PHP?Моя текущая структура проекта:
+ bin
+ config
+ public
+ css
- index.php
+ src
+ Controller
- Kernel.php
+ templates
+ var
+ vendor
- .env
- .gitignore
- composer.json
- composer.lock
- symfony.lock
Изменить (2018-07-17):
production (всякий раз, когда я нажимаю на эту ветку, она вызывает composer install --no-dev)composer.json.Пример дополнительной конфигурации в composer.json:
"extra": {
"symfony": {
"allow-contrib": false
},
"public-dir": "www"
}
Что касается моего первоначального вопроса - теперь я использую возможность развертывания хостинга с помощью git. В этом случае я также использую файлы композитора действительно нужно. Моя первоначальная мысль заключалась в том, чтобы собрать и упаковать минимум вещей, а затем развернуть этот пакет на сервере. (Теперь у меня все еще есть bin, файлы композитора или .gitignore (и, возможно, даже более странные вещи), также развернутые).
так что в основном вы имеете в виду: 1. установить композитор на сервер (не уверен, если возможно, я использую платный хостинг PHP, а не любой VPS), 2. клонировать мой проект, 3. запустить composer install ... но не добавит ли он также dev зависимости от сервера? Это действительно необходимо?
@RiggsFolly: определенно нет: / ... но дело не в этом, я мог бы провести эту церемонию локально (другим путем), чтобы подготовить проект к развертыванию без ненужных вещей, но я не думаю, что этот подход отвечает на все вопросы, которые я спросил о.
Можете ли вы поменять свой web_dir на public? Какой сервер у вас на хостинге (nginx, apache или оба)? Можете ли вы настроить переменные среды на своем хостинге? У вас есть ssh-доступ к серверу хостинга? У вас на хостинге есть GIT? Ответ на ваш вопрос во многом зависит от вашего хостинг-провайдера.
Обычно я не фиксирую файлы / папки vendor, var, .gitignore. В Cloudways я развернул Symfony вот так: cloudways.com/blog/install-symfony-4-on-cloud






Хорошо, я сделаю снимок.
what to include/exclude (obviously I don't want to pack dev dependencies, and deploying composer files also doesn't seems to make any sense)
Я заметил, что у вас нет .gitignore. Если вы не используете GIT (вам следует), взгляните на gitignore по умолчанию, он скажет вам, какие папки вам не нужны.
Вы правы, не нужны производители. Файл блокировки Composer содержит точные версии, которые вы используете. Просто сделайте composer install после того, как скопировали файлы на сервер. Самый простой способ «развертывания» - использовать git (hub), настроить ssh-ключ на вашем сервере и предоставить ему доступ для чтения к вашему репозиторию git. (Развернуть ключ)
what to change (there's .env file - containing APP_ENV and APP_SECRET - where do I use those values?)
Файл .env по умолчанию работает только в режиме разработки. (обратите внимание на часть require-dev в вашем composer.json).
Symfony рекомендует использовать в продакшене «настоящие» переменные окружения, но вы можете использовать файл .env. Для этого вам нужно переместить "symfony/dotenv" из require-dev в require в composer.json. (Сделайте обновление после)
Вы также захотите установить APP_ENV на prod на своем сервере, настроить db acccess и почтовую программу.
my hosting uses folder www for public presentation, do I have to change/configure something before renaming public directory just to www?
Я не буду отвечать на этот вопрос полностью, это займет слишком много времени. Настройте apache так, чтобы он указывал на ваш общедоступный каталог с помощью VirtualHost. Подробнее здесь: https://symfony.com/doc/current/setup/web_server_configuration.html
do I have to configure .htaccess to not route images/css/js trough PHP?
Если вы установили пакет apache, вы получите файл .htaccess, который игнорирует файлы.
# If the requested filename exists, simply serve it.
# We only want to let Apache serve files and not directories.
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]
Таким образом запрошенные файлы не попадут в ваш PHP-код. Однако, если файл не существует, Symfony обработает запрос. Я рекомендую игнорировать распространенные расширения файлов, например:
# Do not allow image requests to hit symfony
RewriteCond %{REQUEST_URI} \.(gif|jpg|jpeg|png|ico|map)$ [NC]
RewriteRule .* - [L]
Веб-папку также можно изменить. Отметьте это symfony.com/doc/current/configuration/…
вы можете добавить для запуска установки композитора с флагом --no-dev
Спасибо за ваш ответ! Я обновил исходный вопрос - я, конечно, использую VCS :) ... Я все еще пытаюсь понять эту зависимость от файла .env (требуется для index.php, если ENV var не установлен). И спасибо за переписывание модов для статических файлов, это будет удобно :)
У вас также должен быть файл .env.dist (не показан в вашем каталоге выше), содержащий значения по умолчанию для загруженного файла .env. Файл dist должен быть в вашем репо, реальный файл env следует игнорировать. Когда вы устанавливаете его на новый сервер, вы должны скопировать файл dist в .env и изменить значения для работы с конфигурацией сервера. (Файл env следует игнорировать в git, потому что он отличается для каждой машины) Прочтите это: symfony.com/doc/current/… и symfony.com/doc/current/configuration/…
Поскольку PHP не является компилируемым языком, процесс «сборки» с точки зрения компиляции кода в исполняемый файл здесь неуместен.
Однако, если вы разрабатываете веб-приложение и хотите его развернуть, лучший способ (то есть отраслевой стандарт) - «построить» из него контейнер без сохранения состояния. В этом контейнере обычно есть Apache + PHP или Ngnix + PHP-FPM (или даже просто PHP с PHP-PM). Это будет процесс вашего приложения, доступный через порт 80: красивый, масштабируемый докер-контейнер без сохранения состояния.
Идея состоит в том, что в процессе создания контейнера вы устанавливаете выбранную вами версию PHP (с соответствующими расширениями) и веб-сервер или процесс, который будет работать через порт HTTP. Затем вы загружаете свой код в контейнер с помощью git, устанавливаете переменные среды и выполняете установку композитора. Результатом будет образ докера с версией вашего приложения в нем, доступный через порт 80.
Подробнее об этом здесь.
Конечно, это может быть не для вас, в зависимости от того, насколько ваше приложение следует за принципы двенадцатифакторного приложения и где вы собираетесь его разместить.
Если вы хотите выполнить развертывание на виртуальном хостинге, вам нужно будет изменить папку public для корневого каталога документов вашего хостинг-провайдера. Поскольку у вас нет доступа к среде выполнения PHP на общем хостинге, вам нужно будет скопировать файл .env и отправить его на веб-хостинг (что является ужасно небезопасной практикой).
Чтобы настроить автоматическое развертывание, вы должны предпочесть ssh. Если у вас нет консольного доступа к вашему веб-хостингу, то git-ftp, вероятно, ваш лучший друг здесь. Используя веб-перехватчики (например, в Github) в событии post-receive, вы развернете свой код, запустив скрипт, который будет иметь, среди прочего, установку композитора (с заблокированными зависимостями) и все, что нужно для www. -data пользователь (или пользователь веб-сервера, если на то пошло).
Сказав это, я постараюсь ответить на несколько ваших вопросов:
Ты прав. vendor/ должен оставаться в стороне. Однако не composer.lock. По сути, вам нужно развернуть весь код, находящийся в вашем репозитории.
В вашем сценарии развертывания (да, он у вас будет) вы должны создать новый файл .env для добавления. Да, вам нужны все параметры, но, очевидно, со значениями для производственной среды.
Да, вам следует переименовать папку Symfony public в www. Насколько я понимаю, у вас не должно возникнуть проблем. То есть, если вы не используете сервер Symfony для разработки. Но простого php -S localhost:8000 -t www в вашем проекте будет достаточно для целей разработки. Я использую это все время.
Итак, я вижу, что на вашем хостинге есть возможности развертывания git. Это хорошо. В этом случае должен быть способ настроить ловушку после получения в репо, расположенном там. Этот пост-прием может выполнять любую команду bash, например, установку композитора. Однако это будет исполняемый файл композитора, но я не думаю, что он будет включен. Что вы можете сделать, так это загрузить composer.phar в корень вашего хостинга. Это композитор в единственном исполняемом файле.
Затем в вашем обработчике post-receive (также известном как ваш сценарий развертывания) вы запустите установку композитора и упомянутый файл chown.
Я понимаю, что ваши требования заключаются в развертывании на веб-хостинге. Однако вы ищете преимущества CI / CD способом, который не является текущим отраслевым стандартом. Веб-хостинги, естественно, не предназначены для конвейеров развертывания. То, как вы это делаете сейчас, может причинить вам некоторую боль в будущем, особенно при добавлении некоторых других вспомогательных сервисов, масштабировании и т. д.
Теперь, если ваше приложение небольшое и простое, вы, вероятно, можете проигнорировать мои слова.
Спасибо за ваши слова! Чтобы добавить больше понимания, я годами живу в экосистеме .NET - компиляция, упаковка, пакет всегда (обычно) содержит минимум вещей - без зависимостей разработчиков, без .git, без метаданных зависимостей - только двоичные файлы и, возможно, файлы конфигурации ... Я ' m хорошо с текущим решением, но я все еще не доволен только composer install --no-dev - результат все еще раздут. Это нормально во вселенной PHP? Мне нужно собирать вещи вручную? А как насчет этой штуки: github.com/dg/composer-cleaner?
Вы слишком беспокоитесь об этом :) PHP не является компилируемым языком, у него нет двоичных файлов, поэтому у вас есть сырые файлы php в производстве ... совершенно нормально.
Не уверен в этом, но тогда - должен ли я фиксировать содержимое каталогов
vendorиvar? (== размещение зависимостей в моем репозитории git - что для меня звучит странно) И как контроль версий помогает мне выбирать только производственные файлы, необходимые для работы веб-сайта? Это где-нибудь описано?