Compare commits

..

2 commits

Author SHA1 Message Date
Daniel Michelberger
0ae0840c29 fix: Deployment-Build durch jsdom-Downgrade auf 29 reparieren
npm ci brach beim Deployment mit EBADENGINE ab: jsdom 30 verlangt
^22.22.2 || ^24.15.0 || >=26.0.0, Nixpacks liefert aber Node 24.10.0.
24.10 ist aelter als 24.15 und faellt damit durch; zusammen mit
engine-strict=true in .npmrc bricht die Installation hart ab.

Anders als bei frueheren Node-Problemen liegt es nicht an unserer eigenen
engines-Angabe (^20.19 || ^22.12 || >=24) — die ist erfuellt. Die
Anforderung kommt allein aus jsdom, und zwar erst seit Version 30; jsdom 29
verlangt nur >=24.0.0. Ein NIXPACKS_NODE_VERSION haette nicht geholfen, weil
Nixpacks nur Major-Versionen aufloest und damit ohnehin bei 24.10 landet.

jsdom ist eine devDependency und wird ausschliesslich als Testumgebung fuer
Vitest genutzt (vite.config.ts). Fuer den Produktionsbuild ist sie
irrelevant, wird aber mitinstalliert, weil Nixpacks NPM_CONFIG_PRODUCTION
auf false setzt.

Verifiziert: npm ci laeuft in einem node:24.10-slim-Container durch, also
auf exakt der Version, an der das Deployment gescheitert ist. Alle 19 Tests
in src/lib/gpx.test.ts bestehen unter jsdom 29.1.1, npm run build erzeugt
das build-Verzeichnis.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-14 15:59:31 +02:00
Daniel Michelberger
e54a2c611a chore: PocketBase auf 0.39.11 aktualisieren
Der Pin stand auf 0.39.6, aktuelles Release ist 0.39.11. Reine Patch-Updates
innerhalb 0.39, keine Schema- oder API-Aenderungen, aber sicherheitsrelevant:
0.39.7 ersetzt ozzo-validation durch einen eigenen Fork, nachdem die
Originalbibliothek den Besitzer gewechselt hat; 0.39.8 und 0.39.11 ziehen
Sicherheitsfixes der golang.org/x-Abhaengigkeiten nach.

Version an beiden aktiven Stellen gesetzt (Dockerfile-ARG und der Default in
docker-compose.yaml). Die Planungsdokumente unter docs/ bleiben unangetastet,
sie halten den Stand ihrer Entstehung fest.

.env.example um den Deployment-Fall ergaenzt: Beim Deployment gibt es keine
.env-Datei, dieselben Variablen werden in Coolify als Environment Variables
gesetzt. Ausserdem der Hinweis, dass SUPERUSER_* nur greift, solange noch kein
Superuser existiert — nachtraegliche Aenderungen wirken nicht mehr.

Verifiziert: Image gebaut, Binary meldet 0.39.11, alle Migrationen laufen
gegen eine frische Datenbank durch, alle elf Collections vorhanden,
Team-Anlage als normaler User erfolgreich.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-14 15:52:00 +02:00
5 changed files with 67 additions and 58 deletions

View file

@ -2,16 +2,27 @@
# cp .env.example .env # cp .env.example .env
# #
# Diese Datei enthält nur Platzhalter und ist versioniert. Die echte .env steht # Diese Datei enthält nur Platzhalter und ist versioniert. Die echte .env steht
# in .gitignore und darf nicht committet werden. # in .gitignore und darf nicht committet werden. Niemals echte Zugangsdaten
# hier eintragen.
#
# Beim Deployment (Coolify) gibt es keine .env-Datei: Dieselben Variablen werden
# dort in der Oberfläche unter Environment Variables gesetzt. Docker Compose
# liest sie nur lokal aus dieser Datei — der entrypoint sieht in beiden Fällen
# schlicht Umgebungsvariablen und verhält sich identisch.
# Admin-Zugang, wird nur beim allerersten Start angelegt. Existiert der Account # Admin-Zugang, wird nur beim allerersten Start angelegt. Existiert der Account
# bereits, bleibt das Passwort unverändert — spätere Änderungen gehören ins # bereits, bleibt das Passwort unverändert — spätere Änderungen gehören ins
# Admin-UI, nicht in diese Datei. Mindestens 8 Zeichen. # Admin-UI, nicht in diese Datei. Mindestens 8 Zeichen.
# Beide Variablen weglassen = PocketBase gibt beim ersten Start einen # Beide Variablen weglassen = PocketBase gibt beim ersten Start einen
# Installer-Link im Log aus (30 Minuten gültig). # Installer-Link im Log aus (30 Minuten gültig).
#
# Wichtig fürs Deployment: Die Variablen wirken nur, solange noch kein
# Superuser existiert. Sie nachträglich zu ändern hat keine Wirkung; das
# Passwort wird dann ausschließlich im Admin-UI geändert. Details und alle
# Fälle in README.md, Abschnitt „Superuser-Verhalten".
SUPERUSER_EMAIL=admin@example.de SUPERUSER_EMAIL=admin@example.de
SUPERUSER_PASSWORD=bitte-aendern-min-8-zeichen SUPERUSER_PASSWORD=bitte-aendern-min-8-zeichen
# Optional: überschreibt den in docker-compose.yaml gepinnten Default. # Optional: überschreibt den in docker-compose.yaml gepinnten Default.
# Nur setzen, wenn bewusst eine andere PocketBase-Version gebaut werden soll. # Nur setzen, wenn bewusst eine andere PocketBase-Version gebaut werden soll.
#PB_VERSION=0.39.6 #PB_VERSION=0.39.11

View file

@ -4,7 +4,7 @@ FROM alpine:3.21
# pocketbase_<version>_linux_amd64.zip, ein "latest" gibt es nicht. Ohne Pin # pocketbase_<version>_linux_amd64.zip, ein "latest" gibt es nicht. Ohne Pin
# zöge jeder Redeploy unangekündigt eine neue Version inklusive möglicher # zöge jeder Redeploy unangekündigt eine neue Version inklusive möglicher
# DB-Schema-Migrationen. # DB-Schema-Migrationen.
ARG PB_VERSION=0.39.6 ARG PB_VERSION=0.39.11
RUN apk add --no-cache ca-certificates unzip wget RUN apk add --no-cache ca-certificates unzip wget

View file

@ -4,7 +4,7 @@ services:
context: . context: .
args: args:
# Version-Pin. Update: hier bzw. im Dockerfile hochsetzen und committen. # Version-Pin. Update: hier bzw. im Dockerfile hochsetzen und committen.
PB_VERSION: ${PB_VERSION:-0.39.6} PB_VERSION: ${PB_VERSION:-0.39.11}
restart: unless-stopped restart: unless-stopped
ports: ports:
- "8090:8090" - "8090:8090"

View file

@ -27,7 +27,7 @@
"@tailwindcss/vite": "^4.1.13", "@tailwindcss/vite": "^4.1.13",
"bits-ui": "^2.18.1", "bits-ui": "^2.18.1",
"clsx": "^2.1.1", "clsx": "^2.1.1",
"jsdom": "^30.0.1", "jsdom": "^29.1.1",
"pocketbase-typegen": "^1.3.1", "pocketbase-typegen": "^1.3.1",
"svelte": "^5.39.5", "svelte": "^5.39.5",
"svelte-check": "^4.3.2", "svelte-check": "^4.3.2",
@ -44,58 +44,56 @@
} }
}, },
"node_modules/@asamuzakjp/css-color": { "node_modules/@asamuzakjp/css-color": {
"version": "6.0.5", "version": "5.1.11",
"resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-6.0.5.tgz", "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-5.1.11.tgz",
"integrity": "sha512-mbhpPMmnw/kwW19aRNmSUl1QzLbdGo1SCuE49BT98MNwqF6zaHb3o2owssFc/PEO/4t2UjqtCNwocuDtJornzA==", "integrity": "sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@csstools/css-calc": "^3.2.1", "@asamuzakjp/generational-cache": "^1.0.1",
"@csstools/css-color-parser": "^4.1.9", "@csstools/css-calc": "^3.2.0",
"@csstools/css-color-parser": "^4.1.0",
"@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-parser-algorithms": "^4.0.0",
"@csstools/css-tokenizer": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0"
"lru-cache": "^11.5.2"
}, },
"engines": { "engines": {
"node": "^22.13.0 || >=24.0.0" "node": "^20.19.0 || ^22.12.0 || >=24.0.0"
}
},
"node_modules/@asamuzakjp/css-color/node_modules/lru-cache": {
"version": "11.5.2",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz",
"integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==",
"dev": true,
"license": "BlueOak-1.0.0",
"engines": {
"node": "20 || >=22"
} }
}, },
"node_modules/@asamuzakjp/dom-selector": { "node_modules/@asamuzakjp/dom-selector": {
"version": "8.3.2", "version": "7.1.1",
"resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-8.3.2.tgz", "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-7.1.1.tgz",
"integrity": "sha512-93Z1N+BQNXysodoicpOIyNh2drHfz/CTf9nnT0FEx72GJcIiwgydD7tGAr78j41LsYn3hlRn+LdGPuBLn1Bl8Q==", "integrity": "sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@asamuzakjp/generational-cache": "^1.0.1",
"@asamuzakjp/nwsapi": "^2.3.9",
"bidi-js": "^1.0.3", "bidi-js": "^1.0.3",
"css-tree": "^3.2.1", "css-tree": "^3.2.1",
"is-potential-custom-element-name": "^1.0.1", "is-potential-custom-element-name": "^1.0.1"
"lru-cache": "^11.5.2"
}, },
"engines": { "engines": {
"node": "^22.13.0 || >=24.0.0" "node": "^20.19.0 || ^22.12.0 || >=24.0.0"
} }
}, },
"node_modules/@asamuzakjp/dom-selector/node_modules/lru-cache": { "node_modules/@asamuzakjp/generational-cache": {
"version": "11.5.2", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", "resolved": "https://registry.npmjs.org/@asamuzakjp/generational-cache/-/generational-cache-1.0.1.tgz",
"integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", "integrity": "sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==",
"dev": true, "dev": true,
"license": "BlueOak-1.0.0", "license": "MIT",
"engines": { "engines": {
"node": "20 || >=22" "node": "^20.19.0 || ^22.12.0 || >=24.0.0"
} }
}, },
"node_modules/@asamuzakjp/nwsapi": {
"version": "2.3.9",
"resolved": "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz",
"integrity": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==",
"dev": true,
"license": "MIT"
},
"node_modules/@bramus/specificity": { "node_modules/@bramus/specificity": {
"version": "2.4.2", "version": "2.4.2",
"resolved": "https://registry.npmjs.org/@bramus/specificity/-/specificity-2.4.2.tgz", "resolved": "https://registry.npmjs.org/@bramus/specificity/-/specificity-2.4.2.tgz",
@ -3617,39 +3615,39 @@
} }
}, },
"node_modules/jsdom": { "node_modules/jsdom": {
"version": "30.0.1", "version": "29.1.1",
"resolved": "https://registry.npmjs.org/jsdom/-/jsdom-30.0.1.tgz", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-29.1.1.tgz",
"integrity": "sha512-52v7mUVUfNQVYYqE1lcdaymWL0njO7lTLUog6ZvW2U5KsbiLk/GnZlVJ+qx0xfNJZ6Gn+KSpPNE52vurbxZwrA==", "integrity": "sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@asamuzakjp/css-color": "^6.0.5", "@asamuzakjp/css-color": "^5.1.11",
"@asamuzakjp/dom-selector": "^8.3.0", "@asamuzakjp/dom-selector": "^7.1.1",
"@bramus/specificity": "^2.4.2", "@bramus/specificity": "^2.4.2",
"@csstools/css-syntax-patches-for-csstree": "^1.1.7", "@csstools/css-syntax-patches-for-csstree": "^1.1.3",
"@exodus/bytes": "^1.15.1", "@exodus/bytes": "^1.15.0",
"css-tree": "^3.2.1", "css-tree": "^3.2.1",
"data-urls": "^7.0.0", "data-urls": "^7.0.0",
"decimal.js": "^10.6.0", "decimal.js": "^10.6.0",
"html-encoding-sniffer": "^6.0.0", "html-encoding-sniffer": "^6.0.0",
"is-potential-custom-element-name": "^1.0.1", "is-potential-custom-element-name": "^1.0.1",
"lru-cache": "^11.5.2", "lru-cache": "^11.3.5",
"parse5": "^8.0.1", "parse5": "^8.0.1",
"saxes": "^6.0.0", "saxes": "^6.0.0",
"symbol-tree": "^3.2.4", "symbol-tree": "^3.2.4",
"tough-cookie": "^6.0.2", "tough-cookie": "^6.0.1",
"undici": "^8.9.0", "undici": "^7.25.0",
"w3c-xmlserializer": "^5.0.0", "w3c-xmlserializer": "^5.0.0",
"webidl-conversions": "^8.0.1", "webidl-conversions": "^8.0.1",
"whatwg-mimetype": "^5.0.0", "whatwg-mimetype": "^5.0.0",
"whatwg-url": "^17.1.0", "whatwg-url": "^16.0.1",
"xml-name-validator": "^5.0.0" "xml-name-validator": "^5.0.0"
}, },
"engines": { "engines": {
"node": "^22.22.2 || ^24.15.0 || >=26.0.0" "node": "^20.19.0 || ^22.13.0 || >=24.0.0"
}, },
"peerDependencies": { "peerDependencies": {
"canvas": "^3.2.3" "canvas": "^3.0.0"
}, },
"peerDependenciesMeta": { "peerDependenciesMeta": {
"canvas": { "canvas": {
@ -3691,18 +3689,18 @@
} }
}, },
"node_modules/jsdom/node_modules/whatwg-url": { "node_modules/jsdom/node_modules/whatwg-url": {
"version": "17.1.0", "version": "16.0.1",
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-17.1.0.tgz", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-16.0.1.tgz",
"integrity": "sha512-3GeworPmc2ZfEEHP7lEbUfBX/L75wdEsi0rLNhXcXxnoN5jyq0SL5gCy06SGW2cyTIZdTvWIDQNQoza++vKeaw==", "integrity": "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@exodus/bytes": "^1.15.1", "@exodus/bytes": "^1.11.0",
"tr46": "^6.0.0", "tr46": "^6.0.0",
"webidl-conversions": "^8.0.1" "webidl-conversions": "^8.0.1"
}, },
"engines": { "engines": {
"node": "^22.14.0 || >=24.0.0" "node": "^20.19.0 || ^22.12.0 || >=24.0.0"
} }
}, },
"node_modules/json-stringify-pretty-compact": { "node_modules/json-stringify-pretty-compact": {
@ -5987,13 +5985,13 @@
} }
}, },
"node_modules/undici": { "node_modules/undici": {
"version": "8.10.0", "version": "7.29.0",
"resolved": "https://registry.npmjs.org/undici/-/undici-8.10.0.tgz", "resolved": "https://registry.npmjs.org/undici/-/undici-7.29.0.tgz",
"integrity": "sha512-HvltHd7avK13QIw/oLe4qoOLyoVSoafqJ2jYOrtMRBkbYT31eiBQ8O0ehRKZiEZCMEyLFQNIADpgCWC5fALvYQ==", "integrity": "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=22.19.0" "node": ">=20.18.1"
} }
}, },
"node_modules/unique-filename": { "node_modules/unique-filename": {

View file

@ -28,7 +28,7 @@
"@tailwindcss/vite": "^4.1.13", "@tailwindcss/vite": "^4.1.13",
"bits-ui": "^2.18.1", "bits-ui": "^2.18.1",
"clsx": "^2.1.1", "clsx": "^2.1.1",
"jsdom": "^30.0.1", "jsdom": "^29.1.1",
"pocketbase-typegen": "^1.3.1", "pocketbase-typegen": "^1.3.1",
"svelte": "^5.39.5", "svelte": "^5.39.5",
"svelte-check": "^4.3.2", "svelte-check": "^4.3.2",