Как управлять конфигурацией приложения в зависимости от окружения (development, staging, production)?

Ответ

Управление конфигурацией в зависимости от окружения — ключевая задача в разработке бэкенда. В Go для этого есть несколько стандартных подходов:

  1. Переменные окружения (Environment Variables) Это самый распространенный и гибкий способ, соответствующий принципам 12-factor app. Приложение читает конфигурацию из переменных окружения при старте.

    • Чтение: Используется пакет os (os.Getenv("VAR_NAME")).
    • Пример:
      dbHost := os.Getenv("DB_HOST")
      if dbHost == "" {
          dbHost = "localhost" // Значение по умолчанию
      }
    • Библиотеки: Для удобной загрузки переменных из .env файлов на этапе разработки часто используют библиотеки, например, github.com/joho/godotenv.
  2. Флаги командной строки (Command-line Flags) Позволяют передавать параметры конфигурации непосредственно при запуске приложения. Удобно для переопределения отдельных значений.

    • Реализация: Используется стандартный пакет flag.
    • Пример:
      port := flag.String("port", "8080", "port to run the server on")
      flag.Parse()
      fmt.Println("Starting server on port:", *port)
  3. Конфигурационные файлы (JSON, YAML, TOML) Подходят для сложных конфигураций. Файл с настройками (например, config.yaml) загружается и парсится при старте приложения.

    • Библиотеки: Для работы с конфигурационными файлами часто используют сторонние библиотеки, которые умеют совмещать несколько источников (файлы, env, флаги). Самая популярная — github.com/spf13/viper.

Рекомендуемый подход:

Использовать комбинацию методов. Основная конфигурация хранится в файлах (например, config.yaml), а чувствительные данные (пароли, токены) и параметры, зависящие от окружения (адрес БД, порт), передаются через переменные окружения. Флаги командной строки используются для временного переопределения настроек при запуске.