fix(deploy): prod-бандл без devDependencies — динамический импорт vite в setupVite

Шаги 0.5/0.2 плана production-готовности (досрочно ушли с a54ec77):
- Dockerfile: npm ci --omit=dev вместо копирования node_modules из builder,
  пользователь app (USER app), HOME=/tmp, npm_config_cache=/tmp/.npm
- docker/Dockerfile.documents: USER app, HOME=/tmp
- server/vite.ts: vite и vite.config импортируются динамически внутри setupVite —
  иначе prod-бандл падал с ERR_MODULE_NOT_FOUND (@vitejs/plugin-react)
- package.json: vitest/supertest/@types/* (16 пакетов) перенесены
  в devDependencies — именно vitest в dependencies тянул vite/esbuild/tsx в прод-образ

Проверено локально: образ собирается, uid=1001(app), /app/data доступна на запись,
бандл стартует без devDeps (падает только на отсутствии JWT-секретов окружения)
This commit is contained in:
2026-09-07 21:22:27 +03:00
parent a54ec775dd
commit 9fc6ad1bd1
3 changed files with 194 additions and 41 deletions

View File

@@ -1,13 +1,9 @@
import express, { type Express } from "express";
import fs from "fs";
import path from "path";
import { createServer as createViteServer, createLogger } from "vite";
import { type Server } from "http";
import viteConfig from "../vite.config";
import { nanoid } from "nanoid";
const viteLogger = createLogger();
export function log(message: string, source = "express") {
const formattedTime = new Date().toLocaleTimeString("en-US", {
hour: "numeric",
@@ -20,6 +16,11 @@ export function log(message: string, source = "express") {
}
export async function setupVite(app: Express, server: Server) {
// vite и vite.config — devDependencies: импортируем динамически, чтобы
// production-бандл (npm ci --omit=dev) не резолвил их при старте.
const { createServer: createViteServer, createLogger } = await import("vite");
const { default: viteConfig } = await import("../vite.config");
const viteLogger = createLogger();
const serverOptions = {
middlewareMode: true,
hmr: { server },