Aggiornamento massivo: aggiunto backend PostgreSQL per statistiche aste con fallback SQLite, nuovi modelli e servizi, UI moderna con grafici interattivi, refactoring stato applicazione (ApplicationStateService), documentazione completa per deploy Docker/Unraid/Gitea, nuovi CSS e script JS per UX avanzata, template Unraid, test database, e workflow CI/CD estesi. Pronto per produzione e analisi avanzate.
9.5 KiB
9.5 KiB
PostgreSQL Setup - AutoBidder Statistics
?? Overview
AutoBidder utilizza PostgreSQL per statistiche avanzate e analisi strategiche delle aste concluse. Il sistema supporta dual-database:
- PostgreSQL: Statistiche persistenti e analisi avanzate
- SQLite: Fallback locale se PostgreSQL non disponibile
?? Quick Start
Development (Locale)
# 1. Avvia PostgreSQL con Docker
docker run -d \
--name autobidder-postgres \
-e POSTGRES_DB=autobidder_stats \
-e POSTGRES_USER=autobidder \
-e POSTGRES_PASSWORD=autobidder_password \
-p 5432:5432 \
postgres:16-alpine
# 2. Avvia AutoBidder
dotnet run
# 3. Verifica logs
# Dovresti vedere:
# [PostgreSQL] Connection successful
# [PostgreSQL] Schema created successfully
# [PostgreSQL] Statistics features ENABLED
Production (Docker Compose)
# 1. Configura variabili ambiente
cp .env.example .env
nano .env # Modifica POSTGRES_PASSWORD
# 2. Avvia stack completo
docker-compose up -d
# 3. Verifica stato
docker-compose ps
docker-compose logs -f autobidder
docker-compose logs -f postgres
?? Schema Database
Tabelle Create Automaticamente
completed_auctions
Aste concluse con dettagli completi per analisi strategiche.
| Colonna | Tipo | Descrizione |
|---|---|---|
| id | SERIAL | Primary key |
| auction_id | VARCHAR(100) | ID univoco asta (indexed) |
| product_name | VARCHAR(500) | Nome prodotto (indexed) |
| final_price | DECIMAL(10,2) | Prezzo finale |
| buy_now_price | DECIMAL(10,2) | Prezzo "Compra Subito" |
| total_bids | INTEGER | Puntate totali asta |
| my_bids_count | INTEGER | Mie puntate |
| won | BOOLEAN | Asta vinta? (indexed) |
| winner_username | VARCHAR(100) | Username vincitore |
| average_latency | DECIMAL(10,2) | Latency media (ms) |
| savings | DECIMAL(10,2) | Risparmio effettivo |
| completed_at | TIMESTAMP | Data/ora completamento (indexed) |
product_statistics
Statistiche aggregate per prodotto.
| Colonna | Tipo | Descrizione |
|---|---|---|
| id | SERIAL | Primary key |
| product_key | VARCHAR(200) | Chiave univoca prodotto (unique) |
| product_name | VARCHAR(500) | Nome prodotto |
| average_winning_bids | DECIMAL(10,2) | Media puntate vincenti |
| recommended_max_bids | INTEGER | Suggerimento strategico |
| recommended_max_price | DECIMAL(10,2) | Suggerimento strategico |
| competition_level | VARCHAR(20) | Low/Medium/High |
| last_updated | TIMESTAMP | Ultimo aggiornamento |
bidder_performances
Performance puntatori concorrenti.
| Colonna | Tipo | Descrizione |
|---|---|---|
| id | SERIAL | Primary key |
| username | VARCHAR(100) | Username puntatore (unique) |
| total_auctions | INTEGER | Aste totali |
| auctions_won | INTEGER | Aste vinte |
| win_rate | DECIMAL(5,2) | Percentuale vittorie (indexed) |
| average_bids_per_auction | DECIMAL(10,2) | Media puntate/asta |
| is_aggressive | BOOLEAN | Puntatore aggressivo? |
daily_metrics
Metriche giornaliere aggregate.
| Colonna | Tipo | Descrizione |
|---|---|---|
| id | SERIAL | Primary key |
| date | DATE | Data (unique) |
| total_bids_used | INTEGER | Puntate usate |
| money_spent | DECIMAL(10,2) | Spesa totale |
| win_rate | DECIMAL(5,2) | Win rate giornaliero |
| roi | DECIMAL(10,2) | ROI % |
strategic_insights
Raccomandazioni strategiche generate automaticamente.
| Colonna | Tipo | Descrizione |
|---|---|---|
| id | SERIAL | Primary key |
| insight_type | VARCHAR(50) | Tipo insight (indexed) |
| product_key | VARCHAR(200) | Prodotto riferimento |
| recommended_action | TEXT | Azione consigliata |
| confidence_level | DECIMAL(5,2) | Livello confidenza (0-100) |
| is_active | BOOLEAN | Insight attivo? |
?? Configurazione
appsettings.json
{
"ConnectionStrings": {
"PostgresStats": "Host=localhost;Port=5432;Database=autobidder_stats;Username=autobidder;Password=autobidder_password",
"PostgresStatsProduction": "Host=postgres;Port=5432;Database=autobidder_stats;Username=${POSTGRES_USER};Password=${POSTGRES_PASSWORD}"
},
"Database": {
"UsePostgres": true,
"AutoCreateSchema": true,
"FallbackToSQLite": true
}
}
.env (Production)
# PostgreSQL
POSTGRES_USER=autobidder
POSTGRES_PASSWORD=your_secure_password_here
POSTGRES_DB=autobidder_stats
# Database config
DATABASE_USE_POSTGRES=true
DATABASE_AUTO_CREATE_SCHEMA=true
DATABASE_FALLBACK_TO_SQLITE=true
?? Utilizzo API
Registra Asta Conclusa
// Chiamato automaticamente da AuctionMonitor
await statsService.RecordAuctionCompletedAsync(auction, won: true);
Ottieni Raccomandazioni Strategiche
// Raccomandazioni per prodotto specifico
var productKey = GenerateProductKey("iPhone 15 Pro");
var insights = await statsService.GetStrategicInsightsAsync(productKey);
foreach (var insight in insights)
{
Console.WriteLine($"{insight.InsightType}: {insight.RecommendedAction}");
Console.WriteLine($"Confidence: {insight.ConfidenceLevel}%");
}
Analisi Competitori
// Top 10 puntatori più vincenti
var competitors = await statsService.GetTopCompetitorsAsync(10);
foreach (var competitor in competitors)
{
Console.WriteLine($"{competitor.Username}: {competitor.WinRate}% win rate");
if (competitor.IsAggressive)
{
Console.WriteLine(" ?? AGGRESSIVE BIDDER - Avoid competition");
}
}
Statistiche Prodotto
// Ottieni statistiche per strategia bidding
var productKey = GenerateProductKey("PlayStation 5");
var stat = await postgresDb.ProductStatistics
.FirstOrDefaultAsync(p => p.ProductKey == productKey);
if (stat != null)
{
Console.WriteLine($"Recommended max bids: {stat.RecommendedMaxBids}");
Console.WriteLine($"Recommended max price: €{stat.RecommendedMaxPrice}");
Console.WriteLine($"Competition level: {stat.CompetitionLevel}");
}
?? Troubleshooting
PostgreSQL non si connette
[PostgreSQL] Cannot connect to database
[PostgreSQL] Statistics features will use SQLite fallback
Soluzione:
- Verifica che PostgreSQL sia in esecuzione:
docker ps | grep postgres - Controlla connection string in
appsettings.json - Verifica credenziali in
.env - Check logs PostgreSQL:
docker logs autobidder-postgres
Schema non creato
[PostgreSQL] Schema validation failed
[PostgreSQL] Statistics features DISABLED (missing tables)
Soluzione:
- Abilita auto-creazione in
appsettings.json:"AutoCreateSchema": true - Riavvia applicazione:
docker-compose restart autobidder - Verifica permessi utente PostgreSQL
- Check logs dettagliati:
docker-compose logs -f autobidder
Fallback a SQLite
Se PostgreSQL non è disponibile, AutoBidder usa automaticamente SQLite locale:
- ? Nessun downtime
- ? Statistiche base funzionanti
- ?? Insight strategici disabilitati
?? Backup PostgreSQL
Manuale
# Backup database
docker exec autobidder-postgres pg_dump -U autobidder autobidder_stats > backup.sql
# Restore
docker exec -i autobidder-postgres psql -U autobidder autobidder_stats < backup.sql
Automatico (con Docker Compose)
# Backup in ./postgres-backups/
docker-compose exec postgres pg_dump -U autobidder autobidder_stats \
> ./postgres-backups/backup_$(date +%Y%m%d_%H%M%S).sql
?? Monitoraggio
Connessione Database
# Entra in PostgreSQL shell
docker exec -it autobidder-postgres psql -U autobidder -d autobidder_stats
# Query utili
SELECT COUNT(*) FROM completed_auctions;
SELECT COUNT(*) FROM product_statistics;
SELECT * FROM daily_metrics ORDER BY date DESC LIMIT 7;
Statistiche Utilizzo
-- Aste concluse per giorno (ultimi 30 giorni)
SELECT
DATE(completed_at) as date,
COUNT(*) as total_auctions,
SUM(CASE WHEN won THEN 1 ELSE 0 END) as won,
ROUND(AVG(my_bids_count), 2) as avg_bids
FROM completed_auctions
WHERE completed_at >= NOW() - INTERVAL '30 days'
GROUP BY DATE(completed_at)
ORDER BY date DESC;
-- Top 10 prodotti più competitivi
SELECT
product_name,
total_auctions,
average_winning_bids,
competition_level
FROM product_statistics
ORDER BY average_winning_bids DESC
LIMIT 10;
?? Performance
Indici Creati Automaticamente
idx_auction_idsucompleted_auctions(auction_id)idx_product_namesucompleted_auctions(product_name)idx_completed_atsucompleted_auctions(completed_at)idx_wonsucompleted_auctions(won)idx_usernamesubidder_performances(username)[UNIQUE]idx_win_ratesubidder_performances(win_rate)idx_product_keysuproduct_statistics(product_key)[UNIQUE]idx_datesudaily_metrics(date)[UNIQUE]
Ottimizzazioni
- Retry automatico su fallimenti (3 tentativi)
- Timeout comandi: 30 secondi
- Connection pooling gestito da Npgsql
- Transazioni ACID per consistenza dati
?? Roadmap
Prossime Features
- Auto-generazione Insights: Analisi pattern vincenti automatica
- Heatmap Competizione: Orari migliori per puntare
- ML Predictions: Predizione probabilità vittoria
- Alert System: Notifiche su insight critici
- Export Analytics: CSV/Excel per analisi esterna
- Backup Scheduler: Backup automatici giornalieri
?? Riferimenti
Sistema PostgreSQL completamente integrato e pronto per analisi strategiche avanzate! ????