Spaces:
Runtime error
Runtime error
Commit
·
7a71f00
1
Parent(s):
3b8392a
fix: Use HF Spaces persistent /data storage for uploaded files
Browse filesUploaded documents were lost on every Space rebuild because /app/uploads
is ephemeral. Now the config detects if /data is writable (HF Spaces
persistent storage) and stores uploads, outputs, ChromaDB, and templates
there instead. Files survive container rebuilds.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Dockerfile +3 -2
- backend/app/core/config.py +11 -1
Dockerfile
CHANGED
|
@@ -45,8 +45,9 @@ COPY --chown=user backend/ .
|
|
| 45 |
COPY --chown=user --from=frontend_builder /app/out /app/static
|
| 46 |
|
| 47 |
# Create directory structure and set permissions
|
| 48 |
-
|
| 49 |
-
|
|
|
|
| 50 |
|
| 51 |
# Switch to non-root user
|
| 52 |
USER user
|
|
|
|
| 45 |
COPY --chown=user --from=frontend_builder /app/out /app/static
|
| 46 |
|
| 47 |
# Create directory structure and set permissions
|
| 48 |
+
# /app/* is ephemeral fallback; /data/* is HF Spaces persistent storage
|
| 49 |
+
RUN mkdir -p /app/uploads /app/outputs /app/chroma_db /app/templates /data && \
|
| 50 |
+
chmod -R 777 /app/uploads /app/outputs /app/chroma_db /data
|
| 51 |
|
| 52 |
# Switch to non-root user
|
| 53 |
USER user
|
backend/app/core/config.py
CHANGED
|
@@ -49,7 +49,7 @@ class Settings(BaseSettings):
|
|
| 49 |
CHUNK_SIZE: int = 512
|
| 50 |
CHUNK_OVERLAP: int = 50
|
| 51 |
|
| 52 |
-
# Storage paths
|
| 53 |
UPLOAD_DIR: str = "./uploads"
|
| 54 |
OUTPUT_DIR: str = "./outputs"
|
| 55 |
TEMPLATE_DIR: str = "./templates"
|
|
@@ -61,6 +61,16 @@ class Settings(BaseSettings):
|
|
| 61 |
|
| 62 |
settings = Settings()
|
| 63 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 64 |
# Ensure directories exist
|
| 65 |
for dir_path in [settings.UPLOAD_DIR, settings.OUTPUT_DIR, settings.TEMPLATE_DIR, settings.CHROMA_PERSIST_DIR, "./data"]:
|
| 66 |
os.makedirs(dir_path, exist_ok=True)
|
|
|
|
| 49 |
CHUNK_SIZE: int = 512
|
| 50 |
CHUNK_OVERLAP: int = 50
|
| 51 |
|
| 52 |
+
# Storage paths (defaults; overridden below for HF Spaces persistent storage)
|
| 53 |
UPLOAD_DIR: str = "./uploads"
|
| 54 |
OUTPUT_DIR: str = "./outputs"
|
| 55 |
TEMPLATE_DIR: str = "./templates"
|
|
|
|
| 61 |
|
| 62 |
settings = Settings()
|
| 63 |
|
| 64 |
+
# On HF Spaces, use /data for persistent storage so files survive rebuilds.
|
| 65 |
+
# The /data volume is available when "Persistent storage" is enabled in Space settings.
|
| 66 |
+
_persistent_root = "/data"
|
| 67 |
+
if os.path.isdir(_persistent_root) and os.access(_persistent_root, os.W_OK):
|
| 68 |
+
settings.UPLOAD_DIR = os.path.join(_persistent_root, "uploads")
|
| 69 |
+
settings.OUTPUT_DIR = os.path.join(_persistent_root, "outputs")
|
| 70 |
+
settings.TEMPLATE_DIR = os.path.join(_persistent_root, "templates")
|
| 71 |
+
settings.CHROMA_PERSIST_DIR = os.path.join(_persistent_root, "chroma_db")
|
| 72 |
+
settings.COMPETITOR_DB_PATH = os.path.join(_persistent_root, "competitors.json")
|
| 73 |
+
|
| 74 |
# Ensure directories exist
|
| 75 |
for dir_path in [settings.UPLOAD_DIR, settings.OUTPUT_DIR, settings.TEMPLATE_DIR, settings.CHROMA_PERSIST_DIR, "./data"]:
|
| 76 |
os.makedirs(dir_path, exist_ok=True)
|