bolt Valebyte VPS от $4/мес — NVMe, запуск за 60 секунд.

Получить VPS arrow_forward
eco Начальный Туториал

Marzban на VPS: мультипротокольная панель Xray с подписками

calendar_month Sep 13, 2026 schedule 20 мин. чтения visibility 44 просмотров
Marzban на VPS: мультипротокольная панель Xray с подписками
info

Нужен сервер для этого гайда? Мы предлагаем выделенные серверы и VPS в 50+ странах с мгновенной настройкой.

Нужен сервер для этого гайда?

Разверните VPS или выделенный сервер за минуты.

Marzban на VPS: мультипротокольная панель Xray с подписками

TL;DR

Marzban — self-hosted панель управления Xray, которая позволяет создавать пользователей, выдавать подписки и управлять несколькими прокси-протоколами через веб-интерфейс. В этом гайде вы развернёте Marzban на Ubuntu Server 24.04 LTS, закроете сервер базовыми правилами безопасности, подключите HTTPS через Caddy, создадите первого администратора и настроите резервные копии.

  • Для небольшой команды или личного использования достаточно VPS с 1–2 vCPU, 2 ГБ RAM и 20 ГБ SSD.
  • Marzban запускается в Docker и использует Xray как транспортный движок.
  • Панель будет доступна только по HTTPS на отдельном поддомене, например panel.example.com.
  • Пользователи получают одну subscription-ссылку, которую можно импортировать в совместимый клиент.
  • Ключевые данные для бэкапа: SQLite/PostgreSQL, каталог Marzban, файл окружения и конфигурация Caddy.
  • Для публичного сервера важно закрыть SSH, ограничить доступ к панели и регулярно обновлять Docker-образы.

Что мы настраиваем и зачем

Схема: Что мы настраиваем и зачем
Схема: Что мы настраиваем и зачем

Marzban — административная панель для Xray. Сам Xray отвечает за работу сетевых входящих подключений, маршрутизацию трафика, учёт пользователей и поддерживаемые протоколы. Marzban добавляет к нему удобный слой управления: веб-интерфейс, API, пользователей, лимиты трафика, сроки действия, подписки, несколько нод и статистику.

Практический сценарий выглядит так: у вас есть VPS с публичным IP-адресом и домен. Вы устанавливаете Marzban, подключаете TLS-сертификат, создаёте inbound-конфигурации Xray и добавляете пользователей. После этого пользователь получает персональную ссылку подписки. Он вставляет её в совместимое клиентское приложение, а приложение автоматически получает список подключений и обновляет его при изменениях.

Панель особенно удобна, если нужно обслуживать не одно ручное подключение, а несколько устройств или пользователей. Вместо генерации отдельных JSON-файлов и ссылок вручную вы задаёте имя пользователя, срок доступа, лимит трафика и число устройств в панели. При необходимости доступ можно остановить одной кнопкой или через API.

Что будет работать после настройки

  • Веб-панель администратора по адресу https://panel.example.com.
  • Автоматический TLS-сертификат Let’s Encrypt через Caddy.
  • Встроенная или заданная вручную Xray-конфигурация с несколькими inbound-подключениями.
  • Пользователи с UUID, лимитами трафика, датой истечения и персональными subscription-ссылками.
  • Базовая защита хоста: SSH-ключи, UFW, Fail2ban, отключённый вход root по SSH.
  • Автоматический архив конфигурации и базы данных на внешнее S3-хранилище или другой сервер.

Какие протоколы можно использовать

Marzban не ограничивает вас одним методом подключения: набор определяется конфигурацией Xray. Обычно на сервере разворачивают несколько inbound-профилей для разных клиентов и сетевых условий. На практике часто применяют VLESS с TLS-транспортами, Trojan с TLS и Shadowsocks. Конкретный выбор должен соответствовать вашему законодательству, правилам дата-центра и требованиям сети, в которой будут работать клиенты.

Технология Роль Когда нужна
Marzban Панель, API, пользователи, подписки Когда нужно централизованное управление доступами
Xray Сетевое ядро и обработка подключений Всегда: Marzban управляет его конфигурацией
Caddy HTTPS reverse proxy для веб-панели Чтобы не публиковать панель по HTTP и не обслуживать сертификаты вручную
Docker Compose Запуск и обновление контейнеров Для воспроизводимого развёртывания и изоляции сервисов

Self-hosted или управляемый сервис

В облачном управляемом сервисе не нужно поддерживать сервер, обновлять систему и настраивать бэкапы. Минусы — меньший контроль над данными, сетевой конфигурацией, доменом, доступными протоколами и журналами. Кроме того, условия работы сервиса могут меняться без вашего участия.

Self-hosted Marzban на VPS требует нескольких часов первоначальной настройки, но даёт контроль над инфраструктурой. Вы выбираете регион, IP-адрес, конфигурацию Xray, правила файрвола, способ резервного копирования и политику доступа администраторов. Для владельца VPS это обычно оптимальный баланс между гибкостью и трудозатратами.

Не используйте панель как «открытый прокси». Создавайте персональные учётные записи, включайте лимиты трафика и регулярно удаляйте неиспользуемых пользователей. Это снижает риск злоупотреблений, компрометации и блокировки IP-адреса.

Какой VPS-конфиг нужен под эту задачу

Схема: Какой VPS-конфиг нужен под эту задачу
Схема: Какой VPS-конфиг нужен под эту задачу

Marzban сам по себе почти не нагружает процессор. Основная нагрузка создаётся Xray: шифрование, число одновременных соединений, объём проходящего трафика и выбранные транспорты. Для личного использования и небольшой команды важнее стабильная сеть и хороший месячный лимит трафика, чем большое количество ядер.

Сценарий CPU RAM Диск Сеть
1–10 пользователей, личные устройства 1 vCPU 2 ГБ 20 ГБ NVMe/SSD 100 Мбит/с, от 1 ТБ трафика
10–50 пользователей 2 vCPU 4 ГБ 40 ГБ NVMe/SSD 1 Гбит/с, от 3–5 ТБ трафика
50–150 активных пользователей 4 vCPU 8 ГБ 80 ГБ NVMe/SSD 1 Гбит/с, высокий или безлимитный лимит
Несколько нод и высокая нагрузка 8+ выделенных ядер 16+ ГБ 160+ ГБ NVMe 1–10 Гбит/с, защита от DDoS

Практичный стартовый вариант — 2 vCPU, 4 ГБ RAM, 40 ГБ NVMe и порт 1 Гбит/с. Он оставляет запас для Docker, Caddy, журналов, обновлений и нескольких десятков не слишком активных пользователей. Можно взять VPS с указанными характеристиками, но при выборе любого тарифа заранее проверьте месячный лимит трафика, доступность IPv4, правила по сетевым сервисам и регион размещения.

Когда VPS достаточно

VPS подходит почти для всех стартовых сценариев: личная инфраструктура, маленькая команда, тестирование конфигураций, до нескольких десятков регулярно активных пользователей. У виртуального сервера проще изменить тариф, быстро переустановить ОС, создать снапшот и перенести сервис в другой регион.

Когда нужен dedicated

Выделенный сервер оправдан, если процессор стабильно загружен шифрованием, вы обслуживаете сотни активных клиентов, запускаете несколько нод на одной машине или критична предсказуемость производительности. Также dedicated полезен при необходимости большого диска, сетевого порта выше 1 Гбит/с или особых требований к сетевым фильтрам. Не переходите на него только из-за числа зарегистрированных пользователей: ориентируйтесь на одновременные подключения, скорость и реальные графики CPU/RAM.

На что влияет локация сервера

Локация влияет на задержку, скорость до целевых ресурсов, доступность IP-адресов и стоимость трафика. Если пользователи находятся в одном регионе, выбирайте дата-центр с минимальной задержкой до них. Для проверки до покупки можно сравнить публичные looking glass, тестовые IP или маршруты через mtr.

Не выбирайте локацию только по географии. Иногда сервер в соседней стране имеет более удачный пиринг и заметно лучшую реальную скорость. После запуска измерьте задержку с нескольких клиентских сетей, а не только из домашнего Wi-Fi.

Подготовка сервера

Схема: Подготовка сервера
Схема: Подготовка сервера

Ниже используется Ubuntu Server 24.04 LTS x86_64. На начало 2026 года это стабильная LTS-ветка с длительной поддержкой и актуальными пакетами Docker. Начинайте с чистого сервера, у которого есть публичный IPv4-адрес и DNS-запись типа A для домена панели.

До установки Marzban создайте DNS-записи. Минимально нужны panel.example.com для админ-панели и, при желании, sub.example.com для выдачи подписок. На первом этапе можно использовать один домен для обоих назначений. Запись должна указывать на IPv4 сервера, а проксирование на DNS-провайдере нужно отключить, если оно мешает выпуску TLS-сертификата или работе выбранного транспорта.

Подключение и обновление системы

Войдите на сервер под пользователем root, который выдал провайдер, и немедленно обновите базовую систему. Перезагрузка нужна только если обновилось ядро или система прямо сообщает о необходимости restart.

apt update && apt full-upgrade -y
apt autoremove --purge -y
reboot

После перезагрузки подключитесь снова. Дальше создайте отдельного пользователя-администратора. В примере используется имя deploy; замените его на своё.

adduser deploy
usermod -aG sudo deploy
install -d -m 700 -o deploy -g deploy /home/deploy/.ssh

Скопируйте публичный SSH-ключ с локального компьютера. Выполняйте команду локально, а не на VPS. После успешной проверки нового входа не закрывайте текущую root-сессию, пока не убедитесь, что ключ работает.

ssh-copy-id deploy@SERVER_IP
ssh deploy@SERVER_IP

Защита SSH

Откройте конфигурацию SSH и запретите прямой вход root, аутентификацию по паролю и пустые пароли. Сначала убедитесь, что у пользователя deploy действительно есть рабочий ключ.

sudo nano /etc/ssh/sshd_config.d/99-hardening.conf
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
X11Forwarding no
MaxAuthTries 3
AllowUsers deploy

Проверьте синтаксис и примените настройки. Если команда sshd -t ничего не вывела, конфигурация корректна.

sudo sshd -t && sudo systemctl restart ssh
sudo systemctl status ssh --no-pager

Базовые утилиты, UFW и Fail2ban

Установите инструменты диагностики, файрвол и защиту от перебора SSH-паролей. Даже при отключённой парольной аутентификации Fail2ban полезен как дополнительный уровень защиты и для будущих сервисов.

sudo apt install -y ca-certificates curl gnupg lsb-release \
  ufw fail2ban jq unzip nano htop tmux \
  dnsutils mtr-tiny chrony

Откройте только SSH, HTTP и HTTPS. Порт панели Marzban 8000 наружу открывать не нужно: Caddy будет обращаться к нему локально. Порты Xray-inbound добавляются отдельно после того, как вы определите конфигурацию.

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose

Проверьте синхронизацию времени. Некорректные часы ломают TLS, токены и диагностику соединений.

sudo systemctl enable --now chrony
timedatectl status
sudo fail2ban-client status sshd

Если вы управляете сервером через нестандартный SSH-порт, сначала добавьте правило UFW для нового порта и проверьте новое подключение. Только затем удаляйте правило для стандартного порта 22.

Установка ПО — пошагово

Схема: Установка ПО — пошагово
Схема: Установка ПО — пошагово

Marzban распространяется как Docker-образ, а официальный скрипт установки создаёт каталог, загружает Compose-конфигурацию и запускает сервис. На 2026 год предпочтительнее Docker Engine 27 или новее и Docker Compose Plugin v2. В production-среде не полагайтесь на непроверяемый тег latest: после успешного запуска зафиксируйте конкретный образ, протестированный на вашей машине.

Шаг 1. Установка Docker Engine из официального репозитория

Удалите конфликтующие старые пакеты Docker, если они присутствуют. Это предотвращает конфликт между пакетами Ubuntu и официальным Docker Engine.

sudo apt remove -y docker.io docker-compose docker-compose-v2 \
  docker-doc podman-docker containerd runc 2>/dev/null || true

Добавьте ключ и репозиторий Docker для Ubuntu 24.04. Команда использует архитектуру системы и кодовое имя текущего релиза автоматически.

sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
  sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update

Установите Docker Engine, CLI, containerd и современный Compose Plugin. После установки включите сервис, чтобы контейнеры запускались после перезагрузки VPS.

sudo apt install -y docker-ce docker-ce-cli containerd.io \
  docker-buildx-plugin docker-compose-plugin
sudo systemctl enable --now docker
sudo docker version
sudo docker compose version

Добавьте пользователя deploy в группу Docker. После этого нужно выйти из SSH-сессии и подключиться заново, чтобы применились группы. Помните: членство в группе docker фактически даёт привилегии root на сервере.

sudo usermod -aG docker deploy
exit

Шаг 2. Установка Marzban

Подключитесь заново пользователем deploy. Официальный установочный скрипт Marzban создаёт рабочий каталог /opt/marzban, загружает Docker Compose и подготавливает сервис. Перед запуском полезно просмотреть скачиваемый скрипт в браузере или через curl, особенно на production-сервере.

ssh deploy@SERVER_IP
curl -fsSL https://github.com/Gozargah/Marzban-scripts/raw/master/marzban.sh \
  -o /tmp/marzban.sh
less /tmp/marzban.sh

Если содержимое соответствует официальному репозиторию проекта, запустите установку. Скрипт запросит sudo-пароль пользователя и скачает нужные контейнеры.

bash /tmp/marzban.sh install

После установки проверьте состав контейнеров. Названия могут немного отличаться между выпусками, но должен быть запущен контейнер панели Marzban, а в логах не должно быть циклических ошибок.

cd /opt/marzban
sudo docker compose ps
sudo docker compose logs --tail=100 marzban

Шаг 3. Создание первого администратора

Marzban не должен иметь публично известные учётные данные администратора. Создайте отдельный длинный логин и пароль через CLI внутри контейнера. Не используйте для панели тот же пароль, что для Linux-пользователя, почты или регистратора домена.

cd /opt/marzban
sudo docker compose exec marzban marzban cli admin create \
  --sudo

Команда интерактивно спросит имя пользователя и пароль. Сгенерировать безопасный пароль можно локально или на сервере.

openssl rand -base64 32

Шаг 4. Проверка локального интерфейса

До подключения Caddy убедитесь, что приложение слушает локальный порт. На типовой установке Marzban использует порт 8000. Если команда не показывает слушающий порт или контейнер постоянно перезапускается, переходите к разделу troubleshooting, а не публикуйте панель в интернет.

sudo ss -ltnp | grep 8000
curl -I http://127.0.0.1:8000

Ответ может быть 200, 302, 401 или 404 в зависимости от версии интерфейса и маршрута. Главное — получить HTTP-ответ от локального процесса, а не ошибку подключения.

Конфигурация Marzban, Xray и HTTPS

Схема: Конфигурация Marzban, Xray и HTTPS
Схема: Конфигурация Marzban, Xray и HTTPS

В этом разделе панель остаётся доступной только локально на 127.0.0.1:8000, а внешний HTTPS принимает Caddy. Такая схема не требует открывать порт Marzban наружу, упрощает выпуск сертификата и позволяет централизованно задать HTTP-заголовки.

Проверка файлов Marzban

После установки проверьте содержимое каталога. Как правило, здесь находятся docker-compose.yml, .env, каталог данных и шаблон конфигурации Xray. Не публикуйте файл .env в Git, облачные заметки или мессенджеры: в нём могут быть учётные данные и адрес базы данных.

cd /opt/marzban
sudo ls -la
sudo find . -maxdepth 2 -type f | sort
sudo chmod 600 .env

Откройте файл окружения и проверьте ключевые параметры. Названия переменных могут немного отличаться в конкретном релизе Marzban, поэтому не удаляйте автоматически сгенерированные строки. Ниже приведён ориентир для встроенной SQLite-базы и локального Uvicorn-сервера.

sudo nano /opt/marzban/.env
# Панель доступна только локальному reverse proxy
UVICORN_HOST=127.0.0.1
UVICORN_PORT=8000

# Локальная SQLite-база подходит для одного сервера
SQLALCHEMY_DATABASE_URL=sqlite:////var/lib/marzban/db.sqlite3

# Путь к конфигурации Xray внутри контейнера
XRAY_JSON=/var/lib/marzban/xray_config.json

# Не храните пароли и токены в открытом репозитории
# SUDO_USERNAME и SUDO_PASSWORD задаются через CLI или переменные окружения

Если установочный Compose-файл публикует 8000:8000 на все интерфейсы, замените публикацию порта на localhost. Перед редактированием сделайте копию файла. В некоторых версиях Marzban используется режим host network; тогда ограничение делается через UVICORN_HOST=127.0.0.1.

cd /opt/marzban
sudo cp docker-compose.yml docker-compose.yml.bak
sudo nano docker-compose.yml
services:
  marzban:
    ports:
      - "127.0.0.1:8000:8000"

Не вставляйте этот фрагмент поверх всего файла: он показывает только нужную секцию. Сохраните остальные volumes, environment, restart policy и настройки образа, созданные установщиком. После изменения проверьте YAML и перезапустите стек.

cd /opt/marzban
sudo docker compose config > /dev/null
sudo docker compose up -d
sudo docker compose ps
curl -I http://127.0.0.1:8000

Установка Caddy

Caddy автоматически получает и продлевает сертификаты Let’s Encrypt, если домен указывает на сервер, а порты 80 и 443 доступны извне. Установите Caddy из официального репозитория. Перед этим убедитесь, что другой веб-сервер не занимает 80 или 443 порт.

sudo apt install -y debian-keyring debian-archive-keyring \
  apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | \
  sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | \
  sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update && sudo apt install -y caddy

Создайте Caddyfile. Замените домен, адрес электронной почты для уведомлений Let’s Encrypt и при необходимости список разрешённых IP-адресов. Ограничение по IP — полезная защита панели, если у вас статический домашний IP или VPN-выход.

sudo nano /etc/caddy/Caddyfile
{
    email [email protected]
}

panel.example.com {
    encode zstd gzip

    @admin {
        path /dashboard /api/admin /docs /openapi.json
    }

    reverse_proxy 127.0.0.1:8000

    header {
        -Server
        X-Content-Type-Options "nosniff"
        X-Frame-Options "DENY"
        Referrer-Policy "strict-origin-when-cross-origin"
    }

    log {
        output file /var/log/caddy/marzban-access.log
        format json
    }
}

Блок @admin в этом минимальном примере не применяется отдельно: он оставлен как заготовка для будущего IP-ограничения. Не добавляйте необдуманную авторизацию Caddy поверх панели, пока не проверите, что она не мешает API и subscription-маршрутам.

Проверьте конфигурацию и перезагрузите Caddy. При первом запуске он запросит сертификат; это обычно занимает несколько секунд.

sudo caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddy
sudo systemctl enable --now caddy
sudo systemctl status caddy --no-pager

Проверьте HTTPS с самого VPS и с локального компьютера. Ожидается ответ без ошибок сертификата. Если сертификат не выпускается, сначала проверьте DNS, открытые порты и логи Caddy.

curl -I https://panel.example.com
sudo journalctl -u caddy -n 100 --no-pager
sudo ufw status numbered

Настройка inbound в панели

Откройте https://panel.example.com, войдите под созданным администратором и перейдите в раздел управления host/inbound-конфигурацией. Интерфейс меняется между релизами, но логика одинакова: Marzban хранит шаблон Xray JSON, запускает Xray и подставляет пользователей в соответствующие inbound-объекты.

Для первого запуска создайте один понятный inbound, проверьте его на одном устройстве и только потом добавляйте дополнительные. Не смешивайте десяток транспортов в первой конфигурации: при ошибке будет трудно понять, где именно проблема — DNS, TLS, порт, JSON или клиент.

Пример упрощённого Xray JSON ниже показывает структуру inbound VLESS. Значения UUID пользователя Marzban обычно подставляет автоматически, поэтому список клиентов оставляют с шаблонной переменной, которую поддерживает ваша версия панели. Используйте JSON, сгенерированный интерфейсом Marzban, как первичный источник истины.

{
  "log": {
    "loglevel": "warning"
  },
  "inbounds": [
    {
      "tag": "vless-main",
      "listen": "0.0.0.0",
      "port": 443,
      "protocol": "vless",
      "settings": {
        "clients": [],
        "decryption": "none"
      },
      "streamSettings": {
        "network": "tcp",
        "security": "tls",
        "tlsSettings": {
          "certificates": [
            {
              "certificateFile": "/var/lib/marzban/certs/fullchain.pem",
              "keyFile": "/var/lib/marzban/certs/privkey.pem"
            }
          ]
        }
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "freedom",
      "tag": "direct"
    }
  ]
}

Этот пример не является универсальным production-шаблоном: TLS-файлы, шаблонные клиенты, transport и порт должны быть согласованы с вашей конкретной схемой. Если Caddy уже занимает 443/tcp, Xray не может одновременно слушать тот же IP и порт в таком виде. Используйте отдельный порт для Xray либо проектируйте совместный вход с учётом выбранного транспорта и документации Marzban/Xray.

Пользователь, подписка и проверка

В панели создайте тестового пользователя с коротким сроком действия, например на 24 часа, лимитом 1 ГБ и одним устройством. После создания скопируйте subscription URL из карточки пользователя. Типичный маршрут выглядит как https://panel.example.com/sub/ТОКЕН, но точный путь зависит от конфигурации и версии Marzban.

Откройте ссылку в браузере или проверьте её через curl. Нельзя публиковать этот URL в скриншотах и тикетах: токен даёт доступ к конфигурации пользователя.

curl -fsS "https://panel.example.com/sub/USER_SUBSCRIPTION_TOKEN" | head
sudo docker compose -f /opt/marzban/docker-compose.yml logs --tail=100 marzban
sudo docker stats --no-stream

Импортируйте subscription URL в клиент, который поддерживает используемый вами формат. Затем подключитесь и проверьте, что внешний IP-адрес меняется на IP сервера, а в панели увеличивается счётчик трафика. Для диагностики на VPS используйте логи Marzban, логи Xray и список слушающих портов.

curl -4 https://ifconfig.me/ip ; echo
sudo ss -lntup
sudo docker compose -f /opt/marzban/docker-compose.yml logs --tail=200

Бэкапы и обслуживание

Схема: Бэкапы и обслуживание
Схема: Бэкапы и обслуживание

Бэкап Marzban нужен не для восстановления Docker-образов, а для восстановления состояния: базы пользователей, лимитов, токенов, конфигурации Xray, переменных окружения и TLS-настроек reverse proxy. Если потерять только контейнер, он пересоздаётся. Если потерять базу, придётся заново создавать пользователей и выдавать новые subscription-ссылки.

Что включать в резервную копию

  • /opt/marzban — Compose-файлы, .env, данные и шаблоны Xray.
  • SQLite-файл базы, если используется SQLite; обычно он находится внутри каталога данных Marzban.
  • Дамп PostgreSQL, если вы вынесли БД в отдельный контейнер или сервер.
  • /etc/caddy/Caddyfile — конфигурация HTTPS reverse proxy.
  • /var/lib/caddy — сертификаты и состояние Caddy, если хотите быстрое восстановление.
  • Список открытых портов и инструкции по восстановлению, сохранённые отдельно от сервера.

Не храните единственную копию на том же VPS. Удаление виртуальной машины, сбой диска, взлом root-аккаунта или ошибочная команда rm уничтожат и сервис, и локальный архив. Хорошая схема — зашифрованный restic-бэкап в S3-совместимое хранилище, Backblaze B2 или на отдельный VPS по SFTP.

Установка restic и подготовка репозитория

Ниже показан пример с S3-совместимым хранилищем. Значения ключей не вставляйте в shell history без необходимости. Лучше хранить их в файле с правами 600.

sudo apt install -y restic
sudo install -d -m 700 /root/.config/restic
sudo nano /root/.config/restic/marzban.env
sudo chmod 600 /root/.config/restic/marzban.env
export RESTIC_REPOSITORY="s3:https://s3.example.net/marzban-backups"
export RESTIC_PASSWORD="CHANGE_TO_A_LONG_UNIQUE_BACKUP_PASSWORD"
export AWS_ACCESS_KEY_ID="S3_ACCESS_KEY"
export AWS_SECRET_ACCESS_KEY="S3_SECRET_KEY"

Инициализируйте пустой репозиторий один раз. Если команда завершилась успешно, restic создаст служебную структуру в указанном bucket.

sudo bash -c 'source /root/.config/restic/marzban.env && restic init'

Скрипт резервного копирования

Перед копированием SQLite желательно кратко остановить контейнер либо создать согласованную копию базы. Для небольшого сервера безопаснее сделать короткую паузу Marzban: пользователи на уже запущенных соединениях могут кратковременно потерять возможность менять подписку, но резервная копия будет целостной. Если у вас PostgreSQL, используйте pg_dump вместо копирования файлов базы.

sudo nano /usr/local/sbin/backup-marzban.sh
sudo chmod 700 /usr/local/sbin/backup-marzban.sh
#!/usr/bin/env bash
set -euo pipefail

BACKUP_DIR="/var/backups/marzban"
STAMP="$(date +%F-%H%M%S)"

mkdir -p "$BACKUP_DIR"

cd /opt/marzban
docker compose stop marzban

tar --xattrs --acls -czf "$BACKUP_DIR/marzban-$STAMP.tar.gz" \
  /opt/marzban \
  /etc/caddy/Caddyfile \
  /var/lib/caddy 2>/dev/null || true

docker compose start marzban

source /root/.config/restic/marzban.env
restic backup "$BACKUP_DIR" --tag marzban --tag "$(hostname)"
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune

find "$BACKUP_DIR" -type f -mtime +2 -delete

Проверьте скрипт вручную до автоматизации. После выполнения должен появиться snapshot в restic, а контейнер Marzban должен снова быть в состоянии Up.

sudo /usr/local/sbin/backup-marzban.sh
sudo bash -c 'source /root/.config/restic/marzban.env && restic snapshots'
sudo docker compose -f /opt/marzban/docker-compose.yml ps

Автоматический запуск через cron

Запускайте бэкап ночью ежедневно. Cron подходит для простой одиночной задачи; если серверов много, удобнее перейти на systemd timer, Ansible или централизованную систему резервного копирования.

sudo crontab -e
25 3    /usr/local/sbin/backup-marzban.sh >> /var/log/backup-marzban.log 2>&1

Хотя бы раз в квартал делайте тестовое восстановление на отдельной временной машине. Бэкап, который никогда не проверяли восстановлением, нельзя считать рабочим. Для просмотра содержимого архива используйте restic restore в тестовый каталог, не перезаписывая production-файлы.

Обновления Marzban и системы

Для одного VPS обновляйте Marzban в maintenance window: предупредите пользователей, сделайте бэкап, скачайте образ, перезапустите контейнер и проверьте логи. Это безопаснее, чем обновлять ночью вслепую по cron. Автоматическое применение security-updates для Ubuntu допустимо, но major-обновления Docker, Marzban и Xray лучше контролировать вручную.

cd /opt/marzban
sudo /usr/local/sbin/backup-marzban.sh
sudo docker compose pull
sudo docker compose up -d
sudo docker image prune -f
sudo docker compose logs --tail=100 marzban

При нескольких нодах применяйте rolling-обновление: сначала обновите одну наименее загруженную ноду, проверьте подключения и метрики, затем обновляйте остальные. Не обновляйте одновременно панель, все Xray-ноды, ОС и схему базы данных: при проблеме будет невозможно быстро определить причину.

Troubleshooting и FAQ

Почему панель не открывается по HTTPS и Caddy пишет ошибку получения сертификата?

Сначала проверьте DNS: dig +short panel.example.com A должен вернуть IP вашего VPS. Затем убедитесь, что порты 80 и 443 открыты в UFW и в сетевом файрволе провайдера. Проверьте, не запущен ли другой веб-сервер: sudo ss -ltnp | grep -E ':80|:443'. В логах journalctl -u caddy часто прямо указана причина: неправильный DNS, закрытый порт, rate limit или конфликт сервисов.

Почему Caddy возвращает 502 Bad Gateway?

Ошибка 502 означает, что Caddy работает, но не может подключиться к Marzban. Проверьте контейнер: sudo docker compose -f /opt/marzban/docker-compose.yml ps. Затем выполните curl -I http://127.0.0.1:8000 на самом VPS. Если ответа нет, изучите логи контейнера и проверьте значение UVICORN_HOST/UVICORN_PORT в .env. После правок примените docker compose up -d и перезагрузите Caddy.

Почему контейнер Marzban постоянно перезапускается?

Выполните sudo docker compose logs --tail=200 marzban. Частые причины: синтаксическая ошибка в .env, повреждённый YAML Compose, недоступный файл Xray JSON, конфликт порта или недостаток диска. Проверьте свободное место командой df -h и память через free -h. Перед изменением конфигурации восстановите резервную копию файла, например docker-compose.yml.bak, затем запускайте docker compose config для проверки.

Пользователь импортировал subscription URL, но подключения не работают. Что проверять?

Проверьте отдельно три уровня: subscription URL, inbound Xray и клиент. Сначала откройте ссылку через curl: она должна вернуть конфигурации, а не HTML-страницу ошибки. Затем убедитесь, что нужный порт inbound слушается через ss -lntup и разрешён UFW. Наконец, проверьте домен, SNI, UUID, TLS-сертификат и системное время клиента. Начните с одного простого inbound и одного тестового пользователя.

Почему трафик пользователя не учитывается или лимит не отключает доступ?

Сначала проверьте, что пользователь подключается именно через inbound, который управляется Marzban, а не через старый вручную запущенный Xray-процесс. Посмотрите логи и статистику в панели после нового подключения. Ошибка часто возникает, если JSON Xray отредактирован вручную и потерял шаблон клиентов Marzban. Не меняйте структуру пользовательских объектов без понимания шаблонов панели. После изменения конфигурации создайте нового тестового пользователя и проверьте его отдельно.

Какой VPS-конфиг минимально подойдёт?

Минимум для личного использования — 1 vCPU, 2 ГБ RAM, 20 ГБ SSD/NVMe, публичный IPv4 и порт от 100 Мбит/с. Такой сервер подходит для нескольких устройств и 1–10 не слишком активных пользователей. Для более комфортной эксплуатации лучше начать с 2 vCPU и 4 ГБ RAM: появится запас на Docker, логи, Caddy, обновления и кратковременные пики нагрузки. Важнее всего проверить лимит трафика и качество сети.

Что выбрать — VPS или dedicated для этой задачи?

Для большинства установок Marzban выбирайте VPS: он дешевле, быстрее разворачивается, легко масштабируется по тарифу и подходит до десятков активных пользователей. Dedicated нужен при стабильной высокой загрузке CPU, сотнях одновременных клиентов, нескольких нодах на одном сервере, требованиях к большому диску или порту выше 1 Гбит/с. Решение принимайте по метрикам: если CPU держится выше 70%, растёт latency и появляются потери скорости, пора рассматривать выделенный сервер или горизонтальное масштабирование.

Можно ли открыть панель на порту 8000 напрямую?

Технически можно, но для production это плохая практика. Прямой HTTP-доступ передаёт пароль администратора без защиты, а открытый порт упрощает сканирование и атаки. Оставьте Marzban на 127.0.0.1:8000, а наружу публикуйте только Caddy по HTTPS на 443. Если нужен временный доступ для диагностики, используйте SSH-туннель: ssh -L 8000:127.0.0.1:8000 deploy@SERVER_IP, затем откройте локальный адрес в браузере.

Как восстановить Marzban после переноса на новый VPS?

Установите Docker, Marzban и Caddy на новом сервере, но не создавайте новых пользователей поверх старой базы. Скопируйте архив из restic в временный каталог, остановите Marzban, восстановите /opt/marzban и Caddyfile, выставьте корректные права, затем запустите Compose. После смены IP обновите DNS и дождитесь распространения записи. Проверьте панель, subscription URL, сертификат и тестовое подключение до окончательного отключения старого VPS.

Выводы и следующие шаги

Схема: Выводы и следующие шаги
Схема: Выводы и следующие шаги

Теперь у вас есть Marzban на VPS с Docker, защищённым SSH, HTTPS-панелью, базовой сетевой фильтрацией и автоматическим резервным копированием. Панель позволяет централизованно создавать пользователей Xray, выдавать подписки и контролировать сроки действия или лимиты трафика.

  1. Добавьте один-два дополнительных inbound-профиля только после тестирования базовой конфигурации на реальном клиенте.
  2. Настройте мониторинг CPU, RAM, диска, доступности HTTPS и даты последнего успешного бэкапа.
  3. При росте нагрузки вынесите PostgreSQL и Xray-ноды на отдельные серверы, сохранив Marzban как центральную панель управления.

Регулярно проверяйте логи, тестируйте восстановление из резервной копии и обновляйте компоненты в запланированное окно обслуживания. Это важнее сложной конфигурации: стабильный, документированный и восстанавливаемый сервер надёжнее набора непроверенных настроек.

Был ли этот гайд полезен?

Ваш отзыв помогает нам улучшать гайды.

Поделиться записью:

Отправьте гайд тому, кому он может пригодиться.

Telegram VKVK WhatsApp Facebook LinkedIn XX

marzban на vps: мультипротокольная панель xray с подписками
support_agent
Valebyte Support
Usually replies within minutes
Hi there!
Send us a message and we'll reply as soon as possible.