Руководство по конфигурации Saga¶
Архитектура UnifiedConfig¶
Основные компоненты¶
backend/config/
├── unified_config.go # Структура конфигурации с множественными секциями
├── unified_config_interface.go # ConfigInterface с 280+ методами доступа
├── unified_config_loader.go # Система загрузки из разных источников
└── unified_config_test.go # Comprehensive тесты
Процесс загрузки¶
// Загрузка конфигурации в приложении
cfg, err := config.LoadUnifiedConfig()
if err != nil {
return fmt.Errorf("ошибка загрузки конфигурации: %w", err)
}
Система автоматически:
- Устанавливает значения по умолчанию
- Загружает и переопределяет из
config.yaml(если существует) - Переопределяет переменными окружения (если установлены)
- Валидирует критические параметры
Расположение конфигурационных файлов¶
config.yaml¶
- Основной файл:
/config.yaml(корень проекта)
Переменные окружения¶
Поддерживаются все параметры с префиксом соответствующих секций:
- JWT_SECRET → auth.jwt_secret
- DB_HOST → database.host
Критические параметры¶
JWT Secret¶
Environment variable:
export JWT_SECRET="dev-saga-jwt-secret-key-2025-for-local-development-only-do-not-use-in-production"
config.yaml:
auth:
jwt_secret: "dev-saga-jwt-secret-key-2025-for-local-development-only-do-not-use-in-production"
jwt_expiration_hours: 24
База данных¶
Environment variables:
export DB_HOST="127.0.0.1"
export DB_PORT="5432"
export DB_USER="aisee"
export DB_PASSWORD="aisee"
export DB_NAME="saga"
config.yaml:
database:
host: "127.0.0.1"
port: 5432
user: "aisee"
password: "aisee"
dbname: "saga"
ssl_mode: "disable"
Добавление новых параметров¶
При добавлении нового параметра:
- Добавьте поле в структуру
UnifiedConfigвunified_config.go - Добавьте значение по умолчанию в функцию
setDefaults()вunified_config_loader.go - Добавьте getter-метод в интерфейс
ConfigInterface - Добавьте тег
envдля поддержки переменных окружения - Добавьте параметр в config.yaml с описанием
- Напишите тест в
unified_config_test.go
Пример добавления нового параметра:
Использование в коде¶
Правильное использование¶
import "github.com/saga/backend/config"
// Загрузка конфигурации
cfg, err := config.LoadUnifiedConfig()
if err != nil {
return fmt.Errorf("ошибка загрузки конфигурации: %w", err)
}
// Доступ к параметрам через интерфейс
apiBaseURL := cfg.GetAPIBaseURL()
jwtSecret := cfg.GetJWTSecret()
dbDSN := cfg.GetDatabaseDSN()
// Проверка окружения
if cfg.IsProduction() {
// Production логика
}
// Работа с сетями
network, err := cfg.GetNetworkConfig("localhost")
if err != nil {
return fmt.Errorf("сеть не найдена: %w", err)
}
Неправильное использование¶
// НЕ ИСПОЛЬЗУЙТЕ прямые вызовы os.Getenv в production коде!
jwtSecret := os.Getenv("JWT_SECRET") // ❌ ПЛОХО
// Используйте унифицированную систему:
jwtSecret := cfg.GetJWTSecret() // ✅ ХОРОШО
Структура config.yaml¶
Полный пример конфигурации¶
# Основные настройки приложения
application:
environment: development # development, staging, production
version: "1.8.55"
debug: true
data_dir: ./data
# Настройки HTTP сервера
server:
host: 0.0.0.0
port: 8080
read_timeout: 30s
write_timeout: 30s
# Настройки базы данных
database:
host: "127.0.0.1"
port: 5432
user: "aisee"
password: "aisee"
dbname: "saga"
ssl_mode: "disable"
max_open_connections: 25
max_idle_connections: 5
# Настройки аутентификации
auth:
jwt_secret: "dev-saga-jwt-secret-key-2025-for-local-development-only-do-not-use-in-production"
jwt_expiration_hours: 24
allow_wallet_auth: true
admin_permissions_enabled: true
# Настройки внешних интеграций
integrations:
crypto2b:
# API credentials through environment variables
# CRYPTO2B_PUBLIC_KEY and CRYPTO2B_PRIVATE_KEY in .env
enabled: true
fordefi:
# API credentials through environment variables
# FORDEFI_API_KEY in .env
enabled: true
# Настройки уведомлений
notifications:
email:
enabled: false
smtp_host: ""
smtp_port: 587
push:
enabled: false
# Настройки логирования
logging:
level: info
format: json
output: stdout
Отладка конфигурации¶
Проверка загруженных значений¶
# Проверить основной config.yaml
# Проверить переменные окружения
env | grep -E "(JWT_|DB_)"
# Проверить что система запускается
make build-container
Валидация конфигурации¶
Система автоматически валидирует: - JWT секреты (минимум 32 символа) - Порты (диапазон 1-65535) - Email адреса (если включены уведомления) - Сетевые настройки блокчейна
🆘 Решение проблем¶
"Config file not found"¶
# Создайте config.yaml из примера
cp config.example.yaml config.yaml
# или
touch config.yaml # Система будет использовать defaults
"JWT secret is too short"¶
JWT secret должен быть минимум 32 символа:
export JWT_SECRET="dev-saga-jwt-secret-key-2025-for-local-development-only-do-not-use-in-production"
"Database connection failed"¶
Проверьте настройки БД:
# Через переменные окружения
export DB_HOST="127.0.0.1"
export DB_USER="aisee"
export DB_PASSWORD="aisee"
# Или в config.yaml
Безопасность¶
Development окружение¶
В development можно хранить секреты в config.yaml для удобства.
Production окружение¶
Обязательно используйте переменные окружения для секретов:
Системы управления секретами¶
Для production рекомендуется: - HashiCorp Vault - Kubernetes Secrets - AWS Secrets Manager - Azure Key Vault
Проверочный чек-лист¶
- config.yaml создан и настроен
- Критические переменные окружения установлены
- JWT secret минимум 32 символа
- База данных доступна
- Все обращения к конфигурации через
cfg.GetXXX()методы - Нет хардкода параметров в исходном коде
⚠️ Важно: Гибкая система конфигурации позволяет легко переключаться между окружениями и обеспечивает максимальную безопасность в production.
Важно: для подключения к PostgreSQL устанавливайте DB_HOST=127.0.0.1 (а не localhost),
чтобы использовать TCP и избежать попыток подключения через Unix socket /var/run/postgresql.