Files
3x-ui-agent/deploy/cloud-init
Muse c67f0cb0cf 链接迁移: fork 脚本复活指 Gitea、上游三件套中和、面板自更新链改指本仓
- 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 安装脚本下无等价物
2026-10-20 12:36:50 +00:00
..
2026-08-24 15:07:15 +02:00

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

  1. The VM boots a stock Ubuntu/Debian cloud image.
  2. cloud-init writes and runs /opt/xui-bootstrap.sh, which exports XUI_NONINTERACTIVE=1 and pipes the project's install.sh into bash.
  3. install.sh runs end-to-end with zero prompts, picking secure random values for any credential you didn't pin.
  4. 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: none serves 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. domain mode 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