diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..80e15fd --- /dev/null +++ b/.dockerignore @@ -0,0 +1,14 @@ +.git +.venv +venv +__pycache__ +*.pyc +node_modules +frontend/dist +data +*.egg-info +.mypy_cache +.ruff_cache +.pytest_cache +.vscode +.idea diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..e9162c6 --- /dev/null +++ b/Makefile @@ -0,0 +1,17 @@ +.PHONY: dev_back dev_front dev docker + +# Backend avec auto-reload uvicorn +dev_back: + uv run plesna-gerance serve --reload + +# Frontend avec hot-reload Vite +dev_front: + cd frontend && npm run dev + +# Lance les deux en parallèle +dev: + $(MAKE) dev_back & $(MAKE) dev_front & wait + +# Build et lance via podman-compose +docker: + podman-compose up --build diff --git a/backend.Dockerfile b/backend.Dockerfile new file mode 100644 index 0000000..a019879 --- /dev/null +++ b/backend.Dockerfile @@ -0,0 +1,19 @@ +FROM python:3.12-slim + +RUN apt-get update && \ + apt-get install -y --no-install-recommends poppler-utils && \ + rm -rf /var/lib/apt/lists/* + +COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/ + +WORKDIR /app + +COPY pyproject.toml uv.lock ./ +RUN uv sync --frozen --no-dev --no-install-project + +COPY src/ src/ +RUN uv sync --frozen --no-dev + +EXPOSE 8000 + +CMD ["uv", "run", "plesna-gerance", "serve", "--host", "0.0.0.0"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..08d620a --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,21 @@ +services: + backend: + build: + context: . + dockerfile: backend.Dockerfile + volumes: + - ./data:/app/data + environment: + - PLESNA_DB_PATH=/app/data/database.sqlite + - PLESNA_STORAGE_PATH=/app/data/documents + restart: unless-stopped + + frontend: + build: + context: ./frontend + dockerfile: Dockerfile + ports: + - "8080:80" + depends_on: + - backend + restart: unless-stopped diff --git a/frontend/.dockerignore b/frontend/.dockerignore new file mode 100644 index 0000000..f06235c --- /dev/null +++ b/frontend/.dockerignore @@ -0,0 +1,2 @@ +node_modules +dist diff --git a/frontend/Dockerfile b/frontend/Dockerfile new file mode 100644 index 0000000..6867b95 --- /dev/null +++ b/frontend/Dockerfile @@ -0,0 +1,12 @@ +FROM node:22-alpine AS build + +WORKDIR /app +COPY package.json package-lock.json* ./ +RUN npm install +COPY . . +RUN npm run build + +FROM nginx:alpine +COPY --from=build /app/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/conf.d/default.conf +EXPOSE 80 diff --git a/frontend/nginx.conf b/frontend/nginx.conf new file mode 100644 index 0000000..d634563 --- /dev/null +++ b/frontend/nginx.conf @@ -0,0 +1,19 @@ +server { + listen 80; + root /usr/share/nginx/html; + index index.html; + + # Proxy API requests to backend + location /api { + proxy_pass http://backend:8000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + client_max_body_size 50M; + } + + # SPA fallback + location / { + try_files $uri $uri/ /index.html; + } +}