srmsoumya commited on
Commit
cb3558e
·
1 Parent(s): e98676b

enh: Add HF spaces support with all-in-one Dockerfile

Browse files
Files changed (7) hide show
  1. Dockerfile +38 -10
  2. Dockerfile.compose +20 -0
  3. README.md +8 -3
  4. docker-compose.yml +6 -2
  5. pyproject.toml +3 -0
  6. supervisord.conf +37 -0
  7. uv.lock +4 -0
Dockerfile CHANGED
@@ -1,20 +1,48 @@
 
 
1
  FROM python:3.13-slim
2
 
3
- COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
 
 
 
 
 
4
 
5
- WORKDIR /app
 
 
 
 
 
 
 
6
 
7
- # Install dependencies first (cache layer)
8
- COPY pyproject.toml uv.lock ./
9
  RUN uv sync --frozen --no-install-project --extra demo
10
 
11
  # Copy application code
12
- COPY src/ src/
13
- COPY gazet_demo.py .
14
-
15
- # Install the project itself
16
  RUN uv sync --frozen --extra demo
17
 
18
- ENV PATH="/app/.venv/bin:$PATH"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
 
20
- EXPOSE 8000 8501
 
 
1
+ FROM ghcr.io/ggml-org/llama.cpp:server AS llama
2
+
3
  FROM python:3.13-slim
4
 
5
+ # Install system deps
6
+ RUN apt-get update && apt-get install -y --no-install-recommends \
7
+ curl supervisor && rm -rf /var/lib/apt/lists/*
8
+
9
+ # Copy llama-server binary from official image
10
+ COPY --from=llama /llama-server /usr/local/bin/llama-server
11
 
12
+ # HF Spaces requires UID 1000
13
+ RUN useradd -m -u 1000 user
14
+ USER user
15
+ ENV HOME=/home/user PATH=/home/user/.local/bin:$PATH
16
+ WORKDIR $HOME/app
17
+
18
+ # Install uv
19
+ COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
20
 
21
+ # Install dependencies (cache layer)
22
+ COPY --chown=user pyproject.toml uv.lock ./
23
  RUN uv sync --frozen --no-install-project --extra demo
24
 
25
  # Copy application code
26
+ COPY --chown=user src/ src/
27
+ COPY --chown=user gazet_demo.py .
 
 
28
  RUN uv sync --frozen --extra demo
29
 
30
+ # Download model from HF
31
+ RUN uv run python -c "\
32
+ from huggingface_hub import hf_hub_download; \
33
+ hf_hub_download('developmentseed/gazet-model', 'ckpt-001.gguf', local_dir='models')"
34
+
35
+ # Download geodata from HF (repo structure matches app's expected layout)
36
+ RUN uv run python -c "\
37
+ from huggingface_hub import snapshot_download; \
38
+ snapshot_download('developmentseed/gazet-geodata', repo_type='dataset', local_dir='data')"
39
+
40
+ COPY --chown=user supervisord.conf .
41
+
42
+ ENV GAZET_DATA_DIR=$HOME/app/data \
43
+ LLAMA_SERVER_URL=http://localhost:9000 \
44
+ GAZET_API_URL=http://localhost:8000 \
45
+ PATH="$HOME/app/.venv/bin:$PATH"
46
 
47
+ EXPOSE 7860
48
+ CMD ["supervisord", "-c", "supervisord.conf"]
Dockerfile.compose ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM python:3.13-slim
2
+
3
+ COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
4
+
5
+ WORKDIR /app
6
+
7
+ # Install dependencies first (cache layer)
8
+ COPY pyproject.toml uv.lock ./
9
+ RUN uv sync --frozen --no-install-project --extra demo
10
+
11
+ # Copy application code
12
+ COPY src/ src/
13
+ COPY gazet_demo.py .
14
+
15
+ # Install the project itself
16
+ RUN uv sync --frozen --extra demo
17
+
18
+ ENV PATH="/app/.venv/bin:$PATH"
19
+
20
+ EXPOSE 8000 8501
README.md CHANGED
@@ -1,6 +1,11 @@
1
- <p align="center">
2
- <img width="50%" alt="gazet" src="https://github.com/user-attachments/assets/b56c91e6-271c-4fb4-9878-dee4786fdf12" />
3
- </p>
 
 
 
 
 
4
 
5
  # Gazet
6
 
 
1
+ ---
2
+ title: Gazet
3
+ emoji: "\U0001F5FA"
4
+ colorFrom: green
5
+ colorTo: blue
6
+ sdk: docker
7
+ app_port: 7860
8
+ ---
9
 
10
  # Gazet
11
 
docker-compose.yml CHANGED
@@ -17,7 +17,9 @@ services:
17
  start_period: 30s
18
 
19
  app:
20
- build: .
 
 
21
  volumes:
22
  - ./data:/data:ro
23
  environment:
@@ -31,7 +33,9 @@ services:
31
  condition: service_healthy
32
 
33
  demo:
34
- build: .
 
 
35
  environment:
36
  GAZET_API_URL: http://app:8000
37
  ports:
 
17
  start_period: 30s
18
 
19
  app:
20
+ build:
21
+ context: .
22
+ dockerfile: Dockerfile.compose
23
  volumes:
24
  - ./data:/data:ro
25
  environment:
 
33
  condition: service_healthy
34
 
35
  demo:
36
+ build:
37
+ context: .
38
+ dockerfile: Dockerfile.compose
39
  environment:
40
  GAZET_API_URL: http://app:8000
41
  ports:
pyproject.toml CHANGED
@@ -31,3 +31,6 @@ packages = ["src/gazet", "dataset"]
31
  dataset = [
32
  "modal>=1.4.0",
33
  ]
 
 
 
 
31
  dataset = [
32
  "modal>=1.4.0",
33
  ]
34
+ dev = [
35
+ "huggingface-hub[cli]>=1.5.0",
36
+ ]
supervisord.conf ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [supervisord]
2
+ nodaemon=true
3
+ logfile=/dev/stdout
4
+ logfile_maxbytes=0
5
+ loglevel=info
6
+
7
+ [program:llama-server]
8
+ command=llama-server -m %(ENV_HOME)s/app/models/ckpt-001.gguf --port 9000 --host 0.0.0.0 --ctx-size 2048 -t 2
9
+ autostart=true
10
+ autorestart=true
11
+ stdout_logfile=/dev/stdout
12
+ stdout_logfile_maxbytes=0
13
+ stderr_logfile=/dev/stderr
14
+ stderr_logfile_maxbytes=0
15
+ startsecs=5
16
+
17
+ [program:api]
18
+ command=%(ENV_HOME)s/app/.venv/bin/uvicorn gazet.api:app --host 0.0.0.0 --port 8000
19
+ directory=%(ENV_HOME)s/app
20
+ autostart=true
21
+ autorestart=true
22
+ stdout_logfile=/dev/stdout
23
+ stdout_logfile_maxbytes=0
24
+ stderr_logfile=/dev/stderr
25
+ stderr_logfile_maxbytes=0
26
+ startsecs=10
27
+
28
+ [program:streamlit]
29
+ command=%(ENV_HOME)s/app/.venv/bin/streamlit run gazet_demo.py --server.port 7860 --server.address 0.0.0.0
30
+ directory=%(ENV_HOME)s/app
31
+ autostart=true
32
+ autorestart=true
33
+ stdout_logfile=/dev/stdout
34
+ stdout_logfile_maxbytes=0
35
+ stderr_logfile=/dev/stderr
36
+ stderr_logfile_maxbytes=0
37
+ startsecs=15
uv.lock CHANGED
@@ -440,6 +440,9 @@ dev = [
440
  dataset = [
441
  { name = "modal" },
442
  ]
 
 
 
443
 
444
  [package.metadata]
445
  requires-dist = [
@@ -462,6 +465,7 @@ provides-extras = ["demo", "dev"]
462
 
463
  [package.metadata.requires-dev]
464
  dataset = [{ name = "modal", specifier = ">=1.4.0" }]
 
465
 
466
  [[package]]
467
  name = "geopandas"
 
440
  dataset = [
441
  { name = "modal" },
442
  ]
443
+ dev = [
444
+ { name = "huggingface-hub" },
445
+ ]
446
 
447
  [package.metadata]
448
  requires-dist = [
 
465
 
466
  [package.metadata.requires-dev]
467
  dataset = [{ name = "modal", specifier = ">=1.4.0" }]
468
+ dev = [{ name = "huggingface-hub", extras = ["cli"], specifier = ">=1.5.0" }]
469
 
470
  [[package]]
471
  name = "geopandas"