Consolidated FE hosting to FastAPI for now
Browse files- Dockerfile +4 -19
- Dockerfile.test +6 -9
- backend/app/main.py +24 -4
- run_local.sh +1 -0
- start.sh +0 -12
Dockerfile
CHANGED
|
@@ -11,32 +11,17 @@ RUN npm run build
|
|
| 11 |
# Use Python image with uv pre-installed and nginx
|
| 12 |
FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim
|
| 13 |
|
| 14 |
-
RUN apt-get update && apt-get install -y nginx
|
| 15 |
-
|
| 16 |
WORKDIR /app
|
| 17 |
|
| 18 |
-
|
| 19 |
# Install backend dependencies and make pytest available
|
| 20 |
COPY backend/ backend/
|
| 21 |
COPY pyproject.toml .
|
| 22 |
RUN uv sync && uv pip install .
|
| 23 |
-
ENV PATH="/root/.local/bin:/root/.uv/venv/bin:${PATH}"
|
| 24 |
-
|
| 25 |
-
# Set up frontend
|
| 26 |
-
COPY --from=frontend-builder /app/frontend/build /usr/share/nginx/html
|
| 27 |
-
COPY frontend/nginx.conf /etc/nginx/conf.d/default.conf
|
| 28 |
-
|
| 29 |
-
# Add uv's bin directory to PATH
|
| 30 |
ENV PATH="/app/.venv/bin:/root/.local/bin:/root/.uv/venv/bin:${PATH}"
|
| 31 |
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
# Set up nginx confgi
|
| 35 |
-
RUN mkdir -p /var/lib/nginx/body /var/cache/nginx
|
| 36 |
-
RUN chmod -R 777 /var/lib/nginx /var/cache/nginx
|
| 37 |
-
RUN chmod -R 755 /app/.venv
|
| 38 |
|
| 39 |
-
|
| 40 |
-
RUN chmod +x /start.sh
|
| 41 |
|
| 42 |
-
CMD ["
|
|
|
|
| 11 |
# Use Python image with uv pre-installed and nginx
|
| 12 |
FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim
|
| 13 |
|
|
|
|
|
|
|
| 14 |
WORKDIR /app
|
| 15 |
|
|
|
|
| 16 |
# Install backend dependencies and make pytest available
|
| 17 |
COPY backend/ backend/
|
| 18 |
COPY pyproject.toml .
|
| 19 |
RUN uv sync && uv pip install .
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 20 |
ENV PATH="/app/.venv/bin:/root/.local/bin:/root/.uv/venv/bin:${PATH}"
|
| 21 |
|
| 22 |
+
# Set up frontend
|
| 23 |
+
COPY --from=frontend-builder /app/frontend/build /app/static
|
|
|
|
|
|
|
|
|
|
|
|
|
| 24 |
|
| 25 |
+
EXPOSE 80
|
|
|
|
| 26 |
|
| 27 |
+
CMD ["uvicorn", "backend.app.main:app", "--host", "0.0.0.0", "--port", "80"]
|
Dockerfile.test
CHANGED
|
@@ -1,11 +1,12 @@
|
|
| 1 |
# Use Node.js image for frontend
|
| 2 |
-
FROM node:20-slim AS frontend
|
| 3 |
|
| 4 |
WORKDIR /app/frontend
|
| 5 |
COPY frontend/package*.json ./
|
| 6 |
RUN npm install --legacy-peer-deps
|
| 7 |
|
| 8 |
COPY frontend/ ./
|
|
|
|
| 9 |
|
| 10 |
# Use Python image with uv pre-installed
|
| 11 |
FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim
|
|
@@ -21,13 +22,9 @@ WORKDIR /app
|
|
| 21 |
# Copy backend code
|
| 22 |
COPY backend/ backend/
|
| 23 |
COPY pyproject.toml .
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
RUN uv sync && uv pip install pytest && uv pip install .
|
| 27 |
-
ENV PATH="/root/.local/bin:/root/.uv/venv/bin:${PATH}"
|
| 28 |
|
| 29 |
# Copy frontend from builder
|
| 30 |
-
COPY --from=frontend /app/frontend /app/frontend
|
| 31 |
-
|
| 32 |
-
# Add uv's bin directory to PATH
|
| 33 |
-
ENV PATH="/app/.venv/bin:/root/.local/bin:/root/.uv/venv/bin:${PATH}"
|
|
|
|
| 1 |
# Use Node.js image for frontend
|
| 2 |
+
FROM node:20-slim AS frontend-builder
|
| 3 |
|
| 4 |
WORKDIR /app/frontend
|
| 5 |
COPY frontend/package*.json ./
|
| 6 |
RUN npm install --legacy-peer-deps
|
| 7 |
|
| 8 |
COPY frontend/ ./
|
| 9 |
+
RUN npm run build
|
| 10 |
|
| 11 |
# Use Python image with uv pre-installed
|
| 12 |
FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim
|
|
|
|
| 22 |
# Copy backend code
|
| 23 |
COPY backend/ backend/
|
| 24 |
COPY pyproject.toml .
|
| 25 |
+
RUN uv sync && uv pip install .
|
| 26 |
+
ENV PATH="/app/.venv/bin:/root/.local/bin:/root/.uv/venv/bin:${PATH}"
|
|
|
|
|
|
|
| 27 |
|
| 28 |
# Copy frontend from builder
|
| 29 |
+
COPY --from=frontend-builder /app/frontend /app/frontend
|
| 30 |
+
COPY --from=frontend-builder /app/frontend/build /app/static
|
|
|
|
|
|
backend/app/main.py
CHANGED
|
@@ -1,5 +1,7 @@
|
|
| 1 |
-
from fastapi import FastAPI
|
|
|
|
| 2 |
from fastapi.middleware.cors import CORSMiddleware
|
|
|
|
| 3 |
from pydantic import BaseModel
|
| 4 |
from backend.app.problem_generator import ProblemGenerator
|
| 5 |
|
|
@@ -19,12 +21,30 @@ class UrlInput(BaseModel):
|
|
| 19 |
class UserQuery(BaseModel):
|
| 20 |
user_query: str
|
| 21 |
|
| 22 |
-
@app.post("/crawl/")
|
| 23 |
async def crawl_documentation(input_data: UrlInput):
|
| 24 |
print(f"Received url {input_data.url}")
|
| 25 |
return {"status": "received"}
|
| 26 |
|
| 27 |
-
@app.post("/problems/")
|
| 28 |
async def generate_problems(query: UserQuery):
|
| 29 |
problems = ProblemGenerator().generate_problems(query.user_query)
|
| 30 |
-
return {"Problems": problems}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from fastapi import FastAPI, HTTPException
|
| 2 |
+
from fastapi.staticfiles import StaticFiles
|
| 3 |
from fastapi.middleware.cors import CORSMiddleware
|
| 4 |
+
from fastapi.responses import FileResponse
|
| 5 |
from pydantic import BaseModel
|
| 6 |
from backend.app.problem_generator import ProblemGenerator
|
| 7 |
|
|
|
|
| 21 |
class UserQuery(BaseModel):
|
| 22 |
user_query: str
|
| 23 |
|
| 24 |
+
@app.post("/api/crawl/")
|
| 25 |
async def crawl_documentation(input_data: UrlInput):
|
| 26 |
print(f"Received url {input_data.url}")
|
| 27 |
return {"status": "received"}
|
| 28 |
|
| 29 |
+
@app.post("/api/problems/")
|
| 30 |
async def generate_problems(query: UserQuery):
|
| 31 |
problems = ProblemGenerator().generate_problems(query.user_query)
|
| 32 |
+
return {"Problems": problems}
|
| 33 |
+
|
| 34 |
+
# Serve static files
|
| 35 |
+
app.mount("/static", StaticFiles(directory="/app/static/static"), name="static")
|
| 36 |
+
|
| 37 |
+
# Root path handler
|
| 38 |
+
@app.get("/")
|
| 39 |
+
async def serve_root():
|
| 40 |
+
return FileResponse("/app/static/index.html")
|
| 41 |
+
|
| 42 |
+
# Catch-all route for serving index.html
|
| 43 |
+
@app.get("/{full_path:path}")
|
| 44 |
+
async def serve_react(full_path: str):
|
| 45 |
+
# Skip API routes
|
| 46 |
+
if full_path.startswith("api/"):
|
| 47 |
+
raise HTTPException(status_code=404, detail="Not found")
|
| 48 |
+
|
| 49 |
+
# For all other routes, serve the React index.html
|
| 50 |
+
return FileResponse("/app/static/index.html")
|
run_local.sh
CHANGED
|
@@ -12,6 +12,7 @@ docker build -t simplify .
|
|
| 12 |
# Run the container
|
| 13 |
echo "Starting container..."
|
| 14 |
docker run -d \
|
|
|
|
| 15 |
--name simplify \
|
| 16 |
-p 80:80 \
|
| 17 |
-p 8000:8000 \
|
|
|
|
| 12 |
# Run the container
|
| 13 |
echo "Starting container..."
|
| 14 |
docker run -d \
|
| 15 |
+
--env-file .env \
|
| 16 |
--name simplify \
|
| 17 |
-p 80:80 \
|
| 18 |
-p 8000:8000 \
|
start.sh
DELETED
|
@@ -1,12 +0,0 @@
|
|
| 1 |
-
#!/bin/bash
|
| 2 |
-
|
| 3 |
-
# Load environment variables from .env
|
| 4 |
-
set -a
|
| 5 |
-
source .env
|
| 6 |
-
set +a
|
| 7 |
-
|
| 8 |
-
# Start nginx
|
| 9 |
-
nginx
|
| 10 |
-
|
| 11 |
-
# Start the FastAPI application
|
| 12 |
-
uvicorn backend.app.main:app --host 0.0.0.0 --port 8000
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|