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>
5.8 KiB
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 composenotdocker-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:
from datetime import datetime
now = datetime.utcnow() # DEPRECATED & WRONG
✅ ALWAYS DO THIS:
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:
class MyModel(Base):
metadata = Column(JSON) # RESERVED
registry = Column(String) # RESERVED
__mapper__ = Column(String) # RESERVED
✅ USE DESCRIPTIVE NAMES:
class MyModel(Base):
game_metadata = Column(JSON)
user_registry = Column(String)
mapper_data = Column(String)
4. Pydantic Settings List Format
❌ WRONG (.env file):
CORS_ORIGINS=http://localhost:3000,http://localhost:3001
✅ CORRECT (.env file):
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:
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)
-- 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
cd backend
source venv/bin/activate # Activate
python -m app.main # Run server
deactivate # When done
Frontends (when created)
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
# 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
# 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
- Check virtual environment is activated:
which pythonshould showvenv/bin/python - Verify .env file has correct DATABASE_URL with password
- Ensure CORS_ORIGINS is JSON array format
- Check PostgreSQL server is accessible:
psql postgresql://paperdynasty:PASSWORD@10.10.0.42:5432/paperdynasty_dev
Import Errors
- Ensure all
__init__.pyfiles exist in package directories - Run from backend directory:
python -m app.mainnotpython app/main.py
Database Connection Errors
- Verify database exists:
psql -h 10.10.0.42 -U paperdynasty -d paperdynasty_dev - Check firewall rules if connection times out
- Verify credentials in .env file
WebSocket Connection Issues
- Check CORS_ORIGINS includes frontend URL
- Verify JWT token is being sent from client
- Check browser console for specific error messages
Security Notes
- ✅
.envfiles 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.