Files
pig-farm-controller/internal/infra/config/config.go
2025-11-10 22:23:31 +08:00

263 lines
7.3 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 config 提供配置文件读取和解析功能
// 支持YAML格式的配置文件解析
// 包含服务器和数据库相关配置
package config
import (
"fmt"
"os"
"gopkg.in/yaml.v2"
)
// Config 代表应用的完整配置结构
type Config struct {
// App 应用基础配置
App AppConfig `yaml:"app"`
// Server 服务器配置
Server ServerConfig `yaml:"server"`
// Log 日志配置
Log LogConfig `yaml:"log"`
// Database 数据库配置
Database DatabaseConfig `yaml:"database"`
// WebSocket WebSocket配置
WebSocket WebSocketConfig `yaml:"websocket"`
// Heartbeat 心跳配置
Heartbeat HeartbeatConfig `yaml:"heartbeat"`
// ChirpStack ChirpStack API 配置
ChirpStack ChirpStackConfig `yaml:"chirp_stack"`
// TaskConfig 任务调度配置
Task TaskConfig `yaml:"task"`
// Lora Lora配置
Lora LoraConfig `yaml:"lora"`
// LoraMesh LoraMesh配置
LoraMesh LoraMeshConfig `yaml:"lora_mesh"`
// Notify 通知服务配置
Notify NotifyConfig `yaml:"notify"`
// Collection 定时采集配置
Collection CollectionConfig `yaml:"collection"`
// AlarmNotification 告警通知配置
AlarmNotification AlarmNotificationConfig `yaml:"alarm_notification"`
}
// AppConfig 代表应用基础配置
type AppConfig struct {
Name string `yaml:"name"`
Version string `yaml:"version"`
JWTSecret string `yaml:"jwt_secret"` // JWT 密钥
}
// ServerConfig 代表服务器配置
type ServerConfig struct {
// Port 服务器监听端口
Port int `yaml:"port"`
// Mode 服务器运行模式
Mode string `yaml:"mode"`
}
// LogConfig 代表日志配置
type LogConfig struct {
Level string `yaml:"level"`
Format string `yaml:"format"`
EnableFile bool `yaml:"enable_file"`
FilePath string `yaml:"file_path"`
MaxSize int `yaml:"max_size"`
MaxBackups int `yaml:"max_backups"`
MaxAge int `yaml:"max_age"`
Compress bool `yaml:"compress"`
}
// DatabaseConfig 代表数据库配置
type DatabaseConfig struct {
// Host 数据库主机地址
Host string `yaml:"host"`
// Port 数据库端口
Port int `yaml:"port"`
// Username 数据库用户名
Username string `yaml:"username"`
// Password 数据库密码
Password string `yaml:"password"`
// DBName 数据库名称
DBName string `yaml:"dbname"`
// SSLMode SSL模式
SSLMode string `yaml:"sslmode"`
// IsTimescaleDB is timescaledb
IsTimescaleDB bool `yaml:"is_timescaledb"`
// MaxOpenConns 最大开放连接数
MaxOpenConns int `yaml:"max_open_conns"`
// MaxIdleConns 最大空闲连接数
MaxIdleConns int `yaml:"max_idle_conns"`
// ConnMaxLifetime 连接最大生命周期(秒)
ConnMaxLifetime int `yaml:"conn_max_lifetime"`
}
// WebSocketConfig 代表WebSocket配置
type WebSocketConfig struct {
// Timeout WebSocket请求超时时间(秒)
Timeout int `yaml:"timeout"`
// HeartbeatInterval 心跳检测间隔(秒), 如果超过这个时间没有消息往来系统会自动发送一个心跳包维持长链接
HeartbeatInterval int `yaml:"heartbeat_interval"`
}
// HeartbeatConfig 代表心跳配置
type HeartbeatConfig struct {
// Interval 心跳间隔(秒)
Interval int `yaml:"interval"`
// Concurrency 请求并发数
Concurrency int `yaml:"concurrency"`
}
// ChirpStackConfig 代表 ChirpStack API 配置
type ChirpStackConfig struct {
APIHost string `yaml:"api_host"`
APIToken string `yaml:"api_token"`
FPort int `yaml:"fport"`
APITimeout int `yaml:"api_timeout"`
CollectionRequestTimeout int `yaml:"collection_request_timeout"`
}
// TaskConfig 代表任务调度配置
type TaskConfig struct {
Interval int `yaml:"interval"`
NumWorkers int `yaml:"num_workers"`
}
type LoraMode string
const (
LoraMode_LoRaWAN LoraMode = "lora_wan"
LoraMode_LoRaMesh LoraMode = "lora_mesh"
)
// LoraConfig 代表Lora配置
type LoraConfig struct {
Mode LoraMode `yaml:"mode"`
}
// LoraMeshConfig 代表Lora Mesh配置
type LoraMeshConfig struct {
UARTPort string `yaml:"uart_port"`
BaudRate int `yaml:"baud_rate"`
Timeout int `yaml:"timeout"`
LoraMeshMode string `yaml:"lora_mesh_mode"`
MaxChunkSize int `yaml:"max_chunk_size"`
ReassemblyTimeout int `yaml:"reassembly_timeout"`
}
// NotifyConfig 包含了所有与通知服务相关的配置
type NotifyConfig struct {
Primary string `yaml:"primary"` // 首选通知渠道 (e.g., "邮件", "企业微信", "飞书", "日志")
FailureThreshold int `yaml:"failureThreshold"` // 连续失败多少次后触发广播模式
SMTP SMTPConfig `yaml:"smtp"`
WeChat WeChatConfig `yaml:"wechat"`
Lark LarkConfig `yaml:"lark"`
}
// SMTPConfig SMTP邮件配置
type SMTPConfig struct {
Enabled bool `yaml:"enabled"`
Host string `yaml:"host"`
Port int `yaml:"port"`
Username string `yaml:"username"`
Password string `yaml:"password"`
Sender string `yaml:"sender"`
}
// WeChatConfig 企业微信应用配置
type WeChatConfig struct {
Enabled bool `yaml:"enabled"`
CorpID string `yaml:"corpID"`
AgentID string `yaml:"agentID"`
Secret string `yaml:"secret"`
}
// LarkConfig 飞书应用配置
type LarkConfig struct {
Enabled bool `yaml:"enabled"`
AppID string `yaml:"appID"`
AppSecret string `yaml:"appSecret"`
}
// CollectionConfig 代表定时采集配置
type CollectionConfig struct {
// Interval 采集间隔(分钟), 默认 1
Interval int `yaml:"interval"`
}
type NotificationIntervalsConfig struct {
// DebugIntervalMinutes Debug级别告警的通知间隔分钟
DebugIntervalMinutes uint32 `yaml:"debug"`
// InfoIntervalMinutes Info级别告警的通知间隔分钟
InfoIntervalMinutes uint32 `yaml:"info"`
// WarnIntervalMinutes Warn级别告警的通知间隔分钟
WarnIntervalMinutes uint32 `yaml:"warn"`
// ErrorIntervalMinutes Error级别告警的通知间隔分钟
ErrorIntervalMinutes uint32 `yaml:"error"`
// DPanicIntervalMinutes DPanic级别告警的通知间隔分钟
DPanicIntervalMinutes uint32 `yaml:"dpanic"`
// PanicIntervalMinutes Panic级别告警的通知间隔分钟
PanicIntervalMinutes uint32 `yaml:"panic"`
// FatalIntervalMinutes Fatal级别告警的通知间隔分钟
FatalIntervalMinutes uint32 `yaml:"fatal"`
}
// AlarmNotificationConfig 告警通知配置
type AlarmNotificationConfig struct {
// NotificationIntervals 告警通知的发送间隔时间,键为告警等级,值为时间间隔(秒)
NotificationIntervals NotificationIntervalsConfig `yaml:"notification_intervals"`
}
// NewConfig 创建并返回一个新的配置实例
func NewConfig() *Config {
// 默认值可以在这里设置,但我们优先使用配置文件中的值
return &Config{
Collection: CollectionConfig{
Interval: 1, // 默认为1分钟
},
}
}
// Load 从指定路径加载配置文件
func (c *Config) Load(path string) error {
// 读取配置文件
data, err := os.ReadFile(path)
if err != nil {
return fmt.Errorf("配置文件读取失败: %v", err)
}
// 解析YAML配置
if err := yaml.Unmarshal(data, c); err != nil {
return fmt.Errorf("配置文件解析失败: %v", err)
}
return nil
}
// GenerateAPIKey 用于补齐API Key作为请求头时缺失的部分
func (c ChirpStackConfig) GenerateAPIKey() string {
return "Bearer " + c.APIToken
}