نصب و راه‌اندازی

اجرای چند ربات روی یک سرور

راه‌اندازی نمونهٔ دوم WZML-X با config2.py، سرویس‌های app2 و tunnel2 و پوشه‌های دادهٔ جداگانه.

می‌توانید چند ربات WZML-X را روی یک سرور و با یک فایل docker-compose.yml اجرا کنید. هر ربات کانتینر، تونل، فایل پیکربندی و پوشه‌های دادهٔ مخصوص خودش را دارد. docker-compose.yml یک نمونهٔ دوم آماده و کامنت‌شده (app2 و tunnel2) دارد که از آن شروع می‌کنیم.

پیش از شروع، روش استقرار روی VPS را برای ربات اول کامل کنید.

۱. ساختن config2.py

برای ربات دوم یک فایل پیکربندی جدا بسازید:

cp config_sample.py config2.py
nano config2.py

دست‌کم BOT_TOKEN باید متفاوت باشد (یک ربات جدید از @BotFather بسازید). بقیهٔ مقادیر مثل OWNER_ID را هم به دلخواه تنظیم کنید.

۲. فعال کردن app2 و tunnel2

در docker-compose.yml، بلوکی را که با کامنت Second instance example شروع می‌شود از حالت کامنت خارج کنید:

  app2:
    build: .
    command: bash start.sh
    restart: unless-stopped
    volumes:
      - ./config2.py:/usr/src/app/config.py:ro
      - ./app2.accounts:/usr/src/app/accounts
      - ./app2.downloads:/usr/src/app/downloads
      - tunnel_data:/data:ro
    environment:
      - TUNNEL_URL_FILE=/data/tunnel2_url.txt
    expose:
      - "8080"

  tunnel2:
    build:
      context: .
      dockerfile: tunnel.Dockerfile
    restart: unless-stopped
    network_mode: "service:app2"
    environment:
      - TUNNEL_URL_FILE=/data/tunnel2_url.txt
    volumes:
      - tunnel_data:/data

این بلوک چه کار می‌کند؟

  • پیکربندی جدا: config2.py روی سرور، داخل کانتینر app2 با همان نام config.py دیده می‌شود. پس کد ربات تفاوتی حس نمی‌کند.
  • پوشه‌های دادهٔ جدا: سرویس‌اکانت‌ها در ./app2.accounts و دانلودها در ./app2.downloads نگه داشته می‌شوند تا فایل‌های دو ربات با هم تداخل نداشته باشند.
  • تونل جدا: tunnel2 در شبکهٔ app2 اجرا می‌شود و آدرس خودش را می‌سازد.
  • فایل آدرس جدا: هر دو سرویس والیوم مشترک tunnel_data را دارند، اما متغیر محیطی TUNNEL_URL_FILE=/data/tunnel2_url.txt باعث می‌شود tunnel2 آدرسش را در فایل دیگری بنویسد و app2 هم همان فایل را بخواند. ربات اول به‌طور پیش‌فرض از /data/tunnel_url.txt استفاده می‌کند.

اگر می‌خواهید پوشه‌ها نام دیگری داشته باشند، فقط سمت چپ مسیرها (روی سرور) را عوض کنید.

۳. اجرا

docker compose up -d --build

آدرس تونل هر ربات را جداگانه ببینید:

docker compose logs tunnel
docker compose logs tunnel2

و لاگ ربات دوم:

docker compose logs -f app2

پورت‌های مدیریتی (qBittorrent و SABnzbd)

README.md می‌گوید پورت‌های مدیریتی (qBittorrent و SABnzbd) هر ربات روی پورت‌های متفاوتی از سرور (مثل 127.0.0.1:8091) قرار می‌گیرند. در docker-compose.yml همین نسخه، برای app و app2 هیچ پورتی روی سرور منتشر نشده است و فقط expose وجود دارد. چون هر کانتینر شبکهٔ خودش را دارد، پورت‌های داخلی (8080، 8090، 8070، 8091 و 6800) بین دو ربات تداخلی ندارند.

برای دسترسی به پنل qBittorrent یا SABnzbd هر ربات، از آدرس تونل همان ربات و مسیرهای /qbit/ و /nzb/ استفاده کنید. آدرس کامل همراه با رمز، هنگام شروع در لاگ هر ربات چاپ می‌شود:

docker compose logs app2 | grep "Web UI"

اگر خودتان برای کانتینرها پورت منتشر می‌کنید، برای هر ربات پورت متفاوتی روی سرور انتخاب کنید.

پایگاه داده

دو ربات می‌توانند از یک DATABASE_URL استفاده کنند. ربات همهٔ داده‌هایش را در پایگاه دادهٔ wzmlx و جدا بر اساس شناسهٔ خود ربات (بخش اول BOT_TOKEN) ذخیره می‌کند، پس تنظیمات دو ربات با هم قاطی نمی‌شود.

اگر هر دو ربات در یک گروه هستند

اگر دو ربات را در یک گروه اضافه کنید، هر دو به یک دستور جواب می‌دهند. برای جلوگیری از این، در یکی از آن‌ها CMD_SUFFIX را تنظیم کنید. این متن به انتهای همهٔ دستورها اضافه می‌شود؛ مثلاً با مقدار زیر، دستور /mirror آن ربات به /mirror2 تبدیل می‌شود:

CMD_SUFFIX = "2"

دو دستور /restartall و /statusall عمداً پسوند نمی‌گیرند، پس همهٔ ربات‌ها به آن‌ها پاسخ می‌دهند. تغییر CMD_SUFFIX از /bsetting به ری‌استارت نیاز دارد.

گزینه‌های اختیاری برای ربات دوم

  • VPN: بلوک کامنت‌شده‌ای که با Optional: VPN for app2 via gluetun شروع می‌شود، در docker-compose.yml برای همین منظور است. توجه کنید که نام سرویس و container_name آن هم gluetun است؛ اگر هر دو ربات را پشت VPN می‌خواهید، برای یکی نام دیگری انتخاب کنید. روش کار را در VPN با Gluetun ببینید.
  • تونل نام‌دار: در انتهای docker-compose.yml یک نمونهٔ tunnel2 با ایمیج رسمی cloudflare/cloudflared و network_mode: "service:app2" هم وجود دارد. توضیح تونل نام‌دار در استقرار روی VPS آمده است.

برای ربات سوم و بعدی، همین الگو را با نام‌های جدید (app3، tunnel3، config3.py، tunnel3_url.txt و…) تکرار کنید.

مثلاً LEECH_SPLIT_SIZE، /mirror، -up یا «تامبنیل»