diff --git a/Dockerfile b/Dockerfile index 8c776f33..fc5ad676 100644 --- a/Dockerfile +++ b/Dockerfile @@ -28,7 +28,8 @@ RUN pip install --no-cache-dir --upgrade pip && \ COPY . . # Create necessary directories with proper permissions -RUN mkdir -p /app/config /app/database /app/logs /app/downloads /app/Transfer && \ +# NOTE: /app/data is for database FILES, /app/database is the Python package +RUN mkdir -p /app/config /app/data /app/logs /app/downloads /app/Transfer && \ chown -R soulsync:soulsync /app # Create defaults directory and copy template files @@ -39,7 +40,8 @@ RUN mkdir -p /defaults && \ chmod 644 /defaults/config.json /defaults/settings.py # Create volume mount points -VOLUME ["/app/config", "/app/database", "/app/logs", "/app/downloads", "/app/Transfer"] +# NOTE: Changed /app/database to /app/data to avoid overwriting Python package +VOLUME ["/app/config", "/app/data", "/app/logs", "/app/downloads", "/app/Transfer"] # Copy and set up entrypoint script COPY entrypoint.sh /entrypoint.sh @@ -59,6 +61,7 @@ HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \ ENV PYTHONPATH=/app ENV FLASK_APP=web_server.py ENV FLASK_ENV=production +ENV DATABASE_PATH=/app/data/music_library.db ENV PUID=1000 ENV PGID=1000 ENV UMASK=022 diff --git a/config/settings.py b/config/settings.py index 8d9786b4..c37cd439 100644 --- a/config/settings.py +++ b/config/settings.py @@ -10,7 +10,10 @@ class ConfigManager: self.config_path = Path(config_path) self.config_data: Dict[str, Any] = {} self.encryption_key: Optional[bytes] = None - self.database_path = Path("database/music_library.db") # Hardcoded - same as MusicDatabase + # Use DATABASE_PATH env var, fallback to database/music_library.db + import os + db_path = os.environ.get('DATABASE_PATH', 'database/music_library.db') + self.database_path = Path(db_path) self._load_config() def _get_encryption_key(self) -> bytes: @@ -150,7 +153,7 @@ class ConfigManager: "level": "INFO" }, "database": { - "path": "database/music_library.db", + "path": os.environ.get('DATABASE_PATH', 'database/music_library.db'), "max_workers": 5 }, "metadata_enhancement": { diff --git a/database/music_database.py b/database/music_database.py index 4642fb0b..adb11fae 100644 --- a/database/music_database.py +++ b/database/music_database.py @@ -134,7 +134,12 @@ class RecentRelease: class MusicDatabase: """SQLite database manager for SoulSync music library data""" - def __init__(self, database_path: str = "database/music_library.db"): + def __init__(self, database_path: str = None): + import os + # Use env var if path is None OR if it's the default path + # This ensures Docker containers use the correct mounted volume location + if database_path is None or database_path == "database/music_library.db": + database_path = os.environ.get('DATABASE_PATH', 'database/music_library.db') self.database_path = Path(database_path) self.database_path.parent.mkdir(parents=True, exist_ok=True) @@ -3572,10 +3577,21 @@ class MusicDatabase: _database_instances: Dict[int, MusicDatabase] = {} # Thread ID -> Database instance _database_lock = threading.Lock() -def get_database(database_path: str = "database/music_library.db") -> MusicDatabase: - """Get thread-local database instance""" +def get_database(database_path: str = None) -> MusicDatabase: + """Get thread-local database instance + + Args: + database_path: Path to database file. If None or default path, uses DATABASE_PATH env var + or defaults to "database/music_library.db". Custom paths are used as-is. + """ + import os + # Use env var if path is None OR if it's the default path + # This ensures Docker containers use the correct mounted volume location + if database_path is None or database_path == "database/music_library.db": + database_path = os.environ.get('DATABASE_PATH', 'database/music_library.db') + thread_id = threading.get_ident() - + with _database_lock: if thread_id not in _database_instances: _database_instances[thread_id] = MusicDatabase(database_path) diff --git a/entrypoint.sh b/entrypoint.sh index 904bcfc2..e3c985bc 100644 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -37,7 +37,7 @@ if [ "$CURRENT_UID" != "$PUID" ] || [ "$CURRENT_GID" != "$PGID" ]; then # Fix ownership of app directories echo "🔒 Fixing permissions on app directories..." - chown -R soulsync:soulsync /app/config /app/database /app/logs /app/downloads /app/Transfer 2>/dev/null || true + chown -R soulsync:soulsync /app/config /app/data /app/logs /app/downloads /app/Transfer 2>/dev/null || true else echo "✅ User/Group IDs already correct" fi @@ -66,8 +66,8 @@ else fi # Ensure all directories exist and have proper permissions -mkdir -p /app/config /app/database /app/logs /app/downloads /app/Transfer -chown -R soulsync:soulsync /app/config /app/database /app/logs /app/downloads /app/Transfer +mkdir -p /app/config /app/data /app/logs /app/downloads /app/Transfer +chown -R soulsync:soulsync /app/config /app/data /app/logs /app/downloads /app/Transfer echo "✅ Configuration initialized successfully"