自持镜像
bt.kajiejie.com · 面板安装 / 升级脚本、历史升级包与安全自检工具的本地分发源(与 as.kajiejie.com 内容互通)
01安装(全新服务器)
在干净的 Linux 系统上执行:
curl -sSL https://bt.kajiejie.com/install/install.sh | bash
装完后脚本会自动:建安全基线 → 跑一次自检并打印结果 → 安装每日定时巡检。 留意最后几行:出现 首次安全自检通过。 即为正常; 若出现红色 发现问题,请立即人工检查,不要继续使用。
02升级(已装面板的机器)
前置条件:该机器已经装过面板(存在 /www/server/panel/BTPanel)。
curl -sSL https://bt.kajiejie.com/install/update6.sh | bash
不带参数时升级到镜像当前版本(13.0.0)。
也可以指定版本(版本号见下方清单):
curl -sSL https://bt.kajiejie.com/install/update6.sh | bash -s 13.0.0
升级前先做预检(推荐)
只读检查,不会改动任何东西,用来确认这台机器到底能不能升级:
curl -sSL https://bt.kajiejie.com/install/update6.sh | bash -s -- --check
它会检查:是否 root(非 root 直接指出,因为要写
/www/server/panel 和 /etc/init.d/bt)、关键目录可写性、
架构(ARM 机器会明确指出不支持,因为脚本在 ARM 上会请求
LinuxPanel-7.7.0.zip 而本镜像只托管 x86_64 版本)、系统类型与 64 位、
面板目录、pyenv、必需命令、磁盘空间、镜像连通性、目标版本与升级包是否可取、.pl 校验信息、
以及 bt.cn 辅助依赖。全部通过才建议真正升级。
curl -sSL https://bt.kajiejie.com/install/update6.sh | sudo bash),
不再等到中途才失败。注意 /www/server/panel/pyenv 是 drw-------,
非 root 读不到,预检会明确说「需要 root 才能确认」而不是误报「缺 pyenv」。
支持的系统
与官方的 install.sh 一致 —— 64 位,且命中下面的「拒绝名单」才会被拦:
| 状态 | 系统 |
|---|---|
| ✅ 支持 | Debian 11 / 12 / 13、Ubuntu 22 / 24、CentOS / Rocky / AlmaLinux 9、CentOS 7、OpenCloudOS 9、TencentOS Server 4、AlibabaCloud Linux 3、Alinux 4、Anolis 8.8、HCE 2 |
| ❌ 拒绝 | 32 位系统、CentOS / RedHat 6、Ubuntu < 16、Ubuntu 非 LTS(19 / 21 / 23 / 25)、Debian 7 / 8 / 9 |
| ⚠️ 未验证 | 其他系统(脚本不拦,但未测试) |
注:升级脚本 update6.sh 本身对系统几乎没有限制,只有两处前置条件 ——
/www/server/panel/BTPanel 与 pyenv/bin/python3 必须存在。
上面的「支持/拒绝」来自安装脚本 install.sh 的判定逻辑,预检里保持一致。
13.0.0 版本
(unzip -o ... -d /www/server/)。所以若该机器当前跑的是官方宝塔,
升级后会变成镜像所带的版本。(用户数据不受影响:包内不含
panel/data/default.db、
port.pl、admin_path.pl、userInfo.json,站点/数据库注册表不会被覆盖。)另外:升级本身会改动面板文件,所以升级后自检可能提示「文件已变更」—— 这属预期。 确认本次升级正常后,请重建基线:
bash /root/security-check/check_btpanel.sh --init-baseline
「官方宝塔 → 本脚本升级」这条路已补齐
官方面板 UI 升级时会先跑 script/update_prep_script.sh,
它会补装新版需要的 Python 包(asn1crypto/cbor2/numpy/openai/pydantic)
并执行各版本的一次性迁移。官方命令行升级脚本不跑它,而官方面板的 pyenv 里正好没有这几个包
(官方 pip-3.7.16.txt 未收录),所以本镜像在 update6.sh 里补上了这一步:
prepare阶段 —— 下载/替换面板文件之前after阶段 —— 文件替换之后、重启面板之前
调用方式与官方一致:bash script/update_prep_script.sh <版本> <是否LTS> <prepare|after>,
以输出中出现 BT-Panel Update Ready 判定成功。失败只提示、不中断升级。
不装这个脚本也能升级(面板核心不依赖这几个包,缺的只是面板的「AI 功能」)。
03插件安装(专业版 / 企业版 / 收费插件)
镜像里已备好 46 个插件包 (专业版应用 19 个全部 + 企业版应用 25 个),以及它们安装时引用的依赖文件。 在目标服务器上执行:
# 先看清单
curl -sSL https://bt.kajiejie.com/tools/install_plugin.sh | bash -s -- --list
# 安装指定插件(可多个)
curl -sSL https://bt.kajiejie.com/tools/install_plugin.sh | bash -s -- btwaf msg_push
# 安装全部「专业版应用」/「企业版应用」
curl -sSL https://bt.kajiejie.com/tools/install_plugin.sh | bash -s -- --pro
curl -sSL https://bt.kajiejie.com/tools/install_plugin.sh | bash -s -- --ent
① 脚本安装前会备份旧插件目录,
install.sh 失败会自动回滚(备份在 /root/plugin-backup/)。② 脚本会清除旧版遗留的
*.so。新版插件包只发 .py 源码,而 Python
优先加载 .so 而不是 .py —— 不清掉就会出现「页面是新版、后端还是旧版」,
表现为某些功能一点就报错。
厂商 CDN 上确实没有包、因此未能镜像的:enterprise_backup、tamper_drive(企业版 2 个)。
面板的「云端」也已指向本镜像
上面的安装 / 升级脚本会自动打补丁,把面板下面这些功能改从本镜像取,装完自动重启面板生效:
| 面板功能 | 涉及文件 |
|---|---|
| 软件商店的插件列表 | class/PluginLoader.py |
| 插件包的下载 | class/panelPlugin.py |
| UI 里的版本检测与升级 | class/system.py、script/upgrade_panel_optimized.py |
手动单独执行 / 检查:
curl -sSL https://bt.kajiejie.com/tools/bt_selfhost_patch.sh | bash
curl -sSL https://bt.kajiejie.com/tools/bt_selfhost_patch.sh | bash -s -- --check
public.GetConfigValue('home') 有 70+ 调用点,涉及付费插件授权校验、云查木马、
WAF 恶意 IP 库、微信登录与消息推送、遥测 —— 这些是会变的动态服务,镜像不了。
另外 panelPlugin.py 里 /api/Pluginother/get_file
(一键部署类插件取子文件)也保持指向厂商,以免反而弄坏它。实测:付费插件装上后功能直接可用,没有"未授权"拦截。
04安全自检工具
检查面板是否被植入已知后门(bt.sb / bash.moe 团伙手法):
requests 库 URL 劫持、pyenv 恶意域名、后门型 URL 重写、
安装脚本指向非官方源、pip 源被换、关键文件漂移。
已被上面的安装/升级脚本自动装好
每日 04:17 自动巡检,日志 /var/log/btpanel-security-check.log(干净时无内容)。
手动安装 / 复查
mkdir -p /root/security-check && cd /root/security-check
curl -sSLO https://bt.kajiejie.com/tools/check_btpanel.sh
curl -sSLO https://bt.kajiejie.com/tools/install-notes.txt
chmod 700 check_btpanel.sh
bash check_btpanel.sh # 完整自检
bash check_btpanel.sh --init-baseline # 建/重建基线
bash check_btpanel.sh --quiet # 干净时零输出(cron 用)
05升级包清单 (1 个)
升级包与同名 .pl(校验信息)必须成对存在;.pl 里的 hash 等于对应 .zip 的 sha256。
06其他文件
| 路径 | 说明 | 大小 | 修改时间 |
|---|---|---|---|
| /install/install.sh | 全新安装脚本(含自动安全自检) | 71.8 KB | 2026-09-27 21:13 |
| /install/update6.sh | 面板升级脚本(含升级后自检) | 35.5 KB | 2026-09-27 21:13 |
| /install/public.sh | 节点选择脚本(官方 bt.cn 版,md5 与脚本内钉死值一致) | 5.8 KB | 2026-09-27 21:13 |
| /install/src/panel6.zip | 面板程序包(全新安装用) | 37.33 MB | 2026-09-21 21:18 |
| /install/update/update_prep_script.sh | 升级前预处理脚本 | 11.3 KB | 2026-09-22 11:05 |
| /panel/get_plugin_list | 插件列表 JSON(软件商店用;class/PluginLoader.py 读取) | 602.0 KB | 2026-09-21 23:38 |
| /install/plugin-pkg/index.json | 插件包索引(专业版 / 企业版 / 收费插件清单与版本) | 8.3 KB | 2026-09-27 21:14 |
| /tools/install_plugin.sh | 插件安装脚本(从本镜像安装插件,见第三节) | 7.7 KB | 2026-09-27 21:13 |
| /tools/bt_selfhost_patch.sh | 自持补丁脚本(把面板云端指向本镜像,安装/升级时自动执行) | 19.3 KB | 2026-09-27 21:13 |
| /tools/check_btpanel.sh | 安全自检脚本 | 14.4 KB | 2026-09-22 12:26 |
| /tools/install-notes.txt | 自检工具说明与已知坑(建议先读) | 4.6 KB | 2026-09-27 21:13 |
| /tools/move-notes.txt | 搬家 / 换域名操作清单(含动过站点后的必做自检) | 3.6 KB | 2026-09-27 21:14 |
接口桩(面板内部调用,一般无需关心)
| 路径 | 返回 |
|---|---|
/api/SetupCount | ok |
/api/isCN | True |
/api/panel/get_version | 13.0.0 |
/api/panel/get_panel_version_v3 | 版本 JSON(面板更新检测用) |
/api/panel/get_stable_panel_version_v3 | 稳定版查询(本镜像未提供稳定版) |
/panel/get_plugin_list | 软件商店插件列表(364 个插件,class/PluginLoader.py 读取) |
/down/download_plugin | 插件包下发(POST name&version,带 File-size / Content-md5 头) |
07必须知道的坑
1. 版本号必须三处一致 升级镜像时
/api/panel/get_version 的返回值、api/panel/get_panel_version_v3 里的版本、
以及 /install/update/ 下实际存在的 LinuxPanel-<版本>.zip
必须一致。不一致会导致面板更新失败(拼出 404 路径)。
当前:13.0.0。
2. WAF 会封掉「隧道源地址」,导致公网全断 致命
若前面挂了反向代理 / 内网穿透,本机 nginx 看到的所有公网请求源 IP 都是同一个。 面板的 CC 攻击防护会把它当攻击者加入封锁列表 —— 封掉它等于封掉全部公网入站。
症状:https:// 超时,但 ping 中继正常、内网 IP 访问正常。排查:
ipset list bt_ip_filter # 看有没有那个源 IP
tail /www/server/panel/logs/ipfilter.log
修复必须加白名单(只删封锁列表会被 WAF 自动重新封回), 详见 install-notes.txt 末尾那一节。
3. 别用 wget -O <已存在的文件>
下载失败时 wget 会先把目标文件截断成 0 字节再报错。 脚本里已改成「先下到临时文件 → 校验 → 通过才替换」,自己写脚本时注意同样的坑。
4. 装完务必跑一次自检
这套面板来自第三方重打包(repack),不是官方 bt.cn 版本。 自检只能发现已知后门特征与关键文件改动,不能替代对面板源码的审计。 装完立刻自检、并保留每日巡检,是当前最实际的兜底。
5. 搬家 / 重建站点后必须查一次内部路由 2026-09-27 踩过
本页的 /down/download_plugin、/api/panel/get_panel_version_v3 等接口
在磁盘上没有实体文件,靠 nginx 的
extension/bt.kajiejie.com/mirror_api.conf 内部路由支撑。在宝塔里
删站重建、搬根目录、重签证书都会把 extension 目录重建,导致该文件丢失 ——
表现是客户端面板装插件报 JSONDecodeError(接口变成了 404 的 HTML 页)。
每次动完站点配置,在服务器上跑一遍:
curl -sS -o /dev/null -w '%{http_code}\n' -X POST https://bt.kajiejie.com/down/download_plugin -d 'name=monitor&version=4&os=Linux' # 期望 200
curl -sS https://bt.kajiejie.com/api/panel/get_panel_version_v3 # 期望一段 JSON
ls /www/server/panel/vhost/nginx/extension/bt.kajiejie.com/ # 期望看到 mirror_api.conf
丢了就从备份还原:/root/as-mirror-config-backup/mirror_api.conf.bt.kajiejie.com 拷回
extension/bt.kajiejie.com/,nginx -t 通过后 reload。搬家/换域名的完整清单见
move-notes.txt。
08镜像维护
本镜像是与 install.btweb.co 同步的快照,不会自动更新。
站点根目录:/vol2/1000/ydp/bt.kajiejie.com(由 __DIR__ 动态获取,搬家后本页自动正确)。新增版本时:
# 1) 放好新的升级包与校验信息
cp LinuxPanel-<新版本>.zip /vol2/1000/ydp/bt.kajiejie.com/install/update/
# 并生成同名 .pl,内容: {"hash": "<zip 的 sha256>", "update_time": "<时间戳>"}
# 2) 更新对外公布的版本号(三处一致)
echo -n <新版本> > /vol2/1000/ydp/bt.kajiejie.com/api/panel/get_version
# api/panel/get_panel_version_v3 / get_stable_panel_version_v3 的返回体在 nginx 配置里:
# /www/server/panel/vhost/nginx/extension/bt.kajiejie.com/mirror_api.conf
# (改完记得同步本地备份: /root/as-mirror-config-backup/mirror_api.conf.bt.kajiejie.com)
# 3) 本页无需改动 —— 版本、大小、时间都是实时读取的
搬家 / 换服务器 / 换域名:照 move-notes.txt
清单走(打包自包含目录 → 新机建站 → 还原 mirror_api.conf → 三接口自检;
换域名还要批量替换 install/*.sh 与 install/plugin/*/install.sh
里的旧域名,已分发出去的客户端建议新旧域名并列服务、不可 301)。