Ограничение on-premise установки по IP
Эта страница предназначена для администраторов on-premise установки MonoChat. Она объясняет, как ограничить веб-приложение вашими собственными сетями на сетевом уровне (nginx или файрвол), не блокируя сервисы, которые должны обращаться к MonoChat из интернета.
В MonoChat нет собственного списка разрешённых IP-адресов. Ограничение настраивается в вашем nginx, балансировщике нагрузки или файрволе и действует на всю установку, а не на отдельный tenant.
Что ограничивать, а что оставить открытым
| Ограничить вашими сетями | Оставить доступным из интернета |
|---|---|
| Веб-приложение и всё, чего нет в списке справа | Пути вебхуков и обратных вызовов из таблиц ниже |
Конечная точка DDP/WebSocket, к которой подключается веб-приложение (/websocket) |
Ограничивайте веб-интерфейс и конечную точку WebSocket вместе: приложение использует обе. Для всех остальных разрешите только пути ниже, а остальное заблокируйте.
Пути, к которым обращаются внешние сервисы
Каждый путь ниже регистрируется сервером MonoChat. Путь, построенный из настройки, это hookPath, который вы задали на сервере (в channelConnectors.<name> или paymentSystemConnectors.<name> в настройках сервера); суффикс добавляется кодом. Открывайте только те коннекторы, которые вы используете.
Каналы
| Путь | Кто обращается | Где определён |
|---|---|---|
<hookPath>/webhooks (POST) | omni-message, для WhatsApp Cloud, WhatsApp Gupshup, Instagram, Messenger, Telegram, TikTok, Twilio SMS и Varan OTP | packages/app-connectors-om2-*/src/webhooks/webhook.ts; hookPath from channelConnectors.whatsappBusinessVegaCloud, whatsappBusinessVegaGupshup, instagramCastor, messengerRigel, telegramBotRegulus, tikTokTimir, twilioSms, varanOtp |
<hookPath>/webhooks, <hookPath>/sessions, <hookPath>/messages (POST) | Ваши собственные системы через канал Messages API | channelConnectors.messagesApi.hookPath, packages/app-connectors-messages-api/src/webhooks/webhook.ts |
<hookPath>/message, <hookPath>/info (POST) | Chatwoot | channelConnectors.chatwoot.hookPath, packages/app-connectors-chatwoot/src/webhook.ts |
<hookPath>/inbound (POST) | SIP-провайдер (каналы generic SIP и Sonitel SIP) | channelConnectors.genericSip.hookPath, channelConnectors.sonitelSip.hookPath |
/api/facebook/channels/:channelId/flows/:flowId (POST) | WhatsApp, для WhatsApp Flows | server/api/whatsapp-flow.js |
Провайдеры каналов (Meta, Telegram, TikTok, Twilio) не обращаются к MonoChat напрямую. Они обращаются к webhook listener omni-message, который пересылает запросы на путь /webhooks выше. Если вы запускаете omni-message самостоятельно, его webhook listener должен быть доступен из интернета по этим путям: /webhooks/meta-messenger, /webhooks/instagram-business, /webhooks/wab-cloud, /webhooks/wab-gupshup/:channelId, /webhooks/wab-360-dialog/:channelId, /webhooks/telegram-bot/:channelId, /webhooks/tiktok и /webhooks/twilio-sms/:channelId (apps/webhook-listener/src/modules/webhook-listeners/webhook-listeners.controller.ts в omni-message). Сам MonoChat должен быть доступен для omni-message по путям /webhooks выше.
Платёжные системы
Платёжные провайдеры отправляют обратный вызов, когда клиент оплачивает заказ, а затем возвращают клиента в MonoChat. И то и другое должно работать из-за пределов вашей сети.
| Коннектор | Пути под его hookPath (paymentSystemConnectors.<name>.hookPath) |
|---|---|
| Stripe | /webhook/:clientId (POST), /return/success/:paymentSystemId, /return/cancel/:paymentSystemId |
| HyperPay | /pay/:clientId/:paymentSystemOrderId, /result/:clientId/:paymentSystemOrderId |
| Mamo | /webhook/:clientId (POST), /return/:clientId/:paymentSystemOrderId |
| Midtrans | /webhook/:clientId (POST), /return/:paymentSystemOrderId |
| Paymob | /webhook/:clientId (POST), /return/:paymentSystemOrderId |
| PayTabs | /callback/:clientId/:paymentSystemOrderId (POST), /return/:paymentSystemOrderId |
| Tabby | /webhook/:clientId (POST), /return/:paymentSystemOrderId/:status |
| Tamara | /webhook/:clientId (POST), /return/:paymentSystemOrderId/:status |
| Tap | /webhook/:clientId (POST), /return/:clientId/:paymentSystemOrderId |
| Telr | /webhook/:clientId/:paymentSystemOrderId (POST), /return/:paymentSystemOrderId/:status |
| Ziina | /return/:clientId/:paymentSystemOrderId/:status |
| iyzico | /:transactionId (POST) |
| JCC | /:status |
| MyFatoorah | сам hookPath (POST), /:paymentSystemOrderId/:status (POST) |
| N-Genius | сам hookPath (POST), /:paymentSystemOrderId/:status |
| Paywall | /:paymentSystemOrderId/:status |
| UniqoPay | сам hookPath (POST), /:paymentSystemOrderId/:status (POST) |
| VakıfBank Sanal POS | /:status (GET и POST) |
| İş Yerim POS | сам hookPath (GET и POST) |
Проще всего открыть <hookPath> и всё, что находится под ним, для каждого используемого платёжного коннектора. Источник каждого из них: packages/app-connectors-<name>/src/webhook.ts.
Прочие конечные точки сервера
| Путь | Назначение | Где определён |
|---|---|---|
/api/:slug/custom-functions/… (POST) | Вызов пользовательской функции по HTTP с токеном доступа | lib/managers/custom-function-sdk/_/server/endpoint.js |
/api/ai-agent/mcp, /api/ai-agent/events (POST) | Запуски AI-агента отправляют результаты обратно в MonoChat | server/api/ai-agent.ts |
/api/channels-manager/facebook/auth, /api/channels-manager/tiktok/auth (GET) | Всплывающее окно, которое возвращается после подключения аккаунта Facebook или TikTok | packages/app-managers-channel/src/webhook.ts |
/l/:_id (GET) | Короткие ссылки, которые вы отправляете клиентам | server/api/short-link.js |
/api/status (GET) | Мобильное приложение проверяет сервер и доступные способы входа | server/api/status.js |
/.well-known/assetlinks.json, /.well-known/apple-app-site-association (GET) | Ссылки приложений Android и iOS | server/api/assetlinks.js, server/api/apple-app-site-association.js |
Откройте /api/:slug/custom-functions, /api/ai-agent, /l/ и два пути всплывающих окон каналов, если вы используете эти функции из-за пределов вашей сети. Пути всплывающих окон каналов открываются в браузере того, кто подключает аккаунт, поэтому они могут оставаться ограниченными, если каналы подключают только сотрудники из вашей сети. Откройте /api/status и два файла /.well-known только в том случае, если ваши агенты используют мобильное приложение MonoChat из-за пределов вашей сети.
Вход через провайдера (OAuth)
Когда провайдер входа перенаправляет браузер обратно в MonoChat, это обычный запрос браузера от входящего пользователя, поэтому к нему применяется то же ограничение, что и к веб-приложению. Оставьте пути перенаправления доступными для людей, которые входят таким способом. Пути задаются значениями redirectPath в public.oauth.<provider> в настройках сервера (в примерах по умолчанию это /api/oauth/google/redirect, /api/oauth/microsoft/redirect, /api/oauth/facebook/redirect и /api/oauth/apple/redirect). Вход через Apple возвращает браузер запросом POST (responseMode: form_post), который тот же путь принимает. Для мобильного приложения сервер также отвечает на /api/oauth/facebook/mobile, /api/oauth/microsoft/mobile и /auth/oauth-callback/<provider> (server/configs/oauth/mobile.ts).
Если вы используете интеграцию с Microsoft Marketplace, путь из microsoftMarketplace.redirectWebhookPath принимает запрос Microsoft Marketplace и должен быть доступен из интернета (server/configs/microsoft-marketplace/webook.ts).
Передайте реальный IP клиента через прокси
MonoChat записывает IP клиента для сессий и журналов состояния. За обратным прокси или балансировщиком нагрузки он видит адрес прокси, пока вы не передадите настоящий.
- Настройте nginx (или балансировщик нагрузки) так, чтобы он отправлял исходный адрес в заголовке
X-Forwarded-For, напримерproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;. - Задайте на сервере MonoChat переменную окружения
HTTP_FORWARDED_COUNT, равную числу прокси перед приложением. Её читает фреймворк Meteor, а не код MonoChat, поэтому она относится к настройкам развёртывания, а не к JSON с настройками.
Проверьте настройку
- Из сети, которой доступ не разрешён, откройте веб-приложение. Доступ должен быть отклонён.
- Из разрешённой сети войдите и откройте inbox. Сообщения должны загрузиться, что доказывает, что конечная точка WebSocket открыта для вас.
- Отправьте тестовое сообщение в подключённый канал из-за пределов вашей сети и убедитесь, что оно пришло в inbox.
- Создайте ссылку на оплату для небольшого тестового заказа, оплатите её и убедитесь, что заказ отображается как оплаченный.
Проверяйте пути после каждого изменения правил прокси. Заблокированный путь вебхука не вызывает ошибку в MonoChat: сообщения и подтверждения платежей просто перестают приходить.