|
|
@@ -0,0 +1,44 @@
|
|
|
+# Stage 1: Build frontend
|
|
|
+FROM node:18-alpine AS frontend-builder
|
|
|
+WORKDIR /app/frontend
|
|
|
+COPY frontend/package*.json ./
|
|
|
+RUN npm ci
|
|
|
+COPY frontend/ ./
|
|
|
+RUN npm run build
|
|
|
+
|
|
|
+# Stage 2: Build backend
|
|
|
+FROM python:3.11-slim AS backend
|
|
|
+
|
|
|
+WORKDIR /app
|
|
|
+
|
|
|
+# Set timezone to Asia/Shanghai
|
|
|
+ENV TZ=Asia/Shanghai
|
|
|
+RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
|
|
|
+
|
|
|
+# Install system dependencies
|
|
|
+RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
|
+ libpq-dev \
|
|
|
+ && rm -rf /var/lib/apt/lists/*
|
|
|
+
|
|
|
+# Install Python dependencies
|
|
|
+COPY backend/requirements.txt ./
|
|
|
+RUN pip install --no-cache-dir -r requirements.txt
|
|
|
+
|
|
|
+# Copy backend code
|
|
|
+COPY backend/ ./
|
|
|
+
|
|
|
+# Copy frontend build
|
|
|
+COPY --from=frontend-builder /app/frontend/dist ./static
|
|
|
+
|
|
|
+# Environment variables
|
|
|
+ENV FLASK_CONFIG=production
|
|
|
+ENV PYTHONUNBUFFERED=1
|
|
|
+
|
|
|
+# Expose port
|
|
|
+EXPOSE 5000
|
|
|
+
|
|
|
+# Run with gunicorn (production)
|
|
|
+CMD ["gunicorn", "-w", "4", "-b", "0.0.0.0:5000", "wsgi:app"]
|
|
|
+
|
|
|
+# Alternative: Flask dev server (not recommended for production)
|
|
|
+# CMD ["python", "run.py"]
|