Panoramica del progetto
Monitora Prezzi è una web app che gira su Raspberry Pi, sempre acceso, e monitora automaticamente i prezzi dei prodotti su Amazon, eBay e altri siti e-commerce.
Funzionalità principali
- Aggiunta prodotti tramite URL (Amazon, eBay, siti generici)
- Monitoraggio automatico ogni 15 minuti
- Notifica email quando il prezzo scende o raggiunge l'obiettivo
- Notifiche browser in tempo reale
- Storico prezzi con grafico
- Sistema multi-utente con login
- Installabile come PWA (app) su telefono
Architettura
- Backend: Node.js + Express
- Scraping: Axios + Cheerio
- Database: File JSON locale (
prezzi.json) - Scheduler: node-cron
- Email: Nodemailer + Gmail
- Auth: JWT + bcryptjs
- Web server: Apache con SSL (Let's Encrypt)
Struttura dei file
Prerequisiti
Sul Raspberry Pi
- Raspberry Pi con Raspberry OS (Debian)
- Node.js v18 o superiore
- Apache2 installato con certificato SSL (Let's Encrypt)
- Accesso SSH attivo
- IP statico locale (consigliato) o DHCP reservation
Sul PC
- FileZilla (per trasferire i file via SFTP)
- Un client SSH (es. PuTTY su Windows o terminale)
Account necessari
- Account Gmail per l'invio notifiche email
- App Password Gmail (non la password normale)
- Dominio dinamico (es.
sytes.nettramite No-IP)
Come ottenere la App Password Gmail
Vai su myaccount.google.com → Sicurezza
Attiva la Verifica in due passaggi se non è già attiva
Cerca "Password per le app" → App: Posta, Dispositivo: Altro → nome: monitora-prezzi
Clicca Genera → copia la password di 16 caratteri (tipo xxxx xxxx xxxx xxxx)
Trasferimento file con FileZilla
Connessione FileZilla
| Campo | Valore |
|---|---|
| Host | sftp://tuodominio.sytes.net |
| Nome utente | pi |
| Password | password SSH del Raspberry |
| Porta | 22 |
Cosa trasferire
Nel pannello destro di FileZilla, naviga in /home/pi/ e crea la cartella monitora-prezzi
Trascina nella cartella questi file (dal PC):
server.js,db.js,scraper.js,package.json,package-lock.json- La cartella intera
public/
node_modules (è enorme e si reinstalla direttamente sul Raspberry) né il file prezzi.json.
Installazione dipendenze Node.js
Connettiti via SSH al Raspberry e installa i pacchetti:
cd ~/monitora-prezzi
npm install
npm install cheerio@1.0.0 # versione compatibile con Node 18
Il comando scarica tutte le librerie definite in package.json. Puoi ignorare i WARN, gli errori importanti iniziano con npm error.
Dipendenze principali
| Pacchetto | Scopo |
|---|---|
express | Server web |
axios | Richieste HTTP per lo scraping |
cheerio | Parsing HTML (come jQuery lato server) |
node-cron | Scheduler per controlli automatici |
nodemailer | Invio email |
bcryptjs | Hash delle password utenti |
jsonwebtoken | Autenticazione JWT |
cors | Gestione CORS per le API |
PM2 - Avvio automatico
PM2 è un process manager per Node.js. Tiene l'app in esecuzione 24/7 e la riavvia automaticamente se crasha o se il Raspberry viene riavviato.
# Installa PM2 globalmente
sudo npm install -g pm2
# Avvia l'app
pm2 start server.js --name monitora-prezzi
# Configura avvio automatico al boot
pm2 startup
# IMPORTANTE: esegui il comando che ti mostra (inizia con "sudo env PATH=...")
# Salva la configurazione
pm2 save
Comandi PM2 utili
| Comando | Cosa fa |
|---|---|
pm2 status | Mostra stato dell'app |
pm2 restart monitora-prezzi | Riavvia (dopo aggiornamenti) |
pm2 logs monitora-prezzi | Vedi i log in tempo reale |
pm2 logs monitora-prezzi --lines 50 | Ultimi 50 log |
pm2 stop monitora-prezzi | Ferma l'app |
pm2 save, l'app si avvia automaticamente ad ogni accensione del Raspberry, senza intervento manuale.
Configurazione email Gmail
Crea il file config.json direttamente sul Raspberry via SSH:
nano ~/monitora-prezzi/config.json
Inserisci questo contenuto (con i tuoi dati):
{
"email": {
"from": "tuoemail@gmail.com",
"to": "tuoemail@gmail.com",
"password": "xxxx xxxx xxxx xxxx"
}
}
Salva con CTRL+X → Y → Invio
from→ il Gmail che invia le emailto→ non più usato (le email vanno alla mail di ogni utente)password→ la App Password di 16 caratteri (non la password Gmail normale)
Test invio email
curl -X POST http://localhost:3000/api/settings/test-email \
-H "Authorization: Bearer TUO_TOKEN_JWT"
Apache + HTTPS
1. Abilita moduli Apache
sudo a2enmod proxy proxy_http ssl
sudo systemctl restart apache2
2. Crea configurazione
sudo nano /etc/apache2/sites-available/monitora-prezzi.conf
Incolla:
Listen 3443
<VirtualHost *:3443>
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/TUODOMINIO.sytes.net/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/TUODOMINIO.sytes.net/privkey.pem
ProxyPreserveHost On
ProxyPass / http://localhost:3000/
ProxyPassReverse / http://localhost:3000/
</VirtualHost>
Sostituisci TUODOMINIO con il tuo dominio reale.
3. Attiva e riavvia
sudo a2ensite monitora-prezzi.conf
sudo systemctl restart apache2
L'app sarà accessibile su https://TUODOMINIO.sytes.net:3443
Port forwarding sul router
Trova l'IP locale del Raspberry
hostname -I
Prendi il primo indirizzo IPv4 (es. 192.168.1.180).
Regole da aggiungere sul router Vodafone
Accedi al pannello del router su 192.168.1.1 → Avanzate → NAT → Associazione porte
| Porta pubblica | Porta locale | IP locale | Protocollo | Scopo |
|---|---|---|---|---|
| 22 | 22 | 192.168.1.180 | TCP | SSH |
| 80 | 80 | 192.168.1.180 | TCP | HTTP sito |
| 443 | 443 | 192.168.1.180 | TCP | HTTPS sito |
| 3443 | 3443 | 192.168.1.180 | TCP | App Monitora Prezzi |
PWA - Installa come app
I file necessari sono già inclusi nel progetto:
public/manifest.json→ descrive l'app (nome, icona, colori)public/sw.js→ Service Worker per funzionamento offlinepublic/icon.png→ icona che appare sulla home screen
Come installare su Android (Chrome)
Apri Chrome e vai su https://TUODOMINIO.sytes.net:3443
Tocca i 3 puntini in alto a destra → "Aggiungi a schermata Home"
Conferma → l'icona appare nella schermata Home come un'app normale
Come installare su iPhone (Safari)
Apri Safari (non Chrome) e vai sull'URL dell'app
Tocca il pulsante Condividi (quadrato con freccia) → "Aggiungi a schermata Home"
Sistema di login multi-utente
Creazione primo utente admin
La prima volta, nessun utente esiste. Crea l'admin con questo comando SSH:
curl -X POST http://localhost:3000/api/auth/register \
-H "Content-Type: application/json" \
-d '{"username":"giuseppe","password":"tuapassword","email":"tua@gmail.com"}'
Gestione utenti dall'interfaccia
Accedi come admin → clicca sul tuo nome in alto a destra → Gestione Utenti:
- Aggiungi utente → username, email, password, flag admin
- Reset password → se un utente dimentica la password
- Elimina utente → rimuove utente e tutti i suoi prodotti
Come funzionano le notifiche multi-utente
- Ogni utente vede solo i propri prodotti
- Le notifiche email vengono inviate alla mail del singolo utente
- L'email è inviata dal Gmail configurato in
config.json - Ogni utente può impostare il proprio prezzo obiettivo per ogni prodotto
Sicurezza
- Le password sono salvate con hash bcrypt (non in chiaro)
- L'autenticazione usa token JWT con scadenza 30 giorni
- Ogni API richiede un token valido nell'header
Authorization
Utilizzo quotidiano
Aggiungere un prodotto
Apri la pagina prodotto su Amazon/eBay nel browser
Copia l'URL dalla barra degli indirizzi
Incollalo nel campo URL dell'app e (opzionale) inserisci il prezzo obiettivo
Clicca Aggiungi → l'app recupera subito il prezzo attuale
Siti supportati
| Sito | Affidabilità | Note |
|---|---|---|
| Amazon IT/EU | ⭐⭐⭐ | Anti-bot attivo, a volte richiede più tentativi |
| eBay | ⭐⭐⭐⭐ | Selettori dedicati, funziona bene |
| MediaWorld | ⭐⭐⭐⭐⭐ | JSON-LD strutturato, molto affidabile |
| Unieuro | ⭐⭐⭐⭐ | JSON-LD strutturato |
| Euronics | ⭐⭐⭐⭐ | Selettori dedicati |
| Siti WooCommerce | ⭐⭐⭐⭐ | Selettori standard WooCommerce |
| Siti generici | ⭐⭐⭐ | Usa selettori comuni, variabile |
Quando ricevo le notifiche?
- Quando aggiungi un prodotto e il prezzo è già sotto l'obiettivo
- Quando il prezzo scende rispetto all'ultimo rilevamento
- Quando il prezzo raggiunge l'obiettivo impostato
Frequenza controlli
L'app controlla i prezzi automaticamente ogni 15 minuti. Puoi forzare un controllo immediato con il pulsante "Aggiorna" sulla card del prodotto, o "Controlla tutti" per aggiornarli tutti.
Comandi utili SSH
PM2
pm2 status # stato app
pm2 restart monitora-prezzi # riavvia (dopo aggiornamenti file)
pm2 logs monitora-prezzi --lines 30 # ultimi 30 log
pm2 monit # monitor CPU/RAM in tempo reale
Aggiornare l'app (dopo modifiche file)
# 1. Carica i file aggiornati con FileZilla
# 2. Dal terminale SSH:
pm2 restart monitora-prezzi
Backup del database
Il file prezzi.json contiene tutto: utenti, prodotti, storico prezzi e notifiche. Fanne backup regolarmente!
Manuale (FileZilla): scarica /home/pi/monitora-prezzi/prezzi.json sul PC quando vuoi.
Automatico giornaliero: aggiungi un cron job che fa backup ogni notte alle 3:00 e mantiene solo gli ultimi 7 giorni:
crontab -e
Aggiungi in fondo al file:
0 3 * * * cp ~/monitora-prezzi/prezzi.json ~/backup-prezzi-$(date +\%Y\%m\%d).json && ls -t ~/backup-prezzi-*.json | tail -n +8 | xargs rm -f
Cambiare frequenza controllo prezzi
Modifica in server.js:
cron.schedule('*/15 * * * *', checkAllPrices);
// ^^^
// ogni 15 minuti (cambia questo numero)
Forzare controllo immediato di tutti i prodotti
Ottieni il token JWT dalla console del browser (F12 → Console):
localStorage.getItem('mp_token')
Poi esegui via SSH:
curl -X POST http://localhost:3000/api/check-all \
-H "Authorization: Bearer TUO_TOKEN_JWT"
Cambiare la password admin via SSH
# Ottieni prima il token JWT facendo login dall'app
# Poi usa il token per resettare la password di un utente (ID=1):
curl -X PATCH http://localhost:3000/api/users/1/password \
-H "Content-Type: application/json" \
-H "Authorization: Bearer TUO_TOKEN" \
-d '{"password":"nuovapassword"}'
Riavvio completo del Raspberry
sudo reboot
# Dopo il riavvio PM2 farà ripartire l'app automaticamente
pm2 restart monitora-prezzi per applicare le modifiche.