strat-gameplay-webapp/.claude/ENVIRONMENT.md
Cal Corum fc7f53adf3 CLAUDE: Complete Phase 1 backend infrastructure setup
Implemented full FastAPI backend with WebSocket support, database models,
and comprehensive documentation for the Paper Dynasty game engine.

Backend Implementation:
- FastAPI application with Socket.io WebSocket server
- SQLAlchemy async database models (Game, Play, Lineup, GameSession)
- PostgreSQL connection to dev server (10.10.0.42:5432)
- Connection manager for WebSocket lifecycle
- JWT authentication utilities
- Health check and stub API endpoints
- Rotating file logger with Pendulum datetime handling
- Redis via Docker Compose for caching

Technical Details:
- Python 3.13 with updated package versions
- Pendulum 3.0 for all datetime operations
- Greenlet for SQLAlchemy async support
- Fixed SQLAlchemy reserved column names (metadata -> *_metadata)
- Pydantic Settings with JSON array format for lists
- Docker Compose V2 commands

Documentation:
- Updated backend/CLAUDE.md with environment-specific details
- Created .claude/ENVIRONMENT.md for gotchas and quirks
- Created QUICKSTART.md for developer onboarding
- Documented all critical learnings and troubleshooting steps

Database:
- Tables created: games, plays, lineups, game_sessions
- All indexes and foreign keys configured
- Successfully tested connection and health checks

Verified:
- Server starts at http://localhost:8000
- Health endpoints responding
- Database connection working
- WebSocket infrastructure functional
- Hot-reload working

🎯 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-21 19:46:16 -05:00

236 lines
5.8 KiB
Markdown

# Environment-Specific Details & Gotchas
**Last Updated**: 2025-10-21
This document contains critical environment-specific configurations and common pitfalls to avoid.
## System Information
- **OS**: Linux (Nobara Fedora 42)
- **Python**: 3.13.3
- **Docker**: Compose V2 (use `docker compose` not `docker-compose`)
- **Database Server**: 10.10.0.42:5432 (PostgreSQL)
## Critical Gotchas
### 1. Docker Compose Command
**WRONG**: `docker-compose up -d`
**CORRECT**: `docker compose up -d`
This system uses Docker Compose V2. The legacy `docker-compose` command does not exist.
### 2. Pendulum for ALL DateTime Operations
**NEVER DO THIS**:
```python
from datetime import datetime
now = datetime.utcnow() # DEPRECATED & WRONG
```
**ALWAYS DO THIS**:
```python
import pendulum
now = pendulum.now('UTC')
```
**Reason**: We standardized on Pendulum for better timezone handling and to avoid deprecated Python datetime methods.
### 3. SQLAlchemy Reserved Column Names
**THESE WILL FAIL**:
```python
class MyModel(Base):
metadata = Column(JSON) # RESERVED
registry = Column(String) # RESERVED
__mapper__ = Column(String) # RESERVED
```
**USE DESCRIPTIVE NAMES**:
```python
class MyModel(Base):
game_metadata = Column(JSON)
user_registry = Column(String)
mapper_data = Column(String)
```
### 4. Pydantic Settings List Format
**WRONG** (.env file):
```bash
CORS_ORIGINS=http://localhost:3000,http://localhost:3001
```
**CORRECT** (.env file):
```bash
CORS_ORIGINS=["http://localhost:3000", "http://localhost:3001"]
```
**Reason**: Pydantic Settings expects JSON format for list types.
### 5. AsyncPG Requires Greenlet
If you see this error:
```
ValueError: the greenlet library is required to use this function
```
**Solution**: Install greenlet explicitly:
```bash
pip install greenlet
```
This is needed for SQLAlchemy's async support with asyncpg.
## Database Configuration
### Development Database
- **Host**: `10.10.0.42`
- **Port**: `5432`
- **Database**: `paperdynasty_dev`
- **User**: `paperdynasty`
- **Connection String**: `postgresql+asyncpg://paperdynasty:PASSWORD@10.10.0.42:5432/paperdynasty_dev`
### Creating the Database (if needed)
```sql
-- On PostgreSQL server (via Adminer or psql)
CREATE DATABASE paperdynasty_dev;
CREATE USER paperdynasty WITH PASSWORD 'your-password';
GRANT ALL PRIVILEGES ON DATABASE paperdynasty_dev TO paperdynasty;
-- After connecting to paperdynasty_dev
GRANT ALL ON SCHEMA public TO paperdynasty;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO paperdynasty;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO paperdynasty;
```
### Production Database
- **Host**: TBD
- **Database**: `paperdynasty_prod`
- Use different, secure credentials
## Package Versions
Due to Python 3.13 compatibility, we use newer versions than originally specified:
| Package | Original | Updated | Reason |
|---------|----------|---------|--------|
| fastapi | 0.104.1 | 0.115.6 | Python 3.13 support |
| uvicorn | 0.24.0 | 0.34.0 | Python 3.13 support |
| pydantic | 2.5.0 | 2.10.6 | Python 3.13 support |
| sqlalchemy | 2.0.23 | 2.0.36 | Python 3.13 support |
| asyncpg | 0.29.0 | 0.30.0 | Python 3.13 wheels |
| pendulum | N/A | 3.0.0 | New requirement |
| pytest | 7.4.3 | 8.3.4 | Python 3.13 support |
## Virtual Environment
### Backend
```bash
cd backend
source venv/bin/activate # Activate
python -m app.main # Run server
deactivate # When done
```
### Frontends (when created)
```bash
cd frontend-sba
npm install
npm run dev
cd frontend-pd
npm install
npm run dev
```
## Server Endpoints
### Backend (Port 8000)
- **Main API**: http://localhost:8000
- **Swagger UI**: http://localhost:8000/docs
- **ReDoc**: http://localhost:8000/redoc
- **Health Check**: http://localhost:8000/api/health
- **DB Health**: http://localhost:8000/api/health/db
### Frontends (when created)
- **SBA League**: http://localhost:3000
- **PD League**: http://localhost:3001
### Services
- **Redis**: localhost:6379
- **PostgreSQL**: 10.10.0.42:5432
## Common Commands
### Backend Development
```bash
# Start Redis
docker compose up -d
# Run backend (from backend/ directory)
source venv/bin/activate
python -m app.main
# Run tests
pytest tests/ -v
# Code formatting
black app/ tests/
# Type checking
mypy app/
```
### Docker Management
```bash
# Start Redis
docker compose up -d
# Stop Redis
docker compose down
# View Redis logs
docker compose logs redis
# Check running containers
docker ps
```
## Troubleshooting
### Server Won't Start
1. Check virtual environment is activated: `which python` should show `venv/bin/python`
2. Verify .env file has correct DATABASE_URL with password
3. Ensure CORS_ORIGINS is JSON array format
4. Check PostgreSQL server is accessible: `psql postgresql://paperdynasty:PASSWORD@10.10.0.42:5432/paperdynasty_dev`
### Import Errors
1. Ensure all `__init__.py` files exist in package directories
2. Run from backend directory: `python -m app.main` not `python app/main.py`
### Database Connection Errors
1. Verify database exists: `psql -h 10.10.0.42 -U paperdynasty -d paperdynasty_dev`
2. Check firewall rules if connection times out
3. Verify credentials in .env file
### WebSocket Connection Issues
1. Check CORS_ORIGINS includes frontend URL
2. Verify JWT token is being sent from client
3. Check browser console for specific error messages
## Security Notes
-`.env` files are gitignored
- ✅ Secret key is randomly generated (32+ chars)
- ✅ Database credentials never committed to git
- ✅ JWT tokens expire after 7 days
- ✅ All WebSocket connections require authentication
## Next Steps
- [ ] Set up Discord OAuth integration
- [ ] Create frontend projects (Nuxt 3)
- [ ] Implement game engine (Phase 2)
- [ ] Add comprehensive test coverage
- [ ] Set up CI/CD pipeline
---
**Note**: Keep this document updated as new environment-specific details are discovered.