📞 تماس صوتی و تصویری
برنامه از تماسهای نظیربهنظیر (P2P) صوتی و تصویری دونفره در پیامهای مستقیم (DM) با استفاده از فناوری WebRTC و سیگنالینگ کمتاخیر مبتنی بر وبسوکت پشتیبانی میکند.
نمای کلی معماری
فناوری WebRTC یک اتصال مستقیم، رمزگذاریشده و نظیربهنظیر میان دو کاربر برای انتقال دادههای صوتی و تصویری ایجاد میکند. فرایند سیگنالینگ (Signaling) هماهنگی اولیه را پیش از برقراری جریان مستقیم رسانه انجام میدهد:
۱. بستر سیگنالینگ:
- اصلی: تبادل پیامهای سیگنالینگ با تاخیر نزدیک به صفر از طریق اتصال وبسوکت موجود.
- پشتیبان (Fallback): در صورت قطع وبسوکت یا حالت فقط SSE، سیگنالینگ به صورت خودکار از طریق درخواستهای HTTP و جریان رویدادهای SSE انجام میشود.
۲. جریان دادههای صوتی و تصویری:
- دادهها به شکل مستقیم میان دو کاربر و بدون عبور از سرور رد و بدل میشوند.
- سرور جریان رسانهای تماس را ذخیره یا پردازش نمیکند، که باعث حفظ حریم خصوصی کاربران و کاهش چشمگیر بار سرور میشود.
۳. گذر از فایروال و NAT (سرورهای STUN و TURN):
- STUN: برای کشف IP و Port دو طرف در شبکههای خانگی و NATهای استاندارد استفاده میشود.
- TURN: در صورتی که هر دو کاربر پشت فایروالهای سختگیرانه یا NAT متقارن (مانند اینترنت اپراتورهای موبایل) باشند، ترافیک رمزنگاریشده از طریق سرور رله عبور میکند.
پیکربندی
متغیرهای محیطی زیر را میتوانید در فایل .env خود تنظیم نمایید:
# آدرس سرور STUN برای WebRTC (پیشفرض: STUN عمومی گوگل)
TURN_STUN_URL="stun:stun.l.google.com:19302"
# تنظیمات اختیاری سرور رله TURN
TURN_URL="turn:your-turn-server.example.com:3478"
TURN_USERNAME="your-username"
TURN_CREDENTIAL="your-password"
# TURN مدیریتشده از طریق Cloudflare Calls (اختیاری)
TURN_TOKEN_ID="your-cloudflare-turn-key-id"
TURN_API_TOKEN="your-cloudflare-turn-api-token"برای فراهم کردن رله TURN دو روش وجود دارد و باید یکی از آنها را انتخاب کنید:
- TURN مدیریتشده از طریق Cloudflare Calls (بدون نیاز به سرور اضافی): مقادیر
TURN_TOKEN_IDوTURN_API_TOKENرا از داشبورد کلاودفلر (Calls → TURN) تنظیم کنید. در این حالت، سرور برای هر جلسه اعتبارنامههای موقت (با اعتبار ۲۴ ساعت) از طریق API کلاودفلر صادر میکند و کلاینتها فهرست STUN و TURN کلاودفلر (UDP، TCP و TLS) را دریافت مینمایند. تا زمانی که این کلیدها تنظیم شده باشند، مقادیرTURN_URL/TURN_USERNAME/TURN_CREDENTIALنادیده گرفته میشوند. این روش برای اجرای برنامه روی پلتفرمهای میزبانی مانند Render توصیه میشود، چرا که این پلتفرمها به دلیل عدم پشتیبانی از پورتهای UDP قادر به اجرای سرور TURN نیستند. - سرور TURN میزبانیشده توسط خودتان (مانند Coturn روی یک VPS): مقادیر
TURN_URL،TURN_USERNAMEوTURN_CREDENTIALرا با آدرس و اعتبارنامههای ثابتِ سرور رله خودتان تنظیم کنید.
اگر هیچکدام پیکربندی نشده باشند، تماسها فقط از سرور STUN پیشفرض استفاده میکنند.
بررسی سلامت
در صورت پیکربندی، میتوانید وضعیت سلامت، تأخیر و در دسترس بودن سرور TURN را در هر زمان از تب Services در پنل مدیریت بررسی کنید.
غیرفعال کردن تماسها
امکان خاموش کردن تماسها در سطح سرور از طریق متغیرهای محیطی (یا گروه تنظیمات Calls در پنل مدیریت) وجود دارد:
CALL(پیشفرضtrue): در حالت خاموش، تماسها بهطور کامل غیرفعال میشوند — API درخواست شروع تماس را رد میکند و دکمههای تماس در رابط کاربری غیرفعال نمایش داده میشوند.CALL_VIDEO(پیشفرضtrue): در حالت خاموش، تماسهای تصویری رد میشوند و تماسهای صوتی همچنان در دسترس هستند.CALL_MAX_DURATION(پیشفرض0یعنی بدون محدودیت): پس از این تعداد دقیقه (۱ تا ۱۴۴۰)، تماسهای برقرارشده بهطور خودکار پایان مییابند.
چه زمانی به سرور TURN نیاز است؟
- شبکههای معمولی خانگی: در بیشتر شبکهها، سرور پیشفرض STUN گوگل (
stun:stun.l.google.com:19302) برای برقراری مستقیم تماس کافی است. - شبکههای موبایل و فایروالهای محدودکننده: چنانچه کاربران در شبکههای اپراتورهای موبایل (CGNAT) یا فایروالهای شرکتی باشند، برقراری اتصال مستقیم ممکن است نیازمند یک سرور TURN رله (مانند Coturn) باشد.
راه اندازی سرور Coturn
اگر به جای استفاده از سرویس های مدیریت شده مانند Cloudflare Calls، قصد دارید سرور TURN اختصاصی خود را راه اندازی کنید، میتوانید نرم افزار Coturn را روی یک سرور مجازی (VPS) لینوکسی با IP عمومی مستقر نمایید.
TIP
پیشنهاد میشود از اسکریپت نصب استفاده کنید که میتواند به صورت خودکار Coturn را برای شما نصب و تنظیم کند!
۱. فایروال و پورت ها
نرم افزار Coturn برای ترافیک کنترلی و تبادل جریان های صوتی/تصویری رله شده به پورت های زیر نیاز دارد:
# پورت های ترافیک کنترلی STUN/TURN
sudo ufw allow 3478/tcp
sudo ufw allow 3478/udp
# بازه پورت های رله داده های صوتی و تصویری
sudo ufw allow 49152:65535/udpفایروال ارائه دهنده ابری
چنانچه سرور شما روی ارائه دهندگانی مانند Hetzner، آروان کلاد، AWS EC2 یا دیجیتال اوشن قرار دارد، اطمینان حاصل کنید که این پورت ها (به ویژه بازه 49152:65535/udp) در پنل فایروال/Security Groups کلاد نیز باز باشند.
۲. نصب Coturn
اوبونتو / دبیان (نصب سیستمی)
sudo apt update && sudo apt install -y coturnدر صورت نیاز، اجرای خودکار سرویس را در /etc/default/coturn فعال کنید:
sudo sed -i 's/#TURNSERVER_ENABLED=1/TURNSERVER_ENABLED=1/' /etc/default/coturnداکر (Docker)
docker run -d --name coturn \
--network=host \
--restart=always \
-v /etc/coturn/turnserver.conf:/etc/coturn/turnserver.conf:ro \
coturn/coturn۳. پیکربندی فایل turnserver.conf
ابتدا از فایل پیشفرض نسخه پشتیبان تهیه کرده و فایل تنظیمات جدید را بسازید:
sudo mv /etc/turnserver.conf /etc/turnserver.conf.bak
sudo nano /etc/turnserver.confمحتوای زیر را درون فایل قرار دهید:
# پورت های شنود
listening-port=3478
alt-listening-port=3479
# بازه پورت های رله مدیا
min-port=49152
max-port=65535
# فعال سازی مکانیسم احراز هویت بلندمدت برای WebRTC
fingerprint
lt-cred-mech
# نام دامنه یا قلمرو (Realm) و اطلاعات کاربری ثابت
realm=your-domain.com
user=songbird:YourSecurePassword123
# تنظیم IP عمومی سرور
# اگر سرور شما مستقیماً دارای IP عمومی روی کارت شبکه است:
external-ip=YOUR_SERVER_PUBLIC_IP
# اگر سرور پشت NAT قرار دارد (مانند سرورهای ابری یا VPC)، به صورت عمومی/داخلی وارد کنید:
# external-ip=PUBLIC_IP/LOCAL_IP
# به عنوان مثال: external-ip=203.0.113.10/10.0.0.5
# امنیت و ثبت وقایع
no-cli
no-tls
no-dtls
log-file=/var/log/turnserver.log
simple-logرمزنگاری در WebRTC
جریان های رسانه ای در WebRTC به شکل پیشفرض و انتها به انتها توسط استانداردهای SRTP/DTLS رمزگذاری میشوند؛ از این رو پروتکل turn:...:3478 روی UDP کمترین تاخیر و بالاترین کارایی را ارائه میدهد. در صورت تمایل به استفاده از ارتباط TLS روی پورت 5349 (turns:)، میتوانید گواهی SSL (مانند Let's Encrypt) دریافت کرده و مسیر فایل های cert و pkey را در تنظیمات تعیین کنید.
۴. اجرای سرویس
sudo systemctl restart coturn
sudo systemctl enable coturn
sudo systemctl status coturnبررسی باز بودن پورت:
sudo ss -ulpn | grep 3478۵. تنظیم در فایل .env سانگبرد
مقادیر زیر را در فایل .env سرور سانگبرد وارد کنید:
TURN_STUN_URL="stun:your-domain.com:3478"
TURN_URL="turn:your-domain.com:3478"
TURN_USERNAME="songbird"
TURN_CREDENTIAL="YourSecurePassword123"سپس سرور سانگبرد را بازنشانی (Restart) نمایید تا تنظیمات اعمال شوند.
۶. اعتبارسنجی و تست
- پنل مدیریت سانگبرد: به پنل مدیریت ← تب سرویس ها مراجعه کرده و وضعیت اتصال و تاخیر سرور TURN را بررسی نمایید.
- تست مستقل WebRTC: از ابزار آنلاین WebRTC Trickle ICE test استفاده کنید؛ در صورت کارکرد صحیح سرور، نامزدهای اتصالی با نوع
relayنمایش داده خواهند شد.
قابلیتها
- تماس صوتی: کیفیت شفاف صدا به همراه کنترل قطع و وصل میکروفون (Mute).
- تماس تصویری: تصویر زنده با وضوح بالا به همراه پیشنمایش تصویر شناور کاربر (تصویر در تصویر) و دکمه خاموش/روشن کردن دوربین.
- کنترلهای درون تماس: تایمر مدت زمان مکالمه، دکمه بیصدا کردن، دکمه دوربین، و دکمه قطع تماس.
- اعلان تماس ورودی: هشدار تمامصفحه تماس ورودی با گزینههای پذیرش (Accept) یا رد تماس (Decline)، بههمراه اعلان سیستمی (Push) هنگامی که برنامه در پسزمینه است.