# syntax=docker/dockerfile:1 # Backend Medusa + dashboard admin. Contesto di build: cartella medusa/. # docker build -t iti-technology/medusa medusa # `medusa build` produce apps/backend/.medusa/server (backend compilato + dashboard in public/admin) ma senza # lockfile: nel runtime si riusano i node_modules del monorepo Medusa (installati con il lockfile e poi # ripuliti dalle devDependencies), che Node trova risalendo le cartelle. # All'avvio: `medusa db:migrate` (idempotente), poi `medusa start`. ARG NODE_IMAGE=node:24-bookworm-slim FROM ${NODE_IMAGE} AS build WORKDIR /app COPY package.json package-lock.json turbo.json ./ COPY apps/backend/package.json apps/backend/ RUN npm ci --no-audit --no-fund COPY apps/backend apps/backend # Il dashboard usa l'origine del browser come URL del backend (admin.backendUrl non impostato): # la stessa immagine vale per qualunque dominio. RUN cd apps/backend && npx medusa build \ && cd /app && npm prune --omit=dev --no-audit --no-fund \ && npm cache clean --force FROM ${NODE_IMAGE} AS runtime ENV NODE_ENV=production PATH=/app/node_modules/.bin:$PATH # --chown: `medusa db:migrate` crea cartelle migrations/ vuote nei moduli che non ne hanno COPY --from=build --chown=node:node /app/node_modules /app/node_modules COPY --from=build /app/package.json /app/package.json COPY --from=build /app/apps/backend/package.json /app/apps/backend/package.json COPY --from=build /app/apps/backend/.medusa/server /app/apps/backend/.medusa/server # Volume dei file caricati dal dashboard (immagini prodotto), serviti da Caddy su media./shop/ RUN mkdir -p /data/medusa-files && chown -R node:node /data/medusa-files /app/apps/backend/.medusa/server USER node WORKDIR /app/apps/backend/.medusa/server EXPOSE 9000 HEALTHCHECK --interval=15s --timeout=5s --start-period=90s --retries=10 \ CMD ["node", "-e", "fetch('http://127.0.0.1:9000/health').then(r=>process.exit(r.ok?0:1),()=>process.exit(1))"] CMD ["sh", "-c", "medusa db:migrate && exec medusa start"]