Files
Mimante/Mimante/Documentation/POSTGRESQL_SETUP.md
Alberto Balbo 61f0945db2 Supporto PostgreSQL, statistiche avanzate e nuova UI
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.
2026-01-18 17:52:05 +01:00

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:

  1. Verifica che PostgreSQL sia in esecuzione: docker ps | grep postgres
  2. Controlla connection string in appsettings.json
  3. Verifica credenziali in .env
  4. Check logs PostgreSQL: docker logs autobidder-postgres

Schema non creato

[PostgreSQL] Schema validation failed
[PostgreSQL] Statistics features DISABLED (missing tables)

Soluzione:

  1. Abilita auto-creazione in appsettings.json: "AutoCreateSchema": true
  2. Riavvia applicazione: docker-compose restart autobidder
  3. Verifica permessi utente PostgreSQL
  4. 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_id su completed_auctions(auction_id)
  • idx_product_name su completed_auctions(product_name)
  • idx_completed_at su completed_auctions(completed_at)
  • idx_won su completed_auctions(won)
  • idx_username su bidder_performances(username) [UNIQUE]
  • idx_win_rate su bidder_performances(win_rate)
  • idx_product_key su product_statistics(product_key) [UNIQUE]
  • idx_date su daily_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! ????