# ---- Build frontend ---- FROM node:22-slim AS web-build WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . # El login mágico y el "Ver como…" del panel viven detrás de la constante de build # `DEMO` (`import.meta.env.DEV || import.meta.env.VITE_DEMO_UI === "1"`, ver # src/pages/LoginPage.tsx, src/components/AppShell.tsx y src/components/DemoSwitcher.tsx). # En un build de producción `DEV` es false, así que sin esta variable Vite elimina esas # ramas por dead-code elimination: el despliegue quedaba con la landing prometiendo # "no pide registro" y un /login sin ninguna cuenta de prueba que ofrecer. # # Este despliegue ES la demostración del producto, de ahí el default en 1. Cuando deje # de serlo, basta pasar `--build-arg VITE_DEMO_UI=0` (o declararlo como build variable en # Coolify) y las cuentas demo desaparecen del bundle sin tocar código. ARG VITE_DEMO_UI=1 ENV VITE_DEMO_UI=$VITE_DEMO_UI RUN npm run build # ---- Runtime ---- FROM node:22-slim WORKDIR /app ENV NODE_ENV=production ENV HOST=0.0.0.0 ENV PORT=3000 COPY package*.json ./ RUN npm ci --omit=dev && npm cache clean --force # Built frontend (vite outputs to dist/) COPY --from=web-build /app/dist ./dist # Server source (tsx runs TS directly in production) COPY server ./server COPY shared ./shared COPY tsconfig.json ./ # Persistent SQLite data RUN mkdir -p /app/data VOLUME /app/data EXPOSE 3000 CMD ["npx", "tsx", "server/index.ts"]