Телепортация MODX. Решаем проблемы деплоя

Иван Климчук, Alroniks Experts.

Иван Климчук

Телепортация MODX

Решаем проблемы деплоя

Разработка

Этапы разработки

Известные недостатки MODX

Тестирование

Перенос сайта

OK. Перенесли

И тут заказчик решает добавить на сайт новый раздел

— Я все оплачу, делайте!

Заказчик

¯\_(ツ)_/¯

Неужели нет решения?

SE Manager + StaticSaver + git

+ Быстрый экспорт элементов в файлы из админки
+ Автоматическая подстановка имени файла в форму ресурса
+ Контроль версий для статических элементов
- При добавлении файла нельзя автоматически создать элемент
- Нельзя использовать ссылки на ресурсы по id
- Нет сведений о состоянии системы

ElementHelper + git

+ Умеет TV
+ Умеет отслеживать историю изменений элемента
+ Есть автоудаление элементов
+ Умеет создавать элементы из файлов
- Нельзя использовать ссылки на ресурсы по id
- Нет сведений о состоянии системы

Cast

CAST - Content Addressable Storage and Transfer, библиотека для MODX, построенная вокруг git.
+ Работает с объектами xPDO
+ Обертки git-команд в самой библиотеке
+ Есть настройка того, что нужно сериализовать
- Не поддерживает команды с взаимодействием с пользователем
- Перед десереализацией удаляет записи из таблиц

Gitify

Новый инструмент от Марка Хамстры, презентованный на MODX Weekend.
+ Конфигурация в YAML
+ Дополнительные команды для управления сайтом
+ Данные хранятся в виде обычных файлов, конфиги в заголовках
- На сегодня очень мало умеет и еще в разработке
- Не удобно править файлы, не срабатывает подстветка синтаксиса

Общие проблемы

Teleport

Teleport

Teleport - это расширяемый набор скриптов для работы с одним или несколькими локальными экземлярами MODX Revolution.

github.com/modxcms/teleport
Автор: Jason Coward

MODX Cloud

Установка

  1. Создать папку teleport там, где удобно. Обычно в /home/username
  2. Скачать в нее teleport.phar

Каталоги

Во время работы teleport создает каталоги:

Как работает?

  1. Создание профиля
  2. Упаковка сайта в пакет
  3. Перенос пакета в нужное место
  4. Создание профиля целевого сайта
  5. Распаковка и установка обновлений

Что умеет?

Profile

				php teleport.phar \
				    --action=Profile \
				    --name="MySite" \
				    --code=mysite \
				    --core_path=/path/to/mysite/modx/core/ \
				    --config_key=config
			

Extract

				php teleport.phar \
				    --action=Extract \
			 	    --profile=profile/mysite.profile.json \
			 	    --tpl=phar://teleport.phar/tpl/complete.tpl.json
			

Inject

				php teleport.phar \
				    --action=Inject \
				    --profile=profile/mysite.profile.json \
				    --source=workspace/mysite_develop-120315.1106.30-2.2.1-dev.transport.zip
			

Push

				php teleport.phar \
				    --action=Extract \
				    --profile=profile/mysite.profile.json \
				    --tpl=phar://teleport.phar/tpl/complete.tpl.json \
				    --target=s3://mybucket/snapshots/ \
				    --push
			

UserCreate

				php teleport.phar \
				    --action=UserCreate \
				    --profile=profile/mysite.profile.json \
				    --username=superuser \
				    --password=password \
				    --sudo \
				    --active \
				    --fullname="Test User" \
				    --email=testuser@example.com
			

Packages/GC

				php teleport.phar \
				    --action=Packages/GC \
				    --profile=profile/mysite.profile.json
			

Шаблоны

Шаблоны

changeset.json.tpl

Извлекает определенный набор изменений, зафиксированный обратной функцией, заданной в настройках MODX.

settings.json.tpl

Извлекает все настройки из первого сайта для импорта во второй, обновляет и дополняет существующие.

complete.json.tpl

Извлекает все объекты ядра, файлы и пользовательские таблицы из первого сайта и заменяет все это во втором.

complete_db.json.tpl

Извлекает все объекты ядра и пользовательские таблицы, без файлов.

packages.json.tpl

Извлекает все пакеты из первого сайта и устанавливает во втором.

develop.json.tpl

Извлекает все объекты ядра, файлы и пользовательские таблицы из первого сайта для импорта во второй, дополняет существующие объекты и таблицы.

elements.json.tpl

Извлекает все элементы и связанные с ними данные из первого сайта для импорта во второй, обновляет и дополняет существующие.

resources.json.tpl

Извлекает все ресурсы из первого сайта для импорта во второй, обновляет и дополняет существующие.

resource_children.json.tpl

Извлекает все ресурсы, которые являются потомками заданного родительского ресурса.

user.json.tpl

Излекает одного указанного пользователя и сопутствующие данные из первого сайта для импорта во второй.

users.json.tpl

Излекает все пользователей из первого сайта для импорта во второй, обновляет и дополняет существующих.

Собственные шаблоны

Простейший шаблон
				{"name":"elements", "vehicles":[]}
			

Пример собственного шаблона

				{"name":"elements", "vehicles":[
			        {
			            "vehicle_class":"xPDOFileVehicle",
			            "object":{
			                "source":"{+properties.modx.core_path}components",
			                "target":"return MODX_CORE_PATH;"
			            },
			            "attributes":{
			                "vehicle_class":"xPDOFileVehicle"
			            }
			        }
			    ]}
			

Пример собственного шаблона

							{"name":"elements", "vehicles":[
							    {
							        "vehicle_class":"xPDOObjectVehicle",
							        "object":{
							            "class":"modPropertySet",
							            "criteria":["1 = 1"],
							            "graph":{
							                "Category":[]
							            },
							            "package":"modx"
							        },
							        "attributes":{
							            "preserve_keys":false,
						
							            "update_object":true,
							            "unique_key":"name",
							            "related_objects":true,
							            "related_object_attributes":{
							                "Category":{
							                    "preserve_keys":false,
							                    "update_object":true,
							                    "unique_key":"category"
							                }
							            }
							        }
							    },
							]}
						

Телепортация

Телепортация A в B

Сайт A Сайт B
Profile: sitea.profile.json Profile: siteb.profile.json
Extract:
packages
develop
Inject:
packages
develop
Синхронизированы

Телепортация modx.by

Профиль для modx.by.dev.alroniks.com
				php teleport.phar --action=Profile \
				--name="modxbydevalronikscom" --code=modxbydevalronikscom \
				--core_path=/var/www/modx.by.dev.alroniks.com/www/core/ \
				--config_key=config
			

Телепортация modx.by

Профиль для modx.by
				php teleport.phar --action=Profile \
				--name="modxby" --code=modxby \
				--core_path=/var/www/modx.by/www/core/ \
				--config_key=config
			

Телепортация modx.by

Упаковка для modx.by.dev.alroniks.com
				php teleport.phar --action=Extract \
				--profile=profile/modxbydevalronikscom.profile.json /
				--tpl=phar://teleport.phar/tpl/elements.tpl.json /
				--target=/var/www/modx.by/www/core/packages/
				--push
			

Телепортация modx.by

Установка для modx.by
				php teleport.phar --action=Inject \
				--profile=profile/modxby.profile.json \
				--source=/var/www/modx.by/www/core/packages/
modxbydevalronikscom_complete-141125.1702.46-2.3.2-pl.transport.zip
			

Migrate a MODX site in under 15 minutes

Проблемы

Планы

Alroniks Experts

Создание сложных интернет-магазинов и сайтов на MODX

Вопросы?

Исходники на Github