mosaica.ru (v. 1.5)
Новая версия сайта "Главные новости Ульяновска"
Брифинг
- Разработать новый движок
- Движок должен обладать:
- Простой расширяемостью
- Высокой производительностью
- Гибкой системой разграничения доступа (как это было в Drupal)
- Гибкой таксономией для разграничения контента и управляющих структур
- Механизм авторизации через соцсети
- Интеграция со сторонними сервисами (например, Hypercomments)
- Поддерживать внешние API вызовы предыдущей версии сайта (напр. API для Iphone)
- Движок должен обладать:
- Улучшить взаимодействие редакции с сайтом
- Продумать простые интерфейсы управления
- Реализовать механизм лонгридов (по аналогии с tilda)
- Внедрить Drag'n'drop редактор контента
- Внедрить редактор изображений
- Разработать адаптивный дизайн
Предыдущая версия сайта была разработана на платформе Drupal 7. За время работы система претерпела очень много различных изменений (в том числе и ядра) в стенах компании, что сильно усложнило поддержку этой системы и, в целом, замедлило обработку запросов.
В результате, было решено разработать новую систему управления сайтом, которая обеспечила бы высокую скорость работы и возможности для различных модификаций и расширений.
Итерации
Составление требований
Мы потратили довольно много времени на сбор пользовательских данных. Проводили опросы, просили заполнить анкеты, присылать идеи, предложения и жалобы, относительно изначальной версии сайта. На основе полученных данных мы решали в каком направлении двигаться при разработке новой версии сайта.
Проектирование
Проектирование любой системы играет отнюдь не последнюю роль. Для проектирования мы использовали UML, Sitemap, ER-диаграммы. Почти каждый системный компонент неоднократно обсуждался и дорабатывался "на бумаге" прежде чем был реализован на языке программирования.
Подход к разработке
К сожалению, мы были сильно ограничены во времени, поэтому пришлось работать с уже привычными инструментами, на которых рука, как говорится, уже набита. Именно поэтому, к примеру, используется первый Yii, а не второй.
База данных, как водится, проектировалась в виде er-диаграмм в MySQL Workbench, нечто вроде UML в lucidchart, трекер задач с поддержкой scrum - jira от atlassian. Вообще продукты atlassian мы очень активно юзаем, в их числе hipchat для общения, confluence для документации и прочего, а также bitbucket, где мы храним исходники компании.
Верстка проекта выполнялась на less с использованием boostrap 3, а для админки купили тему smart admin.Верстка проекта выполнялась на less с использованием boostrap 3, а для админки купили тему smart admin.
Разработка
Помимо данных, нам, с небольшими изменениями, удалось перенести некоторые программные части старой мозаики, например API приложения для Iphone, API для Chrome extension, погоду и курсы валют. Писать все это с нуля - означало тратить драгоценное время, которого у нас было очень мало.
Вообще по части переиспользования кода, mosaica_v1.5 - рекордсмен среди наших проектов. Например, механизм отложенной публикации и резак изображений в усовершенствованном виде перекочевали сюда из так и не увидевшего свет polit.mosaica, а генерация url и редактируемые шаблоны пришли из проекта ka73. Виджет для просмотра информации из Яндекс.Метрики является адаптированным под Yii плагином Wordpress, а информер Google Analytics был выдран из модуля Ycm.
Констроль доступа
Система управления доступом представляет собой гибрид RBAC (Role base access control) и DAC (Discretionary access control). Суть этого подхода заключается в существовании привилегий как объектов (permission), каждый из которых (в идеале) служит для доступа к единственной функции (unix way). Роль является одновременно ролью из Yii RBAC (т.е. у нас остаются встроенные возможности контроля доступа на основе ролей) и набором объектов привилегий. Из этого выходит, что каждая защищенная единица системы либо требует наличия одного из разрешений (которое может содержаться в роли), либо обладание конкретной ролью. Вот изображение наглядно иллюстрирующее эту иерархию:
Плюс такого подхода в том, что при условии если нам нужно наделить того или иного пользователя каким-либо доступом (например, смм-менеджера) - нет необходимости создавать для него отдельную роль. Мы просто временно назначаем конкретно ему необходимые разрешения.
Перенос данных
Перенос данных осуществлялся в четыре этапа, для каждого из которых были разработаны собственные утилиты:
- Импортирование материалов
- Импортирование url
- Импортирование счетчиков просмотров
- Импортирование пользователей
Для реализации импортеров материалов и пользователей использовалась связка python + sqlalchemy из-за достаточно сложных процессов преобразования и обработки обширных связей данных, остальные реализованы силами PHP + PDO.
Таким образом был реализован тулсет из 4 утилит: import_nodes, import_url, import_users, import_view_counters.
Через некоторое время, к ним добавилось еще пара утилит - import_redirects для миграции друпаловских редиректов и import_recovered_nodes_json_from_google*.
В 2014 году, в результате хакерской атаки, мозаика потеряла большой массив данных. Бэкапы, к сожалению, на тот момент делались время от времени, и в итоге почти все данные за 2014 год были потеряны. Чтобы хоть как-то компенсировать потерянную информацию, я запилил на Ruby набор утилит, предназначенных для выкачивания информации из кэша Гугла. Все это выкачивалось и сохранялось в виде JSON файлов. Однако на тот момент нам не хватило знаний, чтобы затолкать эти данные обратно в Drupal. Утилита import_recovered_nodes_json_from_google предназначена для переноса этих восстановленных материалов в базу новой мозаики.
Деплой
Запуск сайта мы производили глубокой ночью, чтобы не мешать пользователям. В пятницу, 23 октября 2015 года, состоялась первая попытка замены старой мозаики на новую.
К сожалению, запустить все с первого раза не удалось - возникло несколько плавающих проблем импорта данных, не возникавших во время тестирования, выяснились некоторые несовместимости конфигурации сервера, а также проявились недоработки движка. Вся суббота ушла на исправление замеченных багов, и в воскресение в 05:24 утра мозаика была запущена окончательно. Старая версия ушла на поддомен old.mosaica.ru, а новая теперь стояла на основном домене, готовая удивлять посетителей, столь радикальным преображением сайта. Подбросив воображаемую шапку ввысь, я лег спать с чувством выполненного долга.
Что мы имеем в итоге
- Увеличение производительности в три раза
- Уменьшение потребления ресурсов
- Более производительная структура базы данных, с сохранением былой гибкости
- Новый интерфейс (как пользовательский, так и административный)