Tooling to ship the 3x-ui panel as a cloud image or via unattended install,
with per-instance credentials generated on first boot (never admin/admin,
never a shared session secret). Everything here supports amd64 and arm64.
| Path | What it is | Use when |
|---|---|---|
cloud-init/ |
Generic cloud-init user-data (unattended install.sh) |
Any cloud, no image build |
packer/ |
Packer build → AWS AMI + qcow2/raw | Reusable / Marketplace images |
lightsail/ |
Launch script + snapshot builder | Amazon Lightsail |
firstboot/ |
First-boot unit + script that mints per-instance creds | Used by the Packer/Lightsail images |
marketplace/aws/ |
AWS Marketplace submission checklist | Publishing an EC2 AMI |
marketplace/hetzner/ |
Hetzner Cloud notes | Hetzner deployments |
test/ |
Container smoke tests | Verifying the install/firstboot paths |
install.sh runs unattended when
XUI_NONINTERACTIVE=1 or stdin is not a TTY. Each instance installs and
configures itself with random credentials. See cloud-init/README.md.firstboot generates unique credentials on first boot. See
packer/README.md.install.sh reads these env vars in non-interactive mode (all optional; unset ⇒
secure random / default):
XUI_USERNAME, XUI_PASSWORD, XUI_PANEL_PORT, XUI_WEB_BASE_PATH,
XUI_SSL_MODE (none|ip|domain, default none), XUI_DOMAIN,
XUI_ACME_EMAIL, XUI_ACME_HTTP_PORT (ACME HTTP-01 listener port, default 80),
XUI_SSL_IPV6 (optional IPv6 address to add to an ip-mode cert),
XUI_SERVER_IP (fallback IP for the displayed access URL when auto-detection fails),
XUI_DB_TYPE (sqlite|postgres), XUI_DB_DSN.
The resulting credentials are written to /etc/x-ui/install-result.env (mode 600).