@@ -72,8 +72,9 @@ func (cd *CertDeployer) DeployCertificate(domain, url string) error {
7272 sslConfig := config .GetConfig ().SSL
7373 nginxPath := sslConfig .NginxPath
7474 apachePath := sslConfig .ApachePath
75+ rustFSPath := sslConfig .RustFSPath
7576
76- if nginxPath == "" && apachePath == "" {
77+ if nginxPath == "" && apachePath == "" && rustFSPath == "" {
7778 logger .Info ("未配置SSL目录,证书已下载" , "file" , zipFile )
7879 return nil
7980 }
@@ -106,7 +107,14 @@ func (cd *CertDeployer) DeployCertificate(domain, url string) error {
106107 }
107108 }
108109
109- // 4. 检查nginx是否存在,如果存在则测试配置和重新加载
110+ // 4. 部署到 RustFS 目录
111+ if rustFSPath != "" {
112+ if err := cd .deployToRustFS (extractDir , rustFSPath , safeDomain ); err != nil {
113+ return fmt .Errorf ("部署到RustFS失败: %w" , err )
114+ }
115+ }
116+
117+ // 5. 检查nginx是否存在,如果存在则测试配置和重新加载
110118 if nginxPath != "" && cd .isNginxAvailable () {
111119 // 测试nginx配置
112120 if err := cd .testNginxConfig (); err != nil {
@@ -121,7 +129,7 @@ func (cd *CertDeployer) DeployCertificate(domain, url string) error {
121129 logger .Info ("nginx未安装或不在PATH中,跳过nginx相关操作" )
122130 }
123131
124- // 5 . 检查apache是否存在,如果存在则测试配置和重新加载
132+ // 6 . 检查apache是否存在,如果存在则测试配置和重新加载
125133 if apachePath != "" && cd .isApacheAvailable () {
126134 // 测试apache配置
127135 if err := cd .testApacheConfig (); err != nil {
@@ -266,6 +274,55 @@ func (cd *CertDeployer) DeployCertificateToApache(domain, url string) error {
266274 return nil
267275}
268276
277+ // DeployCertificateToRustFS 仅部署证书到 RustFS
278+ func (cd * CertDeployer ) DeployCertificateToRustFS (domain , url string ) error {
279+ sslConfig := config .GetConfig ().SSL
280+ rustFSPath := sslConfig .RustFSPath
281+
282+ if rustFSPath == "" {
283+ return fmt .Errorf ("未配置 RustFS TLS 目录 (ssl.rustFSPath)" )
284+ }
285+
286+ // 创建certs目录
287+ if err := os .MkdirAll (certsDir , 0755 ); err != nil {
288+ return fmt .Errorf ("创建证书目录失败: %w" , err )
289+ }
290+
291+ safeDomain := sanitizeDomain (domain )
292+ fileName := fmt .Sprintf ("%s_certificates.zip" , safeDomain )
293+ zipFile := filepath .Join (certsDir , fileName )
294+
295+ // 下载zip文件
296+ if err := cd .client .downloadFile (url , zipFile ); err != nil {
297+ return fmt .Errorf ("下载证书失败: %w" , err )
298+ }
299+
300+ logger .Info ("证书下载完成" , "file" , zipFile )
301+
302+ defer func () {
303+ if _ , err := os .Stat (zipFile ); err == nil {
304+ os .Remove (zipFile )
305+ }
306+ }()
307+
308+ folderName := safeDomain + "_certificates"
309+ extractDir := filepath .Join (certsDir , folderName )
310+
311+ if err := cd .extractZip (zipFile , extractDir ); err != nil {
312+ os .RemoveAll (extractDir )
313+ return fmt .Errorf ("解压证书失败: %w" , err )
314+ }
315+ defer os .RemoveAll (extractDir )
316+
317+ // 部署到 RustFS 目录
318+ if err := cd .deployToRustFS (extractDir , rustFSPath , safeDomain ); err != nil {
319+ return fmt .Errorf ("部署到RustFS失败: %w" , err )
320+ }
321+
322+ logger .Info ("RustFS证书部署完成" , "domain" , domain )
323+ return nil
324+ }
325+
269326// deployToNginx 部署证书到 Nginx 目录并生成配置文件
270327func (cd * CertDeployer ) deployToNginx (sourceDir , nginxPath , folderName , safeDomain string ) error {
271328 // 移动证书文件
@@ -308,6 +365,43 @@ func (cd *CertDeployer) deployToApache(sourceDir, apachePath, folderName, safeDo
308365 return nil
309366}
310367
368+ // deployToRustFS 部署证书到 RustFS 目录
369+ func (cd * CertDeployer ) deployToRustFS (sourceDir , rustFSPath , safeDomain string ) error {
370+ // RustFS 目标目录(使用域名作为子目录)
371+ targetDir := filepath .Join (rustFSPath , safeDomain )
372+
373+ // 如果目标目录已存在,先删除
374+ if _ , err := os .Stat (targetDir ); err == nil {
375+ if err := os .RemoveAll (targetDir ); err != nil {
376+ return fmt .Errorf ("删除现有RustFS证书目录失败: %w" , err )
377+ }
378+ }
379+
380+ // 创建目标目录
381+ if err := os .MkdirAll (targetDir , 0755 ); err != nil {
382+ return fmt .Errorf ("创建RustFS证书目录失败: %w" , err )
383+ }
384+
385+ // 复制并重命名证书文件
386+ // cert.pem -> rustfs_cert.pem
387+ srcCert := filepath .Join (sourceDir , "cert.pem" )
388+ dstCert := filepath .Join (targetDir , "rustfs_cert.pem" )
389+ if err := copyFileWithMode (srcCert , dstCert , 0644 ); err != nil {
390+ return fmt .Errorf ("复制证书文件失败: %w" , err )
391+ }
392+
393+ // 复制并重命名私钥文件
394+ // privateKey.key -> rustfs_key.pem
395+ srcKey := filepath .Join (sourceDir , "privateKey.key" )
396+ dstKey := filepath .Join (targetDir , "rustfs_key.pem" )
397+ if err := copyFileWithMode (srcKey , dstKey , 0600 ); err != nil {
398+ return fmt .Errorf ("复制私钥文件失败: %w" , err )
399+ }
400+
401+ logger .Info ("证书已部署到RustFS目录" , "path" , targetDir , "cert" , "rustfs_cert.pem" , "key" , "rustfs_key.pem" )
402+ return nil
403+ }
404+
311405// generateNginxSSLConfig 生成 Nginx SSL 配置文件
312406func (cd * CertDeployer ) generateNginxSSLConfig (nginxPath , folderName , safeDomain string ) error {
313407 certDir := filepath .Join (nginxPath , folderName )
0 commit comments