FROM python:3.11-slim # Install Node.js RUN apt-get update && apt-get install -y \ curl \ gnupg \ ffmpeg \ && curl -fsSL https://deb.nodesource.com/setup_18.x | bash - \ && apt-get install -y nodejs \ && rm -rf /var/lib/apt/lists/* WORKDIR /app # --- Backend Setup --- COPY backend/requirements.txt ./backend/requirements.txt RUN pip install --no-cache-dir -r backend/requirements.txt # --- Frontend Setup --- COPY frontend/package*.json ./frontend/ WORKDIR /app/frontend # Install dependencies (ignoring peer deps conflicts) RUN npm install --legacy-peer-deps COPY frontend/ . # Build Next.js (with ignore-lint already set in next.config.mjs) # We set API URL to http://localhost:8000 because in this container strategy, # the browser will access the backend directly. # Wait, for client-side fetches, "localhost" refers to the user's machine. # If we run this container on port 3000 and 8000, localhost:8000 works internally via Rewrites. # ENV NEXT_PUBLIC_API_URL="http://localhost:8000" Removed to use relative path proxying # Build Next.js ENV NEXTAUTH_URL=http://localhost:3000 # Generate a static secret for now to prevent 500 error, or use a build arg ENV NEXTAUTH_SECRET=changeme_in_production_but_this_fixes_500_error RUN npm run build # --- Final Setup --- WORKDIR /app COPY backend/ ./backend/ # Create a start script # We also implement a "seed data" check. # If the volume mount is empty (missing data.json), we copy from our backup. RUN mkdir -p backend/data_seed && cp -r backend/data/* backend/data_seed/ || true RUN echo '#!/bin/bash\n\ if [ ! -f backend/data/data.json ]; then\n\ echo "Data volume appears empty. Seeding with bundled data..."\n\ cp -r backend/data_seed/* backend/data/\n\ fi\n\ uvicorn backend.main:app --host 0.0.0.0 --port 8000 &\n\ cd frontend && npm start -- -p 3000\n\ ' > start.sh && chmod +x start.sh EXPOSE 3000 8000 CMD ["./start.sh"]