نصب و راهاندازی
اجرای چند ربات روی یک سرور
راهاندازی نمونهٔ دوم 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 و…) تکرار کنید.