POTE/docs/08_proxmox_deployment.md
ilia 204cd0e75b Initial commit: POTE Phase 1 complete
- PR1: Project scaffold, DB models, price loader
- PR2: Congressional trade ingestion (House Stock Watcher)
- PR3: Security enrichment + deployment infrastructure
- 37 passing tests, 87%+ coverage
- Docker + Proxmox deployment ready
- Complete documentation
- Works 100% offline with fixtures
2025-12-14 20:45:34 -05:00

605 lines
12 KiB
Markdown

# Proxmox Deployment Guide
## Why Proxmox is Perfect for POTE
**Full control** - Your hardware, your rules
**No monthly costs** - Just electricity
**Isolated VMs/LXC** - Clean environments
**Snapshots** - Easy rollback if needed
**Resource efficient** - Run alongside other services
---
## Deployment Options on Proxmox
### Option 1: LXC Container (Recommended) ⭐
**Pros**: Lightweight, fast, efficient resource usage
**Cons**: Linux only (fine for POTE)
### Option 2: VM with Docker
**Pros**: Full isolation, can run any OS
**Cons**: More resource overhead
### Option 3: VM without Docker
**Pros**: Traditional setup, maximum control
**Cons**: Manual dependency management
---
## Quick Start: LXC Container (Easiest)
### 1. Create LXC Container
```bash
# In Proxmox web UI or via CLI:
# Create Ubuntu 22.04 LXC container
pct create 100 local:vztmpl/ubuntu-22.04-standard_22.04-1_amd64.tar.zst \
--hostname pote \
--memory 2048 \
--cores 2 \
--rootfs local-lvm:8 \
--net0 name=eth0,bridge=vmbr0,ip=dhcp \
--unprivileged 1 \
--features nesting=1
# Start container
pct start 100
# Enter container
pct enter 100
```
Or via Web UI:
1. Create CT → Ubuntu 22.04
2. Hostname: `pote`
3. Memory: 2GB
4. Cores: 2
5. Disk: 8GB
6. Network: Bridge, DHCP
### 2. Install Dependencies
```bash
# Inside the container
apt update && apt upgrade -y
# Install Python 3.11, PostgreSQL, Git
apt install -y python3.11 python3.11-venv python3-pip \
postgresql postgresql-contrib git curl
# Install build tools (for some Python packages)
apt install -y build-essential libpq-dev
```
### 3. Setup PostgreSQL
```bash
# Switch to postgres user
sudo -u postgres psql
# Create database and user
CREATE DATABASE pote;
CREATE USER poteuser WITH PASSWORD 'your_secure_password';
GRANT ALL PRIVILEGES ON DATABASE pote TO poteuser;
ALTER DATABASE pote OWNER TO poteuser;
\q
```
### 4. Clone and Install POTE
```bash
# Create app user (optional but recommended)
useradd -m -s /bin/bash poteapp
su - poteapp
# Clone repo
git clone https://github.com/your-username/pote.git
cd pote
# Create virtual environment
python3.11 -m venv venv
source venv/bin/activate
# Install dependencies
pip install --upgrade pip
pip install -e .
```
### 5. Configure Environment
```bash
# Create .env file
cat > .env << EOF
DATABASE_URL=postgresql://poteuser:your_secure_password@localhost:5432/pote
QUIVERQUANT_API_KEY=
FMP_API_KEY=
LOG_LEVEL=INFO
EOF
chmod 600 .env
```
### 6. Run Migrations
```bash
source venv/bin/activate
alembic upgrade head
```
### 7. Test Ingestion
```bash
# Test with fixtures (offline)
python scripts/ingest_from_fixtures.py
# Enrich securities
python scripts/enrich_securities.py
# Test with real data (if internet available)
python scripts/fetch_congressional_trades.py --days 7
```
### 8. Setup Cron Jobs
```bash
# Edit crontab
crontab -e
# Add these lines:
# Fetch trades daily at 6 AM
0 6 * * * cd /home/poteapp/pote && /home/poteapp/pote/venv/bin/python scripts/fetch_congressional_trades.py --days 7 >> /home/poteapp/logs/trades.log 2>&1
# Enrich securities daily at 6:15 AM
15 6 * * * cd /home/poteapp/pote && /home/poteapp/pote/venv/bin/python scripts/enrich_securities.py >> /home/poteapp/logs/enrich.log 2>&1
# Update prices daily at 6:30 AM (when built)
30 6 * * * cd /home/poteapp/pote && /home/poteapp/pote/venv/bin/python scripts/update_all_prices.py >> /home/poteapp/logs/prices.log 2>&1
```
### 9. Setup Logging
```bash
# Create logs directory
mkdir -p /home/poteapp/logs
# Rotate logs (optional)
cat > /etc/logrotate.d/pote << EOF
/home/poteapp/logs/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
}
EOF
```
---
## Option 2: VM with Docker (More Isolated)
### 1. Create VM
Via Proxmox Web UI:
1. Create VM
2. OS: Ubuntu Server 22.04
3. Memory: 4GB
4. Cores: 2
5. Disk: 20GB
6. Network: Bridge
### 2. Install Docker
```bash
# SSH into VM
ssh user@vm-ip
# Install Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
# Add user to docker group
sudo usermod -aG docker $USER
newgrp docker
# Install Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
```
### 3. Clone and Deploy
```bash
git clone https://github.com/your-username/pote.git
cd pote
# Create .env
cat > .env << EOF
POSTGRES_PASSWORD=your_secure_password
DATABASE_URL=postgresql://poteuser:your_secure_password@db:5432/pote
QUIVERQUANT_API_KEY=
FMP_API_KEY=
EOF
# Start services
docker-compose up -d
# Check logs
docker-compose logs -f
# Run migrations
docker-compose exec pote alembic upgrade head
# Test ingestion
docker-compose exec pote python scripts/ingest_from_fixtures.py
```
### 4. Setup Auto-start
```bash
# Enable Docker service
sudo systemctl enable docker
# Docker Compose auto-start
sudo curl -L https://raw.githubusercontent.com/docker/compose/master/contrib/systemd/docker-compose.service -o /etc/systemd/system/docker-compose@.service
# Enable for your project
sudo systemctl enable docker-compose@pote
```
---
## Proxmox-Specific Tips
### 1. Backups
```bash
# In Proxmox host, backup the container/VM
vzdump 100 --mode snapshot --storage local
# Or via Web UI: Datacenter → Backup → Add
# Schedule: Daily, Keep: 7 days
```
### 2. Snapshots
```bash
# Before major changes, take snapshot
pct snapshot 100 before-upgrade
# Rollback if needed
pct rollback 100 before-upgrade
# Or via Web UI: Container → Snapshots
```
### 3. Resource Monitoring
```bash
# Monitor container resources
pct status 100
pct exec 100 -- df -h
pct exec 100 -- free -h
# Check PostgreSQL size
pct exec 100 -- sudo -u postgres psql -c "SELECT pg_size_pretty(pg_database_size('pote'));"
```
### 4. Networking
**Static IP (Recommended for services)**:
```bash
# Edit container config on Proxmox host
nano /etc/pve/lxc/100.conf
# Change network config
net0: name=eth0,bridge=vmbr0,ip=192.168.1.50/24,gw=192.168.1.1
# Restart container
pct restart 100
```
**Port Forwarding** (if needed for API):
```bash
# On Proxmox host, forward port 8000 → container
iptables -t nat -A PREROUTING -p tcp --dport 8000 -j DNAT --to 192.168.1.50:8000
iptables -t nat -A POSTROUTING -j MASQUERADE
# Make persistent
apt install iptables-persistent
netfilter-persistent save
```
### 5. Security
```bash
# Inside container, setup firewall
apt install ufw
# Allow SSH
ufw allow 22/tcp
# Allow PostgreSQL (if remote access needed)
ufw allow from 192.168.1.0/24 to any port 5432
# Enable firewall
ufw enable
```
### 6. Performance Tuning
**PostgreSQL** (for LXC with 2GB RAM):
```bash
# Edit postgresql.conf
sudo nano /etc/postgresql/14/main/postgresql.conf
# Optimize for 2GB RAM
shared_buffers = 512MB
effective_cache_size = 1536MB
maintenance_work_mem = 128MB
checkpoint_completion_target = 0.9
wal_buffers = 16MB
default_statistics_target = 100
random_page_cost = 1.1
effective_io_concurrency = 200
work_mem = 2621kB
min_wal_size = 1GB
max_wal_size = 4GB
# Restart PostgreSQL
sudo systemctl restart postgresql
```
---
## Resource Requirements
### Minimum (Development/Testing)
- **Memory**: 1GB
- **Cores**: 1
- **Disk**: 5GB
- **Network**: Bridged
### Recommended (Production)
- **Memory**: 2-4GB
- **Cores**: 2
- **Disk**: 20GB (with room for logs/backups)
- **Network**: Bridged with static IP
### With Dashboard (Phase 3)
- **Memory**: 4GB
- **Cores**: 2-4
- **Disk**: 20GB
---
## Monitoring & Maintenance
### 1. Check Service Health
```bash
# Database connection
pct exec 100 -- sudo -u poteapp bash -c 'cd /home/poteapp/pote && source venv/bin/activate && python -c "from pote.db import SessionLocal; from sqlalchemy import text; s = SessionLocal(); s.execute(text(\"SELECT 1\")); print(\"DB OK\")"'
# Check last ingestion
pct exec 100 -- sudo -u postgres psql pote -c "SELECT COUNT(*), MAX(created_at) FROM trades;"
# Check disk usage
pct exec 100 -- df -h
# Check logs
pct exec 100 -- tail -f /home/poteapp/logs/trades.log
```
### 2. Database Maintenance
```bash
# Backup database
pct exec 100 -- sudo -u postgres pg_dump pote > pote_backup_$(date +%Y%m%d).sql
# Vacuum (clean up)
pct exec 100 -- sudo -u postgres psql pote -c "VACUUM ANALYZE;"
# Check database size
pct exec 100 -- sudo -u postgres psql -c "SELECT pg_size_pretty(pg_database_size('pote'));"
```
### 3. Update POTE
```bash
# Enter container
pct enter 100
su - poteapp
cd pote
# Pull latest code
git pull
# Update dependencies
source venv/bin/activate
pip install --upgrade -e .
# Run migrations
alembic upgrade head
# Test
python scripts/ingest_from_fixtures.py
```
---
## Troubleshooting
### Container won't start
```bash
# Check logs
pct status 100
journalctl -u pve-container@100
# Try start with debug
pct start 100 --debug
```
### PostgreSQL connection issues
```bash
# Check if PostgreSQL is running
pct exec 100 -- systemctl status postgresql
# Check connections
pct exec 100 -- sudo -u postgres psql -c "SELECT * FROM pg_stat_activity;"
# Reset password if needed
pct exec 100 -- sudo -u postgres psql -c "ALTER USER poteuser PASSWORD 'new_password';"
```
### Out of disk space
```bash
# Check usage
pct exec 100 -- df -h
# Clean logs
pct exec 100 -- find /home/poteapp/logs -name "*.log" -mtime +7 -delete
# Clean apt cache
pct exec 100 -- apt clean
# Resize container disk (on Proxmox host)
lvresize -L +5G /dev/pve/vm-100-disk-0
pct resize 100 rootfs +5G
```
### Python package issues
```bash
# Reinstall in venv
pct exec 100 -- sudo -u poteapp bash -c 'cd /home/poteapp/pote && rm -rf venv && python3.11 -m venv venv && source venv/bin/activate && pip install -e .'
```
---
## Cost Analysis
### Proxmox LXC (Your Setup)
- **Hardware**: Already owned
- **Power**: ~$5-15/mo (depends on your setup)
- **Internet**: Existing connection
- **Total**: **~$10/mo** (just power)
vs.
- **VPS**: $10-20/mo
- **Cloud**: $20-50/mo
- **Managed**: $50-100/mo
**Your Proxmox = 50-90% cost savings!**
---
## Next Steps
1. ✅ Create LXC container
2. ✅ Install dependencies
3. ✅ Setup PostgreSQL
4. ✅ Deploy POTE
5. ✅ Configure cron jobs
6. ✅ Setup backups
7. ⏭️ Build Phase 2 (Analytics)
8. ⏭️ Add FastAPI dashboard (optional)
---
## Example: Complete Setup Script
Save this as `proxmox_setup.sh` in your container:
```bash
#!/bin/bash
set -e
echo "=== POTE Proxmox Setup ==="
# Update system
echo "Updating system..."
apt update && apt upgrade -y
# Install dependencies
echo "Installing dependencies..."
apt install -y python3.11 python3.11-venv python3-pip \
postgresql postgresql-contrib git curl \
build-essential libpq-dev
# Setup PostgreSQL
echo "Setting up PostgreSQL..."
sudo -u postgres psql << EOF
CREATE DATABASE pote;
CREATE USER poteuser WITH PASSWORD 'changeme123';
GRANT ALL PRIVILEGES ON DATABASE pote TO poteuser;
ALTER DATABASE pote OWNER TO poteuser;
EOF
# Create app user
echo "Creating app user..."
useradd -m -s /bin/bash poteapp || true
# Clone repo
echo "Cloning POTE..."
sudo -u poteapp git clone https://github.com/your-username/pote.git /home/poteapp/pote || true
# Setup Python environment
echo "Setting up Python environment..."
sudo -u poteapp bash << 'EOF'
cd /home/poteapp/pote
python3.11 -m venv venv
source venv/bin/activate
pip install --upgrade pip
pip install -e .
EOF
# Create .env
echo "Creating .env..."
sudo -u poteapp bash << 'EOF'
cat > /home/poteapp/pote/.env << ENVEOF
DATABASE_URL=postgresql://poteuser:changeme123@localhost:5432/pote
QUIVERQUANT_API_KEY=
FMP_API_KEY=
LOG_LEVEL=INFO
ENVEOF
chmod 600 /home/poteapp/pote/.env
EOF
# Run migrations
echo "Running migrations..."
sudo -u poteapp bash << 'EOF'
cd /home/poteapp/pote
source venv/bin/activate
alembic upgrade head
EOF
# Create logs directory
sudo -u poteapp mkdir -p /home/poteapp/logs
echo ""
echo "✅ Setup complete!"
echo ""
echo "Next steps:"
echo "1. su - poteapp"
echo "2. cd pote && source venv/bin/activate"
echo "3. python scripts/ingest_from_fixtures.py"
echo "4. Setup cron jobs (see docs/08_proxmox_deployment.md)"
```
Run it:
```bash
chmod +x proxmox_setup.sh
./proxmox_setup.sh
```
---
**Your Proxmox setup gives you enterprise-grade infrastructure at hobby costs!** 🚀