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

Для понимания примера работы, в печатной форме нет ничего кроме названия записи раздела. Версия 7.16 элемента в бп "обработать файл" нет. 

Нравится

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

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

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

define("UsrSchema042ca8fbDetail", ["ConfigurationEnums"], 
    function(configurationEnums) {
    return {
        entitySchemaName: "UsrCourierCertInOrder",
        details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
        diff: /**SCHEMA_DIFF*/[
            {
                    /* Тип операции — слияние. */
                    "operation": "merge",
                    /* Название элемента схемы, над которым производится действие. */
                    "name": "DataGrid",
                    /* Объект, свойства которого будут объединены со свойствами элемента схемы. */
                    "values": {
                        "rowDataItemMarkerColumnName": "UsrDocumentLookup"
                    }
                },
                {
                    /* Тип операции — слияние. */
                    "operation": "merge",
                    /* Название элемента схемы, над которым производится действие. */
                    "name": "AddRecordButton",
                    /* Объект, свойства которого будут объединены со свойствами элемента схемы. */
                    "values": {
                        "visible": {"bindTo": "getToolsVisible"}
                    }
                }]/**SCHEMA_DIFF*/,
        methods: {
                                //Возвращает колонки, которые выбираются запросом.
                                getGridDataColumns: function() {
                                        return {
                                                "Id": {path: "Id"},
                                                "Document": {path: "UsrDocument"},
                                                "Document.Number": {path: "UsrDocument.Number"}
                                        };
                                },

                                //Конфигурирует и отображает модальное окно справочника.
                                openDocumentLookup: function() {
                                        //Конфигурационный объект
                                        var config = {
                                                // Название схемы объекта, записи которого будут отображены в справочнике.
                                                entitySchemaName: "UsrDocumentLookup",
                                                // Возможность множественного выбора.
                                                multiSelect: true,
                                                // Колонки, которые будут использованы в справочнике, например, для сортировки.
                                                columns: []
                                        };
                                        var OrderId = this.get("MasterRecordId");
                                        if (this.Ext.isEmpty(OrderId)) {
                                                return;
                                        }
                                        // Экземпляр класса [EntitySchemaQuery].
                                        var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
                                                // Установка корневой схемы.
                                                rootSchemaName: this.entitySchemaName
                                        });
                                        // Добавление колонки [Id].
                                        esq.addColumn("Id");
                                        // Добавление колонки [Id] из схемы [Document].
                                        esq.addColumn("Document.Id", "DocumentId");
                                        // Создание и добавление фильтров в коллекцию запроса.
                                        esq.filters.add("filterOrder", this.Terrasoft.createColumnFilterWithParameter(
                                                this.Terrasoft.ComparisonType.EQUAL, "UsrOrder", OrderId));
                                        // Получение всей коллекции записей и отображение ее в модальном окне справочника.
                                        esq.getEntityCollection(function(result) {
                                                var existsDocumentsCollection = [];
                                                if (result.success) {
                                                        result.collection.each(function(item) {
                                                                existsDocumentsCollection.push(item.get("DocumentId"));
                                                        });
                                                }
                                                // Добавление фильтра в конфигурационный объект.
                                                if (existsDocumentsCollection.length > 0) {
                                                        var existsFilter = this.Terrasoft.createColumnInFilterWithParameters("Id",
                                                                existsDocumentsCollection);
                                                        existsFilter.comparisonType = this.Terrasoft.ComparisonType.NOT_EQUAL;
                                                        existsFilter.Name = "existsFilter";
                                                        config.filters = existsFilter;
                                                }
                                                // Вызов модального окна справочника
                                                this.openLookup(config, this.addCallBack, this);
                                        }, this);
                                },

                                // Обработчик события сохранения страницы редактирования.
                                onCardSaved: function() {
                                        this.openDocumentLookup();
                                },

                                //Открывает справочник документов в случае если страница редактирования заказа была ранее сохранена.
                                addRecord: function() {
                                        var masterCardState = this.sandbox.publish("GetCardState", null, [this.sandbox.id]);
                                        var isNewRecord = (masterCardState.state === configurationEnums.CardStateV2.ADD ||
                                        masterCardState.state === configurationEnums.CardStateV2.COPY);
                                        if (isNewRecord === true) {
                                                var args = {
                                                        isSilent: true,
                                                        messageTags: [this.sandbox.id]
                                                };
                                                this.sandbox.publish("SaveRecord", args, [this.sandbox.id]);
                                                return;
                                        }
                                        this.openDocumentLookup();
                                },

                                // Добавление выбранных продуктов.
                                addCallBack: function(args) {
                                        // Экземпляр класса пакетного запроса BatchQuery.
                                        var bq = this.Ext.create("Terrasoft.BatchQuery");
                                        var OrderId = this.get("MasterRecordId");
                                        // Коллекция выбранных в справочнике документов.
                                        this.selectedRows = args.selectedRows.getItems();
                                        // Коллекция, передаваемая в запрос.
                                        this.selectedItems = [];
                                        // Копирование необходимых данных.
                                        this.selectedRows.forEach(function(item) {
                                                item.OrderId = OrderId;
                                                item.DocumentId = item.value;
                                                bq.add(this.getDocumentInsertQuery(item));
                                                this.selectedItems.push(item.value);
                                        }, this);
                                        // Выполнение пакетного запроса, если он не пустой.
                                        if (bq.queries.length) {
                                                this.showBodyMask.call(this);
                                                bq.execute(this.onDocumentInsert, this);
                                        }
                                },

                                //Возвращает запрос на добавление текущего объекта.
                                getDocumentInsertQuery: function(item) {
                                        var insert = Ext.create("Terrasoft.InsertQuery", {
                                                rootSchemaName: this.entitySchemaName
                                        });
                                        insert.setParameterValue("UsrOrder", item.OrderId, this.Terrasoft.DataValueType.GUID);
                                        insert.setParameterValue("UsrDocument", item.DocumentId, this.Terrasoft.DataValueType.GUID);
                                        return insert;
                                },

                                //Метод, вызываемый при добавлении записей в реестр детали.
                                onDocumentInsert: function(response) {
                                        this.hideBodyMask.call(this);
                                        this.beforeLoadGridData();
                                        var filterCollection = [];
                                        response.queryResults.forEach(function(item) {
                                                filterCollection.push(item.id);
                                        });
                                        var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
                                                rootSchemaName: this.entitySchemaName
                                        });
                                        this.initQueryColumns(esq);
                                        esq.filters.add("recordId", Terrasoft.createColumnInFilterWithParameters("Id", filterCollection));
                                        esq.getEntityCollection(function(response) {
                                                this.afterLoadGridData();
                                                if (response.success) {
                                                        var responseCollection = response.collection;
                                                        this.prepareResponseCollection(responseCollection);
                                                        this.getGridData().loadAll(responseCollection);
                                                }
                                        }, this);
                                },    

                                // Метод, вызываемый при удалении выбранных записей детали.
                                deleteRecords: function() {
                                        var selectedRows = this.getSelectedItems();
                                        if (selectedRows.length > 0) {
                                                this.set("SelectedRows", selectedRows);
                                                this.callParent(arguments);
                                        }
                                },

                                // Скрыть пункт меню [Копировать].
                                getCopyRecordMenuItem: Terrasoft.emptyFn,
                                 // Скрыть пункт меню [Изменить].
                                getEditRecordMenuItem: Terrasoft.emptyFn,
                                // Возвращает имя колонки по умолчанию для фильтра.
                                getFilterDefaultColumnName: function() {
                                        return "UsrDocument";
                                }
                        },
            
    };
});
 Добрый день, прошу помочь с деталью выборкой из справочника. Не сохраняет значения. Специально использовал все с примера в Академии чтоб понять суть.

 

 

 

Нравится

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

Добрый день, не совсем понятно что конкретно вы хотите реализовать, о каком примере вы говорите?

Сложно сказать причину такого поведения смотря только на код.

Для выявления конкретного места стоит провести отладку. Возможно в консоли браузера будет ошибка при попытке работы с этой логикой, что укажет на причину.

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

Добрый день,

Есть ли возможность один Контакт ассоциировать с несколькими Контрагентами?
Работаем с некоторыми фирмами в которых один и тот же директор. Создавать несколько одинаковых контактов неудобно, точно так же неудобно искать все это через диаграмму связей. Хочется нативного решения. 

 

Нравится

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

Возможно подойдет деталь "Карьера контакта" ? Объект ContactCareer.  В коробке она в только на карточке контакта видна, но с доработками можно и в контрагенте отображать. Там есть должность, основное не основное место и т.п.

Трефилов Павел Сергеевич пишет:

Так данные из неё отображаются в детали Контакты на странице Контрагента 

Соколов Владимир AVITERRA,

Нет, это разные детали. Деталь контакты смотрит на раздел контакты (связь 1 к n), а у карьеры как раз связь n к n. т.е в первом случае одного контакта засунуть в разные контрагенты не получится.

Трефилов Павел Сергеевич пишет:
Деталь контакты смотрит на раздел контакты (связь 1 к n)

Так было в старых версиях, но начиная с некоторой эту деталь расширили. Так что, она объединяет и контакты контрагента, и карьеру контакта

Владимир Соколов,

Ого, интересно, значит мы делали доработку, когда такой логики еще не было.

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

Добрый день, столкнулся с ситуацией, нужно сохранить настройку колонок детали для портальной страницы.
Если страница обычная, тут понятно, настраиваем колонки - сохраняем настройку для всех пользователей, привязываем данные SysProfileData фильтруя по ключу.
А как правильно сохранить настройку на портальной странице, у портального пользователя нету кнопки сохранить настройку колонок для всех.
Подменой названия страницы в URL адресе, тогда под супервизором можно попасть на страницу портала, единственное ли это решение?

Нравится

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

Смотреть в таблицу SysProfileData, твой настройке нужно поставить в поле ContactId значение null

 

Приведу пример как я скриптом делал "настройки колонок" для всех, скопировав настройки у супервизора. Возможно еще что потребуется, сейчас не помню.

--удалял все настройки кроме тех, которые не пустые и не под пользователем супервизор. В вашем примере в key нужно подставить настройку этой самой детали. А id пользователя твоего пользователя, от которого копировать на всех
	/*	
		delete from SysProfileData where "Key" in (
		select "Key" from SysProfileData
		where ("Key" like 'Usr%GridDataView' or "Key" like '%Detail%') and SysCultureId = '1A778E3F-0A8E-E111-84A3-00155D054C03'
		and (ContactId = '410006E1-CA4E-4502-A9EC-E54D922D2C00' or ContactId is null)
		group by "Key"
		having count(*) >=2
		) and ContactId is null
	*/
--	в тут обновляем contactId на null (для системы если стоит null, то это считается настройкой по умолчанию.
 /*	
	update SysProfileData set ContactId = null
	where "Key" like 'Usr%GridDataView' or "Key" like '%Detail%' and SysCultureId = '1A778E3F-0A8E-E111-84A3-00155D054C03' and ContactId = '410006E1-CA4E-4502-A9EC-E54D922D2C00'
  */

 

Смотреть в таблицу SysProfileData, твой настройке нужно поставить в поле ContactId значение null

 

Приведу пример как я скриптом делал "настройки колонок" для всех, скопировав настройки у супервизора. Возможно еще что потребуется, сейчас не помню.

--удалял все настройки кроме тех, которые не пустые и не под пользователем супервизор. В вашем примере в key нужно подставить настройку этой самой детали. А id пользователя твоего пользователя, от которого копировать на всех
	/*	
		delete from SysProfileData where "Key" in (
		select "Key" from SysProfileData
		where ("Key" like 'Usr%GridDataView' or "Key" like '%Detail%') and SysCultureId = '1A778E3F-0A8E-E111-84A3-00155D054C03'
		and (ContactId = '410006E1-CA4E-4502-A9EC-E54D922D2C00' or ContactId is null)
		group by "Key"
		having count(*) >=2
		) and ContactId is null
	*/
--	в тут обновляем contactId на null (для системы если стоит null, то это считается настройкой по умолчанию.
 /*	
	update SysProfileData set ContactId = null
	where "Key" like 'Usr%GridDataView' or "Key" like '%Detail%' and SysCultureId = '1A778E3F-0A8E-E111-84A3-00155D054C03' and ContactId = '410006E1-CA4E-4502-A9EC-E54D922D2C00'
  */

 

Трефилов Павел Сергеевич,

Большое спасибо!

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

Коллеги, приветствую.

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

 

2 часа (120 минут) буду зашивать в системную настройку (чтобы можно было варьировать админу)

 

Хочу реализовать с помощью БП по таймеру, который раз в час будет отбирать обращения по определенным критериям. 
далее, из записи вычитаю поле "время разрешения" (тип поля - дата/время) и тут главная загвозка.... как мне высчитать, что обращение должно разрешиться через 2 часа (120 минут)?

 

если должно решиться больше 2 часов - пропустить запись

если меньше, то по идее, должно было уже отправиться уведомление.

ко всему прочему, кажется, что могут возникнут потери записей (из разряда, если на момент проверки, "время разрешения" должно быть через 2 часа и 5 минут, то в следующую проверку может быть уже меньше 2 часов) - это смущает.

из идей:

  1. пробовать преобразовать поле с помощью формул .TotalHours/.TotalMinutes в часы/минуты и сравнивать..
  2. попробовать с помощью формул .AddMinutes(), .AddHours() добавить настройке "текущее время и дата" значение системной настройки и сравнить...

в общем, буду рада советом, а сама пошла пока пробовать :) 

Нравится

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

Aleksei Efimenko, 

я прибегла к другому решению:

  • сделала системную настройку, которая хранит значение за сколько нужно уведомление (в минутах)
  • сделала 2 параметра: 

Параметр 1: [#Системная переменная.Текущее значение времени#]. AddMinutes([число из системной настройки])

Параметр 2: параметр 1. AddMinutes(59) - чтобы получился час

 

  • и развела условными потоками:

1. если время разрешение больше моих параметров или меньше - проскакиваю

2. если время разрешение попадает в промежуток параметров - высылаю уведомление

Создаю новое поле - Reminding time. И его сравниваю.

 

Ещё процессы, которые его заполняют. И поле с временем, когда уведомление было отправлено. Это позволит избежать ситуации, когда таймер не сработает, например. Надо всего лишь выбирать те, у которых время уведомления прошло, но уведомление не было отправлено

Александра Дубс, подскажите, решило ли вашу задачу предоставленное решение от Владимира?

Aleksei Efimenko, 

я прибегла к другому решению:

  • сделала системную настройку, которая хранит значение за сколько нужно уведомление (в минутах)
  • сделала 2 параметра: 

Параметр 1: [#Системная переменная.Текущее значение времени#]. AddMinutes([число из системной настройки])

Параметр 2: параметр 1. AddMinutes(59) - чтобы получился час

 

  • и развела условными потоками:

1. если время разрешение больше моих параметров или меньше - проскакиваю

2. если время разрешение попадает в промежуток параметров - высылаю уведомление

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

Версия Creatio 7.18.5.1500
В чем может быть проблема?

Нравится

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

Если установлено, то удалите приложение Custom filter constructor for Creatio. Если нет и доработки делала Banza, то пишите им чтобы они устранили эти ошибки

Как по мне, если не обращать внимания на ошибки партнёрского кода, можно сделать вывод, что при открытии страницы редактирования приложению неясно, какую схему вытащить, или она была удалена. Нужно проверить в БД привязки, инфо о них есть ниже. Эталоном можно взять какой-нибудь базовый раздел.

 

При создании раздела мастером происходит его автоматическая регистрация в системных таблицах SysModuleEntity, SysModuleEdit и SysModule.
При переносе на другой сайт записи в указанных таблицах не переносятся.
Необходимо:

  • Создать запись в таблице SysModuleEntity (таблица, где хранится информация объектах разделов):

SysModuleEntity

insert into SysModuleEntity (SysEntitySchemaUId) values ('AF6DD4AD-1398-4FCE-8837-78DC65AE0F9E')

где  [SysEntitySchemaUId] - колонка Uid объекта раздела (например, "UsrTest") в таблице SysSchema;
 

  • II Этап. Создать запись в таблице SysModuleEdit (страница редактирования "Page"):

SysModuleEdit

insert into SysModuleEdit (SysModuleEntityId
,UseModuleDetails
,CardSchemaUId
,ActionKindCaption
,ActionKindName
,PageCaption)
values ('8ED522AF-00E1-4595-AC13-643944B005B7'
,1
,'8B22D9BE-4BBC-4B50-80EA-AB6FBB604B7E'
,'Добавить'
,'UsrTest1Page'
,'Card schema: "Test"')

где  [SysModuleEntityId] - колонка Id записи таблицы SysModuleEntity из первого этапа (проверка Select Id from SysModuleEntity Where SysEntitySchemaUId='AF6DD4AD-1398-4FCE-8837-78DC65AE0F9E')

[CardSchemaUId]  - колонка Uid страницы редактирования объекта (например, "UsrTest1Page") в таблице SysSchema (проверка Select Uid,Name from SysSchema where name like '%UsrTest%'). Нам необходима схема, которая называется "Название объекта + 1Page"

[ActionKindCaption] - Название кнопки в реестре раздела;

[ActionKindName] - Название схемы страницы редактирования;

[PageCaption] - Заголовок схемы страницы редактирования в таблице SysSchema (проверка Select Uid,Name,Caption from SysSchema where name like '%UsrTest1Page%')

  • III Этап. Создать запись в таблице SysModule (страница раздела "Section"):

SysModule

insert into SysModule (Caption
,SysModuleEntityId
,FolderModeId
,GlobalSearchAvailable
,Code
,SectionModuleSchemaUId
,SectionSchemaUId
,Image32Id) values (N'Test'
,'8ED522AF-00E1-4595-AC13-643944B005B7'
,'B659D704-3955-E011-981F-00155D043204'
,1
,'UsrTest'
,'DF58589E-26A6-44D1-B8D4-EDF1734D02B4'
,'B3D153C0-92EF-4A53-B868-9395C3E43516'
,'026742D9-390C-4778-BC46-9FA85C42677A')

где  [Caption] - Название раздела (можно брать caption объекта раздела - 

[SysModuleEntityId]  - колонка Id записи таблицы SysModuleEntity из первого этапа (проверка Select Id from SysModuleEntity Where SysEntitySchemaUId='AF6DD4AD-1398-4FCE-8837-78DC65AE0F9E')

[Code] - Название объекта раздела;

[SectionModuleSchemaUId] - UId модуля SectionModuleV2 с помощью которой открывается схему раздела;

[SectionSchemaUId] - колонка Uid страницы раздела объекта (например, "UsrTest1Section") в таблице SysSchema (проверка Select Uid,Name,Caption from SysSchema where name like '%UsrTest%'). Нам необходима схема, которая называется "Название объекта + 1Section"

 

Роман Казекин,

У меня уже была точно такая же ситуация из-за этого приложения. Решилось только удалением. Ответ от команды разработки - пока несовместимо с версией 7.18. К тому же здесь пытаются редактировать базовый объект - обращения. Но в то же время соглашусь с вами. Есть еще вариант что сделана кастомизация как минимум в двух пакетах. А настройка CurrentPackage стоит на пакете который ниже по иерархии, т.е. не видит всех изменений. Такое у меня было когда я пытался редактировать страницу с полями, настроенными с приложением Single file control for Creatio. Решается просто указанием правильного пакета в настройке.
 

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

Добрый день! 

Не запускается БП по таймеру. В планировщике нет соответствущей записи с БП. Что могло случиться?

Нравится

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

Добрый день, Руслан.

Точную причину выяснить будет проблематично, триггер могли удалить вручную, либо произошёл какой-то сбой при активации/деактивации процесса. Также может быть такое, что БП переносили пакетом, а триггер вместе с процессом в этом случае не был перенесён.

 

Рекомендую удалить элемент стартового таймера, и создать его заново, после чего сохранить процесс. Это должно инициировать создание триггера в планировщике.

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

Здравствуйте коллеги,

Поставлена такая задача: 
Есть список операторов. У каждого оператора настроен 1 почтовый ящик с которого он видит письма в Creatio. Обращения создаются со всех писем. Так вот, как дать возможность оператору видить только те обращения которые были созданы на почве письма к которому у оператора есть доступ (1 оператор - 1 ящик)

Спасибо!

Нравится

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

Мы в проекте делали разделение по отделам (в том числе определение SLA и прав доступа) на основании почтового ящика. 

Если кратко, то в справочнике почтового ящика для регистрации обращений добавили признак (отдел поддержки) и далее настроили процессы для определения SLA (сигнал - создание обращения). На основании SLA перераспределяли права доступа. 

Схема получилась непростая, но рабочая. 

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

Мы в проекте делали разделение по отделам (в том числе определение SLA и прав доступа) на основании почтового ящика. 

Если кратко, то в справочнике почтового ящика для регистрации обращений добавили признак (отдел поддержки) и далее настроили процессы для определения SLA (сигнал - создание обращения). На основании SLA перераспределяли права доступа. 

Схема получилась непростая, но рабочая. 

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

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

Добрый день, коллеги.

 

Кто-нибудь знает, возможно ли в модальное окно, описанное в данной статье, добавить детали?

Нравится

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

Добрый день, похожий вопрос недавно обсуждался статье . Также рекомендую ознакомится с публикацией по ссылке.

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

Добрый день, речь идет про данный коннектор: https://marketplace.terrasoft.ru/app/microsoft-teams-connector-creatio
Может кто-то настраивал и сможет подсказать, в документации есть ссылка на docker hub, там и лежит другая часть документации(https://hub.docker.com/r/onellect/teams-bot-creatio). Мне не понятные какими значениями заполнять следующие конфиги:
 

  • VIRTUAL_HOST - домен, с которого будет проксировать nginx на вашего бота
  • LETSENCRYPT_HOST - домен, на которой letsencrypt будет генерировать ssl сертификат
  • LETSENCRYPT_EMAIL - почта, на которую будут приходить уведомления, связанные с генерацией ssl сертификата
    У нас в целом нет нигде nginx, и получается его нужно настраивать или как? Так же не понятно для какого сервера и какие сертификаты предполагается генерировать, и не подойдут ли те что уже у нас есть?
    Так же непонятны следующие конфиги:
     
  • BotWebhookUrl - адрес, по которому будет доступен сервис бота (для ссылок на самого себя, например на иконки)
  • CreatioUrl - URL, по которому доступен Creatio для сервиса бота - для работы с визами.
    Получается это адрес сервера откуда предполагается запуск docker-compose? И по CreatioUrl , это адрес просто из браузера на страницу которая открывается после того как поставишь бота в Creatio?

Нравится

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

Евгений Шевченко,

Полный файл docker-compose.yml будет выглядеть так: 

version: '2'
services:
  bot:
    image: "onellect/teams-bot-creatio:latest"
    ports:
        - 85:80
    depends_on:
      - redis
    volumes:
      - ./appsettings.json:/app/appsettings.json
    links:
    - redis
    restart: always
  redis:
    image: redis
    command: redis-server --appendonly yes
    volumes:
      - ./redis:/data
    restart: always

Nginx уже входит в состав пула сервисов на https://hub.docker.com/r/onellect/teams-bot-creatio

 

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

 

Из пула можно исключить:

nginx-proxy:
    image: jwilder/nginx-proxy
    container_name: nginx-proxy
    labels:
      - "com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./certs:/etc/nginx/certs:ro
      - ./vhost.d:/etc/nginx/vhost.d:ro
      - /usr/share/nginx/html
    restart: always
  letsencrypt-companion:
    image: jrcs/letsencrypt-nginx-proxy-companion
    container_name: letsencrypt-companion
    volumes_from:
      - nginx-proxy
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./certs:/etc/nginx/certs:rw
      - ./vhost.d:/etc/nginx/vhost.d:rw
    restart: always

если вы своими силами обеспечите шифрование трафика (https сертификаты), тогда конфиг для самого сервиса бота сократится:

 bot:
    image: "onellect/teams-bot-creatio:latest"
    ports:
        - 85:80
    depends_on:
      - redis
      - nginx-proxy
      - letsencrypt-companion
    volumes:
      - ./appsettings.json:/app/appsettings.json
    links:
    - redis
    restart: always

 

при этом сервис бота будет висеть на 85 порту (можно изменить на любой, вам удобный) и ваша инфраструктура должна будет проксировать трафик на него.

 

Хочу обратить внимание, что тимс может отправлять трафик только по https протоколу с действующим сертификатом.

 

BotWebhookUrl  - да, это днс имя которое будет ссылаться на сервер, от куда будет запущен docker-compose и должен иметь формат 

https://днс-имя/api/webhook

CreatioUrl - это базовый адрес стенда, где располагается ваша Creatio, например для демо - стенда это может быть адрес вроде:

https://107214-crm-bundle.terrasoft.ru/

 

Дятлов Павел Юрьевич,спасибо за такое подробное описание, а не подскажете сократил все про nginx попытался запустить, но получил ошибку Service 'bot' depends on service 'nginx-proxy' which is undefined.

Евгений Шевченко,

 

Вам надо удалить из блока 

 depends_on:
      - redis
      - nginx-proxy
      - letsencrypt-companion

Все, что связано с nginx ( две последних строчки ) - то есть должно получится вот так:

 

depends_on:
      - redis

 

 

Евгений Шевченко,

Полный файл docker-compose.yml будет выглядеть так: 

version: '2'
services:
  bot:
    image: "onellect/teams-bot-creatio:latest"
    ports:
        - 85:80
    depends_on:
      - redis
    volumes:
      - ./appsettings.json:/app/appsettings.json
    links:
    - redis
    restart: always
  redis:
    image: redis
    command: redis-server --appendonly yes
    volumes:
      - ./redis:/data
    restart: always
Показать все комментарии