[MODX/Laravel] DevDocker - удобная разработка под Linux
Всем приветики, в общем ни для кого не секрет что докер — это шикарная магическая штука и где то там его активно используют но не в modx конечно, где код до сих пор пишут в браузере. В общем 4 года я был в поиске оптимального решения как правильно и удобно вести разработку проектов (раньше на MODX, сейчас на фреймворках) и в итоге могу точно заявить, что я нашел идеальное решение! Под катом я расскажу все что я пробовал за 4 года и минусы каждого решения, ну а не терпеливые могут просто посмотреть видео сборки, которая решает их все или перейти сразу к гитхабу:
За время которое я использовал это решение я пришел вот к такой структуре настройки:
php и php-fpm стартуют от моего юзера чтобы не было проблем с правами, nginx смотрит в папку ~/Work/config где я через обычный редактор прописываю свой конфиг для каждого проекта, а в ~/Work/hosts лежит ссылка на /etc/hosts где я ручками прописываю домены (да, хостс доступен для записи от обычного пользователя) и вот какие проблемы это порадило:
Конечно же это не единственные кейсы которые я пробовал использовать, но это самые долгоиграющие кейсы, я знал о докере и тогда, но для меня это казалось оверкиллом и чем то невероятно сложным, с переходом работы в команду и на laravel мне пришлось его использовать, но как я и предполагал докер не самое удобное решение, нет, оно конечно в разы удобнее чем вышеперечисленные кейсы но он не решал следующие проблемы:
Что он делает? Какие проблемы решает? Ну начнем по порядку, он автоматически добавляет записи в hosts, автоматически разворачивает modx/laravel и базу данных, и для каждого проекта разворачивает свое окружение, вот малый список проблем который он решает:
Видео
GitHub
Проблематика и личный опыт
Храним все на сервере
Есть такая штука в phpStorm как синхронизация локальных файлов с файлами на сервереFile->New project from Existings Fileи да, вполне удобная штука если вынести ядро modx локально, выкачивать только asset'ы и cor'ы компонентов, с помощью этого способа я разрабатывал сайты почти 1.5 года и вот какие проблемы меня поджидали- Невозможность использовать ресурсы своей машины, хотя их значительно больше чем на сервере, особенно актуально когда нужно единоразово спарсить большой объем данных
- Медленная работа всего что только можно: сохранение файла = его загрузка на сервер, да, пусть это миллисекунды, но сплюсуйте все эти миллисекунды и получите очень не хилую задержку
- Зависимость от удаленного сервера: тут все очевидно — нет интернета — работа стоит, проблемы у хостера — работа стоит, закончилось место — работа стоит и еще десятки минусов
- И самое главное — это генерируемые файлы: да, в modx не много файлов генерируются самим движком, но однако бывает, что это необходимо сделать, например прикрутить элементарный композер и вот тут наша удаленная синхронизация превращается в настоящий ад, пакеты нужно устанавливать и на удаленном сервере отдельно и на локальной машине отдельно, любые генерируемые на сервере файлы нужно выкачивать вручную и т.д. думаю вытекающие проблемы для всех тут очевидны
Поднимаем свой локальный сервер
Ну тут все просто когда проектов 10 и все сложно когда их 50 или они все разные, берем ручки, запасаемся мануалами, устанавливаем php-fpm, nginx, модули для php, mysql все это дело настраиваем один раз, разворачиваем пару проектов, смотрим какие части динамические из конфигов и что лучше всего разделить на разные includ'ы и все это дело настраиваем второй раз.За время которое я использовал это решение я пришел вот к такой структуре настройки:
php и php-fpm стартуют от моего юзера чтобы не было проблем с правами, nginx смотрит в папку ~/Work/config где я через обычный редактор прописываю свой конфиг для каждого проекта, а в ~/Work/hosts лежит ссылка на /etc/hosts где я ручками прописываю домены (да, хостс доступен для записи от обычного пользователя) и вот какие проблемы это порадило:
- Невозможность актализировать hosts, через пару месяцев работы hosts полон десятками не нужных сайтов которых у меня уже давно нет локально, выглядит все это сумбурно и некрасиво
- Невозможность актуализировать конфиги, папка config разрастается десятками файлов где фиг пойми что из этого нужно, а что нет
- Для разных проектов нужны разные технологии из за чего домашняя машина обрастает всевозможными редисами, мемкешами, и другими сервисами которые в нужны были для запуска пары залетных проектов
- Локальный mysql обрастает десятками БД которые уже не нужны, и со временем начинают сыпаться
- Сложность передачи проекта другому человеку: когда у меня появились ребята которые мне помогали с работой мне было им довольно сложно объяснить как это все настроить у себя, да и не двеопсы они чтобы во всем этом разбираться
Привет, Docker
Конечно же это не единственные кейсы которые я пробовал использовать, но это самые долгоиграющие кейсы, я знал о докере и тогда, но для меня это казалось оверкиллом и чем то невероятно сложным, с переходом работы в команду и на laravel мне пришлось его использовать, но как я и предполагал докер не самое удобное решение, нет, оно конечно в разы удобнее чем вышеперечисленные кейсы но он не решал следующие проблемы:
- nginx конфиги как надо было писать для каждого проекта так и надо, просто теперь они более структурированные
- В hosts все также надо было добавлять записи
- Команды довольно длинные и сложные
DevDocker
Что он делает? Какие проблемы решает? Ну начнем по порядку, он автоматически добавляет записи в hosts, автоматически разворачивает modx/laravel и базу данных, и для каждого проекта разворачивает свое окружение, вот малый список проблем который он решает:
- Добавление записей в hosts
- Автоматическая генерация nginx файлов
- Одинаковая внутренняя структура файлов, что позволяет не заморачиваться по поводу конфигурирования config.core.php
- Одинаковые доступы к БД для каждого проекта, что позволяет не искать нужную базу данных и доступы к ней каждый раз
- Удобный деплой (да, его можно развернуть на сервере одной командой и все будет точно также работать как и у вас на локальной машине, только извне)
- Упрощение команд через Makefile, все максимально просто и понятно
- Одну и ту же сборку можно использовать как для старых проектов, так и для новых (просто закидываем старый проект в app и не соглашаемся на развертывание системы при init)
- Быстрое разворачивание новых проектов
Комментарии: 48
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Хорошо, друг, забудем про 50 проектов и 50 бд, предположим один проект, на локальной машине, у меня проекты храняться в ~/Work/AnyName на машине клиента в /var/www/other на машине клиента есть и активно используется redis у меня его нет. Так вот чтобы перенести обычный сайт, мне нужно:
- Развернуть redis у себя
- Поменять все пути в config.core.php
- Поменять доступы к БД
Ansible может сделать так чтобы я этого не делал? И если да, то как, поделишься?Части которые тебе нужно каждый раз для каждого проекта менять i.imgur.com/keHUXYA.png знать пользователя и БД, расположение папок и т.д., я уже молчу что из примера выше тебе нужно будет еще и redis у себя развернуть и еще миллион телодвижений сделать, в общем безсмысленный диалог, давай его заканчивать, ты останешься при своем мнение, я при своем)
Начало:
Клонируем сборку локально, пишем make init выбираем modx, соглашаемся на инициализацию нового проекта и просто работаем
Деплой:
Перекидываем папку с проектом на сервер, пишем make init отказываемся от инициализации нового проекта и все, на сервере у нас все точно также работает, ничего устанавливать не надо, никакие базы данных создавать или менять конфиги также не надо не зависимо от того в какую папку вы положили проект локально или на сервере
В случае если проект уже существующий, то просто закидываем его в папку app заменяем modx.sql на свой пишем make init отказываемся от инициализации нового проекта и все точно также просто работает
А как себя ведёт БД в докере на production?
Пока только видел, что так совсем не стоит делать по ряду причин.
И в этом случае, если контейнер Docker с БД упадёт, то все данные до последнего сохранённого дампа тоже пропадут?
Проекты которые не поддерживаете наверное лучше все таки на статическом сервере держать, все таки это надежнее чем любая виртуализация
Нет конечно, дамп при down контейнера делается на тот случай, чтобы вы могли полностью удалить папку с bd и пересобрать контейнер, а так вся активная БД монтируется в папку ./bd которая появляется после первой сборки контейнеров
Я сейчас так поступаю: залетным клиентам я настраиваю статический сервер и прощаюсь с ними навсегда, только этот статический сервер все равно смотрит на докер конфиги, чтобы в случае чего я мог забрать именно ту конфигурацию, которая в данный момент у клиента парой кликов, а вот клиенты которые на поддержке и в вечно активной разработке находятся на моем сервере где кроме докера ничего больше не установлено и крутятся в контейнерах, это позволяет за секунды делать деплой, да и если что то случится мы с ними все равно на связи, но повторюсь, за три месяца инцидентов у меня не было)
Вот например один из таких сайтов в контейнере: yugsn.ru/
Раньше — да, распространенное мнение было, но не сейчас, например у нас в компании наш продакшн лежит в контейнерах под управлением kubernetes, правда и наш продакшн настраивал не Павел Зарубин, а опытные девопсы, по этому конкретно за свою сборку могу говорить только за себя, что пока что инцидентов по ней не было, но это вовсе не значит что не стоит использовать докер на продакшене
Можете уточнить, пожалуйста, что означает данная цитата?
Уже давно мечтаю о связке MODX с Laravel, чтобы использовать возможности MODX (чанки, сниппеты, админка) и Ларки (Eloquent, Carbon, Blade) вместе.
Когда начинал знакомится с laravel пробовал это сделать, работает, но получается монстр франкенштейна)) Без изменений ядра совершенно безсмысленное и трудоемкое занятие, в итоге ушел в полностью в laravel и yii, с modx'ом меня связывает пара клиентов, мои компоненты и офигенное сообщество)
Хочешь работать по-старому «как раньше»? Пожалуйста!
Хочешь использовать функции Blade и Laravel — пожалуйста!
Хочешь в Blade использовать тэги, чанки и сниппеты Evolution — пожалуйста!
Тот же родной MODX с очень большой перспективой.
Я имею в виду именно Evo 2.0 (где от MODX осталось всё), а не October CMS.
смешно)))
Тут уже не раз обсуждался форк modx revo, но давай повторим:
Смотри, объясню тебе проблематику почему так невозможно сделать в Revo
1) Поломаешь всю совместимость с существующими компонентами, а переписывать свои компоненты никто не ринется, т.к. больше половины разработчиков уже потерялось
2) Оставлять старую админку? Но многие не довольны ExtJS, да и ExtJS 3.4 устарел, получается что нужно писать новую админку, но если писать новую админку, то даже те, кто захотят перенести свои компоненты — никогда не согласятся это сделать если еще и фронт надо будет переписывать
3) Предположим что мы решили написать новую админку на условном VUE и Rest api, идем дальше, что делаем с кодом в браузере? Такую же систему что и октября, где код можно и в файлах и браузере писать, ну ок.
4) Что делаем с системой событий? Их слишком много, они слишком нагружают систему и слишком не грамотно реализованы? Переписываем на событийную модель laravel выпилив половину не нужных событий? Ок
5) Система прав в Revo реализована плохо, не безопасно и тормознуто, тоже переписываем?
Так и что у нас от MODX то осталось в итоге? ТВ поля и пару синтаксических сахаров? Ну и получаем мы в лучшем случае Evo 2.0
А по итогу получаем мы никому не нужную CMS о которой никто не знает, без какого либо комьюнити и компонентов, которая держится на паре калек которые через год бросят эту идею в принципе
Я бы привел как хороший пример Evo 2.0, но увы нет, они как были отшельниками modx 10 лет назад, так ими и остались, комьюнити никакущее, серьезных компонентов типо minishop2 как не было, так и нет, и это при том, что у них есть офигенный бэкграунд, 10 лет назад (или 13, уже не помню) они решили делать революцию и идти в ногу со временем выпуская сначала свои доработанные сборки modx evo, а потом и совсем отделившись, друг, напомню, они шли к тому что есть у них сейчас больше 10 лет и все равно остались на задворках сайтостроительства имее рок-н-рольский бэкграунд и откусив не малую часть тогдашнего сообщества. Как бы не было грустно, но дайте modx спокойно уже умереть
Только вот Evo 2.0 это не MODX, а скорее Lumen с синтаксическим сахаром под MODX, прочитайте внимательно мой комментарий, цитирую
А в Evo осталась только идеология от modx, которая будем честны также уже давно устарела
И собственно именно по этому Evolution избавился от приставки «Modx» и давненько уже себя позиционирует как совершенно другая CMS
Почему бы не сделать подобное под Revo?
Да, не надо весь фреймворк со всеми компонентами тащить в Revo. Будет вообще сказка и вообще — большой рывок.
Во-первых, спасибо за пост. Всегда интересно узнать какой у кого техпроцесс. Мы используем почти 10 лет метод, который в посте описан как «Храним все на сервере» и признаться честно, первые 3 из 4-х недостатков относятся все же не к организации рабочего процесса, а к хостингу проекта:
1. У меня многоядерный комп, много памяти, ssd и все такое, но хостинг наших всегда был и остается лучше (к слову, modhost очень хорош, но мы работаем на выделенном сервере, и он эволюционирует со временем, как и рабочие станции разработчиков
2.… сплюсуйте все эти миллисекунды и получите очень не хилую задержку //только при первой загрузке когда много файлов улетает на сервер, а после, ну правда, за время переключения из phpstorm в браузер и нажатия F5 там уже всегда все прилетает (и нет, я не слоупок, переключаюсь по ALT+TAB и все такое)
3. "… нет интернета — работа стоит" //… секунд 30 пока переключаешься на мобильный интернет, в 21м веке-то. "… проблемы у хостера — работа стоит, закончилось место — работа стоит" // в этих случаях, «Хьюстон у нас ПРОДАКШН СТОИТ» — так что это все же нельзя считать за минус организации рабочего процесса, как мне кажется, если недостаточно хороший хостинг и все валится вот так, то все равно проект уедет на достаточно хороший хостинг или загнется) в любом случае эти проблемы отпадут.
"… и еще десятки минусов" // а какие еще могут под этот пункт подходить?
По последнему пункту минусов хранения всего на сервере "4. И самое главное — это генерируемые файлы..." у меня вопросов нет, неудобства встречаются. Разве что, в нашей практике не приходится выкачивать генерируемые файлы, т.к. если они генерируемые, зачем может понадобится править их на локалке? Правятся конфиги или какие-то шаблоны, по которым они генерятся (тот же конфиг composer: исправил, залил, локально запустил и там запустил, готово)
Зачем? Это же к сути поста и крутости предлагаемых решений описанных проблем вообще никаким боком…
Смешно, оставлю без комментариев
Потому что все, в том числе и я, считают modx лучшей из CMS по сей день, и от этого в несколько раз грустнее потому что она остается актуальной даже отстав от всего мира разработки лет на 10
Каюсь, не очень красиво получилось, наверное. Но я и в жизни не самый позитивный парень
Да за тем, что это не нормально и нужно что то менять, возможно каждая такая колкость и сподвигла людей на обсуждение (которое к слову началось сегодня) в группе контрибьютеров о форке. И хотя я и считаю что форк мертворожденная идея, но это единственная возможность сделать хоть что — то, 3я версия не решит ни одну из проблем
И слушают логи только по отдельной части разрабатываемого модуля, а зачастую это несколько логов одновременно, посмотрел бы я как бы ты это делал на сервере когда таких частей надо слушать сразу 4 например.
Ну и + ко всему генерируются не обязательно логи или служебные файлы, иногда генерируются php модели, да в том же modExtra при билде xml схемы генерируются модели, которые в случае с серверной разработкой нужно выкачивать при каждом изменении
Я решил эту проблему, подняв вместо nginx-прокси Traefik, который отвечает за резолвинг локальных доменов, причем он умеет в нормальный https и позволяет декларативно прописывать домены прямо в docker-compose.yml. А чтобы не возиться с хостами, я сделал локальную доменную зону через dnsmasq.
В ближайшее время выкрою время и допишу парочку своих заметок на эту тему.
А вот насчет того, что креды у БД везде одинаковы, это все же небезопасно, даже если крутится в контейнерах.
docker system prune -a и прочее — это ж если какие другие окружения на докер подняты, грохнет все к херам. Нельзя так, даже если очень хочется. Я б за нож взялся, случись у меня такое. Хоть это и makefile для удобства, но я бы ограничивал бы его областью конкретного окружения, то есть управлять только тем, что описано в docker-compose.
Делать дампы БД, когда в docker есть data-volumes, которые в случае с mysql работают просто как часики (чего не скажешь о postgress) — выглядит крайне крипово. Они сторят файлы БД на локальной машине, сам сервер — в контейнере. При перезапуске данные всегда на месте. Тем более, что конфиги ты через них уже пробрасываешь.
Остальное уже придирки. Инструмент задачу решает — уже хорошо.
Перестраховка, не более, которая позволяет грохнуть папку db в любой момент пересобрать контейнер полностью и сохранить все данные, с текущей скоростью SSD/NVME даже с тяжелыми БД операция дампа происходит довольно быстро, так почему бы не перестраховаться лишний раз?
Я знаю как работает мой конфиг, спасибо )))
Я его тоже использую, в том случае если нужно зарезолвить динамические поддомены, например, но полностью переходить на него не вижу смысла, hosts с 90% задач справляется на ура
Есть в планах прикрутить генерируемые самоподписанные сертификаты, чтобы и локальное окружение было на https
Почему? Бд слушает обращения только с локальной стороны, а если у кого то есть доступ к локалке, то бд уже вскрыта потому что любой php проект хранит доступы к бд прямо в коде
Я по стечению обстоятельств тимлидствую ещё и над несколькими девопсами и мои рекомендации и замечания основаны на определенном практическом опыте этих людей.
Я не сомневаюсь в твоих знаниях и авторитете ни в коем случае, просто пока что я не услышал ни одного способа и выглядит это как придирка и ворчание.
Не спроста, но у нас извини меня 40 миллионов пользователей и посещаемость 400 хостов в секунду и это только по веб части, еще есть api часть которую используют IOS/Android приложения, но какая там нагрузка знать не в моей юрисдикции.
Или ты предлагаешь рассказывать людям работающим на modx как построить контейнеры способные держать 400 хостов в секунду в течении месяцев без перебоев?
Количество CMS множится, ибо инструментов стало столько, что народ начал придумывать что-то своё в различных комбинациях. Зайди на хабр, удивишься. Конкуренция растёт, поэтому популярность таких мамонтов как WP, Joomla, Drupal и остальных снижается. Вот и весь секрет.
А пенять на MODX, что он не может работать в высоконагруженной системе, это уж какой-то лужапук. Ну не предназначен он для этого. Высоконагруженные системы — это отдельный мир. Ты удивишься, но тот же Laravel имеет невысокие показатели среди других фреймворков по RPS (request per second). Зачем развотить холиварные темы?
А статья интересная, плюсанул. Пытаюсь побороть себя поставить на локалку с Windows основной вэб стек (Linux, MySQL, NGINX, PHP) в контейнере. Но времени нет.
Я не путаю горячее с мягким и вовсе не говорю что modx должен держать 400 запросов в секунду
Я не слежу за количеством CMS, но мне достаточно посмотреть на октябрь, о котором я слышу из каждого угла и то, насколько у них тухлое сообщество и какие детские болезни.
Ну началось, мерить скорость фреймворков — себя не уважать, фреймворки — это конструкторы ядра и тебе ничего не мешает взять любой модуль который тебя не устраиват и заменить его на что угодно, у того же Laravel есть люмен с минимальным функционалом, если тебе не хочется тянуть кучу не нужных модулей, а уж там точно нечему тормозить
и
Это 2 соседних комментария. Наверно и тут можно выкрутиться, что там имел ввиду не это, а тут не то.
Вон оно чё, Михалыч. Т.е. когда выбирают фреймворк под высокопосещаемый сайт, кидают кости или смотрят у кого строк в коде больше. Ух уж эти подлые манипуляторы. ))
Я понимаю о чём ты говоришь. Но с формальной точки зрения Lumen — это не Laravel. Это микрофреймворк от того же автора. А я говорил именно о популярном Laravel.
Ладно, забей, далеко уже ушли от темы.
Ого, кто то выбирает каждый раз разный фреймворк? Не завидую я этим людям. Обычно берут то что хорошо знают или то, у чего перспективы на долгое развитие, это, фреймворк, он создан для того, чтобы на нем делали что угодно и какой угодно производительности не вводя никаких ограничений, я сейчас говорю про PHP фреймворки, а не про гибриды по типу Spiral