fix: ensure compatibility with Go project plugin by adding 'name' parameter

- Added 'name' parameter to the data payload in the restart_via_bt_api function across multiple files to ensure compatibility with different versions of the Go project plugin.
- Updated comments to clarify the necessity of including both 'project_name' and 'name' parameters for API requests.
This commit is contained in:
Alex-larget
2026-04-01 16:19:06 +08:00
parent f9e352be96
commit bdd0795434
4 changed files with 58 additions and 32 deletions

View File

@@ -331,6 +331,7 @@ def restart_via_bt_api(cfg):
data = dict(params)
data["action"] = action
data["project_name"] = name
data["name"] = name
r = requests.post(base + "/plugin?name=go_project", data=data, timeout=15, verify=False)
if r.status_code != 200:
continue
@@ -342,6 +343,7 @@ def restart_via_bt_api(cfg):
data = dict(params)
data["action"] = "start_go_project"
data["project_name"] = name
data["name"] = name
r = requests.post(base + "/plugin?name=go_project", data=data, timeout=15, verify=False)
if r.status_code == 200:
j = r.json() if r.headers.get("content-type", "").startswith("application/json") else {}

View File

@@ -218,11 +218,12 @@ def restart_via_bt_api(cfg):
# 宝塔 Go 项目插件:先停止再启动,接口以实际面板版本为准
base = url.rstrip("/")
params = {"request_time": req_time, "request_token": req_token}
# 常见形式:/plugin?name=go_projectPOST 带 action、project_name
# 常见形式:POST 带 action + 项目标识;部分版本只认 project_name部分只认 name故同时传
for action in ("stop_go_project", "start_go_project"):
data = dict(params)
data["action"] = action
data["project_name"] = name
data["name"] = name
r = requests.post(
base + "/plugin?name=go_project",
data=data,
@@ -240,6 +241,7 @@ def restart_via_bt_api(cfg):
data = dict(params)
data["action"] = "start_go_project"
data["project_name"] = name
data["name"] = name
r = requests.post(base + "/plugin?name=go_project", data=data, timeout=15, verify=False)
if r.status_code == 200:
j = r.json() if r.headers.get("content-type", "").startswith("application/json") else {}

View File

@@ -4,6 +4,7 @@ import (
"log"
"os"
"path/filepath"
"sort"
"strconv"
"strings"
@@ -89,9 +90,28 @@ func SetCurrent(cfg *Config) { current = cfg }
// Get 返回当前配置,未设置时返回 nil
func Get() *Config { return current }
// mergeUniqueCORSOrigins 将环境变量中的源与 defaultCORSOrigins 合并去重(排序仅便于日志对比)。
// 避免线上只配了部分域名时完全覆盖默认值,导致漏掉 souladmin 等跨域失败。
func mergeUniqueCORSOrigins(fromEnv []string) []string {
seen := make(map[string]struct{})
for _, o := range defaultCORSOrigins {
seen[o] = struct{}{}
}
for _, o := range fromEnv {
if o != "" {
seen[o] = struct{}{}
}
}
out := make([]string, 0, len(seen))
for o := range seen {
out = append(out, o)
}
sort.Strings(out)
return out
}
// parseCORSOrigins 从环境变量 CORS_ORIGINS 读取(逗号分隔),未设置则用默认值。
// 注意:线上若设置 CORS_ORIGINS必须包含管理端 Origin如 https://souladmin.quwanzhi.com
// 否则会覆盖 defaultCORSOrigins 且未列出的源会触发浏览器「No Access-Control-Allow-Origin」。
// 若设置 CORS_ORIGINS会与 defaultCORSOrigins 合并去重,避免漏配管理端 Origin。
func parseCORSOrigins() []string {
s := os.Getenv("CORS_ORIGINS")
if s == "" {
@@ -107,7 +127,7 @@ func parseCORSOrigins() []string {
if len(origins) == 0 {
return defaultCORSOrigins
}
return origins
return mergeUniqueCORSOrigins(origins)
}
// Load 加载配置,端口等从 .env 读取。
@@ -259,33 +279,33 @@ func Load() (*Config, error) {
redisURL := strings.TrimSpace(os.Getenv("REDIS_URL"))
cfg := &Config{
Port: port,
Mode: mode,
DBDSN: dsn,
TrustedProxies: []string{"127.0.0.1", "::1"},
CORSOrigins: parseCORSOrigins(),
Version: version,
BaseURL: baseURL,
CkbLeadAPIKey: ckbLeadAPIKey,
CkbOpenAPIKey: ckbOpenAPIKey,
CkbOpenAccount: ckbOpenAccount,
WechatAppID: wechatAppID,
WechatAppSecret: wechatAppSecret,
WechatMchID: wechatMchID,
WechatMchKey: wechatMchKey,
WechatNotifyURL: wechatNotifyURL,
WechatMiniProgramState: wechatMiniProgramState,
WechatAPIv3Key: wechatAPIv3Key,
WechatCertPath: wechatCertPath,
WechatKeyPath: wechatKeyPath,
WechatSerialNo: wechatSerialNo,
WechatTransferURL: wechatTransferURL,
AdminUsername: adminUsername,
AdminPassword: adminPassword,
AdminSessionSecret: adminSessionSecret,
SyncOrdersIntervalMinutes: syncOrdersInterval,
UploadDir: uploadDir,
RedisURL: redisURL,
Port: port,
Mode: mode,
DBDSN: dsn,
TrustedProxies: []string{"127.0.0.1", "::1"},
CORSOrigins: parseCORSOrigins(),
Version: version,
BaseURL: baseURL,
CkbLeadAPIKey: ckbLeadAPIKey,
CkbOpenAPIKey: ckbOpenAPIKey,
CkbOpenAccount: ckbOpenAccount,
WechatAppID: wechatAppID,
WechatAppSecret: wechatAppSecret,
WechatMchID: wechatMchID,
WechatMchKey: wechatMchKey,
WechatNotifyURL: wechatNotifyURL,
WechatMiniProgramState: wechatMiniProgramState,
WechatAPIv3Key: wechatAPIv3Key,
WechatCertPath: wechatCertPath,
WechatKeyPath: wechatKeyPath,
WechatSerialNo: wechatSerialNo,
WechatTransferURL: wechatTransferURL,
AdminUsername: adminUsername,
AdminPassword: adminPassword,
AdminSessionSecret: adminSessionSecret,
SyncOrdersIntervalMinutes: syncOrdersInterval,
UploadDir: uploadDir,
RedisURL: redisURL,
}
// 生产环境GIN_MODE=release强制校验敏感配置禁止使用默认值

View File

@@ -220,11 +220,12 @@ def restart_via_bt_api(cfg):
# 宝塔 Go 项目插件:先停止再启动,接口以实际面板版本为准
base = url.rstrip("/")
params = {"request_time": req_time, "request_token": req_token}
# 常见形式:/plugin?name=go_projectPOST 带 action、project_name
# 常见形式:POST 带 action + 项目标识;部分版本只认 project_name部分只认 name故同时传
for action in ("stop_go_project", "start_go_project"):
data = dict(params)
data["action"] = action
data["project_name"] = name
data["name"] = name
r = requests.post(
base + "/plugin?name=go_project",
data=data,
@@ -242,6 +243,7 @@ def restart_via_bt_api(cfg):
data = dict(params)
data["action"] = "start_go_project"
data["project_name"] = name
data["name"] = name
r = requests.post(base + "/plugin?name=go_project", data=data, timeout=15, verify=False)
if r.status_code == 200:
j = r.json() if r.headers.get("content-type", "").startswith("application/json") else {}