fix: rendre le démarrage production reproductible
All checks were successful
Validation applicative / TypeScript, tests et build (push) Successful in 3m24s

This commit is contained in:
manus-admin
2026-08-22 11:55:43 +02:00
parent ea05e9ec6a
commit 979a2b4b26
3 changed files with 92 additions and 0 deletions

12
.dockerignore Normal file
View File

@@ -0,0 +1,12 @@
node_modules
dist
.git
.env
.env.*
uploads
mysql-data
src
deployment-package
*.tar.gz
*.pdf
*.docx

40
Dockerfile Normal file
View File

@@ -0,0 +1,40 @@
FROM node:20-alpine AS builder
WORKDIR /app
# Corepack applique la version de pnpm verrouillée dans package.json.
RUN npm install -g corepack@latest && corepack enable
COPY . .
RUN pnpm install --frozen-lockfile
# Les variables Vite doivent être disponibles pendant la compilation frontend.
ARG VITE_APP_ID
ARG VITE_OAUTH_PORTAL_URL
ARG VITE_APP_TITLE
ARG VITE_FRONTEND_FORGE_API_URL
ARG VITE_FRONTEND_FORGE_API_KEY
ARG VITE_ANALYTICS_ENDPOINT
ARG VITE_ANALYTICS_WEBSITE_ID
ARG VITE_APP_LOGO
ENV VITE_APP_ID=${VITE_APP_ID} \
VITE_OAUTH_PORTAL_URL=${VITE_OAUTH_PORTAL_URL} \
VITE_APP_TITLE=${VITE_APP_TITLE} \
VITE_FRONTEND_FORGE_API_URL=${VITE_FRONTEND_FORGE_API_URL} \
VITE_FRONTEND_FORGE_API_KEY=${VITE_FRONTEND_FORGE_API_KEY} \
VITE_ANALYTICS_ENDPOINT=${VITE_ANALYTICS_ENDPOINT} \
VITE_ANALYTICS_WEBSITE_ID=${VITE_ANALYTICS_WEBSITE_ID} \
VITE_APP_LOGO=${VITE_APP_LOGO}
RUN pnpm run build
FROM node:20-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/drizzle ./drizzle
COPY --from=builder /app/package.json ./package.json
EXPOSE 3000
CMD ["node", "dist/index.js"]

40
docker-compose.yml Normal file
View File

@@ -0,0 +1,40 @@
services:
app:
build:
context: .
dockerfile: Dockerfile
args:
VITE_APP_ID: ${VITE_APP_ID}
VITE_OAUTH_PORTAL_URL: ${VITE_OAUTH_PORTAL_URL}
VITE_APP_TITLE: ${VITE_APP_TITLE}
VITE_FRONTEND_FORGE_API_URL: ${VITE_FRONTEND_FORGE_API_URL}
VITE_FRONTEND_FORGE_API_KEY: ${VITE_FRONTEND_FORGE_API_KEY}
VITE_ANALYTICS_ENDPOINT: ${VITE_ANALYTICS_ENDPOINT}
VITE_ANALYTICS_WEBSITE_ID: ${VITE_ANALYTICS_WEBSITE_ID}
VITE_APP_LOGO: ${VITE_APP_LOGO}
image: formation-manager-itinova-app:v2
container_name: formation-manager-itinova
restart: unless-stopped
env_file:
- .env
environment:
NODE_ENV: production
PORT: 3000
TRUST_PROXY: 1
volumes:
- /opt/manus-deploy/apps/formation-manager-itinova/uploads:/app/uploads
networks:
- web
labels:
- "traefik.enable=true"
- "traefik.docker.network=web"
- "traefik.http.routers.formations-prod.entrypoints=websecure"
- "traefik.http.routers.formations-prod.rule=Host(`formations.itinova.org`) || Host(`formations.santinova-soft.org`)"
- "traefik.http.routers.formations-prod.tls=true"
- "traefik.http.routers.formations-prod.tls.certresolver=letsencrypt"
- "traefik.http.routers.formations-prod.service=formations-prod-svc"
- "traefik.http.services.formations-prod-svc.loadbalancer.server.port=3000"
networks:
web:
external: true