# 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"]