宝塔面板 PHP 网站管理技能,提供站点创建、删除、启停、PHP 版本切换、域名管理、SSL 证书管理、伪静态管理、数据库管理等功能
宝塔面板 PHP 网站管理技能,提供完整的 PHP 网站生命周期管理功能,包括站点创建、删除、启停、PHP 版本切换、域名管理、SSL 证书管理、伪静态规则配置、数据库管理等。
技能包提供以下图标文件,可在生成报告时引用:
| 文件 | 格式 | 用途 |
|---|---|---|
icon/bt-logo.svg | SVG | 矢量图标,适合缩放 |
本技能用于管理和修改服务器上的 PHP 网站,AI 应遵循以下原则:
执行流程示例:
AI: 我将为您执行以下操作:
1. 创建新站点 example.com
2. 设置 PHP 版本为 8.2
3. 创建关联数据库
正在获取数据,请稍候...
[执行命令]
[展示结果和站点信息]
当前宝塔面板技能包,共包含 3 个相互关联的技能:
| 技能名称 | 描述 | 依赖关系 |
|---|---|---|
| btpanel | 运维监控技能 | ✅ 基础技能,主要用于资源监控、网站状态检查、服务状态检查等 |
| btpanel-files | 文件管理技能 | ✅ 提供远程服务器文件辅助服务,可以读取文件列表和内容 |
| btpanel-phpsite | PHP 网站管理技能 | ✅ 提供远程服务器 PHP 网站管理功能,能够部署和管理php网站 |
**问题 1: 配置文件不存在**
错误:未找到配置文件 解决:运行 python3 bt-config.py add 添加服务器配置
**问题 2: WordPress 部署失败**
错误:无法下载或解压文件 解决:确保 btpanel-files 技能已安装,提供文件操作能力
**问题 3: PYTHONPATH 未设置**
```bash
# 运行脚本前需要设置
export PYTHONPATH=/path/to/btpanel-skills/src:$PYTHONPATH
# 检查 bt_common 模块
python3 -c "from bt_common.bt_client import BtClient; print('✅ 模块正常')"
# 检查配置文件
ls -la ~/.openclaw/bt-skills.yaml
# 测试站点管理
python3 {baseDir}/scripts/site.py list --server "你的服务器名"
# 测试文件管理(WordPress 部署需要)
python3 {baseDir}/../btpanel_files/scripts/download.py --help
# 1. 检查所有技能目录
ls -la /path/to/btpanel-skills/src/
# 应包含:btpanel/ btpanel_files/ btpanel_phpsite/ bt_common/
# 2. 检查配置文件
cat ~/.openclaw/bt-skills.yaml
# 3. 测试完整流程(WordPress 部署)
python3 {baseDir}/scripts/site.py add -n "test.com:8080" --create-db --server "你的服务器名"
python3 {baseDir}/../btpanel_files/scripts/download.py --url "https://example.com/file.zip" --path "/tmp" --server "你的服务器名"
重要: 没有服务器信息时需要先添加
本技能复用 btpanel 技能的配置系统,使用 bt-config.py 工具管理服务器:
# 查看帮助
python3 {baseDir}/scripts/bt-config.py -h
# 添加服务器
python3 {baseDir}/scripts/bt-config.py add -n prod-01 -H https://panel.example.com:8888 -t YOUR_TOKEN
# 列出服务器
python3 {baseDir}/scripts/bt-config.py list
# 删除服务器
python3 {baseDir}/scripts/bt-config.py remove prod-01
获取 API Token 的方法:
重要提示 - SSL 证书验证配置: 添加服务器时,AI 应询问用户:
"您的宝塔面板是否使用了受信任的 SSL 证书(如 Let's Encrypt、商业 CA 证书)?"
--verify-ssl false 参数示例:
# 自签名证书场景
python3 {baseDir}/scripts/bt-config.py add -n prod-01 -H https://panel.example.com:8888 -t YOUR_TOKEN --verify-ssl false
# 受信任证书场景(默认)
python3 {baseDir}/scripts/bt-config.py add -n prod-01 -H https://panel.example.com:8888 -t YOUR_TOKEN
当用户需要创建新的 PHP 网站时:
# 创建基础 PHP 站点
python3 {baseDir}/scripts/site.py add -n example.com -p /www/wwwroot/example.com -v 82
# 创建站点并关联数据库
python3 {baseDir}/scripts/site.py add -n example.com -v 82 --create-db --db-user example_user --db-password "SecurePass123"
# 创建站点并同时创建 FTP
python3 {baseDir}/scripts/site.py add -n example.com -v 82 --create-ftp --ftp-user ftpuser --ftp-password "FtpPass123"
用户意图识别:
site.py addsite.py addsite.py add --create-db当用户需要查看网站列表或状态时:
# 查看所有站点
python3 {baseDir}/scripts/site.py list
# 查看站点详情
python3 {baseDir}/scripts/site.py info -n example.com
# 查看已安装的 PHP 版本
python3 {baseDir}/scripts/php.py versions
# 查看站点的 PHP 版本
python3 {baseDir}/scripts/php.py get -n example.com
用户意图识别:
site.py listsite.py list 或 site.py infophp.py versions当用户需要修改站点的 PHP 版本时:
# 切换站点 PHP 版本
python3 {baseDir}/scripts/php.py set -n example.com -v 82
# 切换为纯静态站点
python3 {baseDir}/scripts/php.py set -n example.com --static
用户意图识别:
php.py set -v 82php.py set -v 74php.py set --static当用户需要临时停用或启用网站时:
# 停用网站
python3 {baseDir}/scripts/site.py stop -n example.com
# 启用网站
python3 {baseDir}/scripts/site.py start -n example.com
用户意图识别:
site.py stopsite.py startsite.py stop当用户需要删除网站时:
# 删除网站(保留文件和数据库)
python3 {baseDir}/scripts/site.py delete -n example.com
# 删除网站并删除文件目录
python3 {baseDir}/scripts/site.py delete -n example.com --delete-path
# 删除网站并删除关联数据库
python3 {baseDir}/scripts/site.py delete -n example.com --delete-db
# 完全删除(网站 + 文件 + 数据库+FTP)
python3 {baseDir}/scripts/site.py delete -n example.com --delete-path --delete-db --delete-ftp
用户意图识别:
site.py deletesite.py delete --delete-path --delete-db重要:删除操作不可逆,必须先向用户确认并提醒备份。
当用户需要添加或删除绑定域名时:
# 查看站点域名列表
python3 {baseDir}/scripts/domain.py list -n example.com
# 添加域名
python3 {baseDir}/scripts/domain.py add -n example.com -d www.example.com
# 添加多个域名
python3 {baseDir}/scripts/domain.py add -n example.com -d test.example.com,www2.example.com
# 删除域名
python3 {baseDir}/scripts/domain.py delete -n example.com -d www.example.com
用户意图识别:
domain.py adddomain.py adddomain.py delete当用户需要配置 SSL 证书时:
# 查看 SSL 证书信息
python3 {baseDir}/scripts/ssl_cert.py info -n example.com
# 上传 SSL 证书
python3 {baseDir}/scripts/ssl_cert.py upload -n example.com --key /path/to/key.pem --cert /path/to/cert.pem
# 申请免费证书
python3 {baseDir}/scripts/ssl_cert.py apply -n example.com -d example.com,www.example.com
# 开启强制 HTTPS
python3 {baseDir}/scripts/ssl_cert.py https -n example.com --enable
# 关闭强制 HTTPS
python3 {baseDir}/scripts/ssl_cert.py https -n example.com --disable
# 关闭 SSL
python3 {baseDir}/scripts/ssl_cert.py close -n example.com
用户意图识别:
ssl_cert.py infossl_cert.py uploadssl_cert.py applyssl_cert.py https --enableLet's Encrypt 免费证书申请条件:
方式 A: HTTP 文件验证(推荐)
方式 B: DNS 验证
错误 1: 使用 IP 地址申请
❌ 错误:申请 IP 地址 192.168.69.172 的证书
✅ 正确:必须使用域名,如 example.com
错误 2: 域名未解析到服务器
❌ 错误:域名解析到其他服务器
✅ 正确:域名必须解析到当前服务器 IP
错误 3: 80 端口被阻止
❌ 错误:防火墙阻止 80 端口
✅ 正确:开放 80 端口用于 HTTP 验证
错误 4: 内网域名申请
❌ 错误:申请 inner.local 等内网域名
✅ 正确:使用公网可访问的域名
错误 5: DNS 验证未配置
❌ 错误:使用 DNS 验证但未配置 DNS 服务商 API
✅ 正确:先在面板中配置 DNS 服务商 API 凭证
# 1. 检查域名解析
ping example.com
# 应该解析到服务器 IP
# 2. 检查 80 端口
curl -I http://example.com
# 应该能正常访问
# 3. 绑定域名到站点
python3 {baseDir}/scripts/domain.py add -n example.com -d example.com
# 4. 验证网站访问
curl http://example.com
# 应该返回正常内容
# 步骤 1: 绑定域名
python3 {baseDir}/scripts/domain.py add -n example.com -d example.com,www.example.com
# 步骤 2: 申请证书(HTTP 验证)
python3 {baseDir}/scripts/ssl_cert.py apply -n example.com -d example.com,www.example.com
# 步骤 3: 开启强制 HTTPS
python3 {baseDir}/scripts/ssl_cert.py https -n example.com --enable
# 步骤 4: 验证证书
python3 {baseDir}/scripts/ssl_cert.py info -n example.com
提示用户话术:
"申请免费 SSL 证书需要满足以下条件:
- 使用域名(不能用 IP 地址)
- 域名已解析到当前服务器
- 80 端口开放(HTTP 验证方式)
- 如果是通配符证书或在宝塔购买了域名,可以使用 DNS 验证方式
- DNS 验证需要先在面板配置 DNS 服务商 API 凭证
请问您的域名是否已解析到当前服务器?"
日志路径: /www/server/panel/logs/letsencrypt.log
查看日志方法:
# 手动查看
tail -50 /www/server/panel/logs/letsencrypt.log
# 或使用脚本(申请失败时自动查看)
python3 {baseDir}/scripts/ssl_cert.py apply -n example.com -d example.com
申请失败时:
常见日志错误:
Connection refused - 80 端口未开放或域名未解析Invalid domain - 域名格式错误DNS verification failed - DNS 验证失败(检查 API 配置)Rate limit exceeded - 达到申请频率限制(等待一段时间)当用户需要配置伪静态规则时:
# 查看伪静态模板列表
python3 {baseDir}/scripts/rewrite.py list -n example.com
# 查看当前伪静态规则
python3 {baseDir}/scripts/rewrite.py get -n example.com
# 应用 WordPress 伪静态规则
python3 {baseDir}/scripts/rewrite.py set -n example.com -t wordpress
# 应用 ThinkPHP 规则
python3 {baseDir}/scripts/rewrite.py set -n example.com -t thinkphp
# 自定义伪静态规则
python3 {baseDir}/scripts/rewrite.py set -n example.com --custom "location / { try_files $uri $uri/ /index.php?$query_string; }"
用户意图识别:
rewrite.py setrewrite.py set -t wordpressrewrite.py get当用户需要管理 MySQL 数据库时:
# 查看数据库列表
python3 {baseDir}/scripts/database.py list
# 查看数据库详情
python3 {baseDir}/scripts/database.py info -d example_db
# 创建数据库
python3 {baseDir}/scripts/database.py add -n example_db -u example_user -P "SecurePass123"
# 修改数据库密码
python3 {baseDir}/scripts/database.py password -d example_db -P "NewPass123"
# 设置数据库访问权限
python3 {baseDir}/scripts/database.py access -d example_db -a %
# 查看数据库表信息
python3 {baseDir}/scripts/database.py tables -d example_db
# 优化数据库表
python3 {baseDir}/scripts/database.py optimize -d example_db
# 修复数据库表
python3 {baseDir}/scripts/database.py repair -d example_db
# 删除数据库
python3 {baseDir}/scripts/database.py delete -d example_db
用户意图识别:
database.py adddatabase.py listdatabase.py passworddatabase.py optimize# 查看站点列表
python3 {baseDir}/scripts/site.py list
# 创建站点
python3 {baseDir}/scripts/site.py add -n example.com -p /www/wwwroot/example.com -v 82
# 停用站点
python3 {baseDir}/scripts/site.py stop -n example.com
# 启用站点
python3 {baseDir}/scripts/site.py start -n example.com
# 删除站点
python3 {baseDir}/scripts/site.py delete -n example.com
# 查看 PHP 版本列表
python3 {baseDir}/scripts/php.py versions
# 查看站点 PHP 版本
python3 {baseDir}/scripts/php.py get -n example.com
# 设置 PHP 版本
python3 {baseDir}/scripts/php.py set -n example.com -v 82
# 查看域名列表
python3 {baseDir}/scripts/domain.py list -n example.com
# 添加域名
python3 {baseDir}/scripts/domain.py add -n example.com -d www.example.com
# 删除域名
python3 {baseDir}/scripts/domain.py delete -n example.com -d www.example.com
# 查看 SSL 信息
python3 {baseDir}/scripts/ssl_cert.py info -n example.com
# 上传证书
python3 {baseDir}/scripts/ssl_cert.py upload -n example.com --key key.pem --cert cert.pem
# 申请免费证书
python3 {baseDir}/scripts/ssl_cert.py apply -n example.com -d example.com
# 开启/关闭强制 HTTPS
python3 {baseDir}/scripts/ssl_cert.py https -n example.com --enable
python3 {baseDir}/scripts/ssl_cert.py https -n example.com --disable
# 关闭 SSL
python3 {baseDir}/scripts/ssl_cert.py close -n example.com
# 查看模板列表
python3 {baseDir}/scripts/rewrite.py list -n example.com
# 查看当前规则
python3 {baseDir}/scripts/rewrite.py get -n example.com
# 应用模板
python3 {baseDir}/scripts/rewrite.py set -n example.com -t wordpress
# 查看数据库列表
python3 {baseDir}/scripts/database.py list
# 创建数据库
python3 {baseDir}/scripts/database.py add -n testdb -u testuser -P "Password123"
# 修改密码
python3 {baseDir}/scripts/database.py password -d testdb -P "NewPass123"
# 删除数据库
python3 {baseDir}/scripts/database.py delete -d testdb
| 参数 | 说明 | 默认值 |
|---|---|---|
list | 查看站点列表 | - |
add | 创建站点 | - |
stop | 停用站点 | - |
start | 启用站点 | - |
delete | 删除站点 | - |
info | 查看站点详情 | - |
-n, --name | 站点名称 | 必填 |
-p, --path | 站点路径 | /www/wwwroot/域名 |
-v, --version | PHP 版本 | 82 |
--create-db | 创建数据库 | 否 |
--create-ftp | 创建 FTP | 否 |
--delete-path | 删除站点目录 | 否 |
--delete-db | 删除关联数据库 | 否 |
--delete-ftp | 删除关联 FTP | 否 |
| 参数 | 说明 | 默认值 |
|---|---|---|
versions | 查看 PHP 版本列表 | - |
get | 查看站点 PHP 版本 | - |
set | 设置 PHP 版本 | - |
-n, --name | 站点名称 | 必填 |
-v, --version | PHP 版本号 | 必填 |
--static | 设为纯静态 | - |
| 参数 | 说明 | 默认值 |
|---|---|---|
list | 查看域名列表 | - |
add | 添加域名 | - |
delete | 删除域名 | - |
-n, --name | 站点名称 | 必填 |
-d, --domain | 域名(多个用逗号分隔) | 必填 |
| 参数 | 说明 | 默认值 |
|---|---|---|
info | 查看 SSL 信息 | - |
upload | 上传证书 | - |
apply | 申请证书 | - |
https | 设置强制 HTTPS | - |
close | 关闭 SSL | - |
-n, --name | 站点名称 | 必填 |
-d, --domain | 域名列表 | - |
--key | 私钥文件路径 | - |
--cert | 证书文件路径 | - |
| 参数 | 说明 | 默认值 |
|---|---|---|
list | 查看模板列表 | - |
get | 查看当前规则 | - |
set | 设置规则 | - |
-n, --name | 站点名称 | 必填 |
-t, --template | 模板名称 | - |
--custom | 自定义规则 | - |
| 参数 | 说明 | 默认值 |
|---|---|---|
list | 查看数据库列表 | - |
add | 创建数据库 | - |
info | 查看数据库详情 | - |
password | 修改密码 | - |
access | 设置访问权限 | - |
tables | 查看表信息 | - |
optimize | 优化表 | - |
repair | 修复表 | - |
delete | 删除数据库 | - |
-n, --name | 数据库名称 | 必填 |
-u, --user | 数据库用户名 | 同数据库名 |
-P, --password | 密码 | 随机生成 |
-d, --database | 数据库名称 | 必填 |
-a, --access | 访问权限 | 127.0.0.1 |
| 版本 | 说明 |
|---|---|
52 | PHP 5.2 (已淘汰) |
53 | PHP 5.3 (已淘汰) |
54 | PHP 5.4 (已淘汰) |
55 | PHP 5.5 (已淘汰) |
56 | PHP 5.6 |
70 | PHP 7.0 |
71 | PHP 7.1 |
72 | PHP 7.2 |
73 | PHP 7.3 |
74 | PHP 7.4 |
80 | PHP 8.0 |
81 | PHP 8.1 |
82 | PHP 8.2 |
83 | PHP 8.3 |
84 | PHP 8.4 |
00 | 纯静态 |
常见伪静态模板:
wordpress - WordPressthinkphp - ThinkPHPlaravel5 - Laravel 5dedecms - Dedecmsdiscuz - Discuzecshop - ECShoptypecho - Typechozblog - Z-Blogdrupal - Drupalphpcms - PHPCMSmaccms - 苹果 CMScrmeb - CRMEBShopWind - 商派EmpireCMS - 帝国 CMSEduSoho - EduSoho实战更新日期: 2026-04-02
测试环境: 内网 172 (192.168.69.172:8888)
WordPress 版本: 6.9.4 (最新中文版)
当用户需要从头部署一个完整的 WordPress 网站时,按以下步骤执行:
python3 {baseDir}/scripts/php.py versions
python3 {baseDir}/scripts/site.py list
python3 {baseDir}/scripts/site.py add -s "内网 172" \
-n "192.168.69.172:19101" \
-v 74 \
--create-db \
--db-user "wp_db_101"
输出示例:
✅ 站点创建成功:192.168.69.172:19101
路径:/www/wwwroot/192.168.69.172_19101
PHP 版本:74
站点 ID: 24
✅ 数据库创建成功
数据库名:wp_db_101
用户名:wp_db_101
密码:9q87Fbr8On41lzoT
python3 ../btpanel_files/scripts/download.py -s "内网 172" \
download \
--url "https://cn.wordpress.org/latest-zh_CN.zip" \
--path "/www/wwwroot/192.168.69.172_19101" \
--wait \
--timeout 300
python3 ../btpanel_files/scripts/unzip.py -s "内网 172" \
unzip \
--source "/www/wwwroot/192.168.69.172_19101/latest-zh_CN.zip" \
--dest "/tmp/wp-extract"
PYTHONPATH=/mnt/c/Work/lpanel2/btpanel-skills/src python3 -c "
from bt_common.bt_client import BtClient
from bt_common.config import get_servers
servers = get_servers()
for s in servers:
if s.name == '内网 172':
client = BtClient(name=s.name, host=s.host, token=s.token, timeout=s.timeout)
break
client.request('/files?action=CopyFile', {'sfile': '/tmp/wp-extract/wordpress', 'dfile': '/www/wwwroot/192.168.69.172_19101'})
"
# 创建文件
python3 ../btpanel_files/scripts/files.py -s "内网 172" \
touch "/www/wwwroot/192.168.69.172_19101/wp-config.php"
# 准备配置内容
python3 ../btpanel_files/scripts/files.py -s "内网 172" \
cat "/www/wwwroot/192.168.69.172_19101/wp-config-sample.php" > /tmp/wp-config.txt
# 替换数据库配置
sed -i 's/database_name_here/wp_db_101/g; s/username_here/wp_db_101/g; s/password_here/9q87Fbr8On41lzoT/g; s/localhost/127.0.0.1/g' /tmp/wp-config.txt
# 写入配置
python3 ../btpanel_files/scripts/files.py -s "内网 172" \
edit "/www/wwwroot/192.168.69.172_19101/wp-config.php" \
-f /tmp/wp-config.txt
python3 {baseDir}/scripts/rewrite.py -s "内网 172" \
set -n "192.168.69.172_19101" -t wordpress
curl -I http://192.168.69.172:19101
预期输出:
HTTP/1.1 302 Found
X-Redirect-By: WordPress
Location: http://192.168.69.172:19101/wp-admin/install.php
## 🎉 WordPress 部署完成!
| 项目 | 值 |
|------|------|
| 访问地址 | http://192.168.69.172:19101 |
| 数据库名 | wp_db_101 |
| 用户名 | wp_db_101 |
| 密码 | 9q87Fbr8On41lzoT |
| 数据库主机 | 127.0.0.1 |
sql=true 参数% 表示允许远程连接,127.0.0.1 表示仅本地访问sql 和 ftp 参数(脚本已自动处理)