# Deployment Guide

This guide covers deployment options for the SchoolCompare Next.js application.

## Deployment Options

### Option 1: Vercel (Recommended for Next.js)

Vercel is the easiest and most optimized platform for Next.js applications.

#### Steps:

1. **Install Vercel CLI**:
   ```bash
   npm install -g vercel
   ```

2. **Login to Vercel**:
   ```bash
   vercel login
   ```

3. **Deploy**:
   ```bash
   vercel --prod
   ```

4. **Configure Environment Variables** in Vercel dashboard:
   - `NEXT_PUBLIC_API_URL`: Your FastAPI endpoint (e.g., `https://api.schoolcompare.co.uk/api`)
   - `FASTAPI_URL`: Same as above for server-side requests

#### Benefits:
- Automatic HTTPS
- Global CDN
- Zero-config deployment
- Automatic preview deployments
- Built-in analytics

---

### Option 2: Docker (Self-hosted)

Deploy using Docker containers for full control.

#### Prerequisites:
- Docker 20+
- Docker Compose 2+

#### Steps:

1. **Build Docker Image**:
   ```bash
   docker build -t schoolcompare-nextjs:latest .
   ```

2. **Run with Docker Compose**:
   ```bash
   # Create .env file with production variables
   echo "NEXT_PUBLIC_API_URL=https://api.schoolcompare.co.uk/api" > .env
   echo "FASTAPI_URL=http://backend:8000/api" >> .env

   # Start services
   docker-compose up -d
   ```

3. **Verify Deployment**:
   ```bash
   curl http://localhost:3000
   ```

#### Environment Variables:
- `NEXT_PUBLIC_API_URL`: Public API endpoint (client-side)
- `FASTAPI_URL`: Internal API endpoint (server-side)
- `NODE_ENV`: `production`

---

### Option 3: PM2 (Node.js Process Manager)

Deploy directly on a Node.js server using PM2.

#### Prerequisites:
- Node.js 24+
- PM2 (`npm install -g pm2`)

#### Steps:

1. **Build Application**:
   ```bash
   npm run build
   ```

2. **Create PM2 Ecosystem File** (`ecosystem.config.js`):
   ```javascript
   module.exports = {
     apps: [{
       name: 'schoolcompare-nextjs',
       script: 'npm',
       args: 'start',
       cwd: '/path/to/nextjs-app',
       instances: 'max',
       exec_mode: 'cluster',
       env: {
         NODE_ENV: 'production',
         PORT: 3000,
         NEXT_PUBLIC_API_URL: 'https://api.schoolcompare.co.uk/api',
         FASTAPI_URL: 'http://localhost:8000/api',
       },
     }],
   };
   ```

3. **Start with PM2**:
   ```bash
   pm2 start ecosystem.config.js
   pm2 save
   pm2 startup
   ```

---

### Option 4: Nginx Reverse Proxy

Use Nginx as a reverse proxy in front of Next.js.

#### Nginx Configuration:

```nginx
server {
    listen 80;
    server_name schoolcompare.co.uk;

    # Redirect to HTTPS
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name schoolcompare.co.uk;

    # SSL Configuration
    ssl_certificate /etc/ssl/certs/schoolcompare.crt;
    ssl_certificate_key /etc/ssl/private/schoolcompare.key;

    # Security Headers
    # frame-ancestors replaces X-Frame-Options so the analytics subdomain
    # (Umami heatmap/recorder) can embed the site in an iframe.
    add_header Content-Security-Policy "frame-ancestors 'self' https://analytics.schoolcompare.co.uk" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-XSS-Protection "1; mode=block" always;

    # Proxy to Next.js
    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # Proxy to FastAPI
    location /api/ {
        proxy_pass http://localhost:8000;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # Cache static files
    location /_next/static/ {
        proxy_pass http://localhost:3000;
        add_header Cache-Control "public, max-age=31536000, immutable";
    }
}
```

---

## Pre-Deployment Checklist

- [ ] Run `npm run build` successfully
- [ ] Run `npm test` - all tests pass
- [ ] Environment variables configured
- [ ] FastAPI backend accessible
- [ ] Database migrations applied
- [ ] SSL certificates configured (production)
- [ ] Domain DNS configured
- [ ] Monitoring/logging set up
- [ ] Backup strategy in place

---

## Post-Deployment Verification

1. **Health Check**:
   ```bash
   curl https://schoolcompare.co.uk
   ```

2. **Test Routes**:
   - Home: `https://schoolcompare.co.uk/`
   - School Page: `https://schoolcompare.co.uk/school/100001`
   - Compare: `https://schoolcompare.co.uk/compare`
   - Rankings: `https://schoolcompare.co.uk/rankings`

3. **Check SEO**:
   - Sitemap: `https://schoolcompare.co.uk/sitemap.xml`
   - Robots: `https://schoolcompare.co.uk/robots.txt`

4. **Performance Audit**:
   - Run Lighthouse in Chrome DevTools
   - Target scores: 90+ for Performance, Accessibility, Best Practices, SEO

---

## Monitoring

### Recommended Tools:
- **Vercel Analytics** (if using Vercel)
- **Sentry** for error tracking
- **Google Analytics** for user analytics
- **Uptime Robot** for uptime monitoring

### Health Check Endpoint:
The application automatically serves health data at the root route.

---

## Rollback Procedure

### Vercel:
```bash
vercel rollback
```

### Docker:
```bash
docker-compose down
docker-compose up -d --force-recreate
```

### PM2:
```bash
pm2 stop schoolcompare-nextjs
# Restore previous build
pm2 start schoolcompare-nextjs
```

---

## Troubleshooting

### Issue: API requests failing
- **Solution**: Check `NEXT_PUBLIC_API_URL` and `FASTAPI_URL` environment variables
- **Verify**: FastAPI backend is accessible from Next.js container/server

### Issue: Build fails
- **Solution**: Check Node.js version (requires 24+)
- **Clear cache**: `rm -rf .next node_modules && npm install && npm run build`

### Issue: Slow page loads
- **Solution**: Enable caching in API calls
- **Check**: Network latency to FastAPI backend
- **Verify**: CDN is serving static assets

---

## Security Considerations

- ✅ HTTPS enabled
- ✅ Security headers configured (X-Frame-Options, CSP, etc.)
- ✅ API keys in environment variables (never in code)
- ✅ CORS properly configured
- ✅ Rate limiting on API endpoints
- ✅ Regular security updates
- ✅ Dependency vulnerability scanning

---

## Support

For deployment issues, contact the DevOps team or refer to:
- [Next.js Deployment Docs](https://nextjs.org/docs/deployment)
- [Vercel Documentation](https://vercel.com/docs)
- [Docker Documentation](https://docs.docker.com/)
