new features
This commit is contained in:
@@ -55,8 +55,8 @@ COPY --from=builder /app/dist ./dist
|
|||||||
# Copy database migrations (needed for runtime)
|
# Copy database migrations (needed for runtime)
|
||||||
COPY --from=builder /app/src/database/migrations ./dist/database/migrations
|
COPY --from=builder /app/src/database/migrations ./dist/database/migrations
|
||||||
|
|
||||||
# Create logs directory
|
# Create logs and uploads directories
|
||||||
RUN mkdir -p /app/logs
|
RUN mkdir -p /app/logs /app/uploads/bestellungen/thumbnails
|
||||||
|
|
||||||
# Change ownership to non-root user
|
# Change ownership to non-root user
|
||||||
RUN chown -R nodejs:nodejs /app
|
RUN chown -R nodejs:nodejs /app
|
||||||
|
|||||||
@@ -128,7 +128,8 @@ app.use('/api/permissions', permissionRoutes);
|
|||||||
app.use('/api/shop', shopRoutes);
|
app.use('/api/shop', shopRoutes);
|
||||||
|
|
||||||
// Static file serving for uploads (authenticated)
|
// 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
|
// 404 handler
|
||||||
app.use(notFoundHandler);
|
app.use(notFoundHandler);
|
||||||
|
|||||||
@@ -4,14 +4,21 @@ import path from 'path';
|
|||||||
import fs from 'fs';
|
import fs from 'fs';
|
||||||
import logger from '../utils/logger';
|
import logger from '../utils/logger';
|
||||||
|
|
||||||
const UPLOAD_DIR = path.resolve(__dirname, '../../../uploads/bestellungen');
|
// In Docker the working dir is /app and the volume is mounted at /app/uploads.
|
||||||
const THUMBNAIL_DIR = path.resolve(__dirname, '../../../uploads/bestellungen/thumbnails');
|
// 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 => {
|
[UPLOAD_DIR, THUMBNAIL_DIR].forEach(dir => {
|
||||||
if (!fs.existsSync(dir)) {
|
try {
|
||||||
fs.mkdirSync(dir, { recursive: true });
|
if (!fs.existsSync(dir)) {
|
||||||
logger.info(`Created upload directory: ${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 });
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user