Files
xui_installer/README.md
T

6.9 KiB
Raw Blame History

XUI.ONE 1.5.13 Installer

A bootstrap installer for the pre-patched XUI.ONE 1.5.13 panel, modeled on the midesi.net installxui.sh wrapper. The release package is mirrored to our own Gitea generic-package registry (fast, self-hosted), with the upstream XUIPatch GitHub release as an automatic fallback.

What it does

install_xui.sh is a thin, safe wrapper around the official XUI installer:

  1. Pre-flight checks — root, Ubuntu 20.04/22.04/24.04, x86_64, RAM/disk, re-install guard
  2. Installs missing deps (wget, unzip, tar)
  3. Downloads XUI_1.5.13-r5.zip (~659 MB, r5 runtime repack) from the Gitea mirror (falls back to GitHub)
  4. Verifies the SHA-256 checksum (on by default)
  5. Extracts install, database.sql, xui.tar.gz
  6. Runs the bundled ./install non-interactively — auto-generates a valid license key and answers the sysctl prompt
  7. Prints the panel setup URL; MySQL credentials are saved to <workdir>/credentials.txt

About the "license"

XUI.ONE 1.5.13 is the post-shutdown, license-free build. The developer (GTAXUI) wound down the product and took the license servers offline, then released a clean 1.5.13 with all license verification patched out (unlocked extensions for PHP 7.2 / 7.4). It never phones home.

The bundled installer still asks for a key, but it only checks the format — isValidLicense() is literally len == 16 and all hex. So any valid 16-char hex string works (e.g. a9f3b7e2c6d8140f). This wrapper auto-generates a random one with openssl rand -hex 8, exactly like the community auto-installers. Set XUI_LICENSE to pin a specific key.

Usage

On a clean Ubuntu server, as root:

# One-liner — pulls the latest installer from the Gitea repo, then runs it:
bash <(wget -qO- https://git.ops01.hprx.zip/seed/xui_installer/raw/branch/main/install_xui.sh)

# Or locally:
chmod +x install_xui.sh
./install_xui.sh

The installer lives in the Gitea repo seed/xui_installer. The raw/branch/main URL above always serves the latest committed version — just git push an update and the one-liner picks it up, no version bump needed.

Mirror (where the package lives)

The 661 MB release is hosted on our Gitea, publicly downloadable with no auth:

https://git.ops01.hprx.zip/api/packages/seed/generic/xui/1.5.13-r5/XUI_1.5.13-r5.zip
sha256: 145a9651493712abfcb103f256e7641daeb04749fbbe34c06a948cef80b77b59 (r3: PHP 7.4.33, ionCube 15.5, GeoIP 2026-08-13 refresh, patched LB/proxy payloads; stock 1.5.13 + r2 kept for rollback)

Re-uploading later (e.g. a new version) — from any box with the Gitea token:

curl -X PUT \
  -H "Authorization: token <TOKEN>" \
  -H "Content-Type: application/octet-stream" \
  -T XUI_1.5.13.zip \
  "https://git.ops01.hprx.zip/api/packages/seed/generic/xui/<version>/XUI_1.5.13.zip"

Content-Type: application/octet-stream is required — Gitea's generic registry returns HTTP 500 ("isn't multipart/form-data") without it.

Configuration (env vars)

Variable Default Purpose
XUI_URL Gitea mirror URL (above) Override the primary download source
XUI_FALLBACK_URL GitHub XUIPatch release Override the fallback source
XUI_SHA256 baked-in known-good hash Override, or set to "" to skip checksum verify
XUI_WORKDIR /opt/xui_install Where the package is downloaded/extracted/run
XUI_LICENSE auto-generated 16-hex Pin a specific 16-char hex license key
XUI_SYSCTL Y Answer to the installer's sysctl-overwrite prompt
XUI_INTERACTIVE 0 Set to 1 to answer the installer's prompts yourself

Example pinning a license and running fully unattended:

XUI_LICENSE="a9f3b7e2c6d8140f" ./install_xui.sh

Example pointing at a different mirror:

XUI_URL="https://cdn.example.com/xui/XUI_1.5.13.zip" \
XUI_SHA256="a92e5f21a338c56190d7580f449492c970b5d4219474548ca5ec2f06bc57b2e7" \
./install_xui.sh

Local archive (release/)

The package itself is not kept in this repo (661 MB, git-ignored) — the durable copy is the Gitea mirror above. Only the checksum is tracked:

  • release/XUI_1.5.13.zip.sha256 — feed to XUI_SHA256 for integrity checks.

Package contents (the three files midesi's tarball also ships):

install        # the XUI installer (prompts for license + sysctl)
database.sql   # initial schema
xui.tar.gz     # the panel itself

To pull a local copy anytime:

curl -L -o release/XUI_1.5.13.zip \
  "https://git.ops01.hprx.zip/api/packages/seed/generic/xui/1.5.13-r5/XUI_1.5.13-r5.zip"

Credentials

Gitea creds live in .gitea/ (git-ignored): token and url. The token is scoped public-only + write:repository + write:package. Rotate it in Gitea (Settings → Applications) if it's ever exposed.

Tested

End-to-end on a clean Ubuntu 20.04.6 box (2026-06): one-liner → unattended install → xuione active, MariaDB 10.6.22, nginx on :80, xui DB imported, panel setup page (/<code>/setup) returns HTTP 200.

Installer patches (applied automatically by patch_installer)

The 2025-era bundled install references two now-broken sources; the wrapper rewrites them on the fly:

Problem Fix
MariaDB 10.6 repo ams2.mirrors.digitalocean.com no longer resolves (DO retired their distro mirrors) Rewritten to mirror.rackspace.com/mariadb/repo/10.6/ubuntu
add-apt-repository ppa:maxmind/ppa hangs forever where launchpad.net is unreachable Dropped — libmaxminddb0/-dev, mmdb-bin come from Ubuntu's own repos

Harmless warnings you can ignore

  • E: Unable to locate package libssh2-1t64 — that's the Ubuntu 24.04 (noble) package name; on 20.04/22.04 the needed libssh2-1 is pulled in by php-ssh2 automatically. ssh2 ends up loaded in XUI's PHP regardless.
  • debconf: ... dumb terminal / locale warnings — expected under non-interactive apt.

Security note

XUI's bundled my.cnf sets bind-address = *, so MariaDB listens on 0.0.0.0:3306. The xui DB user has a strong random password and root uses socket auth, but consider firewalling 3306 to localhost if the box is on a public IP.

System requirements

  • Ubuntu 20.04 / 22.04 / 24.04 LTS, clean install, x86_64
  • 6+ CPU cores, 1632 GB RAM, 480 GB+ SSD/NVMe, 1 Gbps recommended