# --- Stage 1: Build the React Frontend --- FROM node:18-alpine AS frontend-builder WORKDIR /app/frontend COPY frontend/package*.json ./ RUN npm install COPY frontend/ ./ RUN npm run build # --- Stage 2: Create the Unified Service --- FROM python:3.11-slim # Install system dependencies, Nginx, Redis, curl, wget, and clean up RUN apt-get update && apt-get install -y --no-install-recommends \ build-essential \ libpq-dev \ nginx \ redis-server \ wget \ ca-certificates \ libfontconfig1 \ && rm -rf /var/lib/apt/lists/* # Adjust Nginx directories for non-root user 1000 RUN mkdir -p /var/lib/nginx /var/log/nginx \ && chown -R 1000:1000 /var/lib/nginx /var/log/nginx /run /etc/nginx # Install Prometheus WORKDIR /tmp RUN wget https://github.com/prometheus/prometheus/releases/download/v2.45.0/prometheus-2.45.0.linux-amd64.tar.gz \ && tar -xf prometheus-2.45.0.linux-amd64.tar.gz \ && mkdir -p /app/prometheus \ && cp -r prometheus-2.45.0.linux-amd64/prometheus /app/prometheus/ \ && cp -r prometheus-2.45.0.linux-amd64/promtool /app/prometheus/ \ && rm -rf /tmp/* # Install Grafana RUN wget https://dl.grafana.com/oss/release/grafana_10.0.3_amd64.deb \ && dpkg -i grafana_10.0.3_amd64.deb \ && rm grafana_10.0.3_amd64.deb # Copy dependencies WORKDIR /app COPY services/requirements.txt ./services_req.txt COPY control_plane/requirements.txt ./control_plane_req.txt COPY load_generator/requirements.txt ./load_generator_req.txt RUN pip install --no-cache-dir -r services_req.txt \ && pip install --no-cache-dir -r control_plane_req.txt \ && pip install --no-cache-dir -r load_generator_req.txt # Copy source code and configurations COPY services /app/services COPY control_plane /app/control_plane COPY load_generator /app/load_generator COPY prometheus.yml /app/prometheus.yml COPY grafana/provisioning /etc/grafana/provisioning COPY datasource.yml /etc/grafana/provisioning/datasources/datasource.yml # Copy static frontend files built in Stage 1 COPY --from=frontend-builder /app/frontend/dist /app/frontend/dist # Copy customized Nginx config COPY nginx.conf /etc/nginx/nginx.conf # Copy startup script COPY start.sh /app/start.sh RUN chmod +x /app/start.sh # Set environment ENV PYTHONPATH=/app EXPOSE 7860 # CMD to start uvicorn and Nginx CMD ["/app/start.sh"]