# Paper Dynasty Real-Time Game Engine Web-based real-time multiplayer baseball simulation platform replacing the legacy Google Sheets system. ## Project Structure ``` strat-gameplay-webapp/ ├── backend/ # FastAPI game engine ├── frontend-sba/ # SBA League Nuxt frontend ├── frontend-pd/ # PD League Nuxt frontend ├── .claude/ # Claude AI implementation guides ├── docker-compose.yml # Full stack orchestration └── README.md # This file ``` ## Two Development Workflows ### Option 1: Local Development (Recommended for Daily Work) **Best for:** Fast hot-reload, quick iteration, debugging **Services:** - ✅ Backend runs locally (Python hot-reload) - ✅ Frontends run locally (Nuxt hot-reload) - ✅ Redis in Docker (lightweight) - ✅ PostgreSQL on your existing server **Setup:** 1. **Environment Setup** ```bash # Copy environment template cp .env.example .env # Edit .env with your database credentials and API keys ``` 2. **Start Redis** (in one terminal) ```bash cd backend docker-compose up ``` 3. **Start Backend** (in another terminal) ```bash cd backend uv run python -m app.main # Or manually activate: source .venv/bin/activate && python -m app.main ``` Backend will be available at http://localhost:8000 4. **Start SBA Frontend** (in another terminal) ```bash cd frontend-sba npm run dev ``` SBA frontend will be available at http://localhost:3000 5. **Start PD Frontend** (in another terminal) ```bash cd frontend-pd npm run dev ``` PD frontend will be available at http://localhost:3001 **Advantages:** - ⚡ Instant hot-reload on code changes - 🐛 Easy debugging (native debuggers work) - 💨 Fast startup times - 🔧 Simple to restart individual services --- ### Option 2: Full Docker Orchestration **Best for:** Integration testing, demos, production-like environment **Services:** - ✅ Everything runs in containers - ✅ Consistent environment - ✅ One command to start everything **Setup:** 1. **Environment Setup** ```bash # Copy environment template cp .env.example .env # Edit .env with your database credentials and API keys ``` 2. **Start Everything** ```bash # From project root docker-compose up ``` Or run in background: ```bash docker-compose up -d ``` 3. **View Logs** ```bash # All services docker-compose logs -f # Specific service docker-compose logs -f backend docker-compose logs -f frontend-sba ``` 4. **Stop Everything** ```bash docker-compose down ``` **Advantages:** - 🎯 Production-like environment - 🚀 One-command startup - 🔄 Easy to share with team - ✅ CI/CD ready --- ## Development Commands ### Backend ```bash cd backend # Install UV (one-time setup) curl -LsSf https://astral.sh/uv/install.sh | sh # Install dependencies uv sync # Run server uv run python -m app.main # Run tests uv run pytest tests/ -v # Code formatting uv run black app/ tests/ # Linting uv run flake8 app/ tests/ # Type checking uv run mypy app/ ``` ### Frontend ```bash cd frontend-sba # or frontend-pd # Install dependencies npm install # Run dev server npm run dev # Build for production npm run build # Preview production build npm run preview # Lint npm run lint # Type check npm run type-check ``` ## Database Setup This project uses an existing PostgreSQL server. You need to manually create the database: ```sql -- On your PostgreSQL server CREATE DATABASE paperdynasty_dev; CREATE USER paperdynasty WITH PASSWORD 'your-secure-password'; GRANT ALL PRIVILEGES ON DATABASE paperdynasty_dev TO paperdynasty; ``` Then update `DATABASE_URL` in `.env`: ``` DATABASE_URL=postgresql+asyncpg://paperdynasty:your-password@your-db-server:5432/paperdynasty_dev ``` ## Environment Variables Copy `.env.example` to `.env` and configure: ### Required - `DATABASE_URL` - PostgreSQL connection string - `SECRET_KEY` - Application secret key (at least 32 characters) - `DISCORD_CLIENT_ID` - Discord OAuth client ID - `DISCORD_CLIENT_SECRET` - Discord OAuth secret - `SBA_API_URL` / `SBA_API_KEY` - SBA League API credentials - `PD_API_URL` / `PD_API_KEY` - PD League API credentials ### Optional - `REDIS_URL` - Redis connection (auto-configured in Docker) - `CORS_ORIGINS` - Allowed origins (defaults to localhost:3000,3001) --- ## Multi-Domain Deployment This project supports deployment to multiple domains. Key environment variables to configure: ### Backend Variables | Variable | Description | Example | |----------|-------------|---------| | `FRONTEND_URL` | Frontend base URL for OAuth redirects | `https://yourdomain.com` | | `DISCORD_REDIRECT_URI` | Legacy Discord callback | `https://yourdomain.com/auth/callback` | | `DISCORD_SERVER_REDIRECT_URI` | Server-side Discord callback | `https://yourdomain.com/api/auth/discord/callback/server` | | `CORS_ORIGINS` | Allowed CORS origins (comma-separated) | `https://yourdomain.com,https://api.yourdomain.com` | | `ALLOWED_DISCORD_IDS` | Whitelist of Discord user IDs | `123456,789012` or empty for all | ### Frontend Variables | Variable | Description | Example | |----------|-------------|---------| | `NUXT_PUBLIC_API_URL` | Backend API base URL | `https://yourdomain.com` | | `NUXT_PUBLIC_WS_URL` | WebSocket base URL | `https://yourdomain.com` | | `NUXT_PUBLIC_DISCORD_REDIRECT_URI` | OAuth callback URL | `https://yourdomain.com/auth/callback` | | `NUXT_ALLOWED_HOSTS` | Vite dev server allowed hosts (comma-separated) | `yourdomain.com,localhost` | ### Production Deployment ```bash # Using Docker Compose with production overrides docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d ``` ### Domain Deployment Checklist When deploying to a new domain: 1. [ ] Update Discord OAuth redirect URIs in [Discord Developer Portal](https://discord.com/developers/applications) 2. [ ] Copy `.env.example` files to `.env` and configure all URLs 3. [ ] Update `CORS_ORIGINS` to include new domain 4. [ ] Add domain to `NUXT_ALLOWED_HOSTS` (if using dev server externally) 5. [ ] Configure reverse proxy (Nginx/NPM) to route traffic --- ## Available Services When running, the following services are available: | Service | URL | Description | |---------|-----|-------------| | Backend API | http://localhost:8000 | FastAPI REST API | | Backend Docs | http://localhost:8000/docs | Interactive API documentation | | SBA Frontend | http://localhost:3000 | SBA League web app | | PD Frontend | http://localhost:3001 | PD League web app | | Redis | localhost:6379 | Cache (not exposed via HTTP) | ## Health Checks ```bash # Backend health curl http://localhost:8000/api/health # Or visit in browser open http://localhost:8000/api/health ``` ## Troubleshooting ### Backend won't start - Check `DATABASE_URL` is correct in `.env` - Verify PostgreSQL database exists - Ensure Redis is running (`docker-compose up` in backend/) - Check logs for specific errors ### Frontend won't connect to backend - Verify backend is running at http://localhost:8000 - Check CORS settings in backend `.env` - Clear browser cache and cookies - Check browser console for errors ### Docker containers won't start - Ensure `.env` file exists with all required variables - Run `docker-compose down` then `docker-compose up` again - Check `docker-compose logs` for specific errors - Verify no port conflicts (8000, 3000, 3001, 6379) ### Database connection fails - Verify PostgreSQL server is accessible - Check firewall rules allow connection - Confirm database and user exist - Test connection with `psql` directly ## Documentation - **Full PRD**: See `/prd-web-scorecard-1.1.md` - **Implementation Guide**: See `.claude/implementation/00-index.md` - **Architecture Docs**: See `.claude/implementation/` directory ## Tech Stack ### Backend - **Framework**: FastAPI (Python 3.13+) - **Package Manager**: UV (modern Python package management) - **WebSocket**: Socket.io - **Database**: PostgreSQL 14+ with SQLAlchemy - **Cache**: Redis 7 - **Auth**: Discord OAuth with JWT ### Frontend - **Framework**: Vue 3 + Nuxt 3 - **Language**: TypeScript - **Styling**: Tailwind CSS - **State**: Pinia - **WebSocket**: Socket.io-client ## Contributing See `.claude/implementation/` for detailed implementation guides and architecture documentation. ## License Proprietary - Paper Dynasty League System