309 lines
7.1 KiB
Markdown
309 lines
7.1 KiB
Markdown
|
|
# Multi-User Server Comparison
|
||
|
|
|
||
|
|
## TL;DR: Which Should You Use?
|
||
|
|
|
||
|
|
| Situation | Recommended Solution |
|
||
|
|
|-----------|---------------------|
|
||
|
|
| **Shared hosting (cPanel, etc.)** | **PHP Polling** (display-polling.php) |
|
||
|
|
| **VPS or cloud server** | **Node.js** (best performance) |
|
||
|
|
| **Quick test/demo** | **PHP Polling** (easiest) |
|
||
|
|
| **Production with many users** | **Node.js** (most reliable) |
|
||
|
|
| **No server access** | Use local-only mode |
|
||
|
|
|
||
|
|
## Detailed Comparison
|
||
|
|
|
||
|
|
### 1. PHP with SSE (Original - server.php + display.php)
|
||
|
|
|
||
|
|
**Status:** ⚠️ **PROBLEMATIC** - Not recommended
|
||
|
|
|
||
|
|
**Problems:**
|
||
|
|
- PHP-FPM buffers output (SSE doesn't work)
|
||
|
|
- Apache/Nginx proxy timeouts
|
||
|
|
- Shared hosting often blocks long connections
|
||
|
|
- High resource usage (one PHP process per viewer)
|
||
|
|
|
||
|
|
**When it might work:**
|
||
|
|
- Only with specific Apache configurations
|
||
|
|
- Not on shared hosting with PHP-FPM
|
||
|
|
- Requires `ProxyTimeout` settings
|
||
|
|
|
||
|
|
**Verdict:** ❌ Avoid unless you have full server control and can configure Apache properly
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### 2. PHP with Polling (NEW - display-polling.php)
|
||
|
|
|
||
|
|
**Status:** ✅ **RECOMMENDED for PHP**
|
||
|
|
|
||
|
|
**Pros:**
|
||
|
|
- ✅ Works on ANY shared hosting
|
||
|
|
- ✅ No buffering issues
|
||
|
|
- ✅ No special configuration needed
|
||
|
|
- ✅ Simple to deploy (just upload files)
|
||
|
|
- ✅ Uses standard HTTP requests
|
||
|
|
|
||
|
|
**Cons:**
|
||
|
|
- ❌ Higher latency (1-2 seconds)
|
||
|
|
- ❌ More server requests (polls every second)
|
||
|
|
- ❌ Slightly higher bandwidth
|
||
|
|
|
||
|
|
**Performance:**
|
||
|
|
- Latency: 1-2 seconds
|
||
|
|
- Max users: 20-30 concurrent viewers
|
||
|
|
- Resource usage: Moderate
|
||
|
|
|
||
|
|
**Best for:**
|
||
|
|
- Shared hosting (cPanel, Bluehost, etc.)
|
||
|
|
- Quick deployment
|
||
|
|
- Small to medium groups
|
||
|
|
|
||
|
|
**Setup:**
|
||
|
|
```bash
|
||
|
|
# Just upload these files:
|
||
|
|
server.php
|
||
|
|
display-polling.php # ← Use this instead of display.php
|
||
|
|
config.php
|
||
|
|
```
|
||
|
|
|
||
|
|
**OBS URL:**
|
||
|
|
```
|
||
|
|
https://your-site.com/transcription/display-polling.php?room=ROOM&fade=10
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### 3. Node.js Server (NEW - server/nodejs/)
|
||
|
|
|
||
|
|
**Status:** ⭐ **BEST PERFORMANCE**
|
||
|
|
|
||
|
|
**Pros:**
|
||
|
|
- ✅ Native WebSocket support
|
||
|
|
- ✅ Real-time updates (< 100ms latency)
|
||
|
|
- ✅ Handles 100+ concurrent connections easily
|
||
|
|
- ✅ Lower resource usage
|
||
|
|
- ✅ No buffering issues
|
||
|
|
- ✅ Event-driven architecture
|
||
|
|
|
||
|
|
**Cons:**
|
||
|
|
- ❌ Requires VPS or cloud server
|
||
|
|
- ❌ Need to install Node.js
|
||
|
|
- ❌ More setup than PHP
|
||
|
|
|
||
|
|
**Performance:**
|
||
|
|
- Latency: < 100ms
|
||
|
|
- Max users: 500+ concurrent
|
||
|
|
- Resource usage: Very low (~50MB RAM)
|
||
|
|
|
||
|
|
**Best for:**
|
||
|
|
- Production deployments
|
||
|
|
- Large groups (10+ streamers)
|
||
|
|
- Professional use
|
||
|
|
- Anyone with a VPS
|
||
|
|
|
||
|
|
**Setup:**
|
||
|
|
```bash
|
||
|
|
cd server/nodejs
|
||
|
|
npm install
|
||
|
|
npm start
|
||
|
|
```
|
||
|
|
|
||
|
|
**Free hosting options:**
|
||
|
|
- Railway.app (free tier)
|
||
|
|
- Heroku (free tier)
|
||
|
|
- Fly.io (free tier)
|
||
|
|
- Any $5/month VPS (DigitalOcean, Linode)
|
||
|
|
|
||
|
|
**OBS URL:**
|
||
|
|
```
|
||
|
|
http://your-server.com:3000/display?room=ROOM&fade=10
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Feature Comparison Matrix
|
||
|
|
|
||
|
|
| Feature | PHP SSE | PHP Polling | Node.js |
|
||
|
|
|---------|---------|-------------|---------|
|
||
|
|
| **Real-time** | ⚠️ Should be, but breaks | ⚠️ 1-2s delay | ✅ < 100ms |
|
||
|
|
| **Reliability** | ❌ Buffering issues | ✅ Very reliable | ✅ Very reliable |
|
||
|
|
| **Shared Hosting** | ❌ Usually fails | ✅ Works everywhere | ❌ Needs VPS |
|
||
|
|
| **Setup Difficulty** | 🟡 Medium | 🟢 Easy | 🟡 Medium |
|
||
|
|
| **Max Users** | 10 | 30 | 500+ |
|
||
|
|
| **Resource Usage** | High | Medium | Low |
|
||
|
|
| **Latency** | Should be instant, but... | 1-2 seconds | < 100ms |
|
||
|
|
| **Cost** | $5-10/month hosting | $5-10/month hosting | Free - $5/month |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Migration Guide
|
||
|
|
|
||
|
|
### From PHP SSE to PHP Polling
|
||
|
|
|
||
|
|
**Super easy - just change the URL:**
|
||
|
|
|
||
|
|
Old:
|
||
|
|
```
|
||
|
|
https://your-site.com/transcription/display.php?room=ROOM
|
||
|
|
```
|
||
|
|
|
||
|
|
New:
|
||
|
|
```
|
||
|
|
https://your-site.com/transcription/display-polling.php?room=ROOM
|
||
|
|
```
|
||
|
|
|
||
|
|
Everything else stays the same! The desktop app doesn't need changes.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### From PHP to Node.js
|
||
|
|
|
||
|
|
**1. Deploy Node.js server** (see server/nodejs/README.md)
|
||
|
|
|
||
|
|
**2. Update desktop app settings:**
|
||
|
|
|
||
|
|
Old (PHP):
|
||
|
|
```
|
||
|
|
Server URL: https://your-site.com/transcription/server.php
|
||
|
|
```
|
||
|
|
|
||
|
|
New (Node.js):
|
||
|
|
```
|
||
|
|
Server URL: http://your-server.com:3000/api/send
|
||
|
|
```
|
||
|
|
|
||
|
|
**3. Update OBS browser source:**
|
||
|
|
|
||
|
|
Old (PHP):
|
||
|
|
```
|
||
|
|
https://your-site.com/transcription/display.php?room=ROOM
|
||
|
|
```
|
||
|
|
|
||
|
|
New (Node.js):
|
||
|
|
```
|
||
|
|
http://your-server.com:3000/display?room=ROOM&fade=10
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Testing Your Setup
|
||
|
|
|
||
|
|
### Test PHP Polling
|
||
|
|
|
||
|
|
1. Upload files to server
|
||
|
|
2. Visit: `https://your-site.com/transcription/server.php`
|
||
|
|
- Should see JSON response
|
||
|
|
3. Visit: `https://your-site.com/transcription/display-polling.php?room=test`
|
||
|
|
- Should see "🟡 Waiting for data..."
|
||
|
|
4. Send a test message:
|
||
|
|
```bash
|
||
|
|
curl -X POST "https://your-site.com/transcription/server.php?action=send" \
|
||
|
|
-H "Content-Type: application/json" \
|
||
|
|
-d '{
|
||
|
|
"room": "test",
|
||
|
|
"passphrase": "testpass",
|
||
|
|
"user_name": "TestUser",
|
||
|
|
"text": "Hello World",
|
||
|
|
"timestamp": "12:34:56"
|
||
|
|
}'
|
||
|
|
```
|
||
|
|
5. Display should show "Hello World" within 1-2 seconds
|
||
|
|
|
||
|
|
### Test Node.js
|
||
|
|
|
||
|
|
1. Start server: `npm start`
|
||
|
|
2. Visit: `http://localhost:3000`
|
||
|
|
- Should see JSON response
|
||
|
|
3. Visit: `http://localhost:3000/display?room=test`
|
||
|
|
- Should see "⚫ Connecting..." then "🟢 Connected"
|
||
|
|
4. Send test message (same curl as above, but to `http://localhost:3000/api/send`)
|
||
|
|
5. Display should show message instantly
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Troubleshooting
|
||
|
|
|
||
|
|
### PHP Polling Issues
|
||
|
|
|
||
|
|
**"Status stays yellow"**
|
||
|
|
- Room doesn't exist yet
|
||
|
|
- Send a message from desktop app first
|
||
|
|
|
||
|
|
**"Gets 500 error"**
|
||
|
|
- Check PHP error logs
|
||
|
|
- Verify `data/` directory is writable
|
||
|
|
|
||
|
|
**"Slow updates (5+ seconds)"**
|
||
|
|
- Increase poll interval: `?poll=500` (500ms)
|
||
|
|
- Check server load
|
||
|
|
|
||
|
|
### Node.js Issues
|
||
|
|
|
||
|
|
**"Cannot connect"**
|
||
|
|
- Check firewall allows port 3000
|
||
|
|
- Verify server is running: `curl http://localhost:3000`
|
||
|
|
|
||
|
|
**"WebSocket failed"**
|
||
|
|
- Check browser console for errors
|
||
|
|
- Try different port
|
||
|
|
- Check reverse proxy settings if using Nginx
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Recommendations by Use Case
|
||
|
|
|
||
|
|
### Solo Streamer (Local Only)
|
||
|
|
**Use:** Built-in web server (no multi-user server needed)
|
||
|
|
- Just run the desktop app
|
||
|
|
- OBS: `http://localhost:8080`
|
||
|
|
|
||
|
|
### 2-3 Friends on Shared Hosting
|
||
|
|
**Use:** PHP Polling
|
||
|
|
- Upload to your existing web hosting
|
||
|
|
- Cost: $0 (use existing hosting)
|
||
|
|
- Setup time: 5 minutes
|
||
|
|
|
||
|
|
### 5+ Streamers, Want Best Quality
|
||
|
|
**Use:** Node.js on VPS
|
||
|
|
- Deploy to Railway.app (free) or DigitalOcean ($5/month)
|
||
|
|
- Real-time updates
|
||
|
|
- Professional quality
|
||
|
|
|
||
|
|
### Large Event/Convention
|
||
|
|
**Use:** Node.js on cloud
|
||
|
|
- Deploy to AWS/Azure/GCP
|
||
|
|
- Use load balancer for redundancy
|
||
|
|
- Can handle hundreds of users
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Cost Breakdown
|
||
|
|
|
||
|
|
### PHP Polling
|
||
|
|
- **Shared hosting:** $5-10/month (or free if you already have hosting)
|
||
|
|
- **Total:** $5-10/month
|
||
|
|
|
||
|
|
### Node.js
|
||
|
|
- **Free options:**
|
||
|
|
- Railway.app (500 hours/month free)
|
||
|
|
- Heroku (free dyno)
|
||
|
|
- Fly.io (free tier)
|
||
|
|
- **Paid options:**
|
||
|
|
- DigitalOcean Droplet: $5/month
|
||
|
|
- Linode: $5/month
|
||
|
|
- AWS EC2 t2.micro: $8/month (or free tier)
|
||
|
|
- **Total:** $0-8/month
|
||
|
|
|
||
|
|
### Just Use Local Mode
|
||
|
|
- **Cost:** $0
|
||
|
|
- **Limitation:** Only shows your own transcriptions (no multi-user sync)
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Final Recommendation
|
||
|
|
|
||
|
|
**For most users:** Start with **PHP Polling** on shared hosting. It works reliably and is dead simple.
|
||
|
|
|
||
|
|
**If you want the best:** Use **Node.js** - it's worth the extra setup for the performance.
|
||
|
|
|
||
|
|
**For testing:** Use **local mode** (no server) - built into the desktop app.
|