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:
+1
-1
@@ -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
@@ -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`
|
||||
|
||||
Generated
+2
-2
@@ -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",
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,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: {
|
||||
|
||||
Reference in New Issue
Block a user