Change place fallback

This commit is contained in:
Magnus Root 2026-04-17 15:04:36 +03:00
parent 1126de8b59
commit f2998502db
6 changed files with 18 additions and 20 deletions

View file

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

View file

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

10
api.go
View file

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

View file

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

8
db.go
View file

@ -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") {

View file

@ -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 ответов