jackmichael Claude Opus 4.5 commited on
Commit
7a71f00
·
1 Parent(s): 3b8392a

fix: Use HF Spaces persistent /data storage for uploaded files

Browse files

Uploaded 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>

Files changed (2) hide show
  1. Dockerfile +3 -2
  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
- RUN mkdir -p /app/uploads /app/outputs /app/chroma_db /app/templates && \
49
- chmod -R 777 /app/uploads /app/outputs /app/chroma_db
 
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)