My-Weekly-ToDo-List/next.config.js
mARTin-B78 e62294a204
Some checks are pending
Playwright Tests / test (push) Waiting to run
Test and SonarQube / quality (push) Waiting to run
fix: Standalone-Output-Wurzel fest verankern -- Smoke-Test scheiterte nach next@15
Der erste Deploy nach dem next@15-Upgrade (v1.123.0) brach am Smoke-Test ab:
Next.js hatte den Standalone-Output um einen Ordner tiefer verschachtelt als
scripts/update-app.sh erwartet, weil es per Lockfile-Suche nach oben eine
verwaiste, leere package-lock.json in /root auf dem Produktionshost fand und
/root faelschlich fuer die Projektwurzel hielt.

outputFileTracingRoot: __dirname in next.config.js verankert die Wurzel jetzt
explizit. Die laufende App war nie betroffen -- der Smoke-Test hat den Build
wie vorgesehen abgefangen, bevor umgeschaltet wurde.

Verifiziert lokal mit denselben Env-Variablen wie scripts/update-app.sh
(NEXT_DIST_DIR=.next-build): .next-build/standalone/server.js liegt jetzt an
der erwarteten Stelle. Typecheck, Lint, 79 Unit-Tests weiterhin gruen.

v1.123.1

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-12 14:56:37 +02:00

74 lines
3.4 KiB
JavaScript

/** @type {import('next').NextConfig} */
const { version } = require('./package.json');
const nextConfig = {
output: 'standalone',
// Next.js sucht per Lockfile-Suche nach oben selbst einen "Workspace-Root" fuer die
// File-Tracing des Standalone-Outputs. Findet es dort ein weiteres Lockfile (auf dem
// Produktionshost liegt in /root eine verwaiste, leere package-lock.json), haelt es
// /root faelschlich fuer die Wurzel und verschachtelt den Output um einen Ordner tiefer:
// .next-build/standalone/My-Weekly-ToDo-List/server.js statt .next-build/standalone/
// server.js. scripts/update-app.sh erwartet Letzteres fest und der Smoke-Test schlaegt
// sonst fehl ("Cannot find module '.../standalone/server.js'"), live aufgetreten
// 2026-09-12 beim ersten Deploy nach next@15. __dirname verankert die Wurzel explizit,
// unabhaengig davon, was sonst noch im Dateisystem oberhalb des Projekts herumliegt.
outputFileTracingRoot: __dirname,
// Kein "X-Powered-By: Next.js" -- unnoetige Versions-/Framework-Preisgabe an Scanner.
poweredByHeader: false,
// Ziel des Builds. update-app.sh baut nach .next-build, damit das laufende .next
// waehrend des Builds unberuehrt bleibt, und schaltet erst nach erfolgreichem
// Smoke-Test um. Ohne das zerstoert ein fehlgeschlagener Build die laufende App.
distDir: process.env.NEXT_DIST_DIR || '.next',
eslint: {
// Aus: Der Build meldet ESLint-Fehler. Warnungen blockieren ihn nicht, nur Errors.
//
// Kurzzeitig stand hier wieder true, weil ich ESLint fuer den OOM-Absturz des Builds
// auf dem Produktionscontainer verantwortlich hielt. Eine Messung widerlegte das:
// Spitzenspeicher mit ESLint 2.590 MB, ohne 2.595 MB -- kein Unterschied. Die Ursache
// war Nodes Standard-Heap-Limit von rund 1,5 GB; dafuer setzt scripts/update-app.sh
// jetzt NODE_OPTIONS.
ignoreDuringBuilds: false,
},
typescript: {
// Aus: Der Build bricht bei Typfehlern ab. Bis v1.118.1 stand hier true — dadurch
// liefen mehrfach fehlende Importe durch, die zur Laufzeit ReferenceError geworfen
// haetten, waehrend der Build "erfolgreich" meldete.
ignoreBuildErrors: false,
},
optimizeFonts: false,
env: {
NEXT_PUBLIC_APP_VERSION: version,
},
experimental: {
serverComponentsExternalPackages: ['ical.js', 'tsdav'],
},
// Standard-Sicherheitsheader, die von Scannern (securityheaders.com, Mozilla Observatory,
// OWASP ZAP Baseline) sonst als fehlend markiert werden. Bewusst ohne Content-Security-Policy:
// die brauchte eine sorgfaeltige Whitelist (Google/Microsoft-OAuth, Google Fonts, FontAwesome-
// CDN, inline Styles in WeeklyView) und eigene Tests, um nichts zu zerbrechen -- eigener Schritt.
async headers() {
return [
{
source: '/:path*',
headers: [
{ key: 'X-Content-Type-Options', value: 'nosniff' },
{ key: 'X-Frame-Options', value: 'DENY' },
{ key: 'Referrer-Policy', value: 'strict-origin-when-cross-origin' },
{ key: 'Permissions-Policy', value: 'camera=(), microphone=(), geolocation=()' },
],
},
];
},
webpack: (config, { isServer }) => {
// Ignore .md files in node_modules (fixes apple-icloud README.md parse error)
config.module.rules.push({
test: /\.md$/,
include: /node_modules/,
type: 'asset/source',
});
return config;
},
};
module.exports = nextConfig;