From 390b016cc2e8d18b91bed0926c2ea5aedf96c111 Mon Sep 17 00:00:00 2001 From: Kenzo Date: Tue, 11 Aug 2026 10:18:54 +0200 Subject: [PATCH] fix(backend): Bilder unter /images/ ausliefern Die Bild-URLs in der DB sind /images/events/... bzw. /images/gallery/... - das ist der Pfad auf der publizierten Astro-Seite. Das Backend lieferte die Dateien aber nur unter /static/ mit Root auf dem Workspace aus, die Datei lag also unter /static/public/images/... Ein Aufruf von /images/... traf auf gar keine Route, kam als JSON-404 zurueck und wurde vom Browser als OpaqueResponseBlocking verworfen. Dadurch waren im Adminbereich saemtliche Event- und Gallery-Bilder kaputt. Zusaetzlicher statischer Mount /images/ -> /public/images. Die DB bleibt unveraendert und die URLs stimmen weiterhin fuer die publizierte Seite. /static/ bleibt zusaetzlich bestehen. Beide Verzeichnisse werden vorab angelegt - @fastify/static verweigert sonst die Registrierung, wenn der Workspace noch nicht geklont ist. Co-Authored-By: Claude Opus 5 (1M context) --- backend/src/index.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/backend/src/index.ts b/backend/src/index.ts index f8f4152..6d5d4c4 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -8,6 +8,7 @@ import { env, validateEnv } from './config/env.js'; import { db, initDatabase } from './config/database.js'; import fastifyStatic from '@fastify/static'; import path from 'path'; +import fs from 'fs'; // Import routes import authRoute from './routes/auth.js'; @@ -79,12 +80,25 @@ fastify.register(multipart, { // Serve static files (uploaded images, etc.) from persistent volume const dataDir = env.GIT_WORKSPACE_DIR || path.join(process.cwd(), 'data'); +// Muss existieren, sonst verweigert @fastify/static die Registrierung +fs.mkdirSync(dataDir, { recursive: true }); fastify.register(fastifyStatic, { root: dataDir, prefix: '/static/', decorateReply: false }); +// Uploads liegen unter /public/images. In der DB stehen sie als +// /images/... - das ist die URL auf der publizierten Astro-Seite. Damit die +// Admin-Oberflaeche dieselben Pfade verwenden kann, hier ebenso ausliefern. +const imagesDir = path.join(dataDir, 'public', 'images'); +fs.mkdirSync(imagesDir, { recursive: true }); +fastify.register(fastifyStatic, { + root: imagesDir, + prefix: '/images/', + decorateReply: false +}); + // Decorate fastify with authenticate method fastify.decorate('authenticate', authenticate);