From 32ed02c1f3d98e29bf702cbca4659e6917a211e9 Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Tue, 10 Feb 2026 18:37:42 +0000 Subject: [PATCH] fix: TypeScript build errors and add production deployment - Fix handle color type safety - Fix RoundedBox args tuple type - Remove invalid ellipseGeometry - Add PM2 ecosystem config - Add SSL setup automation script Co-Authored-By: Claude Opus 4.6 --- components/configurator/handles-3d.tsx | 32 +++---- ecosystem.config.js | 16 ++++ setup-ssl.sh | 124 +++++++++++++++++++++++++ 3 files changed, 153 insertions(+), 19 deletions(-) create mode 100644 ecosystem.config.js create mode 100755 setup-ssl.sh diff --git a/components/configurator/handles-3d.tsx b/components/configurator/handles-3d.tsx index 2c5b567..784ee65 100644 --- a/components/configurator/handles-3d.tsx +++ b/components/configurator/handles-3d.tsx @@ -26,15 +26,15 @@ const HandleMaterial = ({ color }: { color: string }) => ( * Classic industrial style, common on steel pivot doors */ export function Beugelgreep({ finish, doorHeight, railDepth }: HandleProps) { - const color = { + const color = ({ zwart: "#1a1a1a", brons: "#8B6F47", grijs: "#525252", - }[finish]; + }[finish] || "#1a1a1a") as string; const handleLength = Math.min(doorHeight * 0.35, 0.8); // Max 80cm const barDiameter = 0.025; // 25mm diameter bar - const mountBlockSize = [0.04, 0.06, 0.03]; // Mount block dimensions + const mountBlockSize: [number, number, number] = [0.04, 0.06, 0.03]; // Mount block dimensions return ( @@ -83,11 +83,11 @@ export function Beugelgreep({ finish, doorHeight, railDepth }: HandleProps) { * Minimalist flush-mount design */ export function Hoekgreep({ finish, doorWidth, railDepth, stileWidth }: HandleProps) { - const color = { + const color = ({ zwart: "#1a1a1a", brons: "#8B6F47", grijs: "#525252", - }[finish]; + }[finish] || "#1a1a1a") as string; const horizontalLength = 0.15; // 15cm horizontal const verticalLength = 0.12; // 12cm vertical @@ -132,11 +132,11 @@ export function Hoekgreep({ finish, doorWidth, railDepth, stileWidth }: HandlePr * Elegant curved design for flush doors */ export function Maangreep({ finish, doorWidth, railDepth, stileWidth }: HandleProps) { - const color = { + const color = ({ zwart: "#1a1a1a", brons: "#8B6F47", grijs: "#525252", - }[finish]; + }[finish] || "#1a1a1a") as string; const curveRadius = 0.08; // 8cm radius const handleDepth = 0.025; // 25mm deep recess @@ -179,11 +179,11 @@ export function Maangreep({ finish, doorWidth, railDepth, stileWidth }: HandlePr * Modern minimalist design */ export function Ovaalgreep({ finish, doorWidth, railDepth, stileWidth }: HandleProps) { - const color = { + const color = ({ zwart: "#1a1a1a", brons: "#8B6F47", grijs: "#525252", - }[finish]; + }[finish] || "#1a1a1a") as string; // Create oval shape using THREE.Shape const shape = new THREE.Shape(); @@ -217,12 +217,6 @@ export function Ovaalgreep({ finish, doorWidth, railDepth, stileWidth }: HandleP - - {/* Inner void (make it a ring, not solid) */} - - - - ); } @@ -232,11 +226,11 @@ export function Ovaalgreep({ finish, doorWidth, railDepth, stileWidth }: HandleP * Classic hinged door handle */ export function Klink({ finish, doorWidth, railDepth, stileWidth }: HandleProps) { - const color = { + const color = ({ zwart: "#1a1a1a", brons: "#8B6F47", grijs: "#525252", - }[finish]; + }[finish] || "#1a1a1a") as string; const leverLength = 0.12; // 12cm lever const leverThickness = 0.015; // 15mm thick @@ -285,11 +279,11 @@ export function Klink({ finish, doorWidth, railDepth, stileWidth }: HandleProps) * Straight vertical bar for pivot doors */ export function UGreep({ finish, railDepth }: HandleProps) { - const color = { + const color = ({ zwart: "#1a1a1a", brons: "#8B6F47", grijs: "#525252", - }[finish]; + }[finish] || "#1a1a1a") as string; return ( /dev/null <<'EOF' +server { + listen 80; + listen [::]:80; + server_name proinn.youztech.nl; + + location /.well-known/acme-challenge/ { + root /var/www/html; + } + + location / { + return 301 https://$host$request_uri; + } +} + +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name proinn.youztech.nl; + + ssl_certificate /etc/letsencrypt/live/proinn.youztech.nl/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/proinn.youztech.nl/privkey.pem; + include /etc/letsencrypt/options-ssl-nginx.conf; + ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; + + # Security headers + add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + + location / { + proxy_pass http://127.0.0.1:3002; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_cache_bypass $http_upgrade; + proxy_read_timeout 300s; + proxy_connect_timeout 75s; + } + + # Optimize for Next.js static assets + location /_next/static { + proxy_pass http://127.0.0.1:3002; + proxy_cache_valid 60m; + add_header Cache-Control "public, immutable, max-age=31536000"; + } + + # Optimize for images + location ~* \.(jpg|jpeg|png|gif|ico|svg|webp)$ { + proxy_pass http://127.0.0.1:3002; + expires 30d; + add_header Cache-Control "public, immutable"; + } +} +EOF + +# Test nginx config +sudo nginx -t + +if [ $? -ne 0 ]; then + echo -e "${RED}Nginx configuration test failed!${NC}" + exit 1 +fi + +# Reload nginx +sudo systemctl reload nginx + +echo -e "${GREEN}✓ Nginx reloaded with HTTPS!${NC}" +echo "" +echo -e "${GREEN}═══════════════════════════════════════════${NC}" +echo -e "${GREEN} 🎉 DEPLOYMENT COMPLETE! 🎉${NC}" +echo -e "${GREEN}═══════════════════════════════════════════${NC}" +echo "" +echo -e "Your site is now live at:" +echo -e "${GREEN}https://proinn.youztech.nl/offerte${NC}" +echo "" +echo "SSL certificate will auto-renew via certbot."