Деплой приложений в BAYRELL Cloud OS осуществляется через веб интерфейс. Основная идея, что пользователю не нужно создавать yaml файлы.
При запуске приложения, пользователь указывает какое приложение нужно запустить, и его необходимые настройки.
Например для запуска сервера MySQL указывается версия БД, root password и хост на котором запустить базу. Для сервера PHP указывается папка с проектом и хост где будет запущено приложение.
YAML файл генерируется автоматически. При сборке докер контейнера создается xml template с инструкциями как запускать это приложения. Поэтому создавать yaml файл не нужно. Он создается автоматически на основе xml шаблона и тех настройек что указал пользователь.
<?xml version="1.0" encoding="UTF-8" ?>
<template>
<uid>org.bayrell.blank</uid>
<name>Blank Template</name>
<version>1.0</version>
<type>default</type>
<branch>main</branch>
<arch>amd64</arch>
<arch>arm64v8</arch>
<maintainer>Ildar <[email protected]></maintainer>
<marketplace>https://cloud_os.bayrell.org/</marketplace>
<link name="Source code">https://github.com/bayrell-os/marketplace</link>
<link name="Marketplace">https://cloud.bayrell.org/ru/marketplace/app/org.bayrell.blank</link>
<xml name="bayrell.org" priority="20">https://cloud.bayrell.org/marketplace/org.bayrell.blank.xml</xml>
<xml name="github.com" priority="10">https://raw.githubusercontent.com/bayrell-os/marketplace/main/org.bayrell.blank.xml</xml>
<date>2022-05-14T18:37:00+06:00</date>
<changelog>First template</changelog>
<yaml>
<services>
<_var_app_name_>
<image>bayrell/example:1.0</image>
<environment>
</environment>
</_var_app_name_>
</services>
<volumes>
</volumes>
</yaml>
<variables>
</variables>
<modificators>
<li>org.bayrell.modificator.cloud_os</li>
<li>org.bayrell.modificator.deploy_hostname</li>
</modificators>
<patch>
<name>Template patch</name>
<operations>
</operations>
</patch>
</template>Модификаторы предназначены для модификации основного шаблона.
Пример, данный модификатор добавляет dns сервер в шаблон.
<?xml version="1.1" encoding="UTF-8" ?>
<modificator>
<uid>org.bayrell.modificator.dns.172.30.0.1</uid>
<name>DNS 172.30.0.1</name>
<version>1.0</version>
<maintainer>Ildar <[email protected]></maintainer>
<marketplace>https://cloud_os.bayrell.org/</marketplace>
<xml name="bayrell.org" priority="20">https://cloud.bayrell.org/marketplace/org.bayrell.modificator.dns.172.30.0.1.xml</xml>
<date>2022-10-20T18:37:00+06:00</date>
<changelog>First template</changelog>
<priority>-1000</priority>
<operations>
<operation type="replace">
<path>/template/yaml/services/*/dns</path>
<value>
<dns>172.30.0.1</dns>
</value>
</operation>
</operations>
</modificator>В разделе operations указываются список модификаций шаблона. Основная идея: на основе xpath делать патч шаблона.
priority - Приоритет операций. Патчи с меньшим числом будут выполнены первыми.
Данный патч добавляет hostname во все ветки по адресу /template/yaml/services/*. При этом, перед добавлением, проверяет существует ли элемент или нет.
<operation type="add">
<path>/template/yaml/services/*</path>
<notExists>/template/yaml/services/*/hostname</notExists>
<value>
<hostname>{{.Service.Name}}.{{.Task.ID}}.local</hostname>
</value>
</operation>Удаляет все вхождения по адресу /template/yaml/services/*/deploy/placement
<operation type="remove">
<path>/template/yaml/services/*/deploy/placement</path>
</operation>Поменять значение по адресу /template/yaml/services/*/dns
<operation type="replace">
<path>/template/yaml/services/*/dns</path>
<value>
<dns>172.30.0.1</dns>
</value>
</operation><operation type="addAttribute" priority="1000">
<path>/template/yaml/services/*/volumes</path>
<name>type</name>
<value>array</value>
</operation>Еще не реализовано
Yaml формируется из xml шаблона после выполнения всех модификаторов. Содержимое /template/yaml превращается в yaml файл. При этом все переменные будут заменены соотвествующими значениями.
Тип массив. xml будет превращен в массив.
<yaml>
<services>
<_var_app_name_>
<volumes type="array">_var_app_name_:/data</volumes>
<volumes type="array">/var/run/docker.sock:/var/run/docker.sock:ro</volumes>
<_var_app_name_>
</services>
</yaml>В данном случае все значения _var_app_name_ будут заменены на code_server.
_var_app_name_ это системная переменная означает название приложение. Оно меняется при создании или редактировании приложения.
YAML:
services:
code_server:
volumes:
- 'code_server:/data'
- '/var/run/docker.sock:/var/run/docker.sock:ro'<deploy>
<replicas type="int">1</replicas>
</deploy>Говорит, что значение replicas должно быть конвертировано в число.
deploy:
replicas: 1<cloud_network>
<external type="boolean">true</external>
</cloud_network>Говорит, что значение replicas должно быть конвертировано в логическую переменную.
cloud_network:
external: true<volumes type="map">
<_var_app_name_ type="map" />
</volumes>Определяет что содержимое является объектом
volumes:
code_server: { }