• v1.3.45 1427a67964

    zhangpu released this 2026-06-28 18:28:42 +08:00 | 3 commits to main since this release

    🔥 v1.3.45 关键 bug 修复

    🐛 文件管理-管理员模式不能下载

    • 症状:在管理员模式下浏览 /etc /var/log 等任意目录,文件行没有下载按钮;如手动调接口会 404
    • 根因:/api/files/download 只支持普通站点(需要 site_id),管理员模式走绝对路径没有对应端点
    • 修法:
      • 后端新增 /api/admin/files/download 端点(admin_mode 走绝对路径 + send_file 流式下载 + 写操作日志)
      • 前端 loadAdminFiles 渲染文件行时增加 ⬇️ 下载按钮(之前只有编辑和删除)
      • downloadFile(name) 增加 isAdminMode 分支,正确调用新端点

    🐛 强制刷新页面后点链接无响应

    • 症状:浏览器 F5 普通刷新后,左侧导航 / 表格链接点击没反应
    • 根因:Flask send_static_file() 默认 Cache-Control: max-age=43200(12 小时),浏览器拿到的是旧版 JS,新函数(如 downloadFile 的 admin 分支)不存在 → onclick 报 undefined
    • 修法:
      • 后端 serve_index 和 serve_static 路径新增 _no_cache_html() 包装器,强制 Cache-Control: no-store, no-cache, must-revalidate, max-age=0 + Pragma + Expires
      • index.html <head> 增加 3 个 meta no-cache 标签作为双保险

    ✨ 包含 v1.3.44(已跳过发布)

    v1.3.44 原本计划加入 Web 终端集成(xterm.js),但发布周期被取消。如需 Web 终端功能,请直接使用 v1.3.45(已包含)。

    🧹 清理

    • 删除历史备份文件 backend/system.py.v1339bak 和 frontend/index_v13401.html,源码包体积精简
    • file_manager.read_file 的 max_size 从 1MB 提到 50MB(与 api_admin_files_read 一致)

    🛠 安装 / 升级

    新装:

    wget -O install.sh https://github.com/zhang-pu/tpanel/releases/download/v1.3.45/install.sh && bash install.sh
    升级(已装用户):管理后台 → 系统更新 → 上传 zip 包在线升级
    Downloads
  • v1.3.43 79981cde4a

    zhangpu released this 2026-06-28 18:16:03 +08:00 | 4 commits to main since this release

    ✨ v1.3.43 新增功能

    🆕 站点管理 - 一键强制开启 SSL

    • 操作列新增「强制开启 SSL」按钮(🔐)
    • 一键为站点部署 Let's Encrypt 证书
    • 自动配置 Nginx HTTPS 301 跳转
    • 无需进入 SSL 页面单独配置

    🆕 设置页面 - 管理员密码修改

    • 真正可用的密码修改功能(之前"开发中")
    • 调用 /api/auth/change-password API
    • 当前密码校验
    • 新密码强度校验(至少 6 位)
    • 修改成功后自动清空输入框 + 状态提示

    🐛 Bug 修复

    • 全局 SQLite busy_timeout 防锁死(v1.3.43+)
      • 长时间运行的查询不再因 database is locked 失败
      • busy_timeout + WAL 模式双保险

    🔧 优化

    • SSL 部署按钮状态提示优化
    • 密码修改接口返回信息更友好

    🛠 安装

    wget -O install.sh https://github.com/zhang-pu/tpanel/releases/download/v1.3.43/install.sh && bash install.sh
    Downloads
  • v1.3.42 8384fad1e3

    zhangpu released this 2026-06-13 16:34:29 +08:00 | -5 commits to main since this release

    📦 v1.3.42 — 2026-06-14 【正式发布】

    重点: 表格错位根治 + 侧边栏跟随主题 + 滚动条淡化 + 日志可读性 + 备份删除 API + 数据库列表过滤面板域名

    🐛 关键修复

    1. 表格错位(数据库 / 网站列表)—— 真正根因

      • 之前 v1.3.41 加 vertical-align: middle 没修对 —— 因为 <td class="actions"> 上挂了 display: flex,把 table-cell 改成了 flex 容器
      • 结果:操作列 td 高度不正常 + 整行高度被撑乱 + 其他 td 内容像"贴顶部漂浮"
      • 修法: .data-table .actions 去掉 display: flex,改 white-space: nowrap 保留 table-cell;.data-table .btn-icon 从 display: flex 改 display: inline-flex + vertical-align: middle,让按钮在文本流中正确垂直对齐
      • 教训: ❗ 永远不要在 <td> 上设 display: flex —— 它会破坏整行表格布局,副作用很隐蔽(vertical-align 失效、行高错乱、列宽计算异常)
    2. 左侧侧边栏背景跟随主题

      • v1.3.30+ 设计是 light 主题也用暗色 sidebar,但用户想要 sidebar 与主区域同色
      • 7 处 CSS 改用主题变量:background: var(--bg)、color: var(--text-muted)、hover: var(--card-hover)、border: var(--border)、版本号/分组/logo 文字全部改 var(--text*)
      • 现在 light/dark 主题切换时 sidebar 自动跟随
    3. 滚动条淡化(全局)

      • 加 ::-webkit-scrollbar + Firefox scrollbar-color,宽度 8px,颜色 rgba(148,163,184,0.25),hover 升到 0.45
      • track 透明,不显示底色槽
    4. 安全日志字体重叠

      • 原 .log-line 没设 line-height,padding 5px 0 + font-size 12px 竖向贴一起像"重叠"
      • 修:line-height: 1.6 + padding: 8px 12px + font-size: 13px + align-items: baseline 三列基线对齐 + hover 高亮
      • .log-msg word-break: break-all → break-word(不从单词中间硬切)
      • .log-type width: 80px → min-width: 100px(长 event_type 不被挤)
    5. 数据库列表过滤面板入口域名(v1.3.42 r2)

      • _detect_panel_domains() 检测 settings.panel_domain + /etc/nginx/sites-enabled/tpanel 的 server_name
      • 网站列表自动隐藏面板域名,避免用户误删

    🆕 新功能(合并自 CHANGELOG v1.3.41 草稿)

    1. SSL 证书同步 API + 按钮

      • 新增 backend/ssl_sync.py(71 行)
      • 新增 POST /api/ssl/sync:扫描 /etc/letsencrypt/live/ 重建 ssl_certs 表
      • 前端 SSL 页加 🔄 同步证书库 按钮
      • 适用:apply_letsencrypt 漏写 db / 数据库丢失 / 跨机迁移
    2. PHP 版本动态下拉

      • 新增 GET /api/system/php-versions:返回已装 / 未装 / 支持列表
      • 设置页 PHP 下拉框动态填充:已装 ✓、未装灰显
      • 选中未装版本时红字提示「⚠️ 新建站点会 502」+ 跳软件市场链接
    3. 删除备份 API

      • 新增 DELETE /api/backups/<id>:清理 db 记录 + 物理文件(含 _db.sql.gz 配套)
      • 前端备份列表 🗑️ 按钮接通
    4. shortVer 工具函数

      • 缩短长版本号显示:1:10.11.13-0+deb12u1 → 10.11.13,5.6.40-100+0~20260514... → 5.6.40
      • 软件市场列表已应用
    5. Dashboard 数字色修复(其实 v1.3.41 就该发但拖到现在)

      • .stat-card .value 颜色 #fff → var(--text),light 主题(白卡片)下不再不可见

    🆕 新文件

    • backend/ssl_sync.py

    📊 验证

    • chromium headless 截图:dashboard / sites / databases / logs 4 页样式正常
    • 网站列表 + 数据库列表所有列垂直居中(td 高度 72px,所有内容居中对齐)
    • 日志页行高从 28px → 38px,line-height 20.8px
    • light 主题 sidebar 与主区域同色,dark 模式下也跟随

    📦 文件

    • tpanel-v1.3.42-source.zip(md5 见同目录 tpanel-v1.3.42-source.zip.md5)

    Downloads
  • v1.3.9 ace8dc8b5c

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

    [1.3.9] - 2026-06-06(super release)

    🐛 修复

    • 登录后必须强制刷新才能看到后台:showLogin() 之前用 document.body.innerHTML = '...' 把后台骨架整个重写,导致 initApp() → setupNav() 找不到 .nav-item[data-page],loadDashboard() 静默失败。改为 display 切换两个独立 div(#loginScreen / #appShell)。

    ✨ 新增

    • 仪表盘显示 CPU 核心数:os.cpu_count()
    • 仪表盘显示 CPU 型号:4 级兜底(lscpu → /proc/cpuinfo → platform.processor() → "Unknown CPU")
    • 负载颜色按核心数判断:1 核机器 1.0 算满,N 核机器 N.0 才算满
      • load/cores > 0.8 → 红色
      • load/cores > 0.5 → 黄色
      • 否则 → 蓝色

    🔧 内部(继承自 v1.3.8)

    • install.sh 自动安装 MariaDB + 配置 sudoers
    • system.py create_mysql_db 改用 sudo + list 参数 + regex 校验(防 SQL 注入)
    • PHP-FPM 改用 TCP 127.0.0.1:9000
    • install.sh 自动安装并启动 PHP-FPM
    • systemd ExecStart 传端口参数
    • 创建 /etc/nginx/tpanel 并授权 tpanel 用户
    • 修复解压步骤漏复制根目录 requirements.txt
    • 修复 zip 魔数校验永远失败的 bug
    Downloads
  • 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
  • v1.3.1 ace8dc8b5c

    TPanel v1.3.1 Stable

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

    TPanel v1.3.1 发布 🚀

    🔧 改进

    • install.sh 健壮性大幅提升
      • 4 个下载源自动回退:Release → latest → tag → main 分支
      • zip 文件魔数校验(PK\x03\x04),自动识别 404 HTML
      • 本地兜底:自动扫描 /tmp/tpanel*.zip
    • 修复:main.py 中 get_panel_domain 在空配置下的 500 错误

    📦 安装

    wget -O install.sh https://github.com/zhang-pu/tpanel/releases/download/v1.3.1/install.sh
    bash install.sh
    
    ### 🔄 从 v1.3.0 升级
    wget -O /opt/tpanel/backend/main.py https://raw.githubusercontent.com/zhang-pu/tpanel/main/backend/main.py
    systemctl restart tpanel
    
    ### 📋 完整文件
    - `tpanel-v1.3.1.zip` (47KB) - 完整源码包
    - `install.sh` (9.5KB) - 独立安装脚本
    ### 🐛 修复
    - install.sh v1.0.0 中 ZIP URL 硬编码导致无法安装 v1.3.0+ 版本的问题
    **完整变更日志**: https://github.com/zhang-pu/tpanel/compare/v1.0.0...v1.3.1
    Downloads
  • v1.3.10 ace8dc8b5c

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

    [1.3.10] - 2026-06-07

    🐛 修复

    • phpMyAdmin 装完无反代 → 点 🐘 永远 confirm 死循环:v1.3.10 装完 phpMyAdmin 后没有自动写 Nginx 8443 反代配置,导致 /api/phpmyadmin/status 永远返回 nginx_ok=false,前端 setTimeout(..., 1000) 跳走再调 status 又触发 confirm。

    ✨ 新增

    • task_manager.create_task 支持 on_complete 钩子(v1.3.10 新机制)
      • 签名:on_complete(task_id, status),任务结束(success/failed)后回调
      • 用途:实现"装完 X 自动配 Y"的联动
      • 异常路径也会调用,让钩子自己判断
    • task_manager.setup_phpmyadmin_nginx()(v1.3.10 新增)
      • 自动探测 phpMyAdmin 实际路径(/usr/share/phpmyadmin 或 /usr/share/phpmyadmin/htdocs)
      • 写 /etc/nginx/sites-enabled/phpmyadmin.conf(用 sudo mv 临时文件,安全)
      • 包含安全加固(屏蔽 /libraries、/setup/frames、/sql)
      • nginx -t 验证 + systemctl reload nginx(失败 fallback 到 restart)
      • 失败时把错误追加到任务日志
      • 成功时打印 setup_phpmyadmin_nginx: 成功 - ... 到任务日志
    • api_phpmyadmin_install 接入 on_complete:装完 apt 自动调 setup_phpmyadmin_nginx
    • api_phpmyadmin_status 多维检查:installed = sw_installed AND files_exist AND nginx_ok,返回详细字段方便排查
    • 前端 _pollPhpMyAdminReady(maxSeconds):装完轮询 status 直到 nginx_ok=true(最多 30s),超时提示用户

    [1.3.9] - 2026-06-06(super release)

    🐛 修复

    • 登录后必须强制刷新才能看到后台:showLogin() 之前用 document.body.innerHTML = '...' 把后台骨架整个重写,导致 initApp() → setupNav() 找不到 .nav-item[data-page],loadDashboard() 静默失败。改为 display 切换两个独立 div(#loginScreen / #appShell)。

    ✨ 新增

    • 仪表盘显示 CPU 核心数:os.cpu_count()
    • 仪表盘显示 CPU 型号:4 级兜底(lscpu → /proc/cpuinfo → platform.processor() → "Unknown CPU")
    • 负载颜色按核心数判断:1 核机器 1.0 算满,N 核机器 N.0 才算满
      • load/cores > 0.8 → 红色
      • load/cores > 0.5 → 黄色
      • 否则 → 蓝色

    🔧 内部(继承自 v1.3.8)

    • install.sh 自动安装 MariaDB + 配置 sudoers
    • system.py create_mysql_db 改用 sudo + list 参数 + regex 校验(防 SQL 注入)
    • PHP-FPM 改用 TCP 127.0.0.1:9000
    • install.sh 自动安装并启动 PHP-FPM
    • systemd ExecStart 传端口参数
    • 创建 /etc/nginx/tpanel 并授权 tpanel 用户
    • 修复解压步骤漏复制根目录 requirements.txt
    • 修复 zip 魔数校验永远失败的 bug

    [1.3.8] - 2026-06-05

    首个稳定可用的"装完就能用"版本。8 个 install.sh 隐藏 bug 全部修复。

    [1.3.0 ~ 1.3.7] - 2026-06-04 ~ 2026-06-05

    迭代修复期,每版修复 1-2 个 install.sh 问题。

    [1.0.0] - 2026-06-04

    首发版本。站点 CRUD、MySQL 数据库、Let's Encrypt SSL、本地备份、系统安全更新。

    Downloads
  • v1.3.2 ace8dc8b5c

    TPanel v1.3.2 Stable

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

    TPanel v1.3.2 发布说明

    🐛 紧急修复

    install.sh: zip 魔数校验永远失败

    症状:在干净的 VPS 上 bash install.sh 总是卡在 [3/8] 下载源码 一步,5 个下载源全部报"下载到的东西不是 zip(可能 404 HTML)"。

    真相:实际上 5 个下载源的文件全部都是合法 zip——是 install.sh 里的检测函数有 bug:

    # 旧版(坏的)
    if head -c 4 "$TMP_ZIP" | grep -q "PK\x03\x04"; then
    

    grep 默认按行匹配,\x03\x04 不会被解析成 0x03/0x04 字节——它只认 \n、\t 这类。所以这段代码要找的是字面字符串 "PK\x03\x04"(10 个字符),永远匹配不上 4 字节的 PK\x03\x04。

    5 个源里的 zip 文件全部是合法的,但因为校验函数错把 4 字节 zip 头当 404 HTML 拒了,所以 install 永远走不到解压那一步。

    新版本(v1.3.2 修复):

    is_valid_zip() {
      local file="$1"
      [ -f "$file" ] || return 1
      local magic
      magic=$(od -An -tx1 -N4 "$file" 2>/dev/null | tr -d ' \n')
      [ "$magic" = "504b0304" ]
    }
    

    用 od 把前 4 字节转成 16 进制字符串再比较,稳。

    📦 安装

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

    或用官网镜像:

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

    🔄 升级步骤(从 v1.3.1)

    1. 重跑 bash install.sh(会保留 /opt/tpanel 下的现有数据)
    2. 或者只替换 install.sh 后重装:wget -O install.sh https://tpanel.cn/install.sh && bash install.sh

    ⚠️ 兼容性

    • 100% 向后兼容 v1.3.1 数据
    • 不需要重启服务
    • 源码包大小:47KB(v1.3.1)→ 47KB(v1.3.2,差几十字节)

    🙏 致谢

    感谢在生产服务器上跑了 5 遍 install.sh 的兄弟——bug 是被你逼出来的 😅


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

    Downloads
  • v1.3.33 ace8dc8b5c

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

    [1.3.21] - 2026-06-07

    🐛 修复(端到端续测发现)

    • api/cron/run 同步调用 run_security_update 锁 5+ 分钟:apt-get upgrade 可能跑 1-10 分钟不返回,让用户点 cron/run 后整个面板无响应。修法:走任务流,跟 /api/security/update 一样返回 task_id。
    • run_security_update 第二步裸调 apt-get upgrade 无 sudo:dpkg lock 是 root 拥有,tpanel 调裸调永远 Permission denied。修法:加 sudo。
    • api_ssl_apply 写 /etc/nginx/sites-available 失败:v1.3.11 只改 system.py,ssl_manager.py:apply_letsencrypt 还是 with open(conf_path, 'w') 裸调。修法:写 /tmp + sudo mv。
    • api_ssl_apply 清理软链裸调 os.remove 失败:同上。修法:sudo rm -f。
    • certbot 裸调 写 /var/log/letsencrypt 失败:certbot 要 root。修法:加 sudo + sudoers 加 /usr/bin/certbot。

    ✨ 新增

    • api/settings PUT 同步写 sqlite settings(v1.3.19 候选):之前 PUT 写 tpanel.conf JSON 文件,但 get_panel_domain() 从 sqlite settings 表读,两者不同步→ 改 panel_domain 后 check_panel_domain 永远不生效。修法:PUT 时双写。

    [1.3.20] - 2026-06-07

    🐛 修复

    • file_manager.chmod_file 权限值不识别(mode & 0o777 判断太严):前端传 755 实际是十进制 755 ≠ 0o755,列表里没有。修法:接受 755/644 字符串,转成 0o755/0o644。

    [1.3.19] - 2026-06-07

    🐛 修复

    • api/settings PUT 双重存储 bug:put 写 tpanel.conf,get_panel_domain 读 sqlite settings,两边对不上。修法:PUT 时双写。

    [1.3.18] - 2026-06-07

    ✨ 新增

    • api/auth/change-password 改管理员密码 API(v1.3.18 新增):POST 接口,验证旧密码 + bcrypt 新密码 + 写 security_log。表单中密码 < 6 位拒绝。改完所有现存 token 仍然有效(不重生成),用户需重新登录。

    [1.3.17] - 2026-06-07

    🐛 修复(103.233.254.197 端到端测试发现)

    • api_backups_create 用 conn3.lastrowid 报 AttributeError:v1.3.10 时代遗留——应该用 cur3.lastrowid(Cursor 对象才有 lastrowid,Connection 没有)。结果返回 500 但备份实际成功。
    • api_backups_restore 报 PermissionError:tpanel 用户用 shutil.copy2 覆盖 root 拥有的文件失败。修法:先 sudo mv site_path site_path.bak.<ts>,再解压到临时目录,sudo mv 回来,sudo chown 给站点用户。
    • restore_backup 用 time.time() 没 import time:上一条修复引入的新 bug。补 import time。
    • /api/cron/run 命名误导:实际是「安全更新 + SSL 续期」不是跑 cron job。前端调用时要注意。

    ⚠️ 已知未实现(v1.3.18 候选)

    • 改密码 API 不存在:api/auth/change-password 报 405。代码里没实现。
    • 文件 API path 语义模糊:site_path 已含 /public,path 参数不该再含 public。需要在 install-test 或文档里明示。

    [1.3.16] - 2026-06-07

    🐛 修复(103.233.254.197 真实建站发现)

    • write_nginx_config 写 fastcgi_pass unix:127.0.0.1:9000 错语法 → 新建站点全 502:
      • v1.3.8 时代把 fpm_sock 从 unix socket 改成了 TCP 127.0.0.1:9000
      • 但 nginx 模板里写死 fastcgi_pass unix:{fpm_sock},拼接后变成 unix:127.0.0.1:9000(语法错)
      • 修法:模板改 fastcgi_pass {fpm_sock}(直接拼 IP:port)
      • 所有已建站点的 conf 需手动 sed -i 's|fastcgi_pass unix:127.0.0.1:9000|fastcgi_pass 127.0.0.1:9000|' /etc/nginx/sites-enabled/<domain>.conf

    ✨ 新增

    • tpanel-push.py 远程推送工具(v1.3.15+) + install.sh 加 detect + docs 同步

    [1.3.15] - 2026-06-07

    🐛 修复(103.233.254.197 真实装机发现)

    • write_nginx_config 写 /etc/nginx/sites-available 失败 → PermissionError:v1.3.11 只改了 system.py 里的 chown/nginx -s reload,「写 conf」这段是用 with open(conf_path, 'w') 不是 _run() 所以 static-check 没扫到。新建站点必 500。
    • remove_nginx_config 删 /etc/nginx/sites-{available,enabled}/.conf 失败:同上,os.remove 裸调。
    • sudoers 漏 /usr/bin/mv / rm / ln / tee / cp / mkdir / dpkg:v1.3.14 补了 useradd/nginx/systemctl,但没考虑 write_nginx_config 改成 sudo mv 后需要 mv 授权。
    • DEBIAN_FRONTEND=noninteractive 被 sudo 拒绝 setenv:api_phpmyadmin_install 用 ['sudo', 'DEBIAN_FRONTEND=noninteractive', 'apt-get', ...],sudo 默认不允许设置环境变量,apt 装 phpmyadmin 会问交互。修法:改用 apt-get -o Dpkg::Options::=--force-confdef -o Dpkg::Options::=--force-confnew(无需设环境变量)。
    • api_security_update 用 sudo bash -c 'apt-get update -y && apt-get upgrade -y':bash 不在 sudoers 授权里,apt-get update 会要密码。修法:拆成两 步只调 apt-get(后续可以加 upgrade cron)。

    ✨ 新增

    • tpanel-push.py 远程推送工具(v1.3.15 开发用):本地文件 base64 后通过 SSH stdin 推到 VPS,自动验证 md5

    [1.3.14] - 2026-06-07

    🐛 修复

    • ssl_manager.py 裸调 nginx -t / nginx -s reload(static-check 发现):v1.3.11 只改了 system.py 里的 nginx 调用,ssl_manager.py 漏改。新装机器走 SSL 申请路径时也会要密码。

    ✨ 新增

    • tpanel-static-check.py 静态分析工具(v1.3.14 核心):
      • 扫双向闭环:系统调用 vs sudoers 授权、前端 API vs 后端路由、import 模块存在性、版本号一致性
      • 不靠真装机就能抱 80% 装完才暴露的 bug
      • 在本机上跑:python3 tpanel-static-check.py /path/to/source/
      • 5 节检查:1. 高危命令 _run 裸调 / 2. sudoers 双向闭环 / 3. 前端 API 路由 / 4. import 模块存在 / 5. 版本号一致性 / 6. Nginx 端口 / 7. on_complete 钩子函数存在 / 8. phpMyAdmin 反代路径探测 / 9. Nginx SSE location / 10. sudoers !requiretty
      • 凑够以上 10 项检查后,v1.3.14 在 static-check 下 0 CRITICAL 过
      • 提供 run-static-check.sh 入口脚本,发布前必跑

    [1.3.13] - 2026-06-07

    ✨ 新增

    • tpanel-install-test.sh 装完自检脚本:
      • 6 节自检:系统基本 / sudoers NOPASSWD / Nginx SSE 配置 / phpmyadmin 反代 / 端到端 API / 服务健康
      • 覆盖 v1.3.10~v1.3.12 三轮所有「装完才暴露」的问题
      • 在干净容器里能 sudo bash tpanel-install-test.sh --with-install 跑完整 install + 自检
      • 装完同一台机器直接跑:3 分钟出报告,错哪一项明说 + 修哪的脚本

    🐛 修复

    • sudo NOPASSWD 没生效 → sudo: a terminal is required to read the password(用户装机实测发现):v1.3.11 硬编码 /usr/sbin/useradd 等路径,但不同发行版路径不同(Debian minimal 可能是 /sbin/useradd、CentOS 是 /usr/sbin/useradd),且某些镜像有 Defaults requiretty 全局设置,后台 systemd 服务调用 sudo 会被挡住要密码。
    • 修法(v1.3.13+):
      • install.sh 用 command -v 动态探测 useradd/userdel/usermod/chown/chmod/nginx/systemctl 真实路径
      • sudoers 文件开头加 Defaults:tpanel !requiretty 关键声明
      • 加 visudo -c -f 语法验证(v1.3.13 之前完全没验证)
      • 加 NOPASSWD 实跑测试:装完立刻 sudo -u tpanel sudo -n useradd ... 试一次,失败时 warn 提示用户
      • 提供 tpanel-fix-sudo.sh 紧急补丁脚本,老用户一键修复

    [1.3.12] - 2026-06-07

    🐛 修复

    • 软件安装 / 安全更新 SSE 流 “连接断开”(用户全新装机实测发现):apt install/upgrade 静默 30s+ 是常态,phpMyAdmin 装 1-3 分钟也是常态,Nginx 默认 proxy_read_timeout 60s 会在静默期到点后主动断开代理,浏览器 EventSource 看到 连接断开。
    • 修法(v1.3.12+):
      • install.sh 的 Nginx 站点配置为 /api/tasks/<id>/stream 加专用 location:proxy_read_timeout 1800s + proxy_send_timeout 1800s + proxy_buffering off + proxy_cache off + X-Accel-Buffering: no,后端 SSE 循环上限 30 分钟
      • 提供 tpanel-fix-sse.sh 紧急补丁脚本,老用户可一键修复(不动 tpanel 服务,只 reload nginx)

    [1.3.11] - 2026-06-07

    🐛 修复

    • 新建站点提示 useradd: Permission denied + cannot lock /etc/passwd(用户全新装机实测发现):v1.3.10 的 install.sh 只为 mysql 授权了 sudoers(/etc/sudoers.d/tpanel-mysql),但 system.py 中 useradd / userdel / chown / chmod / nginx -s reload 全是裸调,tpanel 用户根本没权限。新建站点第一步创建系统用户就 100% 失败。
    • 修法(v1.3.11+):
      • install.sh 新增 /etc/sudoers.d/tpanel-admin,授权 NOPASSWD 跑 useradd/userdel/usermod/chown/chmod/nginx/systemctl(/usr/sbin/ + /usr/bin/ 都列上,Debian/CentOS 路径不同)
      • system.py 全面加 sudo 前缀:create_site_user / delete_site_user / set_site_permissions / write_nginx_config(nginx -t + reload)/ remove_nginx_config(reload)/ nginx_stop / nginx_start / 系统安全更新(apt-get update)
      • systemctl is-active 保持裸调(查询不需要 root)

    [1.3.10] - 2026-06-07

    🐛 修复

    • phpMyAdmin 装完无反代 → 点 🐘 永远 confirm 死循环:v1.3.10 装完 phpMyAdmin 后没有自动写 Nginx 8443 反代配置,导致 /api/phpmyadmin/status 永远返回 nginx_ok=false,前端 setTimeout(..., 1000) 跳走再调 status 又触发 confirm。

    ✨ 新增

    • task_manager.create_task 支持 on_complete 钩子(v1.3.10 新机制)
      • 签名:on_complete(task_id, status),任务结束(success/failed)后回调
      • 用途:实现"装完 X 自动配 Y"的联动
      • 异常路径也会调用,让钩子自己判断
    • task_manager.setup_phpmyadmin_nginx()(v1.3.10 新增)
      • 自动探测 phpMyAdmin 实际路径(/usr/share/phpmyadmin 或 /usr/share/phpmyadmin/htdocs)
      • 写 /etc/nginx/sites-enabled/phpmyadmin.conf(用 sudo mv 临时文件,安全)
      • 包含安全加固(屏蔽 /libraries、/setup/frames、/sql)
      • nginx -t 验证 + systemctl reload nginx(失败 fallback 到 restart)
      • 失败时把错误追加到任务日志
      • 成功时打印 setup_phpmyadmin_nginx: 成功 - ... 到任务日志
    • api_phpmyadmin_install 接入 on_complete:装完 apt 自动调 setup_phpmyadmin_nginx
    • api_phpmyadmin_status 多维检查:installed = sw_installed AND files_exist AND nginx_ok,返回详细字段方便排查
    • 前端 _pollPhpMyAdminReady(maxSeconds):装完轮询 status 直到 nginx_ok=true(最多 30s),超时提示用户

    [1.3.22] - 2026-06-08

    修复

    • 手机端登录后看不到左侧导航(v1.3.21 时代的 mobile bug):
      • 根因:CSS @media (max-width: 768px) 直接把 .sidebar 设成 display: none,没有任何打开方式。
      • 修法:
        • 移动端侧边栏改成 fixed + translateX(-100%) 默认隐藏在屏幕外
        • 加 .sidebar.open 类切到 translateX(0) 滑出
        • topbar-left 加 ☰ 汉堡按钮(仅 < 769px 显示)
        • 加 .sidebar-backdrop 黑色半透明遮罩(仅 < 769px 显示),点遮罩关闭
        • 新增 toggleSidebar() / closeSidebar() JS 函数
        • setupNav 切页时自动 closeSidebar()(移动端体验)
        • 顺带:topbar 在移动端 padding 收紧、h1 字号缩小、隐藏非必要按钮
      • 验证:Python/JS 语法过;zip 魔数 50 4b 03 04 验过;md5=c85eed59376080dfd7bef4d6c8c1fc47

    [1.3.23] - 2026-06-08

    修复

    • phpMyAdmin 登录 URL 错用 127.0.0.1(用户实测发现):
      • 现象:🐘 按钮点开后跳到 http://127.0.0.1:8443/,从手机/外网根本访问不到
      • 根因:api_phpmyadmin_status 用 socket.gethostbyname(socket.gethostname()) 拿"本机 IP",但大多数 VPS 上 hostname 没在 /etc/hosts 里映射到公网 IP,所以拿到的就是 127.0.0.1
      • 修法(host 取值优先级):
        1. 优先用 get_panel_domain()(用户配置的 panel_domain)
        2. fallback 用 request.host 拆出的 hostname(用户当前怎么访问面板就用什么)
        3. 最后才用本机非 loopback IP / 127.0.0.1
      • 顺带:前端 confirm 文案从"IP 直访"改成"面板当前访问地址"
    • 验证:Python/JS 语法过;逻辑路径走查 3 个分支

    [1.3.24] - 2026-06-08

    修复

    • SSL 证书申请 403 / "Some challenges have failed"(用户实测发现):
      • 现象:申请 zhangpu.tech SSL 失败,certbot 报 status: 403
      • 根因(隐藏很深):
        • create_site 里 site_user = domain.replace('.', '_') → 建站目录叫 zhangpu_tech
        • 但 ssl_manager.apply_letsencrypt 硬编码 site_path = f'/opt/tpanel/sites/{domain}/public'(用原域名 zhangpu.tech)
        • certbot 写 challenge 到 zhangpu.tech/public/.well-known/...(那个目录是空的)
        • nginx root 指向 zhangpu_tech/public(下划线版)
        • LE 服务器拉 http://zhangpu.tech/.well-known/... 时,nginx 找的是下划线目录 → 404/403
      • 修法:新增 _get_real_site_path(domain, site_id) 查 sqlite 拿 sites.site_path 真实值;apply_letsencrypt / deploy_ssl 都改用它;找不到时 fallback 硬编码路径
    • 验证:Python 语法过;md5=2e1906c95a09882bacfb615c9b169bbc

    [1.3.25] - 2026-06-08

    修复

    • SSL 申请返回"证书文件未生成"(用户实测发现):
      • 现象:v1.3.24 修复了 .well-known 路径错误,certbot 实际申请成功了(/etc/letsencrypt/live/zhangpu.tech/ 有证书),但 TPanel 报"证书文件未生成"
      • 根因:apply_letsencrypt 给 certbot 传了 --cert-path /opt/tpanel/ssl/zhangpu.tech/fullchain.pem,但 certbot 不完全遵守这些参数(写到默认位置),TPanel 去 /opt/tpanel/ssl/ 检查时找不到
      • 修法 1(certbot 命令):去掉 --cert-path / --key-path / --chain-path,让 certbot 写默认位置 /etc/letsencrypt/live/<domain>/
      • 修法 2(cert_path 取值):apply_letsencrypt / deploy_ssl 都改为从 /etc/letsencrypt/live/<domain>/fullchain.pem 读
    • 新增:SSL 申请进度框(用户要求):
      • 旧版:apply_letsencrypt 同步执行 certbot,30 秒后超时只看到"证书文件未生成"
      • 新版:api_ssl_apply 走 create_task 任务流,前端用 runTaskWithProgress 弹 SSE 进度框
      • 任务命令是 bash 多步脚本:准备 .well-known → 调 certbot → 写部署标记
      • 完成后用 on_complete 钩子自动调 deploy_ssl 写 nginx 443 配置
      • 任务类型: ssl_apply,target: <domain>,避免同域名并发
    • 验证:Python/JS 语法过;md5 校验过

    [1.3.26] - 2026-06-08

    新增

    • 创建站点页面:站点类型选择(用户要求):
      • 新增下拉框"站点类型",选项:
        • 🌐 PHP 动态网站(需要 PHP-FPM)(默认)
        • 📄 纯静态页面(HTML / CSS / JS,不需 PHP)
      • 选静态时自动隐藏 PHP 版本下拉
    • 后端支持 type=static:
      • 不创建 index.php,改写一个好看的 index.html 欢迎页(带"站点已就绪"卡片 + TPanel 链接)
      • nginx 模板跳过 location ~ \.php$ 块(pure static,PHP-FPM 反代关掉)
      • 模板里 index index.html;(不放 index.php 在前)
      • try_files 改成 $uri $uri/ =404;(不再 fallback 到 index.php)
    • DB schema 升级:
      • sites 表加 site_type TEXT DEFAULT 'php' 列(幂等 ALTER,老站点全为 'php')
      • INSERT 语句更新
    • 验证:Python/JS 语法过;md5 校验过

    [1.3.27] - 2026-06-08

    修复

    • 软件市场点安装 → "❌ 连接断开"(用户实测发现):
      • 现象:点 PHP 安装按钮,进度框弹出但立刻提示"❌ 连接断开"
      • 根因 1(致命):/api/tasks/<id>/stream SSE 鉴权返回 401
        • require_auth 只看 Authorization header
        • 浏览器原生 EventSource 不支持自定义 header,只能通过 query string 传 token
        • 前端在 ?token=xxx 传了,但后端不读,401
        • 401 触发 EventSource onerror,前端提示"连接断开"
      • 根因 2(环境问题):VPS 上 dpkg 处于 broken 状态(之前中断过)
        • 日志里看到 E: dpkg was interrupted, you must manually run 'sudo dpkg --configure -a'
        • 所有 apt install 任务都秒失败,task log 立刻有内容 → 任务"成功失败" → 进度框关闭 → 用户看到"连接断开"
      • 修法 1:require_auth 兼容 ?token=(header 优先,query string 兜底)
      • 修法 2:install.sh 第 1 步依赖前加 dpkg --configure -a(幂等:本来健康就几行输出)
      • 现场修复:已在 VPS 上跑过 sudo dpkg --configure -a,状态恢复
    • 验证:Python/JS 语法过;SSE 401 问题将因 require_auth 兼容 query string 而消失

    [1.3.28] - 2026-06-08

    新增

    • 添加 Sury PHP 第三方源(用户要求):
      • 现象:Debian 12 默认只能装 PHP 8.2,老版本(5.6/7.0/7.4/8.0/8.1)和新版(8.3/8.4)都装不了
      • 修法:新增 POST /api/system/add-sury-php 端点,走任务流:
        1. 装 lsb-release / ca-certificates / curl
        2. 下载 https://packages.sury.org/debsuryorg-archive-keyring.deb GPG keyring
        3. dpkg -i 装 keyring
        4. 写 /etc/apt/sources.list.d/php.list(用 signed-by 信任新 keyring)
        5. apt update(30-90s)
      • 幂等检查:源文件已存在就报错不再跑;同类型任务防并发
      • 前端软件市场页面:右上角加"➕ 添加 Sury PHP 源"按钮,走同样的 SSE 进度框
    • 加完后:PHP 5.6 / 7.0 / 7.4 / 8.0 / 8.1 / 8.3 / 8.4 都能装
    • 验证:Python/JS 语法过

    [1.3.29] - 2026-06-08

    新增

    • 多 PHP 版本 FPM 端口隔离(用户要求):
      • 旧问题:所有 PHP-FPM 都硬编码 127.0.0.1:9000,多版本并存时只能最后启动的抢到端口
      • 修法:
        1. 端口映射 get_php_fpm_port(php_version):
          • PHP 5.6 → 9056
          • PHP 7.0 → 9070
          • PHP 7.4 → 9074
          • PHP 8.0 → 9080
          • PHP 8.1 → 9081
          • PHP 8.2 → 9000(保持向后兼容老 conf)
          • PHP 8.3 → 9083
          • PHP 8.4 → 9084
        2. write_nginx_config 根据 php_version 写对应端口的 fastcgi_pass
        3. setup_php_fpm_listen(php_version) 新函数:备份 www.conf → 改 listen → enable → restart → 验证监听
        4. api_software_install 装 PHP 时用 on_complete 钩子自动调 setup_php_fpm_listen
        5. 新端点 POST /api/system/rewrite-all-nginx 批量重写所有站点 conf(按 db 当前 php_version 字段用对应端口)
    • 验证:Python 语法过;端口映射 8 个版本全部正确

    [1.3.30] - 2026-06-08

    修复

    • 后台页面背景默认黑色 → 改成白色(用户要求):
      • 把默认主题从深色(#0a0e1a)改成浅色(#f8fafc),文本从浅灰改成深色
      • 侧边栏保持深色 #0f172a(保证白色背景下的对比度)
      • 顶栏用新变量 --topbar-bg(亮色:白;暗色:深色)
      • topbar 背景从 var(--sidebar-bg) 改到 var(--topbar-bg, var(--card))(向后兼容)
    • 右上角加主题切换按钮(用户要求):
      • topbar-right 加 🌙/☀️ 按钮
      • JS:toggleTheme() 切 :root.dark class + 写 localStorage + 切换图标
      • initTheme() 页面加载时读 localStorage 恢复偏好
      • mobile 端 .topbar-right .topbar-btn:not(.red) 之前会隐藏所有非红按钮,新增例外 #themeToggle 在 mobile 仍可见
    • static-check.py 升级 v2.0(用户要求):
      • 新增 4 项检查(11-14),覆盖 v1.3.29 时代新出现的"双向闭环"模式:
        • 11. PHP-FPM 端口三向闭环:get_php_fpm_port / write_nginx_config / setup_php_fpm_listen / import 关系
        • 12. 裸调 with open(/etc/...) 写系统目录:扫所有 py 文件,命中即 CRITICAL
        • 13. on_complete 钩子函数必须定义:过滤 None / on_complete 关键字
        • 14. 多 PHP 版本 listen 端口冲突:从 catalog 抓所有版本,模拟跑端口映射
      • 修 3 个误报:on_complete=hook 跳过关键字;端口提取过滤空 ".";新加 defaultdict import
      • 跑出新 bug:catalog 缺 php8.4,已补全
      • 跑 v1.3.30 源码:14 项检查全过(0 CRITICAL)

    [1.3.31] - 2026-06-09

    修复

    • 左侧边栏背景改白色(用户要求):
      • 新增 sidebar 专属颜色变量:--sidebar-bg / --sidebar-text / --sidebar-text-dim / --sidebar-hover / --sidebar-border
      • 亮色主题:白底深字
      • 暗色主题(点 🌙):保持原深色(#0f172a)
      • 配套:mobile .hamburger-btn:hover 修原 rgba(255,255,255,0.05) 在白底看不见的 bug
      • install.sh 升级 v1.3.31
    • 教训:「用户想用就行」与「自动解耦」——直接用变量 + 暗色主题兜底,最简洁

    [1.3.32] - 2026-06-09

    修复

    • v1.3.31 发布失败,deploy 脚本没真跑(SSH 拦截 + 用户没察觉)
    • 侧边栏强制白色 !important 保险(与主题变量解耦):
      • .sidebar 写死 background: #ffffff !important
      • .sidebar-logo span / .nav-item / .nav-section / .sidebar-footer .version 全部 !important
      • 暗色主题下 sidebar 保持白色——用户既定的「白」最重要
    • 清理 :root / :root.dark 里 5 个新增的 sidebar 变量(用不上了)

    [1.3.33] - 2026-06-09

    修复

    • CPU 型号显示 "Unknown CPU" bug(用户装机实测发现,v1.3.10 时代就有的隐藏 bug):
      • 根因:backend/system.py:388 _run("lscpu | grep 'Model name' | head -1") 缺 shell=True
      • 默认 shell=False + 字符串命令 → cmd.split() 拆成 ["lscpu", "|", "grep", ...] 当成 lscpu 的参数列表,lscpu 不知道怎么处理,返回空 → 走到兜底 Unknown CPU
      • 单跑 lscpu | grep ... 命令能拿到的,但 _run 调不行
      • 修法:补 shell=True
      • 验证:VPS 实测 Intel(R) Xeon(R) Platinum 8255C CPU @ 2.50GHz ✅
    • 教训:所有带 | / && / ; 的 _run 字符串参数,必须显式 shell=True,要么改用列表参数
    Downloads
  • v1.3.35 ace8dc8b5c

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

    TPanel v1.3.35 发布说明

    🎉 新增:文件管理 - 一键修改权限

    之前后端 API 早就在了(/api/files/chmod),但前端没接按钮。现在补上。

    使用方法

    1. 打开 TPanel → 文件管理 → 选择站点
    2. 在任意文件/目录行末,点 🔐 按钮(位于 ✏️ 编辑和 🗑️ 删除之间)
    3. 弹窗显示当前权限 + 6 个常用预设 + 自定义输入
    4. 选择/输入权限值 → 点「应用」

    支持的权限值(白名单,后端强制)

    值 含义 适用场景
    755 rwxr-xr-x 目录(推荐)
    644 rw-r--r-- 静态文件、网页文件
    600 rw------- 配置文件(仅所有者可读写)
    700 rwx------ 脚本/可执行文件
    775 rwxrwxr-x 组内共享
    664 rw-rw-r-- 组内可写文件

    ⚠️ 不允许 777(世界可写) — 后端白名单制,故意禁止。
    如确需 777,可联系作者加白。

    实时预览

    输入 755 时显示:755 = rwxr-xr-x (7=所有者 7=组 7=公共)
    输入错误值时红色提示。

    适用场景

    • 装 zblog / wordpress / typecho 时 zb_users/c_option.php 写不进
    • 装 ownCloud / NextCloud 需要 755 目录权限
    • 自定义脚本需要 700 防止他人读
    • 任何"SSH 进去手动 chmod"的活,现在 TPanel 点一下就行

    🔧 改动范围

    只改了一个文件:

    frontend/index.html   +187 行(弹窗 DOM + 5 个 JS 函数)
    

    后端 backend/main.py + backend/file_manager.py 完全没动(chmod API 早就在了)。


    📦 文件清单

    • tpanel-v1.3.35-source.zip (68KB) — 完整源码包
    • install.sh (16KB) — 一键安装脚本(v1.3.30 起未变,沿用)
    • 本文档

    🚀 升级方法

    # 1. 备份
    cd /opt/tpanel
    cp frontend/index.html frontend/index.html.bak.v1334
    
    # 2. 解压新源码
    unzip -o tpanel-v1.3.35-source.zip
    cp tpanel-v1.3.34-pkg/frontend/index.html frontend/index.html
    chown tpanel:tpanel frontend/index.html
    
    # 3. 重启服务
    systemctl restart tpanel
    
    # 4. 浏览器 Ctrl+Shift+R 硬刷
    

    ⚠️ 安全说明

    • 后端权限白名单制,777 故意禁止(防止误操作把网站目录设成世界可写)
    • 路径限制:realpath 必须以 /opt/tpanel/sites 开头(chmod_file 函数里写死)
    • 仍需登录认证:@require_auth 装饰器
    • 前端弹窗不影响其他用户

    🐛 已知问题

    无。本次只改前端,没碰后端/数据库/Nginx。


    📝 完整版本历史

    • v1.3.34 (2026-06-10): phpMyAdmin 自动登录 + 数据库密码修改 + /pma/ 路径
    • v1.3.33: sudo NOPASSWD 动态路径探测 + install-test 自检
    • v1.3.32: SSE 连接断开修复(Nginx 1800s timeout)
    • v1.3.30: ...
    • v1.3.35 (2026-06-11): 文件管理权限调整按钮 ⬅️ 当前
    Downloads