From c142fee5e51cc4d8e818463b0beb8cb95c7b078e Mon Sep 17 00:00:00 2001 From: kverma1502 Date: Sun, 25 Jan 2026 13:03:54 +0000 Subject: [PATCH] add --- backend/.dockerignore | 6 ++++++ backend/Dockerfile | 31 +++++++++++++++++++++++++++++++ backend/config/settings.py | 2 +- backend/requirements.txt | 3 +++ docker-compose.yml | 28 ++++++++++++++++++++++++++++ frontend/.dockerignore | 4 ++++ frontend/Dockerfile | 25 +++++++++++++++++++++++++ frontend/nginx.conf | 12 ++++++++++++ frontend/src/App.tsx | 2 +- 9 files changed, 111 insertions(+), 2 deletions(-) create mode 100644 backend/.dockerignore create mode 100644 backend/Dockerfile create mode 100644 backend/requirements.txt create mode 100644 docker-compose.yml create mode 100644 frontend/.dockerignore create mode 100644 frontend/Dockerfile create mode 100644 frontend/nginx.conf diff --git a/backend/.dockerignore b/backend/.dockerignore new file mode 100644 index 00000000..5cda7950 --- /dev/null +++ b/backend/.dockerignore @@ -0,0 +1,6 @@ +__pycache__ +*.pyc +.env +venv +.git + diff --git a/backend/Dockerfile b/backend/Dockerfile new file mode 100644 index 00000000..b48ec019 --- /dev/null +++ b/backend/Dockerfile @@ -0,0 +1,31 @@ +# ---------- Build Stage ---------- +FROM python:3.11-slim AS builder + +WORKDIR /app +RUN apt-get update && apt-get install -y build-essential + +COPY requirements.txt . +RUN pip install --user -r requirements.txt + + +# ---------- Runtime Stage ---------- +FROM python:3.11-slim + +WORKDIR /app + +# Create non-root user +RUN useradd -m appuser + +COPY --from=builder /root/.local /home/appuser/.local +COPY . . + +# 🔑 THIS IS THE FIX +RUN chown -R appuser:appuser /app + +ENV PATH=/home/appuser/.local/bin:$PATH + +USER appuser + +EXPOSE 8000 +CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"] + diff --git a/backend/config/settings.py b/backend/config/settings.py index b5764dac..466f6840 100644 --- a/backend/config/settings.py +++ b/backend/config/settings.py @@ -25,7 +25,7 @@ # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True -ALLOWED_HOSTS = [] +ALLOWED_HOSTS = ["*"] # Application definition diff --git a/backend/requirements.txt b/backend/requirements.txt new file mode 100644 index 00000000..1b66a729 --- /dev/null +++ b/backend/requirements.txt @@ -0,0 +1,3 @@ +Django==4.2.7 +djangorestframework==3.14.0 +django-cors-headers==4.3.1 diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..404c3a42 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,28 @@ +version: "3.9" + +services: + backend: + build: ./backend + container_name: django-backend + ports: + - "8000:8000" + environment: + DEBUG: "True" + networks: + - app-network + + frontend: + build: ./frontend + container_name: react-frontend + ports: + - "3000:80" + environment: + VITE_API_URL: "http://backend:8000" + depends_on: + - backend + networks: + - app-network + +networks: + app-network: + diff --git a/frontend/.dockerignore b/frontend/.dockerignore new file mode 100644 index 00000000..375e27eb --- /dev/null +++ b/frontend/.dockerignore @@ -0,0 +1,4 @@ +node_modules +dist +.git + diff --git a/frontend/Dockerfile b/frontend/Dockerfile new file mode 100644 index 00000000..482dafc7 --- /dev/null +++ b/frontend/Dockerfile @@ -0,0 +1,25 @@ +# ---------- Build Stage ---------- +FROM node:20-alpine AS builder + +WORKDIR /app +COPY package*.json ./ +RUN npm install + +COPY . . +RUN npm run build + +# ---------- Runtime Stage ---------- +FROM nginx:alpine + +# Create non-root user +RUN adduser -D appuser \ + && mkdir -p /var/cache/nginx /var/run /run \ + && chown -R appuser:appuser /var/cache/nginx /var/run /run /etc/nginx /usr/share/nginx/html + +COPY --from=builder /app/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/conf.d/default.conf + +USER appuser + +EXPOSE 80 + diff --git a/frontend/nginx.conf b/frontend/nginx.conf new file mode 100644 index 00000000..520e7562 --- /dev/null +++ b/frontend/nginx.conf @@ -0,0 +1,12 @@ +server { + listen 80; + server_name localhost; + + root /usr/share/nginx/html; + index index.html; + + location / { + try_files $uri /index.html; + } +} + diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 890f5946..68689d35 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -12,7 +12,7 @@ function App() { setLoading(true) setError(null) try { - const response = await axios.get('http://localhost:8000/api/hello/') + const response = await axios.get(`${import.meta.env.VITE_API_URL}/api/hello/`) setMessage(response.data.message) } catch (err) { console.error(err)