# PostgreSQL Setup This guide covers optional PostgreSQL database configuration. ## When to Use PostgreSQL PostgreSQL is recommended for: - Large datasets (millions of trades) - Multiple users - Advanced queries - Production deployments - High-performance requirements ## Installation ### Install PostgreSQL **Fedora/Bluefin**: ```bash sudo dnf install postgresql postgresql-server sudo postgresql-setup --initdb sudo systemctl enable postgresql sudo systemctl start postgresql ``` **Ubuntu/Debian**: ```bash sudo apt-get install postgresql postgresql-contrib sudo systemctl enable postgresql sudo systemctl start postgresql ``` ## Database Setup ### Create Database ```bash sudo -u postgres psql ``` ```sql CREATE DATABASE crypto_trader; CREATE USER crypto_trader_user WITH PASSWORD 'your_password'; GRANT ALL PRIVILEGES ON DATABASE crypto_trader TO crypto_trader_user; \q ``` ### Configure Connection Update `config.yaml`: ```yaml database: type: postgresql host: localhost port: 5432 database: crypto_trader user: crypto_trader_user password: ${DB_PASSWORD} # Use environment variable ``` ### Set Environment Variable ```bash export DB_PASSWORD='your_password' ``` Or add to `~/.bashrc`: ```bash echo 'export DB_PASSWORD="your_password"' >> ~/.bashrc ``` ## Migration from SQLite ### Export from SQLite ```bash sqlite3 trading.db .dump > dump.sql ``` ### Import to PostgreSQL ```bash psql -U crypto_trader_user -d crypto_trader -f dump.sql ``` ## Performance Tuning ### PostgreSQL Configuration Edit `/etc/postgresql/*/main/postgresql.conf`: ```ini shared_buffers = 256MB effective_cache_size = 1GB maintenance_work_mem = 64MB checkpoint_completion_target = 0.9 wal_buffers = 16MB default_statistics_target = 100 random_page_cost = 1.1 effective_io_concurrency = 200 work_mem = 4MB min_wal_size = 1GB max_wal_size = 4GB ``` ### Indexes Key indexes are created automatically. For custom queries, add indexes: ```sql CREATE INDEX idx_trades_symbol_date ON trades(symbol, executed_at); CREATE INDEX idx_market_data_symbol_timeframe ON market_data(symbol, timeframe, timestamp); ``` ## Backup and Recovery ### Backup ```bash pg_dump -U crypto_trader_user crypto_trader > backup.sql ``` ### Restore ```bash psql -U crypto_trader_user crypto_trader < backup.sql ``` ### Automated Backups Set up cron job: ```bash 0 2 * * * pg_dump -U crypto_trader_user crypto_trader > /backup/crypto_trader_$(date +\%Y\%m\%d).sql ``` ## Security ### Connection Security - Use strong passwords - Restrict network access - Use SSL connections for remote access - Regular security updates ### User Permissions - Use dedicated database user - Grant only necessary permissions - Don't use superuser for application ## Troubleshooting **Connection refused?** - Check PostgreSQL is running: `sudo systemctl status postgresql` - Verify connection settings - Check firewall rules **Authentication failed?** - Verify username and password - Check `pg_hba.conf` configuration - Review PostgreSQL logs **Performance issues?** - Check PostgreSQL configuration - Review query performance - Add appropriate indexes - Monitor resource usage