Compare commits

...
Author SHA1 Message Date
guoyuqi 5e12ce056b feat(sync): sync php extended template 2026-11-05 15:42:53 +08:00
guoyuqi c7bd036390 feat(sync): sync php extended template 2026-11-04 16:55:22 +08:00
48 changed files with 731 additions and 21 deletions
+43
View File
@@ -103,3 +103,46 @@ func (b *BaseApi) DeletePHPExtensions(c *gin.Context) {
}
helper.Success(c)
}
// @Router /runtimes/php/extensions/detail [post]
func (b *BaseApi) GetPHPExtensions(c *gin.Context) {
var req request.PHPExtensionsDelete
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
item, err := phpExtensionsService.Get(req.ID)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, item)
}
// @Router /runtimes/php/extensions/import [post]
// @x-panel-log {"bodyKeys":["name"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"同步 PHP 扩展模版 [name]","formatEN":"Sync PHP extension template [name]"}
func (b *BaseApi) ImportPHPExtensions(c *gin.Context) {
var req request.PHPExtensionsCreate
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
status, err := phpExtensionsService.Import(req)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, status)
}
// @Router /runtimes/php/extensions/push [post]
// @x-panel-log {"bodyKeys":["sourceNode","targetNodes"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"推送 PHP 扩展模版 [sourceNode] 至 [targetNodes]","formatEN":"Push PHP extension template from [sourceNode] to [targetNodes]"}
func (b *BaseApi) PushPHPExtensions(c *gin.Context) {
var req dto.PHPExtensionsPush
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := phpExtensionsService.Push(req); err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
+9
View File
@@ -0,0 +1,9 @@
package dto
// PHPExtensionsPush is submitted to the master agent, with an explicit source node.
type PHPExtensionsPush struct {
SourceNode string `json:"sourceNode" validate:"required"`
TargetNodes []string `json:"targetNodes" validate:"required,min=1,dive,required"`
ID uint `json:"id" validate:"required"`
TaskID string `json:"taskID" validate:"required,uuid"`
}
+1
View File
@@ -5,6 +5,7 @@ import "github.com/1Panel-dev/1Panel/agent/app/dto"
type PHPExtensionsSearch struct {
dto.PageInfo
All bool `json:"all"`
Name string `json:"name"`
}
type PHPExtensionsCreate struct {
+53 -1
View File
@@ -1,13 +1,22 @@
package service
import (
"errors"
"sync"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/1Panel-dev/1Panel/agent/app/dto/request"
"github.com/1Panel-dev/1Panel/agent/app/dto/response"
"github.com/1Panel-dev/1Panel/agent/app/model"
"github.com/1Panel-dev/1Panel/agent/app/repo"
"github.com/1Panel-dev/1Panel/agent/buserr"
"github.com/1Panel-dev/1Panel/agent/global"
"github.com/1Panel-dev/1Panel/agent/utils/xpack"
"gorm.io/gorm"
)
var phpExtensionsMu sync.Mutex
type PHPExtensionsService struct {
}
@@ -17,6 +26,9 @@ type IPHPExtensionsService interface {
Create(req request.PHPExtensionsCreate) error
Update(req request.PHPExtensionsUpdate) error
Delete(req request.PHPExtensionsDelete) error
Get(id uint) (model.PHPExtensions, error)
Import(req request.PHPExtensionsCreate) (string, error)
Push(req dto.PHPExtensionsPush) error
}
func NewIPHPExtensionsService() IPHPExtensionsService {
@@ -30,7 +42,7 @@ func (p PHPExtensionsService) Page(req request.PHPExtensionsSearch) (int64, []re
err error
result []response.PHPExtensionsDTO
)
total, extensions, err = phpExtensionsRepo.Page(req.Page, req.PageSize)
total, extensions, err = phpExtensionsRepo.Page(req.Page, req.PageSize, repo.WithByLikeName(req.Name))
if err != nil {
return 0, nil, err
}
@@ -61,6 +73,8 @@ func (p PHPExtensionsService) List() ([]response.PHPExtensionsDTO, error) {
}
func (p PHPExtensionsService) Create(req request.PHPExtensionsCreate) error {
phpExtensionsMu.Lock()
defer phpExtensionsMu.Unlock()
exist, _ := phpExtensionsRepo.GetFirst(repo.WithByName(req.Name))
if exist.ID > 0 {
return buserr.New("ErrNameIsExist")
@@ -73,6 +87,8 @@ func (p PHPExtensionsService) Create(req request.PHPExtensionsCreate) error {
}
func (p PHPExtensionsService) Update(req request.PHPExtensionsUpdate) error {
phpExtensionsMu.Lock()
defer phpExtensionsMu.Unlock()
exist, err := phpExtensionsRepo.GetFirst(repo.WithByID(req.ID))
if err != nil {
return err
@@ -82,5 +98,41 @@ func (p PHPExtensionsService) Update(req request.PHPExtensionsUpdate) error {
}
func (p PHPExtensionsService) Delete(req request.PHPExtensionsDelete) error {
phpExtensionsMu.Lock()
defer phpExtensionsMu.Unlock()
return phpExtensionsRepo.DeleteBy(repo.WithByID(req.ID))
}
func (p PHPExtensionsService) Get(id uint) (model.PHPExtensions, error) {
return phpExtensionsRepo.GetFirst(repo.WithByID(id))
}
func (p PHPExtensionsService) Import(req request.PHPExtensionsCreate) (string, error) {
phpExtensionsMu.Lock()
defer phpExtensionsMu.Unlock()
existing, err := phpExtensionsRepo.GetFirst(repo.WithByName(req.Name))
if err == nil {
if existing.Extensions == req.Extensions {
return "skipped", nil
}
return "", buserr.New("ErrPHPExtensionsConflict")
}
if !errors.Is(err, gorm.ErrRecordNotFound) {
return "", err
}
item := model.PHPExtensions{Name: req.Name, Extensions: req.Extensions}
if err := phpExtensionsRepo.Create(&item); err != nil {
return "", err
}
return "created", nil
}
func (p PHPExtensionsService) Push(req dto.PHPExtensionsPush) error {
if !global.IsMaster {
return errors.New("PHP extension template sync must be submitted to the master node")
}
if !xpack.MultiNodeProvider.IsXpack() {
return buserr.New("ErrXpackNotFound")
}
return xpack.MultiNodeProvider.PushPHPExtensionsToNode(req)
}
+2
View File
@@ -815,3 +815,5 @@ ContainerImageCheckSummary: "Check finished: {{ .checked }} checked, {{ .updates
ContainerImageCheckFailures: "{{ .count }} container checks failed; see the task log"
ErrImageCheckProxyRequired: "To check for image updates in the current runtime environment, please configure a proxy server first."
ErrPHPExtensionsConflict: "A PHP extension template with this name exists with different content"
+2
View File
@@ -815,3 +815,5 @@ ContainerImageCheckSummary: "Comprobación finalizada: comprobados {{ .checked }
ContainerImageCheckFailures: "Falló la comprobación de {{ .count }} contenedores; consulte el registro de la tarea"
ErrImageCheckProxyRequired: "Para comprobar actualizaciones de imágenes en el entorno actual, configura primero un servidor proxy."
ErrPHPExtensionsConflict: "Ya existe una plantilla de extensiones PHP con el mismo nombre y distinto contenido; no se ha sobrescrito"
+2
View File
@@ -816,3 +816,5 @@ ContainerImageCheckSummary: "بررسی پایان یافت: بررسی‌شده
ContainerImageCheckFailures: "بررسی {{ .count }} کانتینر ناموفق بود؛ گزارش وظیفه را مشاهده کنید"
ErrImageCheckProxyRequired: "برای بررسی به‌روزرسانی تصاویر در محیط فعلی، ابتدا یک سرور پروکسی پیکربندی کنید."
ErrPHPExtensionsConflict: "الگوی افزونه‌های PHP با این نام و محتوای متفاوت از قبل وجود دارد؛ بازنویسی نشد"
+2
View File
@@ -815,3 +815,5 @@ ContainerImageCheckSummary: "確認終了:成功 {{ .checked }}、更新可能
ContainerImageCheckFailures: "{{ .count }} コンテナの確認に失敗しました。タスクログを確認してください"
ErrImageCheckProxyRequired: "現在の実行環境でイメージの更新を確認するには、先にプロキシサーバーを設定してください。"
ErrPHPExtensionsConflict: "同名の PHP 拡張テンプレートが異なる内容で存在するため、上書きしませんでした"
+2
View File
@@ -815,3 +815,5 @@ ContainerImageCheckSummary: "확인 종료: 성공 {{ .checked }}, 업데이트
ContainerImageCheckFailures: "컨테이너 {{ .count }}개 확인에 실패했습니다. 작업 로그를 확인하세요"
ErrImageCheckProxyRequired: "현재 실행 환경에서 이미지 업데이트를 확인하려면 먼저 프록시 서버를 설정하세요."
ErrPHPExtensionsConflict: "이름은 같지만 내용이 다른 PHP 확장 템플릿이 이미 있어 덮어쓰지 않았습니다"
+2
View File
@@ -806,3 +806,5 @@ ContainerImageCheckSummary: "ກວດສອບສິ້ນສຸດ: ກວດ
ContainerImageCheckFailures: "ກວດສອບ {{ .count }} ຄອນເທນເນີລົ້ມເຫຼວ; ກະລຸນາເບິ່ງບັນທຶກວຽກ"
ErrImageCheckProxyRequired: "ເພື່ອກວດສອບການອັບເດດອິມເມຈໃນສະພາບແວດລ້ອມປັດຈຸບັນ ກະລຸນາຕັ້ງຄ່າພຣັອກຊີເຊີບເວີກ່ອນ."
ErrPHPExtensionsConflict: "ມີແມ່ແບບສ່ວນຂະຫຍາຍ PHP ຊື່ດຽວກັນແຕ່ເນື້ອຫາຕ່າງກັນຢູ່ແລ້ວ; ບໍ່ໄດ້ຂຽນທັບ"
+2
View File
@@ -815,3 +815,5 @@ ContainerImageCheckSummary: "Semakan selesai: disemak {{ .checked }}, boleh dike
ContainerImageCheckFailures: "Semakan {{ .count }} kontena gagal; lihat log tugas"
ErrImageCheckProxyRequired: "Untuk menyemak kemas kini imej dalam persekitaran semasa, sila konfigurasikan pelayan proksi terlebih dahulu."
ErrPHPExtensionsConflict: "Templat sambungan PHP dengan nama yang sama tetapi kandungan berbeza sudah wujud; tidak ditulis ganti"
+2
View File
@@ -815,3 +815,5 @@ ContainerImageCheckSummary: "Verificação concluída: verificados {{ .checked }
ContainerImageCheckFailures: "Falha na verificação de {{ .count }} contêineres; consulte o log da tarefa"
ErrImageCheckProxyRequired: "Para verificar atualizações de imagens no ambiente atual, configure primeiro um servidor proxy."
ErrPHPExtensionsConflict: "Já existe um modelo de extensões PHP com o mesmo nome e conteúdo diferente; ele não foi sobrescrito"
+2
View File
@@ -815,3 +815,5 @@ ContainerImageCheckSummary: "Проверка завершена: провере
ContainerImageCheckFailures: "Не удалось проверить контейнеры: {{ .count }}. Подробности в журнале задачи"
ErrImageCheckProxyRequired: "Для проверки обновлений образов в текущей среде сначала настройте прокси-сервер."
ErrPHPExtensionsConflict: "Шаблон расширений PHP с таким именем уже существует и имеет другое содержимое; перезапись не выполнена"
+2
View File
@@ -815,3 +815,5 @@ ContainerImageCheckSummary: "Denetim tamamlandı: denetlenen {{ .checked }}, gü
ContainerImageCheckFailures: "{{ .count }} konteyner denetlenemedi; görev günlüğünü inceleyin"
ErrImageCheckProxyRequired: "Geçerli çalışma ortamında imaj güncellemelerini kontrol etmek için önce bir proxy sunucusu yapılandırın."
ErrPHPExtensionsConflict: "Aynı ada sahip farklı içerikli bir PHP eklenti şablonu zaten var; üzerine yazılmadı"
+2
View File
@@ -815,3 +815,5 @@ ContainerImageCheckSummary: "檢查結束:成功 {{ .checked }},可升級 {{
ContainerImageCheckFailures: "{{ .count }} 個容器檢查失敗,請查看任務日誌"
ErrImageCheckProxyRequired: "目前運行環境下,如需檢查映像是否更新,請先設定代理伺服器"
ErrPHPExtensionsConflict: "同名 PHP 擴充模版已存在且內容不同,未覆蓋"
+2
View File
@@ -815,3 +815,5 @@ ContainerImageCheckSummary: "检查结束:成功 {{ .checked }},可升级 {{
ContainerImageCheckFailures: "{{ .count }} 个容器检查失败,请查看任务日志"
ErrImageCheckProxyRequired: "当前运行环境下,如需检查镜像是否更新,请优先配置代理服务器"
ErrPHPExtensionsConflict: "同名 PHP 扩展模版已存在且内容不同,未覆盖"
+3
View File
@@ -27,6 +27,9 @@ func (r *RuntimeRouter) InitRouter(Router *gin.RouterGroup) {
groupRouter.POST("/node/modules/operate", baseApi.OperateNodeModules)
groupRouter.POST("/php/extensions/search", baseApi.PagePHPExtensions)
groupRouter.POST("/php/extensions/detail", baseApi.GetPHPExtensions)
groupRouter.POST("/php/extensions/import", baseApi.ImportPHPExtensions)
groupRouter.POST("/php/extensions/push", baseApi.PushPHPExtensions)
groupRouter.POST("/php/extensions", baseApi.CreatePHPExtensions)
groupRouter.POST("/php/extensions/update", baseApi.UpdatePHPExtensions)
groupRouter.POST("/php/extensions/del", baseApi.DeletePHPExtensions)
+4
View File
@@ -72,3 +72,7 @@ func (m *multiNodeHelper) PushSSLToNode(websiteSSL *model.WebsiteSSL) error {
func (m *multiNodeHelper) GetAgentInfo() (*dto.AgentInfo, error) {
return nil, nil
}
func (m *multiNodeHelper) PushPHPExtensionsToNode(req dto.PHPExtensionsPush) error {
return buserr.New("ErrXpackNotFound")
}
@@ -19,5 +19,6 @@ type MultiNodeProvider interface {
LoadRequestTransport() *http.Transport
ValidateCertificate(c *gin.Context) bool
PushSSLToNode(websiteSSL *model.WebsiteSSL) error
PushPHPExtensionsToNode(req dto.PHPExtensionsPush) error
GetAgentInfo() (*dto.AgentInfo, error)
}
+1
View File
@@ -200,6 +200,7 @@ var WebUrlMap = map[string]struct{}{
"/xpack/simple-node": {},
"/xpack/sync/file": {},
"/xpack/sync/image": {},
"/xpack/sync/php-extensions": {},
"/xpack/sync/ssl": {},
"/xpack/sync/app": {},
"/xpack/app": {},
+4
View File
@@ -587,6 +587,10 @@ MCPInstallRecoveryFailed: "Installation failed and service recovery is incomplet
MCPInstallLocalImage: "The image exists locally; skip downloading"
MCPInstallVerifyImage: "Validate the image version and managed service contract"
MCPInstallVerifiedImage: "Image validation passed"
PHPExtensionsNoTargets: "No target nodes remain after excluding the source node"
PHPExtensionsSyncTask: "Sync PHP extension template [{{ .name }}]"
PHPExtensionsSyncSkipped: "Node [{{ .node }}] already has an identical template; skipped"
MCPInstallCleanup: "Clean up the previous container"
MCPInstallOldContainerRemoved: "Previous container removed"
MCPInstallOldImageRemoved: "Previous image removed"
+4
View File
@@ -587,6 +587,10 @@ MCPInstallRecoveryFailed: "Instalación fallida y recuperación incompleta. Veri
MCPInstallLocalImage: "La imagen ya existe localmente; omitir la descarga"
MCPInstallVerifyImage: "Validar la versión de la imagen y el contrato del servicio administrado"
MCPInstallVerifiedImage: "La imagen superó la validación"
PHPExtensionsNoTargets: "No quedan nodos de destino tras excluir el nodo de origen"
PHPExtensionsSyncTask: "Sincronizar plantilla de extensiones PHP [{{ .name }}]"
PHPExtensionsSyncSkipped: "El nodo [{{ .node }}] ya tiene una plantilla idéntica; se ha omitido"
MCPInstallCleanup: "Limpiar el contenedor anterior"
MCPInstallOldContainerRemoved: "Contenedor anterior eliminado"
MCPInstallOldImageRemoved: "Imagen anterior eliminada"
+4
View File
@@ -587,6 +587,10 @@ MCPInstallRecoveryFailed: "نصب ناموفق و بازیابی سرویس نا
MCPInstallLocalImage: "تصویر به‌صورت محلی موجود است؛ دریافت انجام نمی‌شود"
MCPInstallVerifyImage: "اعتبارسنجی نسخه تصویر و قرارداد سرویس مدیریت‌شده"
MCPInstallVerifiedImage: "اعتبارسنجی تصویر موفق بود"
PHPExtensionsNoTargets: "پس از حذف گره مبدأ از فهرست، هیچ گره مقصدی باقی نمانده است"
PHPExtensionsSyncTask: "همگام‌سازی الگوی افزونه‌های PHP [{{ .name }}]"
PHPExtensionsSyncSkipped: "گره [{{ .node }}] از قبل الگوی یکسانی دارد؛ رد شد"
MCPInstallCleanup: "پاک‌سازی کانتینر قبلی"
MCPInstallOldContainerRemoved: "کانتینر قبلی حذف شد"
MCPInstallOldImageRemoved: "ایمیج قبلی حذف شد"
+4
View File
@@ -587,6 +587,10 @@ MCPInstallRecoveryFailed: "インストールに失敗し、サービスの復
MCPInstallLocalImage: "ローカルにイメージが存在するため、ダウンロードをスキップ"
MCPInstallVerifyImage: "イメージのバージョンと管理対象サービスの契約を検証"
MCPInstallVerifiedImage: "イメージの検証に成功しました"
PHPExtensionsNoTargets: "ソースノードを除外した結果、同期先ノードがありません"
PHPExtensionsSyncTask: "PHP 拡張テンプレート [{{ .name }}] を同期"
PHPExtensionsSyncSkipped: "ノード [{{ .node }}] に同一のテンプレートが存在するため、スキップしました"
MCPInstallCleanup: "以前のコンテナーをクリーンアップ"
MCPInstallOldContainerRemoved: "以前のコンテナーを削除しました"
MCPInstallOldImageRemoved: "以前のイメージを削除しました"
+4
View File
@@ -587,6 +587,10 @@ MCPInstallRecoveryFailed: "설치에 실패했고 서비스 복원이 불완전
MCPInstallLocalImage: "로컬 이미지가 있어 다운로드를 건너뜁니다"
MCPInstallVerifyImage: "이미지 버전 및 관리형 서비스 계약 검증"
MCPInstallVerifiedImage: "이미지 검증 통과"
PHPExtensionsNoTargets: "소스 노드를 제외하면 동기화할 대상 노드가 없습니다"
PHPExtensionsSyncTask: "PHP 확장 템플릿 [{{ .name }}] 동기화"
PHPExtensionsSyncSkipped: "노드 [{{ .node }}]에 동일한 템플릿이 이미 있어 건너뛰었습니다"
MCPInstallCleanup: "이전 컨테이너 정리"
MCPInstallOldContainerRemoved: "이전 컨테이너가 삭제되었습니다"
MCPInstallOldImageRemoved: "이전 이미지가 삭제되었습니다"
+4
View File
@@ -587,6 +587,10 @@ MCPInstallRecoveryFailed: "ຕິດຕັ້ງບໍ່ສຳເລັດແ
MCPInstallLocalImage: "ມີອິມເມດຢູ່ໃນເຄື່ອງແລ້ວ; ຂ້າມການດາວໂຫຼດ"
MCPInstallVerifyImage: "ກວດສອບເວີຊັນອິມເມດ ແລະ ສັນຍາບໍລິການທີ່ຈັດການ"
MCPInstallVerifiedImage: "ກວດສອບອິມເມດຜ່ານແລ້ວ"
PHPExtensionsNoTargets: "ບໍ່ມີໂນດປາຍທາງຫຼັງຈາກຍົກເວັ້ນໂນດຕົ້ນທາງ"
PHPExtensionsSyncTask: "ຊິງໂຄຣໄນແມ່ແບບສ່ວນຂະຫຍາຍ PHP [{{ .name }}]"
PHPExtensionsSyncSkipped: "ໂນດ [{{ .node }}] ມີແມ່ແບບດຽວກັນຢູ່ແລ້ວ; ຂ້າມແລ້ວ"
MCPInstallCleanup: "ກຳລັງລ້າງຄອນເທນເນີເກົ່າ"
MCPInstallOldContainerRemoved: "ລຶບຄອນເທນເນີເກົ່າແລ້ວ"
MCPInstallOldImageRemoved: "ລຶບອິມເມຈເກົ່າແລ້ວ"
+4
View File
@@ -587,6 +587,10 @@ MCPInstallRecoveryFailed: "Pemasangan gagal dan pemulihan tidak lengkap. Sahkan
MCPInstallLocalImage: "Imej sudah tersedia secara setempat; langkau muat turun"
MCPInstallVerifyImage: "Sahkan versi imej dan kontrak perkhidmatan terurus"
MCPInstallVerifiedImage: "Pengesahan imej berjaya"
PHPExtensionsNoTargets: "Tiada nod sasaran selepas nod sumber dikecualikan"
PHPExtensionsSyncTask: "Segerakkan templat sambungan PHP [{{ .name }}]"
PHPExtensionsSyncSkipped: "Nod [{{ .node }}] sudah mempunyai templat yang sama; dilangkau"
MCPInstallCleanup: "Bersihkan bekas terdahulu"
MCPInstallOldContainerRemoved: "Bekas terdahulu dipadam"
MCPInstallOldImageRemoved: "Imej terdahulu dipadam"
+4
View File
@@ -587,6 +587,10 @@ MCPInstallRecoveryFailed: "Instalação falhou e a recuperação está incomplet
MCPInstallLocalImage: "A imagem já existe localmente; ignorar o download"
MCPInstallVerifyImage: "Validar a versão da imagem e o contrato do serviço gerenciado"
MCPInstallVerifiedImage: "A imagem passou na validação"
PHPExtensionsNoTargets: "Não há nós de destino após excluir o nó de origem"
PHPExtensionsSyncTask: "Sincronizar modelo de extensões PHP [{{ .name }}]"
PHPExtensionsSyncSkipped: "O nó [{{ .node }}] já possui um modelo idêntico; ignorado"
MCPInstallCleanup: "Limpar o contêiner anterior"
MCPInstallOldContainerRemoved: "Contêiner anterior removido"
MCPInstallOldImageRemoved: "Imagem anterior removida"
+4
View File
@@ -587,6 +587,10 @@ MCPInstallRecoveryFailed: "Установка не удалась, служба
MCPInstallLocalImage: "Образ уже есть локально; пропустить загрузку"
MCPInstallVerifyImage: "Проверить версию образа и контракт управляемой службы"
MCPInstallVerifiedImage: "Образ успешно проверен"
PHPExtensionsNoTargets: "После исключения исходного узла не осталось целевых узлов"
PHPExtensionsSyncTask: "Синхронизация шаблона расширений PHP [{{ .name }}]"
PHPExtensionsSyncSkipped: "На узле [{{ .node }}] уже есть идентичный шаблон; пропущено"
MCPInstallCleanup: "Очистка предыдущего контейнера"
MCPInstallOldContainerRemoved: "Предыдущий контейнер удалён"
MCPInstallOldImageRemoved: "Предыдущий образ удалён"
+4
View File
@@ -587,6 +587,10 @@ MCPInstallRecoveryFailed: "Kurulum başarısız ve hizmet tam geri yüklenemedi.
MCPInstallLocalImage: "İmaj yerel olarak mevcut; indirmeyi atla"
MCPInstallVerifyImage: "İmaj sürümünü ve yönetilen hizmet sözleşmesini doğrula"
MCPInstallVerifiedImage: "İmaj doğrulaması başarılı"
PHPExtensionsNoTargets: "Kaynak düğüm hariç tutulduktan sonra hedef düğüm kalmadı"
PHPExtensionsSyncTask: "PHP eklenti şablonunu eşitle [{{ .name }}]"
PHPExtensionsSyncSkipped: "[{{ .node }}] düğümünde aynı şablon zaten var; atlandı"
MCPInstallCleanup: "Önceki konteyneri temizle"
MCPInstallOldContainerRemoved: "Önceki konteyner silindi"
MCPInstallOldImageRemoved: "Önceki imaj silindi"
+4
View File
@@ -587,6 +587,10 @@ MCPInstallRecoveryFailed: "安裝失敗且原服務還原不完整,請核對
MCPInstallLocalImage: "本機映像已存在,略過下載"
MCPInstallVerifyImage: "驗證映像版本及受管契約"
MCPInstallVerifiedImage: "映像驗證通過"
PHPExtensionsNoTargets: "排除來源節點後,沒有可同步的目標節點"
PHPExtensionsSyncTask: "同步 PHP 擴充模版 [{{ .name }}]"
PHPExtensionsSyncSkipped: "節點 [{{ .node }}] 已存在相同模版,略過"
MCPInstallCleanup: "正在清理舊容器"
MCPInstallOldContainerRemoved: "舊容器已刪除"
MCPInstallOldImageRemoved: "舊映像已刪除"
+4
View File
@@ -587,6 +587,10 @@ MCPInstallRecoveryFailed: "安装失败且原服务恢复不完整,请核对
MCPInstallLocalImage: "本地镜像已存在,跳过下载"
MCPInstallVerifyImage: "校验镜像版本和受管契约"
MCPInstallVerifiedImage: "镜像校验通过"
PHPExtensionsNoTargets: "排除源节点后,没有可同步的目标节点"
PHPExtensionsSyncTask: "同步 PHP 扩展模版 [{{ .name }}]"
PHPExtensionsSyncSkipped: "节点 [{{ .node }}] 已存在相同模版,跳过"
MCPInstallCleanup: "正在清理旧容器"
MCPInstallOldContainerRemoved: "旧容器已删除"
MCPInstallOldImageRemoved: "旧镜像已删除"
+3 -1
View File
@@ -199,5 +199,7 @@ func checkSession(c *gin.Context, refresh bool) bool {
}
func isLocalAPI(urlPath string) bool {
return urlPath == "/api/v2/core/xpack/sync/ssl" || urlPath == "/api/v2/core/xpack/settings/search"
return urlPath == "/api/v2/core/xpack/sync/ssl" ||
urlPath == "/api/v2/core/xpack/sync/php/extensions" ||
urlPath == "/api/v2/core/xpack/settings/search"
}
+1 -1
View File
@@ -98,7 +98,7 @@ func isLocalSyncRequest(reqPath, clientIP, token string) bool {
}
switch reqPath {
case "/api/v2/core/xpack/sync/ssl":
case "/api/v2/core/xpack/sync/ssl", "/api/v2/core/xpack/sync/php/extensions":
return token != ""
case "/api/v2/core/settings/ssl/reload":
return token != ""
+7
View File
@@ -1,6 +1,13 @@
import { CommonModel, ReqPage } from '.';
import { App } from './app';
export namespace Runtime {
export interface PHPExtensionsPush {
sourceNode: string;
targetNodes: string[];
id: number;
taskID: string;
}
export interface Runtime extends CommonModel {
name: string;
appDetailID: number;
+11 -2
View File
@@ -46,8 +46,13 @@ export const OperateNodeModule = (req: Runtime.NodeModuleReq) => {
return http.post<any>(`/runtimes/node/modules/operate`, req, TimeoutEnum.T_10M);
};
export const SearchPHPExtensions = (req: ReqPage) => {
return http.post<ResPage<Runtime.PHPExtensions>>(`/runtimes/php/extensions/search`, req);
export const SearchPHPExtensions = (req: ReqPage & { name?: string }, currentNode?: string) => {
return http.post<ResPage<Runtime.PHPExtensions>>(
`/runtimes/php/extensions/search`,
req,
undefined,
currentNode ? { CurrentNode: currentNode } : undefined,
);
};
export const ListPHPExtensions = (req: Runtime.PHPExtensionsList) => {
@@ -137,3 +142,7 @@ export const updateRemark = (req: Runtime.RemarkUpdate) => {
export const getFPMStatus = (id: number) => {
return http.get<Runtime.FpmStatus[]>(`/runtimes/php/fpm/status/${id}`);
};
export const PushPHPExtensions = (req: Runtime.PHPExtensionsPush) => {
return http.post(`/runtimes/php/extensions/push`, req, undefined, { CurrentNode: 'local' });
};
+43
View File
@@ -4009,6 +4009,13 @@ const message = {
nodeApp: 'Upgrade to Commercial Edition to upgrade multi-node app versions without switching nodes manually.',
nodeDashboard:
'Upgrade to Commercial Edition for centralized management of multi-node apps, websites, databases, and scheduled tasks.',
imageExchange: 'Upgrade to Commercial Edition to transfer container images between nodes in batches.',
appExchange:
'Upgrade to Commercial Edition to migrate installed applications to target nodes and confirm their resource dependencies.',
sslSync:
'Upgrade to Commercial Edition to synchronize certificates from a source node to one or more target nodes.',
phpExtensionsSync:
'Upgrade to Commercial Edition to synchronize PHP extension templates to one or more target nodes.',
fileExchange: 'Upgrade to Commercial Edition to transfer files quickly between servers.',
app: 'Upgrade to Commercial Edition to view service details, anomaly monitoring, and more in the mobile app.',
cluster: 'Upgrade to Commercial Edition to manage MySQL/Postgres/Redis primary-replica clusters.',
@@ -7036,6 +7043,35 @@ const message = {
nodeContent3: "Real-time monitoring of each node's operational status",
nodeTitle4: 'Quick Remote Connection',
nodeContent4: 'One-click direct connection to node remote terminals',
imageExchangeTitle1: 'Select source images',
imageExchangeContent1: 'Browse container images on the source node and select the images to transfer.',
imageExchangeTitle2: 'Distribute images',
imageExchangeContent2: 'Transfer selected images to one or more target nodes.',
imageExchangeTitle3: 'View transfer logs',
imageExchangeContent3: 'Track image transfer progress and results in task logs.',
appExchangeTitle1: 'Select an application',
appExchangeContent1: 'Browse installed applications on the source node and select one to migrate.',
appExchangeTitle2: 'Confirm dependencies',
appExchangeContent2: 'Confirm target nodes and required resources, such as databases, before migration.',
appExchangeTitle3: 'Migrate applications',
appExchangeContent3:
'Transfer application backups to target nodes for restoration and view results in task logs.',
sslSyncTitle1: 'Select certificates',
sslSyncContent1: 'Browse certificate details on the source node and select certificates to synchronize.',
sslSyncTitle2: 'Synchronize across nodes',
sslSyncContent2:
'Synchronize selected certificates to target nodes, automatically excluding the source node.',
sslSyncTitle3: 'Confirm sync tasks',
sslSyncContent3: 'Review target nodes and certificates before execution, then view results in task logs.',
phpExtensionsSyncTitle1: 'Select a template',
phpExtensionsSyncContent1:
'Browse template names and extension lists on the source node and select a template to synchronize.',
phpExtensionsSyncTitle2: 'Synchronize templates',
phpExtensionsSyncContent2:
'Synchronize the selected template to target nodes, automatically excluding the source node.',
phpExtensionsSyncTitle3: 'Check existing templates',
phpExtensionsSyncContent3:
'Skip templates with identical names and content. Report conflicts without overwriting different content.',
fileExchangeTitle1: 'Key Authentication Transmission',
fileExchangeContent1: 'Authenticate via SSH keys to ensure transmission security.',
fileExchangeTitle2: 'Efficient File Synchronization',
@@ -7550,6 +7586,13 @@ const message = {
imageBatchConfirmPrefix: 'About to transfer {0} images to {1} nodes, for a total of {2} tasks.',
ssl: 'Certificate Sync',
phpExtensions: 'PHP Extension Template Sync',
phpExtensionsTitle: 'Extension Template Sync',
phpExtensionsDesc: 'Select a source node to sync its PHP extension template to target nodes.',
phpExtensionsList: 'PHP extensions',
phpExtensionsConfirm: 'Sync {0} PHP extension template(s) to {1} node(s).',
phpExtensionsConflictHint:
'Identical templates are skipped. Same-name templates with different content are reported as conflicts and will not be overwritten.',
sslBatchDesc:
'After selecting a source node, sync the specified certificate into the current panel environment.',
sslBatchConfirmPrefix: 'About to sync {0} certificates to {1} nodes, for a total of {2} tasks.',
+51
View File
@@ -4086,6 +4086,14 @@ const message = {
'Actualizar a la edición comercial permite actualizar versiones de aplicaciones multinodo sin cambiar de nodo manualmente.',
nodeDashboard:
'Actualizar a la edición comercial permite la gestión centralizada de aplicaciones, sitios web, bases de datos y tareas programadas multinodo.',
imageExchange:
'Actualice a la edición comercial para transferir imágenes de contenedores entre nodos por lotes.',
appExchange:
'Actualice a la edición comercial para migrar aplicaciones instaladas a nodos de destino y confirmar sus recursos dependientes.',
sslSync:
'Actualice a la edición comercial para sincronizar certificados del nodo de origen con uno o varios nodos de destino.',
phpExtensionsSync:
'Actualice a la edición comercial para sincronizar plantillas de extensiones PHP con uno o varios nodos de destino.',
fileExchange: 'La edición comercial permite transferir archivos entre varios servidores.',
app: 'La edición comercial permite ver información de servicio, monitoreo, etc. vía app móvil.',
cluster:
@@ -7149,6 +7157,41 @@ const message = {
nodeContent3: 'Supervisa en tiempo real el estado operativo de cada nodo',
nodeTitle4: 'Conexión Remota Rápida',
nodeContent4: 'Conecta directamente a la terminal remota de un nodo con un clic',
imageExchangeTitle1: 'Seleccionar imágenes de origen',
imageExchangeContent1:
'Consulte las imágenes de contenedores del nodo de origen y seleccione las que desea transferir.',
imageExchangeTitle2: 'Distribuir imágenes por lotes',
imageExchangeContent2: 'Transfiera las imágenes seleccionadas a uno o varios nodos de destino.',
imageExchangeTitle3: 'Consultar registros de transferencia',
imageExchangeContent3:
'Consulte el progreso y los resultados de la transferencia de imágenes en los registros de tareas.',
appExchangeTitle1: 'Seleccionar una aplicación',
appExchangeContent1:
'Consulte las aplicaciones instaladas en el nodo de origen y seleccione la que desea migrar.',
appExchangeTitle2: 'Confirmar dependencias',
appExchangeContent2:
'Confirme los nodos de destino y los recursos necesarios, como bases de datos, antes de la migración.',
appExchangeTitle3: 'Migrar aplicaciones',
appExchangeContent3:
'Transfiera copias de seguridad de aplicaciones a los nodos de destino para restaurarlas y consulte los resultados en los registros de tareas.',
sslSyncTitle1: 'Seleccionar certificados',
sslSyncContent1:
'Consulte los detalles de los certificados del nodo de origen y seleccione los que desea sincronizar.',
sslSyncTitle2: 'Sincronizar certificados entre nodos',
sslSyncContent2:
'Sincronice los certificados seleccionados con los nodos de destino, excluyendo automáticamente el nodo de origen.',
sslSyncTitle3: 'Confirmar tareas de sincronización',
sslSyncContent3:
'Revise los nodos de destino y los certificados antes de ejecutar la tarea y consulte los resultados en sus registros.',
phpExtensionsSyncTitle1: 'Seleccionar una plantilla',
phpExtensionsSyncContent1:
'Consulte los nombres de las plantillas y sus extensiones en el nodo de origen y seleccione la plantilla que desea sincronizar.',
phpExtensionsSyncTitle2: 'Sincronizar plantillas entre nodos',
phpExtensionsSyncContent2:
'Sincronice la plantilla seleccionada con los nodos de destino, excluyendo automáticamente el nodo de origen.',
phpExtensionsSyncTitle3: 'Comprobar plantillas existentes',
phpExtensionsSyncContent3:
'Se omiten las plantillas con el mismo nombre y contenido. Si el contenido difiere, se informa del conflicto sin sobrescribirlas.',
fileExchangeTitle1: 'Transmisión con Autenticación por Claves',
fileExchangeContent1: 'Autenticación vía claves SSH para garantizar seguridad en la transmisión.',
fileExchangeTitle2: 'Sincronización de Archivos Eficiente',
@@ -7667,6 +7710,14 @@ const message = {
imageBatchConfirmPrefix: 'Se enviarán {0} imágenes a {1} nodos, creando {2} tareas.',
ssl: 'Sincronización de certificados',
phpExtensions: 'Sincronización de plantillas de extensiones PHP',
phpExtensionsTitle: 'Sincronización de plantillas de extensiones',
phpExtensionsDesc:
'Seleccione un nodo de origen para sincronizar su plantilla de extensiones PHP con los nodos de destino.',
phpExtensionsList: 'Lista de extensiones',
phpExtensionsConfirm: 'Se sincronizarán {0} plantillas de extensiones PHP con {1} nodos.',
phpExtensionsConflictHint:
'Se omiten las plantillas con el mismo nombre y contenido. Si el nombre coincide pero el contenido difiere, se informa del conflicto sin sobrescribirlas.',
sslBatchDesc:
'Después de seleccionar el nodo de origen, los certificados especificados pueden sincronizarse con el entorno actual del panel.',
sslBatchConfirmPrefix: 'Se sincronizarán {0} certificados a {1} nodos, creando {2} tareas.',
+42
View File
@@ -3973,6 +3973,10 @@ const message = {
nodeApp: 'برای ارتقاء نسخه برنامه‌های چند گره بدون نیاز به جابجایی دستی بین گره‌ها به نسخه تجاری ارتقاء دهید.',
nodeDashboard:
'برای مدیریت متمرکز برنامه‌ها، وب‌سایت‌ها، پایگاه‌های داده و وظایف زمان‌بندی شده چند گره به نسخه تجاری ارتقاء دهید.',
imageExchange: 'برای انتقال گروهی تصاویر کانتینر بین گره‌ها، به نسخه تجاری ارتقا دهید.',
appExchange: 'برای انتقال برنامه‌های نصب‌شده به گره‌های مقصد و تأیید منابع وابسته، به نسخه تجاری ارتقا دهید.',
sslSync: 'برای همگام‌سازی گواهی‌های گره مبدأ با یک یا چند گره مقصد، به نسخه تجاری ارتقا دهید.',
phpExtensionsSync: 'برای همگام‌سازی الگوهای افزونه‌های PHP با یک یا چند گره مقصد، به نسخه تجاری ارتقا دهید.',
fileExchange: 'برای انتقال سریع فایل‌ها بین سرورها به نسخه تجاری ارتقاء دهید.',
app: 'برای مشاهده جزئیات سرویس، نظارت بر ناهنجاری‌ها و موارد دیگر در برنامه موبایل به نسخه تجاری ارتقاء دهید.',
cluster: 'برای مدیریت خوشه‌های اصلی-برده MySQL/Postgres/Redis به نسخه تجاری ارتقاء دهید.',
@@ -6991,6 +6995,37 @@ const message = {
nodeContent3: 'نظارت بر وضعیت عملیاتی هر گره به صورت بلادرنگ',
nodeTitle4: 'اتصال سریع از راه دور',
nodeContent4: 'اتصال مستقیم یک‌کلیکی به ترمینال‌های از راه دور گره',
imageExchangeTitle1: 'انتخاب تصاویر مبدأ',
imageExchangeContent1: 'تصاویر کانتینر در گره مبدأ را مشاهده و تصاویر موردنظر برای انتقال را انتخاب کنید.',
imageExchangeTitle2: 'توزیع گروهی تصاویر',
imageExchangeContent2: 'تصاویر انتخاب‌شده را به یک یا چند گره مقصد انتقال دهید.',
imageExchangeTitle3: 'مشاهده گزارش‌های انتقال',
imageExchangeContent3: 'پیشرفت و نتایج انتقال تصاویر را در گزارش‌های وظایف مشاهده کنید.',
appExchangeTitle1: 'انتخاب برنامه مبدأ',
appExchangeContent1:
'برنامه‌های نصب‌شده در گره مبدأ را مشاهده و برنامه موردنظر برای انتقال را انتخاب کنید.',
appExchangeTitle2: 'تأیید وابستگی‌ها',
appExchangeContent2: 'پیش از انتقال، گره‌های مقصد و منابع موردنیاز مانند پایگاه‌های داده را تأیید کنید.',
appExchangeTitle3: 'انتقال برنامه‌ها',
appExchangeContent3:
'نسخه‌های پشتیبان برنامه‌ها را برای بازیابی به گره‌های مقصد انتقال دهید و نتایج را در گزارش‌های وظایف مشاهده کنید.',
sslSyncTitle1: 'انتخاب گواهی‌ها',
sslSyncContent1: 'اطلاعات گواهی‌های گره مبدأ را مشاهده و گواهی‌های موردنظر برای همگام‌سازی را انتخاب کنید.',
sslSyncTitle2: 'همگام‌سازی گواهی‌ها بین گره‌ها',
sslSyncContent2:
'گواهی‌های انتخاب‌شده را با گره‌های مقصد همگام‌سازی کنید؛ گره مبدأ به‌طور خودکار از فهرست مقصدها حذف می‌شود.',
sslSyncTitle3: 'تأیید وظایف همگام‌سازی',
sslSyncContent3:
'پیش از اجرا، گره‌های مقصد و گواهی‌ها را بررسی کنید و سپس نتایج را در گزارش‌های وظایف مشاهده کنید.',
phpExtensionsSyncTitle1: 'انتخاب الگوی افزونه‌ها',
phpExtensionsSyncContent1:
'نام الگوها و فهرست افزونه‌های گره مبدأ را مشاهده و الگوی موردنظر برای همگام‌سازی را انتخاب کنید.',
phpExtensionsSyncTitle2: 'همگام‌سازی الگوها بین گره‌ها',
phpExtensionsSyncContent2:
'الگوی انتخاب‌شده را با گره‌های مقصد همگام‌سازی کنید؛ گره مبدأ به‌طور خودکار از فهرست مقصدها حذف می‌شود.',
phpExtensionsSyncTitle3: 'بررسی الگوهای هم‌نام',
phpExtensionsSyncContent3:
'الگوهای دارای نام و محتوای یکسان رد می‌شوند. در صورت تفاوت محتوا، تعارض گزارش می‌شود و الگو بازنویسی نخواهد شد.',
fileExchangeTitle1: 'انتقال احراز هویت کلید',
fileExchangeContent1: 'از طریق کلیدهای SSH احراز هویت کنید تا امنیت انتقال تضمین شود.',
fileExchangeTitle2: 'همگام‌سازی کارآمد فایل',
@@ -7508,6 +7543,13 @@ const message = {
imageBatchConfirmPrefix: 'در حال انتقال {0} تصویر به {1} گره، مجموعاً {2} وظیفه.',
ssl: 'همگام‌سازی گواهی',
phpExtensions: 'همگام‌سازی الگوی افزونه‌های PHP',
phpExtensionsTitle: 'همگام‌سازی الگوی افزونه‌ها',
phpExtensionsDesc: 'گره مبدأ را برای همگام‌سازی الگوی افزونه‌های PHP آن با گره‌های مقصد انتخاب کنید.',
phpExtensionsList: 'فهرست افزونه‌ها',
phpExtensionsConfirm: '{0} الگوی افزونه‌های PHP با {1} گره همگام‌سازی می‌شود.',
phpExtensionsConflictHint:
'الگوهای دارای نام و محتوای یکسان رد می‌شوند. اگر نام یکسان اما محتوا متفاوت باشد، تعارض گزارش می‌شود و الگو بازنویسی نخواهد شد.',
sslBatchDesc: 'پس از انتخاب یک گره منبع، گواهی مشخص شده را به محیط پنل فعلی همگام‌سازی کنید.',
sslBatchConfirmPrefix: 'در حال همگام‌سازی {0} گواهی به {1} گره، مجموعاً {2} وظیفه.',
+41
View File
@@ -3990,6 +3990,12 @@ const message = {
'商用版にアップグレードすると、ノードを手動で切り替えずにマルチノードアプリのバージョンを一括アップグレードできます。',
nodeDashboard:
'商用版にアップグレードすると、マルチノードのアプリ、Web サイト、データベース、スケジュールタスクを一元管理できます。',
imageExchange: '商用版にアップグレードすると、ノード間でコンテナーイメージを一括転送できます。',
appExchange:
'商用版にアップグレードすると、インストール済みアプリをターゲットノードに移行し、必要な依存リソースを確認できます。',
sslSync: '商用版にアップグレードすると、ソースノードの証明書を1つ以上のターゲットノードに同期できます。',
phpExtensionsSync:
'商用版にアップグレードすると、PHP 拡張テンプレートを1つ以上のターゲットノードに同期できます。',
fileExchange: '商用版にアップグレードすると、複数サーバー間でファイルをすばやく転送できます。',
cluster: '商用版にアップグレードすると、MySQL/Postgres/Redis のプライマリ/レプリカ構成を管理できます。',
vllm: '商用版にアップグレードすると、1Panel で vLLM サービスのデプロイ、設定、ライフサイクル操作、タスク追跡を一元管理できます。',
@@ -7024,6 +7030,34 @@ const message = {
nodeContent3: '各ノードの運用状況をリアルタイムで把握',
nodeTitle4: '迅速なリモート接続',
nodeContent4: 'ワンクリックでノードリモート端末に直接接続',
imageExchangeTitle1: 'ソースイメージの選択',
imageExchangeContent1: 'ソースノードのコンテナーイメージを確認し、転送するイメージを選択します。',
imageExchangeTitle2: 'イメージの一括配布',
imageExchangeContent2: '選択したイメージを1つ以上のターゲットノードに転送します。',
imageExchangeTitle3: '転送ログの確認',
imageExchangeContent3: 'タスクログでイメージ転送の進捗と実行結果を確認できます。',
appExchangeTitle1: 'ソースアプリの選択',
appExchangeContent1: 'ソースノードのインストール済みアプリを確認し、移行するアプリを選択します。',
appExchangeTitle2: '依存リソースの確認',
appExchangeContent2: '移行前にターゲットノードと、データベースなどの必要なリソースを確認します。',
appExchangeTitle3: 'アプリの移行',
appExchangeContent3:
'アプリのバックアップをターゲットノードに転送して復元し、タスクログで結果を確認できます。',
sslSyncTitle1: 'ソース証明書の選択',
sslSyncContent1: 'ソースノードの証明書情報を確認し、同期する証明書を選択します。',
sslSyncTitle2: '複数ノードへの証明書同期',
sslSyncContent2: 'ソースノードを自動的に除外し、選択した証明書をターゲットノードに同期します。',
sslSyncTitle3: '同期タスクの確認',
sslSyncContent3: '実行前にターゲットノードと証明書を確認し、タスクログで同期結果を確認できます。',
phpExtensionsSyncTitle1: '拡張テンプレートの選択',
phpExtensionsSyncContent1:
'ソースノードのテンプレート名と拡張機能一覧を確認し、同期するテンプレートを選択します。',
phpExtensionsSyncTitle2: '複数ノードへのテンプレート同期',
phpExtensionsSyncContent2:
'ソースノードを自動的に除外し、選択したテンプレートをターゲットノードに同期します。',
phpExtensionsSyncTitle3: '同名テンプレートの確認',
phpExtensionsSyncContent3:
'同名で内容も同じテンプレートはスキップします。内容が異なる場合は競合を報告し、上書きしません。',
fileExchangeTitle1: 'キー認証伝送',
fileExchangeContent1: 'SSHキーを介して認証し、伝送のセキュリティを確保します。',
fileExchangeTitle2: '効率的なファイル同期',
@@ -7538,6 +7572,13 @@ const message = {
'{0} 個のイメージを {1} 個のノードへ転送します。合計 {2} 件のタスクが作成されます。',
ssl: '証明書同期',
phpExtensions: 'PHP 拡張テンプレート同期',
phpExtensionsTitle: '拡張テンプレート同期',
phpExtensionsDesc: 'ソースノードを選択すると、PHP 拡張テンプレートをターゲットノードに同期できます。',
phpExtensionsList: '拡張機能一覧',
phpExtensionsConfirm: '{0} 件の PHP 拡張テンプレートを {1} 個のノードに同期します。',
phpExtensionsConflictHint:
'同名で内容も同じテンプレートはスキップします。同名で内容が異なる場合は競合を報告し、上書きしません。',
sslBatchDesc: 'ソースノードを選択すると、指定した証明書を現在のパネル環境へ同期できます。',
sslBatchConfirmPrefix: '{0} 件の証明書を {1} 個のノードへ同期します。合計 {2} 件のタスクが作成されます。',
+38
View File
@@ -3920,6 +3920,12 @@ const message = {
'상용 버전으로 업그레이드하면 노드를 수동으로 전환하지 않고도 다중 노드 애플리케이션 버전을 일괄 업그레이드할 수 있습니다.',
nodeDashboard:
'상용 버전으로 업그레이드하면 다중 노드 애플리케이션, 웹사이트, 데이터베이스, 예약 작업을 중앙에서 관리할 수 있습니다.',
imageExchange: '상용 버전으로 업그레이드하면 노드 간에 컨테이너 이미지를 일괄 전송할 수 있습니다.',
appExchange:
'상용 버전으로 업그레이드하면 설치된 앱을 대상 노드로 이전하고 필요한 종속 리소스를 확인할 수 있습니다.',
sslSync: '상용 버전으로 업그레이드하면 소스 노드의 인증서를 하나 이상의 대상 노드에 동기화할 수 있습니다.',
phpExtensionsSync:
'상용 버전으로 업그레이드하면 PHP 확장 템플릿을 하나 이상의 대상 노드에 동기화할 수 있습니다.',
fileExchange: '상용 버전으로 업그레이드하면 여러 서버 간에 파일을 빠르게 전송할 수 있습니다.',
app: '상용 버전으로 업그레이드하면 모바일 앱에서 서비스 정보와 이상 모니터링을 확인할 수 있습니다.',
cluster: '상용 버전으로 업그레이드하면 MySQL/Postgres/Redis 기본-복제 클러스터를 관리할 수 있습니다.',
@@ -6883,6 +6889,31 @@ const message = {
nodeContent3: '각 노드의 운영 상태를 실시간으로 파악',
nodeTitle4: '빠른 원격 연결',
nodeContent4: '원클릭으로 노드 원격 터미널에 직접 연결',
imageExchangeTitle1: '소스 이미지 선택',
imageExchangeContent1: '소스 노드의 컨테이너 이미지를 확인하고 전송할 이미지를 선택합니다.',
imageExchangeTitle2: '이미지 일괄 배포',
imageExchangeContent2: '선택한 이미지를 하나 이상의 대상 노드로 전송합니다.',
imageExchangeTitle3: '전송 로그 확인',
imageExchangeContent3: '작업 로그에서 이미지 전송 진행 상황과 실행 결과를 확인합니다.',
appExchangeTitle1: '소스 앱 선택',
appExchangeContent1: '소스 노드에 설치된 앱을 확인하고 이전할 앱을 선택합니다.',
appExchangeTitle2: '종속 리소스 확인',
appExchangeContent2: '이전 전에 대상 노드와 데이터베이스 등 필요한 리소스를 확인합니다.',
appExchangeTitle3: '앱 이전 실행',
appExchangeContent3: '앱 백업을 대상 노드로 전송하여 복원하고 작업 로그에서 결과를 확인합니다.',
sslSyncTitle1: '소스 인증서 선택',
sslSyncContent1: '소스 노드의 인증서 정보를 확인하고 동기화할 인증서를 선택합니다.',
sslSyncTitle2: '여러 노드에 인증서 동기화',
sslSyncContent2: '소스 노드를 자동으로 제외하고 선택한 인증서를 대상 노드에 동기화합니다.',
sslSyncTitle3: '동기화 작업 확인',
sslSyncContent3: '실행 전에 대상 노드와 인증서를 확인하고 작업 로그에서 동기화 결과를 확인합니다.',
phpExtensionsSyncTitle1: '확장 템플릿 선택',
phpExtensionsSyncContent1: '소스 노드의 템플릿 이름과 확장 목록을 확인하고 동기화할 템플릿을 선택합니다.',
phpExtensionsSyncTitle2: '여러 노드에 템플릿 동기화',
phpExtensionsSyncContent2: '소스 노드를 자동으로 제외하고 선택한 템플릿을 대상 노드에 동기화합니다.',
phpExtensionsSyncTitle3: '동일 이름 템플릿 확인',
phpExtensionsSyncContent3:
'이름과 내용이 같으면 건너뜁니다. 내용이 다르면 충돌을 알리고 덮어쓰지 않습니다.',
fileExchangeTitle1: '키 인증 전송',
fileExchangeContent1: 'SSH 키를 통해 인증하여 전송 보안을 보장합니다.',
fileExchangeTitle2: '효율적인 파일 동기화',
@@ -7390,6 +7421,13 @@ const message = {
imageBatchConfirmPrefix: '{0}개의 이미지를 {1}개 노드로 전달합니다. 총 {2}개의 작업이 생성됩니다.',
ssl: '인증서 동기화',
phpExtensions: 'PHP 확장 템플릿 동기화',
phpExtensionsTitle: '확장 템플릿 동기화',
phpExtensionsDesc: '소스 노드를 선택하면 PHP 확장 템플릿을 대상 노드에 동기화할 수 있습니다.',
phpExtensionsList: '확장 목록',
phpExtensionsConfirm: 'PHP 확장 템플릿 {0}개를 노드 {1}개에 동기화합니다.',
phpExtensionsConflictHint:
'이름과 내용이 같은 템플릿은 건너뜁니다. 이름은 같지만 내용이 다르면 충돌을 알리고 덮어쓰지 않습니다.',
sslBatchDesc: '원본 노드를 선택한 후 지정된 인증서를 현재 패널 환경으로 동기화할 수 있습니다.',
sslBatchConfirmPrefix: '{0}개의 인증서를 {1}개 노드로 동기화합니다. 총 {2}개의 작업이 생성됩니다.',
+37
View File
@@ -3898,6 +3898,10 @@ const message = {
nodeApp: 'ອັບເກຣດເປັນເວີຊັນ Commercial ເພື່ອອັບເກຣດເວີຊັນແອັບໃນຫຼາຍໂນດໂດຍບໍ່ຕ້ອງສະຫຼັບໂນດດ້ວຍຕົນເອງ.',
nodeDashboard:
'ອັບເກຣດເປັນເວີຊັນ Commercial ເພື່ອຈັດການແອັບ, ເວັບໄຊ, ຖານຂໍ້ມູນ ແລະ ງານຕາມກຳນົດເວລາຂອງຫຼາຍໂນດຢູ່ບ່ອນດຽວ.',
imageExchange: 'ອັບເກຣດເປັນເວີຊັນການຄ້າເພື່ອໂອນຍ້າຍອິມເມຈຄອນເທນເນີລະຫວ່າງໂນດເປັນຊຸດ.',
appExchange: 'ອັບເກຣດເປັນເວີຊັນການຄ້າເພື່ອຍ້າຍແອັບທີ່ຕິດຕັ້ງແລ້ວໄປຍັງໂນດປາຍທາງ ແລະຢືນຢັນຊັບພະຍາກອນທີ່ຕ້ອງໃຊ້.',
sslSync: 'ອັບເກຣດເປັນເວີຊັນການຄ້າເພື່ອຊິງໂຄຣໄນໃບຢັ້ງຢືນຈາກໂນດຕົ້ນທາງໄປຍັງໂນດປາຍທາງໜຶ່ງຫຼືຫຼາຍໂນດ.',
phpExtensionsSync: 'ອັບເກຣດເປັນເວີຊັນການຄ້າເພື່ອຊິງໂຄຣໄນແມ່ແບບສ່ວນຂະຫຍາຍ PHP ໄປຍັງໂນດປາຍທາງໜຶ່ງຫຼືຫຼາຍໂນດ.',
fileExchange: 'ອັບເກຣດເປັນເວີຊັນ Commercial ເພື່ອໂອນຍ້າຍໄຟລ໌ລະຫວ່າງເຊີບເວີຢ່າງວ່ອງໄວ.',
app: 'ອັບເກຣດເປັນເວີຊັນ Commercial ເພື່ອເບິ່ງລາຍລະອຽດບໍລິການ, ການຕິດຕາມສິ່ງຜິດປົກກະຕິ ແລະ ອື່ນໆໃນແອັບມືຖື.',
cluster: 'ອັບເກຣດເປັນເວີຊັນ Commercial ເພື່ອຈັດການ MySQL/Postgres/Redis primary-replica clusters.',
@@ -6825,6 +6829,32 @@ const message = {
nodeContent3: 'ຕິດຕາມສະຖານະການທຳງານຂອງແຕ່ລະໂນດແບບທັນທີ',
nodeTitle4: 'ເຊື່ອມຕໍ່ໄລຍະໄກວ່ອງໄວ',
nodeContent4: 'ເຊື່ອມຕໍ່ຫາເທີມິນອລຂອງໂນດໄດ້ໂດຍກົງຄລິກດຽວ',
imageExchangeTitle1: 'ເລືອກອິມເມຈຕົ້ນທາງ',
imageExchangeContent1: 'ເບິ່ງອິມເມຈຄອນເທນເນີໃນໂນດຕົ້ນທາງ ແລະເລືອກອິມເມຈທີ່ຕ້ອງການໂອນຍ້າຍ.',
imageExchangeTitle2: 'ແຈກຢາຍອິມເມຈເປັນຊຸດ',
imageExchangeContent2: 'ໂອນຍ້າຍອິມເມຈທີ່ເລືອກໄປຍັງໂນດປາຍທາງໜຶ່ງຫຼືຫຼາຍໂນດ.',
imageExchangeTitle3: 'ເບິ່ງບັນທຶກການໂອນຍ້າຍ',
imageExchangeContent3: 'ຕິດຕາມຄວາມຄືບໜ້າແລະຜົນການໂອນຍ້າຍອິມເມຈໃນບັນທຶກວຽກ.',
appExchangeTitle1: 'ເລືອກແອັບຕົ້ນທາງ',
appExchangeContent1: 'ເບິ່ງແອັບທີ່ຕິດຕັ້ງໃນໂນດຕົ້ນທາງ ແລະເລືອກແອັບທີ່ຕ້ອງການຍ້າຍ.',
appExchangeTitle2: 'ຢືນຢັນຊັບພະຍາກອນທີ່ຂຶ້ນຕໍ່ກັນ',
appExchangeContent2: 'ຢືນຢັນໂນດປາຍທາງແລະຊັບພະຍາກອນທີ່ຕ້ອງໃຊ້ ເຊັ່ນ ຖານຂໍ້ມູນ ກ່ອນການຍ້າຍ.',
appExchangeTitle3: 'ຍ້າຍແອັບ',
appExchangeContent3: 'ໂອນຍ້າຍຂໍ້ມູນສຳຮອງຂອງແອັບໄປຍັງໂນດປາຍທາງເພື່ອກູ້ຄືນ ແລະເບິ່ງຜົນໃນບັນທຶກວຽກ.',
sslSyncTitle1: 'ເລືອກໃບຢັ້ງຢືນຕົ້ນທາງ',
sslSyncContent1: 'ເບິ່ງຂໍ້ມູນໃບຢັ້ງຢືນໃນໂນດຕົ້ນທາງ ແລະເລືອກໃບຢັ້ງຢືນທີ່ຕ້ອງການຊິງໂຄຣໄນ.',
sslSyncTitle2: 'ຊິງໂຄຣໄນໃບຢັ້ງຢືນລະຫວ່າງໂນດ',
sslSyncContent2: 'ຊິງໂຄຣໄນໃບຢັ້ງຢືນທີ່ເລືອກໄປຍັງໂນດປາຍທາງ ໂດຍຍົກເວັ້ນໂນດຕົ້ນທາງອັດຕະໂນມັດ.',
sslSyncTitle3: 'ຢືນຢັນວຽກຊິງໂຄຣໄນ',
sslSyncContent3: 'ກວດສອບໂນດປາຍທາງແລະໃບຢັ້ງຢືນກ່ອນດຳເນີນການ ແລ້ວເບິ່ງຜົນໃນບັນທຶກວຽກ.',
phpExtensionsSyncTitle1: 'ເລືອກແມ່ແບບສ່ວນຂະຫຍາຍ',
phpExtensionsSyncContent1:
'ເບິ່ງຊື່ແມ່ແບບແລະລາຍການສ່ວນຂະຫຍາຍໃນໂນດຕົ້ນທາງ ແລະເລືອກແມ່ແບບທີ່ຕ້ອງການຊິງໂຄຣໄນ.',
phpExtensionsSyncTitle2: 'ຊິງໂຄຣໄນແມ່ແບບລະຫວ່າງໂນດ',
phpExtensionsSyncContent2: 'ຊິງໂຄຣໄນແມ່ແບບທີ່ເລືອກໄປຍັງໂນດປາຍທາງ ໂດຍຍົກເວັ້ນໂນດຕົ້ນທາງອັດຕະໂນມັດ.',
phpExtensionsSyncTitle3: 'ກວດສອບແມ່ແບບຊື່ດຽວກັນ',
phpExtensionsSyncContent3:
'ຈະຂ້າມແມ່ແບບທີ່ມີຊື່ແລະເນື້ອຫາຄືກັນ. ຖ້າເນື້ອຫາຕ່າງກັນ ຈະແຈ້ງຂໍ້ຂັດແຍ່ງແລະບໍ່ຂຽນທັບ.',
fileExchangeTitle1: 'ສົ່ງຂໍ້ມູນຜ່ານ Key Authentication',
fileExchangeContent1: 'ຢືນຢັນຕົວຕົນຜ່ານ SSH keys ເພື່ອຄວາມປອດໄພໃນການສົ່ງຂໍ້ມູນ.',
fileExchangeTitle2: 'ຊິງໂຄຣໄນໄຟລ໌ທີ່ມີປະສິດທິພາບ',
@@ -7302,6 +7332,13 @@ const message = {
imageBatchConfirmPrefix: 'ກຳລັງຈະໂອນ {0} images ໄປຫາ {1} ໂນດ, ລວມທັງໝົດ {2} ງານ.',
ssl: 'ຊິງໂຄຣໄນໃບຢັ້ງຢືນ',
phpExtensions: 'ຊິງໂຄຣໄນແມ່ແບບສ່ວນຂະຫຍາຍ PHP',
phpExtensionsTitle: 'ຊິງໂຄຣໄນແມ່ແບບສ່ວນຂະຫຍາຍ',
phpExtensionsDesc: 'ເລືອກໂນດຕົ້ນທາງເພື່ອຊິງໂຄຣໄນແມ່ແບບສ່ວນຂະຫຍາຍ PHP ໄປຍັງໂນດປາຍທາງ.',
phpExtensionsList: 'ລາຍການສ່ວນຂະຫຍາຍ',
phpExtensionsConfirm: 'ຈະຊິງໂຄຣໄນແມ່ແບບສ່ວນຂະຫຍາຍ PHP {0} ແມ່ແບບ ໄປຍັງ {1} ໂນດ.',
phpExtensionsConflictHint:
'ຈະຂ້າມແມ່ແບບທີ່ມີຊື່ແລະເນື້ອຫາຄືກັນ. ຖ້າຊື່ຄືກັນແຕ່ເນື້ອຫາຕ່າງກັນ ຈະແຈ້ງຂໍ້ຂັດແຍ່ງແລະບໍ່ຂຽນທັບ.',
sslBatchDesc: 'ເລືອກໂນດຕົ້ນທາງ ແລະ ຊິງໂຄຣໄນໃບຢັ້ງຢືນທີ່ກຳນົດເຂົ້າມາໃນພາແນລປັດຈຸບັນ.',
sslBatchConfirmPrefix: 'ກຳລັງຈະຊິງໂຄຣໄນ {0} ໃບຢັ້ງຢືນ ໄປຫາ {1} ໂນດ, ລວມທັງໝົດ {2} ງານ.',
+46
View File
@@ -4076,6 +4076,13 @@ const message = {
'Naik taraf ke Edisi Komersial untuk menaik taraf versi aplikasi berbilang nod tanpa menukar nod secara manual.',
nodeDashboard:
'Naik taraf ke Edisi Komersial untuk mengurus aplikasi, laman web, pangkalan data dan tugas berjadual berbilang nod secara berpusat.',
imageExchange: 'Naik taraf ke edisi komersial untuk memindahkan imej kontena antara nod secara kelompok.',
appExchange:
'Naik taraf ke edisi komersial untuk memindahkan aplikasi yang dipasang ke nod sasaran dan mengesahkan sumber kebergantungannya.',
sslSync:
'Naik taraf ke edisi komersial untuk menyegerakkan sijil daripada nod sumber ke satu atau lebih nod sasaran.',
phpExtensionsSync:
'Naik taraf ke edisi komersial untuk menyegerakkan templat sambungan PHP ke satu atau lebih nod sasaran.',
fileExchange: 'Naik taraf ke Edisi Komersial untuk memindahkan fail dengan pantas antara pelayan.',
app: 'Naik taraf ke Edisi Komersial untuk melihat maklumat perkhidmatan dan pemantauan anomali dalam aplikasi mudah alih.',
cluster: 'Naik taraf ke Edisi Komersial untuk mengurus kelompok utama-replika MySQL/Postgres/Redis.',
@@ -7137,6 +7144,38 @@ const message = {
nodeContent3: 'Memantau status operasi setiap nod secara real-time',
nodeTitle4: 'Sambungan Jauh Pantas',
nodeContent4: 'Sambung terus ke terminal jauh nod dengan satu klik',
imageExchangeTitle1: 'Pilih imej sumber',
imageExchangeContent1: 'Lihat imej kontena pada nod sumber dan pilih imej yang ingin dipindahkan.',
imageExchangeTitle2: 'Edarkan imej secara kelompok',
imageExchangeContent2: 'Pindahkan imej yang dipilih ke satu atau lebih nod sasaran.',
imageExchangeTitle3: 'Lihat log pemindahan',
imageExchangeContent3: 'Pantau kemajuan dan hasil pemindahan imej dalam log tugas.',
appExchangeTitle1: 'Pilih aplikasi sumber',
appExchangeContent1:
'Lihat aplikasi yang dipasang pada nod sumber dan pilih aplikasi yang ingin dipindahkan.',
appExchangeTitle2: 'Sahkan kebergantungan',
appExchangeContent2:
'Sahkan nod sasaran dan sumber yang diperlukan, seperti pangkalan data, sebelum pemindahan.',
appExchangeTitle3: 'Pindahkan aplikasi',
appExchangeContent3:
'Pindahkan sandaran aplikasi ke nod sasaran untuk pemulihan dan lihat hasilnya dalam log tugas.',
sslSyncTitle1: 'Pilih sijil sumber',
sslSyncContent1: 'Lihat maklumat sijil pada nod sumber dan pilih sijil yang ingin disegerakkan.',
sslSyncTitle2: 'Segerakkan sijil antara nod',
sslSyncContent2:
'Segerakkan sijil yang dipilih ke nod sasaran dengan mengecualikan nod sumber secara automatik.',
sslSyncTitle3: 'Sahkan tugas penyegerakan',
sslSyncContent3:
'Semak nod sasaran dan sijil sebelum pelaksanaan, kemudian lihat hasilnya dalam log tugas.',
phpExtensionsSyncTitle1: 'Pilih templat sambungan',
phpExtensionsSyncContent1:
'Lihat nama templat dan senarai sambungan pada nod sumber, kemudian pilih templat yang ingin disegerakkan.',
phpExtensionsSyncTitle2: 'Segerakkan templat antara nod',
phpExtensionsSyncContent2:
'Segerakkan templat yang dipilih ke nod sasaran dengan mengecualikan nod sumber secara automatik.',
phpExtensionsSyncTitle3: 'Semak templat bernama sama',
phpExtensionsSyncContent3:
'Templat dengan nama dan kandungan yang sama akan dilangkau. Kandungan yang berbeza dilaporkan sebagai konflik tanpa menulis ganti templat.',
fileExchangeTitle1: 'Pengangkutan Pengesahan Kunci',
fileExchangeContent1: 'Mengesahkan melalui kunci SSH untuk memastikan keselamatan pengangkutan.',
fileExchangeTitle2: 'Segerakan Fail Cekap',
@@ -7660,6 +7699,13 @@ const message = {
imageBatchConfirmPrefix: 'Akan memindahkan {0} imej ke {1} nod, dengan jumlah {2} tugasan.',
ssl: 'Penyegerakan Sijil',
phpExtensions: 'Penyegerakan Templat Sambungan PHP',
phpExtensionsTitle: 'Penyegerakan Templat Sambungan',
phpExtensionsDesc: 'Pilih nod sumber untuk menyegerakkan templat sambungan PHP ke nod sasaran.',
phpExtensionsList: 'Senarai sambungan',
phpExtensionsConfirm: 'Segerakkan {0} templat sambungan PHP ke {1} nod.',
phpExtensionsConflictHint:
'Templat dengan nama dan kandungan yang sama akan dilangkau. Jika nama sama tetapi kandungan berbeza, konflik akan dilaporkan tanpa menulis ganti templat.',
sslBatchDesc:
'Selepas memilih nod sumber, sijil yang ditentukan boleh disegerakkan ke persekitaran panel semasa.',
sslBatchConfirmPrefix: 'Akan menyegerakkan {0} sijil ke {1} nod, dengan jumlah {2} tugasan.',
+48
View File
@@ -4082,6 +4082,13 @@ const message = {
'Atualize para a edição comercial para atualizar versões de aplicativos multi-nó sem alternar manualmente entre os nós.',
nodeDashboard:
'Atualize para a edição comercial para gerenciar aplicativos, sites, bancos de dados e tarefas agendadas multi-nó de forma centralizada.',
imageExchange: 'Atualize para a edição comercial para transferir imagens de contêineres entre nós em lote.',
appExchange:
'Atualize para a edição comercial para migrar aplicativos instalados para nós de destino e confirmar os recursos necessários.',
sslSync:
'Atualize para a edição comercial para sincronizar certificados do nó de origem com um ou mais nós de destino.',
phpExtensionsSync:
'Atualize para a edição comercial para sincronizar modelos de extensões PHP com um ou mais nós de destino.',
fileExchange: 'Atualize para a edição comercial para transferir arquivos rapidamente entre vários servidores.',
app: 'Faça upgrade para a edição comercial para visualizar informações do serviço e monitoramento de anomalias no aplicativo móvel.',
cluster: 'Atualize para a edição comercial para gerenciar clusters primário-réplica de MySQL/Postgres/Redis.',
@@ -7172,6 +7179,39 @@ const message = {
nodeContent3: 'Acompanhe em tempo real o status operacional de cada nó',
nodeTitle4: 'Conexão Remota Rápida',
nodeContent4: 'Conecte-se diretamente a terminais remotos de nós com um clique',
imageExchangeTitle1: 'Selecionar imagens de origem',
imageExchangeContent1:
'Veja as imagens de contêineres no nó de origem e selecione as que deseja transferir.',
imageExchangeTitle2: 'Distribuir imagens em lote',
imageExchangeContent2: 'Transfira as imagens selecionadas para um ou mais nós de destino.',
imageExchangeTitle3: 'Ver logs de transferência',
imageExchangeContent3:
'Acompanhe o progresso e os resultados da transferência de imagens nos logs de tarefas.',
appExchangeTitle1: 'Selecionar aplicativo de origem',
appExchangeContent1: 'Veja os aplicativos instalados no nó de origem e selecione o que deseja migrar.',
appExchangeTitle2: 'Confirmar dependências',
appExchangeContent2:
'Confirme os nós de destino e os recursos necessários, como bancos de dados, antes da migração.',
appExchangeTitle3: 'Migrar aplicativos',
appExchangeContent3:
'Transfira backups dos aplicativos para restauração nos nós de destino e veja os resultados nos logs de tarefas.',
sslSyncTitle1: 'Selecionar certificados',
sslSyncContent1: 'Veja os detalhes dos certificados no nó de origem e selecione os que deseja sincronizar.',
sslSyncTitle2: 'Sincronizar certificados entre nós',
sslSyncContent2:
'Sincronize os certificados selecionados com os nós de destino, excluindo automaticamente o nó de origem.',
sslSyncTitle3: 'Confirmar tarefas de sincronização',
sslSyncContent3:
'Confira os nós de destino e os certificados antes da execução e veja os resultados nos logs de tarefas.',
phpExtensionsSyncTitle1: 'Selecionar modelo de extensões',
phpExtensionsSyncContent1:
'Veja os nomes dos modelos e suas listas de extensões no nó de origem e selecione o modelo que deseja sincronizar.',
phpExtensionsSyncTitle2: 'Sincronizar modelos entre nós',
phpExtensionsSyncContent2:
'Sincronize o modelo selecionado com os nós de destino, excluindo automaticamente o nó de origem.',
phpExtensionsSyncTitle3: 'Verificar modelos existentes',
phpExtensionsSyncContent3:
'Modelos com nome e conteúdo idênticos são ignorados. Conteúdos diferentes geram um aviso de conflito, sem sobrescrever o modelo.',
fileExchangeTitle1: 'Transmissão de Autenticação por Chave',
fileExchangeContent1: 'Autentique via chaves SSH para garantir a segurança da transmissão.',
fileExchangeTitle2: 'Sincronização de Arquivos Eficiente',
@@ -7697,6 +7737,14 @@ const message = {
imageBatchConfirmPrefix: 'Serão encaminhadas {0} imagens para {1} nós, totalizando {2} tarefas.',
ssl: 'Sincronização de Certificados',
phpExtensions: 'Sincronização de modelos de extensões PHP',
phpExtensionsTitle: 'Sincronização de modelos de extensões',
phpExtensionsDesc:
'Selecione um nó de origem para sincronizar seu modelo de extensões PHP com os nós de destino.',
phpExtensionsList: 'Lista de extensões',
phpExtensionsConfirm: 'Sincronizar {0} modelos de extensões PHP com {1} nós.',
phpExtensionsConflictHint:
'Modelos com o mesmo nome e conteúdo são ignorados. Se o nome for igual e o conteúdo diferente, o conflito será informado sem sobrescrever o modelo.',
sslBatchDesc:
'Após selecionar o nó de origem, os certificados especificados podem ser sincronizados com o ambiente atual do painel.',
sslBatchConfirmPrefix: 'Serão sincronizados {0} certificados para {1} nós, totalizando {2} tarefas.',
+48
View File
@@ -4058,6 +4058,13 @@ const message = {
'Обновление до коммерческой редакции позволяет унифицированно обновлять версии приложений на нескольких узлах без необходимости ручного переключения узлов.',
nodeDashboard:
'Обновление до коммерческой редакции позволяет централизованно управлять приложениями, веб-сайтами, базами данных и запланированными задачами на нескольких узлах.',
imageExchange: 'Перейдите на коммерческую версию для пакетной передачи образов контейнеров между узлами.',
appExchange:
'Перейдите на коммерческую версию для переноса установленных приложений на целевые узлы и подтверждения зависимых ресурсов.',
sslSync:
'Перейдите на коммерческую версию для синхронизации сертификатов исходного узла с одним или несколькими целевыми узлами.',
phpExtensionsSync:
'Перейдите на коммерческую версию для синхронизации шаблонов расширений PHP с одним или несколькими целевыми узлами.',
fileExchange: 'Обновите до Коммерческой версии, чтобы быстро передавать файлы между несколькими серверами.',
app: 'Обновите до коммерческой версии, чтобы просматривать информацию о сервисах, мониторинг аномалий и т.д. через мобильное приложение.',
cluster: 'Обновление до коммерческой версии позволяет управлять кластерами мастер-слейв MySQL/Postgres/Redis.',
@@ -7146,6 +7153,39 @@ const message = {
nodeContent3: 'Реальное наблюдение за рабочим статусом каждого узла',
nodeTitle4: 'Быстрое удаленное подключение',
nodeContent4: 'Одним кликом подключитесь к удаленным терминалам узлов',
imageExchangeTitle1: 'Выбор исходных образов',
imageExchangeContent1: 'Просмотрите образы контейнеров на исходном узле и выберите образы для передачи.',
imageExchangeTitle2: 'Пакетная передача образов',
imageExchangeContent2: 'Передавайте выбранные образы на один или несколько целевых узлов.',
imageExchangeTitle3: 'Просмотр журналов передачи',
imageExchangeContent3: 'Отслеживайте ход и результаты передачи образов в журналах задач.',
appExchangeTitle1: 'Выбор исходного приложения',
appExchangeContent1:
'Просмотрите установленные приложения на исходном узле и выберите приложение для переноса.',
appExchangeTitle2: 'Подтверждение зависимостей',
appExchangeContent2:
'Перед переносом подтвердите целевые узлы и необходимые ресурсы, например базы данных.',
appExchangeTitle3: 'Перенос приложений',
appExchangeContent3:
'Передавайте резервные копии приложений на целевые узлы для восстановления и просматривайте результаты в журналах задач.',
sslSyncTitle1: 'Выбор сертификатов',
sslSyncContent1:
'Просмотрите сведения о сертификатах на исходном узле и выберите сертификаты для синхронизации.',
sslSyncTitle2: 'Синхронизация сертификатов между узлами',
sslSyncContent2:
'Синхронизируйте выбранные сертификаты с целевыми узлами, автоматически исключая исходный узел.',
sslSyncTitle3: 'Подтверждение задач синхронизации',
sslSyncContent3:
'Проверьте целевые узлы и сертификаты перед выполнением, затем просмотрите результаты в журналах задач.',
phpExtensionsSyncTitle1: 'Выбор шаблона расширений',
phpExtensionsSyncContent1:
'Просмотрите имена шаблонов и списки расширений на исходном узле и выберите шаблон для синхронизации.',
phpExtensionsSyncTitle2: 'Синхронизация шаблонов между узлами',
phpExtensionsSyncContent2:
'Синхронизируйте выбранный шаблон с целевыми узлами, автоматически исключая исходный узел.',
phpExtensionsSyncTitle3: 'Проверка одноимённых шаблонов',
phpExtensionsSyncContent3:
'Шаблоны с одинаковыми именами и содержимым пропускаются. При различии содержимого сообщается о конфликте без перезаписи.',
fileExchangeTitle1: 'Передача с аутентификацией по ключу',
fileExchangeContent1: 'Аутентифицируйтесь через SSH-ключи, чтобы обеспечить безопасность передачи.',
fileExchangeTitle2: 'Эффективная синхронизация файлов',
@@ -7676,6 +7716,14 @@ const message = {
imageBatchConfirmPrefix: 'Будет передано {0} образов на {1} узлов, всего {2} задач.',
ssl: 'Синхронизация сертификатов',
phpExtensions: 'Синхронизация шаблонов расширений PHP',
phpExtensionsTitle: 'Синхронизация шаблонов расширений',
phpExtensionsDesc:
'Выберите исходный узел, чтобы синхронизировать его шаблон расширений PHP с целевыми узлами.',
phpExtensionsList: 'Список расширений',
phpExtensionsConfirm: 'Синхронизировать шаблоны расширений PHP ({0}) с узлами ({1}).',
phpExtensionsConflictHint:
'Шаблоны с одинаковыми именами и содержимым пропускаются. При совпадении имени и различии содержимого сообщается о конфликте без перезаписи.',
sslBatchDesc:
'После выбора исходного узла указанные сертификаты можно синхронизировать с текущей средой панели.',
sslBatchConfirmPrefix: 'Будет синхронизировано {0} сертификатов на {1} узлов, всего {2} задач.',
+44
View File
@@ -4071,6 +4071,13 @@ const message = {
'Ticari sürüme yükselterek düğümleri manuel değiştirmeden çok düğümlü uygulama sürümlerini toplu olarak yükseltebilirsiniz.',
nodeDashboard:
'Ticari sürüme yükselterek çok düğümlü uygulamaları, web sitelerini, veritabanlarını ve zamanlanmış görevleri merkezi olarak yönetebilirsiniz.',
imageExchange: 'Konteyner imajlarını düğümler arasında toplu olarak aktarmak için ticari sürüme yükseltin.',
appExchange:
'Kurulu uygulamaları hedef düğümlere taşımak ve gerekli kaynak bağımlılıklarını onaylamak için ticari sürüme yükseltin.',
sslSync:
'Kaynak düğümdeki sertifikaları bir veya daha fazla hedef düğümle eşitlemek için ticari sürüme yükseltin.',
phpExtensionsSync:
'PHP eklenti şablonlarını bir veya daha fazla hedef düğümle eşitlemek için ticari sürüme yükseltin.',
fileExchange: 'Ticari sürüme yükselterek birden fazla sunucu arasında dosyaları hızlıca aktarabilirsiniz.',
app: 'Ticari sürüme yükselterek mobil uygulamada hizmet bilgilerini ve anormallik izlemeyi görüntüleyebilirsiniz.',
cluster: 'Ticari sürüme yükselterek MySQL/Postgres/Redis birincil-kopya kümelerini yönetebilirsiniz.',
@@ -7149,6 +7156,36 @@ const message = {
nodeContent3: 'Her düğümün çalışma durumunu gerçek zamanlı olarak izler',
nodeTitle4: 'Hızlı Uzak Bağlantı',
nodeContent4: 'Düğümlere tek tıkla doğrudan uzak terminal bağlantısı',
imageExchangeTitle1: 'Kaynak imajları seçin',
imageExchangeContent1: 'Kaynak düğümdeki konteyner imajlarını görüntüleyin ve aktarılacak imajları seçin.',
imageExchangeTitle2: 'İmajları toplu dağıtın',
imageExchangeContent2: 'Seçilen imajları bir veya daha fazla hedef düğüme aktarın.',
imageExchangeTitle3: 'Aktarım günlüklerini görüntüleyin',
imageExchangeContent3: 'İmaj aktarımının ilerlemesini ve sonuçlarını görev günlüklerinden takip edin.',
appExchangeTitle1: 'Kaynak uygulamayı seçin',
appExchangeContent1: 'Kaynak düğümde kurulu uygulamaları görüntüleyin ve taşınacak uygulamayı seçin.',
appExchangeTitle2: 'Bağımlılıkları onaylayın',
appExchangeContent2: 'Taşıma öncesinde hedef düğümleri ve veritabanları gibi gerekli kaynakları onaylayın.',
appExchangeTitle3: 'Uygulamaları taşıyın',
appExchangeContent3:
'Uygulama yedeklerini geri yüklemek üzere hedef düğümlere aktarın ve sonuçları görev günlüklerinden görüntüleyin.',
sslSyncTitle1: 'Sertifikaları seçin',
sslSyncContent1: 'Kaynak düğümdeki sertifika bilgilerini görüntüleyin ve eşitlenecek sertifikaları seçin.',
sslSyncTitle2: 'Düğümler arasında sertifika eşitleme',
sslSyncContent2:
'Kaynak düğümü otomatik olarak hariç tutarak seçilen sertifikaları hedef düğümlerle eşitleyin.',
sslSyncTitle3: 'Eşitleme görevlerini onaylayın',
sslSyncContent3:
'Çalıştırmadan önce hedef düğümleri ve sertifikaları kontrol edin, ardından sonuçları görev günlüklerinden görüntüleyin.',
phpExtensionsSyncTitle1: 'Eklenti şablonunu seçin',
phpExtensionsSyncContent1:
'Kaynak düğümdeki şablon adlarını ve eklenti listelerini görüntüleyin, eşitlenecek şablonu seçin.',
phpExtensionsSyncTitle2: 'Düğümler arasında şablon eşitleme',
phpExtensionsSyncContent2:
'Kaynak düğümü otomatik olarak hariç tutarak seçilen şablonu hedef düğümlerle eşitleyin.',
phpExtensionsSyncTitle3: 'Aynı adlı şablonları kontrol edin',
phpExtensionsSyncContent3:
'Adı ve içeriği aynı olan şablonlar atlanır. İçerik farklıysa çakışma bildirilir ve üzerine yazılmaz.',
fileExchangeTitle1: 'Anahtar Kimlik Doğrulama İletimi',
fileExchangeContent1: 'İletim güvenliğini sağlamak için SSH anahtarları ile kimlik doğrulaması yapar.',
fileExchangeTitle2: 'Verimli Dosya Senkronizasyonu',
@@ -7673,6 +7710,13 @@ const message = {
imageBatchConfirmPrefix: '{0} imaj {1} düğüme aktarılacak, toplam {2} görev oluşturulacak.',
ssl: 'Sertifika Senkronizasyonu',
phpExtensions: 'PHP Eklenti Şablonu Eşitleme',
phpExtensionsTitle: 'Eklenti Şablonu Eşitleme',
phpExtensionsDesc: 'PHP eklenti şablonunu hedef düğümlerle eşitlemek için bir kaynak düğüm seçin.',
phpExtensionsList: 'Eklenti listesi',
phpExtensionsConfirm: '{0} PHP eklenti şablonu {1} düğümle eşitlenecek.',
phpExtensionsConflictHint:
'Adı ve içeriği aynı olan şablonlar atlanır. Adı aynı ancak içeriği farklı olan şablonlar için çakışma bildirilir ve üzerine yazılmaz.',
sslBatchDesc:
'Kaynak düğüm seçildikten sonra belirtilen sertifikalar mevcut panel ortamına senkronize edilebilir.',
sslBatchConfirmPrefix: '{0} sertifika {1} düğüme senkronize edilecek, toplam {2} görev oluşturulacak.',
+34
View File
@@ -3747,6 +3747,10 @@ const message = {
node: '升級商業版可以使用 1Panel 管理多台 Linux 伺服器。',
nodeApp: '升級商業版可以統一升級多節點應用版本,無需手動切換節點。',
nodeDashboard: '升級商業版可以集中管理多節點應用、網站、資料庫和計劃任務。',
imageExchange: '升級商業版可以在多個節點之間批次傳輸容器映像。',
appExchange: '升級商業版可以將已安裝的應用程式遷移到目標節點,並確認所需的關聯資源。',
sslSync: '升級商業版可以將來源節點的憑證同步到一個或多個目標節點。',
phpExtensionsSync: '升級商業版可以將 PHP 擴充範本同步到一個或多個目標節點。',
fileExchange: '升級商業版可以在多台伺服器之間快速傳輸檔案。',
app: '升級商業版可透過手機APP,檢視服務資訊、異常監控等。',
cluster: '升級商業版可以管理 MySQL/Postgres/Redis 主從叢集。',
@@ -6539,6 +6543,30 @@ const message = {
nodeContent3: '即時掌握各節點執行狀態',
nodeTitle4: '快速遠端連接',
nodeContent4: '一鍵直連節點遠端終端',
imageExchangeTitle1: '選擇來源映像',
imageExchangeContent1: '檢視來源節點的容器映像,選擇需要傳輸的映像。',
imageExchangeTitle2: '批次分發映像',
imageExchangeContent2: '將選取的映像傳輸到一個或多個目標節點。',
imageExchangeTitle3: '檢視傳輸日誌',
imageExchangeContent3: '透過任務日誌檢視映像傳輸進度和執行結果。',
appExchangeTitle1: '選擇來源應用程式',
appExchangeContent1: '檢視來源節點已安裝的應用程式,選擇需要遷移的應用程式。',
appExchangeTitle2: '確認資源相依性',
appExchangeContent2: '遷移前確認目標節點及應用程式所需的資料庫等關聯資源。',
appExchangeTitle3: '執行應用程式遷移',
appExchangeContent3: '將應用程式備份傳輸到目標節點進行還原,並透過任務日誌檢視結果。',
sslSyncTitle1: '選擇來源憑證',
sslSyncContent1: '檢視來源節點的憑證資訊,選擇需要同步的憑證。',
sslSyncTitle2: '多節點憑證同步',
sslSyncContent2: '將選取的憑證同步到目標節點,自動排除來源節點。',
sslSyncTitle3: '確認同步任務',
sslSyncContent3: '執行前確認目標節點和憑證,透過任務日誌檢視同步結果。',
phpExtensionsSyncTitle1: '選擇擴充範本',
phpExtensionsSyncContent1: '檢視來源節點的範本名稱和擴充清單,選擇需要同步的範本。',
phpExtensionsSyncTitle2: '多節點範本同步',
phpExtensionsSyncContent2: '將選取的擴充範本同步到目標節點,自動排除來源節點。',
phpExtensionsSyncTitle3: '同名範本檢查',
phpExtensionsSyncContent3: '同名且內容一致的範本會略過;內容不同則提示衝突,不會覆寫。',
fileExchangeTitle1: '金鑰認證傳輸',
fileExchangeContent1: '通過 SSH 金鑰進行身份驗證,確保傳輸的安全性。',
fileExchangeTitle2: '高效檔案同步',
@@ -7022,6 +7050,12 @@ const message = {
imageBatchConfirmPrefix: '即將把 {0} 張映像轉發到 {1} 個節點,共 {2} 個任務。',
ssl: '證書同步',
phpExtensions: 'PHP 擴充模版同步',
phpExtensionsTitle: '擴充模版同步',
phpExtensionsDesc: '選擇來源節點後,可將指定 PHP 擴充模版同步至目標節點。',
phpExtensionsList: '擴充清單',
phpExtensionsConfirm: '即將把 {0} 個 PHP 擴充模版同步至 {1} 個目標節點。',
phpExtensionsConflictHint: '同名且內容一致的模版將略過;同名但內容不同的模版將提示衝突,不會覆蓋。',
sslBatchDesc: '選擇來源節點後,可將指定證書同步到目前面板環境。',
sslBatchConfirmPrefix: '即將把 {0} 張證書同步到 {1} 個節點,共 {2} 個任務。',
+34
View File
@@ -3777,6 +3777,10 @@ const message = {
node: '升级商业版可以使用 1Panel 管理多台 linux 服务器。',
nodeApp: '升级商业版可以统一升级多节点应用版本,无需手动切换节点。',
nodeDashboard: '升级商业版可以集中管理多节点应用、网站、数据库和计划任务。',
imageExchange: '升级商业版可以在多个节点之间批量传输容器镜像。',
appExchange: '升级商业版可以将已安装的应用迁移到目标节点,并确认所需的关联资源。',
sslSync: '升级商业版可以将源节点的证书同步到一个或多个目标节点。',
phpExtensionsSync: '升级商业版可以将 PHP 扩展模版同步到一个或多个目标节点。',
fileExchange: '升级商业版可以在多台服务器之间快速传输文件。',
app: '升级商业版可通过手机 APP,查看服务信息、异常监控等。',
cluster: '升级商业版可以管理 MySQL/Postgres/Redis 主从集群。',
@@ -5494,6 +5498,30 @@ const message = {
nodeTitle4: '快速远程连接',
nodeContent4: '一键直连节点远程终端',
imageExchangeTitle1: '选择源镜像',
imageExchangeContent1: '查看源节点的容器镜像,选择需要传输的镜像。',
imageExchangeTitle2: '批量分发镜像',
imageExchangeContent2: '将选中的镜像传输到一个或多个目标节点。',
imageExchangeTitle3: '查看传输日志',
imageExchangeContent3: '通过任务日志查看镜像传输进度和执行结果。',
appExchangeTitle1: '选择源应用',
appExchangeContent1: '查看源节点已安装的应用,选择需要迁移的应用。',
appExchangeTitle2: '确认资源依赖',
appExchangeContent2: '迁移前确认目标节点及应用所需的数据库等关联资源。',
appExchangeTitle3: '执行应用迁移',
appExchangeContent3: '将应用备份传输到目标节点进行恢复,并通过任务日志查看结果。',
sslSyncTitle1: '选择源证书',
sslSyncContent1: '查看源节点的证书信息,选择需要同步的证书。',
sslSyncTitle2: '多节点证书同步',
sslSyncContent2: '将选中的证书同步到目标节点,自动排除源节点。',
sslSyncTitle3: '确认同步任务',
sslSyncContent3: '执行前确认目标节点和证书,通过任务日志查看同步结果。',
phpExtensionsSyncTitle1: '选择扩展模版',
phpExtensionsSyncContent1: '查看源节点的模版名称和扩展列表,选择需要同步的模版。',
phpExtensionsSyncTitle2: '多节点模版同步',
phpExtensionsSyncContent2: '将选中的扩展模版同步到目标节点,自动排除源节点。',
phpExtensionsSyncTitle3: '同名模版检查',
phpExtensionsSyncContent3: '同名且内容一致的模版会跳过;内容不同则提示冲突,不会覆盖。',
fileExchangeTitle1: '密钥认证传输',
fileExchangeContent1: '通过 SSH 密钥进行身份验证,确保传输的安全性。',
fileExchangeTitle2: '高效文件同步',
@@ -7079,6 +7107,12 @@ const message = {
imageBatchConfirmPrefix: '即将把 {0} 张镜像转发到 {1} 个节点,共 {2} 个任务。',
ssl: '证书同步',
phpExtensions: 'PHP 扩展模版同步',
phpExtensionsTitle: '扩展模版同步',
phpExtensionsDesc: '选择源节点后,可将指定 PHP 扩展模版同步到目标节点。',
phpExtensionsList: '扩展列表',
phpExtensionsConfirm: '即将把 {0} 个 PHP 扩展模版同步到 {1} 个目标节点。',
phpExtensionsConflictHint: '同名且内容一致的模版将跳过;同名但内容不同的模版将提示冲突,不会覆盖。',
sslBatchDesc: '选择源节点后,可将指定证书同步到当前面板环境。',
sslBatchConfirmPrefix: '即将把 {0} 张证书同步到 {1} 个节点,共 {2} 个任务。',