-
TPanel v1.3.45 Stable
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
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
install.sh
1 download · 12 KiB
-
tpanel-v1.3.45-source.zip
1 download · 279 KiB
- 症状:在管理员模式下浏览
-
TPanel v1.3.43 Stable
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-passwordAPI - 当前密码校验
- 新密码强度校验(至少 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.shDownloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
install.sh
0 downloads · 12 KiB
-
tpanel-v1.3.43-source.zip
1 download · 91 KiB
-
TPanel v1.3.42 Stable
released this
2026-06-13 16:34:29 +08:00 | -5 commits to main since this release📦 v1.3.42 — 2026-06-14 【正式发布】
重点: 表格错位根治 + 侧边栏跟随主题 + 滚动条淡化 + 日志可读性 + 备份删除 API + 数据库列表过滤面板域名
🐛 关键修复
-
表格错位(数据库 / 网站列表)—— 真正根因
- 之前 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失效、行高错乱、列宽计算异常)
- 之前 v1.3.41 加
-
左侧侧边栏背景跟随主题
- 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 自动跟随
-
滚动条淡化(全局)
- 加
::-webkit-scrollbar+ Firefoxscrollbar-color,宽度 8px,颜色rgba(148,163,184,0.25),hover 升到 0.45 - track 透明,不显示底色槽
- 加
-
安全日志字体重叠
- 原
.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-msgword-break: break-all → break-word(不从单词中间硬切).log-typewidth: 80px → min-width: 100px(长 event_type 不被挤)
- 原
-
数据库列表过滤面板入口域名(v1.3.42 r2)
_detect_panel_domains()检测settings.panel_domain+/etc/nginx/sites-enabled/tpanel的server_name- 网站列表自动隐藏面板域名,避免用户误删
🆕 新功能(合并自 CHANGELOG v1.3.41 草稿)
-
SSL 证书同步 API + 按钮
- 新增
backend/ssl_sync.py(71 行) - 新增
POST /api/ssl/sync:扫描/etc/letsencrypt/live/重建ssl_certs表 - 前端 SSL 页加
🔄 同步证书库按钮 - 适用:apply_letsencrypt 漏写 db / 数据库丢失 / 跨机迁移
- 新增
-
PHP 版本动态下拉
- 新增
GET /api/system/php-versions:返回已装 / 未装 / 支持列表 - 设置页 PHP 下拉框动态填充:已装 ✓、未装灰显
- 选中未装版本时红字提示「⚠️ 新建站点会 502」+ 跳软件市场链接
- 新增
-
删除备份 API
- 新增
DELETE /api/backups/<id>:清理 db 记录 + 物理文件(含_db.sql.gz配套) - 前端备份列表 🗑️ 按钮接通
- 新增
-
shortVer 工具函数
- 缩短长版本号显示:
1:10.11.13-0+deb12u1→10.11.13,5.6.40-100+0~20260514...→5.6.40 - 软件市场列表已应用
- 缩短长版本号显示:
-
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
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
install.sh
0 downloads · 12 KiB
-
tpanel-v1.3.42-source.zip
1 download · 87 KiB
-
-
v1.3.9 (super release) Stable
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
-
Source code (ZIP)
1 download
-
Source code (TAR.GZ)
0 downloads
-
install.sh
0 downloads · 11 KiB
-
tpanel-v1.3.9-source.zip
1 download · 50 KiB
-
TPanel v1.3.8 Stable
released this
2026-06-01 14:09:29 +08:00 | -2 commits to main since this releaseTPanel 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.pyfpm_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 用户根本登不上去
修法:
- install.sh 加
mariadb-server mariadb-client,启动 mariadb - install.sh 写
/etc/sudoers.d/tpanel-mysql让 tpanel 免密 sudo mysql - 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)
- 重新
bash install.sh(会保留/opt/tpanel现有数据) - 首次访问用
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
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
install.sh
0 downloads · 11 KiB
-
tpanel-v1.3.8-source.zip
1 download · 47 KiB
- install.sh ExecStart:
-
TPanel v1.3.1 Stable
released this
2026-06-01 14:09:29 +08:00 | -2 commits to main since this releaseTPanel 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.1Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
install.sh
0 downloads · 9.3 KiB
-
tpanel-v1.3.1-source.zip
1 download · 46 KiB
- install.sh 健壮性大幅提升
-
TPanel v1.3.10 Stable
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: 成功 - ...到任务日志
- 自动探测 phpMyAdmin 实际路径(
- 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
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
install.sh
0 downloads · 12 KiB
-
tpanel-v1.3.10-source.zip
1 download · 62 KiB
- phpMyAdmin 装完无反代 → 点 🐘 永远 confirm 死循环:v1.3.10 装完 phpMyAdmin 后没有自动写 Nginx 8443 反代配置,导致
-
TPanel v1.3.2 Stable
released this
2026-06-01 14:09:29 +08:00 | -2 commits to main since this releaseTPanel 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"; thengrep默认按行匹配,\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)
- 重跑
bash install.sh(会保留/opt/tpanel下的现有数据) - 或者只替换 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
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
install.sh
0 downloads · 8.5 KiB
-
tpanel-v1.3.2-source.zip
1 download · 46 KiB
- 重跑
-
TPanel v1.3.33 Stable
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/settingsPUT 同步写 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/settingsPUT 双重存储 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
- v1.3.8 时代把 fpm_sock 从 unix socket 改成了 TCP
✨ 新增
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紧急补丁脚本,老用户一键修复
- install.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)
- install.sh 的 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)
- install.sh 新增
[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: 成功 - ...到任务日志
- 自动探测 phpMyAdmin 实际路径(
- 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 字号缩小、隐藏非必要按钮
- 移动端侧边栏改成 fixed +
- 验证:Python/JS 语法过;zip 魔数
50 4b 03 04验过;md5=c85eed59376080dfd7bef4d6c8c1fc47
- 根因:CSS
[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 取值优先级):
- 优先用
get_panel_domain()(用户配置的 panel_domain) - fallback 用
request.host拆出的 hostname(用户当前怎么访问面板就用什么) - 最后才用本机非 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 硬编码路径
- 现象:申请 zhangpu.tech SSL 失败,certbot 报
- 验证: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>/streamSSE 鉴权返回 401require_auth只看Authorizationheader- 浏览器原生
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端点,走任务流:- 装 lsb-release / ca-certificates / curl
- 下载
https://packages.sury.org/debsuryorg-archive-keyring.debGPG keyring dpkg -i装 keyring- 写
/etc/apt/sources.list.d/php.list(用signed-by信任新 keyring) 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,多版本并存时只能最后启动的抢到端口 - 修法:
- 端口映射
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
write_nginx_config根据php_version写对应端口的fastcgi_passsetup_php_fpm_listen(php_version)新函数:备份 www.conf → 改 listen → enable → restart → 验证监听api_software_install装 PHP 时用on_complete钩子自动调setup_php_fpm_listen- 新端点
POST /api/system/rewrite-all-nginx批量重写所有站点 conf(按 db 当前php_version字段用对应端口)
- 端口映射
- 旧问题:所有 PHP-FPM 都硬编码
- 验证: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.darkclass + 写 localStorage + 切换图标 initTheme()页面加载时读 localStorage 恢复偏好- mobile 端
.topbar-right .topbar-btn:not(.red)之前会隐藏所有非红按钮,新增例外#themeToggle在 mobile 仍可见
- topbar-right 加
- 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 抓所有版本,模拟跑端口映射
- 11. PHP-FPM 端口三向闭环:
- 修 3 个误报:
on_complete=hook跳过关键字;端口提取过滤空".";新加defaultdictimport - 跑出新 bug:catalog 缺 php8.4,已补全
- 跑 v1.3.30 源码:14 项检查全过(0 CRITICAL)
- 新增 4 项检查(11-14),覆盖 v1.3.29 时代新出现的"双向闭环"模式:
[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
- 新增 sidebar 专属颜色变量:
- 教训:「用户想用就行」与「自动解耦」——直接用变量 + 暗色主题兜底,最简洁
[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
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
install.sh
0 downloads · 16 KiB
-
tpanel-v1.3.33-source.zip
1 download · 92 KiB
-
TPanel v1.3.35: 文件管理权限调 Stable
released this
2026-06-01 14:09:29 +08:00 | -2 commits to main since this releaseTPanel v1.3.35 发布说明
🎉 新增:文件管理 - 一键修改权限
之前后端 API 早就在了(
/api/files/chmod),但前端没接按钮。现在补上。使用方法
- 打开 TPanel → 文件管理 → 选择站点
- 在任意文件/目录行末,点 🔐 按钮(位于 ✏️ 编辑和 🗑️ 删除之间)
- 弹窗显示当前权限 + 6 个常用预设 + 自定义输入
- 选择/输入权限值 → 点「应用」
支持的权限值(白名单,后端强制)
值 含义 适用场景 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
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
install.sh
1 download · 16 KiB
-
tpanel-v1.3.35-source.zip
1 download · 68 KiB
mirror of
https://github.com/zhang-pu/tpanel.git
synced 2026-10-02 16:29:29 +08:00