راهاندازی کانال ریموت (Remote Channel)
کانال ریموت به یک کانال عمومی Songbird اجازه میدهد پستها را از یک کانال Telegram یا یک کانال عمومی دیگر Songbird بازتاب (mirror) دهد. تنها مالکان کانال میتوانند منبع یک کانال را پیکربندی کنند، و در هر زمان تنها یک منبع میتواند برای هر کانال فعال باشد.
در اولین فعالسازی، Songbird منبع را در جدیدترین پست مقداردهی اولیه میکند و تاریخچه را وارد نمیکند. پستهایی که پس از آن نقطه منتشر میشوند بازتاب داده میشوند.
انواع منبع در یک نگاه
| منبع Songbird | منبع Telegram | |
|---|---|---|
| اعتبارنامههای موردنیاز | هیچکدام | API ID، hash و session مربوط به Telegram |
| پرچم سرور | REMOTE_CHANNEL=true | REMOTE_CHANNEL=true |
| قالب منبع | پیوند دعوت کانال عمومی | @channelname، پیوند t.me، یا شناسه عددی |
| محدودیت مقصد | مقصد باید یک کانال عمومی روی سروری با SIGN_UP=true باشد | منبع باید یک کانال Telegram باشد |
| پراکسی اختیاری | REMOTE_CHANNEL_SONGBIRD_PROXY_URL | REMOTE_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 هدایت شده کل مسیر را طی میکند:
- API ID و API hash به همراه شماره تلفن حساب با قالب E.164 را وارد کنید.
- کد ورود ارسال شده به آن حساب Telegram را وارد کنید.
- اگر حساب احراز هویت دو مرحلهای دارد، رمز 2FA را وارد کنید.
- در صورت موفقیت، صفحه تایید نمایش داده میشود — روی Done کلیک کنید.
بعدا میتوانید از دکمه Test connection برای تایید اتصال یا از دکمه Disconnect برای قطع اتصال استفاده کنید.
روش جایگزین با CLI (remote:configure)
cd /opt/songbird
npm run remote:configureبرای Docker:
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 این مشکل را حل میکند:
بخش Settings → Remote Channel پنل ادمین را باز کنید و Tick Mode را فعال کنید و ریاستارت کنید تا حلقههای poll پسزمینه خاموش بمانند.
به بخش Secrets (فقط مالک) بروید و مقدار tick secret را کپی کنید.
یک cron خارجی رایگان (مثل cron-job.org) اضافه کنید که این endpoint را صدا بزند:
bashcurl -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 میکند و وقتی تب مخفی است متوقف میشود.