
Під час роботи над моїм невеликим домашнім проєктом на Symfony2 мені потрібно було розгорнути його на стадії для тестування API ззовні. Звичайно, для цього потрібен хостинг: або вже мати його, або купити. Проте є альтернатива — хмарні сервіси, де ви можете безкоштовно розмістити свій сайт, але з обмеженими ресурсами. Зараз існує багато таких сервісів, і вони конкурують один з одним. Я вирішив спробувати Heroku. Я чув про нього давно, і в той момент це прийшло мені на думку. Я не шукав інші сервіси, цього разу я просто хотів спробувати удачу з Heroku. На щастя, у Heroku все ще є безкоштовний варіант веб-хостингу, тож я почав шукати всю необхідну інформацію для розгортання застосунку Symfony2.
Ось кілька корисних посилань, які я знайшов:
- Розгортання на Heroku Cloud (з Symfony Cookbook)
- Початок роботи з PHP на Heroku
- Початок роботи з Symfony2 на Heroku
Багато речей з цих статей буде повторено в цьому пості. Але там є деякі моменти, які були упущені або не повністю розкриті, і я вирішив заповнити цю прогалину.
Підготовка
Для початку вам потрібно створити обліковий запис Heroku.
Потім завантажте Heroku Toolbelt для вашої платформи. Цей інструмент дозволяє керувати вашими застосунками через консоль. Наприклад, щоб встановити Heroku на Debian/Ubuntu, вам потрібно просто виконати цю команду:
$ wget-qO- https://toolbelt.heroku.com/install-ubuntu.sh |sh
Тепер вам потрібно увійти в Heroku з консолі:
. Введіть електронну пошту та пароль від вашого облікового запису.Введіть свої облікові дані Heroku. Email: test@examle.com Password (введення буде приховане): Аутентифікація успішна.
Введіть у терміналі
, щоб перевірити доступні команди для консолі Heroku. Список не повний, оскільки там не відображаються псевдоніми. Наприклад, команда є псевдонімом для .Створення застосунку Heroku
Ви можете створити новий застосунок Heroku двома способами:
- з консолі на вашому робочому комп'ютері
- з веб-інтерфейсу Heroku Dashboard
Створення застосунку з консолі
Heroku розгортає PHP проекти через Composer, тому вам потрібно мати дійсні файли composer.json та composer.lock у вашому проекті. Якщо ви просто виконаєте
без параметрів, буде створено новий додаток у вашому хмарному середовищі. Наразі він нічого не робить і має бути налаштований. Він отримає випадкову назву, наприклад . Після створення додатку ви можете змінити його назву (якщо нова назва доступна): . Команда є псевдонімом для . Однак краще встановити назву під час створення додатку , але вона повинна бути доступною. Ви можете виконати в іншій директорії, і він просто створить новий додаток у вашому хмарному середовищі. Але ми хочемо розгорнути наш проект, тому цю команду слід виконувати з директорії проекту, де ініціалізовано Git. Крім того, для створення проекту перевіряє, чи ініціалізовано Git у поточній директорії, і, якщо так, додає його віддалений репозиторій.$ mkdir my-abracadabra $ cd my-abracadabra/ $ git init Ініціалізовано порожній Git репозиторій у /home/fresh/Desktop/my-abracadabra/.git/ $ heroku create my-abracadabra Створення my-abracadabra... готово, стек - cedar-14 https://my-abracadabra.herokuapp.com/| https://git.heroku.com/my-abracadabra.git Віддалений репозиторій heroku додано $ git remote-v heroku https://git.heroku.com/my-abracadabra.git (fetch) heroku https://git.heroku.com/my-abracadabra.git (push)
Отже, у вас є два варіанти: або ви створюєте новий проект, ініціалізуєте Git там і підключаєтеся до Heroku, або підключаєте Heroku до працюючого проекту з ініціалізованим Git. Інший випадок - це коли ви створили додаток на одному комп'ютері і хочете налаштувати його на іншому. Або ви створили додаток через веб-інтерфейс і просто хочете налаштувати його у вашому терміналі. У цьому випадку вам просто потрібно додати віддалений репозиторій Heroku до вашого локального проекту. Адреса репозиторію може виглядати так
. Наприклад, якщо проект називається my-abracadabra, тоді вам потрібно виконати:$ git remote add heroku https://git.heroku.com/my-abracadabra.git
або
$ heroku git:remote -a my-abracadabra
Створення додатку з вашої панелі управління
На цій сторінці https://dashboard.heroku.com/new вам просто потрібно ввести дійсну назву та вибрати місце розташування сервера для створення нового додатку.
Додаток було створено, тепер ви можете продовжити його налаштування через веб-інтерфейс.
Налаштування процесів
У кореневій директорії проекту вам потрібно створити файл під назвою
і написати там наступний текст:web: vendor/bin/heroku-php-apache2 web/
Використовуючи цю команду, ви повідомите Heroku, що потрібно створити веб-воркер, який слухатиме HTTP-запити, а коренева директорія сайту (в даному випадку, Symfony) знаходиться в
директорії. Також у цій команді вказується запуск PHP на веб-сервері Apache. Якщо вам потрібен Nginx, використовуйте цю команду:web: vendor/bin/heroku-php-nginx
Ви також можете спробувати запустити проект на HHVM:
web: vendor/bin/heroku-hhvm-nginx
web: vendor/bin/heroku-hhvm-apache2
Ви можете додати інших воркерів у цьому файлі, наприклад, фоновий воркер для cron-завдань.
Підготовка середовища для Symfony
Також важливо знати, що під час розгортання PHP-додатку Heroku запускає composer з наступними параметрами:
$ composer install--no-dev--prefer-dist--optimize-autoloader--no-interaction
Це означає, що все, що ви додали до секції
у вашому файлі composer.json, не буде встановлено.За замовчуванням усі команди консолі виконуються в середовищі розробки. Нам потрібно переключити Symfony в режим виробництва перед запуском скриптів composer, оскільки кілька важливих команд, необхідних для налаштування додатку (очистка кешу, вивантаження активів), виконуються там. Ви можете зробити це через змінну середовища
, і якщо вона встановлена, її значення вказуватиме середовище для Symfony. Ми робимо це наступним чином:$ heroku config:set SYMFONY_ENV=prod
Команду потрібно виконати лише один раз перед першим розгортанням.
А тепер розгортаємо
Розгортання на Heroku здійснюється шляхом відправки комітів до віддаленого репозиторію.
$ git push heroku master
Після виконання цієї команди в консолі ви побачите весь процес розгортання. Якщо розгортання пройшло успішно, використовуйте команду
, щоб відкрити ваш додаток у браузері. За замовчуванням адреса вашого додатку буде піддоменом herokuapp.com (наприклад, https://my-abracadabra.herokuapp.com/), але ви можете налаштувати його для використання вашого власного домену.Перегляд журналів
Щоб переглянути журнали з консолі, вам потрібно трохи змінити конфігурацію виробництва Symfony. У файлі
вам потрібно замінити на .monolog: handlers: nested: path: "php://stderr"
Тепер журнали можна переглядати за допомогою:
$ heroku logs --num10
або ви можете моніторити журнали онлайн:
$ heroku logs --tail
Консольні команди для запуску Symfony2 на Heroku
Щоб отримати доступ до bash під час розгортання Symfony2 на Heroku Cloud, виконайте команду
.Тоді ви зможете виконувати доступні команди з додатку:
$ heroku run bash Запуск `bash`, підключено до терміналу... up, run.1516 ~ $ app/console doctrine:schema:validate [Mapping] OK - Файли відображення правильні. [Database] FAIL - Схема бази даних не синхронізована з поточним файлом відображення. ~ $ app/console doctrine:schema:create УВАГА: Цю операцію не слід виконувати в продуктивному середовищі. Створення схеми бази даних... Схема бази даних успішно створена! ~ $ exitexit
Вам не потрібно вказувати середовище через
, оскільки воно було налаштоване через змінну середовища.Ви також можете запустити інтерактивну оболонку PHP з терміналу:
$ heroku run "php -a" Запуск `php -a`, підключено до терміналу... up, run.3436 Інтерактивна оболонка php > echo"Hello World"; Hello World php > exit
Не забудьте ввести
.Управління налаштуваннями конфігурації
Коли ми запускаємо
на локальному комп'ютері і є нові параметри у файлі , які ще не були встановлені локально, консоль Symfony запитає вас додати ці параметри в інтерактивному режимі. Це не можна зробити на Heroku, оскільки composer запускається з опцією . Тому нам потрібно якось встановити ці параметри. Найзручніший спосіб, який пропонує Symfony та Heroku, - це записати їх у змінні середовища, і PHP їх прочитає. Ви можете зробити це за допомогою наступної команди:$ heroku config:set DATABASE_PASSWORD=secret_password Встановлення змінних конфігурації та перезапуск my-abracadabra... готово, v32 DATABASE_PASSWORD: secret_password $ heroku config:set DATABASE_USER=secret_user Встановлення змінних конфігурації та перезапуск my-abracadabra... готово, v33 DATABASE_USER: secret_user
Щоб перевірити, що ви встановили, використовуйте:
$ heroku config === my-abracadabra Config Vars DATABASE_PASSWORD: secret_password DATABASE_USER: secret_user
Ви також можете додавати, редагувати та видаляти параметри з вашої панелі управління.
Це також можна гарно зробити у файлі Incenteev/ParameterHandler. Він зареєстрований у Symfony за замовчуванням, нам не потрібно нічого робити, просто використайте його можливість для відображення параметрів середовища в параметри застосунку.
, використовуючи скрипт{"extra":{"incenteev-parameters":{"env-map":{"my_first_param":"MY_FIRST_PARAM","my_second_param":"MY_SECOND_PARAM"}}}}
Знайдіть розділ
у файлі composer.json і змініть його на це:{"extra":{"symfony-app-dir":"app","symfony-web-dir":"web","incenteev-parameters":{"file":"app/config/parameters.yml","env-map":{"database_name":"SYMFONY__DATABASE_NAME","database_user":"SYMFONY__DATABASE_USER","database_host":"SYMFONY__DATABASE_HOST","database_password":"SYMFONY__DATABASE_PASSWORD"}}}}
Тепер нам потрібно встановити змінні середовища. У цьому випадку необхідно вказати параметри бази даних.
Підключення бази даних до проєкту
Щоб знайти базу даних (та будь-який інший інструмент, який вам потрібен), перегляньте сторінку доповнень https://addons.heroku.com/. Для кожного доповнення ви можете знайти інструкції з установки.
Встановіть PostgreSQL:
$ heroku addons:add heroku-postgresql Додається heroku-postgresql до my-abracadabra... готово, v9 (безкоштовно) Прикріплено як HEROKU_POSTGRESQL_IVORY_URL База даних створена і доступна ! Ця база даних порожня. Якщо ви оновлюєте, ви можете перенести ! дані з іншої бази даних за допомогою pgbackups:restore. Використовуйте `heroku addons:docs heroku-postgresql`, щоб переглянути документацію.
MySQL встановлюється через доповнення ClearDB MySQL Database:
$ heroku addons:add cleardb Додається cleardb до my-abracadabra... готово, v10 (безкоштовно) Використовуйте `heroku addons:docs cleardb`, щоб переглянути документацію.
При підключенні доповнення до програми його налаштування з'єднання також зберігаються в змінних середовища:
$ heroku config === my-abracadabra Config Vars CLEARDB_DATABASE_URL: mysql://b9153ad7c7a263:a7f8d514@us-cdbr-iron-east-01.cleardb.net/heroku_ab3bbc34931b570?reconnect=true HEROKU_POSTGRESQL_IVORY_URL: postgres://ylcarfkdjbxouy:tEDQdicyUIcnCk7-xNn9SZZCHZ@ec2-107-20-229-112.compute-1.amazonaws.com:5432/db7sm6in86mtir
Якщо ми розберемо це URL, ми отримаємо хост, ім'я бази даних, користувача та пароль. Щоб це сталося автоматично під час розгортання, нам потрібно написати скрипт для composer і підписати його на подію
. Для цього десь у проєкті (наприклад, у просторі імен ) створіть новий клас:Якщо ми розберемо це URL, ми отримаємо хост, ім'я бази даних, користувача та пароль. Щоб це сталося автоматично під час розгортання, нам потрібно написати скрипт для composer і підписати його на подію
. Для цього десь у проєкті (наприклад, у просторі імен ) створіть новий клас:<?phpnamespace AppBundle\Composer; use Composer\Script\Event; class HerokuEnvironment {/** * Заповнити середовище Heroku * * @param Event $event Подія */public static function populateEnvironment(Event $event){$url=getenv('CLEARDB_DATABASE_URL');// Якщо вибрано MySQL// $url = getenv('HEROKU_POSTGRESQL_IVORY_URL'); Якщо вибрано PostgreSQL if($url){$url=parse_url($url);putenv("SYMFONY__DATABASE_HOST={$url['host']}");putenv("SYMFONY__DATABASE_USER={$url['user']}");putenv("SYMFONY__DATABASE_PASSWORD={$url['pass']}"); $db=substr($url['path'],1);putenv("SYMFONY__DATABASE_NAME={$db}");} $io=$event->getIO();$io->write('CLEARDB_DATABASE_URL='.getenv('CLEARDB_DATABASE_URL'));}}
Тепер додайте цей скрипт у composer.json:
{"scripts":{"pre-install-cmd":["AppBundle\\Composer\\HerokuEnvironment::populateEnvironment"]}}
Тепер під час нашого першого розгортання composer самостійно налаштує параметри бази даних.
Безкоштовна версія PostgreSQL обмежена 10 тисячами записів. Безкоштовна ClearDB обмежена 5 мегабайтами.
Додаткові налаштування в composer.json
У файлі composer.json у секції
ви можете передати додаткові налаштування середовища для Heroku. Наприклад:{"extra":{"heroku":{"framework":"symfony2","document-root":"web","php-config":["date.timezone=Europe/Kiev","display_errors=off","short_open_tag=off"]}}}
Скрипт php
покаже, що ще потрібно налаштувати для коректної роботи Symfony. Налаштування PHP можна вказати в секції . Також Symfony вимагає, щоб деякі модулі PHP були активовані. Щоб вказати Heroku включити їх під час створення веб-робітника, вам потрібно перерахувати їх у секції require файлу composer.json.{"require":{"ext-intl":"*","ext-mbstring":"*"}}
Сповіщення про успішне розгортання
Є додаток Deploy Hooks, який дозволяє налаштувати надсилання сповіщень після успішного розгортання:
$ heroku addons:add deployhooks:email \ > --recipient=me@example.com \ > --subject="Мій додаток abracadabra був розгорнутий" \ > --body="{{user}} розгорнув мій abracadabra на Heroku" Додавання deployhooks:email на my-abracadabra... готово, v11 (безкоштовно) Використовуйте `heroku addons:docs deployhooks`, щоб переглянути документацію.
Ви також можете налаштувати інші канали сповіщень.
З'єднання з GitHub
Якщо ви зберігаєте свій репозиторій на GitHub, ви можете використовувати свою панель управління Heroku, щоб підключити його до автоматичних розгортань після кожного коміту в основну гілку (або будь-яку іншу гілку).
У цьому випадку вам потрібно буде виконати пуш тільки до GitHub. Heroku візьме це на себе і повторно розгорне продуктивну версію.
Якщо ви не хочете налаштовувати автоматичне розгортання, тоді вам потрібно буде виконати пуш двічі. Спочатку, щоб надіслати зміни до вашого віддаленого репозиторію, а потім ще раз, щоб надіслати зміни до репозиторію Heroku для створення нового розгортання:
$ git push origin master $ git push heroku master
Файл App.json та розгортання Symfony2 на Heroku для відкритих проектів одним кліком
Ще одна приємна функція Heroku. Наприклад, якщо ви розробляєте відкритий проект у вашому публічному репозиторії на GitHub і хочете дозволити користувачам бачити застосунок в дії без необхідності завантажувати та розгортати його локально. Ви можете додати всі необхідні конфігурації для розгортання у вашому репозиторії, додати стандартну кнопку Heroku і розгорнути його одним кліком.
Конфігураційний файл для Heroku називається app.json. Його слід помістити в кореневу директорію вашого проекту. Деталі про всі параметри конфігурацій можна знайти тут. Ось приклад файлу:
{"name":"Назва, яка буде показана під час створення нового застосунку","description":"Опис, який буде показаний під час створення нового застосунку","keywords":["щось","для","опису","застосунку"],"website":"https://homepage-of-project.com","success_url":"/homepage-or-smth","repository":"https://github.com/your-nickname/your-repository","logo":"https://exampe.com/this-image-will-be-shown-during-the-creation-of-new-app.webp","addons":["cleardb"],"env":{"SYMFONY_ENV":{"value":"prod"}},"scripts":{"postdeploy":"php app/console doctrine:migration:migrate"}}
Ви можете встановлювати змінні середовища безпосередньо з конфігурації. Наприклад, переключити Symfony в режим продуктивності:
{"env":{"SYMFONY_ENV":{"value":"prod"}}}
Якщо вам потрібно виконати кілька команд після розгортання:
{"scripts":{"postdeploy":"php app/console doctrine:migration:migrate; ls -la; sleep 5"}}
Я думаю, що всі знають про популярний додаток TodoMVC, який написаний як навчальний посібник для кожного JavaScript фреймворку. Ось відмінний приклад того, як ви можете розгорнути веб-застосунок Symfony Angular TodoMVC одним кліком. Тут застосунок TodoMVC написаний за допомогою Symfony та Angular. Не забудьте, що вам потрібно бути зареєстрованим на Heroku, щоб мати можливість його розгорнути. Просто знайдіть кнопку в README цього репозиторію та натисніть на неї.
Ви будете перенаправлені на вашу панель управління для створення нового застосунку з шаблону. У URL є параметр app.json, з якого беруться налаштування застосунку. Ось як це виглядає на панелі управління:
, який містить шлях до файлуУся інформація з app.json відображається на цій сторінці: назва, опис, логотип. Як ви можете бачити, додаток для PostgreSQL визначений за замовчуванням завдяки одній конфігураційній опції:
{"addons":["heroku-postgresql:hobby-dev"]}
Після того, як ви натиснете на “Розгорнути безкоштовно”, розгортання почнеться, і за кілька секунд ви отримаєте працюючий сайт. За умови, що у вас у гілці master є робочий код :) Ось додаткова інформація про налаштування розгортання в один клік.
Додатки для популярних завдань
Якщо вам потрібно додати cron-завдання, є додаток Heroku Scheduler. Документація детально описує, як з ним працювати.
Платформа Heroku сама по собі не надає сервіс електронної пошти. Для цього вам знадобиться зовнішній SMTP-сервер. Але у списку доступних додатків (категорія Email/SMS) ви можете знайти сервіси, які вже були інтегровані.
Висновок
Це мінімум, що вам потрібно, щоб почати працювати з Heroku. Якщо вам потрібні додаткові інструменти, не згадані в цій статті, спробуйте знайти їх у списку додатків. Найпопулярніші інструменти повинні бути там. Чи заслуговує Heroku на те, щоб бути достатньо хорошим виробничим сервером? Мені важко зараз це сказати, оскільки я не маю великого досвіду з ним. Але він досить хороший як середовище для тестування з швидким процесом розгортання. Він також підходить для проектів з відкритим кодом, які можна розгорнути в один клік.