3x-ui
Xray panel with limits
VPN / ProxyFree
Xray management panel
The script is free · VPS from $2.79 per month · installs in about 7 minutes
root@vps:~# sudo bash -c "$(curl -sL https://github.com/Gozargah/Marzban-scripts/raw/master/marzban.sh)" @ install
✓ Marzban 0.8.4 installed · about 2 minutes
root@vps:~#
Marzban is a web panel for managing an Xray-based proxy server. Use it to create users, hand out subscription links and track traffic without editing Xray configs by hand.
The panel supports VMess, VLESS, Trojan and Shadowsocks, including TLS and REALITY. Each user has a traffic limit and an expiry date, and subscriptions open in V2rayNG, Sing-box, Nekoray, Clash and other clients.
On your own VPS the panel is handy if you sell VPN access or share it with a team: manage everything from the browser, the REST API or the built-in Telegram bot, and spread the load across multiple servers with Marzban Node.
For Marzban: at least 1 vCPU, 2 GB RAM and 10 GB NVMe.
Three steps in the bot, no command line. The bot shows progress; installation usually takes about 7 minutes.
The install button on this page opens @ExpressHost_bot, and the bot fills in Marzban by itself.
The script appears at the “Скрипты” (Scripts) step automatically; then pay for the server.
When installation finishes, the bot sends the login details to the chat.
gozargah/marzban:latest image) on Debian 12, 13 or Ubuntu 22.04, 24.04.server-name.expresshost.cloud; the panel runs over HTTPS on port 443 — https://domain/dashboard/, subscription links too.www.vk.com, and generates its private key and Short ID.marzban cli admin create --sudo command — run it over SSH and set a username and password.The official script installs Docker and the marzban command. Application files go to /opt/marzban, settings to /opt/marzban/.env, data to /var/lib/marzban.
| Port | Protocol | Purpose |
|---|---|---|
| 8000 | tcp | Web panel (/dashboard/), API and subscriptions |
| 1080 | tcp/udp | Shadowsocks inbound from the default Xray config |
| 443 | tcp | Typically used for VLESS REALITY or TLS (configurable) |
The bot sends the IP and root password once the server is created.
ssh root@SERVER_IPThe default database is SQLite. For MySQL or MariaDB add --database mysql or --database mariadb to the command. At the end the installer shows the logs — leave them with Ctrl+C.
sudo bash -c "$(curl -sL https://github.com/Gozargah/Marzban-scripts/raw/master/marzban.sh)" @ installThe command asks for the username and password to log in to the panel.
marzban cli admin create --sudoThe panel listens on port 8000 but does not open by IP address: it needs a domain with SSL (https://YOUR_DOMAIN:8000/dashboard/, see the next section). To test without a domain, forward the port over SSH and open http://localhost:8000/dashboard/ — access ends when you close the terminal.
ssh -L 8000:localhost:8000 root@SERVER_IPCreate the domain’s A record pointing to the server IP before issuing the certificate. The certificate files must be in /var/lib/marzban/certs — that is where Marzban reads them.
Replace YOUR_EMAIL with your email.
apt install curl socat -y
curl https://get.acme.sh | sh -s email=YOUR_EMAILReplace YOUR_DOMAIN with your domain or subdomain. During validation acme.sh listens on port 80 itself, so the port must be free.
export DOMAIN=YOUR_DOMAIN
mkdir -p /var/lib/marzban/certs
~/.acme.sh/acme.sh \
--issue --force --standalone -d "$DOMAIN" \
--fullchain-file "/var/lib/marzban/certs/$DOMAIN.cer" \
--key-file "/var/lib/marzban/certs/$DOMAIN.cer.key"Add the lines to /opt/marzban/.env. Keep the panel on port 8000 or move it to 443 with UVICORN_PORT = 443 if no inbound uses that port.
UVICORN_SSL_CERTFILE = "/var/lib/marzban/certs/YOUR_DOMAIN.cer"
UVICORN_SSL_KEYFILE = "/var/lib/marzban/certs/YOUR_DOMAIN.cer.key"
XRAY_SUBSCRIPTION_URL_PREFIX = https://YOUR_DOMAINAfter the restart the panel and subscriptions open over HTTPS on your domain.
marzban restartMarzban inbounds are the Xray config: edit it in the panel (Core Settings) or in /var/lib/marzban/xray_config.json. After a manual install it only has Shadowsocks on port 1080. REALITY needs no domain of your own.
The private key stays in the server config.
docker exec marzban-marzban-1 xray x25519Short ID and SpiderX are optional, but a Short ID is better set.
openssl rand -hex 8Replace SITE with someone else’s busy website with TLS 1.3 and HTTP/2 whose domain is not a redirect; put names from its certificate into serverNames.
{
"tag": "VLESS TCP REALITY",
"listen": "0.0.0.0",
"port": 443,
"protocol": "vless",
"settings": { "clients": [], "decryption": "none" },
"streamSettings": {
"network": "tcp",
"tcpSettings": {},
"security": "reality",
"realitySettings": {
"show": false,
"dest": "SITE:443",
"xver": 0,
"serverNames": ["SITE"],
"privateKey": "PRIVATE_KEY",
"shortIds": ["SHORT_ID"]
}
},
"sniffing": {
"enabled": true,
"destOverride": ["http", "tls", "quic"]
}
}This is where the inbound gets the address, port, SNI and fingerprint that go into users’ links. By default the address is the server IP.
Add a user with the VLESS protocol, set a traffic limit and expiry, and send them the subscription link.
The important files are /var/lib/marzban (database, Xray config, certificates) and /opt/marzban (.env and docker-compose.yml). The latest release on GitHub is v0.8.4.
The command updates Marzban to the latest version.
marzban updatemarzban backup runs a manual backup, and marzban backup-service sets up regular archives sent to Telegram.
marzban backupThat is by design: without SSL the panel is reachable only through localhost. Issue a certificate for a domain or forward the port over SSH.
The bot does not create the admin. Connect over SSH and run marzban cli admin create --sudo.
The domain’s A record must already point to the server, and port 80 must be free during validation.
Check dest and serverNames: a site with TLS 1.3 and H2, no redirect, serverNames from its certificate. The inbound port must be open in the firewall.
marzban status shows the containers, marzban logs the logs.
Commands and steps were checked against the official documentation on October 25, 2026. What the bot install does comes from its install script.
Didn’t find an answer? Message @ExpressHost_SupportBot.
The panel itself is lightweight; the bottleneck is bandwidth and CPU for encryption. 1 vCPU and 2 GB RAM is enough to start and for a few dozen active users. As you grow, add another server via Marzban Node.
Run marzban update. It pulls the new images and restarts the containers; user data is preserved.
Application files are in /opt/marzban, settings in /opt/marzban/.env, and the database and Xray config in /var/lib/marzban. For backups there is marzban backup.
Yes: add --database mysql or --database mariadb to the install command.
Marzban installs at checkout — in the bot.
Netherlands, Amsterdam
$2.89/mo
$0.10 for 24 hours · $0.72 for 7 days
Pick Marzban at the “Scripts” step when you order the server.
Germany, Frankfurt
$3.14/mo
$0.11 for 24 hours · $0.79 for 7 days
Pick Marzban at the “Scripts” step when you order the server.
Poland, Warsaw
$2.79/mo
$0.10 for 24 hours · $0.70 for 7 days
Pick Marzban at the “Scripts” step when you order the server.
Estonia, Tallinn
$3.10/mo
$0.11 for 24 hours · $0.78 for 7 days
Pick Marzban at the “Scripts” step when you order the server.