Кто знает где скачивать обновленные версии helm-пакетов ExchangeListener? Для пакетов Docker есть bpmonline/exchangelistener Tags

Если верить статье , то актуальная версия должна быть в документации. Но там не актуальная версия. Саппорт предоставил более новую версию.

Террасофт! создайте единое хранилище версий по типу версий системы https://ftp.creatio.com/support/downloads/!Release/installation_files/

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

Здравствуйте!
После развертывания on-site версии Creatio 7.18.5 и настройки через Docker сервиса Exchange Listener появилась проблема.

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

При попытке подключения к почтовому ящику в логах docker  выдаёт ошибку

 

[ExchangeListener.Service.ServiceFactory] 2022-01-20 12:36:34,447 [12] INFO : [e24a41bc-2438-4c4b-bad9-a112626a7c22] [teachersimulatorfeedback@gmail.com] Successfully loaded EmailMessage MessageId = '<c4e850d7-aa3a-4268-96b3-f3014b1e4e6f@gmail.com>', Id = '<c4e850d7-aa3a-4268-96b3-f3014b1e4e6f@gmail.com>', Subject = 'Тестовое сообщение Creatio'.
 
[ListenerBase.DataSend.EventDataSender] 2022-01-20 12:36:34,447 [12] INFO : [e24a41bc-2438-4c4b-bad9-a112626a7c22] [teachersimulatorfeedback@gmail.com] EventDataSender send 100 bytes to http://localhost:83/0/ServiceModel/ExchangeListenerService.svc/ProcessBinarySerializedEmail
 
[ListenerBase.Email.Load.BaseEmailEventProcessor] 2022-01-20 12:36:34,449 [5] ERROR: [e24a41bc-2438-4c4b-bad9-a112626a7c22] Mailbox teachersimulatorfeedback@gmail.com: error sending emails ['12' in folder INBOX] to http://localhost:83/0/ServiceModel/ExchangeListenerService.svc/NewEmail.
 
System.Net.Http.HttpRequestException: Cannot assign requested address
 
 ---> System.Net.Sockets.SocketException (99): Cannot assign requested address
 
   at System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancellationToken)
 
   --- End of inner exception stack trace ---

Выглядит, как будто доступ к ящику есть (видит темы писем), но не может передать их в Creatio.

Окно проверки email-сервисов показывает все зеленые галочки, тестовые емэил высылаются.

 

Нравится

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

Владимир, добрый день! 

Запись "Cannot assign requested address" говорит о том, что микросервис Exchange Listener не имеет доступа к серверу приложений. Вам необходимо проверить значение системной настройки "BpmonlineExchangeEventsEndpointUrl". Для корректного получения почты в адресе настройки должно быть указано доменное имя сайта или Ip. Если Вы указали в адресе "localhost", загрузка писем не будет проходить.

Владимир, добрый день! 

Запись "Cannot assign requested address" говорит о том, что микросервис Exchange Listener не имеет доступа к серверу приложений. Вам необходимо проверить значение системной настройки "BpmonlineExchangeEventsEndpointUrl". Для корректного получения почты в адресе настройки должно быть указано доменное имя сайта или Ip. Если Вы указали в адресе "localhost", загрузка писем не будет проходить.

Lev Kuptsov,

Письма начали загружаться после замены localhost на реальный ip. Спасибо!

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

Здравствуйте, подскажите где логи посмотреть, про логи контейнера я знаю, подключился к самому контейнеру, но там нет папки с логами. Может кто-то подскажет как кроме логов от докера можно посмотреть

Нравится

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

Если кому-то интересно, пока получилось решить задачу просмотром логов самого докера по контейнеру, вот команда sudo docker logs CONTAINER_ID

Добрый день.
Вы можете получить логи сервиса EXCHANGE LISTENER из докера выполнив команду:
docker logs -f название сервиса 

Также Вы можете получить логи Exchange Listener из логов самого приложения, папка Syns, файл ExchangeListener.
Обращаю внимание, что логи Listener из логов приложения менее информативны чем логи из пода сервиса.

Стандартный путь логов приложения:
C:\Windows\Temp\Creatio\myApp\0\Log

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

Добрый день.

После перехода на ExchengeListener Service, появилась проблема с определением входящих писем в таблице Activity: для исходящих писем в поле MessageTypeId указывается правильный тип письма "Outgoing", а для входящих писем данное поле не заполняется вообще, т.е. имеет значение null.

Подскажите, пожалуйста, в чем может быть проблема?

Нравится

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

Добрый день.
Вы можете сделать join из таблицы ActivityParticipantRole по колонке RoleId таблицы EmailMessageData.
Таблица ActivityParticipantRole хранит в себе нужные Вам данные. 

Была такая же проблема - поддержка посоветовала не использовать MessageType, а работать с таблицей EmailMessageData

Спасибо, за ответ.

А как из таблицы EmailMessageData понять какое письмо входящее, а какое исходящее?

Добрый день.
Вы можете сделать join из таблицы ActivityParticipantRole по колонке RoleId таблицы EmailMessageData.
Таблица ActivityParticipantRole хранит в себе нужные Вам данные. 

Cherednichenko Nikita,

Спасибо, за ответ.

Действительно если построить join, то по полю ActivityParticipantRole.Code можно определить входящее или исходящее письмо(From/To).

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

Добрый день, у нас есть настроенный exchange listener. Если попробовать отправить письмо по желтому значку почты из обращения(в рабочем месте Сервис), то письмо отправляется. Так же у нас есть собственное рабочее место и Наряды, схожие по функционалу с обращениями. Вот из нарядов письмо не уходит, хотя штатный функционал, подскажите в какую сторону копать? В документации не смог найти ничего чтобы помогло.

Нравится

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

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

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

Добрый день!

В этом посте покажу как можно развернуть микросервис 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 комментариев
Показать все комментарии

Сервис развертывал по этому примеру:

https://community.terrasoft.ru/articles/2-realnyy-primer-po-razvertyvaniyu-servisa-exchange-listener-s-ispolzovaniem-kubernetes

 

Сам сервис работает, через браузер открывается:

 

Пинг с машины, на которой развернут Creatio, проходит, через telnet на 30001 порт подключается, но в Creatio при диагностике такая картина:

 

Никто не сталкивался с таким?

 

Так же было замечено, что если зайти на сервис /0/ServiceModel/ExchangeListenerService.svc в версии 7.14, там выдается корректное сообщение:

 

Но в новой версии 7.17, где пытаюсь настроить, была такая ошибка:

 

Добавил в services.config в этот сервис строчку по аналогии с другими сервисами:

<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />

Теперь сервис выдает такое сообщение:

Может это быть причиной?

Нравится

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

файрвол, не правильно проброшен порт(если через nat на гостевую машину", проверьте логи сервиса  на предмет ошибок kubectl logs  <название pod'a>
и с браузера он открывается на машине, где разврнут creatio или только на виртуалке?

Файрвол на машине, где поднят сервис, отключен. С браузера на машине, где развернут сайт с Creatio, а так же через telnet по порту 30001 на той же машине подключается. Логи смотрел. Ошибок никаких нет.

Добрый день!

 

В рамках обращения в Support Creatio, нашли очень не обычную причимну ошибки.

Проблемой оказался некорректно завершенный fiddler.
Он выступал как прокси-сервер и перенаправлял все запросы с IIS на наш проблемный адрес, по этому мы видели ошибки, а через браузер все работало.

В будущем, рекомендуем не использовать fiddler на продуктивном сервере, и в случе возникновения этой проблемы необходимо перезапустить сервер.

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

В данной статье описаны алгоритмы обновления микросервиса EXCHANGE LISTENER в разных вариантах разворачивания.

Для KUBERNETES:
Необходимо запустить команду:
helm upgrade -i #параметры указать такие же как и при установке установке#
Пример установки доступный в инструкции по разворачиванию.
Актуальная версия helm пакета доступна в статье:
https://academy.terrasoft.ru/docs/user/ustanovka_i_administrirovanie/ra…

Для Docker:

Удалить запущенный контейнер с неактуальной версией Exchange Listener.

docker rm - f &lt;container_name&gt;

Далее запустить команду с инструкции по установке (https://academy.terrasoft.ru/docs/user/ustanovka_i_administrirovanie/razvertyvanie_onsite/nastrojka_kontejnernyh_komponentov/nastroit_servis_sinkhronizacii_exchange_listener#title-2503-4)
В последней в последней строчке необходимо указать актуальную версию Exchange Listener.
Актуальную версию Exchange Listener можно узнать в сообществе Docker Hub по ссылке.

 

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

Нравится

Поделиться

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

Для Docker. Не остановить, а удалить! иначе получаем 

docker: Error response from daemon: Conflict. The container name "/ExchangeListener" is already in use by container "daa7c3fcdcbd3b72de643e7f36a31cf3fc6f1e75edbb1cba1e4fad3a628751da". You have to remove (or rename) that container to be able to reuse that name.
See 'docker run --help'.

 

Алексей Следь,

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

 

Error response from daemon: You cannot remove a running container 2c982e783b9f96d3db07b851a1ada8a9b747f17294efd10cae3f3df49eee9313. Stop the container before attempting removal or force remove

 

Дмитрий Антохин,

Как сказала техподдержка, а эта публикация создана после моего обращения, "наши опытные пользователи doker знают последовательность действий при обновлении контейнеров."

Алексей Следь,

добрый день!
Спасибо за уточнения, мы поправили пост. Также рекомендую ознакомиться с обучающим видео по разворачиванию микросервиса.

https://www.youtube.com/watch?v=Ue9Pk92leqM

 

Алексей Следь,

Спасибо за обратную связь по использованию инструкции. Статью дополнили.

 

Коллеги, доброго дня.

 

В последней в последней строчке необходимо указать актуальную версию Exchange Listener.
Актуальную версию Exchange Listener можно узнать в сообществе Docker Hub по ссылке.

Обычно при использовании контейнеров, используется различные теги, позволяющие загружать последнюю версию контейнера, без необходимости прописывать конкретную версию, например "latest". 

 

Почему в EXCHANGE LISTENER не используется такой подход и обязательно требуется конкретизировать версию ?

 

 

Добрый день, Денис!

Зафиксировали пожелание на ответственную команду разработки для возможно реализации в будущих версиях продукта.

Спасибо, что помогаете делать наш продукт лучше!

С уважением,
Сидько Елена
Оператор
Группа компаний Terrasoft

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

Всем привет! 

 

Поделюсь своим опытом и отвечу на вопрос как можно обновить helm-пакет сервиса Exchange Listener.

Сама ссылка на актуальный helm-пакет сервис: https://academy.terrasoft.ru/docs/user/ustanovka_i_administrirovanie/razvertyvanie_onsite/nastrojka_kontejnernyh_komponentov/nastroit_servis_sinkhronizacii_exchange_listener#title-2503-2 (см. "скачайте helm-пакет").

P.S. В целом по обновлению или переустановке helm пакета информация есть в интернете (https://helm.sh/docs/helm/helm_upgrade/)

Обновить версию можно сделать двумя способами:

1. Обновление. Использовать команду:

helm upgrade -i #параметры указать такие же как и при установке установке#

2. Удаление и повторная установка:

- удаление сервиса

helm delete -purge <название вашего сервиса>

 

- повторная установка согласно инструкции (https://academy.terrasoft.ru/docs/user/ustanovka_i_administrirovanie/razvertyvanie_onsite/nastrojka_kontejnernyh_komponentov/nastroit_servis_sinkhronizacii_exchange_listener#title-2503-2)

 

Хорошего дня!

Нравится

Поделиться

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

Всем привет!

 

Продолжаем освещать вас жизненными примерами по разворачиванию сервиса 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 &lt;&lt;EOF&gt;&gt; /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 &lt;&lt;EOF &gt; /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 наша общая боль) 

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