Автоматическое создание сертификатов

Добавил возможность создания автоматических сертификатов.
This commit is contained in:
2026-01-17 10:36:00 +07:00
parent 7169304212
commit 9a788800b5
11 changed files with 779 additions and 13 deletions

View File

@@ -3,6 +3,7 @@ package admin
import (
"context"
"encoding/json"
"fmt"
"os"
"os/exec"
"time"
@@ -10,6 +11,7 @@ import (
"github.com/wailsapp/wails/v2/pkg/runtime"
webserver "vServer/Backend/WebServer"
"vServer/Backend/WebServer/acme"
"vServer/Backend/admin/go/proxy"
"vServer/Backend/admin/go/services"
"vServer/Backend/admin/go/sites"
@@ -61,6 +63,15 @@ func (a *App) Startup(ctx context.Context) {
webserver.Cert_start()
time.Sleep(50 * time.Millisecond)
// Инициализируем ACME менеджер (true = production, false = staging)
if err := acme.Init(true); err != nil {
tools.Logs_file(1, "ACME", "❌ Ошибка инициализации ACME: "+err.Error(), "logs_acme.log", true)
} else {
// Запускаем фоновую проверку сертификатов каждые 24 часа
acme.StartBackgroundRenewal(24 * time.Hour)
}
time.Sleep(50 * time.Millisecond)
// Запускаем серверы
go webserver.StartHTTPS()
time.Sleep(50 * time.Millisecond)
@@ -75,6 +86,18 @@ func (a *App) Startup(ctx context.Context) {
// Запускаем MySQL асинхронно
go webserver.StartMySQLServer(false)
// Автоматическое получение SSL сертификатов для доменов с AutoCreateSSL=true
if config.ConfigData.Soft_Settings.ACME_enabled {
go func() {
time.Sleep(2 * time.Second) // Ждём пока HTTP сервер полностью запустится
results := acme.ObtainAllCertificates()
if len(results) > 0 {
// Перезагружаем сертификаты после получения
webserver.ReloadCertificates()
}
}()
}
// Запускаем мониторинг статусов
go a.monitorServices()
}
@@ -363,4 +386,40 @@ func (a *App) DeleteSite(host string) string {
config.LoadConfig()
return "Site deleted successfully"
}
// ObtainSSLCertificate получает SSL сертификат для домена через Let's Encrypt
func (a *App) ObtainSSLCertificate(domain string) string {
result := acme.ObtainCertificate(domain)
if result.Success {
// Перезагружаем сертификаты после получения
webserver.ReloadCertificates()
return "SSL certificate obtained successfully for " + domain
}
return "Error: " + result.Error
}
// ObtainAllSSLCertificates получает сертификаты для всех доменов с AutoCreateSSL
func (a *App) ObtainAllSSLCertificates() string {
results := acme.ObtainAllCertificates()
successCount := 0
errorCount := 0
for _, r := range results {
if r.Success {
successCount++
} else {
errorCount++
}
}
if len(results) > 0 {
// Перезагружаем сертификаты после получения
webserver.ReloadCertificates()
}
return fmt.Sprintf("Completed: %d success, %d errors", successCount, errorCount)
}

View File

@@ -7,6 +7,7 @@ type ProxyInfo struct {
LocalPort string `json:"local_port"`
ServiceHTTPSuse bool `json:"service_https_use"`
AutoHTTPS bool `json:"auto_https"`
AutoCreateSSL bool `json:"AutoCreateSSL"`
Status string `json:"status"`
}

View File

@@ -7,5 +7,6 @@ type SiteInfo struct {
Status string `json:"status"`
RootFile string `json:"root_file"`
RootFileRouting bool `json:"root_file_routing"`
AutoCreateSSL bool `json:"AutoCreateSSL"`
}