Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions agent/app/dto/request/website_ssl.go
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@ type WebsiteSSLPush struct {
PushNode bool `json:"pushNode"`
Nodes string `json:"nodes"`
TaskID string `json:"taskID" validate:"required"`
Sync bool `json:"sync"`
}

type WebsiteCASearch struct {
Expand Down
59 changes: 30 additions & 29 deletions agent/app/dto/response/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -104,35 +104,36 @@ type AppDetail struct {
}

type AppInstallDTO struct {
ID uint `json:"id"`
Name string `json:"name"`
AppID uint `json:"appID"`
AppDetailID uint `json:"appDetailID"`
Version string `json:"version"`
Status string `json:"status"`
Message string `json:"message"`
HttpPort int `json:"httpPort"`
HttpsPort int `json:"httpsPort"`
Path string `json:"path"`
CanUpdate bool `json:"canUpdate"`
Icon string `json:"icon"`
AppName string `json:"appName"`
Ready int `json:"ready"`
Total int `json:"total"`
AppKey string `json:"appKey"`
AppType string `json:"appType"`
AppStatus string `json:"appStatus"`
DockerCompose string `json:"dockerCompose"`
WebUI string `json:"webUI"`
CreatedAt time.Time `json:"createdAt"`
Favorite bool `json:"favorite"`
SortOrder int `json:"sortOrder"`
App AppDetail `json:"app"`
Container string `json:"container"`
IsEdit bool `json:"isEdit"`
LinkDB bool `json:"linkDB"`
ResourceKeys []string `json:"resourceKeys"`
ServiceName string `json:"serviceName"`
ID uint `json:"id"`
Name string `json:"name"`
AppID uint `json:"appID"`
AppDetailID uint `json:"appDetailID"`
Version string `json:"version"`
Status string `json:"status"`
Message string `json:"message"`
HttpPort int `json:"httpPort"`
HttpsPort int `json:"httpsPort"`
Path string `json:"path"`
CanUpdate bool `json:"canUpdate"`
Icon string `json:"icon"`
AppName string `json:"appName"`
Ready int `json:"ready"`
Total int `json:"total"`
AppKey string `json:"appKey"`
AppType string `json:"appType"`
AppStatus string `json:"appStatus"`
DockerCompose string `json:"dockerCompose"`
WebUI string `json:"webUI"`
CreatedAt time.Time `json:"createdAt"`
Favorite bool `json:"favorite"`
SortOrder int `json:"sortOrder"`
App AppDetail `json:"app"`
Container string `json:"container"`
IsEdit bool `json:"isEdit"`
LinkDB bool `json:"linkDB"`
ResourceKeys []string `json:"resourceKeys"`
ServiceName string `json:"serviceName"`
Env map[string]interface{} `json:"env"`
}

type AppInstallInfo struct {
Expand Down
3 changes: 3 additions & 0 deletions agent/app/service/app_utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -1715,6 +1715,8 @@ func handleInstalled(appInstallList []model.AppInstall, updated, sync, checkUpda
}

resourceKeys := getAppInstallResourceKeys(installed.ID)
envMap := make(map[string]interface{})
_ = json.Unmarshal([]byte(installed.Env), &envMap)
installDTO := response.AppInstallDTO{
ID: installed.ID,
Name: installed.Name,
Expand All @@ -1741,6 +1743,7 @@ func handleInstalled(appInstallList []model.AppInstall, updated, sync, checkUpda
Container: installed.ContainerName,
ServiceName: strings.ToLower(installed.ServiceName),
ResourceKeys: resourceKeys,
Env: envMap,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Do not include app env in list responses

When /apps/installed/search builds its normal listing through handleInstalled, this now serializes installed.Env for every returned app. That field is populated from install parameters and is used elsewhere for secrets such as PANEL_DB_ROOT_PASSWORD and REPLICATION_PASSWORD, so app/website listing calls that previously returned metadata now bulk-expose all installed-app environment secrets; keep this data behind the per-install/detail or sync-specific path instead of adding it to the generic DTO.

Useful? React with 👍 / 👎.

}

if !updated && !checkUpdate {
Expand Down
4 changes: 4 additions & 0 deletions agent/app/service/website_ssl.go
Original file line number Diff line number Diff line change
Expand Up @@ -974,6 +974,10 @@ func (w WebsiteSSLService) PushToNode(req request.WebsiteSSLPush) error {
websiteSSL.PushNode = pushNode
websiteSSL.Nodes = nodes

if req.Sync {
return xpack.MultiNodeProvider.PushSSLToNode(websiteSSL)
}

pushTask, err := task.NewTaskWithOps(websiteSSL.PrimaryDomain, task.TaskPush, task.TaskScopeWebsite, req.TaskID, websiteSSL.ID)
if err != nil {
return err
Expand Down
12 changes: 6 additions & 6 deletions agent/cmd/server/docs/x-log.json
Original file line number Diff line number Diff line change
Expand Up @@ -1880,15 +1880,15 @@
},
"/core/xpack/exchange/file": {
"bodyKeys": [
"source",
"dest",
"sourceNode",
"targetNode",
"sourcePath",
"destPath"
"targetPath"
],
"paramKeys": [],
"beforeFunctions": [],
"formatZH": "交换文件 [sourcePath] 到 [destPath]",
"formatEN": "exchange file [sourcePath] to [destPath]"
"formatZH": "交换文件 [sourcePath] 到 [targetPath]",
"formatEN": "exchange file [sourcePath] to [targetPath]"
},
"/core/xpack/nodes": {
"bodyKeys": [
Expand Down Expand Up @@ -5152,4 +5152,4 @@
"formatZH": "从主节点同步设置",
"formatEN": "sync settings from master"
}
}
}
1 change: 1 addition & 0 deletions core/app/task/task.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ const (
TaskScopeSystem = "System"
TaskScopeScript = "ScriptLibrary"
TaskScopeNodeFile = "NodeFile"
TaskScopeNodeSSL = "NodeSSL"
TaskScopeAppBackup = "AppBackup"
TaskScopeCluster = "Cluster"
TaskScopeAppInstall = "AppInstallTask"
Expand Down
12 changes: 6 additions & 6 deletions core/cmd/server/docs/x-log.json
Original file line number Diff line number Diff line change
Expand Up @@ -1880,15 +1880,15 @@
},
"/core/xpack/exchange/file": {
"bodyKeys": [
"source",
"dest",
"sourceNode",
"targetNode",
"sourcePath",
"destPath"
"targetPath"
],
"paramKeys": [],
"beforeFunctions": [],
"formatZH": "交换文件 [sourcePath] 到 [destPath]",
"formatEN": "exchange file [sourcePath] to [destPath]"
"formatZH": "交换文件 [sourcePath] 到 [targetPath]",
"formatEN": "exchange file [sourcePath] to [targetPath]"
},
"/core/xpack/nodes": {
"bodyKeys": [
Expand Down Expand Up @@ -5152,4 +5152,4 @@
"formatZH": "从主节点同步设置",
"formatEN": "sync settings from master"
}
}
}
4 changes: 2 additions & 2 deletions core/constant/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -183,9 +183,9 @@ var WebUrlMap = map[string]struct{}{
"/xpack/node/dashboard": {},
"/xpack/node": {},
"/xpack/simple-node": {},
"/xpack/sync": {},
"/xpack/sync/file": {},

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Restore the sync landing route whitelist

The menu data still points the Resource Sync entry at /xpack/sync (core/init/migration/helper/menu.go and the migration do the same), but this change removes the parent path from WebUrlMap; core/utils/security.IsFrontendPath only serves SPA routes present in that map or DynamicRoutes. In deployments where a user opens the menu URL directly or refreshes on /xpack/sync, the backend will no longer serve the frontend route, so add /xpack/sync back alongside the child routes.

Useful? React with 👍 / 👎.

"/xpack/sync/image": {},
"/xpack/sync/cert": {},
"/xpack/sync/ssl": {},
"/xpack/sync/app": {},
"/xpack/app": {},
"/xpack/app-upgrade": {},
Expand Down
5 changes: 4 additions & 1 deletion core/i18n/lang/en.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -321,7 +321,10 @@ HandlePublicKey: "Handle node public key"
ExchangeFile: "Start syncing {{ .sourcePath }} from node {{ .source }} to node {{ .dest }}:{{ .destPath }}"
TaskRsync: "Sync"
NodeFile: "Node file"
ImageSyncTaskName: "Image sync {{ .source }} -> {{ .count }} nodes"
ImageSyncTaskName: "Image sync {{ .count }} images"
SSLSyncTaskName: "Certificate sync {{ .count }} certificates"
AppSyncTaskName: "App sync {{ .name }}"
SSLSyncToNode: "Push certificate [{{ .cert }}] to node [{{ .node }}]"
ImageSyncSave: "Save image {{ .image }}"
ImageSyncSaveTags: "Save image tags {{ .tags }}"
ImageSyncToNode: "Sync image {{ .image }} to node {{ .node }}"
Expand Down
5 changes: 4 additions & 1 deletion core/i18n/lang/es-ES.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -315,7 +315,10 @@ HandlePublicKey: "Handle node public key"
ExchangeFile: "Start syncing {{ .sourcePath }} from node {{ .source }} to node {{ .dest }}:{{ .destPath }}"
TaskRsync: "Sync"
NodeFile: "Node file"
ImageSyncTaskName: "Image sync {{ .source }} -> {{ .count }} nodes"
ImageSyncTaskName: "Image sync {{ .count }} images"
SSLSyncTaskName: "Certificate sync {{ .count }} certificates"
AppSyncTaskName: "App sync {{ .name }}"
SSLSyncToNode: "Push certificate [{{ .cert }}] to node [{{ .node }}]"
ImageSyncSave: "Save image {{ .image }}"
ImageSyncSaveTags: "Save image tags {{ .tags }}"
ImageSyncToNode: "Sync image {{ .image }} to node {{ .node }}"
Expand Down
5 changes: 4 additions & 1 deletion core/i18n/lang/fa.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -321,7 +321,10 @@ HandlePublicKey: "مدیریت کلید عمومی گره"
ExchangeFile: "شروع همگام‌سازی {{ .sourcePath }} از گره {{ .source }} به گره {{ .dest }}:{{ .destPath }}"
TaskRsync: "همگام‌سازی"
NodeFile: "فایل گره"
ImageSyncTaskName: "همگام‌سازی تصویر {{ .source }} -> {{ .count }} گره"
ImageSyncTaskName: "Image sync {{ .count }} images"
SSLSyncTaskName: "Certificate sync {{ .count }} certificates"
AppSyncTaskName: "App sync {{ .name }}"
SSLSyncToNode: "Push certificate [{{ .cert }}] to node [{{ .node }}]"
ImageSyncSave: "ذخیره تصویر {{ .image }}"
ImageSyncSaveTags: "ذخیره برچسب‌های تصویر {{ .tags }}"
ImageSyncToNode: "همگام‌سازی تصویر {{ .image }} به گره {{ .node }}"
Expand Down
5 changes: 4 additions & 1 deletion core/i18n/lang/ja.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -315,7 +315,10 @@ HandlePublicKey: "Handle node public key"
ExchangeFile: "Start syncing {{ .sourcePath }} from node {{ .source }} to node {{ .dest }}:{{ .destPath }}"
TaskRsync: "Sync"
NodeFile: "Node file"
ImageSyncTaskName: "Image sync {{ .source }} -> {{ .count }} nodes"
ImageSyncTaskName: "Image sync {{ .count }} images"
SSLSyncTaskName: "Certificate sync {{ .count }} certificates"
AppSyncTaskName: "App sync {{ .name }}"
SSLSyncToNode: "Push certificate [{{ .cert }}] to node [{{ .node }}]"
ImageSyncSave: "Save image {{ .image }}"
ImageSyncSaveTags: "Save image tags {{ .tags }}"
ImageSyncToNode: "Sync image {{ .image }} to node {{ .node }}"
Expand Down
5 changes: 4 additions & 1 deletion core/i18n/lang/ko.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -314,7 +314,10 @@ HandlePublicKey: "Handle node public key"
ExchangeFile: "Start syncing {{ .sourcePath }} from node {{ .source }} to node {{ .dest }}:{{ .destPath }}"
TaskRsync: "Sync"
NodeFile: "Node file"
ImageSyncTaskName: "Image sync {{ .source }} -> {{ .count }} nodes"
ImageSyncTaskName: "Image sync {{ .count }} images"
SSLSyncTaskName: "Certificate sync {{ .count }} certificates"
AppSyncTaskName: "App sync {{ .name }}"
SSLSyncToNode: "Push certificate [{{ .cert }}] to node [{{ .node }}]"
ImageSyncSave: "Save image {{ .image }}"
ImageSyncSaveTags: "Save image tags {{ .tags }}"
ImageSyncToNode: "Sync image {{ .image }} to node {{ .node }}"
Expand Down
5 changes: 4 additions & 1 deletion core/i18n/lang/ms.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -309,7 +309,10 @@ HandlePublicKey: "Handle node public key"
ExchangeFile: "Start syncing {{ .sourcePath }} from node {{ .source }} to node {{ .dest }}:{{ .destPath }}"
TaskRsync: "Sync"
NodeFile: "Node file"
ImageSyncTaskName: "Image sync {{ .source }} -> {{ .count }} nodes"
ImageSyncTaskName: "Image sync {{ .count }} images"
SSLSyncTaskName: "Certificate sync {{ .count }} certificates"
AppSyncTaskName: "App sync {{ .name }}"
SSLSyncToNode: "Push certificate [{{ .cert }}] to node [{{ .node }}]"
ImageSyncSave: "Save image {{ .image }}"
ImageSyncSaveTags: "Save image tags {{ .tags }}"
ImageSyncToNode: "Sync image {{ .image }} to node {{ .node }}"
Expand Down
5 changes: 4 additions & 1 deletion core/i18n/lang/pt-BR.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -314,7 +314,10 @@ HandlePublicKey: "Handle node public key"
ExchangeFile: "Start syncing {{ .sourcePath }} from node {{ .source }} to node {{ .dest }}:{{ .destPath }}"
TaskRsync: "Sync"
NodeFile: "Node file"
ImageSyncTaskName: "Image sync {{ .source }} -> {{ .count }} nodes"
ImageSyncTaskName: "Image sync {{ .count }} images"
SSLSyncTaskName: "Certificate sync {{ .count }} certificates"
AppSyncTaskName: "App sync {{ .name }}"
SSLSyncToNode: "Push certificate [{{ .cert }}] to node [{{ .node }}]"
ImageSyncSave: "Save image {{ .image }}"
ImageSyncSaveTags: "Save image tags {{ .tags }}"
ImageSyncToNode: "Sync image {{ .image }} to node {{ .node }}"
Expand Down
5 changes: 4 additions & 1 deletion core/i18n/lang/ru.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -313,7 +313,10 @@ HandlePublicKey: "Handle node public key"
ExchangeFile: "Start syncing {{ .sourcePath }} from node {{ .source }} to node {{ .dest }}:{{ .destPath }}"
TaskRsync: "Sync"
NodeFile: "Node file"
ImageSyncTaskName: "Image sync {{ .source }} -> {{ .count }} nodes"
ImageSyncTaskName: "Image sync {{ .count }} images"
SSLSyncTaskName: "Certificate sync {{ .count }} certificates"
AppSyncTaskName: "App sync {{ .name }}"
SSLSyncToNode: "Push certificate [{{ .cert }}] to node [{{ .node }}]"
ImageSyncSave: "Save image {{ .image }}"
ImageSyncSaveTags: "Save image tags {{ .tags }}"
ImageSyncToNode: "Sync image {{ .image }} to node {{ .node }}"
Expand Down
5 changes: 4 additions & 1 deletion core/i18n/lang/tr.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -313,7 +313,10 @@ HandlePublicKey: "Handle node public key"
ExchangeFile: "Start syncing {{ .sourcePath }} from node {{ .source }} to node {{ .dest }}:{{ .destPath }}"
TaskRsync: "Sync"
NodeFile: "Node file"
ImageSyncTaskName: "Image sync {{ .source }} -> {{ .count }} nodes"
ImageSyncTaskName: "Image sync {{ .count }} images"
SSLSyncTaskName: "Certificate sync {{ .count }} certificates"
AppSyncTaskName: "App sync {{ .name }}"
SSLSyncToNode: "Push certificate [{{ .cert }}] to node [{{ .node }}]"
ImageSyncSave: "Save image {{ .image }}"
ImageSyncSaveTags: "Save image tags {{ .tags }}"
ImageSyncToNode: "Sync image {{ .image }} to node {{ .node }}"
Expand Down
5 changes: 4 additions & 1 deletion core/i18n/lang/zh-Hant.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -316,7 +316,10 @@ HandlePublicKey: "處理節點公鑰"
ExchangeFile: "開始從 {{ .source }} 節點同步 {{ .sourcePath }} 到 {{ .dest }} 節點 {{ .destPath }}"
TaskRsync: "同步"
NodeFile: "節點檔案"
ImageSyncTaskName: "映像同步 {{ .source }} -> {{ .count }} 個節點"
ImageSyncTaskName: "映像同步 {{ .count }} 張映像"
SSLSyncTaskName: "憑證同步 {{ .count }} 張憑證"
AppSyncTaskName: "應用同步 {{ .name }}"
SSLSyncToNode: "推送憑證 [{{ .cert }}] 到節點 [{{ .node }}]"
ImageSyncSave: "儲存映像 {{ .image }}"
ImageSyncSaveTags: "儲存映像標籤 {{ .tags }}"
ImageSyncToNode: "同步映像 {{ .image }} 到節點 {{ .node }}"
Expand Down
5 changes: 4 additions & 1 deletion core/i18n/lang/zh.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -322,7 +322,10 @@ HandlePublicKey: "处理节点公钥"
ExchangeFile: "开始从 {{ .source }} 节点同步 {{ .sourcePath }} 到 {{ .dest }} 节点 {{ .destPath }}"
TaskRsync: "同步"
NodeFile: "节点文件"
ImageSyncTaskName: "镜像同步 {{ .source }} -> {{ .count }} 个节点"
ImageSyncTaskName: "镜像同步 {{ .count }} 张镜像"
SSLSyncTaskName: "证书同步 {{ .count }} 张证书"
AppSyncTaskName: "应用同步 {{ .name }}"
SSLSyncToNode: "推送证书 [{{ .cert }}] 到节点 [{{ .node }}]"
ImageSyncSave: "保存镜像 {{ .image }}"
ImageSyncSaveTags: "保存镜像标签 {{ .tags }}"
ImageSyncToNode: "同步镜像 {{ .image }} 到节点 {{ .node }}"
Expand Down
3 changes: 2 additions & 1 deletion frontend/src/api/interface/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ export namespace App {
message: string;
httpPort: number;
container: string;
env: { [key: string]: string };
env: { [key: string]: any };
appKey: string;
}

Expand Down Expand Up @@ -209,6 +209,7 @@ export namespace App {
app: App.AppDetail;
linkDB: boolean;
resourceKeys?: string[];
env?: { [key: string]: any };
}

export interface AppInstalledOption {
Expand Down
6 changes: 3 additions & 3 deletions frontend/src/lang/modules/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5527,10 +5527,10 @@ const message = {
imageBatchDesc: 'Select a source node and image first, then batch-transfer to multiple target nodes.',
imageBatchConfirmPrefix: 'About to transfer {0} images to {1} nodes, for a total of {2} tasks.',

cert: 'Certificate Sync',
certBatchDesc:
ssl: 'Certificate Sync',
sslBatchDesc:
'After selecting a source node, sync the specified certificate into the current panel environment.',
certBatchConfirmPrefix: 'About to sync {0} certificates to {1} nodes, for a total of {2} tasks.',
sslBatchConfirmPrefix: 'About to sync {0} certificates to {1} nodes, for a total of {2} tasks.',

app: 'Application Transfer',
appBatchDesc:
Expand Down
6 changes: 3 additions & 3 deletions frontend/src/lang/modules/es-es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5575,10 +5575,10 @@ const message = {
'Seleccione primero el nodo de origen y las imágenes de origen, luego elija los nodos de destino para reenviar.',
imageBatchConfirmPrefix: 'Se enviarán {0} imágenes a {1} nodos, creando {2} tareas.',

cert: 'Sincronización de certificados',
certBatchDesc:
ssl: 'Sincronización de certificados',
sslBatchDesc:
'Después de seleccionar el nodo de origen, los certificados especificados pueden sincronizarse con el entorno actual del panel.',
certBatchConfirmPrefix: 'Se sincronizarán {0} certificados a {1} nodos, creando {2} tareas.',
sslBatchConfirmPrefix: 'Se sincronizarán {0} certificados a {1} nodos, creando {2} tareas.',

app: 'Transferencia de Aplicaciones',
appBatchDesc:
Expand Down
6 changes: 3 additions & 3 deletions frontend/src/lang/modules/fa.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5499,9 +5499,9 @@ const message = {
'ابتدا یک گره منبع و تصویر را انتخاب کنید، سپس به صورت دسته‌ای به چندین گره هدف انتقال دهید.',
imageBatchConfirmPrefix: 'در حال انتقال {0} تصویر به {1} گره، مجموعاً {2} وظیفه.',

cert: 'همگام‌سازی گواهی',
certBatchDesc: 'پس از انتخاب یک گره منبع، گواهی مشخص شده را به محیط پنل فعلی همگام‌سازی کنید.',
certBatchConfirmPrefix: 'در حال همگام‌سازی {0} گواهی به {1} گره، مجموعاً {2} وظیفه.',
ssl: 'همگام‌سازی گواهی',
sslBatchDesc: 'پس از انتخاب یک گره منبع، گواهی مشخص شده را به محیط پنل فعلی همگام‌سازی کنید.',
sslBatchConfirmPrefix: 'در حال همگام‌سازی {0} گواهی به {1} گره، مجموعاً {2} وظیفه.',

app: 'انتقال برنامه',
appBatchDesc:
Expand Down
6 changes: 3 additions & 3 deletions frontend/src/lang/modules/ja.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5546,9 +5546,9 @@ const message = {
imageBatchConfirmPrefix:
'{0} 個のイメージを {1} 個のノードへ転送します。合計 {2} 件のタスクが作成されます。',

cert: '証明書同期',
certBatchDesc: 'ソースノードを選択すると、指定した証明書を現在のパネル環境へ同期できます。',
certBatchConfirmPrefix: '{0} 件の証明書を {1} 個のノードへ同期します。合計 {2} 件のタスクが作成されます。',
ssl: '証明書同期',
sslBatchDesc: 'ソースノードを選択すると、指定した証明書を現在のパネル環境へ同期できます。',
sslBatchConfirmPrefix: '{0} 件の証明書を {1} 個のノードへ同期します。合計 {2} 件のタスクが作成されます。',

app: 'アプリ転送',
appBatchDesc:
Expand Down
6 changes: 3 additions & 3 deletions frontend/src/lang/modules/ko.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5431,9 +5431,9 @@ const message = {
imageBatchDesc: '먼저 원본 노드와 원본 이미지를 선택한 후 대상 노드를 선택하여 전달합니다.',
imageBatchConfirmPrefix: '{0}개의 이미지를 {1}개 노드로 전달합니다. 총 {2}개의 작업이 생성됩니다.',

cert: '인증서 동기화',
certBatchDesc: '원본 노드를 선택한 후 지정된 인증서를 현재 패널 환경으로 동기화할 수 있습니다.',
certBatchConfirmPrefix: '{0}개의 인증서를 {1}개 노드로 동기화합니다. 총 {2}개의 작업이 생성됩니다.',
ssl: '인증서 동기화',
sslBatchDesc: '원본 노드를 선택한 후 지정된 인증서를 현재 패널 환경으로 동기화할 수 있습니다.',
sslBatchConfirmPrefix: '{0}개의 인증서를 {1}개 노드로 동기화합니다. 총 {2}개의 작업이 생성됩니다.',

app: '애플리케이션 전송',
appBatchDesc:
Expand Down
Loading
Loading