diff --git a/internal/domain/access.go b/internal/domain/access.go index 82f20bbd..9ab18b9f 100644 --- a/internal/domain/access.go +++ b/internal/domain/access.go @@ -243,7 +243,7 @@ type AccessConfigForRainYun struct { type AccessConfigForRatPanel struct { ApiUrl string `json:"apiUrl"` - AccessTokenId uint `json:"accessTokenId"` + AccessTokenId int32 `json:"accessTokenId"` AccessToken string `json:"accessToken"` AllowInsecureConnections bool `json:"allowInsecureConnections,omitempty"` } diff --git a/internal/pkg/core/deployer/providers/ratpanel-console/ratpanel_console.go b/internal/pkg/core/deployer/providers/ratpanel-console/ratpanel_console.go index ceb31771..51faf4f2 100644 --- a/internal/pkg/core/deployer/providers/ratpanel-console/ratpanel_console.go +++ b/internal/pkg/core/deployer/providers/ratpanel-console/ratpanel_console.go @@ -15,8 +15,8 @@ import ( type DeployerConfig struct { // 耗子面板地址。 ApiUrl string `json:"apiUrl"` - // 耗子面板访问令牌ID。 - AccessTokenId uint `json:"accessTokenId"` + // 耗子面板访问令牌 ID。 + AccessTokenId int32 `json:"accessTokenId"` // 耗子面板访问令牌。 AccessToken string `json:"accessToken"` // 是否允许不安全的连接。 @@ -64,15 +64,15 @@ func (d *DeployerProvider) Deploy(ctx context.Context, certPEM string, privkeyPE PrivateKey: privkeyPEM, } settingCertResp, err := d.sdkClient.SettingCert(settingCertReq) - d.logger.Debug("sdk request 'ratpanel.SettingCertRequest'", slog.Any("request", settingCertReq), slog.Any("response", settingCertResp)) + d.logger.Debug("sdk request 'ratpanel.SettingCert'", slog.Any("request", settingCertReq), slog.Any("response", settingCertResp)) if err != nil { - return nil, fmt.Errorf("failed to execute sdk request 'ratpanel.SettingCertRequest': %w", err) + return nil, fmt.Errorf("failed to execute sdk request 'ratpanel.SettingCert': %w", err) } return &deployer.DeployResult{}, nil } -func createSdkClient(apiUrl string, accessTokenId uint, accessToken string, skipTlsVerify bool) (*rpsdk.Client, error) { +func createSdkClient(apiUrl string, accessTokenId int32, accessToken string, skipTlsVerify bool) (*rpsdk.Client, error) { if _, err := url.Parse(apiUrl); err != nil { return nil, errors.New("invalid ratpanel api url") } @@ -80,6 +80,7 @@ func createSdkClient(apiUrl string, accessTokenId uint, accessToken string, skip if accessTokenId == 0 { return nil, errors.New("invalid ratpanel access token id") } + if accessToken == "" { return nil, errors.New("invalid ratpanel access token") } diff --git a/internal/pkg/core/deployer/providers/ratpanel-console/ratpanel_console_test.go b/internal/pkg/core/deployer/providers/ratpanel-console/ratpanel_console_test.go index 40804f87..3f3193b3 100644 --- a/internal/pkg/core/deployer/providers/ratpanel-console/ratpanel_console_test.go +++ b/internal/pkg/core/deployer/providers/ratpanel-console/ratpanel_console_test.go @@ -15,8 +15,8 @@ var ( fInputCertPath string fInputKeyPath string fApiUrl string - fTokenId uint - fToken string + fAccessTokenId int64 + fAccessToken string ) func init() { @@ -25,8 +25,8 @@ func init() { flag.StringVar(&fInputCertPath, argsPrefix+"INPUTCERTPATH", "", "") flag.StringVar(&fInputKeyPath, argsPrefix+"INPUTKEYPATH", "", "") flag.StringVar(&fApiUrl, argsPrefix+"APIURL", "", "") - flag.UintVar(&fTokenId, argsPrefix+"TOKENID", 0, "") - flag.StringVar(&fToken, argsPrefix+"TOKEN", "", "") + flag.Int64Var(&fAccessTokenId, argsPrefix+"ACCESSTOKENID", 0, "") + flag.StringVar(&fAccessToken, argsPrefix+"ACCESSTOKEN", "", "") } /* @@ -36,8 +36,8 @@ Shell command to run this test: --CERTIMATE_DEPLOYER_RATPANELCONSOLE_INPUTCERTPATH="/path/to/your-input-cert.pem" \ --CERTIMATE_DEPLOYER_RATPANELCONSOLE_INPUTKEYPATH="/path/to/your-input-key.pem" \ --CERTIMATE_DEPLOYER_RATPANELCONSOLE_APIURL="http://127.0.0.1:8888" \ - --CERTIMATE_DEPLOYER_RATPANELCONSOLE_TOKENID=your-access-token-id \ - --CERTIMATE_DEPLOYER_RATPANELCONSOLE_TOKEN="your-access-token" + --CERTIMATE_DEPLOYER_RATPANELCONSOLE_ACCESSTOKENID="your-access-token-id" \ + --CERTIMATE_DEPLOYER_RATPANELCONSOLE_ACCESSTOKEN="your-access-token" */ func TestDeploy(t *testing.T) { flag.Parse() @@ -48,14 +48,14 @@ func TestDeploy(t *testing.T) { fmt.Sprintf("INPUTCERTPATH: %v", fInputCertPath), fmt.Sprintf("INPUTKEYPATH: %v", fInputKeyPath), fmt.Sprintf("APIURL: %v", fApiUrl), - fmt.Sprintf("TOKENID: %v", fTokenId), - fmt.Sprintf("TOKEN: %v", fToken), + fmt.Sprintf("ACCESSTOKENID: %v", fAccessTokenId), + fmt.Sprintf("ACCESSTOKEN: %v", fAccessToken), }, "\n")) deployer, err := provider.NewDeployer(&provider.DeployerConfig{ ApiUrl: fApiUrl, - AccessTokenId: fTokenId, - AccessToken: fToken, + AccessTokenId: int32(fAccessTokenId), + AccessToken: fAccessToken, AllowInsecureConnections: true, }) if err != nil { diff --git a/internal/pkg/core/deployer/providers/ratpanel-site/ratpanel_site.go b/internal/pkg/core/deployer/providers/ratpanel-site/ratpanel_site.go index 85f54ab5..b4e283be 100644 --- a/internal/pkg/core/deployer/providers/ratpanel-site/ratpanel_site.go +++ b/internal/pkg/core/deployer/providers/ratpanel-site/ratpanel_site.go @@ -15,14 +15,14 @@ import ( type DeployerConfig struct { // 耗子面板地址。 ApiUrl string `json:"apiUrl"` - // 耗子面板访问令牌ID。 - AccessTokenId uint `json:"accessTokenId"` + // 耗子面板访问令牌 ID。 + AccessTokenId int32 `json:"accessTokenId"` // 耗子面板访问令牌。 AccessToken string `json:"accessToken"` // 是否允许不安全的连接。 AllowInsecureConnections bool `json:"allowInsecureConnections,omitempty"` // 网站名称。 - SiteName string `json:"siteName,omitempty"` + SiteName string `json:"siteName"` } type DeployerProvider struct { @@ -71,15 +71,15 @@ func (d *DeployerProvider) Deploy(ctx context.Context, certPEM string, privkeyPE PrivateKey: privkeyPEM, } websiteCertResp, err := d.sdkClient.WebsiteCert(websiteCertReq) - d.logger.Debug("sdk request 'ratpanel.WebsiteCertRequest'", slog.Any("request", websiteCertReq), slog.Any("response", websiteCertResp)) + d.logger.Debug("sdk request 'ratpanel.WebsiteCert'", slog.Any("request", websiteCertReq), slog.Any("response", websiteCertResp)) if err != nil { - return nil, fmt.Errorf("failed to execute sdk request 'ratpanel.WebsiteCertRequest': %w", err) + return nil, fmt.Errorf("failed to execute sdk request 'ratpanel.WebsiteCert': %w", err) } return &deployer.DeployResult{}, nil } -func createSdkClient(apiUrl string, accessTokenId uint, accessToken string, skipTlsVerify bool) (*rpsdk.Client, error) { +func createSdkClient(apiUrl string, accessTokenId int32, accessToken string, skipTlsVerify bool) (*rpsdk.Client, error) { if _, err := url.Parse(apiUrl); err != nil { return nil, errors.New("invalid ratpanel api url") } @@ -87,6 +87,7 @@ func createSdkClient(apiUrl string, accessTokenId uint, accessToken string, skip if accessTokenId == 0 { return nil, errors.New("invalid ratpanel access token id") } + if accessToken == "" { return nil, errors.New("invalid ratpanel access token") } diff --git a/internal/pkg/core/deployer/providers/ratpanel-site/ratpanel_site_test.go b/internal/pkg/core/deployer/providers/ratpanel-site/ratpanel_site_test.go index a4cab040..658175fb 100644 --- a/internal/pkg/core/deployer/providers/ratpanel-site/ratpanel_site_test.go +++ b/internal/pkg/core/deployer/providers/ratpanel-site/ratpanel_site_test.go @@ -15,8 +15,8 @@ var ( fInputCertPath string fInputKeyPath string fApiUrl string - fTokenId uint - fToken string + fAccessTokenId int64 + fAccessToken string fSiteName string ) @@ -26,8 +26,8 @@ func init() { flag.StringVar(&fInputCertPath, argsPrefix+"INPUTCERTPATH", "", "") flag.StringVar(&fInputKeyPath, argsPrefix+"INPUTKEYPATH", "", "") flag.StringVar(&fApiUrl, argsPrefix+"APIURL", "", "") - flag.UintVar(&fTokenId, argsPrefix+"TOKENID", 0, "") - flag.StringVar(&fToken, argsPrefix+"TOKEN", "", "") + flag.Int64Var(&fAccessTokenId, argsPrefix+"ACCESSTOKENID", 0, "") + flag.StringVar(&fAccessToken, argsPrefix+"ACCESSTOKEN", "", "") flag.StringVar(&fSiteName, argsPrefix+"SITENAME", "", "") } @@ -38,8 +38,8 @@ Shell command to run this test: --CERTIMATE_DEPLOYER_RATPANELSITE_INPUTCERTPATH="/path/to/your-input-cert.pem" \ --CERTIMATE_DEPLOYER_RATPANELSITE_INPUTKEYPATH="/path/to/your-input-key.pem" \ --CERTIMATE_DEPLOYER_RATPANELSITE_APIURL="http://127.0.0.1:8888" \ - --CERTIMATE_DEPLOYER_RATPANELSITE_TOKENID=your-access-token-id \ - --CERTIMATE_DEPLOYER_RATPANELSITE_TOKEN="your-access-token" \ + --CERTIMATE_DEPLOYER_RATPANELSITE_ACCESSTOKENID="your-access-token-id" \ + --CERTIMATE_DEPLOYER_RATPANELSITE_ACCESSTOKEN="your-access-token" \ --CERTIMATE_DEPLOYER_RATPANELSITE_SITENAME="your-site-name" */ func TestDeploy(t *testing.T) { @@ -51,15 +51,15 @@ func TestDeploy(t *testing.T) { fmt.Sprintf("INPUTCERTPATH: %v", fInputCertPath), fmt.Sprintf("INPUTKEYPATH: %v", fInputKeyPath), fmt.Sprintf("APIURL: %v", fApiUrl), - fmt.Sprintf("TOKENID: %v", fTokenId), - fmt.Sprintf("TOKEN: %v", fToken), + fmt.Sprintf("ACCESSTOKENID: %v", fAccessTokenId), + fmt.Sprintf("ACCESSTOKEN: %v", fAccessToken), fmt.Sprintf("SITENAME: %v", fSiteName), }, "\n")) deployer, err := provider.NewDeployer(&provider.DeployerConfig{ ApiUrl: fApiUrl, - AccessTokenId: fTokenId, - AccessToken: fToken, + AccessTokenId: int32(fAccessTokenId), + AccessToken: fAccessToken, AllowInsecureConnections: true, SiteName: fSiteName, }) diff --git a/internal/pkg/sdk3rd/ratpanel/client.go b/internal/pkg/sdk3rd/ratpanel/client.go index e0562410..ac2c4062 100644 --- a/internal/pkg/sdk3rd/ratpanel/client.go +++ b/internal/pkg/sdk3rd/ratpanel/client.go @@ -20,7 +20,7 @@ type Client struct { client *resty.Client } -func NewClient(apiHost string, accessTokenId uint, accessToken string) *Client { +func NewClient(apiHost string, accessTokenId int32, accessToken string) *Client { client := resty.New(). SetBaseURL(strings.TrimRight(apiHost, "/")+"/api"). SetHeader("Accept", "application/json"). @@ -123,9 +123,9 @@ func (c *Client) sendRequestWithResult(method string, path string, params interf } if err = json.Unmarshal(resp.Body(), &result); err != nil { - return fmt.Errorf("ratpanel api error: failed to parse response: %w", err) - } else if errmessage := result.GetMessage(); errmessage != "success" { - return fmt.Errorf("ratpanel api error: %d - %s", resp.StatusCode(), errmessage) + return fmt.Errorf("ratpanel api error: failed to unmarshal response: %w", err) + } else if errmsg := result.GetMessage(); errmsg != "success" { + return fmt.Errorf("ratpanel api error: message='%s'", errmsg) } return nil diff --git a/ui/public/imgs/providers/ratpanel.png b/ui/public/imgs/providers/ratpanel.png new file mode 100644 index 00000000..f89808dd Binary files /dev/null and b/ui/public/imgs/providers/ratpanel.png differ diff --git a/ui/src/components/access/AccessForm.tsx b/ui/src/components/access/AccessForm.tsx index 1b618cbc..3e31dad4 100644 --- a/ui/src/components/access/AccessForm.tsx +++ b/ui/src/components/access/AccessForm.tsx @@ -54,6 +54,7 @@ import AccessFormPowerDNSConfig from "./AccessFormPowerDNSConfig"; import AccessFormProxmoxVEConfig from "./AccessFormProxmoxVEConfig"; import AccessFormQiniuConfig from "./AccessFormQiniuConfig"; import AccessFormRainYunConfig from "./AccessFormRainYunConfig"; +import AccessFormRatPanelConfig from "./AccessFormRatPanelConfig"; import AccessFormSafeLineConfig from "./AccessFormSafeLineConfig"; import AccessFormSSHConfig from "./AccessFormSSHConfig"; import AccessFormSSLComConfig from "./AccessFormSSLComConfig"; @@ -260,6 +261,8 @@ const AccessForm = forwardRef(({ className, return ; case ACCESS_PROVIDERS.RAINYUN: return ; + case ACCESS_PROVIDERS.RATPANEL: + return ; case ACCESS_PROVIDERS.SAFELINE: return ; case ACCESS_PROVIDERS.SSH: diff --git a/ui/src/components/access/AccessFormRatPanelConfig.tsx b/ui/src/components/access/AccessFormRatPanelConfig.tsx new file mode 100644 index 00000000..ca3d2182 --- /dev/null +++ b/ui/src/components/access/AccessFormRatPanelConfig.tsx @@ -0,0 +1,82 @@ +import { useTranslation } from "react-i18next"; +import { Form, type FormInstance, Input, Switch } from "antd"; +import { createSchemaFieldRule } from "antd-zod"; +import { z } from "zod"; + +import { type AccessConfigForRatPanel } from "@/domain/access"; + +type AccessFormRatPanelConfigFieldValues = Nullish; + +export type AccessFormRatPanelConfigProps = { + form: FormInstance; + formName: string; + disabled?: boolean; + initialValues?: AccessFormRatPanelConfigFieldValues; + onValuesChange?: (values: AccessFormRatPanelConfigFieldValues) => void; +}; + +const initFormModel = (): AccessFormRatPanelConfigFieldValues => { + return { + apiUrl: "http://:8888/", + accessTokenId: 1, + accessToken: "", + }; +}; + +const AccessFormRatPanelConfig = ({ form: formInst, formName, disabled, initialValues, onValuesChange }: AccessFormRatPanelConfigProps) => { + const { t } = useTranslation(); + + const formSchema = z.object({ + apiUrl: z.string().url(t("common.errmsg.url_invalid")), + accessTokenId: z.preprocess((v) => Number(v), z.number().positive(t("access.form.ratpanel_access_token_id.placeholder"))), + accessToken: z.string().nonempty(t("access.form.ratpanel_access_token.placeholder")).trim(), + allowInsecureConnections: z.boolean().nullish(), + }); + const formRule = createSchemaFieldRule(formSchema); + + const handleFormChange = (_: unknown, values: z.infer) => { + onValuesChange?.(values); + }; + + return ( +
+ + + + + } + > + + + + } + > + + + + + + +
+ ); +}; + +export default AccessFormRatPanelConfig; diff --git a/ui/src/components/provider/DeploymentProviderPicker.tsx b/ui/src/components/provider/DeploymentProviderPicker.tsx index 0ea5a97c..b1bcd6fe 100644 --- a/ui/src/components/provider/DeploymentProviderPicker.tsx +++ b/ui/src/components/provider/DeploymentProviderPicker.tsx @@ -72,8 +72,10 @@ const DeploymentProviderPicker = ({ className, style, autoFocus, filter, placeho DEPLOYMENT_CATEGORIES.LOADBALANCE, DEPLOYMENT_CATEGORIES.FIREWALL, DEPLOYMENT_CATEGORIES.AV, + DEPLOYMENT_CATEGORIES.APIGATEWAY, DEPLOYMENT_CATEGORIES.SERVERLESS, DEPLOYMENT_CATEGORIES.WEBSITE, + DEPLOYMENT_CATEGORIES.SSL, DEPLOYMENT_CATEGORIES.NAS, DEPLOYMENT_CATEGORIES.OTHER, ].map((key) => ({ diff --git a/ui/src/components/workflow/node/DeployNodeConfigForm.tsx b/ui/src/components/workflow/node/DeployNodeConfigForm.tsx index 9e4ade18..b77ff9cf 100644 --- a/ui/src/components/workflow/node/DeployNodeConfigForm.tsx +++ b/ui/src/components/workflow/node/DeployNodeConfigForm.tsx @@ -63,6 +63,7 @@ import DeployNodeConfigFormQiniuCDNConfig from "./DeployNodeConfigFormQiniuCDNCo import DeployNodeConfigFormQiniuKodoConfig from "./DeployNodeConfigFormQiniuKodoConfig"; import DeployNodeConfigFormQiniuPiliConfig from "./DeployNodeConfigFormQiniuPiliConfig"; import DeployNodeConfigFormRainYunRCDNConfig from "./DeployNodeConfigFormRainYunRCDNConfig"; +import DeployNodeConfigFormRatPanelSiteConfig from "./DeployNodeConfigFormRatPanelSiteConfig"; import DeployNodeConfigFormSafeLineConfig from "./DeployNodeConfigFormSafeLineConfig"; import DeployNodeConfigFormSSHConfig from "./DeployNodeConfigFormSSHConfig.tsx"; import DeployNodeConfigFormTencentCloudCDNConfig from "./DeployNodeConfigFormTencentCloudCDNConfig.tsx"; @@ -273,6 +274,8 @@ const DeployNodeConfigForm = forwardRef; case DEPLOYMENT_PROVIDERS.RAINYUN_RCDN: return ; + case DEPLOYMENT_PROVIDERS.RATPANEL_SITE: + return ; case DEPLOYMENT_PROVIDERS.SAFELINE: return ; case DEPLOYMENT_PROVIDERS.SSH: diff --git a/ui/src/components/workflow/node/DeployNodeConfigFormRatPanelSiteConfig.tsx b/ui/src/components/workflow/node/DeployNodeConfigFormRatPanelSiteConfig.tsx new file mode 100644 index 00000000..03f86913 --- /dev/null +++ b/ui/src/components/workflow/node/DeployNodeConfigFormRatPanelSiteConfig.tsx @@ -0,0 +1,63 @@ +import { useTranslation } from "react-i18next"; +import { Form, type FormInstance, Input } from "antd"; +import { createSchemaFieldRule } from "antd-zod"; +import { z } from "zod"; + +type DeployNodeConfigFormRatPanelSiteConfigFieldValues = Nullish<{ + siteName: string; +}>; + +export type DeployNodeConfigFormRatPanelSiteConfigProps = { + form: FormInstance; + formName: string; + disabled?: boolean; + initialValues?: DeployNodeConfigFormRatPanelSiteConfigFieldValues; + onValuesChange?: (values: DeployNodeConfigFormRatPanelSiteConfigFieldValues) => void; +}; + +const initFormModel = (): DeployNodeConfigFormRatPanelSiteConfigFieldValues => { + return { + siteName: "", + }; +}; + +const DeployNodeConfigFormRatPanelSiteConfig = ({ + form: formInst, + formName, + disabled, + initialValues, + onValuesChange, +}: DeployNodeConfigFormRatPanelSiteConfigProps) => { + const { t } = useTranslation(); + + const formSchema = z.object({ + siteName: z.string().nonempty(t("workflow_node.deploy.form.ratpanel_site_name.placeholder")), + }); + const formRule = createSchemaFieldRule(formSchema); + + const handleFormChange = (_: unknown, values: z.infer) => { + onValuesChange?.(values); + }; + + return ( +
+ } + > + + +
+ ); +}; + +export default DeployNodeConfigFormRatPanelSiteConfig; diff --git a/ui/src/components/workflow/node/DeployNodeConfigFormSafeLineConfig.tsx b/ui/src/components/workflow/node/DeployNodeConfigFormSafeLineConfig.tsx index 2da3ef16..c5905e14 100644 --- a/ui/src/components/workflow/node/DeployNodeConfigFormSafeLineConfig.tsx +++ b/ui/src/components/workflow/node/DeployNodeConfigFormSafeLineConfig.tsx @@ -68,7 +68,12 @@ const DeployNodeConfigFormSafeLineConfig = ({ form: formInst, formName, disabled - + } + > diff --git a/ui/src/domain/access.ts b/ui/src/domain/access.ts index 870b6490..fe912543 100644 --- a/ui/src/domain/access.ts +++ b/ui/src/domain/access.ts @@ -48,6 +48,7 @@ export interface AccessModel extends BaseModel { | AccessConfigForProxmoxVE | AccessConfigForQiniu | AccessConfigForRainYun + | AccessConfigForRatPanel | AccessConfigForSafeLine | AccessConfigForSSH | AccessConfigForSSLCom @@ -293,6 +294,13 @@ export type AccessConfigForRainYun = { apiKey: string; }; +export type AccessConfigForRatPanel = { + apiUrl: string; + accessTokenId: number; + accessToken: string; + allowInsecureConnections?: boolean; +}; + export type AccessConfigForSafeLine = { apiUrl: string; apiToken: string; diff --git a/ui/src/domain/provider.ts b/ui/src/domain/provider.ts index 878814f5..3d0678ba 100644 --- a/ui/src/domain/provider.ts +++ b/ui/src/domain/provider.ts @@ -51,6 +51,7 @@ export const ACCESS_PROVIDERS = Object.freeze({ PROXMOXVE: "proxmoxve", QINIU: "qiniu", RAINYUN: "rainyun", + RATPANEL: "ratpanel", SAFELINE: "safeline", SSH: "ssh", SSLCOM: "sslcom", @@ -120,6 +121,7 @@ export const accessProvidersMap: Map [ diff --git a/ui/src/i18n/locales/en/nls.access.json b/ui/src/i18n/locales/en/nls.access.json index 9ba645cb..b3f9167f 100644 --- a/ui/src/i18n/locales/en/nls.access.json +++ b/ui/src/i18n/locales/en/nls.access.json @@ -313,6 +313,17 @@ "access.form.rainyun_api_key.label": "Rain Yun API key", "access.form.rainyun_api_key.placeholder": "Please enter Rain Yun API key", "access.form.rainyun_api_key.tooltip": "For more information, see https://app.rainyun.com/account/settings/api-key", + "access.form.ratpanel_api_url.label": "RatPanel URL", + "access.form.ratpanel_api_url.placeholder": "Please enter RatPanel URL", + "access.form.ratpanel_access_token_id.label": "RatPanel access token ID", + "access.form.ratpanel_access_token_id.placeholder": "Please enter RatPanel access token ID", + "access.form.ratpanel_access_token_id.tooltip": "For more information, see https://ratpanel.github.io/advanced/api.html", + "access.form.ratpanel_access_token.label": "RatPanel access token", + "access.form.ratpanel_access_token.placeholder": "Please enter RatPanel access token", + "access.form.ratpanel_access_token.tooltip": "For more information, see https://ratpanel.github.io/advanced/api.html", + "access.form.ratpanel_allow_insecure_conns.label": "Insecure SSL/TLS connections", + "access.form.ratpanel_allow_insecure_conns.switch.on": "Allow", + "access.form.ratpanel_allow_insecure_conns.switch.off": "Disallow", "access.form.safeline_api_url.label": "SafeLine URL", "access.form.safeline_api_url.placeholder": "Please enter SafeLine URL", "access.form.safeline_api_token.label": "SafeLine API token", diff --git a/ui/src/i18n/locales/en/nls.provider.json b/ui/src/i18n/locales/en/nls.provider.json index 041f5a63..13571036 100644 --- a/ui/src/i18n/locales/en/nls.provider.json +++ b/ui/src/i18n/locales/en/nls.provider.json @@ -103,6 +103,9 @@ "provider.qiniu.pili": "Qiniu - Pili", "provider.rainyun": "Rain Yun", "provider.rainyun.rcdn": "Rain Yun - RCDN (Rain Content Delivery Network)", + "provider.ratpanel": "RatPanel", + "provider.ratpanel.console": "RatPanel - Console", + "provider.ratpanel.site": "RatPanel - Website", "provider.safeline": "SafeLine", "provider.ssh": "SSH deployment", "provider.sslcom": "SSL.com", @@ -150,8 +153,10 @@ "provider.category.loadbalance": "Loadbalance", "provider.category.firewall": "Firewall", "provider.category.av": "Audio/Video", + "provider.category.apigw": "API Gateway", "provider.category.serverless": "Serverless", "provider.category.website": "Website", + "provider.category.ssl": "SSL", "provider.category.nas": "NAS", "provider.category.other": "Other", diff --git a/ui/src/i18n/locales/en/nls.workflow.nodes.json b/ui/src/i18n/locales/en/nls.workflow.nodes.json index fce606e5..006979f1 100644 --- a/ui/src/i18n/locales/en/nls.workflow.nodes.json +++ b/ui/src/i18n/locales/en/nls.workflow.nodes.json @@ -325,7 +325,7 @@ "workflow_node.deploy.form.baotapanel_site_type.option.other.label": "Other sites", "workflow_node.deploy.form.baotapanel_site_name.label": "aaPanel site name", "workflow_node.deploy.form.baotapanel_site_name.placeholder": "Please enter aaPanel site name", - "workflow_node.deploy.form.baotapanel_site_name.tooltip": "Usually equal to the website domain name.", + "workflow_node.deploy.form.baotapanel_site_name.tooltip": "You can find it on aaPanel WebUI.", "workflow_node.deploy.form.baotapanel_site_names.label": "aaPanel site names", "workflow_node.deploy.form.baotapanel_site_names.placeholder": "Please enter aaPanel site names (separated by semicolons)", "workflow_node.deploy.form.baotapanel_site_names.errmsg.invalid": "Please enter a valid aaPanel site name", @@ -513,11 +513,15 @@ "workflow_node.deploy.form.rainyun_rcdn_domain.label": "Rain Yun RCDN domain", "workflow_node.deploy.form.rainyun_rcdn_domain.placeholder": "Please enter Rain Yun RCDN domain name", "workflow_node.deploy.form.rainyun_rcdn_domain.tooltip": "For more information, see https://app.rainyun.com/apps/rcdn/list", + "workflow_node.deploy.form.ratpanel_site_name.label": "RatPanel site name", + "workflow_node.deploy.form.ratpanel_site_name.placeholder": "Please enter RatPanel site name", + "workflow_node.deploy.form.ratpanel_site_name.tooltip": "You can find it on RatPanel WebUI.", "workflow_node.deploy.form.safeline_resource_type.label": "Resource type", "workflow_node.deploy.form.safeline_resource_type.placeholder": "Please select resource type", "workflow_node.deploy.form.safeline_resource_type.option.certificate.label": "Certificate", "workflow_node.deploy.form.safeline_certificate_id.label": "SafeLine certificate ID", "workflow_node.deploy.form.safeline_certificate_id.placeholder": "Please enter SafeLine certificate ID", + "workflow_node.deploy.form.safeline_certificate_id.tooltip": "You can find it on SafeLine WebUI.", "workflow_node.deploy.form.ssh_format.label": "File format", "workflow_node.deploy.form.ssh_format.placeholder": "Please select file format", "workflow_node.deploy.form.ssh_format.option.pem.label": "PEM (*.pem, *.crt, *.key)", diff --git a/ui/src/i18n/locales/zh/nls.access.json b/ui/src/i18n/locales/zh/nls.access.json index 04af883a..5e3444fe 100644 --- a/ui/src/i18n/locales/zh/nls.access.json +++ b/ui/src/i18n/locales/zh/nls.access.json @@ -307,6 +307,17 @@ "access.form.rainyun_api_key.label": "雨云 API 密钥", "access.form.rainyun_api_key.placeholder": "请输入雨云 API 密钥", "access.form.rainyun_api_key.tooltip": "这是什么?请参阅 https://app.rainyun.com/account/settings/api-key", + "access.form.ratpanel_api_url.label": "耗子面板 URL", + "access.form.ratpanel_api_url.placeholder": "请输入耗子面板 URL", + "access.form.ratpanel_access_token_id.label": "耗子面板 AccessToken ID", + "access.form.ratpanel_access_token_id.placeholder": "请输入耗子面板 AccessToken ID", + "access.form.ratpanel_access_token_id.tooltip": "这是什么?请参阅 https://ratpanel.github.io/advanced/api.html", + "access.form.ratpanel_access_token.label": "耗子面板 AccessToken", + "access.form.ratpanel_access_token.placeholder": "请输入耗子面板 AccessToken", + "access.form.ratpanel_access_token.tooltip": "这是什么?请参阅 https://ratpanel.github.io/advanced/api.html", + "access.form.ratpanel_allow_insecure_conns.label": "忽略 SSL/TLS 证书错误", + "access.form.ratpanel_allow_insecure_conns.switch.on": "允许", + "access.form.ratpanel_allow_insecure_conns.switch.off": "不允许", "access.form.safeline_api_url.label": "雷池 URL", "access.form.safeline_api_url.placeholder": "请输入雷池 URL", "access.form.safeline_api_token.label": "雷池 API Token", diff --git a/ui/src/i18n/locales/zh/nls.provider.json b/ui/src/i18n/locales/zh/nls.provider.json index e9ff69e0..bd04cc43 100644 --- a/ui/src/i18n/locales/zh/nls.provider.json +++ b/ui/src/i18n/locales/zh/nls.provider.json @@ -103,6 +103,9 @@ "provider.qiniu.pili": "七牛云 - 视频直播 Pili", "provider.rainyun": "雨云", "provider.rainyun.rcdn": "雨云 - 雨盾 CDN", + "provider.ratpanel": "耗子面板", + "provider.ratpanel.console": "耗子面板 - 面板", + "provider.ratpanel.site": "耗子面板 - 网站", "provider.safeline": "雷池", "provider.ssh": "SSH 部署", "provider.sslcom": "SSL.com", @@ -150,8 +153,10 @@ "provider.category.loadbalance": "负载均衡", "provider.category.firewall": "防火墙", "provider.category.av": "音视频", + "provider.category.apigw": "API 网关", "provider.category.serverless": "Serverless", "provider.category.website": "网站托管", + "provider.category.ssl": "证书托管", "provider.category.nas": "NAS", "provider.category.other": "其他", diff --git a/ui/src/i18n/locales/zh/nls.workflow.nodes.json b/ui/src/i18n/locales/zh/nls.workflow.nodes.json index b7992acf..acc5657f 100644 --- a/ui/src/i18n/locales/zh/nls.workflow.nodes.json +++ b/ui/src/i18n/locales/zh/nls.workflow.nodes.json @@ -115,10 +115,10 @@ "workflow_node.deploy.form.1panel_site_resource_type.option.certificate.label": "替换指定证书", "workflow_node.deploy.form.1panel_site_website_id.label": "1Panel 网站 ID", "workflow_node.deploy.form.1panel_site_website_id.placeholder": "请输入 1Panel 网站 ID", - "workflow_node.deploy.form.1panel_site_website_id.tooltip": "请在 1Panel 管理面板查看。", + "workflow_node.deploy.form.1panel_site_website_id.tooltip": "请登录 1Panel 管理面板查看。", "workflow_node.deploy.form.1panel_site_certificate_id.label": "1Panel 证书 ID", "workflow_node.deploy.form.1panel_site_certificate_id.placeholder": "请输入 1Panel 证书 ID", - "workflow_node.deploy.form.1panel_site_certificate_id.tooltip": "请在 1Panel 管理面板查看。", + "workflow_node.deploy.form.1panel_site_certificate_id.tooltip": "请登录 1Panel 管理面板查看。", "workflow_node.deploy.form.aliyun_alb_resource_type.label": "证书替换方式", "workflow_node.deploy.form.aliyun_alb_resource_type.placeholder": "请选择证书替换方式", "workflow_node.deploy.form.aliyun_alb_resource_type.option.loadbalancer.label": "替换指定负载均衡器下的全部 HTTPS/QUIC 监听的证书", @@ -324,7 +324,7 @@ "workflow_node.deploy.form.baotapanel_site_type.option.other.label": "其他", "workflow_node.deploy.form.baotapanel_site_name.label": "宝塔面板网站名称", "workflow_node.deploy.form.baotapanel_site_name.placeholder": "请输入宝塔面板网站名称", - "workflow_node.deploy.form.baotapanel_site_name.tooltip": "通常为网站域名。", + "workflow_node.deploy.form.baotapanel_site_name.tooltip": "请登录宝塔面板查看", "workflow_node.deploy.form.baotapanel_site_names.label": "宝塔面板网站名称", "workflow_node.deploy.form.baotapanel_site_names.placeholder": "请输入宝塔面板网站名称(多个值请用半角分号隔开)", "workflow_node.deploy.form.baotapanel_site_names.errmsg.invalid": "请输入正确的宝塔面板网站名称", @@ -512,11 +512,15 @@ "workflow_node.deploy.form.rainyun_rcdn_domain.label": "雨云 RCDN 加速域名", "workflow_node.deploy.form.rainyun_rcdn_domain.placeholder": "请输入雨云 RCDN 加速域名(支持泛域名)", "workflow_node.deploy.form.rainyun_rcdn_domain.tooltip": "这是什么?请参阅 https://app.rainyun.com/apps/rcdn/list", + "workflow_node.deploy.form.ratpanel_site_name.label": "耗子面板网站名称", + "workflow_node.deploy.form.ratpanel_site_name.placeholder": "请输入耗子面板网站名称", + "workflow_node.deploy.form.ratpanel_site_name.tooltip": "请登录耗子面板查看。", "workflow_node.deploy.form.safeline_resource_type.label": "证书替换方式", "workflow_node.deploy.form.safeline_resource_type.placeholder": "请选择证书替换方式", "workflow_node.deploy.form.safeline_resource_type.option.certificate.label": "替换指定证书", "workflow_node.deploy.form.safeline_certificate_id.label": "雷池证书 ID", "workflow_node.deploy.form.safeline_certificate_id.placeholder": "请输入雷池证书 ID", + "workflow_node.deploy.form.safeline_certificate_id.tooltip": "请登录雷池控制台查看。", "workflow_node.deploy.form.ssh_format.label": "文件格式", "workflow_node.deploy.form.ssh_format.placeholder": "请选择文件格式", "workflow_node.deploy.form.ssh_format.option.pem.label": "PEM 格式(*.pem, *.crt, *.key)",