diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 4aa750f..7ffefe4 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -113,6 +113,7 @@ waf-host-02 | instance-c - docker_image_download # URL для скачивания образа - debug # Режим отладки (bool, влияет на лог-уровень) - shm_size # Размер /dev/shm в GB (дефолт: 1) +- ptaf_fallback_code # Код ответа ptaf_fallback: число или 'pass' (дефолт: 418) ``` **Важно:** `waf_instance` определяет на каком хосте должен работать клиент @@ -157,7 +158,6 @@ waf-host-02 | instance-c - fail_timeout # Время восстановления сервера (дефолт 15с) - balancing_method # Метод балансировки: least_conn, ip_hash, random и др. - proxy_next_upstream_codes # HTTP-коды для proxy_next_upstream (дефолт: 500,502,503,504) -- ptaf_fallback_code # Код ответа ptaf_fallback: число или 'pass' (дефолт: 418) ``` #### Таблица `sp_info` (кэш API данных) @@ -753,8 +753,8 @@ UPDATE apps_settings SET balancing_method = 'least_conn' WHERE l7resourceid = 12 ```sql -- Пропускать трафик если WAF недоступен -UPDATE apps_settings SET ptaf_fallback_code = 'pass' WHERE l7resourceid = 12345; +UPDATE client_info SET ptaf_fallback_code = 'pass' WHERE client_uuid = 12345; -- Вернуть 503 вместо 418 -UPDATE apps_settings SET ptaf_fallback_code = '503' WHERE l7resourceid = 12345; +UPDATE client_info SET ptaf_fallback_code = '503' WHERE client_uuid = 12345; ``` diff --git a/DATABASE_SCHEMA.md b/DATABASE_SCHEMA.md index 3454c49..e11f76d 100644 --- a/DATABASE_SCHEMA.md +++ b/DATABASE_SCHEMA.md @@ -98,6 +98,7 @@ WHERE hostname = $1 AND instance = $2; | `docker_image_download` | TEXT | URL для скачивания tar-архива образа | `https://...` | | `debug` | BOOLEAN | Режим отладки | `false` | | `shm_size` | INTEGER | Размер /dev/shm в GB | `1` | +| `ptaf_fallback_code` | TEXT | Код ответа ptaf_fallback | `'418'` | ### Используемые запросы @@ -216,7 +217,6 @@ ALTER TABLE client_info | `fail_timeout` | INTEGER | Время восстановления сервера (сек) | `15` | | `balancing_method` | TEXT | Метод балансировки upstream | `NULL` | | `proxy_next_upstream_codes` | TEXT | HTTP-коды для proxy_next_upstream | `'500,502,503,504'` | -| `ptaf_fallback_code` | TEXT | Код ответа ptaf_fallback | `'418'` | ### Используемые запросы @@ -269,7 +269,7 @@ ALTER TABLE apps_settings ALTER TABLE apps_settings ADD COLUMN IF NOT EXISTS proxy_next_upstream_codes TEXT DEFAULT '500,502,503,504'; -ALTER TABLE apps_settings +ALTER TABLE client_info ADD COLUMN IF NOT EXISTS ptaf_fallback_code TEXT DEFAULT '418'; ``` @@ -316,13 +316,13 @@ proxy_next_upstream error timeout invalid_header http_502 http_503 http_504; ```sql -- Пропускать трафик если WAF недоступен -UPDATE apps_settings SET ptaf_fallback_code = 'pass' WHERE l7resourceid = 12345; +UPDATE client_info SET ptaf_fallback_code = 'pass' WHERE client_uuid = 12345; -- Вернуть 503 вместо 418 -UPDATE apps_settings SET ptaf_fallback_code = '503' WHERE l7resourceid = 12345; +UPDATE client_info SET ptaf_fallback_code = '503' WHERE client_uuid = 12345; -- Вернуть дефолт (418) -UPDATE apps_settings SET ptaf_fallback_code = NULL WHERE l7resourceid = 12345; +UPDATE client_info SET ptaf_fallback_code = NULL WHERE client_uuid = 12345; ``` #### upstream_angie_custom / upstream_nginx_custom diff --git a/api.go b/api.go index fedc8bb..7a7c460 100644 --- a/api.go +++ b/api.go @@ -347,13 +347,11 @@ type stringWriter interface { WriteString(s string) (int, error) } -// getPtafFallbackCode возвращает значение ptaf_fallback из первого ресурса где оно задано. +// getPtafFallbackCode возвращает значение ptaf_fallback из client_info. // Дефолт: 418. Допустимые значения: число (например 503) или 'pass' -func getPtafFallbackCode(resources []ResourceData) string { - for _, res := range resources { - if res.AppsSettings.PtafFallbackCode.Valid && strings.TrimSpace(res.AppsSettings.PtafFallbackCode.String) != "" { - return strings.TrimSpace(res.AppsSettings.PtafFallbackCode.String) - } +func getPtafFallbackCode(clientInfo ClientInfo) string { + if clientInfo.PtafFallbackCode.Valid && strings.TrimSpace(clientInfo.PtafFallbackCode.String) != "" { + return strings.TrimSpace(clientInfo.PtafFallbackCode.String) } return "418" } diff --git a/containers_part1.go b/containers_part1.go index e2f4470..d2142d3 100644 --- a/containers_part1.go +++ b/containers_part1.go @@ -69,7 +69,7 @@ func setupContainers(config Config, clientTitle string, clientInfo *ClientInfo, ptafConfig = clientInfo.PTAFConfig.String } - changed, err := generateNginxConf(nginxConfPath, config, ptafConfig, existingPodIP, clientInfo.Debug, getPtafFallbackCode(resources)) + changed, err := generateNginxConf(nginxConfPath, config, ptafConfig, existingPodIP, clientInfo.Debug, getPtafFallbackCode(*clientInfo)) if err != nil { return fmt.Errorf("ошибка генерации nginx.conf: %w", err) } diff --git a/db.go b/db.go index f50cc86..8eff52b 100644 --- a/db.go +++ b/db.go @@ -98,7 +98,7 @@ func checkHostBelongsToInstance(db *sql.DB, hostname, instance string) (bool, er func getClientInfoByInstance(db *sql.DB, instance string) ([]ClientInfo, error) { query := ` SELECT containers_count, ptaf_config, client_title, fluent_bit_port, waf_instance, - docker_image, docker_image_download, debug, shm_size + docker_image, docker_image_download, debug, shm_size, ptaf_fallback_code FROM client_info WHERE waf_instance = $1 ` @@ -126,6 +126,7 @@ func getClientInfoByInstance(db *sql.DB, instance string) ([]ClientInfo, error) &ci.DockerImageDownload, &ci.Debug, &ci.ShmSize, + &ci.PtafFallbackCode, ) if err != nil { return nil, fmt.Errorf("ошибка сканирования строки: %w", err) @@ -161,7 +162,6 @@ func getAppsSettingsByClientTitle(db *sql.DB, clientTitle string) ([]AppsSetting fail_timeout, balancing_method, proxy_next_upstream_codes, - ptaf_fallback_code, custom_sw_nginx_ssl FROM apps_settings WHERE client_title = $1 @@ -197,7 +197,6 @@ func getAppsSettingsByClientTitle(db *sql.DB, clientTitle string) ([]AppsSetting &a.FailTimeout, &a.BalancingMethod, &a.ProxyNextUpstreamCodes, - &a.PtafFallbackCode, &a.CustomSWNginxSSL, ) if err != nil { @@ -213,7 +212,7 @@ func getAppsSettingsByClientTitle(db *sql.DB, clientTitle string) ([]AppsSetting func getClientInfoByClientTitle(db *sql.DB, clientTitle string) (*ClientInfo, error) { query := ` SELECT containers_count, ptaf_config, client_title, fluent_bit_port, waf_instance, - docker_image, docker_image_download, debug, shm_size + docker_image, docker_image_download, debug, shm_size, ptaf_fallback_code FROM client_info WHERE client_title = $1 ` @@ -230,6 +229,7 @@ func getClientInfoByClientTitle(db *sql.DB, clientTitle string) (*ClientInfo, er &clientInfo.DockerImageDownload, &clientInfo.Debug, &clientInfo.ShmSize, + &clientInfo.PtafFallbackCode, ) if err != nil { if strings.Contains(err.Error(), "does not exist") { diff --git a/types.go b/types.go index 295ad6e..8e3a9a4 100644 --- a/types.go +++ b/types.go @@ -38,7 +38,6 @@ type AppsSettings struct { FailTimeout sql.NullInt64 // Время в секундах после которого origin снова доступен (дефолт 15) BalancingMethod sql.NullString // Метод балансировки: least_conn, ip_hash, random и т.д. ProxyNextUpstreamCodes sql.NullString // HTTP-коды для proxy_next_upstream (дефолт: 500,502,503,504) - PtafFallbackCode sql.NullString // Код ответа ptaf_fallback: число или 'pass' (дефолт: 418) CustomSWNginxSSL sql.NullString // Кастомные SSL директивы для SW nginx - полностью заменяют дефолтные если заполнено } @@ -53,6 +52,7 @@ type ClientInfo struct { DockerImageDownload sql.NullString // URL для скачивания образа Debug bool // Режим отладки (влияет на лог-уровень и переменные окружения) ShmSize int // Размер /dev/shm в GB (дефолт 1) + PtafFallbackCode sql.NullString // Код ответа ptaf_fallback: число или 'pass' (дефолт: 418) } // Структуры для API ответов