diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..da1e347 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,64 @@ +# Multi-stage build for chatsbt application +FROM denoland/deno:alpine AS frontend-builder + +# Set working directory for frontend build +WORKDIR /app/frontend + +# Copy frontend package files +COPY frontend/package.json frontend/deno.lock ./ + +# Install dependencies with script permissions +RUN deno install --allow-scripts + +# Copy frontend source code +COPY frontend/ ./ + +# Build the frontend +RUN deno run build + +# Backend stage +FROM python:3.11-slim AS backend-builder + +# Install uv +COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/ + +# Set working directory +WORKDIR /app + +# Copy Python project files +COPY pyproject.toml uv.lock ./ + +# Install Python dependencies +RUN uv sync --frozen --no-dev + +# Copy backend source code +COPY app.py chatgraph.py controllers.py ./ + +# Final stage +FROM python:3.11-slim + +# Install uv in final stage +COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/ + +# Set working directory +WORKDIR /app + +# Copy backend dependencies and source +#COPY --from=backend-builder /app/.venv ./.venv +COPY --from=backend-builder /app/app.py /app/chatgraph.py /app/controllers.py ./ + +# Copy built frontend +COPY --from=frontend-builder /app/frontend/dist ./frontend/dist + +# Make sure the virtual environment is activated +#ENV PATH="/app/.venv/bin:$PATH" + +# Expose port +EXPOSE 8000 + +# Health check +HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 \ + CMD python -c "import requests; requests.get('http://localhost:8000/health', timeout=10)" + +# Run the application +CMD ["uv", "run", "app.py"]