🔍 Differenze Locale vs Produzione
Perché funziona in locale ma non in produzione?
Differenze Chiave
| Aspetto | Locale | Produzione | Impatto |
|---|---|---|---|
| NODE_ENV | development | production | Cookie secure: false vs true |
| Dominio | localhost:3000 | foodcostapp.meating3srl.it | Dominio cookie diverso |
| Proxy | ❌ Nessuno | ✅ Nginx | Headers/cookies modificati |
| HTTPS | ❌ HTTP | ✅ HTTPS | Cookie secure richiede HTTPS |
| JWT_SECRET | Da .env.local | Da variabili d’ambiente server | Potrebbero 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_SECRETConfronta con il tuo .env.local:
JWT_SECRET=foodcost-fdf80be24d2ef9a58c576a70ae5c2abdcce3359d6ddd8e34b8e283ddbafab213Se JWT_SECRET è diverso o mancante
Nel server, crea/modifica /var/www/foodcost/.env.production:
cd /var/www/foodcost
nano .env.productionAggiungi:
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
1. Cookie Secure + HTTPS non configurato correttamente
Test: Il certificato SSL è valido?
curl -I https://foodcostapp.meating3srl.itDeve ritornare 200 OK e non errori SSL.
2. Nginx modifica/blocca i cookie
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.productionesiste 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