diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..aefe566 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,26 @@ +# .dockerignore à la racine du repo — nécessaire depuis que le contexte de +# build du backend est passé de ./backend à . (voir docker-compose.yml), +# pour que mcpBridge.js puisse réutiliser mcp-server/tools.js. Sans ce +# fichier, "docker compose build" enverrait tout le monorepo (frontend, +# node_modules de chaque service, .git...) au démon Docker à chaque build. +# Ne PAS exclure mcp-server/tools.js : c'est le seul fichier de mcp-server/ +# dont le backend a besoin (voir backend/Dockerfile). +# +# Les motifs sont ancrés à la racine (préfixe /) pour ne PAS exclure les +# dossiers de même nom à l'intérieur de backend/ (ex. backend/scripts/, +# qui contient des scripts utiles, à ne pas confondre avec /scripts). + +/.git +/.cowork +/backups +/design +/frontend +/scripts +node_modules +backend/data +backend/uploads +mcp-server/node_modules +.env +.env.* +*.log +npm-debug.log diff --git a/backend/Dockerfile b/backend/Dockerfile index 37c6f3d..6fa13da 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -3,17 +3,21 @@ WORKDIR /app RUN apt-get update && apt-get install -y --no-install-recommends \ python3 build-essential \ && rm -rf /var/lib/apt/lists/* -COPY package.json package-lock.json* ./ +COPY backend/package.json backend/package-lock.json* ./ RUN npm install --omit=dev FROM node:20-bookworm-slim WORKDIR /app ENV NODE_ENV=production COPY --from=deps /app/node_modules ./node_modules -COPY . . +COPY backend/. . +# src/ai/mcpBridge.js importe "../../../mcp-server/tools.js" (réutilisation +# telle quelle du code d'outillage du serveur MCP externe) — on reproduit +# donc ici la même position relative : /mcp-server à côté de /app. +COPY mcp-server/tools.js /mcp-server/tools.js RUN mkdir -p /app/data /app/uploads && cp -r /app/icons_seed /app/icons_seed_init -COPY docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh +COPY backend/docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh RUN chmod +x /usr/local/bin/docker-entrypoint.sh EXPOSE 4000 diff --git a/backend/package.json b/backend/package.json index 1137cd1..1dc57a3 100644 --- a/backend/package.json +++ b/backend/package.json @@ -13,6 +13,7 @@ "dependencies": { "@anthropic-ai/sdk": "^0.123.0", "@modelcontextprotocol/sdk": "^1.30.0", + "@mozilla/readability": "^0.6.0", "bcryptjs": "^2.4.3", "better-sqlite3": "^12.11.1", "cors": "^2.8.5", @@ -20,6 +21,7 @@ "express": "^4.19.2", "express-rate-limit": "^7.4.0", "helmet": "^7.1.0", + "jsdom": "^29.1.1", "jsonwebtoken": "^9.0.2", "morgan": "^1.10.0", "multer": "^1.4.5-lts.1", diff --git a/docker-compose.yml b/docker-compose.yml index 83ccc3a..fb8e70a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,8 +3,12 @@ version: "3.9" services: crowdlending-backend: build: - context: ./backend - dockerfile: Dockerfile + # Contexte élargi à la racine du repo (au lieu de ./backend) : le + # backend réutilise tel quel mcp-server/tools.js (voir src/ai/ + # mcpBridge.js) et Docker ne peut pas COPY un fichier hors de son + # contexte de build. + context: . + dockerfile: backend/Dockerfile container_name: crowdlending-backend restart: unless-stopped env_file: