diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..2bd5a0a --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +22 diff --git a/deploy-production.sh b/deploy-production.sh index 560ab94..a85f393 100755 --- a/deploy-production.sh +++ b/deploy-production.sh @@ -64,6 +64,67 @@ install_dependencies() { fi } +use_project_node() { + export NVM_DIR="${NVM_DIR:-$HOME/.nvm}" + if [ -s "$NVM_DIR/nvm.sh" ]; then + # shellcheck disable=SC1090 + . "$NVM_DIR/nvm.sh" + if [ -f ".nvmrc" ]; then + echo " Using Node version from .nvmrc..." + nvm use + fi + fi +} + +ensure_node_version() { + if ! command -v node >/dev/null 2>&1; then + echo "ERROR: Node.js ist nicht im PATH." + exit 1 + fi + + local node_version + node_version="$(node -p 'process.versions.node')" + if ! node -e 'const [major, minor] = process.versions.node.split(".").map(Number); process.exit(major > 22 || (major === 22 && minor >= 12) ? 0 : 1)' >/dev/null 2>&1; then + echo "ERROR: Node.js >= 22.12.0 wird benötigt, aktuell ist $node_version aktiv." + echo "Bitte Node 22 installieren/aktivieren, z.B.:" + echo " nvm install 22" + echo " nvm alias default 22" + exit 1 + fi + + echo " Node.js $node_version" +} + +sync_public_documents_to_build() { + if [ ! -d "public/documents" ]; then + echo " No public/documents directory to sync" + return 0 + fi + + if [ ! -d ".output/public" ]; then + echo "ERROR: .output/public fehlt, kann public/documents nicht synchronisieren." + exit 1 + fi + + mkdir -p ".output/public/documents" + cp -a "public/documents/." ".output/public/documents/" + echo " ✓ public/documents -> .output/public/documents synchronisiert" + + local template_pdf="beitrittserklärung_template.pdf" + if [ -f "public/documents/$template_pdf" ]; then + local source_size output_size + source_size=$(stat -f%z "public/documents/$template_pdf" 2>/dev/null || stat -c%s "public/documents/$template_pdf" 2>/dev/null || echo "0") + output_size=$(stat -f%z ".output/public/documents/$template_pdf" 2>/dev/null || stat -c%s ".output/public/documents/$template_pdf" 2>/dev/null || echo "0") + + if [ "$source_size" != "$output_size" ] || [ "$source_size" = "0" ]; then + echo "ERROR: .output/public/documents/$template_pdf stimmt nicht mit public/documents überein (Source: $source_size, Output: $output_size)." + exit 1 + fi + + echo " ✓ $template_pdf im Build verifiziert ($output_size bytes)" + fi +} + echo "0. Ensuring persistent data directories (recommended)..." # IMPORTANT: Only symlink server/data if it's not tracked by git. if has_tracked_files_under "server/data"; then @@ -174,6 +235,8 @@ fi # 3. Install dependencies echo "" echo "3. Installing dependencies..." +use_project_node +ensure_node_version install_dependencies # 4. Remove old build (but keep data!) @@ -238,6 +301,10 @@ if [ "$BUILD_EXIT_CODE" -ne 0 ]; then exit 1 fi +echo "" +echo " Synchronizing public documents into build output..." +sync_public_documents_to_build + # Prüfe auf Warnungen im Build-Output, die auf Probleme hinweisen if echo "$BUILD_OUTPUT" | grep -qi "error\|failed\|missing"; then echo "" diff --git a/package-lock.json b/package-lock.json index fd96a6b..3a68ec2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "harheimertc-website", - "version": "1.0.0", + "version": "1.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "harheimertc-website", - "version": "1.0.0", + "version": "1.1.0", "hasInstallScript": true, "dependencies": { "@pinia/nuxt": "^0.11.2", @@ -41,6 +41,10 @@ "tailwindcss": "^3.4.0", "vitest": "^4.0.16", "vue-eslint-parser": "^10.2.0" + }, + "engines": { + "node": ">=22.12.0", + "npm": ">=10" } }, "node_modules/@alloc/quick-lru": { diff --git a/package.json b/package.json index 33e9496..5d399fc 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,10 @@ "description": "Moderne Webseite für den Harheimer Tischtennis Club", "private": true, "type": "module", + "engines": { + "node": ">=22.12.0", + "npm": ">=10" + }, "scripts": { "dev": "nuxt dev --port 3100", "build": "nuxt build",