From 2aecaa2672467698f80f41ec97d5ae7c9c166fc9 Mon Sep 17 00:00:00 2001 From: michaelschal <35957947-michaelschal@users.noreply.replit.com> Date: Mon, 11 Aug 2025 15:07:28 +0000 Subject: [PATCH] Adapt application to serve static files directly in production Remove Vite dependency in production Dockerfile and server configuration, and serve static assets and SPA fallback from the built distribution directory. Replit-Commit-Author: Agent Replit-Commit-Session-Id: d396e5bd-e32d-4a20-9e7d-71e7102ddc6c Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1957c339-2757-4d1f-8e92-e9f71a1ce58e/d396e5bd-e32d-4a20-9e7d-71e7102ddc6c/CrwFq15 --- Dockerfile | 3 + ...dex-js-at--1754924794519_1754924794519.txt | 188 ++++++++++++++++++ server/index.production.ts | 25 ++- 3 files changed, 211 insertions(+), 5 deletions(-) create mode 100644 attached_assets/Pasted-Error-ERR-MODULE-NOT-FOUND-Cannot-find-package-vite-imported-from-app-dist-index-js-at--1754924794519_1754924794519.txt diff --git a/Dockerfile b/Dockerfile index c15d03e..3b5b314 100644 --- a/Dockerfile +++ b/Dockerfile @@ -81,6 +81,9 @@ RUN npm ci --only=production && npm cache clean --force COPY --from=build --chown=nextjs:nodejs /app/dist ./dist COPY --from=build --chown=nextjs:nodejs /app/shared ./shared +# Create symlink for public files to be accessible from dist +RUN ln -sf /app/dist/public /app/dist/public + # Create uploads directory with proper permissions RUN mkdir -p /app/uploads && chown -R nextjs:nodejs /app/uploads diff --git a/attached_assets/Pasted-Error-ERR-MODULE-NOT-FOUND-Cannot-find-package-vite-imported-from-app-dist-index-js-at--1754924794519_1754924794519.txt b/attached_assets/Pasted-Error-ERR-MODULE-NOT-FOUND-Cannot-find-package-vite-imported-from-app-dist-index-js-at--1754924794519_1754924794519.txt new file mode 100644 index 0000000..d33c8ac --- /dev/null +++ b/attached_assets/Pasted-Error-ERR-MODULE-NOT-FOUND-Cannot-find-package-vite-imported-from-app-dist-index-js-at--1754924794519_1754924794519.txt @@ -0,0 +1,188 @@ +Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'vite' imported from /app/dist/index.js + + at packageResolve (node:internal/modules/esm/resolve:873:9) + + at moduleResolve (node:internal/modules/esm/resolve:946:18) + + at defaultResolve (node:internal/modules/esm/resolve:1188:11) + + at ModuleLoader.defaultResolve (node:internal/modules/esm/loader:642:12) + + at #cachedDefaultResolve (node:internal/modules/esm/loader:591:25) + + at ModuleLoader.resolve (node:internal/modules/esm/loader:574:38) + + at ModuleLoader.getModuleJobForImport (node:internal/modules/esm/loader:236:38) + + at ModuleJob._link (node:internal/modules/esm/module_job:130:49) { + + code: 'ERR_MODULE_NOT_FOUND' + +} + +Node.js v20.19.4 + +node:internal/modules/esm/resolve:873 + + throw new ERR_MODULE_NOT_FOUND(packageName, fileURLToPath(base), null); + + + +^ + +Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'vite' imported from /app/dist/index.js + + at packageResolve (node:internal/modules/esm/resolve:873:9) + + at moduleResolve (node:internal/modules/esm/resolve:946:18) + + at defaultResolve (node:internal/modules/esm/resolve:1188:11) + + at ModuleLoader.defaultResolve (node:internal/modules/esm/loader:642:12) + + at #cachedDefaultResolve (node:internal/modules/esm/loader:591:25) + + at ModuleLoader.resolve (node:internal/modules/esm/loader:574:38) + + at ModuleLoader.getModuleJobForImport (node:internal/modules/esm/loader:236:38) + + at ModuleJob._link (node:internal/modules/esm/module_job:130:49) { + + code: 'ERR_MODULE_NOT_FOUND' + +} + +Node.js v20.19.4 + +node:internal/modules/esm/resolve:873 + + throw new ERR_MODULE_NOT_FOUND(packageName, fileURLToPath(base), null); + + + +^ + +Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'vite' imported from /app/dist/index.js + + at packageResolve (node:internal/modules/esm/resolve:873:9) + + at moduleResolve (node:internal/modules/esm/resolve:946:18) + + at defaultResolve (node:internal/modules/esm/resolve:1188:11) + + at ModuleLoader.defaultResolve (node:internal/modules/esm/loader:642:12) + + at #cachedDefaultResolve (node:internal/modules/esm/loader:591:25) + + at ModuleLoader.resolve (node:internal/modules/esm/loader:574:38) + + at ModuleLoader.getModuleJobForImport (node:internal/modules/esm/loader:236:38) + + at ModuleJob._link (node:internal/modules/esm/module_job:130:49) { + + code: 'ERR_MODULE_NOT_FOUND' + +} + +Node.js v20.19.4 + +node:internal/modules/esm/resolve:873 + + throw new ERR_MODULE_NOT_FOUND(packageName, fileURLToPath(base), null); + + + +^ + +Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'vite' imported from /app/dist/index.js + + at packageResolve (node:internal/modules/esm/resolve:873:9) + + at moduleResolve (node:internal/modules/esm/resolve:946:18) + + at defaultResolve (node:internal/modules/esm/resolve:1188:11) + + at ModuleLoader.defaultResolve (node:internal/modules/esm/loader:642:12) + + at #cachedDefaultResolve (node:internal/modules/esm/loader:591:25) + + at ModuleLoader.resolve (node:internal/modules/esm/loader:574:38) + + at ModuleLoader.getModuleJobForImport (node:internal/modules/esm/loader:236:38) + + at ModuleJob._link (node:internal/modules/esm/module_job:130:49) { + + code: 'ERR_MODULE_NOT_FOUND' + +} + +Node.js v20.19.4 + +node:internal/modules/esm/resolve:873 + + throw new ERR_MODULE_NOT_FOUND(packageName, fileURLToPath(base), null); + + + +^ + +Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'vite' imported from /app/dist/index.js + + at packageResolve (node:internal/modules/esm/resolve:873:9) + + at moduleResolve (node:internal/modules/esm/resolve:946:18) + + at defaultResolve (node:internal/modules/esm/resolve:1188:11) + + at ModuleLoader.defaultResolve (node:internal/modules/esm/loader:642:12) + + at #cachedDefaultResolve (node:internal/modules/esm/loader:591:25) + + at ModuleLoader.resolve (node:internal/modules/esm/loader:574:38) + + at ModuleLoader.getModuleJobForImport (node:internal/modules/esm/loader:236:38) + + at ModuleJob._link (node:internal/modules/esm/module_job:130:49) { + + code: 'ERR_MODULE_NOT_FOUND' + +} + +Node.js v20.19.4 + +node:internal/modules/esm/resolve:873 + + throw new ERR_MODULE_NOT_FOUND(packageName, fileURLToPath(base), null); + + + +^ + +Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'vite' imported from /app/dist/index.js + + at packageResolve (node:internal/modules/esm/resolve:873:9) + + at moduleResolve (node:internal/modules/esm/resolve:946:18) + + at defaultResolve (node:internal/modules/esm/resolve:1188:11) + + at ModuleLoader.defaultResolve (node:internal/modules/esm/loader:642:12) + + at #cachedDefaultResolve (node:internal/modules/esm/loader:591:25) + + at ModuleLoader.resolve (node:internal/modules/esm/loader:574:38) + + at ModuleLoader.getModuleJobForImport (node:internal/modules/esm/loader:236:38) + + at ModuleJob._link (node:internal/modules/esm/module_job:130:49) { + + code: 'ERR_MODULE_NOT_FOUND' + +} + +Node.js v20.19.4 + + + + + \ No newline at end of file diff --git a/server/index.production.ts b/server/index.production.ts index cc32776..9020385 100644 --- a/server/index.production.ts +++ b/server/index.production.ts @@ -1,10 +1,13 @@ import express, { type Request, Response, NextFunction } from "express"; -import { setupVite, serveStatic } from "./vite.js"; - -// Production routes - simplified for Docker deployment import { createServer, type Server } from "http"; import { storage } from "./storage.js"; import { setupLocalAuth, requireAuth } from "./localAuth.production.js"; +import { fileURLToPath } from 'url'; +import { dirname, join } from 'path'; + +// Get directory paths +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); console.log('🐳 PRODUCTION: Starting LogiFlow application'); @@ -124,8 +127,20 @@ app.use((err: any, _req: Request, res: Response, _next: NextFunction) => { throw err; }); -// Production setup - serve static files -serveStatic(app); +// Serve static files directly in production (no Vite) +const publicPath = join(__dirname, 'public'); +console.log('🐳 Serving static files from:', publicPath); + +app.use('/assets', express.static(join(publicPath, 'assets'))); +app.use('/', express.static(publicPath)); + +// SPA fallback - serve index.html for all non-API routes +app.get('*', (req, res, next) => { + if (req.path.startsWith('/api/')) { + return next(); + } + res.sendFile(join(publicPath, 'index.html')); +}); const port = process.env.PORT ? parseInt(process.env.PORT) : 3000; server.listen(port, "0.0.0.0", () => {