• v1.3.8 ace8dc8b5c

    TPanel v1.3.8 Stable

    zhangpu released this 2026-06-01 14:09:29 +08:00 | -2 commits to main since this release

    TPanel v1.3.8 发布说明

    🚀 TPanel v1.3.8 — 8 个隐藏 bug 紧急修复

    一次 10 小时的"挖 bug 马拉松",挖出 v1.0.0 时代就存在但从未暴露的 8 个致命 bug。生产服务器(zphp.cn)现已全部验证通过。


    🐛 8 个隐藏 bug 详细列表

    1. zip 魔数校验永远失败 🔴

    症状:bash install.sh 永远卡在 [3/8] 下载源码,5 个下载源全报"下载到的东西不是 zip"。

    根因:install.sh 用 head -c 4 file | grep -q "PK\x03\x04" 校验 zip 魔数。但 grep 默认是文本模式,\x03\x04 不会被解析成 0x03/0x04 字节——它只认 \n、\t 等。所以这段代码要找的是 10 字符的字面字符串 "PK\x03\x04",永远匹配不上 4 字节的真魔数 PK\x03\x04。

    修法:用 od -An -tx1 -N4 把前 4 字节转成 hex 字符串 504b0304 再比较。

    2. 解压步骤漏复制根目录文件 🔴

    症状:ERROR: Could not open requirements file: [Errno 2] No such file or directory: '/opt/tpanel/requirements.txt'

    根因:install.sh 的解压步骤只 cp -r backend frontend,没复制根目录的 requirements.txt、README.md 等。

    修法:加 for 循环复制 requirements.txt .gitignore README.md SPEC.md。

    3. /etc/nginx/tpanel 权限问题 🔴

    症状:PermissionError: [Errno 13] Permission denied: '/etc/nginx/tpanel',TPanel 服务起不来。

    根因:config.py 在 import 时就 os.makedirs('/etc/nginx/tpanel'),但 install.sh 从来没创建过这个目录、也没授权 tpanel 用户。

    修法:install.sh 2/8 步骤加 mkdir -p /etc/nginx/tpanel && chown tpanel:tpanel。

    4. systemd ExecStart 没传端口参数 🔴

    症状:服务监听着 127.0.0.1:8848,Nginx proxy 到 127.0.0.1:8888 → 502 Bad Gateway。

    根因:

    • install.sh ExecStart: python main.py(没传端口参数)
    • main.py 启动逻辑: port = int(sys.argv[1]) if len(sys.argv) > 1 else 8848
    • install.sh 还设了 Environment=TPANEL_PORT=8888,但 main.py 根本不读环境变量——只读 sys.argv

    修法:ExecStart 改成 python main.py ${PANEL_PORT} 显式传参。

    5. 前端 JS 2 处语法错误(v1.0.0 时代就有)🔴

    症状:登录后所有功能点不动,浏览器 Console 报 Uncaught SyntaxError。

    两处 bug:

    • 1987 行:let bread = '<span onclick="navigateFiles('')">/</span>'; — 单引号 JS 字符串里嵌套 '' 触发字符串提前闭合
    • 2023 行:pdf':'📕','doc':'📘', — pdf' 多写了一个单引号

    修法:1987 行外层改反引号 template literal;2023 行删多余单引号。

    6. PHP-FPM 完全没装 🔴

    症状:成功创建网站,ping 通了,访问 404 Not Found。

    根因:install.sh 完全没装 PHP-FPM!zip 里也没 PHP 相关的 .deb/.rpm 包。

    修法:install.sh 加 php8.2-fpm + 常用扩展(curl/mbstring/xml/zip/gd/mysql),启动并设置开机自启;main.py 默认 php_version 改 8.2。

    7. PHP-FPM unix socket 在 systemd 环境失效 🟡

    症状:nginx 报 connect() to unix:/run/php/php-fpm8.2.sock failed (2: No such file or directory),但 cgi-fcgi 直接连 socket 成功,权限也对。

    根因:systemd 的 PrivateTmp= 或 mount namespace 隔离让 nginx worker 看到的 /run/php/ 和 PHP-FPM 看到的不是同一个。

    修法:PHP-FPM listen 改 TCP 127.0.0.1:9000(CentOS/RHEL 默认就是 TCP),system.py fpm_sock 改 TCP,install.sh sed 改 www.conf 的 listen 指令。

    8. MariaDB 没装 + SQL 注入漏洞 🔴🔴(最危险)

    症状:

    • /bin/sh: 1: mysql: not found — install.sh 没装 MariaDB
    • /bin/sh: 1: zphp.cn: not found — TPanel 用 shell=True 拼 SQL,zphp.cn 被 shell 当成命令

    根因:

    • install.sh 完全没装 mariadb-server
    • system.py create_mysql_db 用 f-string 拼 mysql -e "{sql}",shell=True + f-string = SQL 注入漏洞——name 含反引号或单引号可执行任意 SQL
    • MariaDB 默认 unix_socket 认证,tpanel 用户根本登不上去

    修法:

    1. install.sh 加 mariadb-server mariadb-client,启动 mariadb
    2. install.sh 写 /etc/sudoers.d/tpanel-mysql 让 tpanel 免密 sudo mysql
    3. system.py create_mysql_db / delete_mysql_db 改用:
      • subprocess list 参数(不是 shell=True)
      • sudo mysql -e "{stmt}" 提权
      • re.match(r'^[a-zA-Z0-9_]+$', name) 校验 name/user 防 SQL 注入

    📦 安装

    wget -O install.sh https://github.com/zhang-pu/tpanel/releases/download/v1.3.8/install.sh
    bash install.sh
    

    或官网:

    wget -O install.sh https://tpanel.cn/install.sh
    bash install.sh
    

    🔄 升级(从 v1.3.0 ~ v1.3.7)

    1. 重新 bash install.sh(会保留 /opt/tpanel 现有数据)
    2. 首次访问用 Ctrl+Shift+R 硬刷新(跳过浏览器缓存)

    ⚠️ 兼容性

    • 100% 向后兼容
    • 不需要手动重启服务
    • 老用户升级后所有功能正常

    🔒 已知问题(v1.3.9+ 修复)

    • per-site PHP-FPM pool 缺失:当前所有网站共用一个 PHP-FPM pool(跑 www-data),写文件需要 chmod o+rw。v1.3.9+ 会为每个网站创建独立 PHP-FPM pool。

    🙏 致谢

    10 小时挖 8 bug,献给所有在生产服务器上跑过 TPanel 但没敢删系统重装的人。


    完整变更日志: https://github.com/zhang-pu/tpanel/compare/v1.3.1...v1.3.8

    Downloads