mirror of
https://github.com/1Panel-dev/1Panel.git
synced 2026-09-23 08:00:55 +00:00
feat: Delete associated database when deleting website (#10535)
Refs https://github.com/1Panel-dev/1Panel/issues/9168
This commit is contained in:
@@ -95,6 +95,7 @@ type WebsiteDelete struct {
|
||||
DeleteApp bool `json:"deleteApp"`
|
||||
DeleteBackup bool `json:"deleteBackup"`
|
||||
ForceDelete bool `json:"forceDelete"`
|
||||
DeleteDB bool `json:"deleteDB"`
|
||||
}
|
||||
|
||||
type WebsiteOp struct {
|
||||
|
||||
@@ -641,6 +641,36 @@ func (w WebsiteService) DeleteWebsite(req request.WebsiteDelete) error {
|
||||
return buserr.WithName("ErrParentWebsite", strings.Join(names, ","))
|
||||
}
|
||||
}
|
||||
|
||||
if website.Type == constant.Runtime && req.DeleteDB && website.DbID != 0 {
|
||||
switch website.DbType {
|
||||
case constant.AppMysql, constant.AppMariaDB:
|
||||
mysqlDB, _ := mysqlRepo.Get(repo.WithByID(website.DbID))
|
||||
if mysqlDB.ID > 0 {
|
||||
deleteReq := dto.MysqlDBDelete{
|
||||
ID: mysqlDB.ID,
|
||||
Database: mysqlDB.MysqlName,
|
||||
ForceDelete: req.ForceDelete,
|
||||
}
|
||||
if err = NewIMysqlService().Delete(context.TODO(), deleteReq); err != nil && !req.ForceDelete {
|
||||
return err
|
||||
}
|
||||
}
|
||||
case constant.AppPostgresql, constant.AppPostgres:
|
||||
pgDB, _ := postgresqlRepo.Get(repo.WithByID(website.DbID))
|
||||
if pgDB.ID > 0 {
|
||||
deleteReq := dto.PostgresqlDBDelete{
|
||||
ID: pgDB.ID,
|
||||
ForceDelete: req.ForceDelete,
|
||||
Database: pgDB.PostgresqlName,
|
||||
}
|
||||
if err = NewIPostgresqlService().Delete(context.TODO(), deleteReq); err != nil && !req.ForceDelete {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if err = delNginxConfig(website, req.ForceDelete); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -2351,6 +2351,7 @@ const message = {
|
||||
'Force deletion will ignore errors during the deletion process and eventually delete metadata.',
|
||||
deleteAppHelper: 'Delete associated applications and application backups at the same time',
|
||||
deleteBackupHelper: 'Also delete website backups.',
|
||||
deleteDatabaseHelper: 'Also delete the database associated with the website',
|
||||
deleteConfirmHelper: `The delete operation can't be undone. Enter <span style="color:red"> "{0}" </span> to confirm deletion.`,
|
||||
staticPath: 'The corresponding main directory is ',
|
||||
limit: 'Scheme',
|
||||
|
||||
@@ -2340,6 +2340,7 @@ const message = {
|
||||
forceDeleteHelper: 'La eliminación forzada ignorará errores y eliminará metadatos igualmente.',
|
||||
deleteAppHelper: 'Eliminar también aplicaciones y backups asociados',
|
||||
deleteBackupHelper: 'Eliminar también copias de seguridad del sitio',
|
||||
deleteDatabaseHelper: 'También eliminar la base de datos asociada al sitio web',
|
||||
deleteConfirmHelper: `Esta acción es irreversible. Escribe <span style="color:red"> "{0}" </span> para confirmar.`,
|
||||
staticPath: 'El directorio principal correspondiente es ',
|
||||
limit: 'Esquema',
|
||||
|
||||
@@ -2265,6 +2265,7 @@ const message = {
|
||||
forceDeleteHelper: 'フォース削除は、削除プロセス中のエラーを無視し、最終的にメタデータを削除します。',
|
||||
deleteAppHelper: '関連するアプリケーションとアプリケーションのバックアップを同時に削除する',
|
||||
deleteBackupHelper: 'また、Webサイトのバックアップを削除します。',
|
||||
deleteDatabaseHelper: 'ウェブサイトに関連付けられたデータベースも削除します',
|
||||
deleteConfirmHelper:
|
||||
'削除操作を元に戻すことはできません。<span style = "color:red"> "{0}" </span>を入力して、削除を確認します。',
|
||||
staticPath: '対応するメインディレクトリはです',
|
||||
|
||||
@@ -2226,6 +2226,7 @@ const message = {
|
||||
forceDeleteHelper: '강제 삭제는 삭제 과정에서 발생하는 오류를 무시하고 최종적으로 메타데이터를 삭제합니다.',
|
||||
deleteAppHelper: '관련 애플리케이션 및 애플리케이션 백업을 동시에 삭제합니다.',
|
||||
deleteBackupHelper: '웹사이트 백업도 삭제합니다.',
|
||||
deleteDatabaseHelper: '웹사이트와 연결된 데이터베이스도 삭제합니다',
|
||||
deleteConfirmHelper:
|
||||
'삭제 작업은 되돌릴 수 없습니다. 확인하려면 <span style=\'color:red\'>"{0}"</span>을(를) 입력하세요.',
|
||||
staticPath: '해당 주요 디렉터리는',
|
||||
|
||||
@@ -2320,6 +2320,7 @@ const message = {
|
||||
forceDeleteHelper: 'Padam paksa akan mengabaikan ralat semasa proses pemadaman dan akhirnya memadam metadata.',
|
||||
deleteAppHelper: 'Padam aplikasi yang berkaitan dan sandaran aplikasi pada masa yang sama',
|
||||
deleteBackupHelper: 'Juga padamkan sandaran laman web.',
|
||||
deleteDatabaseHelper: 'Juga hapuskan pangkalan data yang berkaitan dengan laman web',
|
||||
deleteConfirmHelper: `Operasi pemadaman tidak boleh dibatalkan. Masukkan <span style="color:red"> "{0}" </span> untuk mengesahkan pemadaman.`,
|
||||
staticPath: 'Direktori utama yang sepadan ialah ',
|
||||
limit: 'Skim',
|
||||
|
||||
@@ -2321,6 +2321,7 @@ const message = {
|
||||
forceDeleteHelper: 'A exclusão forçada ignorará erros durante o processo de exclusão e excluirá os metadados.',
|
||||
deleteAppHelper: 'Excluir aplicativos associados e backups de aplicativos ao mesmo tempo',
|
||||
deleteBackupHelper: 'Excluir também backups do site.',
|
||||
deleteDatabaseHelper: 'Também excluir o banco de dados associado ao site',
|
||||
deleteConfirmHelper: `A operação de exclusão não pode ser desfeita. Digite <span style="color:red"> "{0}" </span> para confirmar a exclusão.`,
|
||||
staticPath: 'O diretório principal correspondente é ',
|
||||
limit: 'Plano',
|
||||
|
||||
@@ -2318,6 +2318,7 @@ const message = {
|
||||
'Принудительное удаление будет игнорировать ошибки во время процесса удаления и в итоге удалит метаданные.',
|
||||
deleteAppHelper: 'Удалить связанные приложения и резервные копии приложений одновременно',
|
||||
deleteBackupHelper: 'Также удалить резервные копии веб-сайта.',
|
||||
deleteDatabaseHelper: 'Также удалить базу данных, связанную с веб-сайтом',
|
||||
deleteConfirmHelper:
|
||||
'Операцию удаления нельзя отменить. Введите <span style="color:red"> "{0}" </span> для подтверждения удаления.',
|
||||
staticPath: 'Соответствующая основная директория - ',
|
||||
|
||||
@@ -2380,6 +2380,7 @@ const message = {
|
||||
'Zorla silme, silme işlemi sırasında oluşan hataları yok sayar ve nihayetinde meta verileri siler.',
|
||||
deleteAppHelper: 'İlgili uygulamaları ve uygulama yedeklerini aynı anda sil',
|
||||
deleteBackupHelper: 'Web sitesi yedeklerini de sil.',
|
||||
deleteDatabaseHelper: 'Ayrıca web sitesi ile ilişkili veritabanını da sil',
|
||||
deleteConfirmHelper:
|
||||
'Silme işlemi geri alınamaz. Silmeyi onaylamak için <span style="color:red"> "{0}" </span> yazın.',
|
||||
staticPath: 'Karşılık gelen ana dizin ',
|
||||
|
||||
@@ -2190,6 +2190,7 @@ const message = {
|
||||
forceDeleteHelper: '強制刪除,會忽略刪除過程中產生的錯誤並最終刪除中繼資料',
|
||||
deleteAppHelper: '同時刪除關聯應用、資料庫以及應用備份',
|
||||
deleteBackupHelper: '同時刪除網站備份',
|
||||
deleteDatabaseHelper: '同時刪除網站關聯資料庫',
|
||||
deleteConfirmHelper: '刪除操作無法回滾,請輸入 <span style="color:red"> "{0}" </span> 刪除',
|
||||
staticPath: '對應主目錄:',
|
||||
limit: '限制方案',
|
||||
|
||||
@@ -2181,6 +2181,7 @@ const message = {
|
||||
forceDeleteHelper: '强制删除,会忽略删除过程中产生的错误并最终删除元数据',
|
||||
deleteAppHelper: '同时删除关联应用、数据库以及应用备份',
|
||||
deleteBackupHelper: '同时删除网站备份',
|
||||
deleteDatabaseHelper: '同时删除网站关联数据库',
|
||||
deleteConfirmHelper: '删除操作无法回滚,请输入 <span style="color:red"> "{0}" </span> 删除',
|
||||
staticPath: '对应主目录:',
|
||||
limit: '限制方案',
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
</el-descriptions>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane :label="$t('process.openFiles')" name="openFiles">
|
||||
<el-table :data="data.openFiles" border style="width: 100%">
|
||||
<el-table max-height="800px" :data="data.openFiles" border class="w-full">
|
||||
<el-table-column prop="path" :label="$t('menu.files')" />
|
||||
<el-table-column prop="fd" label="fd" width="100px" />
|
||||
</el-table>
|
||||
@@ -61,7 +61,7 @@
|
||||
></CodemirrorPro>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane :label="$t('process.net')" name="net">
|
||||
<el-table :data="data.connects" border style="width: 100%">
|
||||
<el-table max-height="800px" :data="data.connects" border class="w-full">
|
||||
<el-table-column prop="localaddr" :label="$t('process.laddr')">
|
||||
<template #default="{ row }">
|
||||
<span>{{ row.localaddr.ip }}</span>
|
||||
@@ -90,6 +90,25 @@ const open = ref(false);
|
||||
const data = ref({
|
||||
name: '',
|
||||
envs: [] as string[],
|
||||
status: '',
|
||||
PID: 0,
|
||||
PPID: 0,
|
||||
numThreads: 0,
|
||||
numConnections: 0,
|
||||
diskRead: '',
|
||||
diskWrite: '',
|
||||
username: '',
|
||||
startTime: '',
|
||||
cmdLine: '',
|
||||
rss: '',
|
||||
swap: '',
|
||||
vms: '',
|
||||
hwm: '',
|
||||
data: '',
|
||||
stack: '',
|
||||
locked: '',
|
||||
openFiles: [],
|
||||
connects: [],
|
||||
});
|
||||
const resourceName = ref('');
|
||||
const activeName = ref('basic');
|
||||
|
||||
@@ -14,13 +14,18 @@
|
||||
{{ $t('website.deleteAppHelper') }}
|
||||
</span>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item>
|
||||
<el-checkbox v-model="deleteReq.deleteBackup" :label="$t('website.deleteBackup')" />
|
||||
<span class="input-help">
|
||||
{{ $t('website.deleteBackupHelper') }}
|
||||
</span>
|
||||
</el-form-item>
|
||||
<el-form-item v-if="type === 'runtime'">
|
||||
<el-checkbox v-model="deleteReq.deleteDB" :label="$t('app.deleteDB')" />
|
||||
<span class="input-help">
|
||||
{{ $t('website.deleteDatabaseHelper') }}
|
||||
</span>
|
||||
</el-form-item>
|
||||
<el-form-item v-if="subSites != ''">
|
||||
<span class="input-help text-red-500">
|
||||
{{ $t('website.deleteSubsite', [subSites]) }}
|
||||
@@ -51,15 +56,17 @@ import { ref } from 'vue';
|
||||
import { Website } from '@/api/interface/website';
|
||||
import { MsgSuccess } from '@/utils/message';
|
||||
|
||||
const key = 1;
|
||||
const open = ref(false);
|
||||
const loading = ref(false);
|
||||
const deleteReq = ref({
|
||||
const initData = () => ({
|
||||
id: 0,
|
||||
deleteApp: false,
|
||||
deleteBackup: false,
|
||||
forceDelete: false,
|
||||
deleteDB: false,
|
||||
});
|
||||
const key = 1;
|
||||
const open = ref(false);
|
||||
const loading = ref(false);
|
||||
const deleteReq = ref(initData());
|
||||
const type = ref('');
|
||||
const em = defineEmits(['close']);
|
||||
const deleteForm = ref<FormInstance>();
|
||||
@@ -74,12 +81,7 @@ const handleClose = () => {
|
||||
};
|
||||
|
||||
const acceptParams = async (website: Website.WebsiteDTO) => {
|
||||
deleteReq.value = {
|
||||
id: 0,
|
||||
deleteApp: false,
|
||||
deleteBackup: false,
|
||||
forceDelete: false,
|
||||
};
|
||||
deleteReq.value = initData();
|
||||
|
||||
subSites.value = '';
|
||||
if (website.childSites && website.childSites.length > 0) {
|
||||
|
||||
Reference in New Issue
Block a user