diff --git a/api/app/controllers/backup_router.py b/api/app/controllers/backup_router.py index 34272c5..b6188cd 100644 --- a/api/app/controllers/backup_router.py +++ b/api/app/controllers/backup_router.py @@ -79,27 +79,6 @@ async def upload_backup( return await backup_service.upload_backup(file, user) -@router.post( - '/{backup_id}/restore/', - response_model=BackupResponseEntity, - summary='Restore a backup', - description='Restore a backup by ID, overwriting existing data', -) -async def restore_backup( - backup_id: int, - db: AsyncSession = Depends(get_db), - user=Depends(require_admin), -): - backup_service = BackupService( - db, - settings.BACKUP_DB_URL, - settings.FILE_UPLOAD_DIR, - settings.BACKUP_DIR, - settings.PG_DUMP_PATH, - ) - return await backup_service.restore_backup(backup_id, engine) - - @router.delete( '/{backup_id}/', response_model=BackupResponseEntity, diff --git a/api/app/infrastructure/backup_service.py b/api/app/infrastructure/backup_service.py index 863514e..a143ed8 100644 --- a/api/app/infrastructure/backup_service.py +++ b/api/app/infrastructure/backup_service.py @@ -71,58 +71,6 @@ class BackupService: except subprocess.CalledProcessError as e: raise HTTPException(500, f"Ошибка создания бэкапа: {e}") - async def restore_backup(self, backup_id: int, engine: AsyncEngine) -> BackupResponseEntity: - try: - async with maintenance_mode_on(): - backup = await self.backup_repository.get_by_id(backup_id) - if not backup: - raise HTTPException(404, 'Резервная копия с таким id не найдена') - - if not os.path.exists(backup.path): - raise HTTPException(404, 'Файл не найден на диске') - - with tarfile.open(backup.path, "r:gz") as tar: - members = tar.getnames() - if "db_dump.sql" not in members or not any( - name.startswith(os.path.basename(self.app_files_dir)) for name in members): - raise HTTPException(400, "Неверная структура архива резервной копии") - - if os.path.exists(self.app_files_dir): - shutil.rmtree(self.app_files_dir) - os.makedirs(self.app_files_dir, exist_ok=True) - - await engine.dispose() - - psql_path = self.pg_dump_path.replace("pg_dump", "psql") - drop_cmd = ( - f'"{psql_path}" ' - f'-d "{self.db_url}" ' - f'-c "DROP SCHEMA public CASCADE; CREATE SCHEMA public;"' - ) - subprocess.run(drop_cmd, shell=True, check=True) - - temp_dir = os.path.join(self.backup_dir, f"temp_restore_{backup_id}") - os.makedirs(temp_dir, exist_ok=True) - with tarfile.open(backup.path, "r:gz") as tar: - tar.extractall(temp_dir) - - db_dump_path = os.path.join(temp_dir, "db_dump.sql") - restore_cmd = f'"{self.pg_dump_path.replace("pg_dump", "pg_restore")}" -d {self.db_url} --no-owner --no-privileges -Fc "{db_dump_path}"' - subprocess.run(restore_cmd, shell=True, check=True) - - extracted_app_files_dir = os.path.join(temp_dir, os.path.basename(self.app_files_dir)) - if os.path.exists(extracted_app_files_dir): - shutil.copytree(extracted_app_files_dir, self.app_files_dir, dirs_exist_ok=True) - - shutil.rmtree(temp_dir) - - return self.model_to_entity(backup) - - except subprocess.CalledProcessError as e: - raise HTTPException(500, f"Ошибка восстановления бэкапа: {e}") - except Exception as e: - raise HTTPException(500, f"Ошибка сервера: {str(e)}") - async def get_backup_file_by_id(self, backup_id: int) -> FileResponse: backup = await self.backup_repository.get_by_id(backup_id) diff --git a/web-app/src/Api/backupsApi.js b/web-app/src/Api/backupsApi.js index c9c9314..1296c26 100644 --- a/web-app/src/Api/backupsApi.js +++ b/web-app/src/Api/backupsApi.js @@ -40,12 +40,6 @@ export const backupsApi = createApi({ }, invalidatesTags: ['Backup'], }), - restoreBackup: builder.mutation({ - query: (backupId) => ({ - url: `/backups/${backupId}/restore/`, - method: 'POST', - }), - }), }), }); @@ -54,5 +48,4 @@ export const { useCreateBackupMutation, useDeleteBackupMutation, useUploadBackupMutation, - useRestoreBackupMutation, } = backupsApi; diff --git a/web-app/src/Components/Pages/AdminPage/Components/BackupManageTab/BackupManageTab.jsx b/web-app/src/Components/Pages/AdminPage/Components/BackupManageTab/BackupManageTab.jsx index 101108d..bf082b0 100644 --- a/web-app/src/Components/Pages/AdminPage/Components/BackupManageTab/BackupManageTab.jsx +++ b/web-app/src/Components/Pages/AdminPage/Components/BackupManageTab/BackupManageTab.jsx @@ -1,5 +1,5 @@ -import {Button, Divider, List, Popconfirm, Result, Space, Tooltip, Typography, Upload} from "antd"; -import {CloudDownloadOutlined, DeleteOutlined, UploadOutlined, ReloadOutlined} from "@ant-design/icons"; +import {Button, Divider, List, Result, Space, Tooltip, Typography, Upload} from "antd"; +import {CloudDownloadOutlined, DeleteOutlined, UploadOutlined} from "@ant-design/icons"; import useBackupManageTab from "./useBackupManageTab.js"; import LoadingIndicator from "../../../../Widgets/LoadingIndicator/LoadingIndicator.jsx"; @@ -58,18 +58,6 @@ const BackupManageTab = () => { Скачать - - backupManageTabData.restoreBackupHandler(backup.id)}> - - -