Установка панели
Панель — 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:
| Контейнер | Образ | Что делает |
|---|---|---|
xpanel | ghcr.io/xray-panel/backend:latest | интерфейс и API на 127.0.0.1:3000 |
xpanel-db | postgres:18.4 | база данных |
xpanel-redis | valkey/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_DOMAIN | https://panel.example.com |
FRONT_END_DOMAIN | https://panel.example.com — источник, которому разрешены CORS-запросы |
SUB_PUBLIC_DOMAIN | panel.example.com/api/sub — без https:// и без слэша на конце |
METRICS_USER, METRICS_PASS | логин и пароль basic auth для http://127.0.0.1:3001/metrics |
От 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.
В коде панели есть 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. Значение показывается один раз. Токен нужен странице подписки и внешним интеграциям.
Что дальше
- Установка ноды — подключить прокси-сервер к панели.
- Обратный прокси — готовый конфиг для вашего веб-сервера.
- Страница подписки — оформленная выдача подписок.
- Безопасность панели — что уже защищено и о чём помнить.