Мне нужно получить значение почты/username или еще какие-нибудь данные авторизованного пользователя и потом их передать в другую систему. Как это можно сделать с помощью кода?

Я знаю, что можно получить какое-то значение из системных настроек с помощью функции

this.Terrasoft.SysSettings.querySysSettingsItem(optName, function (val) {

            if(val) resolve(val);

            else reject();

        });

 

Можно ли подобным образом получить e-mail авторизованного пользователя?

Нравится

2 комментария

переменные среды попробуй, можно получить айди контакта, айди текущего пользователя, а дальше уже фильтровать тот справочник , который нужен, потому что учетных записей почты может быть несколько

посмотрите в этом объекте свойства

 Terrasoft.SysValue

к примеру получим айди контрагента тек пользователя

 Terrasoft.SysValue.CURRENT_USER_ACCOUNT.value;

Dima Avdoshin,

Подскажите, как использовать справочник с почтами и фильтровать его?

Показать все комментарии

Добрый день!

Столкнулись с такой проблемой.

В шаблоне письма сделали гиперссылк на запись (пусть будет на новый созданный раздел "Встречи")

При отработки бизнес-процесса пользователю летит письмо с гиперссылкой на конкретную запись в разделе "Встреча".

Пользователь переходит по ссылке - открывается раздел Активности.

 

Дополнительные моменты

1. У пользователя есть доступ к данной записи - он может в нее перейти через уведомления (дополнительная возможность перехода в запись)

2. Раздел скрыт от пользователя

3. Если переходить по гиперссылке под учеткой Supervisor, то запись открывается.

 

Вопрос - почему не открывается запись у обычного пользователя?

Нравится

5 комментариев

Здравствуйте!

 

Пробовали очистить кэш Redis командой flushall?

Работа данного функционала завязана на пользовательский кэш. 

Возможно часть данных у пользователя закэшировалась, поэтому открывается неправильная страница. 

Проблему решили. Нужно было раздел показать пользователям.

Но все равно это странно. По уведомлению можно перейти на запись в скрытом разделе, а по гиперссылке из письма нет - почему?

Добрый день!

Прошу пояснить - почему по ссылке из уведомления можно попасть на запись в скрытом разделе, а по гиперссылке нельзя?

Пробуйте передавать ссылку в таком формате:

 

https://site/Navigation/Navigation.aspx?schemaName=Activity&recordId=ab3ea5de-f333-4580-8fa1-70b64db8a2d3
Где schemaName=Название схемы, recordId=id записи

 

Ссылка в письме верная - так же как указано у Вас.

не помогло

 

заметил, что при переходе по гиперссылке из письма я иду на схему

https://click.mail.ru/redir?u=https%3A%2F%2F_______.creatio.com%2FNavig…

 

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

https://______.creatio.com/0/Nui/ViewModule.aspx#CardModuleV2/NavEventN…

Показать все комментарии

Добрый день.

Возможно кто-то разбирался, как реализован вызов нужного метода по указанному названию класса макроса в шаблоне email сообщения?

Хотелось бы разобраться, так как бизнес-задача - создавать черновики email сообщений по шаблону с макросами без отправки, что приходится делать через код (low код тут не помогает), и никаких примеров я не нашла ни на академии, ни в сообществе.

Сейчас нашла пример в коде (схема EmailTemplateSender) и реализовала создание черновика по шаблону так же. Выглядит костыльно, хочу причесать.

Буду благодарна за помощь, спасибо!

Нравится

1 комментарий

Надежда, добрый день!

Не совсем понимаю о каком вызове нужного метода по указанному названию класса макроса в шаблоне email сообщения вы говорите.

Речь о подстановке макроса при его выборе в меню отправки сообщений обращения?

Показать все комментарии

Добрый день!



В этом посте покажу как можно развернуть микросервис Exchange Listener в Docker с помощью одной команды. 



Изначально нам нужно настроить среду, то есть установить сам Docker и утилиту Docker-compose. Важно заметить, что данный тип разворачивания подходит для тестирования и разработки. Для работы в проде необходимо использовать kubernetes.



Скачать и установить Docker: https://docs.docker.com/engine/install/debian/

Скачать и установить Docker-compose: https://docs.docker.com/compose/install/




Далее для установки нам необходим yaml-файл. Его я прикрепил к этому посту.

Нужно поместить yaml-файл в произвольную директорию, перейти в нее и выполнить команду:

docker-compose up -d



После выполнения команды автоматически создается сервис в докере. Он содержит отдельный контейнер с редисом и контейнер с микросервисом Exchange Listener, который уже подключен к редису.



По умолчанию микросервис будет доступен по порту 10000. На этом этапе сервис развернут и его можно подключать к приложению Creatio. Чтобы убедиться в корректной работе, нужно перейти по ссылке:



http://адрес_сервера:10000/api/listeners/status



Подробно про дальнейшую настройку в Creatio описано в статье академии.



Теперь давайте подробнее разберем сам yaml-файл:

version: "3"
services:
  ExchangeListener:
    image: bpmonline/exchangelistener:0.8.62 # Последнюю версию ExchangeListener можно посмотреть здесь https://hub.docker.com/r/bpmonline/exchangelistener/tags?page=1&ordering=last_updated
    restart: unless-stopped
    ports:
      - 10000:80 # Проброс порта. Внешний порт:Внутренний порт.
    environment:
      ExchangeListenerRedisHost: redisOfficial:6379 # Строка подключения к Redis.
      ExchangeListenerRedisDatabase: 0 # База данных Redis.
      PodName: ExchangeListener
    depends_on:
      - redisOfficial
 
  redisOfficial:
    image: redis:latest
    restart: unless-stopped
    environment:
      ALLOW_EMPTY_PASSWORD: "yes" # Включение анонимного режима.



 

Прикрепленные файлы

Нравится

Поделиться

0 комментариев
Показать все комментарии

Доброго времени суток!

Подскажите, пожалуйста, можно ли как-то обойти MS Exchange Listener для настройки почты?

Задача в том, что нам от интеграции с почтой нужны просто уведомления, т.е. настроенные шаблонные письма о наступлении или просрочке каких-то событий. Да и большой нагрузки на почту/систему не должно быть.

Стенд открыт для интернета, но почта нужна будет только в локальной сети. Используем outlook.office.com.

Нравится

4 комментария
Лучший ответ

Коллеги, здравствуйте!

Начиная с версии 7.16.0 для корректной работы почтовых сервисов IMAP/SMTP и Exchange необходимо развернуть сервис синхронизации. Логика синхронизации писем была полностью вынесена на микросервис.



Соответственно, для работы почты в приложении необходимо проводить настройку микросервиса Exchange Listener, альтернативных вариантов нет.

 

Установить пакет OldEmailIntegration.

Андрей Есаулов,

Простите, это какое то приложение из Маркета? Или что это?

Виноват. Нашёл в конфигураторе у себя такой пакет. Версия 7.8.0.

Мне нужно новую версию запросить у поддержки? И как этот пакет использовать при интеграции с почтой? На академии, к сожалению, не нашёл способа без Exchange Listener

Коллеги, здравствуйте!

Начиная с версии 7.16.0 для корректной работы почтовых сервисов IMAP/SMTP и Exchange необходимо развернуть сервис синхронизации. Логика синхронизации писем была полностью вынесена на микросервис.



Соответственно, для работы почты в приложении необходимо проводить настройку микросервиса Exchange Listener, альтернативных вариантов нет.

 

Показать все комментарии

Добрый день!

Помогите разобраться.

Обращение регистрируется по письму на системный почтовый ящик 2, уведомления по работе с обращением уходят с основного ящика 1.

В итоге уведомления уходят с основного ящика контакту обращения и системному почтовому ящику 2.

Поддержка ничего не может ответить внятного :(

В поле "кому" указываю емаил контакта в бизнес процессе, отправитель = системная настройка. Отправку делаю так:

var activityId = Get<Guid>("activityId");//AddActivityDataUserTask.RecordId;
var emailClientFactory = ClassFactory.Get<EmailClientFactory>(new ConstructorArgument("userConnection", UserConnection));
var activityEmailSender = new ActivityEmailSender(emailClientFactory, UserConnection);
activityEmailSender.Send(activityId);
return true;

 

Нравится

2 комментария
Лучший ответ

Добрый день.

В каком состоянии у вас настройка "AutoNotifyOnlyContact"? попробуйте поставить в True, после перезапустить приложение, и почистить редис. т.к. настройка кэшируется.

Добрый день.

В каком состоянии у вас настройка "AutoNotifyOnlyContact"? попробуйте поставить в True, после перезапустить приложение, и почистить редис. т.к. настройка кэшируется.

спасибо большое! судя по статье на академии должно помочь. попробую и напишу по результату.

Показать все комментарии

Добрый день. Появилась задача добавить кнопку, аналогичную кнопке "Обработать" в почте. 

 

Но просто так добавить кнопку не получилось. Кажется обработчик на кнопку вешается не простым bindTo, как мне казалось в начале.

 

Пример кода, который получился:

generateEmailButtonsContainerConfig: function() {
	var buttonItems = [];
	var processEmailButtonConfig = this.generateEmailProcessedButtonConfig();
	buttonItems.push(processEmailButtonConfig);
	/** Добавляем новую кнопку */
	var skipEmailButtonConfig = this.generateSkipEmailButtonConfig();
	buttonItems.push(skipEmailButtonConfig);
	var deleteEmailButtonConfig = this.generateDeleteEmailButtonConfig();
	buttonItems.push(deleteEmailButtonConfig);
	var emailButtonContainerConfig = {
		"className": "Terrasoft.Container",
		"classes": {"wrapClassName": ["entity-item-relation-container"]},
		"items": buttonItems
	};
	return emailButtonContainerConfig;
},
/** НОВАЯ КНОПКА */
generateSkipEmailButtonConfig: function() {
	return {
		"className": "Terrasoft.Button",
		"style": Terrasoft.controls.ButtonEnums.style.RED,
		"caption": "SKIP",
		"click": {bindTo: "onSkipEmail"},
		"markerValue": "skipingEmail"
	};
},
/** Метод обработчик кнопки*/
onSkipEmail: function (model) {
	window.console.log("It's working");
}

Но при нажатии на кнопку - появляется ошибка:

Изображение удалено.

Возможно надо использоваться что-то похожее на fireEvent, но за все время не было необходимости в подобном функционале - поэтому плохо понимаю как и что делать. Вроде в этой статье https://community.terrasoft.ru/articles/kak-sozdat-polzovatelskii-eleme… о чем-то, что мне поможет, говорится. Но без понимая как это все устроено - это какое-то гадание на кофейной гуще.

 

Конечно, для решения моей задачи есть варианты и попроще, но менее изящные. Просто очень хочется разобраться и сделать именно первоначальную задумку:

Изображение удалено.

 

Может кто-то реализовывал мой кейс или нечто подобное и сможет поделиться советом?

Нравится

4 комментария

Сергей, насколько понимаю, Вы пытаетесь сделать как для зелёной кнопки EmailProcessedButton, которая описана в CommunicationPanelEmailSchema:

/**
 * Creates email message action buttons container config.
 * @protected
 * @return {Object} Email message action buttons container config.
 */
generateEmailButtonsContainerConfig: function() {
	var buttonItems = [];
	var processEmailButtonConfig = this.generateEmailProcessedButtonConfig();
	buttonItems.push(processEmailButtonConfig);
	var deleteEmailButtonConfig = this.generateDeleteEmailButtonConfig();
	buttonItems.push(deleteEmailButtonConfig);
	var emailButtonContainerConfig = {
		"className": "Terrasoft.Container",
		"classes": {"wrapClassName": ["entity-item-relation-container"]},
		"items": buttonItems
	};
	return emailButtonContainerConfig;
},
 
/**
 * Creates "process message" button config.
 * @protected
 * @return {Object} "Process message" button config.
 */
generateEmailProcessedButtonConfig: function() {
	return {
		"className": "Terrasoft.Button",
		"caption": {"bindTo": "Resources.Strings.MarkAsProcessed"},
		"style": Terrasoft.controls.ButtonEnums.style.GREEN,
		"imageConfig": {"bindTo": "Resources.Images.ApplyButtonImage"},
		"enabled": {"bindTo": "IsProcessingButtonEnabled"},
		"visible": {
			"bindTo": "IsNeedProcess",
			"bindConfig": {
				"converter": "getProcessButtonVisible"
			}
		},
		"click": {bindTo: "setIsNeedProcessFalse"},
		"markerValue": "setNeedProcessFalse"
	};
},

Но там обработчик setIsNeedProcessFalse в EmailItemSchema не просто одна функция, а несколько в цепочке, одна вызывает другие:

/**
 * Sets and saves IsNeedProcess value for message.
 * @param {Function} [callback] Callback function.
 * @param {Object} [scope] Callback function scope.
 */
setIsNeedProcessFalse: function(callback, scope) {
	this.set("IsProcessingButtonEnabled", false);
	var chain = [];
	chain.push(this.updateIsNeedProcess);
	chain.push(this._onSetIsNeedProcessFalse, function() {
		this.Ext.callback(callback, scope);
	});
 
	this.set("IsNeedProcess", false);
	this.Terrasoft.chain.apply(this, chain);
},
...
/**
 * Updates IsNeedProcess value for current user EmailMessageData instances.
 * @param {Function} [callback] Callback function.
 * @param {Object} [scope] Callback function scope.
 */
updateIsNeedProcess: function(callback, scope) {
	var update = this.getIsNeedProcessUpdate();
	if (this.Ext.isEmpty(update)) {
		this.Ext.callback(callback, scope);
		return;
	}
	update.execute(function() {
		this.Ext.callback(callback, scope);
	}, this);
},
...
/**
 * Handle response of save entity request.
 * @private
 * @param {Object} [response] Response of save entity request.
 * @param {Function} [callback] Callback function.
 * @param {Object} [scope] Callback function scope.
 */
_handleSaveRequestResponse: function(response, callback, scope) {
	if (response &amp;&amp; response.success) {
		this.fireEvent("entitySaved", this);
		this.set("CurrentColumnValue", null);
	}
	this.Ext.callback(callback, scope);
},
/**
 * Set IsNeedProcess to false.
 * @private
 * @param {Function} [callback] Callback function.
 * @param {Object} [scope] Callback function scope.
 */
_onSetIsNeedProcessFalse: function(callback, scope) {
	this.saveEntity(function(response) {
		this._handleSaveRequestResponse(response, callback, scope);
	}, this);
},

Если ругается на .apply, видимо, ожидает для Вашей кнопки аналогичной логики. Хотя, там же рядом справа DeleteEmailButton, там без этого всего:

/**
 * Creates "delete" button config.
 * @protected
 * @return {Object} "Delete" button config.
 */
generateDeleteEmailButtonConfig: function() {
	return {
		"className": "Terrasoft.Button",
		"style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
		"imageConfig": {"bindTo": "Resources.Images.DeleteEmailButtonImage"},
		"click": {bindTo: "onDeleteEmail"},
		"markerValue": "deleteEmail"
	};
},
...
/**
 * Removes email message from emails collection.
 * @param {Terrasoft.BaseViewModel} model Email message model instance.
 */
onDeleteEmail: function(model) {
	this.unsubscribeModelEvents(model);
	var collection = this.get("EmailCollection");
	collection.remove(model);
},

Не сравнивали в отладке Вашу кнопку с кнопкой удаления?

Зверев Александр,

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

CommunicationPanelEmailSchema. Проверю свою догадку и отпишусь о происходящем. Просто изначально не заметил эту привязку. Даже не осознал до конца как я натолкнулся на нее. Но теперь уже немного понятно куда идти

Сергей, попробовал у себя Ваш и стандартный код, кнопка удаления работает, поскольку функция вызывается не напрямую оттуда, а после окошка с подтверждением желания.

Если просто Вашу функцию onSkipEmail перенести в EmailItemSchema, то всё работает, пишет в консоли «It's working».

Зверев Александр,

Все так. Но пришлось еще докрутить логику. Например, включил передачу сообщения и основную логику все равно запускал в 

CommunicationPanelEmailSchema (потому что надо было работать с коллекцией писем, не был уверен что смогу это провернуть в EmailItemSchema)

 

Если кому-то поможет - полученный код ниже

 

EmailItemSchema:

messages: {
	"MessageSkipEmail": {
		mode: Terrasoft.MessageMode.BROADCAST,
		direction: Terrasoft.MessageDirectionType.BIDIRECTIONAL
	}
},
methods: {
	/**
	 * Initializes starter values.
	 * @protected
	 * @overridden
	 */
	init: function () {
		this.callParent(arguments);
		// Регистрация сообщения.
		this.sandbox.registerMessages(this.messages);
	},
	onSkipEmail: function() {
		// Регистрация сообщения.
		var EmailId = this.get("Id");
		this.sandbox.publish("MessageSkipEmail", {Id: EmailId}, ["EmailItemSchema"]);
	}
},

CommunicationPanelEmailSchema

messages: {
	"MessageSkipEmail": {
		mode: Terrasoft.MessageMode.BROADCAST,
		direction: Terrasoft.MessageDirectionType.BIDIRECTIONAL
	}
},
methods: {
	init: function () {
		this.callParent(arguments);
		// Регистрация сообщения.
		Terrasoft.ServerChannel.on(Terrasoft.EventName.ON_MESSAGE, this.onMyBpFinish, this);
		this.sandbox.subscribe("MessageSkipEmail", function(args) { this.skipingEmail(args.Id);},
			this, ["EmailItemSchema"]);
	},
	skipingEmail: function(EmailId) {
		var collection = this.get("EmailCollection");
		var foundItem = collection.collection.items.find(item =&gt; item.id === EmailId);
		var args = {
		// Имя процесса, который необходимо запустить.
			sysProcessName: "UsrSkipEmail",
		// Объект со значением входящего параметра ContactParameter для процесса CustomProcess.
			parameters: {
				ID: EmailId
			}
		};
				// Запуск пользовательского бизнес-процесса.
		ProcessModuleUtilities.executeProcess(args);
		collection.remove(foundItem); /** Выкидываем уже обработанное письмо из списка*/
	},
	generateEmailButtonsContainerConfig: function() {
		var buttonItems = [];
		var processEmailButtonConfig = this.generateEmailProcessedButtonConfig();
		buttonItems.push(processEmailButtonConfig);
		/** Добавляем новую кнопку */
		var skipEmailButtonConfig = this.generateSkipEmailButtonConfig();
		buttonItems.push(skipEmailButtonConfig);
		var deleteEmailButtonConfig = this.generateDeleteEmailButtonConfig();
		buttonItems.push(deleteEmailButtonConfig);
		var emailButtonContainerConfig = {
			"className": "Terrasoft.Container",
			"classes": {"wrapClassName": ["entity-item-relation-container"]},
			"items": buttonItems
		};
		return emailButtonContainerConfig;
	},
	/** НОВАЯ КНОПКА */
	generateSkipEmailButtonConfig: function() {
		return {
			"className": "Terrasoft.Button",
			//"style": 
			"caption": "Игнорировать",
			"click": {bindTo: "onSkipEmail"},
			"markerValue": "skipingEmail",
			"enabled": {"bindTo": "IsProcessingButtonEnabled"},
			"visible": {
				"bindTo": "IsNeedProcess",
				"bindConfig": {
					"converter": "getProcessButtonVisible"
				}
			},
		};
	},

А в самом БП происходит магия изменения БД, чтобы не запустились скрытые процессы, привязанные к "IsNeedProcess" в EmailMessageData

 

Вроде теперь все работает как надо, но надо провести обильное тестирование на большом количестве писем. А то письма после обработки все равно привязывались к обращениям и переоткрывали их. Теперь такие письма можно пропускать.

Показать все комментарии

Всем привет!

 

Продолжаем освещать вас жизненными примерами по разворачиванию сервиса Exchange Listener. Если вы пропустили прошлую публикацию, то рекомендуем также с ней ознакомиться - https://community.terrasoft.ru/articles/1-realnyy-primer-po-razvertyvaniyu-servisa-exchange-listener-s-ispolzovaniem-kubernetes.

 

На этот раз поделился подробной инструкцией с нами пользователь Еремеев Игорь Юрьевич (ссылка на профиль - https://community.terrasoft.ru/user/196420). Данная инструкция полезна тем, что в ней предоставлены наглядные скриншоты и решение по ошибкам, которые могут возникнуть в процессе развертывания.

(!) Данная инструкция процитирована и зафиксирована в таком виде, в каком нам передали с небольшими изменениями.

 

Задача поднять Кластер (Cluster) Kubernetes

 

Kubernetes — нишевое решение под конкретные проекты.

Kubernetes средство оркестрации (управления) контейнерами Docker. Это инструмент для их автоматического запуска, выделения ресурсов, контроля состояния, обновления.

 

Системные требования

Устанавливаем на виртуальных машинах:

  • мастер нода – 1 виртуальная машина - 2 cpu и 4 gb ram
  • рабочие ноды – 2 виртуальные машины - 2 cpu и 4 gb ram

 

Структура кластера

Изображение удалено.

 

 

 

 

 

 

 

 

Примечание:

  • Виртуальная машина 1 Поколение;
  • Образ CentOS-7-x86_64-NetInstall-2003;
  • Пользователь root, 123456qQ;

Необходимые условия:

  • Установлена ВМ (прим. виртуальная машина) Centos 8;
  • Отключён Firewall, своппинг, SELinux;
  • Для дальнейших шагов необходим неограниченный доступ в Интернет.

Подготовим 1 образа, далее просто его скопируем под 3 ВМ (см инструкцию 0. Kubernetes  преднастройка VM CentOS)

 

Далее делаем на всех нодах

  1. Приведем имена в порядок
hostnamectl set-hostname master-node
hostnamectl set-hostname node-1
hostnamectl set-hostname node-2
  1. Пропишем внутренний DNS

задайте имя хоста системы и обновите DNS в файле / etc / hosts

cat <<EOF>> /etc/hosts
192.168.25.182 master-node
192.168.25.30 node-1 worker-node-1
192.168.25.170 node-2 worker-node-2
EOF
  1. Установите Docker-CE на CentOS 8
  • Сначала необходимо добавить репозиторий Docker.
  • Также установите пакет containerd.io , который доступен в качестве демона, который управляет полным жизненным циклом контейнера его хост-системы, от передачи и хранения образа до выполнения и контроля контейнера, до низкоуровневого хранилища, сетевых вложений и далее.
  • Команды под учетной записью root запускаю сразу весь пакет,  Ставим на всех ВМ
dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
dnf install https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm -y
dnf install docker-ce -y
systemctl enable docker
systemctl start docker

4. Установите Kubernetes (Kubeadm)

4.1. Необходимо добавить репозитории Kubernetes вручную

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

 

4.2. Установить пакет kubeadm

 

dnf install kubeadm -y
systemctl enable kubelet
systemctl start kubelet 

 

Все что выше делаем на всех ВМ.

 

5. на мастере выполняем команды:

5.1.

 

kubeadm init --pod-network-cidr=10.244.0.0/16

 

(!) Важно сохраняем результат

 

kubeadm join 192.168.25.182:6443 --token z86i8r.u6mmy6adnkmp4iad \    --discovery-token-ca-cert-hash sha256:8104a99fe76b167b65d5d450467ec14fd60b973db9f97a40e81c90cc7ade73b8

 

если потеряли токен то можно запросить

 

kubeadm token list
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/ 5.2
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

 

5.3. Устанавливаем Flannel:

 

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/k8s-manifests/kube-flannel-rbac.yml

 

 

5.4. . Вводим команду для возможности запуска контейнеров на текущей машине:

 

kubectl taint nodes --all node-role.kubernetes.io/master-

 

Делаем reboot – много всего поставлено

 

 6. Проверяю состояние подов:

 

kubectl -n kube-system get pods

Изображение удалено.

Все работает

 

7. Устанавливаем Helm:

wget https://get.helm.sh/helm-v3.3.0-rc.1-linux-amd64.tar.gz
tar xzvf helm-v3.3.0-rc.1-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/helm

 

И подключаем репозиторий (возьмем самый популярный) и делаем update

 

helm repo add stable https://kubernetes-charts.storage.googleapis.com/
 
helm repo update

 

Делаем бэкап своих виртуальных машин.

Результат у нас создан кластер из 1 ВМ, созданы ВМ на которой установлен только Докер.

 

8. Устанавливаем Redis:

 

helm repo update
 
helm install --namespace default --set usePassword=false --set=slave.persistence.enabled=false --set master.persistence.enabled=false --set cluster.enabled=false redis bitnami/redis

 

используем --namespace default

 

Получили:

 

To connect to your Redis server:

1. Run a Redis pod that you can use as a client:

   kubectl run --namespace default redis-client --rm --tty -i --restart='Never' \

   --image docker.io/bitnami/redis:5.0.7-debian-10-r32 -- bash

2. Connect using the Redis CLI:

   redis-cli -h redis-master

To connect to your database from outside the cluster execute the following commands:

    kubectl port-forward --namespace default svc/redis-master 6379:6379 &

    redis-cli -h 127.0.0.1 -p 6379

 

Результат.

 

Изображение удалено.

 

Изображение удалено.

 

Изображение удалено.

 

9. Устанавливаем Exchange Listener.

 

Нам потребуется  ip-адрес redis-master: XX.XXX.233.155 (см. скриншоты)

 

Качаем последний актуальный дистрибутив (на данный момент 0.6.9):

wget http://ftp.bpmonline.com/support/downloads/Exchangelistener/exchangelistener-0.6.9.tgz
 
helm install --set env.host=XX.XXX.233.155 --set service.type=NodePort --set service.nodePort=30001 --set apiVersion=apps/v1 --namespace default elistener exchangelistener-0.6.9.tgz

 

Изображение удалено.

 

--set env.host - указать IP мастер Redis

default - namespace, который использовался в пункте 11.

elistener - произвольное название нашего сервиса.

exchangelistener-0.6.9.tgz - путь к скачанному дистрибутиву.

Порт не обязательно должен быть 30001. Допустимый диапазон 30000-32767.

На этом минимальная настройка сервиса на стороне сервера завершена.

 

10. Проверяем поды сервиса

kubectl get pods

Изображение удалено.

 

Проверяем доступность сервиса Exchange Listener.

telnet: -

telnet 192.168.25.182 30001

 

Где:

192.168.25.182 - ip-адрес нашей linux-машины,

30001 - порт сервиса Exchange Listener, выбранный при установке на 12 шаге.

Если соединение проходит - открываем веб-браузер (желательно сразу на машине с Creatio) и вводим в адресную строку http://192.168.25.182:30001/api/listeners/status

 

Изображение удалено.

 

Включим в кластер еще 2 ВМ

 

(команду kubeadm init --pod-network-cidr=10.244.0.0/16 не вводим)

- Node-1

Вводим ключ-команду

 

kubeadm join 192.168.25.182:6443 --token z86i8r.u6mmy6adnkmp4iad     --discovery-token-ca-cert-hash sha256:8104a99fe76b167b65d5d450467ec14fd60b973db9f97a40e81c90cc7ade73b8

 

если потеряли токен то можно запросить

 

kubeadm token list

 

- Проверяем поды на master-машине (их должно стать больше):

 

Изображение удалено.

kubectl -n kube-system get pods

 

- Node-2

Вводим ключ-команду

kubeadm join 192.168.25.182:6443 --token z86i8r.u6mmy6adnkmp4iad     --discovery-token-ca-cert-hash sha256:8104a99fe76b167b65d5d450467ec14fd60b973db9f97a40e81c90cc7ade73b8

 

- На мастере проверяем

 

kubectl get node

 

Изображение удалено.

kubectl get svc

 

Изображение удалено.

 

kubectl get pods

 

Изображение удалено.

 

Какие команды могут помочь при решении проблем:

 

Почему-то не было доступа из внешнего IP к порту 30001, где развернут сервис. и были выполнены следующие команды:

ufw allow 30001 - команда конкретно firewall ubuntu. К другим дистрибутивам вероятнее всего не подойдет (возможно только если к Mint, т.к. ядро тоже самое). 

iptables -I INPUT -p tcp --dport 30001 -j ACCEPT - уже более распространенный вариант. 

 

Команды для просмотра логов. Примеры:

 

kubectl logs POD_NAME

kubectl logs REDIS_NAME-api-0

 

kubectl logs  elistener-api-0

kubectl logs  elistener-api-1

kubectl logs redis-master-0

 

log4net:ERROR Could not create Appender [ExchangeListenerGelfAmqpAppender] of type [Gelf4Net.Appender.GelfAmqpAppender, Gelf4Net.AmqpAppender]. Reported error follows.

RabbitMQ.Client.Exceptions.BrokerUnreachableException: None of the specified endpoints were reachable ---> RabbitMQ.Client.Exceptions.ConnectFailureException: Connection failed --->




Означает, что он не может Rabbit не может достучаться до Graylog (мониторинг логов). В данном случае у вас не настроен Graylog. Но это не должно блокировать работу. Можно ориентировать на вот это Gelf4Net (он пишет в Rabbit).



Но
ниже по логу должно быть видно следующее:

Hosting environment: Production Content root path: /app Now listening on:
http://[::]:80 Application started. Press Ctrl+C to shut down.



Если это так, то значить сервис запущен и теперь вам нужно проверить доступность и статус сервиса.

А после провести настройку на стороне Creatio.

Нравится

Поделиться

1 комментарий

Теперь k8s наша общая боль) 

Показать все комментарии

Проблема в следующем:

1) У заказчика стоит политика безопасности, что блокируется доступ на почту в течении 30 минут при не успешной попытке входа на почту 5 раз подряд(если пароль не верный).

2) Creatio CRM синхронизируется по идее с определенной периодичностью без остановки.

3) В системе будет >300 пользователей, в связи с этим стоит проблема, что могут поменять пароль, а в Creatio CRM в течении определенного времени не успеть сменить вовремя, и работа пользователя будет фактически остановлена на минут 30, почта имеет важную роль.

Вопрос:

Возможно ли как-то поставить доп. логику обработки синхронизации с почтой, что в случае неверных попыток синхронизации с почтой, допустим 3 раза подряд, прерывалось для данного пользователя + уведомление приходило например сис. админу? Может кто сталкивался с такой ситуацией?

Нравится

2 комментария

Насколько мне известно, в базовой версии возможности для настройки такой функциональности нет.

CRM система не является почтовым сервером и возможности настройки дополнительных опций почтового ящика очень ограничены.

Думаю, что проще попробовать реализовать эту функциональность на стороне почтового сервера, если он поддерживает такую возможность.

Например, при каждой неудачной попытке предупреждать пользователя уведомлением об оставшемся количестве допустимых попыток. А на 3-ю неудачную попытку отправлять уведомление на пользователя и в копию добавлять админа.

Пишут, что такая логика появилась ещё в 7.11:

Коммуникационная панель будет сообщать о проблемах при загрузке писем с почтового сервера:

  • Если загрузка писем невозможна из-за неверного пароля, можно быстро указать новый пароль без необходимости переходить к настройкам почтового ящика.
  • Если почтовый сервер недоступен, уведомление будет отображаться в коммуникационной панели до восстановления соединения.
  • Если возникли неизвестные ошибки при взаимодействии с почтовым сервером, пользователь получит сообщение о необходимости обратиться к системному администратору.

Во всех перечисленных случаях для избежания блокирования учетной записи почты процесс синхронизации будет остановлен.

Нужно выяснить, есть ли в системе заказчика этот механизм, работает ли. Возможно, у него на 7.14 переводили с более старых версий и что-то не перенесли?

Визуально такая сработавшая проверка выглядит как розовая иконка письма на правой панели и при нажатии на неё в открывшейся панели с письмами плашка сверху: «Синхронизация остановлена, неверный пароль».

Показать все комментарии

Привет всем!

Система не получает сообщения из почтового ящика( MS Exchange) до тех пор пока в систему не войдет Supervisor, только после этого система начинает прием и обработку сообщений.

 

Нравится

6 комментариев

Здравствуйте!

Для исправления данного кейса необходимо установить для пула приложений IIS, на котором работает приложение, Idle Timeout = 0

1. Настроить автоматический мониторинг Loader'a и приложения, ниже варианты:

  • С помощью бесплатного сервиса мониторинга https://uptimerobot.com/ настроить автоматический мониторинг c периодичностью 5-10 минут - наиболее быстрый путь
  • С помощью автоматического запуска скрипта мониторинга приложения. Шаблон скрипта PowerShell в приложении Ping.ps1, в нем необходимо изменить адрес приложения. После этого, нужно запланировать выполнение этого скрипта через планировщик Windows c периодичностью 5-10 минут. Автоматический запуск можно настроить по инструкции http://windowsnotes.ru/powershell-2/zapusk-powershell-skripta-po-raspisaniyu/.

 

2. Настроить автоматический запуск SQL-скрипта очистки \ перезапуска зависших заданий, скрипт в приложении ResetErrorQuartzTriggers.sql - с периодичностью 30 минут

  • Настроить автоматический запуск задания MSSQL, выполняющего этот скрипт - наиболее простой способ

Скрипты можно скачать по данной ссылке:https://dropmefiles.com/QhuAh

Shevchenko Andrey,

добрый день! скрипты выложите еще раз.

Здравствуйте!

Выше в моем комментарии названия файлов являются кликабельными и вы можете скачать скрипты просто нажав на них.

Shevchenko Andrey,

не скачиваются скрипты. На dropmefiles пишет что файлы удалены, по самому скрипту - web страница недоступна

Ольга Кондратьева,

Добрый день! Можете скачать по ссылке - 

https://www.dropbox.com/sh/re9v0093hflrmuf/AADQ1_2KNUQgLJS2DnkB0Gyia?dl…

Подскажите, в какой версии исправили данную багу? В 7.12.2.935 нужно настраивать скрипт ResetErrorQuartzTrigger?

Показать все комментарии