From 1f472b2f49cf22c797909c8bedca96127cab52f4 Mon Sep 17 00:00:00 2001 From: Magnus Root Date: Tue, 10 Mar 2026 17:37:30 +0300 Subject: [PATCH] Fix --- sw_processor.go | 76 ++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 60 insertions(+), 16 deletions(-) diff --git a/sw_processor.go b/sw_processor.go index 1dd6aa6..8512fee 100644 --- a/sw_processor.go +++ b/sw_processor.go @@ -15,9 +15,9 @@ import ( const ( SWNginxBinary = "solidwall-nginx" SWConfigDir = "/etc/solidwall-nginx" - SWSiteAvailableDir = "/etc/solidwall-nginx/site-available" - SWSiteEnabledDir = "/etc/solidwall-nginx/site-enabled" - SWStaticDir = "/etc/solidwall-nginx/static" + SWSiteAvailableDir = "/etc/solidwall-nginx/sites-available" + SWSiteEnabledDir = "/etc/solidwall-nginx/sites-enabled" + SWStaticDir = "/usr/share/solidwall-nginx/config/static" SWLogDir = "/var/log/solidwall" SWInternalHTTPPort = 8000 SWInternalHTTPSPort = 9000 @@ -73,10 +73,10 @@ func processSWClient( log.Printf("✓ Получено ресурсов для SW: %d", len(resourcesData)) - // Создание static файлов если отсутствуют + // Создание директорий и static файлов если отсутствуют if err := ensureSWStaticFiles(); err != nil { - log.Printf("⚠ Ошибка создания static файлов: %v", err) - // Не критично, продолжаем + log.Printf("⚠ Ошибка создания директорий/файлов SW: %v", err) + return false } // Генерация конфигов для каждого ресурса @@ -243,13 +243,13 @@ func generateSWConfig(config Config, clientTitle string, res ResourceData) (bool return false, fmt.Errorf("замена конфига: %w", err) } - // Создаём симлинк в site-enabled если не существует + // Создаём симлинк в sites-enabled если не существует if _, err := os.Lstat(enabledPath); os.IsNotExist(err) { - relPath := fmt.Sprintf("../site-available/%s", configFilename) + relPath := fmt.Sprintf("../sites-available/%s", configFilename) if err := os.Symlink(relPath, enabledPath); err != nil { log.Printf(" ⚠ Ошибка создания симлинка: %v", err) } else { - log.Printf(" ✓ Создан симлинк в site-enabled") + log.Printf(" ✓ Создан симлинк в sites-enabled: %s → %s", enabledPath, relPath) } } @@ -381,8 +381,8 @@ func writeSWConfigContent(f *os.File, config Config, res ResourceData) error { httpsUpstreamName = fmt.Sprintf("secure%d_%d", res.L7ResourceID, httpsOutputPorts[0]) } - writeSWInternalHTTPServer(f, res, domainsStr, httpUpstreamName) - writeSWInternalHTTPSServer(f, res, domainsStr, httpsUpstreamName) + writeSWInternalHTTPServer(f, res, domainsStr, httpUpstreamName, serverDirectivesWithoutBlocks, locationDirectives, isFullLocationBlock) + writeSWInternalHTTPSServer(f, res, domainsStr, httpsUpstreamName, serverDirectivesWithoutBlocks, locationDirectives, isFullLocationBlock) // ════════════════════════════════════════════════════════════ // КАСТОМНЫЕ SERVER_BLOCK (если есть) @@ -553,7 +553,7 @@ func writeSWPublicHTTPSServer(f *os.File, config Config, res ResourceData, port } // writeSWInternalHTTPServer пишет внутренний HTTP → Origin server блок -func writeSWInternalHTTPServer(f *os.File, res ResourceData, domainsStr string, upstreamName string) { +func writeSWInternalHTTPServer(f *os.File, res ResourceData, domainsStr string, upstreamName string, serverDirectives string, locationDirectives string, isFullLocationBlock bool) { f.WriteString("# Proxying HTTP requests to origin\n") f.WriteString("server {\n") f.WriteString(fmt.Sprintf(" listen 127.0.0.1:%d;\n", SWInternalHTTPPort)) @@ -568,14 +568,32 @@ func writeSWInternalHTTPServer(f *os.File, res ResourceData, domainsStr string, f.WriteString(" proxy_set_header CDN-Loop \"WAF\";\n\n") f.WriteString(fmt.Sprintf(" error_log %s/%d_error.log error;\n\n", SWLogDir, res.L7ResourceID)) + // Кастомные location блоки (полные) перед location / + if isFullLocationBlock && locationDirectives != "" { + log.Printf(" └─ Добавление location_nginx_custom (отдельный блок) для внутреннего HTTP") + writeIndentedLines(f, locationDirectives) + f.WriteString("\n") + } + f.WriteString(" location / {\n") + + if serverDirectives != "" { + log.Printf(" └─ Добавление server_nginx_custom в location / (внутренний HTTP)") + writeIndentedLines(f, serverDirectives) + } + + if !isFullLocationBlock && locationDirectives != "" { + log.Printf(" └─ Добавление location_nginx_custom (директивы) в location / (внутренний HTTP)") + writeIndentedLines(f, locationDirectives) + } + f.WriteString(fmt.Sprintf(" proxy_pass http://%s;\n", upstreamName)) f.WriteString(" }\n") f.WriteString("}\n\n") } // writeSWInternalHTTPSServer пишет внутренний HTTPS → Origin server блок -func writeSWInternalHTTPSServer(f *os.File, res ResourceData, domainsStr string, upstreamName string) { +func writeSWInternalHTTPSServer(f *os.File, res ResourceData, domainsStr string, upstreamName string, serverDirectives string, locationDirectives string, isFullLocationBlock bool) { f.WriteString("# Proxying HTTPS requests to origin\n") f.WriteString("server {\n") f.WriteString(fmt.Sprintf(" listen 127.0.0.1:%d;\n", SWInternalHTTPSPort)) @@ -593,7 +611,25 @@ func writeSWInternalHTTPSServer(f *os.File, res ResourceData, domainsStr string, f.WriteString(" proxy_set_header CDN-Loop \"WAF\";\n\n") f.WriteString(fmt.Sprintf(" error_log %s/%d_error.log error;\n\n", SWLogDir, res.L7ResourceID)) + // Кастомные location блоки (полные) перед location / + if isFullLocationBlock && locationDirectives != "" { + log.Printf(" └─ Добавление location_nginx_custom (отдельный блок) для внутреннего HTTPS") + writeIndentedLines(f, locationDirectives) + f.WriteString("\n") + } + f.WriteString(" location / {\n") + + if serverDirectives != "" { + log.Printf(" └─ Добавление server_nginx_custom в location / (внутренний HTTPS)") + writeIndentedLines(f, serverDirectives) + } + + if !isFullLocationBlock && locationDirectives != "" { + log.Printf(" └─ Добавление location_nginx_custom (директивы) в location / (внутренний HTTPS)") + writeIndentedLines(f, locationDirectives) + } + f.WriteString(fmt.Sprintf(" proxy_pass https://%s;\n", upstreamName)) f.WriteString(" }\n") f.WriteString("}\n\n") @@ -765,10 +801,18 @@ func writeSWStandardSettings(f *os.File, settings AppsSettings) { } } -// ensureSWStaticFiles создаёт static файлы если отсутствуют +// ensureSWStaticFiles создаёт необходимые директории и static файлы если отсутствуют func ensureSWStaticFiles() error { - if err := os.MkdirAll(SWStaticDir, 0755); err != nil { - return fmt.Errorf("создание директории %s: %w", SWStaticDir, err) + // Создаём директории если отсутствуют (static не создаём — это симлинк) + dirs := []string{ + SWSiteAvailableDir, + SWSiteEnabledDir, + SWLogDir, + } + for _, dir := range dirs { + if err := os.MkdirAll(dir, 0755); err != nil { + return fmt.Errorf("создание директории %s: %w", dir, err) + } } // static/waf.conf