grafana_gen/config.go
2026-02-26 15:35:00 +03:00

175 lines
8.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
const (
// Database settings
// Рекомендуется задавать через .env файл или переменные окружения
DefaultDBUser = "" // Задать через DB_USER в .env
DefaultDBPassword = "" // Задать через DB_PASSWORD в .env
DefaultDBName = "waf_info"
DefaultDBPort = 5432
DefaultPrimaryDBHost = "10.100.10.8"
DefaultSecondaryDBHost = "10.100.13.5"
// Git repository settings
DefaultTemplatesRepo = "https://svc-git.cirex.ru/cloudstack/grafana_gen_template.git"
DefaultTemplatesBranch = "master"
DefaultTemplatesPath = "/etc/grafana_gen/templates" // Системный путь
DefaultStateFile = "/var/lib/grafana_gen/state.json" // Системный путь для state
// DefaultGitToken - Gitea access token для доступа к репозиторию
// ВАЖНО: Рекомендуется задавать через .env файл или переменную окружения!
//
// Как создать токен в Gitea:
// 1. Gitea → Settings → Applications → Generate New Token
// 2. Выбрать scope: repository (read)
//
// Варианты использования (в порядке приоритета):
// 1. Флаг командной строки: -git-token "your-gitea-token"
// 2. Переменная окружения: export GIT_TOKEN="your-gitea-token"
// 3. Файл .env: GIT_TOKEN=your-gitea-token
// 4. Hardcode здесь (не рекомендуется): DefaultGitToken = "your-gitea-token"
//
// Оставьте пустым для использования только флага/env/.env файла
DefaultGitToken = ""
// DefaultGrafanaAPIKey - Grafana API ключ для создания дашбордов
// ВАЖНО: Рекомендуется задавать через .env файл или переменную окружения!
//
// Варианты использования (в порядке приоритета):
// 1. Флаг командной строки: -grafana-api-key "glsa-xxxxxxxxxxxx"
// 2. Переменная окружения: export GRAFANA_API_KEY="glsa-xxxxxxxxxxxx"
// 3. Файл .env: GRAFANA_API_KEY=glsa_xxxxxxxxxxxx
// 4. Hardcode здесь (не рекомендуется): DefaultGrafanaAPIKey = "glsa-xxxxxxxxxxxx"
//
// Оставьте пустым для использования только флага/env/.env файла
DefaultGrafanaAPIKey = ""
// DefaultGrafanaURL - URL Grafana сервера
// Можно захардкодить для быстрого запуска
DefaultGrafanaURL = ""
// Пример:
// DefaultGrafanaURL = "https://grafana.cirex.ru"
// DefaultGrafanaFolder - папка в Grafana куда будут созданы дашборды
// Пример: "WAF - PTAF" создаст путь: Home -> Dashboards -> WAF - PTAF -> [Dashboard]
// Оставьте пустым для создания в General папке (корень)
DefaultGrafanaFolder = "WAF - Auto Generated"
// Можно переопределить под ваши нужды:
// DefaultGrafanaFolder = "WAF - PTAF"
// Alerts settings
DefaultAlertsFolder = "WAF - PTAF"
DefaultAlertsReceiver = "Telegram PTAF Grafana"
DefaultAlertsGroup = "PTAF Grafana"
DefaultAlertsDatasource = "af84zsvlp9blsa" // UID datasource OpenSearch
// DefaultDashboardTitle - название единого дашборда со всеми клиентами
// Пример результата: Home -> Dashboards -> WAF - PTAF -> PT AF Nodes
DefaultDashboardTitle = "PT AF Nodes"
// Другие примеры названий:
// DefaultDashboardTitle = "WAF Monitoring"
// DefaultDashboardTitle = "All Clients"
// DefaultDashboardTitle = "PTAF Overview"
)
type Config struct {
DBHost string
DBPort int
DBUser string
DBPassword string
DBName string
GrafanaURL string
GrafanaAPIKey string
GrafanaFolder string // Папка в Grafana для дашбордов
DashboardTitle string // Название единого дашборда
DryRun bool
TemplatesRepo string
TemplatesBranch string
TemplatesPath string
SkipGitPull bool
StateFile string
ForceRun bool
GitToken string // GitLab token для приватного репозитория
AlertsFolder string // Папка в Grafana для алертов
AlertsReceiver string // Receiver (канал уведомлений) для алертов
AlertsGroup string // Имя группы алертов в Grafana
AlertsDatasourceUID string // UID datasource для алертов OpenSearch
}
type ClientData struct {
ClientTitle string
Domains []DomainInfo
RPSLimit int // 0 = алерт не создавать (NULL или не задан в БД)
RPSCommercialLimit int // коммерческий лимит, при NULL берётся 100
Limit4xx int // порог 4xx ответов в % (0 = алерт не создавать)
Limit5xx int // порог 5xx ответов в % (0 = алерт не создавать)
}
type DomainInfo struct {
SID string
DomainName string
Aliases string
}
type DashboardTemplate struct {
Version string `json:"version"`
Description string `json:"description"`
Datasource map[string]interface{} `json:"datasource"`
DashboardMeta map[string]interface{} `json:"dashboard_meta"` // uid, tags, version — больше не хардкод в Go
Dashboard map[string]interface{} `json:"dashboard"`
Layout LayoutConfig `json:"layout"`
Conditions map[string]ConditionDefinition `json:"conditions"`
PanelTemplates map[string]interface{} `json:"panel_templates"`
QueryTemplates map[string]interface{} `json:"query_templates"`
Panels map[string]interface{} `json:"panels"`
Queries map[string]interface{} `json:"queries"`
Templating map[string]interface{} `json:"templating"` // Переменные дашборда Grafana
}
type LayoutConfig struct {
TenantPanels []PanelLayout `json:"tenant_panels"`
PreDomainPanels []PanelLayout `json:"pre_domain_panels"` // Панели один раз перед всеми доменными
DomainPanels []PanelLayout `json:"domain_panels"`
InterDomainPanels []PanelLayout `json:"inter_domain_panels"` // Панели один раз между группами доменных
TrafficDomainPanels []PanelLayout `json:"traffic_domain_panels"` // Панели трафика per-domain после inter_domain
UseCollapsedRows bool `json:"use_collapsed_rows"`
OverviewPanels []PanelLayout `json:"overview_panels"` // Панели обзора перед клиентскими строками
OverviewRowTitle string `json:"overview_row_title"` // Заголовок collapsed row обзора
}
type PanelLayout struct {
PanelKey string `json:"panel_key"`
PanelTemplate string `json:"panel_template,omitempty"`
Scope string `json:"scope,omitempty"`
TitleFormat string `json:"title_format,omitempty"`
TitleSuffix string `json:"title_suffix,omitempty"`
Field string `json:"field,omitempty"`
Width int `json:"width"`
XOffset int `json:"x_offset"`
YOffset int `json:"y_offset,omitempty"`
CollapsedRow bool `json:"collapsed_row,omitempty"`
QueryConfig *QueryConfig `json:"query_config,omitempty"`
Condition *PanelCondition `json:"condition"`
}
type QueryConfig struct {
BaseQuery string `json:"base_query"`
Filters []string `json:"filters"`
Metric string `json:"metric"`
Interval string `json:"interval"`
Field string `json:"field,omitempty"`
Extra map[string]interface{} `json:"extra,omitempty"`
}
type PanelCondition struct {
Type string `json:"type"`
Value interface{} `json:"value"`
}
type ConditionDefinition struct {
Description string `json:"description"`
Evaluator string `json:"evaluator"`
}