Перейти к основному содержимому

Установка панели

Исходный код

Панель — xray-panel/backend · нода — xray-panel/node · страница подписки — xray-panel/subscription-page

Панель XLADA — главный компонент: пользователи, ноды, подписки, шаблоны, статистика и API. Она ставится на один сервер через docker compose: панель, база данных и кэш поднимаются тремя контейнерами и не требуют сборки.

Что понадобится:

  • хост с 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 менять нельзя

От APP_SECRET зависят хеши паролей, JWT и шифрование секрета TOTP. После первого запуска его менять нельзя: вход перестанет работать, а 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 обязателен

В коде панели есть middleware, который разрывает соединение, если запрос пришёл без заголовков 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. Значение показывается один раз. Токен нужен странице подписки и внешним интеграциям.

Что дальше​