瀏覽代碼

😁增加PostgreSQL数据库备份接口服务

zuohuaijun 2 年之前
父節點
當前提交
97f6a9920f

+ 8 - 0
Admin.NET/Admin.NET.Application/Configuration/Database.json

@@ -72,5 +72,13 @@
       //  }
       //}
     ]
+  },
+  // 数据库备份(PostgreSQL)
+  "DbBackup": {
+    "Host": "127.0.0.1",
+    "Port": 5432,
+    "Database": "Admin.NET",
+    "User": "postgres",
+    "Password": "123456"
   }
 }

+ 36 - 0
Admin.NET/Admin.NET.Core/Option/DbBackupOptions.cs

@@ -0,0 +1,36 @@
+// 大名科技(天津)有限公司版权所有  电话:18020030720  QQ:515096995
+//
+// 此源代码遵循位于源代码树根目录中的 LICENSE 文件的许可证
+
+namespace Admin.NET.Core;
+
+/// <summary>
+/// 数据库备份配置选项
+/// </summary>
+public sealed class DbBackupOptions : IConfigurableOptions
+{
+    /// <summary>
+    /// 服务器地址
+    /// </summary>
+    public string Host { get; set; }
+
+    /// <summary>
+    /// 端口
+    /// </summary>
+    public int Port { get; set; }
+
+    /// <summary>
+    /// 数据库名称
+    /// </summary>
+    public string Database { get; set; }
+
+    /// <summary>
+    /// 账号
+    /// </summary>
+    public string User { get; set; }
+
+    /// <summary>
+    /// 密码
+    /// </summary>
+    public string Password { get; set; }
+}

+ 70 - 0
Admin.NET/Admin.NET.Core/Service/DataBase/SysDatabaseService.cs

@@ -442,4 +442,74 @@ public class SysDatabaseService : IDynamicApiController, ITransient
             Directory.CreateDirectory(backendPath);
         return Path.Combine(backendPath, input.SeedDataName + ".cs");
     }
+
+    /// <summary>
+    /// 备份数据库(PostgreSQL)
+    /// </summary>
+    /// <returns></returns>
+    [HttpPost, NonUnify]
+    public async Task<IActionResult> BackupDatabase()
+    {
+        var dbBackupOpt = App.GetConfig<DbBackupOptions>("DbBackup", true);
+        if (dbBackupOpt == null || string.IsNullOrWhiteSpace(dbBackupOpt.Host) || string.IsNullOrWhiteSpace(dbBackupOpt.User) || string.IsNullOrWhiteSpace(dbBackupOpt.Password) || string.IsNullOrWhiteSpace(dbBackupOpt.Database))
+            throw Oops.Oh("PostgreSQL数据库配置错误");
+
+        var backupDirectory = Path.Combine(Directory.GetCurrentDirectory(), "backups");
+
+        // 确保备份目录存在
+        Directory.CreateDirectory(backupDirectory);
+
+        // 构建备份文件名
+        string backupFileName = $"backup_{DateTime.Now:yyyyMMddHHmmss}.sql";
+        string backupFilePath = Path.Combine(backupDirectory, backupFileName);
+
+        // 启动pg_dump进程进行备份
+        // 设置密码:export PGPASSWORD='xxxxxx'
+        var bash = $"-U {dbBackupOpt.User} -h {dbBackupOpt.Host} -p {dbBackupOpt.Port} -E UTF8 -F c -b -v -f {backupFilePath} {dbBackupOpt.Database}";
+        var startInfo = new ProcessStartInfo
+        {
+            FileName = "pg_dump",
+            Arguments = bash,
+            UseShellExecute = false,
+            RedirectStandardOutput = true,
+            RedirectStandardError = true,
+            CreateNoWindow = true,
+            EnvironmentVariables =
+            {
+                ["PGPASSWORD"] = dbBackupOpt.Password
+            }
+        };
+
+        //_logger.LogInformation("备份数据库:pg_dump " + bash);
+
+        //try
+        //{
+        using (var backupProcess = Process.Start(startInfo))
+        {
+            await backupProcess.WaitForExitAsync();
+
+            //var output = await backupProcess.StandardOutput.ReadToEndAsync();
+            //var error = await backupProcess.StandardError.ReadToEndAsync();
+
+            // 检查备份是否成功
+            if (backupProcess.ExitCode != 0)
+            {
+                throw Oops.Oh($"备份失败:ExitCode({backupProcess.ExitCode})");
+            }
+        }
+
+        //    _logger.LogInformation($"备份成功:{backupFilePath}");
+        //}
+        //catch (Exception ex)
+        //{
+        //    _logger.LogError(ex, $"备份失败:");
+        //    throw;
+        //}
+
+        // 若备份成功则提供下载链接
+        return new FileStreamResult(new FileStream(backupFilePath, FileMode.Open), "application/octet-stream")
+        {
+            FileDownloadName = backupFileName
+        };
+    }
 }

+ 1 - 4
Admin.NET/Admin.NET.Web.Core/ProjectOptions.cs

@@ -19,6 +19,7 @@ public static class ProjectOptions
     public static IServiceCollection AddProjectOptions(this IServiceCollection services)
     {
         services.AddConfigurableOptions<DbConnectionOptions>();
+        services.AddConfigurableOptions<DbBackupOptions>();
         services.AddConfigurableOptions<SnowIdOptions>();
         services.AddConfigurableOptions<CacheOptions>();
         services.AddConfigurableOptions<ClusterOptions>();
@@ -35,10 +36,6 @@ public static class ProjectOptions
         services.AddConfigurableOptions<CryptogramOptions>();
         services.AddConfigurableOptions<SMSOptions>();
         services.AddConfigurableOptions<EventBusOptions>();
-        //services.AddConfigurableOptions<IpRateLimitingOptions>();
-        //services.AddConfigurableOptions<IpRateLimitPoliciesOptions>();
-        //services.AddConfigurableOptions<ClientRateLimitingOptions>();
-        //services.AddConfigurableOptions<ClientRateLimitPoliciesOptions>();
         services.Configure<IpRateLimitOptions>(App.Configuration.GetSection("IpRateLimiting"));
         services.Configure<IpRateLimitPolicies>(App.Configuration.GetSection("IpRateLimitPolicies"));
         services.Configure<ClientRateLimitOptions>(App.Configuration.GetSection("ClientRateLimiting"));