Features Added: ============== 📧 EMAIL REPORTING SYSTEM: - EmailReporter: Send reports via SMTP (Gmail, SendGrid, custom) - ReportGenerator: Generate daily/weekly summaries with HTML/text formatting - Configurable via .env (SMTP_HOST, SMTP_PORT, etc.) - Scripts: send_daily_report.py, send_weekly_report.py 🤖 AUTOMATED RUNS: - automated_daily_run.sh: Full daily ETL pipeline + reporting - automated_weekly_run.sh: Weekly pattern analysis + reports - setup_cron.sh: Interactive cron job setup (5-minute setup) - Logs saved to ~/logs/ with automatic cleanup 🔍 HEALTH CHECKS: - health_check.py: System health monitoring - Checks: DB connection, data freshness, counts, recent alerts - JSON output for programmatic use - Exit codes for monitoring integration 🚀 CI/CD PIPELINE: - .github/workflows/ci.yml: Full CI/CD pipeline - GitHub Actions / Gitea Actions compatible - Jobs: lint & test, security scan, dependency scan, Docker build - PostgreSQL service for integration tests - 93 tests passing in CI 📚 COMPREHENSIVE DOCUMENTATION: - AUTOMATION_QUICKSTART.md: 5-minute email setup guide - docs/12_automation_and_reporting.md: Full automation guide - Updated README.md with automation links - Deployment → Production workflow guide 🛠️ IMPROVEMENTS: - All shell scripts made executable - Environment variable examples in .env.example - Report logs saved with timestamps - 30-day log retention with auto-cleanup - Health checks can be scheduled via cron WHAT THIS ENABLES: ================== After deployment, users can: 1. Set up automated daily/weekly email reports (5 min) 2. Receive HTML+text emails with: - New trades, market alerts, suspicious timing - Weekly patterns, rankings, repeat offenders 3. Monitor system health automatically 4. Run full CI/CD pipeline on every commit 5. Deploy with confidence (tests + security scans) USAGE: ====== # One-time setup (on deployed server) ./scripts/setup_cron.sh # Or manually send reports python scripts/send_daily_report.py --to user@example.com python scripts/send_weekly_report.py --to user@example.com # Check system health python scripts/health_check.py See AUTOMATION_QUICKSTART.md for full instructions. 93 tests passing | Full CI/CD | Email reports ready
425 lines
8.5 KiB
Markdown
425 lines
8.5 KiB
Markdown
# Automation and Reporting Guide
|
|
|
|
This guide covers automated data updates, email reporting, and CI/CD pipelines for POTE.
|
|
|
|
## Table of Contents
|
|
|
|
1. [Email Reporting Setup](#email-reporting-setup)
|
|
2. [Automated Daily/Weekly Runs](#automated-dailyweekly-runs)
|
|
3. [Cron Setup](#cron-setup)
|
|
4. [Health Checks](#health-checks)
|
|
5. [CI/CD Pipeline](#cicd-pipeline)
|
|
|
|
---
|
|
|
|
## Email Reporting Setup
|
|
|
|
### Configure SMTP Settings
|
|
|
|
POTE can send automated email reports. You need to configure SMTP settings in your `.env` file.
|
|
|
|
#### Option 1: Gmail
|
|
|
|
```bash
|
|
SMTP_HOST=smtp.gmail.com
|
|
SMTP_PORT=587
|
|
SMTP_USER=your-email@gmail.com
|
|
SMTP_PASSWORD=your-app-password # NOT your regular password!
|
|
FROM_EMAIL=pote-reports@gmail.com
|
|
REPORT_RECIPIENTS=user1@example.com,user2@example.com
|
|
```
|
|
|
|
**Important:** For Gmail, you must use an [App Password](https://support.google.com/accounts/answer/185833), not your regular password:
|
|
1. Enable 2-factor authentication on your Google account
|
|
2. Go to https://myaccount.google.com/apppasswords
|
|
3. Generate an app password for "Mail"
|
|
4. Use that 16-character password in `.env`
|
|
|
|
#### Option 2: SendGrid
|
|
|
|
```bash
|
|
SMTP_HOST=smtp.sendgrid.net
|
|
SMTP_PORT=587
|
|
SMTP_USER=apikey
|
|
SMTP_PASSWORD=your-sendgrid-api-key
|
|
FROM_EMAIL=noreply@yourdomain.com
|
|
REPORT_RECIPIENTS=user1@example.com,user2@example.com
|
|
```
|
|
|
|
#### Option 3: Custom SMTP Server
|
|
|
|
```bash
|
|
SMTP_HOST=mail.yourdomain.com
|
|
SMTP_PORT=587 # or 465 for SSL
|
|
SMTP_USER=your-username
|
|
SMTP_PASSWORD=your-password
|
|
FROM_EMAIL=pote@yourdomain.com
|
|
REPORT_RECIPIENTS=admin@yourdomain.com
|
|
```
|
|
|
|
### Test SMTP Connection
|
|
|
|
Before setting up automation, test your SMTP settings:
|
|
|
|
```bash
|
|
python scripts/send_daily_report.py --to your-email@example.com --test-smtp
|
|
```
|
|
|
|
### Manual Report Generation
|
|
|
|
#### Send Daily Report
|
|
|
|
```bash
|
|
python scripts/send_daily_report.py --to user@example.com
|
|
```
|
|
|
|
Options:
|
|
- `--to EMAIL` - Recipient(s), comma-separated
|
|
- `--date YYYY-MM-DD` - Report date (default: today)
|
|
- `--test-smtp` - Test SMTP connection first
|
|
- `--save-to-file PATH` - Also save report to file
|
|
|
|
#### Send Weekly Report
|
|
|
|
```bash
|
|
python scripts/send_weekly_report.py --to user@example.com
|
|
```
|
|
|
|
---
|
|
|
|
## Automated Daily/Weekly Runs
|
|
|
|
POTE includes shell scripts for automated execution:
|
|
|
|
### Daily Run Script
|
|
|
|
`scripts/automated_daily_run.sh` performs:
|
|
|
|
1. Fetch congressional trades
|
|
2. Enrich securities (company names, sectors)
|
|
3. Fetch latest price data
|
|
4. Run market monitoring
|
|
5. Analyze disclosure timing
|
|
6. Send daily report via email
|
|
|
|
### Weekly Run Script
|
|
|
|
`scripts/automated_weekly_run.sh` performs:
|
|
|
|
1. Generate pattern detection report
|
|
2. Send weekly summary via email
|
|
|
|
### Manual Execution
|
|
|
|
Test the scripts manually before setting up cron:
|
|
|
|
```bash
|
|
# Daily run
|
|
./scripts/automated_daily_run.sh
|
|
|
|
# Weekly run
|
|
./scripts/automated_weekly_run.sh
|
|
```
|
|
|
|
Check logs:
|
|
```bash
|
|
tail -f ~/logs/daily_run.log
|
|
tail -f ~/logs/weekly_run.log
|
|
```
|
|
|
|
---
|
|
|
|
## Cron Setup
|
|
|
|
### Automated Setup (Recommended)
|
|
|
|
Use the interactive setup script:
|
|
|
|
```bash
|
|
cd /path/to/pote
|
|
./scripts/setup_cron.sh
|
|
```
|
|
|
|
This will:
|
|
1. Prompt for your email address
|
|
2. Ask for preferred schedule
|
|
3. Configure `.env` with email settings
|
|
4. Add cron jobs
|
|
5. Backup existing crontab
|
|
|
|
### Manual Setup
|
|
|
|
If you prefer manual configuration:
|
|
|
|
1. Make scripts executable:
|
|
```bash
|
|
chmod +x scripts/automated_daily_run.sh
|
|
chmod +x scripts/automated_weekly_run.sh
|
|
```
|
|
|
|
2. Create logs directory:
|
|
```bash
|
|
mkdir -p ~/logs
|
|
```
|
|
|
|
3. Edit crontab:
|
|
```bash
|
|
crontab -e
|
|
```
|
|
|
|
4. Add these lines:
|
|
```cron
|
|
# POTE Automated Daily Run (6 AM daily)
|
|
0 6 * * * /home/poteapp/pote/scripts/automated_daily_run.sh >> /home/poteapp/logs/daily_run.log 2>&1
|
|
|
|
# POTE Automated Weekly Run (Sunday 8 AM)
|
|
0 8 * * 0 /home/poteapp/pote/scripts/automated_weekly_run.sh >> /home/poteapp/logs/weekly_run.log 2>&1
|
|
```
|
|
|
|
### Verify Cron Jobs
|
|
|
|
```bash
|
|
crontab -l
|
|
```
|
|
|
|
### Remove Cron Jobs
|
|
|
|
```bash
|
|
crontab -e
|
|
# Delete the POTE lines and save
|
|
```
|
|
|
|
---
|
|
|
|
## Health Checks
|
|
|
|
### Run Health Check
|
|
|
|
```bash
|
|
python scripts/health_check.py
|
|
```
|
|
|
|
Output:
|
|
```
|
|
============================================================
|
|
POTE HEALTH CHECK
|
|
============================================================
|
|
Timestamp: 2025-12-15T10:30:00
|
|
Overall Status: ✓ OK
|
|
|
|
✓ Database Connection: Database connection successful
|
|
✓ Data Freshness: Data is fresh (2 days old)
|
|
latest_trade_date: 2025-12-13
|
|
✓ Data Counts: Database has 1,234 trades
|
|
officials: 45
|
|
securities: 123
|
|
trades: 1,234
|
|
prices: 12,345
|
|
market_alerts: 567
|
|
✓ Recent Alerts: 23 alerts in last 24 hours
|
|
============================================================
|
|
```
|
|
|
|
### JSON Output
|
|
|
|
For programmatic use:
|
|
|
|
```bash
|
|
python scripts/health_check.py --json
|
|
```
|
|
|
|
### Integrate with Monitoring
|
|
|
|
Add health check to cron for monitoring:
|
|
|
|
```cron
|
|
# POTE Health Check (every 6 hours)
|
|
0 */6 * * * /home/poteapp/pote/venv/bin/python /home/poteapp/pote/scripts/health_check.py >> /home/poteapp/logs/health.log 2>&1
|
|
```
|
|
|
|
---
|
|
|
|
## CI/CD Pipeline
|
|
|
|
POTE includes a GitHub Actions / Gitea Actions compatible CI/CD pipeline.
|
|
|
|
### What the Pipeline Does
|
|
|
|
On every push or pull request:
|
|
|
|
1. **Lint & Test**
|
|
- Runs ruff, black, mypy
|
|
- Executes full test suite with coverage
|
|
- Tests against PostgreSQL
|
|
|
|
2. **Security Scan**
|
|
- Checks dependencies with `safety`
|
|
- Scans code with `bandit`
|
|
|
|
3. **Dependency Scan**
|
|
- Scans for vulnerabilities with Trivy
|
|
|
|
4. **Docker Build Test**
|
|
- Builds Docker image
|
|
- Verifies POTE imports correctly
|
|
|
|
### GitHub Actions Setup
|
|
|
|
The pipeline is at `.github/workflows/ci.yml` and will run automatically when you push to GitHub.
|
|
|
|
### Gitea Actions Setup
|
|
|
|
Gitea Actions is compatible with GitHub Actions syntax. To enable:
|
|
|
|
1. Ensure Gitea Actions runner is installed on your server
|
|
2. Push the repository to Gitea
|
|
3. The workflow will run automatically
|
|
|
|
### Local Testing
|
|
|
|
Test the pipeline locally with Docker:
|
|
|
|
```bash
|
|
# Build image
|
|
docker build -t pote:test .
|
|
|
|
# Run tests in container
|
|
docker run --rm pote:test pytest tests/
|
|
```
|
|
|
|
### Secrets Configuration
|
|
|
|
For the CI pipeline to work fully, configure these secrets in your repository settings:
|
|
|
|
- `SONAR_HOST_URL` (optional, for SonarQube)
|
|
- `SONAR_TOKEN` (optional, for SonarQube)
|
|
|
|
---
|
|
|
|
## Deployment Workflow
|
|
|
|
### Development → Production
|
|
|
|
1. **Develop locally**
|
|
```bash
|
|
git checkout -b feature/my-feature
|
|
# Make changes
|
|
pytest tests/
|
|
git commit -m "Add feature"
|
|
```
|
|
|
|
2. **Push and test**
|
|
```bash
|
|
git push origin feature/my-feature
|
|
# CI pipeline runs automatically
|
|
```
|
|
|
|
3. **Merge to main**
|
|
```bash
|
|
# After PR approval
|
|
git checkout main
|
|
git pull
|
|
```
|
|
|
|
4. **Deploy to Proxmox**
|
|
```bash
|
|
ssh poteapp@10.0.10.95
|
|
cd ~/pote
|
|
git pull
|
|
source venv/bin/activate
|
|
pip install -e .
|
|
alembic upgrade head
|
|
```
|
|
|
|
5. **Restart services**
|
|
```bash
|
|
# If using systemd
|
|
sudo systemctl restart pote
|
|
|
|
# Or just restart cron jobs (they'll pick up changes)
|
|
# No action needed
|
|
```
|
|
|
|
---
|
|
|
|
## Troubleshooting
|
|
|
|
### Email Not Sending
|
|
|
|
1. Check SMTP settings in `.env`
|
|
2. Test connection:
|
|
```bash
|
|
python scripts/send_daily_report.py --to your-email@example.com --test-smtp
|
|
```
|
|
3. For Gmail: Ensure you're using an App Password, not regular password
|
|
4. Check firewall: Ensure port 587 (or 465) is open
|
|
|
|
### Cron Jobs Not Running
|
|
|
|
1. Check cron service is running:
|
|
```bash
|
|
systemctl status cron
|
|
```
|
|
|
|
2. Verify cron jobs are installed:
|
|
```bash
|
|
crontab -l
|
|
```
|
|
|
|
3. Check logs for errors:
|
|
```bash
|
|
tail -f ~/logs/daily_run.log
|
|
```
|
|
|
|
4. Ensure scripts are executable:
|
|
```bash
|
|
chmod +x scripts/automated_*.sh
|
|
```
|
|
|
|
5. Check paths in crontab (use absolute paths)
|
|
|
|
### No Data in Reports
|
|
|
|
1. Run health check:
|
|
```bash
|
|
python scripts/health_check.py
|
|
```
|
|
|
|
2. Manually fetch data:
|
|
```bash
|
|
python scripts/fetch_congressional_trades.py
|
|
python scripts/enrich_securities.py
|
|
```
|
|
|
|
3. Check database connection in `.env`
|
|
|
|
---
|
|
|
|
## Summary
|
|
|
|
**After deployment, you have three ways to use POTE:**
|
|
|
|
1. **Manual**: SSH to server, run scripts manually
|
|
2. **Automated (Recommended)**: Set up cron jobs, receive daily/weekly email reports
|
|
3. **Programmatic**: Use the Python API directly in your scripts
|
|
|
|
**For fully automated operation:**
|
|
|
|
```bash
|
|
# One-time setup
|
|
cd /path/to/pote
|
|
./scripts/setup_cron.sh
|
|
|
|
# That's it! You'll now receive:
|
|
# - Daily reports at 6 AM (or your chosen time)
|
|
# - Weekly reports on Sundays at 8 AM
|
|
# - Reports will be sent to your configured email
|
|
```
|
|
|
|
**To access reports without email:**
|
|
- Reports are saved to `~/logs/daily_report_YYYYMMDD.txt`
|
|
- Reports are saved to `~/logs/weekly_report_YYYYMMDD.txt`
|
|
- You can SSH to the server and read them directly
|
|
|
|
|