پرش به مطلب اصلی

نصب پنل

کد منبع

پنل — xray-panel/backend · نود — xray-panel/node · صفحه اشتراک — xray-panel/subscription-page

پنل XLADA مؤلفه اصلی است: کاربران، نودها، اشتراک‌ها، قالب‌ها، آمار و API. این پنل روی یک سرور با docker compose نصب می‌شود: پنل، پایگاه داده و کش با سه کانتینر بالا می‌آیند و نیازی به build ندارند.

چه چیزهایی لازم است:

  • هاستی با Docker و Docker Compose — حداقل 2 هسته، 4 گیگابایت RAM و 20 گیگابایت دیسک؛ جزئیات در بخش نیازمندی‌ها؛
  • دامنه‌ای که رکورد A آن از قبل به این هاست اشاره می‌کند — در مثال‌ها panel.example.com؛
  • پروکسی معکوس با TLS: بدون آن پنل کار نمی‌کند.

Compose شبکه xpanel-network و والیوم remnawave-db-data را می‌سازد:

کانتینرایمیجچه می‌کند
xpanelghcr.io/xray-panel/backend:latestرابط کاربری و API روی 127.0.0.1:3000
xpanel-dbpostgres:18.4پایگاه داده
xpanel-redisvalkey/valkey:9-alpineکش و صف‌ها

نصب Docker​

sudo curl -fsSL https://get.docker.com | sh

گام 1 — فایل‌های لازم را دانلود کنید​

یک دایرکتوری بسازید و فایل compose و نمونه محیط را از مخزن پنل دانلود کنید:

mkdir /opt/xlada && cd /opt/xlada

curl -o docker-compose.yml https://raw.githubusercontent.com/xray-panel/backend/main/docker-compose-prod.yml
curl -o .env https://raw.githubusercontent.com/xray-panel/backend/main/.env.sample

نیازی به ویرایش docker-compose.yml نیست: پورت‌ها، والیوم‌ها، شبکه و محدودیت‌ها از قبل در آن توصیف شده‌اند. همه تنظیمات در .env قرار دارند.

گام 2 — فایل .env را تنظیم کنید​

اسرار و دامنه‌ها را با دستورهای آماده جای‌گذاری کنید:

cd /opt/xlada

# راز برنامه: هش رمزهای عبور، JWT، رمزنگاری TOTP.
sed -i "s/^APP_SECRET=.*/APP_SECRET=$(openssl rand -hex 64)/" .env

# رمز عبور PostgreSQL و همان رمز درون DATABASE_URL.
pw=$(openssl rand -hex 24) \
&& sed -i "s/^POSTGRES_PASSWORD=.*/POSTGRES_PASSWORD=$pw/" .env \
&& sed -i "s|^\(DATABASE_URL=\"postgresql://postgres:\)[^@]*\(@.*\)|\1$pw\2|" .env

# دامنه‌های پنل و اشتراک.
sed -i "s|^PANEL_DOMAIN=.*|PANEL_DOMAIN=https://panel.example.com|" .env
sed -i "s|^FRONT_END_DOMAIN=.*|FRONT_END_DOMAIN=https://panel.example.com|" .env
sed -i "s|^SUB_PUBLIC_DOMAIN=.*|SUB_PUBLIC_DOMAIN=panel.example.com/api/sub|" .env

# دسترسی به متریک‌های Prometheus.
sed -i "s/^METRICS_USER=.*/METRICS_USER=xpanel/" .env
sed -i "s/^METRICS_PASS=.*/METRICS_PASS=$(openssl rand -hex 24)/" .env

chmod 600 .env
متغیرچه چیزی وارد کنید
APP_SECRETنتیجه openssl rand -hex 64
POSTGRES_PASSWORDرمز عبور تصادفی؛ همان رمز در DATABASE_URL جای‌گذاری شده است
DATABASE_URLهاست remnawave-db — نام سرویس در compose، نیازی به تغییر آن نیست
PANEL_DOMAINhttps://panel.example.com
FRONT_END_DOMAINhttps://panel.example.com — مبدأیی که درخواست‌های CORS برای آن مجاز است
SUB_PUBLIC_DOMAINpanel.example.com/api/sub — بدون https:// و بدون اسلش در انتها
METRICS_USER, METRICS_PASSنام کاربری و رمز عبور basic auth برای http://127.0.0.1:3001/metrics
تغییر APP_SECRET مجاز نیست

هش رمزهای عبور، JWT و رمزنگاری راز TOTP به APP_SECRET وابسته‌اند. پس از نخستین راه‌اندازی نمی‌توان آن را تغییر داد: ورود از کار می‌افتد و رازهای TOTP ناخوانا می‌شوند. آن را یک‌بار تولید و ذخیره کنید.

بدون METRICS_USER و METRICS_PASS کانتینر پنل بالا نمی‌آید. بررسی کامل متغیرها — در بخش متغیرهای محیطی.

گام 3 — کانتینرها را راه‌اندازی کنید​

docker compose up -d && docker compose logs -f -t

در نخستین راه‌اندازی پنل خودش مهاجرت‌ها را اعمال و پایگاه داده را پر می‌کند. راه‌اندازی موفق چنین به نظر می‌رسد:

xpanel | XLADA Backend v1.1.7
xpanel | Nest application successfully started

با Ctrl+C از لاگ‌ها خارج شوید — کانتینرها به کار خود ادامه می‌دهند. وضعیت را بررسی کنید:

docker compose ps

هر سه کانتینر — xpanel، xpanel-db، xpanel-redis — باید در وضعیت running (healthy) باشند. اگر xpanel دوباره راه‌اندازی می‌شود، علت را در لاگ‌های آن ببینید:

docker compose logs --tail=100 xpanel

پروکسی معکوس و HTTPS​

پنل فقط به localhost گوش می‌دهد: 127.0.0.1:3000 — رابط کاربری و API، 127.0.0.1:3001 — متریک‌های Prometheus. nginx یا وب‌سرور دیگری آن را به بیرون ارائه می‌دهد و نیازی به باز کردن پورت‌های 3000 و 3001 نیست. تا این مرحله رکورد A دامنه باید از قبل به هاست اشاره کند و پورت 80 آزاد باشد: وب‌سرور روی آن به بررسی Let's Encrypt پاسخ می‌دهد.

HTTPS الزامی است

در کد پنل میان‌افزاری وجود دارد که اگر درخواست بدون هدرهای X-Forwarded-For و X-Forwarded-Proto: https برسد، اتصال را قطع می‌کند. بدون پروکسی معکوس با TLS پنل کار نمی‌کند.

پیکربندی‌های کامل با همه هدرها و WebSocket — در بخش پروکسی معکوس: شامل nginx، Caddy، Angie، Traefik و Cloudflare Tunnel. کوتاه‌ترین راه — nginx: پیکربندی آماده، گواهی Let's Encrypt و بررسی. پس از تنظیم مطمئن شوید که پروکسی پنل را ارائه می‌دهد:

curl -sI https://panel.example.com | head -3

نخستین ورود​

https://panel.example.com را باز کنید — پنل پیشنهاد ساخت مدیر را می‌دهد. نام کاربری و رمز عبور را وارد کنید.

الزامات رمز عبور: حداقل 24 کاراکتر، و حتماً حروف کوچک، حروف بزرگ و رقم. مثال: XladaProd2026SecurePass!.

بلافاصله پس از ورود یک API-توکن بسازید: Settings → API Tokens → Create token. مقدار آن فقط یک‌بار نشان داده می‌شود. توکن برای صفحه اشتراک و یکپارچگی‌های خارجی لازم است.

گام‌های بعدی​