Spaces:
Running
Running
# Multi-stage build for combined frontend + backend | |
FROM node:18-alpine AS frontend-builder | |
WORKDIR /app | |
# Copy package files | |
COPY web/package*.json ./ | |
# Install dependencies | |
RUN npm ci | |
# Copy frontend code and build | |
COPY web/ ./ | |
# Clean up unnecessary files | |
RUN rm -rf api/ || true | |
RUN rm -rf storage/ || true | |
RUN rm -rf .git/ || true | |
RUN rm -rf .next/ || true | |
RUN rm -rf .local/ || true | |
# Build frontend | |
RUN npm run build | |
# Backend stage | |
FROM python:3.11-slim | |
# Install system dependencies | |
RUN apt-get update && apt-get install -y \ | |
nginx \ | |
supervisor \ | |
curl \ | |
&& rm -rf /var/lib/apt/lists/* | |
# Install Node.js for combined container | |
RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash - && \ | |
apt-get install -y nodejs | |
WORKDIR /app | |
# Copy pyproject.toml and poetry.lock | |
COPY pyproject.toml poetry.lock ./ | |
# Install Poetry and basic dependencies (skip heavy ML packages for testing) | |
RUN pip install --no-cache-dir --upgrade pip \ | |
&& pip install --no-cache-dir poetry \ | |
&& poetry config virtualenvs.create false \ | |
&& poetry install --only=main --no-root || pip install fastapi uvicorn python-dotenv pydantic | |
# Copy starfish source code and README (needed by backend) | |
COPY src/ ./src/ | |
COPY README.md ./ | |
# Copy built frontend from previous stage | |
COPY --from=frontend-builder /app/.next ./web/.next | |
COPY --from=frontend-builder /app/public ./web/public | |
COPY --from=frontend-builder /app/package.json ./web/package.json | |
#COPY --from=frontend-builder /app/node_modules ./web/node_modules | |
# Copy backend API code | |
COPY web/api/ ./web/api/ | |
# Copy configuration files | |
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf | |
COPY nginx.conf /etc/nginx/nginx.conf | |
# Create necessary directories and set permissions | |
RUN mkdir -p /var/log/supervisor /var/log/nginx /var/run \ | |
&& chmod +x /app/src/ || true | |
# Expose port 7860 (required for Hugging Face Spaces) | |
EXPOSE 7860 | |
# Health check | |
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \ | |
CMD curl -f http://localhost:7860/health || exit 1 | |
# Start supervisor which manages both nginx and the applications | |
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"] |