This commit is contained in:
Magnus Root 2026-03-10 17:37:30 +03:00
parent 49010457db
commit 1f472b2f49

View file

@ -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