diff --git a/backend/config_loader.py b/backend/config_loader.py index 4e5fcfa7..c8e461a0 100644 --- a/backend/config_loader.py +++ b/backend/config_loader.py @@ -28,7 +28,7 @@ def load_config(): load_dotenv(backend_env_path) log.info(f"ℹ️ Loaded local configuration from {backend_env_path}") else: - log.warning("⚠️ No .env config files found. Relying on system environment variables.") + log.info("ℹ️ [CONFIG] Using system environment variables (Docker/Server environment).") # Auto-run if imported load_config() diff --git a/backend/entrypoint.sh b/backend/entrypoint.sh index be54f58c..307fe9fe 100755 --- a/backend/entrypoint.sh +++ b/backend/entrypoint.sh @@ -26,6 +26,12 @@ bash /app/scripts/init_data.sh # Fix permissions for mounted volumes (which might be root-owned by the host) echo "🐳 [Docker] Fixing volume permissions..." chown -R appuser:appuser "${DATA_DIR}" "${LOGS_DIR}" +chmod -R 770 "${DATA_DIR}" "${LOGS_DIR}" + +# Verify logic: Ensure appuser can actually write before we hand off +echo "🐳 [Docker] Verifying directory writability..." +gosu appuser touch "${LOGS_DIR}/.startup_test" && rm "${LOGS_DIR}/.startup_test" +gosu appuser touch "${DATA_DIR}/.startup_test" && rm "${DATA_DIR}/.startup_test" # Hand off to the application server as non-root user echo "🐳 [Docker] Starting uvicorn as appuser..." diff --git a/backend/logger.py b/backend/logger.py index 9866a5c4..981311da 100644 --- a/backend/logger.py +++ b/backend/logger.py @@ -27,26 +27,25 @@ def setup_logger(): datefmt="%Y-%m-%d %H:%M:%S" ) - # Console Handler + # File Handler (10MB max, keep 5 backups) + try: + file_handler = RotatingFileHandler( + LOG_FILE_PATH, maxBytes=10*1024*1024, backupCount=5 + ) + file_handler.setFormatter(formatter) + logger.addHandler(file_handler) + + # Special redirect for uvicorn logs to also go to file + logging.getLogger("uvicorn").addHandler(file_handler) + logging.getLogger("uvicorn.access").addHandler(file_handler) + except (PermissionError, IOError) as e: + logger.warning(f"⚠️ [LOGGING] Cannot write to log file at {LOG_FILE_PATH}: {e}") + logger.warning("⚠️ [LOGGING] Continuing with console-only output.") + + # Console Handler (always registered) console_handler = logging.StreamHandler() console_handler.setFormatter(formatter) - - # File Handler (10MB max, keep 5 backups) - file_handler = RotatingFileHandler( - LOG_FILE_PATH, maxBytes=10*1024*1024, backupCount=5 - ) - file_handler.setFormatter(formatter) - - # Attach handlers logger.addHandler(console_handler) - logger.addHandler(file_handler) - - # Special redirect for uvicorn logs to also go to file - uvicorn_logger = logging.getLogger("uvicorn") - uvicorn_logger.addHandler(file_handler) - - uvicorn_access_logger = logging.getLogger("uvicorn.access") - uvicorn_access_logger.addHandler(file_handler) return logger diff --git a/frontend/VERSION.json b/frontend/VERSION.json index 6adf9670..3e5e877e 100644 --- a/frontend/VERSION.json +++ b/frontend/VERSION.json @@ -1,6 +1,6 @@ { - "version": "1.10.1", - "last_build": "2026-04-15-1741", + "version": "1.10.2", + "last_build": "2026-04-15-1754", "codename": "ModularAdmin", - "commit": "062df8cf" + "commit": "d9e592cc" } \ No newline at end of file