Nikita Global

Создание LAMP и MEAN-среды у себя дома с помощью Devilbox

Текст будет интересен программистам, но в нем есть один анекдот.
Перед программистом, который разрабатывает веб-приложения, стоит задача воссоздания LAMP (Linux, Apache, MySQL, PHP) или MEAN (MongoDB, Express.js, Angular.js, Node.js). Я перепробовал множество способов. Важные моменты создания такого окружения для работы: – – Удобство и быстрая работа, т.к. даже топовые модели домашних компьютеров часто уступают в мощности профессиональным серверам – Соответствие настроек и установленных компонентов тем что будут использоваться в production, т.е. в реальных условиях.
Последний пункт особенно важен, иначе будет как в известном анекдоте:

Устроился программист работать врачом. Приходит пациент, жалуется на боль в ноге. Программист осмотрел ногу и говорит: Ну не знаю, у меня точно такая же нога и она не болит

Разработка на веб-сервере.


В самом начале, когда я только учился веб-разработке, я писал код и загружал на веб-сервер хостинг-провайдера. При быстром интернете это относительно удобно, не нужно адаптировать код под хостинг. Но на этом плюсы заканчиваются и начинаются минусы.
Самый главный – сайт на этапе разработке уже доступен публично, может проиндексироваться поисковиками. Иногда при обрыве связи не догружались и пропадали файлы. Был даже случай когда весь результат работы пропадал при сбоях провайдера. Сейчас я понимаю, что если программист ведет разработку именно таким способом, то лучше с ним не связываться вовсе – это признак новичка.

Создание веб-сервера на своем компьютере

Позже я установил на свой ноутбук Apache, MySQL, PHP, настроил их по доке из интернета. Было удобно, никуда ничего не нужно было загружать. Но после я сменил ноутбук и не захотел проходить этот путь настроек и установок разных модулей снова. К тому же появилось много задач по переносу кода PHP версии 5.x на PHP 7.x, а постоянно переустанавливать PHP утомительно.

XAMPP


Какое-то время использовал XAMPP от Apache Friends. Решение очень простое и популярное среди моих знакомых. Нужно всего лишь скачать один файл и запустить – и у вас полноценный веб-сервер. Программа распространяется на условиях GNU GPL-лицензии, в чем она заключается вы прочитать в интернете, я лишь скажу, что создатели разрешают использовать XAMPP бесплатно и без всяких ограничений на распространение. Одновременно я испытал решение под названием DevilBox и в итоге остановился на нем, хотя XAMPP тоже очень хорошее решение, которое имеет все необходимое и даже больше.

Devilbox

Devilbox – это тоже решение из коробки и тоже бесплатное. Реализовано в качестве контейнеров для Docker. Установка и настройка чуть-чуть сложнее, но оно того стоит. Если на вашей машине нет Докера, то сначала нужно установить его. Всю информацию по установке на Windows, Linux или Mac и настройке вы найдете на сайте docker.com После этого вы устанавливаете сам devilbox.
Инструкция есть на сайте devilbox.orgВся установка выполняется в три действия:

  1. Скачиваем архив и распаковываем или клонируем git-репозиторий с адреса https://github.com/cytopia/devilbox
  2. В папке копируете файл настроек env-example в файл .env и редактируете содержимое. Лично мне потребовалось указать часовой пояс и придумать пароль для базы данных.
  3. Запускаем командой docker-compose up После этого нужно подождать когда будут скачаны необходимые контейнеры и можно начинать работу.
    Devilbox имеет гораздо больше разных инструментов в дополнение LAMP и MEAN. Перечислю некоторые фичы, которые нужны в моей работе:
    • Прежде всего настроенный DNS-сервер bind, благодаря которому достаточно создать папку с названием домена и в ней папку htdocs и в результате локальный сайт будет доступен локально по адресу http://имя_домена.loc
    • веб-интфейс для просмотра отправленных писем. Применяю при тестировании разных форм обратной связи, регистрации пользователей, оформлении заказов и т.д. Также эти письма можно читать в консоли обычными юникс-средствами.
    • Devilbox позволяет также автоматически подключать SSL-сертификаты для новых доменов, что позволяет тестировать сайты по протоколу HTTPS
    • Множество полезных вебприложений (phpmyadmin, adminer и прочие). Установить их несложно, но это время, а здесь они уже идут настроенные
    • Аналогично много нужных консольных приложений, что особенно актуально для пользователей, например, Windows, в которых такие вещи как git нужно скачивать дополнительно, а для то чтобы иметь полноценную linux-консоль со всеми необходимыми программами нужно ставить какой-нибудь cygwin Здесь уже есть git, composer, webpack, PHP Codesniffer, WP Cli (если вы разработчик для WordPress),eslint и многое другое.
      Смена нужной версии PHP или базы данных выполняется указанием версии в файле .env Для отладки кода PHP в версии 7.2 просто выставляете значение PHP_SERVER=7.2 и перезапускаете devilbox. Необходимые стэки скачаются сами.
      По готовности на http://localhost вы увидите такую страницу:

Некоторые моменты настроек – Apache веб-сервер почему-то работал медленно. После замены настройки на nginx в файле .env: HTTPD_SERVER=nginx-stable сервер забегал значительно быстрее. – У меня не было времени вникнуть во все нюансы настройки Докера, лично я запускаю devilbox в линуксе командой nohup docker-compose up > /dev/null &, а останавливаю docker-compose down – Очень часто у меня возникала проблема из-за того что я не всегда останавливал контейнеры devilbox-а, или же, бывало, выключали электричество, из-за этого потом запустить не удавалось, возникала примерно такая ошибка:

ERROR: for devilbox_bind_1 Cannot start service bind: OCI runtime create failed: container with id exists: be31a7b2049afff7f9738cc47f07e6fb6c313db085f15eb7f147bc4c65f303db: unknown
ERROR: for bind Cannot start service bind: OCI runtime create failed: container with id exists: be31a7b2049afff7f9738cc47f07e6fb6c313db085f15eb7f147bc4c65f303db: unknown ERROR: Encountered errors while bringing up the project.

Я долго искал решение в гугле, ничего никто так и не предложил. В итоге изучив вопрос я написал для таких случаев сниппет, который решает эту проблему:

После выполнения этого кода достаточно выполнить docker-compose rm и можно запускать.