Open signaling and tracking server for peer discovery in distributed P2P applications. Features: - REST API for WebRTC peer discovery and signaling - Origin-based session isolation - Multiple storage backends (SQLite, in-memory, Cloudflare KV) - Docker and Cloudflare Workers deployment support - Automatic session cleanup and expiration 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
7.1 KiB
Deployment Guide
This guide covers deploying Rondevu to various platforms.
Table of Contents
Cloudflare Workers
Deploy to Cloudflare's edge network using Cloudflare Workers and KV storage.
Prerequisites
npm install -g wrangler
Setup
-
Login to Cloudflare
wrangler login -
Create KV Namespace
# For production wrangler kv:namespace create SESSIONS # This will output something like: # { binding = "SESSIONS", id = "abc123..." } -
Update wrangler.toml
Edit
wrangler.tomland replaceYOUR_KV_NAMESPACE_IDwith the ID from step 2:[[kv_namespaces]] binding = "SESSIONS" id = "abc123..." # Your actual KV namespace ID -
Configure Environment Variables (Optional)
Update
wrangler.tomlto customize settings:[vars] SESSION_TIMEOUT = "300000" # Session timeout in milliseconds CORS_ORIGINS = "https://example.com,https://app.example.com"
Local Development
# Run locally with Wrangler
npx wrangler dev
# The local development server will:
# - Start on http://localhost:8787
# - Use a local KV namespace automatically
# - Hot-reload on file changes
Production Deployment
# Deploy to Cloudflare Workers
npx wrangler deploy
# This will output your worker URL:
# https://rondevu.YOUR_SUBDOMAIN.workers.dev
Custom Domain (Optional)
- Go to your Cloudflare Workers dashboard
- Select your worker
- Click "Triggers" → "Add Custom Domain"
- Enter your domain (e.g.,
api.example.com)
Monitoring
View logs and analytics:
# Stream real-time logs
npx wrangler tail
# View in dashboard
# Visit: https://dash.cloudflare.com → Workers & Pages
Environment Variables
| Variable | Default | Description |
|---|---|---|
SESSION_TIMEOUT |
300000 |
Session timeout in milliseconds |
CORS_ORIGINS |
* |
Comma-separated allowed origins |
Pricing
Cloudflare Workers Free Tier includes:
- 100,000 requests/day
- 10ms CPU time per request
- KV: 100,000 reads/day, 1,000 writes/day
For higher usage, see Cloudflare Workers pricing.
Advantages
- Global Edge Network: Deploy to 300+ locations worldwide
- Instant Scaling: Handles traffic spikes automatically
- Low Latency: Runs close to your users
- No Server Management: Fully serverless
- Free Tier: Generous limits for small projects
Docker
Quick Start
# Build
docker build -t rondevu .
# Run with in-memory SQLite
docker run -p 3000:3000 -e STORAGE_PATH=:memory: rondevu
# Run with persistent SQLite
docker run -p 3000:3000 \
-v $(pwd)/data:/app/data \
-e STORAGE_PATH=/app/data/sessions.db \
rondevu
Docker Compose
Create a docker-compose.yml:
version: '3.8'
services:
rondevu:
build: .
ports:
- "3000:3000"
environment:
- PORT=3000
- STORAGE_TYPE=sqlite
- STORAGE_PATH=/app/data/sessions.db
- SESSION_TIMEOUT=300000
- CORS_ORIGINS=*
volumes:
- ./data:/app/data
restart: unless-stopped
Run with:
docker-compose up -d
Environment Variables
| Variable | Default | Description |
|---|---|---|
PORT |
3000 |
Server port |
STORAGE_TYPE |
sqlite |
Storage backend |
STORAGE_PATH |
/app/data/sessions.db |
SQLite database path |
SESSION_TIMEOUT |
300000 |
Session timeout in ms |
CORS_ORIGINS |
* |
Allowed CORS origins |
Node.js
Production Deployment
-
Install Dependencies
npm ci --production -
Build TypeScript
npm run build -
Set Environment Variables
export PORT=3000 export STORAGE_TYPE=sqlite export STORAGE_PATH=./data/sessions.db export SESSION_TIMEOUT=300000 export CORS_ORIGINS=* -
Run
npm start
Process Manager (PM2)
For production, use a process manager like PM2:
-
Install PM2
npm install -g pm2 -
Create ecosystem.config.js
module.exports = { apps: [{ name: 'rondevu', script: './dist/index.js', instances: 'max', exec_mode: 'cluster', env: { NODE_ENV: 'production', PORT: 3000, STORAGE_TYPE: 'sqlite', STORAGE_PATH: './data/sessions.db', SESSION_TIMEOUT: 300000, CORS_ORIGINS: '*' } }] }; -
Start with PM2
pm2 start ecosystem.config.js pm2 save pm2 startup
Systemd Service
Create /etc/systemd/system/rondevu.service:
[Unit]
Description=Rondevu Peer Discovery and Signaling Server
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/opt/rondevu
ExecStart=/usr/bin/node dist/index.js
Restart=on-failure
Environment=PORT=3000
Environment=STORAGE_TYPE=sqlite
Environment=STORAGE_PATH=/opt/rondevu/data/sessions.db
Environment=SESSION_TIMEOUT=300000
Environment=CORS_ORIGINS=*
[Install]
WantedBy=multi-user.target
Enable and start:
sudo systemctl enable rondevu
sudo systemctl start rondevu
sudo systemctl status rondevu
Troubleshooting
Docker
Issue: Permission denied on /app/data
- Ensure volume permissions are correct
- The container runs as user
node(UID 1000)
Issue: Database locked
- Don't share the same SQLite database file across multiple containers
- Use one instance or implement a different storage backend
Node.js
Issue: EADDRINUSE
- Port is already in use, change
PORTenvironment variable
Issue: Database is locked
- Another process is using the database
- Ensure only one instance is running with the same database file
Performance Tuning
Node.js/Docker
- Set
SESSION_TIMEOUTappropriately to balance resource usage - For high traffic, use
STORAGE_PATH=:memory:with session replication - Consider horizontal scaling with a shared database backend
Security Considerations
-
HTTPS: Always use HTTPS in production
- Use a reverse proxy (nginx, Caddy) for Node.js deployments
- Docker deployments should be behind a reverse proxy
-
Rate Limiting: Implement rate limiting at the proxy level
-
CORS: Configure CORS origins appropriately
- Don't use
*in production - Set specific allowed origins:
https://example.com,https://app.example.com
- Don't use
-
Input Validation: SDP offers/answers are stored as-is; validate on client side
-
Session Codes: UUID v4 codes provide strong entropy (2^122 combinations)
-
Origin Isolation: Sessions are isolated by Origin header to organize topics by domain
Scaling
Horizontal Scaling
- Docker/Node.js: Use a shared database (not SQLite) for multiple instances
- Implement a Redis or PostgreSQL storage adapter
Vertical Scaling
- Increase
SESSION_TIMEOUTor cleanup frequency as needed - Monitor database size and connection pool
- For Node.js, monitor memory usage and increase if needed