1440 字
7 分钟
完美重置x-ui面板节点ID
2025-10-02

强迫症福音:如何完美重置x-ui面板节点ID,实现从1开始连续排列#

前言#

相信很多使用 x-ui 面板的朋友都遇到过这样的情况:为了测试或管理,我们添加了许多入站节点,后来又删除了一部分。这时,节点列表的 ID 就会出现断层,比如 1, 2, 5, 8, 11...,对于追求整洁和完美的用户来说,这简直是“逼死强迫症”。

本文将提供一个终极解决方案,通过直接操作数据库,将你的 x-ui 节点 ID 重新整理为从 1 开始的完美连续序列,并且,我们还会分享一个“意外之喜”——在重置ID的同时,保留所有节点的历史流量统计数据!

核心原理#

x-ui 的所有配置和数据都存储在一个名为 x-ui.db 的 SQLite 数据库文件中。我们的方法就是通过 SQL 命令,将存储节点的 inbounds 表进行重建:

  1. 读取旧表中的所有节点数据。
  2. 创建一个新的临时表。
  3. 将数据有序地插入到新表中,利用数据库的自增主键(AUTOINCREMENT)特性,自动生成从 1 开始的连续 ID。
  4. 删除旧表,并将新表重命名,完成替换。

⚠️ 重要警告:操作前必读!#

这是一个高风险的数据库操作。请务必严格按照步骤执行!

  1. 数据无价,备份先行! 本文最重要的步骤就是备份数据库。如果操作失误,没有备份将导致所有节点数据丢失!
  2. 停止面板! 操作期间必须停止 x-ui 服务,防止数据读写冲突导致数据库损坏。
  3. 仔细复制命令! 请确保完整复制本文提供的命令,不要手动输入,以免出错。

操作步骤#

第一步:连接服务器并停止 x-ui#

使用 SSH 工具登录到你的服务器,然后执行以下命令停止 x-ui 面板,确保数据库文件没有被占用。

Terminal window
x-ui stop

第二步:备份数据库(最重要的一步!)#

执行以下命令,将当前的数据库文件备份到 /root 目录下,并以当前时间命名,以防万一。

Terminal window
cp /etc/x-ui/x-ui.db /root/x-ui.db.backup-$(date +"%Y%m%d%H%M%S")

备份后,可以执行 ls /root 查看,确保备份文件(如 x-ui.db.backup-20231027103000)已成功创建。请务必确认备份成功后再进行下一步!

第三步:执行ID重置脚本#

这是最核心的一步。请完整复制下面的所有代码,并粘贴到你的 SSH 终端中执行。

这段脚本会自动连接到数据库,执行一系列安全的 SQL 操作来重建节点表。

Terminal window
sqlite3 /etc/x-ui/x-ui.db <<'EOF'
-- 创建一个与 inbounds 结构相同的新表,但不包含自增ID的主键特性
CREATE TABLE inbounds_new (
id INTEGER,
user_id INTEGER NOT NULL,
up INTEGER NOT NULL,
down INTEGER NOT NULL,
total INTEGER NOT NULL,
remark TEXT NOT NULL,
enable INTEGER NOT NULL,
expiry_time INTEGER NOT NULL,
listen TEXT NOT NULL,
port INTEGER NOT NULL,
protocol TEXT NOT NULL,
settings TEXT NOT NULL,
stream_settings TEXT NOT NULL,
tag TEXT NOT NULL,
sniffing TEXT NOT NULL
);
-- 将旧表的数据(除了ID)插入到新表中,ID会自动从1开始生成
INSERT INTO inbounds_new (user_id, up, down, total, remark, enable, expiry_time, listen, port, protocol, settings, stream_settings, tag, sniffing)
SELECT user_id, up, down, total, remark, enable, expiry_time, listen, port, protocol, settings, stream_settings, tag, sniffing FROM inbounds ORDER BY id;
-- 删除旧的 inbounds 表
DROP TABLE inbounds;
-- 将新表重命名为 inbounds,并重建主键
CREATE TABLE inbounds (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL,
up INTEGER NOT NULL,
down INTEGER NOT NULL,
total INTEGER NOT NULL,
remark TEXT NOT NULL,
enable INTEGER NOT NULL,
expiry_time INTEGER NOT NULL,
listen TEXT NOT NULL,
port INTEGER NOT NULL,
protocol TEXT NOT NULL,
settings TEXT NOT NULL,
stream_settings TEXT NOT NULL,
tag TEXT NOT NULL,
sniffing TEXT NOT NULL
);
INSERT INTO inbounds (id, user_id, up, down, total, remark, enable, expiry_time, listen, port, protocol, settings, stream_settings, tag, sniffing)
SELECT id, user_id, up, down, total, remark, enable, expiry_time, listen, port, protocol, settings, stream_settings, tag, sniffing FROM inbounds_new ORDER BY id;
DROP TABLE inbounds_new;
-- 清空与旧ID关联的流量统计数据,因为ID已经改变,旧的统计数据已无意义
DELETE FROM inbound_client_traffics;
VACUUM;
.quit
EOF

脚本执行完成后,不会有任何输出,这代表操作成功。

第四步:重启 x-ui 并验证#

现在,重新启动 x-ui 面板。

Terminal window
x-ui start

登录你的 x-ui Web 界面,刷新“入站列表”页面。见证奇迹的时刻到了!你会发现所有的节点 ID 都已经从 1 开始,完美地连续排列。现在,你的节点列表应该像阅兵一样整齐了!

意外之喜:为什么流量统计数据还在?#

细心的你可能会发现,操作完成后,每个节点的历史总流量(上行/下行)竟然还在!

这是因为节点的总流量数据(updown 字段)是直接记录在 inbounds 这张主表里的。我们上面的脚本在迁移数据时,是把这些流量数据原封不动地一起复制到了新表中。因此,这个方法在重置 ID 的同时,完美保留了节点的总流量统计,一举两得!

如果出现问题怎么办?(恢复大法)#

如果在操作后,你的面板无法启动或节点列表为空,不要慌张,我们有备份。

  1. 停止 x-ui
    Terminal window
    x-ui stop
  2. 找到你的备份文件
    Terminal window
    ls /root/x-ui.db.backup-*
  3. 用备份文件覆盖当前数据库 (注意替换成你自己的备份文件名)
    Terminal window
    # 示例命令,请务必替换成你自己的文件名
    cp /root/x-ui.db.backup-20251027103000 /etc/x-ui/x-ui.db
  4. 重新启动 x-ui
    Terminal window
    x-ui start
    这样,你的面板就会恢复到操作之前的状态。

结语#

通过这个简单而强大的方法,我们轻松解决了 x-ui 节点 ID 不连续的问题,让面板管理更加清爽和有序。

完美重置x-ui面板节点ID
https://blog.wlens.top/posts/完美重置x-ui面板节点id/
作者
Lao Wang
发布于
2025-10-02
许可协议
CC BY-NC-SA 4.0