- install-master.sh/install-agent.sh: 二进制下载源由已封账号 aaaamoooo/3x-ui-diy 改指本仓 Gitea Releases (tag 沿用 v3.7.0-agent.1); README 同步撤下'暂不可用'标注 - install.sh/update.sh: 未被 fork 部署链引用, 整文件替换为中英双语短桩 (exit 1), 防旧习惯调用时静默装成/更新成上游原版 - x-ui.sh: 保留全部管理功能, 仅中和 install/update/update_dev/update_menu/ legacy_version/update_shell 的上游下载分支与 uninstall 打印的上游命令, 一律改为提示本仓 Gitea Releases 地址后退出该分支 - panel.go: 面板自更新运行时耦合处理 — panelUpdaterURL 与版本检查 API 由 MHSanaei GitHub 改指本仓 Gitea (raw update.sh + /api/v1 releases, 响应字段 tag_name/body/target_commitish 与原解析结构一致); 下载到的将是本仓 update.sh 短桩, 面板更新会安全失败而非覆盖成原版 - deploy/cloud-init: curl 上游 install.sh 改为本仓 install-master.sh (Gitea raw); 头部注明 XUI_* 非交互旋钮与 install-result.env 凭据回显在 fork 安装脚本下无等价物
3x-ui via cloud-init
A single cloud-init.yaml user-data file that installs 3x-ui
non-interactively on a fresh Ubuntu/Debian VM and generates unique random
credentials per instance. It works on any cloud-init platform.
How it works
- The VM boots a stock Ubuntu/Debian cloud image.
- cloud-init writes and runs
/opt/xui-bootstrap.sh, which exportsXUI_NONINTERACTIVE=1and pipes the project'sinstall.shintobash. install.shruns end-to-end with zero prompts, picking secure random values for any credential you didn't pin.- The generated credentials are written to
/etc/x-ui/install-result.env(mode 600), echoed to the serial console, and appended to/etc/motd.
Retrieve them after boot with either:
sudo cat /etc/x-ui/install-result.env # over SSH
…or read the provider's serial console output (handy before you have SSH).
Customising
Edit the export XUI_* lines inside the write_files block of
cloud-init.yaml. All knobs are optional; unset ⇒ random/secure default.
| Env var | Default | Meaning |
|---|---|---|
XUI_SSL_MODE |
none |
none (plain HTTP), ip (Let's Encrypt IP cert), domain |
XUI_USERNAME |
random | Admin username |
XUI_PASSWORD |
random | Admin password |
XUI_PANEL_PORT |
random high port | Panel listen port |
XUI_WEB_BASE_PATH |
random | Panel base path (obscures the URL) |
XUI_DOMAIN |
— | Required when XUI_SSL_MODE=domain |
XUI_ACME_EMAIL |
— | Let's Encrypt account email (domain mode) |
XUI_DB_TYPE / XUI_DB_DSN |
sqlite |
Set postgres + DSN to use PostgreSQL |
TLS note:
noneserves the panel over plain HTTP on a random high port — fine behind a reverse proxy or an SSH tunnel, but put TLS in front of it before exposing the panel publicly.domainmode needs a public DNS A record pointing at the box and port 80 reachable at install time.
Per-provider usage
- Hetzner Cloud — Create Server → Cloud config: paste the file. Or CLI:
hcloud server create --image ubuntu-24.04 --user-data-from-file cloud-init.yaml ... - AWS EC2 — Advanced details → User data: paste the file. Or
aws ec2 run-instances --user-data file://cloud-init.yaml ... - DigitalOcean — Create Droplet → Advanced options → Add Initialization
scripts (user data): paste the file. Or
doctl compute droplet create --user-data-file cloud-init.yaml ... - Vultr — Deploy → Additional Features → Cloud-Init User-Data: paste the file.
- Google Cloud (GCE) —
gcloud compute instances create xui \ --image-family ubuntu-2404-lts-amd64 --image-project ubuntu-os-cloud \ --metadata-from-file user-data=cloud-init.yaml - Azure —
az vm create --image Ubuntu2404 --custom-data cloud-init.yaml ... - Oracle Cloud (OCI) — Create Instance → Show advanced options → Management → Cloud-init script: paste (or base64-upload) the file.
Validate before you deploy
cloud-init schema --config-file deploy/cloud-init/cloud-init.yaml