- Add dev-native.sh script for fast local development (10s vs 3-5min Docker builds) - Fix cookie security flags to respect APP_ENV (dev uses Secure=false, prod uses Secure=true) - Pin backend to Python 3.13 (3.14 not yet supported by pydantic-core) - Add comprehensive NATIVE_DEV_SETUP.md documentation - Update CLAUDE.md to recommend native dev workflow - Add .pids/ and .logs/ to .gitignore for native dev artifacts Benefits: - Instant startup (5-10 seconds) - Hot-reload enabled (backend + frontend) - Native debugging support - No Docker rebuilds needed - Discord OAuth works on localhost with proper cookie settings
256 lines
6.3 KiB
Markdown
256 lines
6.3 KiB
Markdown
# Native Development Setup
|
|
|
|
Fast development workflow with instant startup, hot-reload, and no Docker rebuilds.
|
|
|
|
## Why Native Development?
|
|
|
|
**Problem**: Docker production builds take 3-5 minutes to rebuild on every change.
|
|
|
|
**Solution**: Run backend and frontend natively on your machine, use Docker only for Redis.
|
|
|
|
**Benefits**:
|
|
- ⚡ **Instant startup** (seconds, not minutes)
|
|
- 🔥 **Hot-reload** on file changes (backend + frontend)
|
|
- 🐛 **Native debugging** (attach debugger directly)
|
|
- 💾 **No rebuild overhead** (just save and refresh)
|
|
|
|
## Prerequisites
|
|
|
|
### 1. Install Dependencies
|
|
|
|
```bash
|
|
# UV (Python package manager)
|
|
curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
|
|
# Node.js 22+ (if not already installed)
|
|
# https://nodejs.org/
|
|
|
|
# Docker (for Redis only)
|
|
# Already installed if you've been using ./start.sh
|
|
```
|
|
|
|
### 2. Configure Discord OAuth (One-Time Setup)
|
|
|
|
You need to add `http://localhost:8000` as an allowed redirect URI in your Discord application.
|
|
|
|
**Steps**:
|
|
|
|
1. Go to [Discord Developer Portal](https://discord.com/developers/applications)
|
|
2. Select your application (ID: `1441192438055178420`)
|
|
3. Navigate to **OAuth2** → **General**
|
|
4. Under **Redirects**, click **Add Redirect**
|
|
5. Add: `http://localhost:8000/api/auth/discord/callback/server`
|
|
6. Click **Save Changes**
|
|
|
|
**Your redirect URIs should now include**:
|
|
- ✅ `http://localhost:8000/api/auth/discord/callback/server` (dev)
|
|
- ✅ `https://gameplay-demo.manticorum.com/api/auth/discord/callback/server` (prod)
|
|
|
|
## Quick Start
|
|
|
|
### Option 1: New Native Dev Script (Recommended)
|
|
|
|
```bash
|
|
# Start everything (instant, hot-reload)
|
|
./dev-native.sh start
|
|
|
|
# View logs
|
|
./dev-native.sh logs
|
|
|
|
# Stop everything
|
|
./dev-native.sh stop
|
|
|
|
# Restart everything
|
|
./dev-native.sh restart
|
|
```
|
|
|
|
**What it does**:
|
|
1. Starts Redis in Docker (seconds)
|
|
2. Starts backend natively with `uv run uvicorn --reload` (instant)
|
|
3. Starts frontend natively with `npm run dev` (instant)
|
|
|
|
**No rebuilds. Ever.**
|
|
|
|
### Option 2: Manual Setup (Full Control)
|
|
|
|
If you prefer to run each service in separate terminals:
|
|
|
|
```bash
|
|
# Terminal 1: Redis (Docker)
|
|
docker compose up redis
|
|
|
|
# Terminal 2: Backend (native)
|
|
cd backend
|
|
uv run uvicorn app.main:socket_app --host 0.0.0.0 --port 8000 --reload
|
|
|
|
# Terminal 3: Frontend (native)
|
|
cd frontend-sba
|
|
npm run dev
|
|
```
|
|
|
|
## What Changed?
|
|
|
|
### 1. Cookie Security Flags Now Respect `APP_ENV`
|
|
|
|
**Before**:
|
|
- Cookies always used `Secure=true` + `SameSite=none`
|
|
- Required HTTPS (prod URLs only)
|
|
- Broke on localhost
|
|
|
|
**After** (in `backend/app/utils/cookies.py`):
|
|
- `APP_ENV=development` → `Secure=false` + `SameSite=lax` (works on localhost)
|
|
- `APP_ENV=production` → `Secure=true` + `SameSite=none` (works cross-domain)
|
|
|
|
### 2. Environment Files Already Configured
|
|
|
|
The `.env.dev` files already have localhost URLs:
|
|
|
|
**Backend** (`backend/.env.dev`):
|
|
```bash
|
|
DISCORD_SERVER_REDIRECT_URI=http://localhost:8000/api/auth/discord/callback/server
|
|
FRONTEND_URL=http://localhost:3000
|
|
CORS_ORIGINS=["http://localhost:3000","http://localhost:3001"]
|
|
```
|
|
|
|
**Frontend** (`frontend-sba/.env.dev`):
|
|
```bash
|
|
NUXT_PUBLIC_API_URL=http://localhost:8000
|
|
NUXT_PUBLIC_WS_URL=http://localhost:8000
|
|
NUXT_PUBLIC_DISCORD_REDIRECT_URI=http://localhost:3000/auth/callback
|
|
```
|
|
|
|
The `dev-native.sh` script automatically copies these to `.env` when you run it.
|
|
|
|
## Usage Patterns
|
|
|
|
### Typical Development Flow
|
|
|
|
```bash
|
|
# Start once
|
|
./dev-native.sh start
|
|
|
|
# Make changes to backend/frontend code
|
|
# Changes auto-reload instantly!
|
|
|
|
# View logs if needed
|
|
./dev-native.sh logs
|
|
|
|
# Stop when done
|
|
./dev-native.sh stop
|
|
```
|
|
|
|
### Debugging
|
|
|
|
**Backend** (Python):
|
|
```bash
|
|
# Stop the background process
|
|
./dev-native.sh stop
|
|
|
|
# Run backend in foreground with debugger
|
|
cd backend
|
|
uv run python -m debugpy --listen 5678 -m uvicorn app.main:socket_app --host 0.0.0.0 --port 8000 --reload
|
|
|
|
# Attach your IDE's debugger to localhost:5678
|
|
```
|
|
|
|
**Frontend** (Vue):
|
|
```bash
|
|
# Browser DevTools work automatically with HMR
|
|
# Or use Vue DevTools browser extension
|
|
```
|
|
|
|
### Switching Between Native and Docker
|
|
|
|
**To Native**:
|
|
```bash
|
|
# Stop Docker services
|
|
./start.sh stop
|
|
|
|
# Start native
|
|
./dev-native.sh start
|
|
```
|
|
|
|
**To Docker** (for testing prod builds):
|
|
```bash
|
|
# Stop native
|
|
./dev-native.sh stop
|
|
|
|
# Start Docker prod
|
|
./start.sh prod
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### Discord OAuth Still Fails
|
|
|
|
**Symptoms**: Redirect to Discord works, but callback fails with "Invalid redirect_uri"
|
|
|
|
**Fixes**:
|
|
1. Verify you added `http://localhost:8000/api/auth/discord/callback/server` to Discord app
|
|
2. Check `backend/.env` has `APP_ENV=development`
|
|
3. Check `backend/.env` has `DISCORD_SERVER_REDIRECT_URI=http://localhost:8000/api/auth/discord/callback/server`
|
|
4. Restart backend: `./dev-native.sh restart`
|
|
|
|
### Backend Won't Start
|
|
|
|
**Check logs**:
|
|
```bash
|
|
tail -f .logs/backend.log
|
|
```
|
|
|
|
**Common issues**:
|
|
- Port 8000 already in use: `lsof -i :8000` (kill the process)
|
|
- Missing Python dependencies: `cd backend && uv sync`
|
|
- Database connection error: Check PostgreSQL is running
|
|
|
|
### Frontend Won't Start
|
|
|
|
**Check logs**:
|
|
```bash
|
|
tail -f .logs/frontend.log
|
|
```
|
|
|
|
**Common issues**:
|
|
- Port 3000 already in use: `lsof -i :3000` (kill the process)
|
|
- Missing node_modules: `cd frontend-sba && npm ci`
|
|
- Build error: Delete `.nuxt` and `.output` folders, restart
|
|
|
|
### Redis Connection Error
|
|
|
|
**Symptoms**: Backend logs show "Redis connection refused"
|
|
|
|
**Fix**:
|
|
```bash
|
|
# Check Redis status
|
|
docker compose ps redis
|
|
|
|
# Restart Redis if needed
|
|
docker compose restart redis
|
|
```
|
|
|
|
## Performance Comparison
|
|
|
|
| Method | Initial Start | After Code Change | Rebuild Time |
|
|
|--------|--------------|-------------------|--------------|
|
|
| **Native Dev** | 5-10 seconds | Instant (HMR) | Never |
|
|
| Docker Dev | 30-60 seconds | Instant (volume mount) | 2-3 minutes |
|
|
| Docker Prod | **3-5 minutes** | **3-5 minutes** | **3-5 minutes** |
|
|
|
|
## Notes
|
|
|
|
- **Redis still uses Docker** (lightweight, starts in seconds)
|
|
- **PostgreSQL** is external (on `10.10.0.42`), not affected
|
|
- `.pids/` and `.logs/` directories are gitignored
|
|
- Backend uses `uvicorn --reload` (watches Python files)
|
|
- Frontend uses `nuxt dev` (HMR for Vue files)
|
|
|
|
## When to Use Docker Prod Mode
|
|
|
|
Use `./start.sh prod` when:
|
|
- Testing production builds before deployment
|
|
- Debugging Docker-specific issues
|
|
- Testing HTTPS/cross-origin scenarios
|
|
- Running integration tests
|
|
|
|
For day-to-day development, use `./dev-native.sh start` for maximum speed.
|