From d2dc64d54a681c3086affea21f2e133d52df9928 Mon Sep 17 00:00:00 2001 From: Matthias Hochmeister Date: Mon, 23 Mar 2026 13:14:33 +0100 Subject: [PATCH] new features --- backend/Dockerfile | 4 ++-- backend/src/app.ts | 3 ++- backend/src/middleware/upload.ts | 19 +++++++++++++------ 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/backend/Dockerfile b/backend/Dockerfile index d87d93a..9ff47ee 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -55,8 +55,8 @@ COPY --from=builder /app/dist ./dist # Copy database migrations (needed for runtime) COPY --from=builder /app/src/database/migrations ./dist/database/migrations -# Create logs directory -RUN mkdir -p /app/logs +# Create logs and uploads directories +RUN mkdir -p /app/logs /app/uploads/bestellungen/thumbnails # Change ownership to non-root user RUN chown -R nodejs:nodejs /app diff --git a/backend/src/app.ts b/backend/src/app.ts index 435b3c7..4bfdf4c 100644 --- a/backend/src/app.ts +++ b/backend/src/app.ts @@ -128,7 +128,8 @@ app.use('/api/permissions', permissionRoutes); app.use('/api/shop', shopRoutes); // Static file serving for uploads (authenticated) -app.use('/uploads', authenticate, express.static(path.resolve(__dirname, '../../uploads'))); +const uploadsDir = process.env.NODE_ENV === 'production' ? '/app/uploads' : path.resolve(__dirname, '../../uploads'); +app.use('/uploads', authenticate, express.static(uploadsDir)); // 404 handler app.use(notFoundHandler); diff --git a/backend/src/middleware/upload.ts b/backend/src/middleware/upload.ts index c76cc96..27e3bb1 100644 --- a/backend/src/middleware/upload.ts +++ b/backend/src/middleware/upload.ts @@ -4,14 +4,21 @@ import path from 'path'; import fs from 'fs'; import logger from '../utils/logger'; -const UPLOAD_DIR = path.resolve(__dirname, '../../../uploads/bestellungen'); -const THUMBNAIL_DIR = path.resolve(__dirname, '../../../uploads/bestellungen/thumbnails'); +// In Docker the working dir is /app and the volume is mounted at /app/uploads. +// In dev, resolve relative to the project root (3 levels up from dist/middleware/). +const APP_ROOT = process.env.NODE_ENV === 'production' ? '/app' : path.resolve(__dirname, '../../..'); +const UPLOAD_DIR = path.join(APP_ROOT, 'uploads', 'bestellungen'); +const THUMBNAIL_DIR = path.join(APP_ROOT, 'uploads', 'bestellungen', 'thumbnails'); -// Ensure directories exist +// Ensure directories exist (graceful — may already exist via Docker volume) [UPLOAD_DIR, THUMBNAIL_DIR].forEach(dir => { - if (!fs.existsSync(dir)) { - fs.mkdirSync(dir, { recursive: true }); - logger.info(`Created upload directory: ${dir}`); + try { + if (!fs.existsSync(dir)) { + fs.mkdirSync(dir, { recursive: true }); + logger.info(`Created upload directory: ${dir}`); + } + } catch (err) { + logger.warn(`Could not create upload directory ${dir} — it may be created by Docker volume mount`, { err }); } });