必须ENABLED_PLUGINS显式启用插件

This commit is contained in:
www.xueximeng.com
2025-09-09 18:53:38 +08:00
parent 3f71df05cd
commit d54ae73309
8 changed files with 48 additions and 23 deletions

View File

@@ -51,6 +51,7 @@ WORKDIR /app
EXPOSE 8888 EXPOSE 8888
# 设置环境变量 # 设置环境变量
# ENABLED_PLUGINS: 必须指定启用的插件,多个插件用逗号分隔
ENV CACHE_PATH=/app/cache \ ENV CACHE_PATH=/app/cache \
CACHE_ENABLED=true \ CACHE_ENABLED=true \
TZ=Asia/Shanghai \ TZ=Asia/Shanghai \
@@ -58,7 +59,8 @@ ENV CACHE_PATH=/app/cache \
ASYNC_RESPONSE_TIMEOUT=4 \ ASYNC_RESPONSE_TIMEOUT=4 \
ASYNC_MAX_BACKGROUND_WORKERS=20 \ ASYNC_MAX_BACKGROUND_WORKERS=20 \
ASYNC_MAX_BACKGROUND_TASKS=100 \ ASYNC_MAX_BACKGROUND_TASKS=100 \
ASYNC_CACHE_TTL_HOURS=1 ASYNC_CACHE_TTL_HOURS=1 \
ENABLED_PLUGINS=labi,zhizhen,shandian,duoduo,muou,wanou
# 构建参数 # 构建参数
ARG VERSION=dev ARG VERSION=dev

View File

@@ -95,6 +95,7 @@ cd pansou
| **PORT** | 服务端口 | `8888` | 修改服务监听端口 | | **PORT** | 服务端口 | `8888` | 修改服务监听端口 |
| **PROXY** | SOCKS5代理 | 无 | 如:`socks5://127.0.0.1:1080` | | **PROXY** | SOCKS5代理 | 无 | 如:`socks5://127.0.0.1:1080` |
| **CHANNELS** | 默认搜索的TG频道 | `tgsearchers3` | 多个频道用逗号分隔 | | **CHANNELS** | 默认搜索的TG频道 | `tgsearchers3` | 多个频道用逗号分隔 |
| **ENABLED_PLUGINS** | 指定启用插件,多个插件用逗号分隔 | 无 | 必须显式指定 |
#### 🔧 高级配置(默认值即可) #### 🔧 高级配置(默认值即可)
@@ -119,7 +120,6 @@ cd pansou
| ASYNC_MAX_BACKGROUND_TASKS | 最大后台任务数量 | 工作者数×5 | | ASYNC_MAX_BACKGROUND_TASKS | 最大后台任务数量 | 工作者数×5 |
| ASYNC_CACHE_TTL_HOURS | 异步缓存有效期(小时) | `1` | | ASYNC_CACHE_TTL_HOURS | 异步缓存有效期(小时) | `1` |
| ASYNC_PLUGIN_ENABLED | 异步插件是否启用 | `true` | | ASYNC_PLUGIN_ENABLED | 异步插件是否启用 | `true` |
| ENABLED_PLUGINS | 指定启用插件,多个插件用逗号分隔 | 所有 |
| HTTP_READ_TIMEOUT | HTTP读取超时(秒) | 自动计算 | | HTTP_READ_TIMEOUT | HTTP读取超时(秒) | 自动计算 |
| HTTP_WRITE_TIMEOUT | HTTP写入超时(秒) | 自动计算 | | HTTP_WRITE_TIMEOUT | HTTP写入超时(秒) | 自动计算 |
| HTTP_IDLE_TIMEOUT | HTTP空闲超时(秒) | `120` | | HTTP_IDLE_TIMEOUT | HTTP空闲超时(秒) | `120` |
@@ -146,7 +146,7 @@ CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w -extldflags '-sta
``` ```
[program:pansou] [program:pansou]
environment=PORT=8888,CHANNELS="tgsearchers3,yunpanxunlei,tianyifc,BaiduCloudDisk,txtyzy,peccxinpd,gotopan,xingqiump4,yunpanqk,PanjClub,kkxlzy,baicaoZY,MCPH01,share_aliyun,bdwpzhpd,ysxb48,jdjdn1111,yggpan,MCPH086,zaihuayun,Q66Share,NewAliPan,ypquark,Oscar_4Kmovies,ucwpzy,alyp_TV,alyp_4K_Movies,shareAliyun,alyp_1,dianyingshare,Quark_Movies,XiangxiuNBB,NewQuark,ydypzyfx,kuakeyun,ucquark,xx123pan,yingshifenxiang123,zyfb123,tyypzhpd,tianyirigeng,cloudtianyi,hdhhd21,Lsp115,oneonefivewpfx,Maidanglaocom,qixingzhenren,taoxgzy,tgsearchers115,Channel_Shares_115,tyysypzypd,vip115hot,wp123zy,yunpan139,yunpan189,yunpanuc,yydf_hzl,alyp_Animation,alyp_JLP,leoziyuan" environment=PORT=8888,CHANNELS="tgsearchers3,yunpanxunlei,tianyifc,BaiduCloudDisk,txtyzy,peccxinpd,gotopan,xingqiump4,yunpanqk,PanjClub,kkxlzy,baicaoZY,MCPH01,share_aliyun,bdwpzhpd,ysxb48,jdjdn1111,yggpan,MCPH086,zaihuayun,Q66Share,NewAliPan,ypquark,Oscar_4Kmovies,ucwpzy,alyp_TV,alyp_4K_Movies,shareAliyun,alyp_1,dianyingshare,Quark_Movies,XiangxiuNBB,NewQuark,ydypzyfx,kuakeyun,ucquark,xx123pan,yingshifenxiang123,zyfb123,tyypzhpd,tianyirigeng,cloudtianyi,hdhhd21,Lsp115,oneonefivewpfx,Maidanglaocom,qixingzhenren,taoxgzy,tgsearchers115,Channel_Shares_115,tyysypzypd,vip115hot,wp123zy,yunpan139,yunpan189,yunpanuc,yydf_hzl,alyp_Animation,alyp_JLP,leoziyuan",ENABLED_PLUGINS="labi,zhizhen,shandian,duoduo,muou"
command=/home/work/pansou/pansou command=/home/work/pansou/pansou
directory=/home/work/pansou directory=/home/work/pansou
autostart=true autostart=true

View File

@@ -300,11 +300,20 @@ func getAsyncPluginEnabled() bool {
return enabled != "false" && enabled != "0" return enabled != "false" && enabled != "0"
} }
// 从环境变量获取启用的插件列表,如果未设置则返回空切片(表示启用所有) // 从环境变量获取启用的插件列表
// 返回nil表示未设置环境变量不启用任何插件
// 返回[]string{}表示设置为空(不启用任何插件)
// 返回具体列表表示启用指定插件
func getEnabledPlugins() []string { func getEnabledPlugins() []string {
plugins := os.Getenv("ENABLED_PLUGINS") plugins, exists := os.LookupEnv("ENABLED_PLUGINS")
if !exists {
// 未设置环境变量时返回nil表示不启用任何插件
return nil
}
if plugins == "" { if plugins == "" {
return []string{} // 空切片表示启用所有插件 // 设置为空字符串,也表示启用任何插件
return []string{}
} }
// 按逗号分割插件名 // 按逗号分割插件名

View File

@@ -10,6 +10,8 @@ services:
environment: environment:
- PORT=8888 - PORT=8888
- CHANNELS=tgsearchers3,SharePanBaidu,yunpanxunlei,tianyifc,BaiduCloudDisk - CHANNELS=tgsearchers3,SharePanBaidu,yunpanxunlei,tianyifc,BaiduCloudDisk
# 必须指定启用的插件,多个插件用逗号分隔
- ENABLED_PLUGINS=labi,zhizhen,shandian,duoduo,muou,wanou
- CACHE_ENABLED=true - CACHE_ENABLED=true
- CACHE_PATH=/app/cache - CACHE_PATH=/app/cache
- CACHE_MAX_SIZE=100 - CACHE_MAX_SIZE=100

View File

@@ -181,7 +181,8 @@ node .\typescript\dist\index.js
"BACKEND_STARTUP_TIMEOUT": "30000", "BACKEND_STARTUP_TIMEOUT": "30000",
"IDLE_TIMEOUT": "300000", "IDLE_TIMEOUT": "300000",
"ENABLE_IDLE_SHUTDOWN": "true", "ENABLE_IDLE_SHUTDOWN": "true",
"PROJECT_ROOT_PATH": "C:\\full\\path\\to\\your\\project" "PROJECT_ROOT_PATH": "C:\\full\\path\\to\\your\\project",
"ENABLED_PLUGINS": "labi,zhizhen,shandian,duoduo,muou,wanou"
} }
} }
} }
@@ -191,6 +192,7 @@ node .\typescript\dist\index.js
**注意** **注意**
- 请将 `C:\\full\\path\\to\\your\\project` 替换为您项目实际的完整路径 - 请将 `C:\\full\\path\\to\\your\\project` 替换为您项目实际的完整路径
- 如需强制指定部署模式,可修改 `DOCKER_MODE` 和 `AUTO_START_BACKEND` 参数 - 如需强制指定部署模式,可修改 `DOCKER_MODE` 和 `AUTO_START_BACKEND` 参数
- **重要**:从当前版本开始,必须通过 `ENABLED_PLUGINS` 显式指定要启用的插件,否则不会启用任何插件
### 4. 启动 MCP 服务并开始使用 ### 4. 启动 MCP 服务并开始使用
@@ -309,6 +311,7 @@ MCP 服务通过工具调用接收参数。以下是主要工具及其支持的
| `MAX_RESULTS` | (内部使用,限制处理结果数量) | `100` | | `MAX_RESULTS` | (内部使用,限制处理结果数量) | `100` |
| `DEFAULT_CHANNELS` | 默认搜索的 Telegram 频道列表(逗号分隔)。 | `""` (使用后端默认) | | `DEFAULT_CHANNELS` | 默认搜索的 Telegram 频道列表(逗号分隔)。 | `""` (使用后端默认) |
| `DEFAULT_PLUGINS` | 默认使用的搜索插件列表(逗号分隔)。 | `""` (使用后端默认或所有) | | `DEFAULT_PLUGINS` | 默认使用的搜索插件列表(逗号分隔)。 | `""` (使用后端默认或所有) |
| `ENABLED_PLUGINS` | 指定后端启用的插件列表(逗号分隔),必须显式指定。 | `""` (需要显式设置) |
| `DEFAULT_CLOUD_TYPES` | 默认的网盘类型过滤器(逗号分隔)。 | `""` (无过滤) | | `DEFAULT_CLOUD_TYPES` | 默认的网盘类型过滤器(逗号分隔)。 | `""` (无过滤) |
| `AUTO_START_BACKEND` | 是否在 MCP 服务启动时自动尝试启动后端服务。 | `true` | | `AUTO_START_BACKEND` | 是否在 MCP 服务启动时自动尝试启动后端服务。 | `true` |
| `DOCKER_MODE` | 部署模式控制。设置为 `true` 强制使用 Docker 模式;设置为 `false` 或未设置时启用智能检测。智能检测将自动识别 Docker 容器、源码部署或运行中的服务。 | `false` (智能检测) | | `DOCKER_MODE` | 部署模式控制。设置为 `true` 强制使用 Docker 模式;设置为 `false` 或未设置时启用智能检测。智能检测将自动识别 Docker 容器、源码部署或运行中的服务。 | `false` (智能检测) |

18
main.go
View File

@@ -25,6 +25,8 @@ import (
// 以下是插件的空导入用于触发各插件的init函数实现自动注册 // 以下是插件的空导入用于触发各插件的init函数实现自动注册
// 添加新插件时,只需在此处添加对应的导入语句即可 // 添加新插件时,只需在此处添加对应的导入语句即可
// _ "pansou/plugin/hdr4k"
// _ "pansou/plugin/pan666"
_ "pansou/plugin/hunhepan" _ "pansou/plugin/hunhepan"
_ "pansou/plugin/jikepan" _ "pansou/plugin/jikepan"
_ "pansou/plugin/panwiki" _ "pansou/plugin/panwiki"
@@ -60,6 +62,7 @@ import (
_ "pansou/plugin/hdmoli" _ "pansou/plugin/hdmoli"
_ "pansou/plugin/yuhuage" _ "pansou/plugin/yuhuage"
_ "pansou/plugin/u3c3" _ "pansou/plugin/u3c3"
_ "pansou/plugin/javdb"
_ "pansou/plugin/clxiong" _ "pansou/plugin/clxiong"
_ "pansou/plugin/jutoushe" _ "pansou/plugin/jutoushe"
_ "pansou/plugin/sdso" _ "pansou/plugin/sdso"
@@ -321,12 +324,8 @@ func printServiceInfo(port string, pluginManager *plugin.PluginManager) {
if config.AppConfig.AsyncPluginEnabled { if config.AppConfig.AsyncPluginEnabled {
plugins := pluginManager.GetPlugins() plugins := pluginManager.GetPlugins()
if len(plugins) > 0 { if len(plugins) > 0 {
// 显示是否有特定的插件过滤 // 根据新逻辑,只有指定了具体插件才会加载插件
if len(config.AppConfig.EnabledPlugins) > 0 { fmt.Printf("已启用指定插件 (%d个):\n", len(plugins))
fmt.Printf("已启用指定插件 (%d个):\n", len(plugins))
} else {
fmt.Printf("已加载所有插件 (%d个):\n", len(plugins))
}
// 按优先级排序(优先级数字越小越靠前) // 按优先级排序(优先级数字越小越靠前)
sort.Slice(plugins, func(i, j int) bool { sort.Slice(plugins, func(i, j int) bool {
@@ -341,10 +340,13 @@ func printServiceInfo(port string, pluginManager *plugin.PluginManager) {
fmt.Printf(" - %s (优先级: %d)\n", p.Name(), p.Priority()) fmt.Printf(" - %s (优先级: %d)\n", p.Name(), p.Priority())
} }
} else { } else {
if len(config.AppConfig.EnabledPlugins) > 0 { // 区分不同的情况
if config.AppConfig.EnabledPlugins == nil {
fmt.Println("未设置插件列表 (ENABLED_PLUGINS),未加载任何插件")
} else if len(config.AppConfig.EnabledPlugins) > 0 {
fmt.Printf("未找到指定的插件: %s\n", strings.Join(config.AppConfig.EnabledPlugins, ", ")) fmt.Printf("未找到指定的插件: %s\n", strings.Join(config.AppConfig.EnabledPlugins, ", "))
} else { } else {
fmt.Println("未加载任何插件") fmt.Println("插件列表为空 (ENABLED_PLUGINS=\"\")未加载任何插件")
} }
} }
} }

View File

@@ -16,7 +16,8 @@
"BACKEND_STARTUP_TIMEOUT": "30000", "BACKEND_STARTUP_TIMEOUT": "30000",
"IDLE_TIMEOUT": "300000", "IDLE_TIMEOUT": "300000",
"ENABLE_IDLE_SHUTDOWN": "true", "ENABLE_IDLE_SHUTDOWN": "true",
"PROJECT_ROOT_PATH": "C:\\full\\path\\to\\your\\project" "PROJECT_ROOT_PATH": "C:\\full\\path\\to\\your\\project",
"ENABLED_PLUGINS": "labi,zhizhen,shandian,duoduo,muou,wanou"
} }
} }
}, },
@@ -43,7 +44,8 @@
"BACKEND_STARTUP_TIMEOUT": "后端服务启动超时毫秒默认30000", "BACKEND_STARTUP_TIMEOUT": "后端服务启动超时毫秒默认30000",
"IDLE_TIMEOUT": "空闲超时时间毫秒默认3000005分钟", "IDLE_TIMEOUT": "空闲超时时间毫秒默认3000005分钟",
"ENABLE_IDLE_SHUTDOWN": "是否启用空闲自动关闭默认true", "ENABLE_IDLE_SHUTDOWN": "是否启用空闲自动关闭默认true",
"PROJECT_ROOT_PATH": "项目根目录路径用于查找Go可执行文件" "PROJECT_ROOT_PATH": "项目根目录路径用于查找Go可执行文件",
"ENABLED_PLUGINS": "指定启用的插件列表,多个插件用逗号分隔,必须显式指定"
}, },
"使用示例": { "使用示例": {
"自动模式": "默认配置,自动检测部署方式", "自动模式": "默认配置,自动检测部署方式",

View File

@@ -97,19 +97,24 @@ func (pm *PluginManager) RegisterPlugin(plugin AsyncSearchPlugin) {
// RegisterAllGlobalPlugins 注册所有全局异步插件 // RegisterAllGlobalPlugins 注册所有全局异步插件
func (pm *PluginManager) RegisterAllGlobalPlugins() { func (pm *PluginManager) RegisterAllGlobalPlugins() {
pm.RegisterGlobalPluginsWithFilter([]string{}) allPlugins := GetRegisteredPlugins()
for _, plugin := range allPlugins {
pm.RegisterPlugin(plugin)
}
} }
// RegisterGlobalPluginsWithFilter 根据过滤器注册全局异步插件 // RegisterGlobalPluginsWithFilter 根据过滤器注册全局异步插件
// enabledPlugins: 启用的插件名称列表,如果为空则启用所有插件 // enabledPlugins: nil表示未设置不启用任何插件空切片表示设置为空不启用任何插件具体列表表示启用指定插件
func (pm *PluginManager) RegisterGlobalPluginsWithFilter(enabledPlugins []string) { func (pm *PluginManager) RegisterGlobalPluginsWithFilter(enabledPlugins []string) {
allPlugins := GetRegisteredPlugins() allPlugins := GetRegisteredPlugins()
// 如果没有指定启用的插件,则启用所有插件 // nil 表示未设置环境变量,不启用任何插件
if enabledPlugins == nil {
return
}
// 空切片表示设置为空字符串,也不启用任何插件
if len(enabledPlugins) == 0 { if len(enabledPlugins) == 0 {
for _, plugin := range allPlugins {
pm.RegisterPlugin(plugin)
}
return return
} }