Files
l-ui/RENAMING.md
T
Muse 2b914d374f docs: RENAMING.md + l-ui migration runbook
RENAMING.md: exact mapping, LUI_ inventory, sing-box orphan-scan
re-verification, Tianyi badge mechanism, intentionally-kept items
(module path, upstream mentions, frozen Windows, ps1, log
filenames, Postgres creds, generated schemas, stale test
binaries), and pending items (repo spelling BLOCKER, version
bump, ps1 URL after repo rename, schema regeneration).
docs/migration-l-ui.md: operator-only mv table, DB file rename,
unit-env translation, backup-then-delete, old-core stop rule,
rollback before acceptance only, per-machine acceptance
checklist, pilot order (probe node, master, rest one by one,
TYYUN untouched). docs/release.md: placeholder-repo warning.
2026-10-24 12:03:26 +00:00

11 KiB

Renaming: 3x-ui / x-ui → L-UI / l-ui / lui-agent

Base: 8158ced (panel V2.6.0 / agent A2.5.0). This batch is a pure rename: no version bump, no feature change, no production change, no Gitea change, no release. Versions stay V2.6.0 / A2.5.0; the version bump is left to the release step (see Pending below).

Mapping (exact — do not invent other aliases)

old new where it shows up
display brand 3x-ui / x-ui L-UI panel UI, i18n, README, docs
panel binary / process l-ui release asset, ps, /usr/bin/l-ui (Docker), l-ui setting …
agent binary / process lui-agent release asset, ps, lui-agent agent …
install dir /usr/local/l-ui panel + agent binaries
config / state dir /etc/l-ui agent.json, node_token_key.json, env files
panel DB /etc/l-ui/l-ui.db driven by internal/config/name (l-ui) via GetName() + GetDBFolderPath() — no separate DB-name constant
probe DB /etc/l-ui/probe.db name unchanged, directory moved (probe/store.go joins GetDBFolderPath())
cert dir /etc/l-ui/cert panel + subscription share it
binary dir /usr/local/l-ui/bin DefaultBinFolder; sing-box live config config-singbox.json lives here
log dir /var/log/l-ui panel log, agent log, sing-box log
panel service l-ui.service systemd units l-ui.service.{debian,arch,rhel}, OpenRC l-ui.rc
agent service lui-agent.service systemd/lui-agent.service, OpenRC openrc/lui-agent
management CLI l-ui.sh was x-ui.sh; Docker copies it to /usr/bin/l-ui
panel release assets l-ui-linux-amd64, l-ui-linux-arm64 (+ .sha256) scripts/release-build.sh, selfupdate.AssetName
agent release assets lui-agent-linux-amd64, lui-agent-linux-arm64 (+ .sha256) scripts/release-build.sh, selfupdate.AgentAssetName
agent version marker agent-version.txt name unchanged
env prefix LUI_ every XUI_ variable, code + scripts + docs + tests (inventory below)
source dir (Linux agent) cmd/lui-agent was cmd/xui-agent; release-build.sh builds ./cmd/lui-agent
Gitea repo (PLACEHOLDER) rogue/l-ui see Pending — not yet real

Environment variables renamed

Code reads only the new LUI_ prefix. There is no dual-read fallback in code: an old unit file that still exports XUI_* will silently lose those settings, which is why the migration doc (docs/migration-l-ui.md) has an explicit unit-env translation table. Old units must be replaced, not edited in place.

Full inventory (from a whole-tree scan; LUI_DB_* below is a docs glob, not a variable):

LUI_ACCESS_URL, LUI_ACME_EMAIL, LUI_ACME_HTTP_PORT, LUI_API_TOKEN, LUI_B1_OLD_BACKUP, LUI_B2_OLD_DB, LUI_BIN_FOLDER, LUI_DB_CACHE_MB, LUI_DB_DSN, LUI_DB_FOLDER, LUI_DB_JOURNAL_MODE, LUI_DB_MAX_IDLE_CONNS, LUI_DB_MAX_OPEN_CONNS, LUI_DB_MMAP_MB, LUI_DB_SYNCHRONOUS, LUI_DB_TYPE, LUI_DEBUG, LUI_DOMAIN, LUI_ENABLE_FAIL2BAN, LUI_GOGC, LUI_HOME (install-agent.sh only), LUI_INIT_SYSTEM (install-agent.sh only), LUI_INIT_WEB_BASE_PATH, LUI_IN_DOCKER, LUI_LOG_FOLDER, LUI_LOG_LEVEL, LUI_MAIN_FOLDER, LUI_MEMORY_LIMIT, LUI_MEMORY_RELEASE_INTERVAL, LUI_NODE_TOKEN_KEY, LUI_NODE_TOKEN_KEY_FILE, LUI_NODE_TOKEN_KEY_TEST, LUI_NONINTERACTIVE, LUI_ORPHAN_DUMMY, LUI_PANEL_PORT, LUI_PASSWORD, LUI_PORT, LUI_PPROF, LUI_RELEASE_BASE_URL, LUI_RELEASE_LATEST_URL, LUI_ROOT (install-agent.sh only), LUI_SCALE_DB_PATH, LUI_SCALE_SIZES, LUI_SCALE_TEST, LUI_SELFUPDATE_SYSTEMD, LUI_SERVER_IP, LUI_SERVICE, LUI_SERVICE_NAME, LUI_SINGBOX_BIN, LUI_SKIP_HSTS, LUI_SMOKE_VERSION, LUI_SOURCEMAP, LUI_SSL_IPV6, LUI_SSL_MODE, LUI_TEST_PG_DSN, LUI_TUNNEL_HEALTH_COOLDOWN, LUI_TUNNEL_HEALTH_FAILURES, LUI_TUNNEL_HEALTH_INTERVAL, LUI_TUNNEL_HEALTH_MONITOR, LUI_TUNNEL_HEALTH_PROXY, LUI_TUNNEL_HEALTH_TIMEOUT, LUI_TUNNEL_HEALTH_URL, LUI_UPDATE_RUN_ID, LUI_UPDATE_STATUS_FILE, LUI_UPDATE_TAG, LUI_URL (install scripts only), LUI_USERNAME, LUI_WEB_BASE_PATH.

sing-box orphan-core check (special re-verification)

The orphan scan (internal/agent/singbox.go, singboxCmdlineMatchesConfig) matches a core process by the exact argv triple run -c <live config path>. Both sides use the same source: the live path is filepath.Join(config.GetBinFolderPath(), "config-singbox.json"), and the agent sets LUI_BIN_FOLDER to DefaultBinFolder (/usr/local/l-ui/bin) when unset. So the rename propagates to both the writer and the matcher automatically; there is no hardcoded old path in singbox.go. After migration the only cores the new agent will reap are cores started with /usr/local/l-ui/bin/config-singbox.json — a core still running the old /usr/local/x-ui/bin/config-singbox.json is not matched and must be killed by the migration step (see migration doc), or it will hold the inbound ports and the new core will fail to bind. This is the one place where "rename both sides" is not enough: the old core has to be stopped, not re-adopted.

Tianyi update badge (same batch, panel side only)

  • Backend: NodeView.agentOs (from AgentNode.ProbeOS), overlaid in annotateAgentTelemetry ahead of the telemetry early-exit, like ProbeOnly.
  • Frontend: both badge sites in NodeList.tsx (list column + detail) now gate on !isWindowsAgentOS(agentOs), where the helper (in panel-version.ts) is a case-insensitive windows prefix test. Empty OS fails open (badge as before).
  • Backend: requestAgentUpdate refuses Windows rows up front ("not available on Windows … re-running install-agent.ps1") instead of recording an intent that would only age out. The one-click action button itself is unchanged; clicking it on a Windows row now errors clearly.
  • Why ProbeOS is reliable: the frozen A2.2.1 Windows agent reports probeFacts.os = winOSName() — registry ProductName ("Windows 10", "Windows 11", …) with DisplayVersion appended, falling back to bare "Windows" — on register and on heartbeat, and the panel persists it to probe_os (pinned by TestAgentLegacyWindows221Contract). No fake version, no per-node freeze switch, no Windows agent change, no new win asset.
  • Tianyi's machine itself is untouched; its agent stays A2.2.1.

Intentionally kept (not omissions)

  • Go module path github.com/mhsanaei/3x-ui/v3 — the upstream import path. Renaming it would break every import and the -ldflags -X injection paths; it is not user-visible.
  • Upstream mentions — sentences that name the upstream original ("upstream 3x-ui", "stock 3x-ui", "based on upstream 3x-ui", ghcr.io/mhsanaei/3x-ui, raw.githubusercontent.com/mhsanaei/3x-ui) stay, because that is the upstream project's actual name.
  • Windows agent, frozen — cmd/xui-agent-windows/ untouched: service name x-ui-agent, C:\x-ui\agent.json, display name "3x-ui Agent", x-ui-agent-windows.exe. The shipped A2.2.1 binary cannot change without a new win release, which this batch explicitly does not ship. Renaming its source would only make the source lie about the shipped binary.
  • install-agent.ps1 untouched — see Pending.
  • Log filenames 3xui.log, 3xipl.log, 3xipl-banned.log and the fail2ban jail name 3x-ipl — only their directory moves (/var/log/l-ui/). Renaming the files would break external fail2ban configs beyond the directory move the migration already requires.
  • Docker Postgres user/DB xui — renaming them would orphan existing pgdata volumes (a fresh empty DB would appear and the panel would start empty). Service/container names were renamed (l-ui, l-ui_app, l-ui_postgres); credentials kept.
  • Windows-only DB copy in internal/config/config.go init() — its source is now explicitly /etc/x-ui/x-ui.db (the only pre-rename path left in Go code, as a copy source only). Normal operation never reads it; operator migration moves the DB by mv.
  • install-agent.sh legacy-process kill — it now kills both /usr/local/l-ui/l-ui agent and /usr/local/x-ui/x-ui agent. The old form is a one-time migration cleanup, not a runtime dual-path fallback; it can be deleted once old forms are gone.
  • frontend/src/generated/schemas.ts — generated by tools/openapigen, marked DO NOT EDIT. Its three "3x-ui panel" descriptions come from Go model comments and will refresh on the next regeneration; hand-editing a generated file would be overwritten anyway.
  • Tracked test binaries x-ui-agent-test-amd64, x-ui-master-new-amd64, x-ui-with-ui-amd64 — stale ELF artifacts committed earlier, not referenced by any script or by release-build.sh, not release assets. Left untouched (not rebuilt, not renamed); deleting committed binaries is a separate cleanup decision, not part of this rename.
  • docs/release.md version-table examples (V2.4.0 / A2.3.0) — pre-existing stale examples, not version constants; left as-is so this diff stays a rename. The agent-change glob there now reads cmd/lui-agent*, which correctly excludes the frozen Windows dir (Windows-only changes must not move the agent line).

Pending / must be decided before any release

  1. Gitea repo spelling (BLOCKER). rogue/l-ui is a placeholder. The Gitea repo has NOT been renamed in this batch and must not be assumed renamed. Before any release: user confirms the exact spelling, then update internal/selfupdate/selfupdate.go (annotated in code), internal/web/service/panel/panel.go, scripts/release-build.sh, install-agent.sh, install-master.sh, update.sh, install.sh, docs/release.md and every rogue/l-ui URL in the tree to the confirmed spelling. Until then, the renamed update check points at a repo that does not exist yet — this branch must not be released as-is.
  2. Version bump. Panel stays V2.6.0, agent stays A2.5.0 in this diff. The release step must bump the panel line (and the agent line only if agent code changed in the release commit) and install-agent.sh's RELEASE_BASE.
  3. install-agent.ps1 (Windows, frozen, TYYUN only). Untouched on purpose: it is pinned to the V2.4.0 release base and downloads x-ui-agent-windows-amd64.exe into C:\x-ui. After the Gitea repo is renamed, that download URL (rogue/3x-ui-agent/releases/download/V2.4.0/…) will 404 unless one of these is chosen: (a) leave ps1 alone and accept that a future Windows reinstall needs a manual exe (the frozen line needs no reinstall by design); (b) update only its repo segment to the confirmed spelling, keeping the V2.4.0 pin and the old asset name (the V2.4.0 release's assets keep their old names only if the repo is renamed without re-uploading them — verify before choosing); (c) unfreeze Windows and ship a new win asset (out of scope for this batch). Do NOT quietly bump its pin to a release that has no win asset.
  4. Generated schemas regeneration — run tools/openapigen at release time so frontend/src/generated/schemas.ts descriptions pick up the L-UI wording.
  5. Tracked test binaries — decide separately whether to delete the three stale ELF files from the repo.