rename: 3x-ui/x-ui -> L-UI/l-ui/lui-agent (paths, services, env, assets)

Display L-UI; panel binary/process l-ui, agent lui-agent.
Dirs /usr/local/l-ui, /etc/l-ui, /var/log/l-ui; DB /etc/l-ui/l-ui.db
(name file drives it via GetName), probe.db beside it, cert
/etc/l-ui/cert, bin /usr/local/l-ui/bin. Services l-ui.service /
lui-agent.service, OpenRC lui-agent, l-ui.sh, cmd/lui-agent.
Env prefix XUI_ -> LUI_ (code reads new prefix only). Release
assets l-ui-linux-* / lui-agent-linux-*; Gitea repo rogue/l-ui is
a placeholder pending user confirmation (see selfupdate.go note).
Go module path github.com/mhsanaei/3x-ui/v3 intentionally kept.
Versions unchanged: panel V2.6.0 / agent A2.5.0.
This commit is contained in:
Muse
2026-10-24 12:00:55 +00:00
parent 8158cedfc1
commit 6a5ee8f77b
379 changed files with 2441 additions and 2421 deletions
+1 -1
View File
@@ -68,5 +68,5 @@ Only standalone bundles (login/subpage) need a new `.html` + `src/entries/*` +
compile-checks every story). Reusable `src/components/` get a co-located
`<Component>.stories.tsx` with `tags: ['autodocs']`; document props via
`argTypes` / `parameters.docs` string metadata, never JSDoc.
- After `npm run build`, RESTART `go run .` (see the XUI_DEBUG gotcha in root
- After `npm run build`, RESTART `go run .` (see the LUI_DEBUG gotcha in root
CLAUDE.md) before checking the panel.
+1 -1
View File
@@ -1,4 +1,4 @@
# 3x-ui frontend
# L-UI frontend
React 19 + Ant Design 6 + TypeScript + Vite 8. Three SPA bundles —
`index.html` (admin panel SPA, all `/panel/*` routes), `login.html`
+2 -2
View File
@@ -1,11 +1,11 @@
{
"name": "3x-ui-frontend",
"name": "l-ui-frontend",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "3x-ui-frontend",
"name": "l-ui-frontend",
"version": "1.0.0",
"dependencies": {
"@ant-design/icons": "^6.3.2",
+2 -2
View File
@@ -1,9 +1,9 @@
{
"name": "3x-ui-frontend",
"name": "l-ui-frontend",
"private": true,
"version": "1.0.0",
"type": "module",
"description": "3x-ui panel frontend (React 19 + Ant Design 6 + Vite 8).",
"description": "L-UI panel frontend (React 19 + Ant Design 6 + Vite 8).",
"engines": {
"node": ">=24.0.0",
"npm": ">=10.0.0"
+8 -8
View File
@@ -1,6 +1,6 @@
{
"name": "3x-ui",
"short_name": "3x-ui",
"name": "L-UI",
"short_name": "L-UI",
"start_url": "./",
"scope": "./",
"display": "standalone",
@@ -8,32 +8,32 @@
"theme_color": "#1677ff",
"icons": [
{
"src": "icons/3x-ui-16.png",
"src": "icons/L-UI-16.png",
"sizes": "16x16",
"type": "image/png"
},
{
"src": "icons/3x-ui-24.png",
"src": "icons/L-UI-24.png",
"sizes": "24x24",
"type": "image/png"
},
{
"src": "icons/3x-ui-32.png",
"src": "icons/L-UI-32.png",
"sizes": "32x32",
"type": "image/png"
},
{
"src": "icons/3x-ui-64.png",
"src": "icons/L-UI-64.png",
"sizes": "64x64",
"type": "image/png"
},
{
"src": "icons/3x-ui-192.png",
"src": "icons/L-UI-192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "icons/3x-ui-512.png",
"src": "icons/L-UI-512.png",
"sizes": "512x512",
"type": "image/png"
}
+1 -1
View File
@@ -37,7 +37,7 @@ import { pauseAnimationsUntilLeave, useTheme } from '@/hooks/useTheme';
import { useAllSettings } from '@/api/queries/useAllSettings';
import './AppSidebar.css';
const REPO_URL = 'https://git.881218.xyz/rogue/3x-ui-agent';
const REPO_URL = 'https://git.881218.xyz/rogue/l-ui';
const LOGOUT_KEY = '__logout__';
const RAIL_WIDTH = 72;
const SIDER_WIDTH = 220;
@@ -259,7 +259,7 @@ function ensureFinalMask(stream: Raw): Raw {
}
// Rebuild the salamander mask from the standard Hysteria2 obfs pair (every
// non-3x-ui client, and this panel's own generator, speak it instead of the
// non-L-UI client, and this panel's own generator, speak it instead of the
// private fm=<json> dump). A salamander mask already carrying a password via fm=
// wins; a password-less one is completed rather than left empty.
function applyHysteria2Obfs(stream: Raw, params: URLSearchParams): void {
@@ -1,4 +1,4 @@
// Shapes the streamSettings subtree that 3x-ui persists to match what
// Shapes the streamSettings subtree that L-UI persists to match what
// xray-core actually consumes. The panel's Zod defaults mirror the full
// SplitHTTPConfig / SockoptObject schema, but many fields are mode-specific
// (packet-up vs stream-one) or side-specific (inbound vs outbound). Emitting
+2 -2
View File
@@ -109,7 +109,7 @@ export default function NodeFormModal({
const editInstallCmd = useMemo(() => {
if (!shownInstall || !editMasterUrl) return '';
const base =
`bash <(curl -fL https://git.881218.xyz/rogue/3x-ui-agent/raw/branch/main/install-agent.sh)` +
`bash <(curl -fL https://git.881218.xyz/rogue/l-ui/raw/branch/main/install-agent.sh)` +
` --master ${editMasterUrl}`;
const cmd = shownInstall.hasToken
? `${base} --token ${shownInstall.token} --name ${shownInstall.name}`
@@ -185,7 +185,7 @@ export default function NodeFormModal({
// one would produce a command that can never register, so withhold it
// (and say why) instead of letting the user copy a dead command.
const installCmd = agentMasterUrl
? `bash <(curl -fL https://git.881218.xyz/rogue/3x-ui-agent/raw/branch/main/install-agent.sh) --master ${agentMasterUrl} --token ${agentToken ?? ''} --name ${agentNodeName}`
? `bash <(curl -fL https://git.881218.xyz/rogue/l-ui/raw/branch/main/install-agent.sh) --master ${agentMasterUrl} --token ${agentToken ?? ''} --name ${agentNodeName}`
: '';
return (
+8 -8
View File
@@ -8,18 +8,18 @@ const outDir = path.resolve(import.meta.dirname, '../internal/web/dist');
const BACKEND_TARGET = 'http://localhost:2053';
function resolveDBPath() {
const envFolder = process.env.XUI_DB_FOLDER;
const envFolder = process.env.LUI_DB_FOLDER;
if (envFolder) {
const abs = path.isAbsolute(envFolder)
? envFolder
: path.resolve(import.meta.dirname, '..', envFolder);
return path.join(abs, 'x-ui.db');
return path.join(abs, 'l-ui.db');
}
const repoSubDB = path.resolve(import.meta.dirname, '..', 'x-ui', 'x-ui.db');
const repoSubDB = path.resolve(import.meta.dirname, '..', 'l-ui', 'l-ui.db');
if (fs.existsSync(repoSubDB)) return repoSubDB;
const repoDB = path.resolve(import.meta.dirname, '..', 'x-ui.db');
const repoDB = path.resolve(import.meta.dirname, '..', 'l-ui.db');
if (fs.existsSync(repoDB)) return repoDB;
return '/etc/x-ui/x-ui.db';
return '/etc/l-ui/l-ui.db';
}
const PANEL_API_PREFIXES = ['panel/api/', 'panel/csrf-token'];
@@ -226,9 +226,9 @@ export default defineConfig({
// production sourcemaps (~18MB across 112 files, 72% of dist) ship inside
// every release build. Nothing consumes them there; `npm run dev` serves
// its own maps regardless of this setting. To debug a minified bundle
// (including the XUI_DEBUG serve-from-disk path), build once with
// XUI_SOURCEMAP=true — no tracked-file edit to accidentally commit.
sourcemap: process.env.XUI_SOURCEMAP === 'true',
// (including the LUI_DEBUG serve-from-disk path), build once with
// LUI_SOURCEMAP=true — no tracked-file edit to accidentally commit.
sourcemap: process.env.LUI_SOURCEMAP === 'true',
target: 'es2020',
chunkSizeWarningLimit: 1500,
rollupOptions: {