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 // VictoriaLogs second dashboard DefaultVLDatasourceUID = "efewdonokxybkf" DefaultVLDashboardTitle = "PT AF Requests (VictoriaLogs)" // Название второго дашборда DefaultVLGrafanaFolder = "" // Пустая = та же папка что и основная DefaultVLDatasourceType = "victoriametrics-logs-datasource-ptaf-sw" // Тип VL datasource плагина DefaultVLDashboardUID = "pt-af-requests-auto-vl" // UID второго дашборда // DefaultDashboardTitle - название единого дашборда со всеми клиентами // Пример результата: Home -> Dashboards -> WAF - PTAF -> PT AF Nodes DefaultDashboardTitle = "PT AF Requests" // Другие примеры названий: // 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 // VictoriaLogs второй дашборд VLDatasourceUID string // UID VictoriaLogs datasource VLDashboardTitle string // Название второго дашборда (пустая строка = не генерировать) VLGrafanaFolder string // Папка для VL дашборда (пустая = та же что и основная) VLDashboardUID string // UID второго дашборда в Grafana } 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"` }