aspara / Dockerfile
github-actions[bot]
Deploy to HF Spaces
1b50562
# ==============================================================================
# Aspara Demo - Hugging Face Spaces
# Multi-stage build: frontend (Node.js) + backend (Python/FastAPI)
# ==============================================================================
# ------------------------------------------------------------------------------
# Stage 1: Frontend build (JS + CSS + icons)
# ------------------------------------------------------------------------------
FROM node:22-slim AS frontend-builder
WORKDIR /app
# Enable pnpm via corepack
RUN corepack enable && corepack prepare pnpm@10.6.3 --activate
# Install JS dependencies (cache layer)
COPY package.json pnpm-lock.yaml ./
RUN pnpm install --frozen-lockfile
# Copy source and build frontend assets
COPY vite.config.js icons.config.json ./
COPY scripts/ ./scripts/
COPY src/aspara/dashboard/ ./src/aspara/dashboard/
RUN pnpm run build:icons && pnpm run build:js && pnpm run build:css
# ------------------------------------------------------------------------------
# Stage 2: Python runtime + sample data generation
# ------------------------------------------------------------------------------
FROM python:3.12-slim
WORKDIR /app
# Install uv
COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv
# Copy Python project files
COPY pyproject.toml uv.lock ./
COPY space_README.md ./README.md
COPY src/ ./src/
# Install Python dependencies (dashboard extra only, no dev deps)
RUN uv sync --frozen --extra dashboard --no-dev
# Overwrite with built frontend assets
COPY --from=frontend-builder /app/src/aspara/dashboard/static/dist/ ./src/aspara/dashboard/static/dist/
# Generate sample data during build
COPY examples/generate_random_runs.py ./examples/
ENV ASPARA_DATA_DIR=/data/aspara
ENV ASPARA_ALLOW_IFRAME=1
ENV ASPARA_READ_ONLY=1
RUN mkdir -p /data/aspara && uv run python examples/generate_random_runs.py
# Create non-root user (HF Spaces best practice)
RUN useradd -m -u 1000 user && \
chown -R user:user /data /app
USER user
# HF Spaces uses port 7860
EXPOSE 7860
# Start dashboard only (no tracker = no external write API)
CMD ["uv", "run", "aspara", "serve", "--host", "0.0.0.0", "--port", "7860", "--data-dir", "/data/aspara"]