Deep Chavda commited on
Commit
94961c3
Β·
1 Parent(s): 4ccde7a

chore: migrate deployment to Hugging Face Spaces

Browse files

- Rewrite Dockerfile: uv-based build, appuser uid 1000, port 7860
- Update PORT default to 7860 across config.py and development.yml
- Remove railway.json (replaced by Dockerfile + HF Spaces)

Files changed (6) hide show
  1. Dockerfile +37 -0
  2. app/core/config.py +1 -1
  3. app/server.py +1 -1
  4. development.yml +3 -2
  5. main.py +1 -1
  6. railway.json +0 -13
Dockerfile ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Hugging Face Spaces β€” Docker SDK
2
+ # Docs: https://huggingface.co/docs/hub/spaces-sdks-docker
3
+
4
+ FROM python:3.12-slim
5
+
6
+ # ── HF Spaces: non-root user with uid 1000 ────────────────────────────────────
7
+ RUN useradd -m -u 1000 appuser
8
+
9
+ # ── Install uv ────────────────────────────────────────────────────────────────
10
+ COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /usr/local/bin/
11
+
12
+ # ── Working directory ─────────────────────────────────────────────────────────
13
+ WORKDIR /app
14
+
15
+ # ── Copy dependency manifests first (layer-cache friendly) ───────────────────
16
+ COPY pyproject.toml uv.lock ./
17
+
18
+ # ── Install dependencies ──────────────────────────────────────────────────────
19
+ RUN uv sync --frozen --no-install-project --no-dev
20
+
21
+ # ── Copy source ───────────────────────────────────────────────────────────────
22
+ COPY app/ ./app/
23
+ COPY main.py development.yml ./
24
+
25
+ # ── Fix ownership then drop privileges ────────────────────────────────────────
26
+ RUN chown -R appuser:appuser /app
27
+ USER appuser
28
+
29
+ ENV HOME=/home/appuser \
30
+ PATH=/home/appuser/.local/bin:$PATH \
31
+ PYTHONUNBUFFERED=1 \
32
+ PYTHONDONTWRITEBYTECODE=1
33
+
34
+ # ── HF Spaces requires port 7860 ──────────────────────────────────────────────
35
+ EXPOSE 7860
36
+
37
+ CMD ["uv", "run", "main.py"]
app/core/config.py CHANGED
@@ -51,7 +51,7 @@ class Settings(BaseSettings):
51
  # ── Server (development.yml) ───────────────────────────────────────────────
52
  APP_NAME: str = "Markdown & Layout Extractor"
53
  HOST: str = "127.0.0.1"
54
- PORT: int = 8000
55
  LOG_LEVEL: str = "INFO"
56
 
57
  # ── CORS (development.yml) ─────────────────────────────────────────────────
 
51
  # ── Server (development.yml) ───────────────────────────────────────────────
52
  APP_NAME: str = "Markdown & Layout Extractor"
53
  HOST: str = "127.0.0.1"
54
+ PORT: int = 7860 # HF Spaces requires 7860; development.yml / env var can override
55
  LOG_LEVEL: str = "INFO"
56
 
57
  # ── CORS (development.yml) ─────────────────────────────────────────────────
app/server.py CHANGED
@@ -48,5 +48,5 @@ def create_app():
48
  allow_methods=settings.CORS_ALLOW_METHODS,
49
  allow_headers=settings.CORS_ALLOW_HEADERS,
50
  )
51
-
52
  return app
 
48
  allow_methods=settings.CORS_ALLOW_METHODS,
49
  allow_headers=settings.CORS_ALLOW_HEADERS,
50
  )
51
+
52
  return app
development.yml CHANGED
@@ -3,10 +3,11 @@ MISTRAL_OCR_MODEL: mistral-ocr-latest
3
  MISTRAL_TABLE_FORMAT: markdown
4
 
5
  # ─── Server ────────────────────────────────────────────────────────────────────
6
- # Local defaults β€” Railway overrides HOST and PORT via its Variables tab.
 
7
  APP_NAME: "Markdown & Layout Extractor"
8
  HOST: "127.0.0.1"
9
- PORT: 8000
10
  LOG_LEVEL: INFO
11
 
12
  # ─── CORS ──────────────────────────────────────────────────────────────────────
 
3
  MISTRAL_TABLE_FORMAT: markdown
4
 
5
  # ─── Server ────────────────────────────────────────────────────────────────────
6
+ # Local defaults β€” HF Spaces overrides HOST (0.0.0.0) via Space secrets.
7
+ # PORT must be 7860 for HF Spaces to detect and route the container.
8
  APP_NAME: "Markdown & Layout Extractor"
9
  HOST: "127.0.0.1"
10
+ PORT: 7860
11
  LOG_LEVEL: INFO
12
 
13
  # ─── CORS ──────────────────────────────────────────────────────────────────────
main.py CHANGED
@@ -12,7 +12,7 @@ if __name__ == "__main__":
12
  host=settings.HOST,
13
  port=settings.PORT,
14
  log_level=settings.LOG_LEVEL.lower(),
15
- # Trust X-Forwarded-* headers from Railway's edge proxy.
16
  proxy_headers=True,
17
  forwarded_allow_ips="*",
18
  )
 
12
  host=settings.HOST,
13
  port=settings.PORT,
14
  log_level=settings.LOG_LEVEL.lower(),
15
+ # Trust X-Forwarded-* headers from HF Spaces / any reverse proxy.
16
  proxy_headers=True,
17
  forwarded_allow_ips="*",
18
  )
railway.json DELETED
@@ -1,13 +0,0 @@
1
- {
2
- "$schema": "https://railway.com/railway.schema.json",
3
- "build": {
4
- "builder": "NIXPACKS"
5
- },
6
- "deploy": {
7
- "startCommand": "uv run main.py",
8
- "healthcheckPath": "/health",
9
- "healthcheckTimeout": 30,
10
- "restartPolicyType": "ON_FAILURE",
11
- "restartPolicyMaxRetries": 3
12
- }
13
- }