Files
hpr-knowledge-base/DEPLOYMENT.md

423 lines
7.8 KiB
Markdown
Raw Normal View History

# Deployment Guide
This guide provides step-by-step instructions for deploying the HPR Knowledge Base MCP Server to various hosting platforms.
## Prerequisites
- Git installed locally
- Account on your chosen hosting platform
- Node.js 18+ installed locally for testing
## Quick Start
1. Install dependencies:
```bash
npm install
```
2. Test locally:
```bash
npm run start:http
```
3. Verify the server is running:
```bash
curl http://localhost:3000/health
```
## Deployment Options
### Option 1: Render.com (Recommended)
**Cost**: Free tier available, $7/mo for always-on service
**Steps**:
1. Create a Render account at https://render.com
2. Push your code to GitHub/GitLab/Bitbucket
3. In Render Dashboard:
- Click "New +" → "Web Service"
- Connect your repository
- Configure:
- **Name**: `hpr-knowledge-base`
- **Environment**: `Node`
- **Build Command**: `npm install`
- **Start Command**: `npm run start:http`
- **Instance Type**: Free or Starter ($7/mo)
4. Add environment variable (optional):
- `PORT` is automatically set by Render
5. Click "Create Web Service"
6. Your server will be available at: `https://hpr-knowledge-base.onrender.com`
**Health Check Configuration**:
- Path: `/health`
- Success Codes: 200
**Auto-scaling**: Available on paid plans
---
### Option 2: Railway.app
**Cost**: $5 free credit/month, then pay-per-usage (~$5-10/mo for small services)
**Steps**:
1. Create a Railway account at https://railway.app
2. Install Railway CLI (optional):
```bash
npm install -g @railway/cli
railway login
```
3. Deploy via CLI:
```bash
railway init
railway up
```
4. Or deploy via Dashboard:
- Click "New Project"
- Choose "Deploy from GitHub repo"
- Select your repository
- Railway auto-detects Node.js and runs `npm install`
5. Add start command in Railway:
- Go to project settings
- Add custom start command: `npm run start:http`
6. Your service URL will be generated automatically
**Advantages**:
- Pay only for what you use
- Scales to zero when idle
- Simple deployment process
---
### Option 3: Fly.io
**Cost**: Free tier (256MB RAM), ~$3-5/mo beyond that
**Steps**:
1. Install Fly CLI:
```bash
curl -L https://fly.io/install.sh | sh
```
2. Login to Fly:
```bash
fly auth login
```
3. Create `fly.toml` in project root:
```toml
app = "hpr-knowledge-base"
[build]
builder = "heroku/buildpacks:20"
[env]
PORT = "8080"
[http_service]
internal_port = 8080
force_https = true
auto_stop_machines = true
auto_start_machines = true
min_machines_running = 0
[[vm]]
cpu_kind = "shared"
cpus = 1
memory_mb = 256
```
4. Create `Procfile`:
```
web: npm run start:http
```
5. Deploy:
```bash
fly launch --no-deploy
fly deploy
```
6. Your app will be at: `https://hpr-knowledge-base.fly.dev`
**Advantages**:
- Global edge deployment
- Auto-scaling
- Good free tier
---
### Option 4: Vercel (Serverless)
**Cost**: Free tier generous (100GB bandwidth), Pro at $20/mo
**Note**: Serverless functions have cold starts and are less ideal for MCP's persistent connection model, but can work.
**Steps**:
1. Install Vercel CLI:
```bash
npm install -g vercel
```
2. Create `vercel.json`:
```json
{
"version": 2,
"builds": [
{
"src": "server-http.js",
"use": "@vercel/node"
}
],
"routes": [
{
"src": "/(.*)",
"dest": "server-http.js"
}
]
}
```
3. Deploy:
```bash
vercel
```
4. Your app will be at: `https://hpr-knowledge-base.vercel.app`
**Limitations**:
- 10 second timeout on hobby plan
- Cold starts may affect first request
- Less suitable for SSE persistent connections
---
### Option 5: Self-Hosted VPS
**Cost**: $4-6/mo (DigitalOcean, Hetzner, Linode)
**Steps**:
1. Create a VPS with Ubuntu 22.04
2. SSH into your server:
```bash
ssh root@your-server-ip
```
3. Install Node.js:
```bash
curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
apt-get install -y nodejs
```
4. Clone your repository:
```bash
git clone https://github.com/yourusername/hpr-knowledge-base.git
cd hpr-knowledge-base
npm install
```
5. Install PM2 for process management:
```bash
npm install -g pm2
```
6. Start the server:
```bash
pm2 start server-http.js --name hpr-mcp
pm2 save
pm2 startup
```
7. Set up nginx reverse proxy:
```bash
apt-get install nginx
```
Create `/etc/nginx/sites-available/hpr-mcp`:
```nginx
server {
listen 80;
server_name your-domain.com;
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;
}
}
```
Enable site:
```bash
ln -s /etc/nginx/sites-available/hpr-mcp /etc/nginx/sites-enabled/
nginx -t
systemctl restart nginx
```
8. (Optional) Add SSL with Let's Encrypt:
```bash
apt-get install certbot python3-certbot-nginx
certbot --nginx -d your-domain.com
```
---
## Configuration
### Environment Variables
- `PORT`: Server port (default: 3000)
- All other configuration is in `server-http.js`
### Adjusting Limits
Edit these constants in `server-http.js`:
```javascript
const MAX_CONCURRENT_REQUESTS = 10; // Max concurrent connections
const REQUEST_TIMEOUT_MS = 30000; // Request timeout (30s)
const RATE_LIMIT_MAX_REQUESTS = 50; // Requests per minute per IP
const MEMORY_THRESHOLD_MB = 450; // Memory limit before rejection
const CIRCUIT_BREAKER_THRESHOLD = 5; // Failures before circuit opens
```
## Monitoring
### Health Checks
All platforms should use the `/health` endpoint:
```bash
curl https://your-server.com/health
```
### Logs
**Render/Railway/Fly**: Check platform dashboard for logs
**Self-hosted**: Use PM2:
```bash
pm2 logs hpr-mcp
```
### Metrics to Monitor
- Response time
- Error rate
- Memory usage
- Active connections
- Rate limit hits
## Troubleshooting
### High Memory Usage
The server loads ~35MB of data on startup. If memory usage exceeds 450MB:
- Increase server RAM
- Reduce `MAX_CONCURRENT_REQUESTS`
- Check for memory leaks
### Circuit Breaker Opening
If the circuit breaker opens frequently:
- Check error logs
- Verify data files are not corrupted
- Increase `CIRCUIT_BREAKER_THRESHOLD`
### Rate Limiting Issues
If legitimate users hit rate limits:
- Increase `RATE_LIMIT_MAX_REQUESTS`
- Implement authentication for higher limits
- Consider using API keys
### Connection Timeouts
If requests timeout:
- Increase `REQUEST_TIMEOUT_MS`
- Check server performance
- Verify network connectivity
## Security Considerations
1. **CORS**: Currently allows all origins. Restrict in production:
```javascript
app.use(cors({
origin: 'https://your-allowed-domain.com'
}));
```
2. **Rate Limiting**: Adjust based on expected traffic
3. **HTTPS**: Always use HTTPS in production
4. **Environment Variables**: Use platform secrets for sensitive config
## Updating the Server
### Platform Deployments
Most platforms auto-deploy on git push. Otherwise:
**Render**: Push to git, auto-deploys
**Railway**: `railway up` or push to git
**Fly**: `fly deploy`
**Vercel**: `vercel --prod`
### Self-Hosted
```bash
cd hpr-knowledge-base
git pull
npm install
pm2 restart hpr-mcp
```
## Cost Estimates
| Platform | Free Tier | Paid Tier | Best For |
|----------|-----------|-----------|----------|
| Render | Yes (sleeps) | $7/mo | Always-on, simple |
| Railway | $5 credit | ~$5-10/mo | Pay-per-use |
| Fly.io | 256MB RAM | ~$3-5/mo | Global deployment |
| Vercel | 100GB bandwidth | $20/mo | High traffic |
| VPS | No | $4-6/mo | Full control |
## Support
For deployment issues:
- Check platform documentation
- Review server logs
- Test locally first
- Open an issue on GitHub
## Next Steps
After deployment:
1. Test the `/health` endpoint
2. Try the `/sse` endpoint with an MCP client
3. Monitor logs for errors
4. Set up alerts for downtime
5. Document your deployment URL