Конфигурация и переменные окружения
Relevant source files
The following files were used as context for generating this wiki page:
Introduction
Система конфигурации в проекте Music Service спроектирована для обеспечения гибкости и безопасности при развертывании в различных средах (development, production). Она объединяет управление параметрами инфраструктуры, такими как базы данных PostgreSQL и Redis, с бизнес-логикой лимитов для пользователей и настройками безопасности JWT.
Основным механизмом настройки является использование переменных окружения, которые считываются при запуске приложения и инкапсулируются в централизованную структуру данных. Это позволяет разделять код и настройки, следуя принципам Twelve-Factor App.
Sources: internal/core/config/config.go, README.md:34-52
Структура конфигурации
Конфигурация приложения представлена структурой Config в пакете internal/core/config. Пакет предоставляет функцию Load(), которая инициализирует параметры, используя значения из ОС или предопределенные значения по умолчанию.
Основные группы параметров
- Инфраструктура: Хосты, порты и учетные данные для PostgreSQL и Redis.
- Безопасность: Секретные ключи и время жизни (TTL) для Access и Refresh токенов JWT.
- Бизнес-ограничения: Лимиты на прослушивание треков и создание плейлистов для пользователей с бесплатным типом подписки (FREE).
Sources: internal/core/config/config.go:10-29, cmd/app/main.go:51-52
Сводная таблица переменных окружения
| Переменная | По умолчанию | Тип | Описание |
|---|---|---|---|
APP_PORT | 8080 | String | Порт, на котором запускается HTTP-сервер. |
ENV | development | String | Режим работы приложения (development, production). |
DATABASE_URL | — | String | Полная строка подключения к БД (приоритет над DB_HOST). |
DB_HOST | localhost | String | Адрес сервера PostgreSQL. |
DB_PORT | 5432 | String | Порт PostgreSQL. |
DB_USER | music_user | String | Имя пользователя базы данных. |
DB_PASSWORD | music_password | String | Пароль пользователя базы данных. |
DB_NAME | music_service | String | Имя базы данных. |
DB_SSLMODE | disable | String | Режим SSL для подключения к БД. |
REDIS_HOST | localhost | String | Адрес сервера Redis. |
REDIS_PORT | 6379 | String | Порт Redis. |
JWT_ACCESS_SECRET | super_access... | String | Секрет для подписи Access Token. |
JWT_REFRESH_SECRET | super_refresh... | String | Секрет для подписи Refresh Token. |
JWT_ACCESS_TTL | 15m | Duration | Время жизни Access токена. |
JWT_REFRESH_TTL | 720h | Duration | Время жизни Refresh токена (30 дней). |
FREE_DAILY_PLAY_LIMIT | 10 | Int | Дневной лимит прослушиваний для FREE. |
FREE_PLAYLIST_LIMIT | 3 | Int | Лимит плейлистов для FREE. |
Sources: internal/core/config/config.go:31-52, README.md:34-52
Инициализация и использование
Загрузка конфигурации происходит в точке входа main.go. После загрузки параметры распределяются по зависимостям через Dependency Injection.
Схема инициализации сервисов
Визуализация процесса распределения конфигурационных данных в системе при старте.
Sources: cmd/app/main.go:51-110
Среды выполнения
Локальная разработка и Docker
Для локальной разработки используется файл .env, который загружается через docker-compose.yml. В контейнере app переменные DB_HOST и REDIS_HOST переопределяются для использования имен сервисов внутри сети Docker.
services:
app:
environment:
- DB_HOST=postgres
- REDIS_HOST=redis
Sources: docker-compose.yml:11-13, README.md:19-21
Fly.io (Production)
В среде Fly.io конфигурация управляется через секреты (flyctl secrets set) и файл fly.toml. Переменная DATABASE_URL используется для автоматической настройки подключения к управляемой базе данных.
Sources: fly.toml:1-10, README.md:129-138
Безопасность и Middleware
Переменная JWT_ACCESS_SECRET критически важна для работы AuthMiddleware. Она используется для валидации входящих токенов в каждом защищенном запросе.
// internal/core/middleware/middleware.go:121
token, err := jwt.ParseWithClaims(tokenStr, claims, func(token *jwt.Token) (interface{}, error) {
return []byte(secret), nil
})
Если формат токена не совпадает или секрет неверный, Middleware блокирует запрос с ошибкой 401 Unauthorized.
Sources: internal/core/middleware/middleware.go:103-130, cmd/app/main.go:153
Заключение
Конфигурация проекта Music Service является строго типизированной и поддерживает расширение через переменные окружения. Использование значений по умолчанию обеспечивает быстрый старт в режиме разработки, в то время как возможность переопределения через секреты позволяет безопасно развертывать приложение в облачных средах. Ключевые параметры, такие как секреты JWT и лимиты бизнес-логики, централизованы, что упрощает масштабирование и изменение политики сервиса.