- Имеем:
1) Сайт под управлением нашей компании. Обычный сайт на apache+nginx+php на который заходят пользователи и тд. [site.ru]
2) CRM система. Тоже на apache+nginx+php, но на нее нельзя попасть из внешней сети, хотя она доступ имеет. То есть можно сделать ping site.ru с сервера crm.ru, но при этом ping crm.ru с site.ru - не прокатит. [crm.ru]
3) Сайт под управлением третьего лица, который предоставляет нам услуги. На чем он работает - не известно и думаю не особо то важно. [site-2.ru]
4) Цели - [site-2.ru] хочет в режиме реального времени получать данные по апи от [crm.ru].
Вот вопрос - как это можно реализовать, желательно не открывая портов, сети и тд?
Первое что мне в голову пришло - развернуть на [site.ru] сокет-сервис, который будет прослушиваться со стороны [crm.ru]. Но я совсем плох в сокетах, и может это вообще не то.
В общем прошу совета по реализации указанной цели.
если срм во внутренней сети (за NAT?), то наверное нужен что-то типа прокси, который виден во внешней сети и имеет доступ во внутреннюю (в т.ч. к срм). Ну или пробросить порт (по логике тоже самое).
А никак, вообще. Если вы не можете изменить сайт с серверной стороны то это означает что вам доступны только клиентские изменения, которые не смогут достучаться до CRM. Вот и все. CRM в сайт ничего не пошлет по тому что с серверной стороны вы беспомощны.
Кроме того вы хотите API от CRM, а это значит что в лучшем случае вам понадобится VPN соединение с CRM. Ну, или выносить CRM в паблик или открывать порты
Ну никак - тут быть не может, так как я знаю совсем велосипедный вариант решения:
Например сделать так, чтобы по крону каждую секунду [crm.ru] и [site-2.ru] делали запрос чтения файла на [site.ru] допустим через ftp. И если в этом файле например появляется запись вида
"1587400804_[site-2.ru] : getCrmProperty('count')"
То [crm.ru] забирает ее себе и запускает соответствующую функцию, результат возвращая в тот же файл по ftp с тем же id (1587400804):
"1587400804_[crm.ru] : 10"
Так как у нас [site-2.ru] тоже каждую секунду проверяет изменения в файле на [site.ru], он забирает нужную строку из файла и возвращает ее пользователю.
Ну только это какой-то дико пугающий вариант, однако проблем в реализации (кроме неадекватной растраты ресурсов и использования кустарных методов) - я не вижу.
вот потому мне и показалось, что, раз есть хоть какое-то решение, приходящее в голову сходу. Значит должно быть и какое-то адекватное решение:)
Соедиение с БД через unix-сокет работает по сути похожим образом, слышал о веб-сокетах, предположил что вероятно они могли бы решить мою проблему.
Иван Веков, ну, в данных условиях мы считаем что сайт - неизменяемый продукт, поэтому я и говорю что это не решаемая таким образом задача. То есть блокировка в обе стороны: в одну на сетевом и в другую на программном
Условно-неизменяемый у нас только [site-2.ru]. На [site-1.ru] мы можем делать что хотим. А [crm] в свою очередь может слушать/менять [site-1.ru], а [site-2.ru] может делать запросы к [site-1.ru].
site-2.ru просто пишет у себя в nginx новый location, по которому требует клиентский сертификат tls (имеющийся на стороне crm.ru, это нужно чтоб никто больше не мог этот location дернуть)
crm.ru дергает post запрос по этому локейшену и скидывает туда обновления данных
site.ru в взаимодействии между site-2.ru и crm.ru вообще не нужен
история в том, данные должны приходить по запросу с [site-2.ru], данные лежат на [crm.ru]. Ваш метод, как я понимаю, подразумевают, что инициатор - [crm.ru].
Иван Веков, да, инициатор [crm.ru], раз данные у него и эти данные нужно отдавать в реальном времени [site-2.ru] ибо только [crm.ru] знает когда данные обновились + в условиях задачи? я так понял? он находится за NAT
Дмитрий Беляев, не совсем так. Смотрите, на [site-2.ru] работает пользователь, там есть информация о списке товаров, но нет актуальных статусов по ним (продан/доступен/забронирован). Пользователь на [site-2.ru] нажимает кнопку и ему прилетает статус от [crm.ru]. Так как напрямую от [site-2.ru] к [crm.ru] доступа нет, то я предположил, что можно сделать какой-то файл на сайте, к которому мы имеем полный доступ [site-1.ru], который будет слушать [crm.ru]. И получается [site-2.ru] делает запрос к [site-1.ru], [crm.ru] следит за каким-нибудь файлом/сокетом/портом на [site-1.ru] и считывает запрос, который был отправлен между сайтам, обрабатывает его, и отправляет результат на [site-1.ru], который в свою очередь отвечает клиенту, который сидит все это время на [site-2.ru] и нажал проверку доступности товара.
Если crm.ru за NAT, это означает, что без проброса портов site-2.ru никак (ну вот от слова совсем) не сможет инициировать к ней соединение. Либо он сигналит на site.ru, чтобы crm.ru сама установила соединение с site-2.ru, либо нужно пробросить порт, по которому site-2.ru отошлет команду к crm.ru