Fix Issue 9: Enforce configuration precedence rules
- Established explicit precedence: ENV vars > config.json > defaults - Updated fastapi_app.py to only sync config.json when ENV var not set - Added precedence logging to show which source is used - Documented precedence rules with examples in CONFIGURATION.md Key principle: ENV variables always take precedence, config.json is fallback only. This ensures deployment flexibility and clear priority. All config tests passing (26/26)
This commit is contained in:
@@ -137,6 +137,8 @@ async def lifespan(_application: FastAPI):
|
||||
raise # Database is required, fail startup if it fails
|
||||
|
||||
# Load configuration from config.json and sync with settings
|
||||
# Precedence: ENV vars > config.json > defaults
|
||||
# Only sync from config.json if setting is at default value
|
||||
try:
|
||||
from src.server.services.config_service import get_config_service
|
||||
config_service = get_config_service()
|
||||
@@ -147,33 +149,46 @@ async def lifespan(_application: FastAPI):
|
||||
)
|
||||
|
||||
# Sync anime_directory from config.json to settings
|
||||
# config.other is Dict[str, object] - pylint doesn't infer this
|
||||
# Only if not already set via ENV var (i.e., still empty)
|
||||
other_settings = dict(config.other) if config.other else {}
|
||||
if other_settings.get("anime_directory"):
|
||||
anime_dir = other_settings["anime_directory"]
|
||||
settings.anime_directory = str(anime_dir)
|
||||
logger.info(
|
||||
"Loaded anime_directory from config: %s",
|
||||
settings.anime_directory
|
||||
)
|
||||
# Only override if settings.anime_directory is empty (default)
|
||||
if not settings.anime_directory:
|
||||
settings.anime_directory = str(anime_dir)
|
||||
logger.info(
|
||||
"Loaded anime_directory from config.json: %s",
|
||||
settings.anime_directory
|
||||
)
|
||||
else:
|
||||
logger.info(
|
||||
"anime_directory from ENV var takes precedence: %s",
|
||||
settings.anime_directory
|
||||
)
|
||||
else:
|
||||
logger.debug(
|
||||
"anime_directory not found in config.other"
|
||||
)
|
||||
|
||||
# Sync NFO settings from config.json to settings
|
||||
# Only if not already set via ENV var
|
||||
if config.nfo:
|
||||
if config.nfo.tmdb_api_key:
|
||||
# TMDB API key: ENV takes precedence
|
||||
if config.nfo.tmdb_api_key and not settings.tmdb_api_key:
|
||||
settings.tmdb_api_key = config.nfo.tmdb_api_key
|
||||
logger.info("Loaded TMDB API key from config")
|
||||
logger.info("Loaded TMDB API key from config.json")
|
||||
elif settings.tmdb_api_key:
|
||||
logger.info("Using TMDB API key from ENV var")
|
||||
|
||||
# NFO boolean flags: Sync from config.json
|
||||
# (These have proper defaults, so we can sync them)
|
||||
settings.nfo_auto_create = config.nfo.auto_create
|
||||
settings.nfo_update_on_scan = config.nfo.update_on_scan
|
||||
settings.nfo_download_poster = config.nfo.download_poster
|
||||
settings.nfo_download_logo = config.nfo.download_logo
|
||||
settings.nfo_download_fanart = config.nfo.download_fanart
|
||||
settings.nfo_image_size = config.nfo.image_size
|
||||
logger.debug("Synced NFO settings from config")
|
||||
logger.debug("Synced NFO settings from config.json")
|
||||
except (OSError, ValueError, KeyError) as e:
|
||||
logger.warning("Failed to load config from config.json: %s", e)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user