Sicherheitsdurchgang vor dem geplanten Beta-Test mit Security-Scannern: - Login (authorize() in src/lib/auth.ts) hatte als einziger Auth-Endpunkt kein Rate-Limit, obwohl signup/reset-password/verify-email/resend-verification es bereits nutzen. Jetzt max. 8 Versuche pro E-Mail in 15 Minuten. - Fehlende Standardheader ergaenzt (X-Content-Type-Options, X-Frame-Options, Referrer-Policy, Permissions-Policy), X-Powered-By abgeschaltet. Bewusst ohne CSP -- braucht eine eigene, getestete Whitelist fuer OAuth/Fonts/CDN. - npm audit fix (ohne --force): 24 -> 10 gemeldete Schwachstellen, keine Breaking Changes. Die verbleibenden 10 haengen an next@14 und next-auth@4 (siehe CHANGELOG "Known issues") und brauchen ein eigenes Major-Upgrade. Ausserdem zwei Betriebsfixes, die beim heutigen Deploy live auffielen: - scripts/update-app.sh setzt jetzt selbst PATH=/usr/local/bin:$PATH. Ohne Login-Shell fand es pm2 nicht und brach nach erfolgreichem Build beim Neustart ab -- die Instanz blieb dabei auf dem alten Stand, kein Datenverlust, aber ein unnoetiger manueller Eingriff. - tsconfig.json nimmt .next-build/types/**/*.ts mit auf; Next.js traegt das beim Bauen mit NEXT_DIST_DIR=.next-build sonst als nie eingecheckte Abweichung auf dem Produktionshost ein. v1.122.0 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
64 lines
2.6 KiB
JavaScript
64 lines
2.6 KiB
JavaScript
/** @type {import('next').NextConfig} */
|
|
const { version } = require('./package.json');
|
|
|
|
const nextConfig = {
|
|
output: 'standalone',
|
|
// 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;
|