Xtream UI (and its forks like XUI.one) remains the most widely deployed IPTV panel, and getting a clean install on a fresh Ubuntu box is where most operators stumble. This guide walks the exact steps our NOC uses to bring up a panel on a dedicated server, from a bare OS to a working admin login.

We'll target Ubuntu 22.04 LTS on a single-CPU box — the Xeon E5-2690 v3 tier is a solid starting point for panels up to ~15k active lines.

Prerequisites

  • A dedicated server or VPS running Ubuntu 22.04 LTS (fresh install, no control panel)
  • Root SSH access
  • At least 4 GB RAM (8+ GB recommended), 2 CPU cores, 40 GB disk
  • A domain or subdomain pointed at the server IP
A note on legality: Xtream UI hosts and distributes streams that you must have the rights to. Hostfory allows IPTV panel hosting, but you are responsible for content licensing in your target markets. See our AUP.

Step 1 — Update the base system

apt update && apt upgrade -y
apt install -y wget curl unzip nano net-tools
timedatectl set-timezone UTC

Set the box clock to UTC and handle timezone offset in the panel config — EPG timing behaves more predictably this way.

Step 2 — Disable conflicting services

Xtream UI ships its own patched nginx and MariaDB. Remove the distro versions so they don't fight for ports 80/3306:

systemctl stop apache2 mysql nginx 2>/dev/null
systemctl disable apache2 mysql nginx 2>/dev/null
apt remove -y apache2 mysql-server nginx 2>/dev/null

Step 3 — Set hostname and locale

hostnamectl set-hostname panel.yourdomain.com
locale-gen en_US.UTF-8
update-locale LANG=en_US.UTF-8
reboot

Step 4 — Run the installer

Reconnect after reboot, then run your chosen Xtream UI / XUI.one installer:

cd /root
wget -O install.sh "https://your-panel-source/install"
chmod +x install.sh
./install.sh

The installer compiles nginx + PHP, sets up MariaDB, and prompts you for an admin username, password and admin port (default 25500). Write these down — they scroll past at the end with no easy recovery.

Step 5 — Open the firewall

On a Hostfory box you manage the firewall yourself:

ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw allow 25500/tcp     # admin panel — use YOUR port
ufw allow 8000:8100/tcp # streaming port range
ufw --force enable

Step 6 — First login

http://panel.yourdomain.com:25500

If you get connection refused:

systemctl status nginx_xui
netstat -tlnp | grep 25500

Step 7 — Lock it down

Change the SSH port and disable password auth:

nano /etc/ssh/sshd_config
# Port 2222
# PasswordAuthentication no
# PermitRootLogin prohibit-password
systemctl restart ssh
ufw allow 2222/tcp && ufw delete allow 22/tcp

Restrict the admin port to your own IP if you have a static address:

ufw delete allow 25500/tcp
ufw allow from YOUR.HOME.IP to any port 25500 proto tcp

Enable DDoS protection — panels get attacked constantly. On Hostfory it's on by default, but make sure your real IP isn't leaking through DNS history.

Step 8 — Bandwidth sizing sanity check

Peak egress is roughly active_lines × peak_concurrency × avg_bitrate × abr_multiplier. For a 10k-line panel at 38% concurrency, 5 Mbps, 1.25 ABR that's ~24 Gbit/s — already past a single 10G port. See our bandwidth sizing guide and pick the right port speed.

Troubleshooting

Streams buffer, panel works: bandwidth. Check iftop during peak; if the port is saturated you need a bigger uplink.

Admin panel 502: bundled PHP-FPM died. systemctl restart php-fpm_xui (name varies by fork).

MariaDB won't start after reboot: corrupt ibdata after unclean shutdown. Check journalctl -u mariadb; you may need innodb_force_recovery=1 in my.cnf to get it up and dump the data.

Where to go from here

Move transcoding to a GPU server with NVENC (see our FFmpeg NVENC guide), add a storage server for catch-up/VOD, and put a CDN edge in front. If your sizing falls between our tiers, talk to engineering.