strat-gameplay-webapp/README.md
Cal Corum 7d28eebd24 CLAUDE: Add multi-domain environment configuration support
- Create frontend-sba/.env.example and frontend-pd/.env.example templates
- Fix hardcoded allowedHosts in nuxt.config.ts (now reads NUXT_ALLOWED_HOSTS)
- Add NUXT_ALLOWED_HOSTS support to frontend-pd/nuxt.config.ts
- Update docker-compose.yml with missing env vars:
  - FRONTEND_URL, DISCORD_SERVER_REDIRECT_URI
  - ALLOWED_DISCORD_IDS, WS_HEARTBEAT_INTERVAL, WS_CONNECTION_TIMEOUT
  - NUXT_ALLOWED_HOSTS for both frontends
- Create docker-compose.prod.yml for production overrides
- Update root .env.example with new variables
- Add "Multi-Domain Deployment" section to README.md with checklist
- Update all CLAUDE.md files with environment configuration docs
- Remove obsolete 'version' attribute from docker-compose files

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-03 13:58:42 -06:00

329 lines
8.3 KiB
Markdown

# 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