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
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
# Copia prezzi.json sul PC tramite FileZilla
# Il file si trova in: /home/pi/monitora-prezzi/prezzi.json
Cambiare frequenza controllo prezzi
Modifica in server.js:
cron.schedule('*/15 * * * *', checkAllPrices);
// ^^^
// ogni 15 minuti (cambia questo numero)
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.