مهاجرت از Marzban
Marzban دادهها را در MySQL یا MariaDB نگه میدارد و XLADA در PostgreSQL. انتقال مستقیم دایرکتوری پایگاه داده میان دو DBMS مختلف ناممکن است: کاربران از طریق API پنل منتقل میشوند و لینکهای اشتراک قدیمی از طریق حالت سازگاری صفحهٔ اشتراک به کار خود ادامه میدهند. انتقال «با یک دستور» فقط برای دادههای کاربران ممکن است؛ پیکربندی Xray، نودها و هاستها در XLADA از نو تنظیم میشوند.
چه چیزی منتقل میشود
| دادههای Marzban | چگونه منتقل میشوند |
|---|---|
| نامهای کاربری | username در POST /api/users |
| رمزهای عبور Trojan و Shadowsocks، UUID مربوط به VLESS | فیلدهای trojanPassword، ssPassword، vlessUuid |
| محدودیت ترافیک و دورهٔ بازنشانی | trafficLimitBytes، trafficLimitStrategy |
| تاریخ انقضا | expireAt در قالب ISO 8601 |
وضعیت (active، disabled، limited، expired) | status |
| اتصال به گروهها | internal-squads یا عملیات گروهی |
| لینکهای اشتراک قدیمی | حالت MARZBAN_LEGACY_* در صفحهٔ اشتراک |
مدیران، تاریخ ترافیک، inbound/outbound و هاستها منتقل نمیشوند — آنها را در XLADA از نو با پروفایلهای پیکربندی و هاستها میسازند.
- نوع کاربر در Marzban با پروتکل تعیین میشود: برای
vlessبهvlessUuidنیاز است، برایtrojan—trojanPassword، برایshadowsocks—ssPassword. اگر پروتکل منتقل نشود، کاربر به یک کلید جدید نیاز پیدا میکند. - نام کاربری در XLADA — فقط حروف لاتین، ارقام،
_و-(در API کوتاهتر از سه نویسه نیست). هنگام تجزیهٔ لینک قدیمی، نویسههای غیرمجاز با_جایگزین میشوند و نام کوتاهتر از شش نویسه تا شش نویسه تکمیل میشود. کاربران را از همان ابتدا به این شکل بسازید، وگرنه لینک قدیمی مالک را پیدا نمیکند. - ایمپورتر آمادهای داخل پنل وجود ندارد: ابزار جداگانهٔ مهاجرت در مخزن سازمان
xray-panel/migrateقرار دارد و پنل فقط دادهها را از طریق API میپذیرد.
پشتیبانی از لینکهای legacy
صفحهٔ اشتراک میتواند لینکهای قدیمی Marzban را بپذیرد و آنها را بر اساس نام با کاربران XLADA تطبیق دهد. این حالت با متغیرهای محیطی فعال میشود:
| متغیر | کاربرد |
|---|---|
MARZBAN_LEGACY_LINK_ENABLED | ماژول سازگاری را فعال میکند |
MARZBAN_LEGACY_SECRET_KEY | secret از پایگاه دادهٔ Marzban؛ چند کلید — با کاما |
MARZBAN_LEGACY_SUBSCRIPTION_VALID_FROM | نقطهٔ برش: لینکهایی که پیش از این تاریخ ساخته شدهاند پذیرفته نمیشوند |
MARZBAN_LEGACY_DROP_REVOKED_SUBSCRIPTIONS | قطع اتصال برای اشتراکهای باطلشده |
CUSTOM_SUB_PREFIX | پیشوند لینک اشتراک، مثلاً sub |
هنگام فعال بودن این حالت، MARZBAN_LEGACY_SECRET_KEY اجباری است — بدون آن
کانتینر صفحهٔ اشتراک بالا نمیآید.
services:
remnawave-subpage:
image: ghcr.io/xray-panel/subscription-page:latest
restart: unless-stopped
environment:
- APP_PORT=3010
- REMNAWAVE_PANEL_URL=http://remnawave:3000
- REMNAWAVE_API_TOKEN=توکن_از_پنل
- MARZBAN_LEGACY_LINK_ENABLED=true
- MARZBAN_LEGACY_SECRET_KEY=secret_از_پایگاه_داده_marzban
- CUSTOM_SUB_PREFIX=sub
secret در جدول jwt پایگاه دادهٔ Marzban قرار دارد:
SELECT secret_key FROM jwt LIMIT 1;
هر دو طرح Marzban پشتیبانی میشوند: JWT با الگوریتم HS256 و فیلد
access: subscription، و همچنین توکن base64url با امضای SHA-256. اگر کاربری
با چنین نامی در XLADA نباشد، لینک قدیمی باز نمیشود.
طرح گامبهگام
- سیاههبرداری. از Marzban فهرست کاربران را استخراج کنید و
secret_keyرا از جدولjwtذخیره کنید. تعداد کاربران را بشمارید — این معیار بررسی است. - نصب XLADA. پنل و نودها را طبق دستورهای نصب پنل و نصب نود بالا بیاورید، یک توکن API در تنظیمات → API Tokens بسازید.
- انتقال کاربران. آنها را با متد
POST /api/usersبسازید و نام، تاریخ انقضا و محدودیت ترافیک را حفظ کنید:
curl -sX POST https://panel.example.com/api/users \
-H "Authorization: Bearer $XLADA_API_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"username": "john_doe", "expireAt": "2026-01-17T15:38:45.065Z", "trafficLimitBytes": 0, "trafficLimitStrategy": "NO_RESET"}'
- گروهها. کاربران منتقلشده را میان گروههای داخلی تقسیم کنید — یکییکی
یا بهصورت گروهی از طریق
/api/users/bulk/update-squads. - لینکهای قدیمی. صفحهٔ اشتراک را با
MARZBAN_LEGACY_*از نمونهٔ بالا راهاندازی کنید و کانتینر آن را دوباره راهاندازی کنید. - بررسی. چند لینک قدیمی Marzban را باز کنید: صفحه باید دادههای کاربر XLADA را نشان دهد. سپس لینکهای تازه را در بخش کاربران بررسی کنید.
ابتدا 5–10 کاربر را منتقل کنید و مطمئن شوید که هم ورود و هم لینک قدیمی کار میکنند. Marzban را خاموش نکنید تا تعداد کاربران را تطبیق دهید و مطمئن شوید کلاینتها متصل شدهاند.
گام بعدی
- مهاجرت از Remnawave — انتقال پنل روی همان پایگاه داده.
- صفحه اشتراک — نصب و متغیرهای محیطی.
- کاربران — محدودیتها، وضعیتها و اشتراکها.
- API Specification — متدهای ایجاد و عملیات گروهی.