feat: Delete associated database when deleting website (#10535)

Refs https://github.com/1Panel-dev/1Panel/issues/9168
This commit is contained in:
CityFun
2025-09-29 06:22:19 +00:00
committed by GitHub
parent 7897bdabc4
commit 464ca8d272
14 changed files with 75 additions and 13 deletions
+1
View File
@@ -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 {
+30
View File
@@ -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
}
+1
View File
@@ -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',
+1
View File
@@ -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',
+1
View File
@@ -2265,6 +2265,7 @@ const message = {
forceDeleteHelper: 'フォース削除は、削除プロセス中のエラーを無視し、最終的にメタデータを削除します。',
deleteAppHelper: '関連するアプリケーションとアプリケーションのバックアップを同時に削除する',
deleteBackupHelper: 'また、Webサイトのバックアップを削除します。',
deleteDatabaseHelper: 'ウェブサイトに関連付けられたデータベースも削除します',
deleteConfirmHelper:
'削除操作を元に戻すことはできません。<span style = "color:red"> "{0}" </span>を入力して、削除を確認します。',
staticPath: '対応するメインディレクトリはです',
+1
View File
@@ -2226,6 +2226,7 @@ const message = {
forceDeleteHelper: '강제 삭제는 삭제 과정에서 발생하는 오류를 무시하고 최종적으로 메타데이터를 삭제합니다.',
deleteAppHelper: '관련 애플리케이션 및 애플리케이션 백업을 동시에 삭제합니다.',
deleteBackupHelper: '웹사이트 백업도 삭제합니다.',
deleteDatabaseHelper: '웹사이트와 연결된 데이터베이스도 삭제합니다',
deleteConfirmHelper:
'삭제 작업은 되돌릴 수 없습니다. 확인하려면 <span style=\'color:red\'>"{0}"</span>을(를) 입력하세요.',
staticPath: '해당 주요 디렉터리는',
+1
View File
@@ -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',
+1
View File
@@ -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',
+1
View File
@@ -2318,6 +2318,7 @@ const message = {
'Принудительное удаление будет игнорировать ошибки во время процесса удаления и в итоге удалит метаданные.',
deleteAppHelper: 'Удалить связанные приложения и резервные копии приложений одновременно',
deleteBackupHelper: 'Также удалить резервные копии веб-сайта.',
deleteDatabaseHelper: 'Также удалить базу данных, связанную с веб-сайтом',
deleteConfirmHelper:
'Операцию удаления нельзя отменить. Введите <span style="color:red"> "{0}" </span> для подтверждения удаления.',
staticPath: 'Соответствующая основная директория - ',
+1
View File
@@ -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 ',
+1
View File
@@ -2190,6 +2190,7 @@ const message = {
forceDeleteHelper: '強制刪除會忽略刪除過程中產生的錯誤並最終刪除中繼資料',
deleteAppHelper: '同時刪除關聯應用資料庫以及應用備份',
deleteBackupHelper: '同時刪除網站備份',
deleteDatabaseHelper: '同時刪除網站關聯資料庫',
deleteConfirmHelper: '刪除操作無法回滾請輸入 <span style="color:red"> "{0}" </span> 刪除',
staticPath: '對應主目錄:',
limit: '限制方案',
+1
View File
@@ -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) {