diff --git a/Dockerfile b/Dockerfile index 327a209..2552c87 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,21 +8,25 @@ WORKDIR /app RUN apk add --no-cache python3 make g++ libc6-compat vips-dev COPY package*.json ./ -# Bewusst npm install (nicht npm ci): der package-lock.json wird auf dem -# Dev-System (Windows) generiert und markiert die linux-musl-arm64-Prebuilts -# von sharp als "dev": true, sodass npm ci sie nicht installiert. npm install -# resolvt Optional-Deps frisch fuer die aktuelle Plattform (= linux-arm64-musl -# im Docker-Build) und findet die Prebuilts korrekt. Die package.json-semver- -# Ranges sorgen fuer hinreichende Reproduzierbarkeit. -RUN npm install --include=optional --no-audit --no-fund +# Zwei Fallstricke werden hier adressiert: +# (a) Der auf Windows erzeugte package-lock.json markiert die linux-musl- +# arm64-Prebuilts von sharp als "dev": true, weshalb npm ci sie selbst +# mit --include=optional nicht installiert. --> npm install statt ci. +# (b) Parallel-Install laesst sharp's postinstall laufen, bevor das +# @img/sharp-linuxmusl-arm64-Paket entpackt ist. --> --ignore-scripts +# hier, dann npm rebuild mit allen Deps auf Disk. node-addon-api ist +# als devDep da, damit der from-source Fallback ebenfalls funktioniert +# (python3 + make + g++ + vips-dev sind oben installiert). +RUN npm install --ignore-scripts --include=optional --no-audit --no-fund +RUN npm rebuild COPY . . RUN npm run build -# Fresh-Install fuer den Runtime-Stage: nur Produktions-Deps, wieder mit -# npm install statt ci aus demselben Grund wie oben. +# Fresh-Install fuer den Runtime-Stage: nur Produktions-Deps, gleicher Ansatz. RUN rm -rf node_modules \ - && npm install --omit=dev --include=optional --no-audit --no-fund + && npm install --ignore-scripts --omit=dev --include=optional --no-audit --no-fund \ + && npm rebuild FROM node:22-alpine AS runner WORKDIR /app diff --git a/package-lock.json b/package-lock.json index 5aee100..aa2231b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "better-sqlite3": "^11.5.0", "linkedom": "^0.18.5", "lucide-svelte": "^1.0.1", + "node-addon-api": "^8.7.0", "yauzl": "^3.3.0", "zod": "^3.23.8" }, @@ -3494,6 +3495,15 @@ "node": ">=10" } }, + "node_modules/node-addon-api": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.7.0.tgz", + "integrity": "sha512-9MdFxmkKaOYVTV+XVRG8ArDwwQ77XIgIPyKASB1k3JPq3M8fGQQQE3YpMOrKm6g//Ktx8ivZr8xo1Qmtqub+GA==", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", diff --git a/package.json b/package.json index 8f1c8b8..3241954 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,7 @@ "better-sqlite3": "^11.5.0", "linkedom": "^0.18.5", "lucide-svelte": "^1.0.1", + "node-addon-api": "^8.7.0", "yauzl": "^3.3.0", "zod": "^3.23.8" }