Время создания
Фильтры

Добрый день,

 

может информация немного устарела. НО на данном этапе жизни - она мне помогла. Могу сказать, что это работает не только с 7,17, но и 7,18 версией CRM.

 

Год назад понадобилось настроить Exchange Listener для нашей CRM. Дали инструкцию https://academy.creatio.com/docs/7-17/user/on_site_deployment/containerized_components/exchange_listener_synchronization_service. Решили делать на Ubuntu. Но для виндовс администратора, который не сталкивался ранее с докерами и кубернетес оказалось сложно. Появилось масса вопросов.

 

Нашла инструкцию, который выложил Вильшанский Дмитрий https://community.terrasoft.ua/articles/1-realnyy-primer-po-razvertyvaniyu-servisa-exchange-listener-s-ispolzovaniem-kubernetes. Очень помогла. Спасибо. Но в ней масса пакетов устарело и часть ссылок не работало уже на тот момент. Поэтому я немного видоизменила ее выкладываю сюда.

 

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

 

1. Устанавливаем чистую Ubuntu 20.04 LTS (c 22.04 возникли проблемы, поэтому пока остановилась на старой версии) БЕЗ свап раздела

 

2. Обновляем пакеты и ядро до последней доступной версии

sudo apt-get  dist-upgrade

 

3. не обязательно, но я меняю для своего удобства временную зону, что бы время отображалось правильно

sudo timedatectl set-timezone Europe/Riga

проверить можно командой timedatectl

 

4. Нужно обязательно отключить SWAP, если это не было сделано при установки ОС

sudo swapoff -a

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

sudo free -h

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

 

5. Для удобства я доставляю пакеты mc, mlocate. Но это не обязательно. Без этого все будет работать.

sudo apt-get install mc mlocate 

 

6. Устанавливаем докер

sudo apt install -y docker.io

и для того, что бы не вылезла ошибка

#Как вылечить сообщение [WARNING Service-Docker]: docker service is not enabled, please run 'systemctl enable docker.service'
 
systemctl enable docker.service

добавим в файл следующие опции

sudo nano /etc/docker/daemon.json
			{
			  "exec-opts": ["native.cgroupdriver=systemd"],
			  "log-driver": "json-file",
			  "log-opts": {
			    "max-size": "100m"
			  },
			  "storage-driver": "overlay2"
			}

после этого нужно перезапустить докер

sudo service docker restart

 

7.

sudo apt-get update 
sudo apt-get install -y apt-transport-https
sudo curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo nano /etc/apt/sources.list.d/kubernetes.list

В 22й убунту вылезает warning связанный с ключами (3я строка). Я заменяла этой командой

sudo curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/cloud.google.gpg

4я с трока позваляет отредактировать файл kubernetes.list. В него надо добавить следующий репозиторий

deb http://apt.kubernetes.io/ kubernetes-xenial main

К сожалению, репозиторий под 18ю убунту xenial. Под 20ю Focal Fossa и 22ю Jammy Jellyfish - я не нашла.

 

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

sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl kubernetes-cni

я еще добавляю опцию в файл, связанный со свапом

sudo nano /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
Environment="KUBELET_SYSTEM_PODS_ARGS=--pod-manifest-path=/etc/kubernetes/manifests --allow-privileged=true --fail-swap-on=false"

 

9. Далее выполняем команду:

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

Именно 10.244.0.0/16! Вводим ровно то что написано.

Процесс может занять минуту или более в зависимости от вашего интернет-соединения.

 

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

Your Kubernetes control-plane has initialized successfully!
 
To start using your cluster, you need to run the following as a regular user:
 
  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config
 
Alternatively, if you are the root user, you can run:
 
  export KUBECONFIG=/etc/kubernetes/admin.conf
 
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/
 
Then you can join any number of worker nodes by running the following on each as root:
 
kubeadm join 192.168.хх.хх:6443 --token 0dwb03.figdfjkghgjdkmvbn \
        --discovery-token-ca-cert-hash sha256:86bfd668e671a0e2f7f94f08377515b2e29442c34e7966ae47435456jklfgkjfjh

нижние 2 строчки можно сохранить, если вы будете объединять в кластер машины. У меня одна и мне не актуально.

 

10. Дальше нужно запустить

sudo mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

 

11. Проверяем, какой контейнер у нас поднят

adminka@l-creatio-el-stage:~$ kubectl get nodes
NAME                 STATUS   ROLES           AGE     VERSION
l-creatio-el-stage   Ready    control-plane   7h52m   v1.25.4

Обратите внимение на роль, в моем случае control-plane. Машину, которую устанавливала больше года назад была master. Почему так - не знаю. По идеи роль можно поменять, но у меня заработала и с этой.

 

12. Поэтому в зависимости от роли команда для возможности запуска контейнеров на текущей машине может отличаться:

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

или

kubectl taint nodes --all node-role.kubernetes.io/control-plane-

результат должен быть

node/l-creatio-el-stage untainted

минус в конце дает untainted, без него tainted

 

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

$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
 
namespace/kube-flannel created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created

Скачиваем файл

wget https://raw.githubusercontent.com/coreos/flannel/v0.8.0/Documentation/kube-flannel-rbac.yml

в нем не верная стоит версия. Перед инсталией скаченный файл нужно отредактировать и заменить в 2х местах v1beta1 на v1. После этого файл нужно установить.

kubectl apply -f kube-flannel-rbac.yml

 

14Проверяем состояние подов:

adminka@l-creatio-el-stage:~$ kubectl -n kube-system get pods
NAME                                         READY   STATUS    RESTARTS   AGE
coredns-565d847f94-t2fbn                     1/1     Running   0          105s
coredns-565d847f94-tstts                     1/1     Running   0          105s
etcd-l-creatio-el-stage                      1/1     Running   0          116s
kube-apiserver-l-creatio-el-stage            1/1     Running   0          116s
kube-controller-manager-l-creatio-el-stage   1/1     Running   0          116s
kube-proxy-9xptw                             1/1     Running   0          105s
kube-scheduler-l-creatio-el-stage            1/1     Running   0          116s

 

15. Скачаем и установим helm

wget https://get.helm.sh/helm-v3.10.1-linux-amd64.tar.gz
tar xzvf helm-v3.10.1-linux-amd64.tar.gz
sudo mv linux-amd64/helm /usr/local/bin/helm

 

16. Добавляем репозиторий

helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo list
helm repo update

 

17. Устанавливаем редис

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

 

18. Нужно узнать ИП адресс для redis-master

adminka@l-creatio-el-stage:~$ kubectl get service
NAME             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
kubernetes       ClusterIP   10.96.0.1        <none>        443/TCP    2m53s
redis-headless   ClusterIP   None             <none>        6379/TCP   5s
redis-master     ClusterIP   10.103.135.150   <none>        6379/TCP   5s
redis-replicas   ClusterIP   10.99.52.153     <none>        6379/TCP   5s

 

19. Скачаем и установим сам ExchangeListener

опция env.host = IP redis-master

wget https://academy.creatio.com/sites/default/files/documents/downloads/ExchangeListener/exchangelistener-0.8.39.tgz
 
helm install --set env.host=10.103.135.150 --set service.type=NodePort --set service.nodePort=30001 --set apiVersion=apps/v1 --namespace default elistener exchangelistener-0.8.39.tgz

В документации дана ссылка на старую версию ExchangeListener 0.8.39

По ссылке https://hub.docker.com/r/bpmonline/exchangelistener/tags видим, что есть более новые версии для докера. Как их можно использовать? Они ставятся без параметров, в отличии от нашего случая в примере. Поэтому я оставила старую версию пакета. Просто скачать более новую версию у меня не получилось.

 

У меня все заработало.

 

После этого можно зайти по ИП машины, который присвоили при установке ОС

http://192.168.хх.хх:30001/api/listeners/status

 

Затем нужно добавить в сам црм, что бы он его увидел.

Подключала к версии црм 7,18 и у меня все заработало.

 

Разберусь как поставить новый вариант - добавлю сюда. С 22й версией убунту пока тоже есть вопросы. Не все работает как мне бы хотелось.

 

Нравится

Поделиться

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

define("ZbsTourOffers1Page", ["ZbsTourOffers1PageResources", "ProcessModuleUtilities"], 
       function(Resources, ProcessModuleUtilities) {

...

            getActions: function() {
                   var actionMenuItems = this.callParent(arguments);
                
                // Добавление линии-разделителя.
                actionMenuItems.addItem(this.getButtonMenuItem({
                    Type: "Terrasoft.MenuSeparator",
                    Caption: ""
                }));
                
                // Добавление пункта меню в список действий раздела.
                actionMenuItems.addItem(this.getButtonMenuItem({
                    // Привязка заголовка пункта меню к локализуемой строке
                    // схемы.
                      Click: {bindTo: "createTreatSessions"},
                    // Привязка метода-обработчика действия.
                    Caption: {bindTo: "Resources.Strings.CreateTreatSessionsCaption"}                                        
                }));
                
                 // Возврат дополненной коллекции действий раздела.
                return actionMenuItems;
            },                        
 

Нравится

Поделиться

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

Добавьте ещё и в схему раздела

Владимир Соколов, спасибо!

Показать все комментарии
getActions: function () {
    var actionMenuItems = this.callParent(arguments);
    //стандартная кнопка
    actionMenuItems.addItem(this.getButtonMenuItem({
        "Caption": { "bindTo": "Resources.Strings.EarlyTerminationCaption" },
        "Tag": "earlyTerminationClick",
        "Enabled": { "bindTo": "IsEarlyTerminationVisible" }
    }));
 
    actionMenuItems.addItem(this.getButtonMenuItem({
        Type: "Terrasoft.MenuSeparator",
        Caption: ""
    }));
    //список с кнопками
    var skipColumns = Ext.create("Terrasoft.BaseViewModelCollection");
 
    skipColumns.addItem(this.getButtonMenuItem({
        Caption: {
            "bindTo": "Resources.Strings.SkipFillingPhoneNumber"
        },
        Tag: "skipFillingPhoneNumberButtonClick"
    }));
 
    actionMenuItems.addItem(this.getButtonMenuItem({
        Caption: { "bindTo": "Resources.Strings.SkipButton" },
        Items: skipColumns,
        "ImageConfig": this.get("Resources.Images.SortIcon"),
        "Enabled": true
    }));
    return actionMenuItems;
}

 

Нравится

Поделиться

0 комментариев
Показать все комментарии
editRecord: function(record) {
				const activeRow = record || this.getActiveRow();
				if (!activeRow) {
					return;
				}
				if (!this.getIsCardValid()) {
					return;
				}
				const primaryColumnValue = activeRow.get("NrbPoint.NrbObject").value;
				this.openCardInChain({
					id: primaryColumnValue,
					sandbox: this.sandbox,
					schemaName: "NrbObjectPage",
					operation: ConfigurationEnums.CardStateV2.EDIT,
					moduleId: this.sandbox.id + "_" + "NrbObjectPage",
					renderTo: "centerPanel",
					historyState: this.sandbox.publish("GetHistoryState")
				});
			},

 

Нравится

Поделиться

0 комментариев
Показать все комментарии
define("InvoicePageV2", ["InvoiceConfigurationConstants"], function(InvoiceConfigurationConstants) {
    return {
        entitySchemaName: "Invoice",
        attributes: {
            "IsModelItemsEnabled": {
                dataValueType: Terrasoft.DataValueType.BOOLEAN,
                value: true,
                dependencies: [{
                    columns: ["PaymentStatus"],
                    methodName: "setCardLockoutStatus"
                }]
            }
        },
        methods: {
            getDisableExclusionsColumnTags: function() {
                return ["PaymentStatus"];
            },
 
            getDisableExclusionsDetailSchemaNames: function() {
                return ["ActivityDetailV2"];
            },
            setCardLockoutStatus: function() {
                var state = this.get("PaymentStatus");
                if (state.value === InvoiceConfigurationConstants.Invoice.PaymentStatus.Paid) {
                    this.set("IsModelItemsEnabled", false);
                } else {
                    this.set("IsModelItemsEnabled", true);
                }
            },
            onEntityInitialized: function() {
                this.callParent(arguments);
                this.setCardLockoutStatus();
            }
        },
        details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
        diff: /**SCHEMA_DIFF*/[
            {
                "operation": "merge",
                "name": "CardContentWrapper",
                "values": {
                    "generator": "DisableControlsGenerator.generatePartial"
                }
            }
        ]/**SCHEMA_DIFF*/
    };
});

 

Нравится

Поделиться

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