S.Tominoff

Fullstack JavaScript разработчик

mosaica.ru (v. 1.5)

Новая версия сайта "Главные новости Ульяновска"

Брифинг

  1. Разработать новый движок
    1. Движок должен обладать:
      1. Простой расширяемостью
      2. Высокой производительностью
      3. Гибкой системой разграничения доступа (как это было в Drupal)
      4. Гибкой таксономией для разграничения контента и управляющих структур
    2. Механизм авторизации через соцсети
    3. Интеграция со сторонними сервисами (например, Hypercomments)
    4. Поддерживать внешние API вызовы предыдущей версии сайта (напр. API для Iphone)
  2. Улучшить взаимодействие редакции с сайтом
    1. Продумать простые интерфейсы управления
    2. Реализовать механизм лонгридов (по аналогии с tilda)
    3. Внедрить Drag'n'drop редактор контента
    4. Внедрить редактор изображений
  3. Разработать адаптивный дизайн

 

Предыдущая версия сайта была разработана на платформе 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 (т.е. у нас остаются встроенные возможности контроля доступа на основе ролей) и набором объектов привилегий. Из этого выходит, что каждая защищенная единица системы либо требует наличия одного из разрешений (которое может содержаться в роли), либо обладание конкретной ролью. Вот изображение наглядно иллюстрирующее эту иерархию:

 

Схема проверки доступа

 

Плюс такого подхода в том, что при условии если нам нужно наделить того или иного пользователя каким-либо доступом (например, смм-менеджера) - нет необходимости создавать для него отдельную роль. Мы просто временно назначаем конкретно ему необходимые разрешения.

 

Пример назначения привилегий
Настройка ролей
 
P.S.: скриншоты довольно старые, в дальнейшем названия разрешений естественно были переведены на более понятный язык.
 

Перенос данных


Перенос данных осуществлялся в четыре этапа, для каждого из которых были разработаны собственные утилиты:

  1. Импортирование материалов
  2. Импортирование url
  3. Импортирование счетчиков просмотров
  4. Импортирование пользователей

Для реализации импортеров материалов и пользователей использовалась связка 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, а новая теперь стояла на основном домене, готовая удивлять посетителей, столь радикальным преображением сайта. Подбросив воображаемую шапку ввысь, я лег спать с чувством выполненного долга.

 

 

Что мы имеем в итоге

 

  • Увеличение производительности в три раза
  • Уменьшение потребления ресурсов
  • Более производительная структура базы данных, с сохранением былой гибкости
  • Новый интерфейс (как пользовательский, так и административный)