Skip to Content
TecnicaInfrastruttura🔍 Differenze Locale vs Produzione

🔍 Differenze Locale vs Produzione

Perché funziona in locale ma non in produzione?

Differenze Chiave

AspettoLocaleProduzioneImpatto
NODE_ENVdevelopmentproductionCookie secure: false vs true
Dominiolocalhost:3000foodcostapp.meating3srl.itDominio cookie diverso
Proxy❌ Nessuno✅ NginxHeaders/cookies modificati
HTTPS❌ HTTP✅ HTTPSCookie secure richiede HTTPS
JWT_SECRETDa .env.localDa variabili d’ambiente serverPotrebbero essere diversi!

🎯 Problema Più Probabile: JWT_SECRET Diverso

Verifica Immediata

Sul server di produzione:

# Controlla quale JWT_SECRET usa PM2 pm2 show foodcost | grep JWT_SECRET # O guarda le variabili d'ambiente pm2 env 0 # O controlla nel processo cat /proc/$(pgrep -f "next start")/environ | tr '\0' '\n' | grep JWT_SECRET

Confronta con il tuo .env.local:

JWT_SECRET=foodcost-fdf80be24d2ef9a58c576a70ae5c2abdcce3359d6ddd8e34b8e283ddbafab213

Se JWT_SECRET è diverso o mancante

Nel server, crea/modifica /var/www/foodcost/.env.production:

cd /var/www/foodcost nano .env.production

Aggiungi:

NODE_ENV=production JWT_SECRET=foodcost-fdf80be24d2ef9a58c576a70ae5c2abdcce3359d6ddd8e34b8e283ddbafab213 MONGODB_URI=mongodb+srv://foodcost:r6HuNhyt8fYUAX0J@foodcluster.6idop17.mongodb.net/?retryWrites=true&w=majority&appName=FoodCluster # ... altre variabili ...

Poi riavvia PM2:

pm2 restart foodcost --update-env

🔧 Altri Possibili Problemi

Test: Il certificato SSL è valido?

curl -I https://foodcostapp.meating3srl.it

Deve ritornare 200 OK e non errori SSL.

Verifica config Nginx:

sudo cat /etc/nginx/sites-available/foodcost | grep -A 10 "location /"

Deve avere:

proxy_set_header Host $host; proxy_pass_header Set-Cookie;

3. Next.js in produzione non legge .env.local

Next.js ignora .env.local in produzione! Usa solo:

  • .env.production
  • .env.production.local
  • Variabili d’ambiente del sistema

Soluzione: Sposta tutte le variabili in .env.production sul server.


🧪 Test Rapido

Verifica se il problema è il JWT_SECRET

Temporaneamente, commenta la validazione nel middleware:

// middleware.ts try { const decoded = jwt.verify(token, JWT_SECRET); console.log(`[MIDDLEWARE] Token decoded:`, decoded); // ← AGGIUNGI QUESTO console.log(`[MIDDLEWARE] ✅ Token valid for path: ${pathname}`); return NextResponse.next(); } catch (error) { console.error(`[MIDDLEWARE] ❌ Error:`, error); // ← DETTAGLI ERRORE // ... }

Nei log vedrai:

  • Se il problema è invalid signature → JWT_SECRET diverso
  • Se il problema è jwt expired → Token scaduto
  • Se il problema è jwt malformed → Token corrotto

🎯 Soluzione Probabilmente Definitiva

Crea un file .env.production sul server con TUTTE le variabili:

# Sul server cd /var/www/foodcost cat > .env.production << 'EOF' NODE_ENV=production JWT_SECRET=foodcost-fdf80be24d2ef9a58c576a70ae5c2abdcce3359d6ddd8e34b8e283ddbafab213 MONGODB_URI=mongodb+srv://foodcost:r6HuNhyt8fYUAX0J@foodcluster.6idop17.mongodb.net/?retryWrites=true&w=majority&appName=FoodCluster REDIS_HOST=localhost REDIS_PORT=6379 REDIS_PASSWORD=LhJGcubEia13F6l3 PORT=4000 NEXT_PUBLIC_CASSAINCLOUD_API_KEY=bf4defa4-bebf-400a-ae7f-e72daa1e5447 CASSAINCLOUD_API_KEY=bf4defa4-bebf-400a-ae7f-e72daa1e5447 AWS_REGION=eu-north-1 AWS_ACCESS_KEY_ID=AKIAXHSUWWQVPEGRAZOM AWS_SECRET_ACCESS_KEY=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 AWS_S3_BUCKET=foodcostristostudio AWS_S3_PUBLIC_URL=https://foodcostristostudio.s3.eu-north-1.amazonaws.com EOF # Riavvia pm2 restart foodcost --update-env # Verifica che sia caricato pm2 logs foodcost | grep "JWT_SECRET"

✅ Checklist Finale

  • .env.production esiste sul server con JWT_SECRET corretto
  • PM2 riavviato con --update-env
  • Log mostrano il JWT_SECRET corretto (primi 10 caratteri)
  • Certificato SSL valido e HTTPS funzionante
  • Nginx passa correttamente gli headers
  • Cookie ha Domain=foodcostapp.meating3srl.it

TLDR: Il problema è quasi sicuramente che il JWT_SECRET in produzione è diverso o mancante. Next.js non legge .env.local in produzione, devi creare .env.production sul server.

Last updated on