محدود کردن نصب On-Premise بر اساس IP
این صفحه برای مدیران نصب On-Premise مونوچت (MonoChat) است. توضیح میدهد چگونه برنامه وب را در سطح شبکه (nginx یا فایروال) به شبکههای خودتان محدود کنید، بدون اینکه سرویسهایی را که باید از اینترنت با MonoChat تماس بگیرند مسدود کنید.
MonoChat فهرست IP مجاز مخصوص خود را ندارد. محدودیت در nginx، لود بالانسر یا فایروال شما اعمال میشود و برای کل نصب است، نه برای یک سازمان.
چه چیزی را محدود کنیم و چه چیزی را باز بگذاریم
| محدود به شبکههای شما بماند | از اینترنت در دسترس بماند |
|---|---|
| برنامه وب و هر چیزی که در ستون سمت چپ فهرست نشده است | مسیرهای وبهوک و کالبک در جدولهای زیر |
نقطه پایانی 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 (کانالهای 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) | گزارش اجراهای عامل هوش مصنوعی به 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;. - متغیر محیطی
HTTP_FORWARDED_COUNTرا روی سرور MonoChat برابر تعداد پروکسیهای جلوی برنامه تنظیم کنید. این متغیر را فریمورک Meteor میخواند، نه کد MonoChat؛ بنابراین جایش در تنظیمات استقرار شماست، نه در JSON تنظیمات.
بررسی پیکربندی
- از یک شبکه غیرمجاز، برنامه وب را باز کنید. باید رد شود.
- از یک شبکه مجاز وارد شوید و صندوق ورودی را باز کنید. پیامها باید بارگذاری شوند؛ این نشان میدهد نقطه پایانی WebSocket برای شما باز است.
- از خارج از شبکه خود یک پیام آزمایشی به یک کانال متصل بفرستید و تأیید کنید که در صندوق ورودی میرسد.
- برای یک سفارش آزمایشی کوچک لینک پرداخت بسازید، آن را پرداخت کنید و تأیید کنید که سفارش پرداختشده نشان داده میشود.
پس از هر تغییر در قوانین پروکسی خود مسیرها را آزمایش کنید. مسدود بودن یک مسیر وبهوک در MonoChat خطایی نشان نمیدهد: فقط پیامها و تأییدیههای پرداخت دیگر نمیرسند.