Skip to content

راه‌اندازی کانال ریموت (Remote Channel) ​

کانال ریموت به یک کانال عمومی Songbird اجازه می‌دهد پست‌ها را از یک کانال Telegram یا یک کانال عمومی دیگر Songbird بازتاب (mirror) دهد. تنها مالکان کانال می‌توانند منبع یک کانال را پیکربندی کنند، و در هر زمان تنها یک منبع می‌تواند برای هر کانال فعال باشد.

در اولین فعال‌سازی، Songbird منبع را در جدیدترین پست مقداردهی اولیه می‌کند و تاریخچه را وارد نمی‌کند. پست‌هایی که پس از آن نقطه منتشر می‌شوند بازتاب داده می‌شوند.

انواع منبع در یک نگاه ​

منبع Songbirdمنبع Telegram
اعتبارنامه‌های موردنیازهیچ‌کدامAPI ID، hash و session مربوط به Telegram
پرچم سرورREMOTE_CHANNEL=trueREMOTE_CHANNEL=true
قالب منبعپیوند دعوت کانال عمومی@channelname، پیوند t.me، یا شناسه عددی
محدودیت مقصدمقصد باید یک کانال عمومی روی سروری با SIGN_UP=true باشدمنبع باید یک کانال Telegram باشد
پراکسی اختیاریREMOTE_CHANNEL_SONGBIRD_PROXY_URLREMOTE_CHANNEL_TELEGRAM_PROXY_URL

منبع Songbird ​

برای بازتاب از یک سرور Songbird دیگر، یک کانال عمومی ایجاد یا ویرایش کنید، Remote Channel را فعال کنید، Songbird را انتخاب کنید، و پیوند دعوت کانال عمومی را از سرور مقصد جای‌گذاری کنید (برای مثال https://other.server/invite/channelname).

نیازمندی‌ها:

  • سرور مقصد باید SIGN_UP=true (سرور عمومی) داشته باشد.
  • کانال مقصد باید عمومی باشد.
  • سرور مقصد باید همان نسخه یا نسخه‌ای جدیدتر از Songbird را اجرا کند که شامل نقاط پایانی polling کانال عمومی باشد.

به هیچ اعتبارنامه اضافه‌ای نیاز نیست. روی این سرور REMOTE_CHANNEL=true و در صورت نیاز سرورتان به پراکسی برای دسترسی به مقصد، به‌صورت اختیاری REMOTE_CHANNEL_SONGBIRD_PROXY_URL را تنظیم کنید.

منبع Telegram ​

برای بازتاب از یک کانال Telegram، اعتبارنامه‌های API مربوط به Telegram موردنیاز است.

۱. ایجاد اعتبارنامه‌های Telegram ​

یک اپلیکیشن Telegram بسازید تا یک API ID و API hash آماده داشته باشید. اگر سرورتان برای دسترسی به Telegram به پراکسی نیاز دارد، آن نشانی را هم آماده داشته باشید. طرح‌واره‌های پشتیبانی‌شده عبارت‌اند از http://، https://، socks4://، socks5:// و mtproxy://.

WARNING

توصیه می‌شود برای این کار از حساب Telegram شخصی اصلی خود استفاده نکنید.

۲. اتصال Telegram ​

پیشنهاد میشود که از پنل مدیریت برای اتصال استفاده کنید.

برای این کار، به تب Services در پنل مدیریت رفته و روی Telegram connection کلیک کنید. یک modal هدایت شده کل مسیر را طی می‌کند:

  1. API ID و API hash به همراه شماره تلفن حساب با قالب E.164 را وارد کنید.
  2. کد ورود ارسال شده به آن حساب Telegram را وارد کنید.
  3. اگر حساب احراز هویت دو مرحله‌ای دارد، رمز 2FA را وارد کنید.
  4. در صورت موفقیت، صفحه تایید نمایش داده می‌شود — روی Done کلیک کنید.

بعدا میتوانید از دکمه Test connection برای تایید اتصال یا از دکمه Disconnect برای قطع اتصال استفاده کنید.

روش جایگزین با CLI (remote:configure)
bash
cd /opt/songbird
npm run remote:configure

برای Docker:

bash
cd /opt/songbird
touch .env
docker compose run --rm -v "$PWD/.env:/app/.env" songbird npm --prefix /app/server run remote:configure

مقدار session تولیدشده را خصوصی نگه دارید. این مقدار به Songbird اجازه می‌دهد کانال‌های Telegram را که حساب Telegram واردشده به آن‌ها دسترسی دارد بخواند.

۳. اتصال یک کانال Songbird ​

در Songbird، یک کانال عمومی ایجاد یا ویرایش کنید، Remote Channel را فعال کنید، Telegram را انتخاب کنید، و منبعی مانند @channelname یا https://t.me/channelname را وارد کنید. کانال ریموت برای کانال‌های خصوصی قفل است.

تنظیمات اختیاری کانال:

تنظیماثر
Sync Channel Metadataعنوان/آواتار کانال Telegram را در کانال Songbird کپی می‌کند.
Stream Media Filesهنگامی که FILE_UPLOAD=true باشد، رسانه Telegram را در بخش آپلودهای Songbird دانلود می‌کند. از محدودیت‌های اندازه/تعداد آپلود، نگه‌داری فایل، رمزنگاری در حالت سکون، و تنظیمات ترنسکد ویدیو پیروی می‌کند. پست‌های بازتاب‌شده فقط‌متنی از MESSAGE_TEXT_RETENTION پیروی می‌کنند.

INFO

پست‌هایی که هیچ متن/کپشنی ندارند تنها زمانی بازتاب داده می‌شوند که استریم رسانه فعال باشد و دست‌کم یک فایل رسانه‌ای پشتیبانی‌شده قابل ذخیره‌سازی باشد.

مدیریت رسانه ​

رسانه Telegram و آواتارهای منبع در ذخیره سازی باکت از چیدمان یکپارچه کلیدها (uploads/messages/* و uploads/avatars/*) استفاده می‌کنند وقتی STORAGE_DRIVER برابر remote یا s3 باشد؛ بارگذاری با بایت‌های رمزگشایی شده طبق قرارداد آپلود پیام انجام شده و فایل‌های موقت محلی پاک می‌شوند. اگر بارگذاری در باکت ناموفق باشد، بدون از دست رفتن رسانه به دیسک محلی برمی‌گردد. رکوردهای فایل شامل storageDriver و storageKey به صورت صریح هستند.

کار سنگین رسانه به Media Worker موجود سپرده می‌شود (Option A): سرور polling، صف، دانلود MTProto و ساخت پیام را نگه می‌دارد، در حالی که اعمال محدودیت اندازه، بررسی ویدیو و بارگذاری در باکت روی worker با POST /mirror-media انجام می‌شود (پذیرش با 202، secret اختصاصی هر کار، callback نتیجه). worker بایت‌ها را از مسیر محافظت شده با secret یعنی GET /api/remote-channel/blob/:jobId می‌گیرد و نتیجه را با POST /api/remote-channel/webhook/mirror-done گزارش می‌دهد (اتصال فایل‌ها، انتشار SSE، حذف تکراری‌ها). ارسال بر اساس STORAGE_PROCESSING_MODE به صورت mode-aware است (auto / local / remote؛ worker های remote به WEBHOOK_URL نیاز دارند) و مسیر inline محلی با تایمر timeout به عنوان fallback عمل می‌کند. session مربوط به Telegram هرگز از سرور خارج نمی‌شود. آیتم‌های صف در همان نقاط قبلی کامل می‌شوند، رسانه best-effort باقی می‌ماند و ویدیوها همچنان وارد pipeline ترنسکد می‌شوند.

polling کم‌مصرف ​

بازتاب بلادرنگ نیاز دارد که اپ بیدار باشد: به‌صورت پیش‌فرض حلقه‌های poll و اتصال MTProto مربوط به Telegram به‌صورت پیوسته اجرا می‌شوند، پس یک سرویس رایگان هرگز sleep نمی‌شود و سهم ساعت ماهانه تمام می‌شود. حالت tick این مشکل را حل می‌کند:

  1. بخش Settings → Remote Channel پنل ادمین را باز کنید و Tick Mode را فعال کنید و ری‌استارت کنید تا حلقه‌های poll پس‌زمینه خاموش بمانند.

  2. به بخش Secrets (فقط مالک) بروید و مقدار tick secret را کپی کنید.

  3. یک cron خارجی رایگان (مثل cron-job.org) اضافه کنید که این endpoint را صدا بزند:

    bash
    curl -X POST https://your-app.onrender.com/api/internal/remote-channel/tick \
      -H "x-songbird-cron-secret: <secret-از-بخش-secrets>"

    هر tick برنامه را بیدار می‌کند، همه پیام‌های جدید از آخرین پیام بازتاب شده به بعد را بازتاب می‌دهد، صف را خالی می‌کند، سپس اتصال Telegram را قطع می‌کند تا برنامه دوباره sleep شود.

محاسبه بازه در پلن رایگان Render

بعد از ~۱۵ دقیقه بدون ترافیک sleep می‌شود — هر tick ورودی حدود ۱۵ دقیقه آن را بیدار نگه می‌دارد: هر ۱۰ دقیقه ≈ همیشه بیدار (~۷۲۰ ساعت، بدون صرفه‌جویی)؛ هر ۳۰ دقیقه ≈ ~۳۶۰ ساعت؛ هر ۶۰ دقیقه ≈ ~۱۸۰ ساعت. تأخیر بازتاب برابر بازه cron به‌علاوه cold-start (حدود ۳۰ تا ۶۰ ثانیه) است.

سلامت و عملکرد پروفایل چت ​

  • GET /api/admin/services (با کش ۱۰ ثانیه‌ای) وضعیت worker (بررسی /health)، کانال ریموت (getHealth() با پرچم‌های enabled / telegramConfigured / telegramConnected / حلقه‌ها) و وضعیت درایور ذخیره سازی را گزارش می‌دهد و کارت‌های سلامت تب Services را تغذیه می‌کند.
  • GET /api/chats/:id/remote-channel مالکیت را با یک بررسی تک ردیفی getChatMemberRole مشخص می‌کند (بدون دریافت کامل فهرست اعضا). خلاصه صف به زیر مسیر GET .../remote-channel/queue منتقل شده که فقط مالک به آن دسترسی دارد، پس غیر مالک‌ها آن query را انجام نمی‌دهند. کلاینت هر ۳۰ ثانیه (قبلاً ۱۰ ثانیه) poll می‌کند و وقتی تب مخفی است متوقف می‌شود.

تحت لایسنس MIT منتشر شده است.