Spaces:
Sleeping
Sleeping
| # Stage 1: Build frontend | |
| FROM node:20-alpine AS frontend-builder | |
| WORKDIR /app/frontend | |
| COPY frontend/package.json frontend/package-lock.json ./ | |
| RUN npm ci | |
| COPY frontend/ ./ | |
| RUN npm run build | |
| # Stage 2: Final image | |
| FROM python:3.10-slim | |
| # Install nginx, supervisor and node runtime for Next.js standalone server | |
| RUN apt-get update && apt-get install -y nginx supervisor nodejs && rm -rf /var/lib/apt/lists/* | |
| WORKDIR /app | |
| # Backend | |
| COPY backend/requirements.txt ./backend/ | |
| RUN pip install --no-cache-dir -r backend/requirements.txt | |
| COPY backend/ ./backend/ | |
| # Frontend from builder | |
| COPY --from=frontend-builder /app/frontend/.next/standalone ./frontend/ | |
| COPY --from=frontend-builder /app/frontend/.next/static ./frontend/.next/static | |
| # Nginx config | |
| COPY nginx.conf /etc/nginx/nginx.conf | |
| # Supervisor config | |
| RUN cat > /etc/supervisor/conf.d/app.conf << 'EOF' | |
| [supervisord] | |
| nodaemon=true | |
| [program:backend] | |
| command=uvicorn backend.main:app --host 127.0.0.1 --port 8000 | |
| directory=/app | |
| autostart=true | |
| autorestart=true | |
| [program:frontend] | |
| command=node frontend/server.js | |
| directory=/app | |
| environment=PORT=3000,HOSTNAME=0.0.0.0 | |
| autostart=true | |
| autorestart=true | |
| [program:nginx] | |
| command=nginx -g "daemon off;" | |
| autostart=true | |
| autorestart=true | |
| EOF | |
| EXPOSE 7860 | |
| CMD ["supervisord", "-c", "/etc/supervisor/supervisord.conf"] |