Applied new local config
This commit is contained in:
parent
075ae28dd7
commit
64924f9999
49
.env.production
Normal file
49
.env.production
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
# CONFIGURACIÓN PARA EASYPANEL + LIVEKIT SELF-HOSTED
|
||||||
|
|
||||||
|
# ===========================================
|
||||||
|
# CONFIGURACIÓN BÁSICA
|
||||||
|
# ===========================================
|
||||||
|
NODE_ENV=production
|
||||||
|
MEET_LOG_LEVEL=info
|
||||||
|
MEET_BLOB_STORAGE_MODE=memory
|
||||||
|
|
||||||
|
# ===========================================
|
||||||
|
# USUARIO ADMINISTRADOR
|
||||||
|
# ===========================================
|
||||||
|
ADMIN_USER=admin
|
||||||
|
ADMIN_PASSWORD=admin123
|
||||||
|
|
||||||
|
# ===========================================
|
||||||
|
# LIVEKIT SELF-HOSTED (RED LOCAL + PÚBLICO)
|
||||||
|
# ===========================================
|
||||||
|
# ✅ LiveKit corriendo en servidor dedicado
|
||||||
|
# ✅ Puertos UDP expuestos en router
|
||||||
|
# ✅ SSL/WSS configurado
|
||||||
|
|
||||||
|
# URL de tu LiveKit self-hosted (cambiar por tu dominio/IP)
|
||||||
|
LIVEKIT_URL=wss://mi-livekit.duckdns.org
|
||||||
|
# O con IP fija: wss://TU_IP_PUBLICA:443
|
||||||
|
|
||||||
|
LIVEKIT_API_KEY=production-key
|
||||||
|
LIVEKIT_API_SECRET=tu-super-secret-de-32-caracteres-o-mas
|
||||||
|
|
||||||
|
# ===========================================
|
||||||
|
# REDIS (OPCIONAL para EasyPanel)
|
||||||
|
# ===========================================
|
||||||
|
# Si quieres Redis también en EasyPanel
|
||||||
|
# REDIS_HOST=redis
|
||||||
|
# REDIS_PORT=6379
|
||||||
|
# REDIS_PASSWORD=admin-redis
|
||||||
|
|
||||||
|
# ===========================================
|
||||||
|
# ARQUITECTURA FINAL:
|
||||||
|
# ===========================================
|
||||||
|
# Internet → Router (Port Forward) → LiveKit Server (192.168.1.19)
|
||||||
|
# ↘ EasyPanel → OpenVidu Meet Backend
|
||||||
|
#
|
||||||
|
# Ventajas:
|
||||||
|
# ✅ Control total sobre LiveKit
|
||||||
|
# ✅ Sin costos mensuales externos
|
||||||
|
# ✅ Rendimiento en red local
|
||||||
|
# ✅ Acceso desde internet
|
||||||
|
# ✅ Escalable según hardware
|
||||||
13
.npmrc
13
.npmrc
@ -1,10 +1,18 @@
|
|||||||
|
# Docker/CI specific npm configuration
|
||||||
|
# This configuration is used during Docker builds and CI workflows
|
||||||
|
# to prevent linking workspace packages and use published versions instead
|
||||||
|
|
||||||
|
# Disable workspace package linking
|
||||||
|
# This forces pnpm to install packages from registry or local tarballs
|
||||||
|
link-workspace-packages=false
|
||||||
|
|
||||||
# Strict peer dependencies
|
# Strict peer dependencies
|
||||||
strict-peer-dependencies=false
|
strict-peer-dependencies=false
|
||||||
|
|
||||||
# Auto install peers
|
# Auto install peers
|
||||||
auto-install-peers=true
|
auto-install-peers=true
|
||||||
|
|
||||||
# Shamefully hoist - neccessary for some packages
|
# Shamefully hoist - necessary for some packages
|
||||||
shamefully-hoist=true
|
shamefully-hoist=true
|
||||||
|
|
||||||
# Node linker - use hoisted for full compatibility
|
# Node linker - use hoisted for full compatibility
|
||||||
@ -12,6 +20,3 @@ node-linker=hoisted
|
|||||||
|
|
||||||
# Lockfile settings
|
# Lockfile settings
|
||||||
lockfile=true
|
lockfile=true
|
||||||
|
|
||||||
# Optional: Store location (uncomment if you want to customize)
|
|
||||||
# store-dir=.pnpm-store
|
|
||||||
|
|||||||
65
CLOUDFLARE-TUNNEL-CONFIG.md
Normal file
65
CLOUDFLARE-TUNNEL-CONFIG.md
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
# CLOUDFLARE TUNNEL - SIN PORT FORWARDING
|
||||||
|
|
||||||
|
## ☁️ Cloudflare Tunnel para LiveKit (Avanzado)
|
||||||
|
|
||||||
|
### Ventajas:
|
||||||
|
- ✅ **Sin port forwarding** en router
|
||||||
|
- ✅ **SSL automático**
|
||||||
|
- ✅ **Protección DDoS**
|
||||||
|
- ✅ **IP oculta**
|
||||||
|
|
||||||
|
### ⚠️ Limitaciones para WebRTC:
|
||||||
|
- ❌ **UDP no soportado** directamente
|
||||||
|
- ⚠️ **Requiere TURN server** para WebRTC
|
||||||
|
- 🔧 **Solo TCP/HTTP** a través del tunnel
|
||||||
|
|
||||||
|
### Configuración (solo si tienes TURN server):
|
||||||
|
|
||||||
|
#### Paso 1: Instalar cloudflared
|
||||||
|
```bash
|
||||||
|
# Descargar cloudflared
|
||||||
|
curl -L --output cloudflared.deb https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
|
||||||
|
sudo dpkg -i cloudflared.deb
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Paso 2: Crear tunnel
|
||||||
|
```bash
|
||||||
|
# Login a Cloudflare
|
||||||
|
cloudflared tunnel login
|
||||||
|
|
||||||
|
# Crear tunnel
|
||||||
|
cloudflared tunnel create livekit-tunnel
|
||||||
|
|
||||||
|
# Configurar tunnel
|
||||||
|
cat > ~/.cloudflared/config.yml << 'EOF'
|
||||||
|
tunnel: livekit-tunnel
|
||||||
|
credentials-file: /home/usuario/.cloudflared/livekit-tunnel.json
|
||||||
|
|
||||||
|
ingress:
|
||||||
|
- hostname: livekit.midominio.com
|
||||||
|
service: http://localhost:7880
|
||||||
|
- service: http_status:404
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Crear DNS record
|
||||||
|
cloudflared tunnel route dns livekit-tunnel livekit.midominio.com
|
||||||
|
|
||||||
|
# Ejecutar tunnel
|
||||||
|
cloudflared tunnel run livekit-tunnel
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Configuración LiveKit (necesita TURN):
|
||||||
|
```yaml
|
||||||
|
# livekit-production.yaml
|
||||||
|
rtc:
|
||||||
|
# SIN puertos UDP directos - usar TURN
|
||||||
|
use_external_ip: false
|
||||||
|
|
||||||
|
ice_servers:
|
||||||
|
- urls: ["stun:stun.l.google.com:19302"]
|
||||||
|
- urls: ["turn:turn.midominio.com:3478"]
|
||||||
|
username: "usuario"
|
||||||
|
credential: "password"
|
||||||
|
```
|
||||||
|
|
||||||
|
### ⚠️ **NO RECOMENDADO** para LiveKit porque WebRTC necesita UDP
|
||||||
65
CONFIG-ACCESO-PUBLICO.md
Normal file
65
CONFIG-ACCESO-PUBLICO.md
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
# CONFIGURACIÓN AVANZADA: ACCESO DESDE INTERNET
|
||||||
|
|
||||||
|
## 🌍 Para usuarios externos (más complejo y riesgoso)
|
||||||
|
|
||||||
|
### ⚠️ PROBLEMAS de exponer UDP públicamente:
|
||||||
|
|
||||||
|
1. **Seguridad**: 10,000 puertos UDP expuestos
|
||||||
|
2. **Complejidad**: Port forwarding masivo
|
||||||
|
3. **NAT Traversal**: Problemas con diferentes ISPs
|
||||||
|
4. **Mantenimiento**: Configuración de router compleja
|
||||||
|
|
||||||
|
### Si NECESITAS acceso externo, opciones:
|
||||||
|
|
||||||
|
#### Opción A: TURN Server (RECOMENDADO)
|
||||||
|
```yaml
|
||||||
|
# livekit-public.yaml
|
||||||
|
rtc:
|
||||||
|
use_external_ip: true
|
||||||
|
external_ip: "TU_IP_PUBLICA"
|
||||||
|
|
||||||
|
# Usar TURN para atravesar NAT
|
||||||
|
ice_servers:
|
||||||
|
- urls: ["stun:stun.l.google.com:19302"]
|
||||||
|
- urls: ["turn:tu-turn-server.com:3478"]
|
||||||
|
username: "usuario"
|
||||||
|
credential: "password"
|
||||||
|
|
||||||
|
# Rango reducido de puertos
|
||||||
|
port_range_start: 50000
|
||||||
|
port_range_end: 50100 # Solo 100 puertos
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Opción B: LiveKit Cloud (MÁS RECOMENDADO)
|
||||||
|
```env
|
||||||
|
# .env.production
|
||||||
|
LIVEKIT_URL=wss://tu-proyecto.livekit.cloud
|
||||||
|
LIVEKIT_API_KEY=cloud-api-key
|
||||||
|
LIVEKIT_API_SECRET=cloud-secret
|
||||||
|
|
||||||
|
# ✅ SIN configuración UDP local
|
||||||
|
# ✅ Sin port forwarding
|
||||||
|
# ✅ Infraestructura optimizada
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Opción C: VPN (Para usuarios conocidos)
|
||||||
|
```bash
|
||||||
|
# Configurar WireGuard/OpenVPN
|
||||||
|
# Usuarios se conectan por VPN a tu red local
|
||||||
|
# Acceso como si fueran locales
|
||||||
|
|
||||||
|
# No requiere exponer UDP públicamente
|
||||||
|
# Acceso seguro y controlado
|
||||||
|
```
|
||||||
|
|
||||||
|
### Port Forwarding (Solo si es absolutamente necesario):
|
||||||
|
```
|
||||||
|
⚠️ EN ROUTER:
|
||||||
|
UDP 50000-60000 → 192.168.1.19:50000-60000
|
||||||
|
|
||||||
|
❌ RIESGOS:
|
||||||
|
- 10,000 puertos UDP expuestos
|
||||||
|
- Posibles ataques DDoS
|
||||||
|
- Configuración compleja
|
||||||
|
- Problemas con CGN/CGNAT de ISPs
|
||||||
|
```
|
||||||
36
CONFIG-RED-LOCAL.md
Normal file
36
CONFIG-RED-LOCAL.md
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
# CONFIGURACIÓN RECOMENDADA: SOLO RED LOCAL
|
||||||
|
|
||||||
|
## 🔒 Para uso en red local ÚNICAMENTE
|
||||||
|
|
||||||
|
### Firewall UFW (SOLO red local):
|
||||||
|
```bash
|
||||||
|
# Permitir desde red local solamente
|
||||||
|
sudo ufw allow from 192.168.1.0/24 to any port 50000:60000 proto udp
|
||||||
|
sudo ufw allow from 192.168.1.0/24 to any port 7880 proto tcp
|
||||||
|
sudo ufw allow from 192.168.1.0/24 to any port 80 proto tcp
|
||||||
|
|
||||||
|
# BLOQUEAR acceso externo a UDP
|
||||||
|
sudo ufw deny 50000:60000/udp
|
||||||
|
|
||||||
|
# Verificar que solo red local tenga acceso
|
||||||
|
sudo ufw status numbered
|
||||||
|
```
|
||||||
|
|
||||||
|
### Router/Modem (NO configurar port forwarding):
|
||||||
|
```
|
||||||
|
❌ NO hacer port forwarding de UDP 50000-60000
|
||||||
|
✅ Solo HTTP (puerto 80) si necesitas acceso web externo
|
||||||
|
✅ Usar VPN si necesitas acceso remoto
|
||||||
|
```
|
||||||
|
|
||||||
|
### Ventajas:
|
||||||
|
- ✅ **Seguridad**: UDP no expuesto a internet
|
||||||
|
- ✅ **Simplicidad**: Sin configuración de router
|
||||||
|
- ✅ **Rendimiento**: Conexión directa en LAN
|
||||||
|
- ✅ **Sin NAT**: Sin problemas de traversal
|
||||||
|
|
||||||
|
### Casos de uso:
|
||||||
|
- Oficina local
|
||||||
|
- Casa/familia
|
||||||
|
- Reuniones internas
|
||||||
|
- Desarrollo y testing
|
||||||
107
DOMINIO-PROPIO-CONFIG.md
Normal file
107
DOMINIO-PROPIO-CONFIG.md
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
# CONFIGURACIÓN DOMINIO PROPIO PARA LIVEKIT
|
||||||
|
|
||||||
|
## 🏠 Dominio propio (ej: livekit.midominio.com)
|
||||||
|
|
||||||
|
### Opción A: Subdominio de tu dominio existente
|
||||||
|
|
||||||
|
#### Paso 1: Configurar DNS
|
||||||
|
```
|
||||||
|
Tipo: A
|
||||||
|
Nombre: livekit
|
||||||
|
Valor: TU_IP_PUBLICA
|
||||||
|
TTL: 300
|
||||||
|
|
||||||
|
Resultado: livekit.midominio.com → TU_IP_PUBLICA
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Paso 2: Port forwarding en router
|
||||||
|
```
|
||||||
|
Puerto 80 → 192.168.1.19:80 # HTTP para Let's Encrypt
|
||||||
|
Puerto 443 → 192.168.1.19:443 # HTTPS/WSS
|
||||||
|
Puerto 7880 → 192.168.1.19:7880 # LiveKit API directo
|
||||||
|
Puerto 50000-50100 (UDP) → 192.168.1.19:50000-50100 # WebRTC
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Paso 3: SSL con Let's Encrypt
|
||||||
|
```bash
|
||||||
|
# Instalar certbot
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install certbot nginx
|
||||||
|
|
||||||
|
# Configurar Nginx básico
|
||||||
|
sudo tee /etc/nginx/sites-available/livekit << 'EOF'
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name livekit.midominio.com;
|
||||||
|
|
||||||
|
location /.well-known/acme-challenge/ {
|
||||||
|
root /var/www/html;
|
||||||
|
}
|
||||||
|
|
||||||
|
location / {
|
||||||
|
return 301 https://$server_name$request_uri;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
sudo ln -s /etc/nginx/sites-available/livekit /etc/nginx/sites-enabled/
|
||||||
|
sudo nginx -t && sudo systemctl restart nginx
|
||||||
|
|
||||||
|
# Generar certificado SSL
|
||||||
|
sudo certbot --nginx -d livekit.midominio.com
|
||||||
|
|
||||||
|
# Resultado: certificados en /etc/letsencrypt/live/livekit.midominio.com/
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Paso 4: Configurar Nginx para LiveKit
|
||||||
|
```nginx
|
||||||
|
# /etc/nginx/sites-available/livekit
|
||||||
|
server {
|
||||||
|
listen 443 ssl http2;
|
||||||
|
server_name livekit.midominio.com;
|
||||||
|
|
||||||
|
ssl_certificate /etc/letsencrypt/live/livekit.midominio.com/fullchain.pem;
|
||||||
|
ssl_certificate_key /etc/letsencrypt/live/livekit.midominio.com/privkey.pem;
|
||||||
|
|
||||||
|
# WebSocket proxy para LiveKit
|
||||||
|
location / {
|
||||||
|
proxy_pass http://localhost:7880;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
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;
|
||||||
|
|
||||||
|
# Timeouts para WebRTC
|
||||||
|
proxy_connect_timeout 60s;
|
||||||
|
proxy_send_timeout 60s;
|
||||||
|
proxy_read_timeout 60s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name livekit.midominio.com;
|
||||||
|
return 301 https://$server_name$request_uri;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Paso 5: Auto-renovación SSL
|
||||||
|
```bash
|
||||||
|
# Agregar a crontab
|
||||||
|
sudo crontab -e
|
||||||
|
|
||||||
|
# Renovar certificados automáticamente
|
||||||
|
0 12 * * * /usr/bin/certbot renew --quiet && systemctl reload nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
### URLs finales:
|
||||||
|
- **LiveKit WSS**: `wss://livekit.midominio.com`
|
||||||
|
- **API HTTPS**: `https://livekit.midominio.com`
|
||||||
|
|
||||||
|
### Configurar en OpenVidu Meet:
|
||||||
|
```env
|
||||||
|
LIVEKIT_URL=wss://livekit.midominio.com
|
||||||
|
```
|
||||||
72
DUCKDNS-CONFIG.md
Normal file
72
DUCKDNS-CONFIG.md
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
# CONFIGURACIÓN DUCKDNS PARA LIVEKIT
|
||||||
|
|
||||||
|
## 🦆 DuckDNS - Dominio gratuito para IP dinámica
|
||||||
|
|
||||||
|
### Paso 1: Registrarse en DuckDNS
|
||||||
|
1. Ir a [duckdns.org](https://www.duckdns.org)
|
||||||
|
2. Login con Google/GitHub
|
||||||
|
3. Crear subdominio: `mi-livekit.duckdns.org`
|
||||||
|
4. Copiar el token
|
||||||
|
|
||||||
|
### Paso 2: Script de actualización automática
|
||||||
|
```bash
|
||||||
|
# Crear script de actualización
|
||||||
|
cat > /home/xesar/update-duckdns.sh << 'EOF'
|
||||||
|
#!/bin/bash
|
||||||
|
# Actualizar DuckDNS con IP actual
|
||||||
|
|
||||||
|
DOMAIN="mi-livekit" # Tu subdominio sin .duckdns.org
|
||||||
|
TOKEN="tu-token-aqui" # Token de DuckDNS
|
||||||
|
|
||||||
|
# Obtener IP pública actual
|
||||||
|
CURRENT_IP=$(curl -s https://checkip.amazonaws.com)
|
||||||
|
|
||||||
|
# Actualizar DuckDNS
|
||||||
|
RESPONSE=$(curl -s "https://www.duckdns.org/update?domains=$DOMAIN&token=$TOKEN&ip=$CURRENT_IP")
|
||||||
|
|
||||||
|
if [ "$RESPONSE" = "OK" ]; then
|
||||||
|
echo "$(date): DuckDNS actualizado - $DOMAIN.duckdns.org → $CURRENT_IP"
|
||||||
|
else
|
||||||
|
echo "$(date): ERROR actualizando DuckDNS: $RESPONSE"
|
||||||
|
fi
|
||||||
|
EOF
|
||||||
|
|
||||||
|
chmod +x /home/xesar/update-duckdns.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### Paso 3: Automatizar con cron
|
||||||
|
```bash
|
||||||
|
# Editar crontab
|
||||||
|
crontab -e
|
||||||
|
|
||||||
|
# Agregar línea para actualizar cada 5 minutos:
|
||||||
|
*/5 * * * * /home/xesar/update-duckdns.sh >> /home/xesar/duckdns.log 2>&1
|
||||||
|
```
|
||||||
|
|
||||||
|
### Paso 4: Configurar LiveKit con dominio
|
||||||
|
```yaml
|
||||||
|
# livekit-production.yaml
|
||||||
|
rtc:
|
||||||
|
external_ip: "mi-livekit.duckdns.org" # Tu dominio DuckDNS
|
||||||
|
port_range_start: 50000
|
||||||
|
port_range_end: 50100
|
||||||
|
```
|
||||||
|
|
||||||
|
### Paso 5: Port forwarding en router
|
||||||
|
```
|
||||||
|
Regla: LiveKit-API
|
||||||
|
- Puerto externo: 7880
|
||||||
|
- Puerto interno: 7880
|
||||||
|
- IP: 192.168.1.19
|
||||||
|
- Protocolo: TCP
|
||||||
|
|
||||||
|
Regla: LiveKit-WebRTC
|
||||||
|
- Puerto externo: 50000-50100
|
||||||
|
- Puerto interno: 50000-50100
|
||||||
|
- IP: 192.168.1.19
|
||||||
|
- Protocolo: UDP
|
||||||
|
```
|
||||||
|
|
||||||
|
### URLs finales:
|
||||||
|
- **LiveKit API**: `ws://mi-livekit.duckdns.org:7880`
|
||||||
|
- **Con SSL**: `wss://mi-livekit.duckdns.org:443` (después de configurar SSL)
|
||||||
67
Dockerfile
Normal file
67
Dockerfile
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
# Multi-stage build para OpenVidu Meet
|
||||||
|
FROM node:20-alpine AS builder
|
||||||
|
|
||||||
|
# Instalar pnpm
|
||||||
|
RUN npm install -g pnpm
|
||||||
|
|
||||||
|
# Copiar archivos del workspace
|
||||||
|
WORKDIR /app
|
||||||
|
COPY package.json pnpm-workspace.yaml pnpm-lock.yaml ./
|
||||||
|
COPY meet-ce/backend/package.json ./meet-ce/backend/
|
||||||
|
COPY meet-ce/frontend/package.json ./meet-ce/frontend/
|
||||||
|
COPY meet-ce/frontend/projects/shared-meet-components/package.json ./meet-ce/frontend/projects/shared-meet-components/
|
||||||
|
|
||||||
|
# Instalar dependencias
|
||||||
|
RUN pnpm install --frozen-lockfile
|
||||||
|
|
||||||
|
# Copiar código fuente
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
# Build backend
|
||||||
|
WORKDIR /app/meet-ce/backend
|
||||||
|
RUN pnpm run build
|
||||||
|
|
||||||
|
# Build frontend
|
||||||
|
WORKDIR /app/meet-ce/frontend
|
||||||
|
RUN pnpm run build:prod
|
||||||
|
|
||||||
|
# Imagen de producción
|
||||||
|
FROM node:20-alpine AS production
|
||||||
|
|
||||||
|
# Instalar pnpm
|
||||||
|
RUN npm install -g pnpm
|
||||||
|
|
||||||
|
# Crear usuario no-root
|
||||||
|
RUN addgroup -g 1001 -S nodejs && \
|
||||||
|
adduser -S openvidu -u 1001
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Copiar package.json y dependencias
|
||||||
|
COPY package.json pnpm-workspace.yaml pnpm-lock.yaml ./
|
||||||
|
COPY meet-ce/backend/package.json ./meet-ce/backend/
|
||||||
|
|
||||||
|
# Instalar solo dependencias de producción
|
||||||
|
RUN pnpm install --prod --frozen-lockfile
|
||||||
|
|
||||||
|
# Copiar archivos compilados
|
||||||
|
COPY --from=builder /app/meet-ce/backend/dist ./meet-ce/backend/dist
|
||||||
|
COPY --from=builder /app/meet-ce/backend/public ./meet-ce/backend/public
|
||||||
|
|
||||||
|
# Cambiar propietario
|
||||||
|
RUN chown -R openvidu:nodejs /app
|
||||||
|
|
||||||
|
USER openvidu
|
||||||
|
|
||||||
|
# Variables de entorno por defecto
|
||||||
|
ENV NODE_ENV=production
|
||||||
|
ENV PORT=6080
|
||||||
|
ENV MEET_BLOB_STORAGE_MODE=memory
|
||||||
|
ENV MEET_LOG_LEVEL=info
|
||||||
|
|
||||||
|
# Exponer puerto
|
||||||
|
EXPOSE 6080
|
||||||
|
|
||||||
|
# Comando de inicio
|
||||||
|
WORKDIR /app/meet-ce/backend
|
||||||
|
CMD ["node", "dist/src/server.js"]
|
||||||
52
EASYPANEL-COMPARACION.md
Normal file
52
EASYPANEL-COMPARACION.md
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
# COMPARACIÓN: OPCIONES PARA EASYPANEL
|
||||||
|
|
||||||
|
## 📊 Tabla comparativa
|
||||||
|
|
||||||
|
| Opción | Configuración UDP | Costo | Complejidad | Rendimiento | Recomendado |
|
||||||
|
|--------|------------------|-------|-------------|-------------|-------------|
|
||||||
|
| **LiveKit Cloud** | ❌ No necesario | $20-100/mes | ⭐ Muy fácil | ⭐⭐⭐ Excelente | ✅ **SÍ** |
|
||||||
|
| **VPS Híbrido** | ✅ En VPS separado | $10-30/mes | ⭐⭐ Medio | ⭐⭐⭐ Excelente | ⚠️ Si budget limitado |
|
||||||
|
| **TURN Server** | ✅ 3 puertos en VPS | $5-15/mes | ⭐⭐⭐ Complejo | ⭐⭐ Bueno | ⚠️ Para expertos |
|
||||||
|
| **EasyPanel Solo** | ❌ Imposible | $0 extra | ❌ No funciona | ❌ No WebRTC | ❌ NO |
|
||||||
|
|
||||||
|
## 🏆 RECOMENDACIÓN FINAL
|
||||||
|
|
||||||
|
### Para la mayoría de casos: **LiveKit Cloud**
|
||||||
|
|
||||||
|
```env
|
||||||
|
# .env.production para EasyPanel
|
||||||
|
LIVEKIT_URL=wss://tu-proyecto.livekit.cloud
|
||||||
|
LIVEKIT_API_KEY=api-key-de-cloud
|
||||||
|
LIVEKIT_API_SECRET=secret-de-cloud
|
||||||
|
```
|
||||||
|
|
||||||
|
### Ventajas de LiveKit Cloud:
|
||||||
|
- ✅ **Cero configuración UDP**
|
||||||
|
- ✅ **Sin VPS adicionales**
|
||||||
|
- ✅ **Infraestructura global**
|
||||||
|
- ✅ **Escalabilidad automática**
|
||||||
|
- ✅ **Soporte oficial**
|
||||||
|
- ✅ **TURN servers incluidos**
|
||||||
|
- ✅ **Monitoreo y analytics**
|
||||||
|
|
||||||
|
### Costos LiveKit Cloud:
|
||||||
|
- **Free tier**: 50GB/mes gratis
|
||||||
|
- **Starter**: $20/mes - 500GB
|
||||||
|
- **Pro**: $99/mes - 2TB + features
|
||||||
|
|
||||||
|
### Setup LiveKit Cloud:
|
||||||
|
1. **Registro**: https://cloud.livekit.io
|
||||||
|
2. **Crear proyecto**
|
||||||
|
3. **Copiar credenciales**
|
||||||
|
4. **Configurar en EasyPanel**
|
||||||
|
5. **Deploy** ✅
|
||||||
|
|
||||||
|
## 🎯 PASOS SIGUIENTE PARA TI
|
||||||
|
|
||||||
|
¿Qué opción prefieres?
|
||||||
|
|
||||||
|
1. **LiveKit Cloud** (fácil, costo medio)
|
||||||
|
2. **VPS Híbrido** (control total, setup complejo)
|
||||||
|
3. **TURN Server** (experto, costo bajo)
|
||||||
|
|
||||||
|
Te ayudo a configurar la que elijas.
|
||||||
113
EASYPANEL-README.md
Normal file
113
EASYPANEL-README.md
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
# CONFIGURACIÓN EASYPANEL - OpenVidu Meet
|
||||||
|
# ========================================
|
||||||
|
|
||||||
|
## 📋 CONFIGURACIÓN DEL PROYECTO
|
||||||
|
|
||||||
|
### 1. Crear Proyecto en EasyPanel
|
||||||
|
- Tipo: Docker Compose o Docker Build
|
||||||
|
- Repositorio: Tu repo con estos archivos
|
||||||
|
- Branch: main
|
||||||
|
|
||||||
|
### 2. Variables de Entorno Requeridas
|
||||||
|
```env
|
||||||
|
# Básicas
|
||||||
|
NODE_ENV=production
|
||||||
|
MEET_LOG_LEVEL=info
|
||||||
|
MEET_BLOB_STORAGE_MODE=memory
|
||||||
|
|
||||||
|
# Admin (CAMBIAR)
|
||||||
|
ADMIN_PASSWORD=tu-password-seguro-aqui
|
||||||
|
|
||||||
|
# LiveKit (ajustar según tu setup)
|
||||||
|
LIVEKIT_URL=wss://tu-livekit-domain.com
|
||||||
|
LIVEKIT_API_KEY=tu-api-key
|
||||||
|
LIVEKIT_API_SECRET=tu-secret-32-caracteres-minimo
|
||||||
|
|
||||||
|
# Proxy
|
||||||
|
TRUST_PROXY=true
|
||||||
|
SERVER_CORS_ORIGIN=*
|
||||||
|
USE_HTTPS=true
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Configuración de Puertos
|
||||||
|
- **Opción A (con Nginx)**: Puerto 80
|
||||||
|
- **Opción B (directo)**: Puerto 6080
|
||||||
|
|
||||||
|
### 4. Configuración de Dominio
|
||||||
|
- Agregar tu dominio en EasyPanel
|
||||||
|
- Habilitar SSL automático
|
||||||
|
- Configurar redirects HTTP → HTTPS
|
||||||
|
|
||||||
|
## 🐳 OPCIONES DE DEPLOY
|
||||||
|
|
||||||
|
### Opción A: Con Nginx Proxy (Recomendado)
|
||||||
|
```yaml
|
||||||
|
# Usar docker-compose.yml completo
|
||||||
|
# Puerto expuesto: 80/443
|
||||||
|
# Incluye rate limiting y optimizaciones
|
||||||
|
```
|
||||||
|
|
||||||
|
### Opción B: Solo Backend
|
||||||
|
```yaml
|
||||||
|
# Solo el servicio openvidu-meet del compose
|
||||||
|
# Puerto expuesto: 6080
|
||||||
|
# EasyPanel maneja el proxy
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔧 CONFIGURACIONES ADICIONALES
|
||||||
|
|
||||||
|
### LiveKit Setup
|
||||||
|
1. Desplegar LiveKit en servidor separado
|
||||||
|
2. Configurar LIVEKIT_URL con dominio público
|
||||||
|
3. Generar API keys seguros
|
||||||
|
|
||||||
|
### Redis (Opcional)
|
||||||
|
- Usar servicio Redis de EasyPanel
|
||||||
|
- O mantener storage en memoria para simplicidad
|
||||||
|
|
||||||
|
### SSL/TLS
|
||||||
|
- EasyPanel maneja certificados automáticamente
|
||||||
|
- Configurar HTTPS en variables de entorno
|
||||||
|
|
||||||
|
## 🚨 CONSIDERACIONES DE SEGURIDAD
|
||||||
|
|
||||||
|
1. **Cambiar credenciales por defecto**
|
||||||
|
2. **Usar secrets seguros para LiveKit**
|
||||||
|
3. **Configurar CORS apropiadamente**
|
||||||
|
4. **Habilitar rate limiting**
|
||||||
|
5. **Usar HTTPS únicamente**
|
||||||
|
|
||||||
|
## 📊 MONITOREO
|
||||||
|
|
||||||
|
### Health Checks
|
||||||
|
- `/nginx-health` - Estado del proxy
|
||||||
|
- `/api/health` - Estado del backend
|
||||||
|
- Logs en EasyPanel dashboard
|
||||||
|
|
||||||
|
### Métricas
|
||||||
|
- CPU/Memory usage
|
||||||
|
- Response times
|
||||||
|
- Error rates
|
||||||
|
|
||||||
|
## 🔄 ACTUALIZACIONES
|
||||||
|
|
||||||
|
1. Push cambios al repo
|
||||||
|
2. EasyPanel rebuilds automáticamente
|
||||||
|
3. Zero-downtime deployment
|
||||||
|
|
||||||
|
## 🐛 TROUBLESHOOTING
|
||||||
|
|
||||||
|
### Backend no arranca
|
||||||
|
- Verificar variables de entorno
|
||||||
|
- Revisar logs en EasyPanel
|
||||||
|
- Verificar puertos
|
||||||
|
|
||||||
|
### Error de proxy
|
||||||
|
- Verificar nginx.conf
|
||||||
|
- Revisar headers
|
||||||
|
- Verificar upstreams
|
||||||
|
|
||||||
|
### LiveKit no conecta
|
||||||
|
- Verificar LIVEKIT_URL
|
||||||
|
- Verificar API keys
|
||||||
|
- Verificar connectivity
|
||||||
164
EASYPANEL-SIMPLE.md
Normal file
164
EASYPANEL-SIMPLE.md
Normal file
@ -0,0 +1,164 @@
|
|||||||
|
# 🚀 **DEPLOYMENT EN EASYPANEL - SIMPLIFICADO**
|
||||||
|
|
||||||
|
## 📋 **RESUMEN DE CONFIGURACIÓN**
|
||||||
|
|
||||||
|
✅ **EasyPanel maneja automáticamente:**
|
||||||
|
- SSL/TLS con certificados gratuitos
|
||||||
|
- Subdominios (ej: `tu-app.easypanel.host`)
|
||||||
|
- Proxy reverso con Traefik
|
||||||
|
- HTTPS redirect
|
||||||
|
|
||||||
|
✅ **Tu aplicación expone:**
|
||||||
|
- Solo puerto 80 (HTTP)
|
||||||
|
- Nginx como proxy interno
|
||||||
|
- OpenVidu Meet backend
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔧 **PASOS DE DEPLOYMENT**
|
||||||
|
|
||||||
|
### **1. Preparar archivos**
|
||||||
|
```bash
|
||||||
|
# Los archivos ya están listos:
|
||||||
|
# ✅ Dockerfile (optimizado)
|
||||||
|
# ✅ docker-compose.yml (puerto 80 solamente)
|
||||||
|
# ✅ nginx.conf (sin SSL - solo HTTP)
|
||||||
|
# ✅ .env.production (variables de entorno)
|
||||||
|
```
|
||||||
|
|
||||||
|
### **2. Subir a repositorio Git**
|
||||||
|
```bash
|
||||||
|
git add Dockerfile docker-compose.yml nginx.conf .env.production
|
||||||
|
git commit -m "Add EasyPanel deployment config"
|
||||||
|
git push
|
||||||
|
```
|
||||||
|
|
||||||
|
### **3. Crear proyecto en EasyPanel**
|
||||||
|
|
||||||
|
#### **Opción A: Docker Compose (Recomendado)**
|
||||||
|
1. **Nuevo Proyecto** → **Deploy from Git**
|
||||||
|
2. **Conectar repositorio**
|
||||||
|
3. **Tipo:** Docker Compose
|
||||||
|
4. **Archivo:** `docker-compose.yml`
|
||||||
|
5. **Puerto expuesto:** `80`
|
||||||
|
|
||||||
|
#### **Opción B: Dockerfile simple**
|
||||||
|
1. **Nuevo Proyecto** → **Deploy from Git**
|
||||||
|
2. **Tipo:** Dockerfile
|
||||||
|
3. **Puerto:** `6080`
|
||||||
|
4. **Health Check:** `/health`
|
||||||
|
|
||||||
|
### **4. Variables de entorno en EasyPanel**
|
||||||
|
|
||||||
|
En el dashboard de EasyPanel, configurar:
|
||||||
|
|
||||||
|
```env
|
||||||
|
# ADMIN (¡CAMBIAR!)
|
||||||
|
ADMIN_PASSWORD=mi-password-super-seguro
|
||||||
|
|
||||||
|
# LIVEKIT (configurar según tu setup)
|
||||||
|
LIVEKIT_URL=wss://tu-livekit-domain.com
|
||||||
|
LIVEKIT_API_KEY=tu-api-key
|
||||||
|
LIVEKIT_API_SECRET=tu-secret-de-32-caracteres
|
||||||
|
|
||||||
|
# REDIS (opcional)
|
||||||
|
REDIS_HOST=tu-redis-host
|
||||||
|
REDIS_PASSWORD=tu-redis-password
|
||||||
|
```
|
||||||
|
|
||||||
|
### **5. Deploy**
|
||||||
|
- Hacer clic en **Deploy**
|
||||||
|
- EasyPanel construirá automáticamente
|
||||||
|
- Generará subdominio (ej: `openvidu-meet.easypanel.host`)
|
||||||
|
- Aplicará SSL automáticamente
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🌐 **RESULTADO FINAL**
|
||||||
|
|
||||||
|
```
|
||||||
|
https://tu-app.easypanel.host
|
||||||
|
├── EasyPanel Traefik Proxy (SSL/HTTPS)
|
||||||
|
└── Tu Container (puerto 80)
|
||||||
|
├── Nginx (proxy interno)
|
||||||
|
└── OpenVidu Meet Backend (:6080)
|
||||||
|
```
|
||||||
|
|
||||||
|
### **URLs disponibles:**
|
||||||
|
- **Aplicación:** `https://tu-app.easypanel.host`
|
||||||
|
- **Admin Login:** `https://tu-app.easypanel.host/admin`
|
||||||
|
- **API:** `https://tu-app.easypanel.host/api/`
|
||||||
|
- **Health Check:** `https://tu-app.easypanel.host/health`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔧 **CONFIGURACIÓN LIVEKIT**
|
||||||
|
|
||||||
|
Para que funcione completamente, necesitas **LiveKit server** separado:
|
||||||
|
|
||||||
|
### **Opción 1: LiveKit en EasyPanel (otro proyecto)**
|
||||||
|
```yaml
|
||||||
|
# livekit.yaml para EasyPanel
|
||||||
|
port: 7880
|
||||||
|
redis:
|
||||||
|
address: tu-redis:6379
|
||||||
|
password: tu-password
|
||||||
|
```
|
||||||
|
|
||||||
|
### **Opción 2: LiveKit Cloud**
|
||||||
|
- Registrarse en [LiveKit Cloud](https://cloud.livekit.io)
|
||||||
|
- Copiar `LIVEKIT_URL`, `API_KEY`, `API_SECRET`
|
||||||
|
- Configurar en variables de entorno
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔐 **SEGURIDAD**
|
||||||
|
|
||||||
|
### **Cambiar credenciales por defecto:**
|
||||||
|
```env
|
||||||
|
ADMIN_PASSWORD=un-password-muy-seguro
|
||||||
|
LIVEKIT_API_SECRET=secret-de-al-menos-32-caracteres
|
||||||
|
```
|
||||||
|
|
||||||
|
### **Headers de seguridad incluidos:**
|
||||||
|
- Rate limiting (API: 10req/s, Login: 1req/s)
|
||||||
|
- X-Frame-Options
|
||||||
|
- X-Content-Type-Options
|
||||||
|
- X-XSS-Protection
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🚨 **TROUBLESHOOTING**
|
||||||
|
|
||||||
|
### **El container no inicia:**
|
||||||
|
```bash
|
||||||
|
# Ver logs en EasyPanel dashboard
|
||||||
|
# O conectar por SSH:
|
||||||
|
docker logs container-name
|
||||||
|
```
|
||||||
|
|
||||||
|
### **502 Bad Gateway:**
|
||||||
|
- Verificar que el backend responde en puerto 6080
|
||||||
|
- Health check: `curl localhost:6080/health`
|
||||||
|
|
||||||
|
### **WebSocket no funciona:**
|
||||||
|
- Verificar configuración de LiveKit
|
||||||
|
- Headers de WebSocket están configurados en nginx
|
||||||
|
|
||||||
|
### **Admin login no funciona:**
|
||||||
|
- Verificar variable `ADMIN_PASSWORD`
|
||||||
|
- Limpiar datos Redis si está configurado
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✅ **CHECKLIST FINAL**
|
||||||
|
|
||||||
|
- [ ] Repository con archivos de deployment subido
|
||||||
|
- [ ] Proyecto creado en EasyPanel
|
||||||
|
- [ ] Variables de entorno configuradas
|
||||||
|
- [ ] Password admin cambiado
|
||||||
|
- [ ] LiveKit configurado (separado)
|
||||||
|
- [ ] SSL funcionando automáticamente
|
||||||
|
- [ ] Admin login funcional en `/admin`
|
||||||
|
|
||||||
|
**¡Ya tienes OpenVidu Meet funcionando en producción con EasyPanel!** 🎉
|
||||||
104
EASYPANEL-TURN-SERVER.md
Normal file
104
EASYPANEL-TURN-SERVER.md
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
# SOLUCIÓN: TURN SERVER PARA EASYPANEL
|
||||||
|
|
||||||
|
## 🔄 TURN Server como alternativa para NAT traversal
|
||||||
|
|
||||||
|
### ¿Qué es TURN?
|
||||||
|
TURN (Traversal Using Relays around NAT) permite que WebRTC funcione sin exponer miles de puertos UDP.
|
||||||
|
|
||||||
|
## 🏗️ ARQUITECTURA CON TURN
|
||||||
|
|
||||||
|
```
|
||||||
|
Cliente → Internet → TURN Server → EasyPanel
|
||||||
|
(3 puertos) (sin UDP)
|
||||||
|
|
||||||
|
Vs. directo:
|
||||||
|
Cliente → Internet → EasyPanel
|
||||||
|
(10,000 UDP) ❌ No posible
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📋 IMPLEMENTACIÓN
|
||||||
|
|
||||||
|
### 1. TURN Server en VPS separado
|
||||||
|
```bash
|
||||||
|
# Instalar Coturn en VPS
|
||||||
|
apt-get update
|
||||||
|
apt-get install coturn
|
||||||
|
|
||||||
|
# /etc/turnserver.conf
|
||||||
|
listening-port=3478
|
||||||
|
tls-listening-port=5349
|
||||||
|
external-ip=IP_PUBLICA_VPS
|
||||||
|
realm=turn.tu-dominio.com
|
||||||
|
lt-cred-mech
|
||||||
|
user=usuario:password123
|
||||||
|
verbose
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Firewall VPS (Solo 3 puertos)
|
||||||
|
```bash
|
||||||
|
# Solo estos 3 puertos para TURN
|
||||||
|
ufw allow 3478/tcp # TURN TCP
|
||||||
|
ufw allow 3478/udp # TURN UDP
|
||||||
|
ufw allow 5349/tcp # TURN over TLS
|
||||||
|
ufw enable
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. LiveKit en EasyPanel con TURN
|
||||||
|
```yaml
|
||||||
|
# livekit.yaml para EasyPanel
|
||||||
|
port: 7880
|
||||||
|
|
||||||
|
keys:
|
||||||
|
devkey: tu-secret-32-chars
|
||||||
|
|
||||||
|
# SIN puertos UDP locales - usar TURN
|
||||||
|
rtc:
|
||||||
|
# NO port_range - usa TURN
|
||||||
|
use_external_ip: false
|
||||||
|
|
||||||
|
# Configurar TURN servers
|
||||||
|
ice_servers:
|
||||||
|
- urls: ["stun:stun.l.google.com:19302"]
|
||||||
|
- urls: ["turn:turn.tu-dominio.com:3478"]
|
||||||
|
username: "usuario"
|
||||||
|
credential: "password123"
|
||||||
|
- urls: ["turns:turn.tu-dominio.com:5349"]
|
||||||
|
username: "usuario"
|
||||||
|
credential: "password123"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Variables EasyPanel
|
||||||
|
```env
|
||||||
|
# Solo TCP - SIN UDP
|
||||||
|
LIVEKIT_URL=wss://tu-app.easypanel.host/livekit
|
||||||
|
LIVEKIT_API_KEY=devkey
|
||||||
|
LIVEKIT_API_SECRET=tu-secret-32-chars
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. Nginx en EasyPanel para proxy LiveKit
|
||||||
|
```nginx
|
||||||
|
# nginx.conf - agregar ruta para LiveKit
|
||||||
|
location /livekit {
|
||||||
|
proxy_pass http://openvidu-meet:7880;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 💰 COSTOS
|
||||||
|
- **TURN VPS**: $5-10/mes (pequeño VPS)
|
||||||
|
- **EasyPanel**: Tu plan actual
|
||||||
|
- **Total**: +$5-10/mes vs LiveKit Cloud
|
||||||
|
|
||||||
|
## ✅ VENTAJAS
|
||||||
|
- ✅ Solo 3 puertos UDP en VPS externo
|
||||||
|
- ✅ EasyPanel sin UDP
|
||||||
|
- ✅ NAT traversal garantizado
|
||||||
|
- ✅ Menor costo que LiveKit Cloud
|
||||||
|
|
||||||
|
## ❌ DESVENTAJAS
|
||||||
|
- ❌ Configuración más compleja
|
||||||
|
- ❌ VPS adicional para TURN
|
||||||
|
- ❌ Latencia adicional (relay)
|
||||||
|
- ❌ Ancho de banda TURN server
|
||||||
29
EASYPANEL-UDP-LIMITACIONES.md
Normal file
29
EASYPANEL-UDP-LIMITACIONES.md
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
# LIMITACIONES DE EASYPANEL PARA UDP
|
||||||
|
|
||||||
|
## ❌ Por qué EasyPanel NO puede exponer UDP:
|
||||||
|
|
||||||
|
### Arquitectura de EasyPanel:
|
||||||
|
```
|
||||||
|
Internet → Traefik (HTTP/HTTPS Proxy) → Tu Container
|
||||||
|
↑
|
||||||
|
Solo maneja TCP/HTTP/HTTPS
|
||||||
|
NO puede proxy UDP
|
||||||
|
```
|
||||||
|
|
||||||
|
### Limitaciones técnicas:
|
||||||
|
1. **Traefik**: Solo HTTP/HTTPS reverse proxy
|
||||||
|
2. **Docker networking**: Limitado a puertos TCP expuestos
|
||||||
|
3. **UI de EasyPanel**: Solo configuración HTTP
|
||||||
|
4. **Load balancing**: Diseñado para web apps, no media streaming
|
||||||
|
|
||||||
|
### Puertos disponibles en EasyPanel:
|
||||||
|
- ✅ 80 (HTTP)
|
||||||
|
- ✅ 443 (HTTPS)
|
||||||
|
- ✅ Puertos TCP custom
|
||||||
|
- ❌ Puertos UDP (NO DISPONIBLE)
|
||||||
|
|
||||||
|
## ⚠️ Problemas si intentas exponer UDP:
|
||||||
|
- EasyPanel UI no tiene opción para UDP
|
||||||
|
- Traefik no puede hacer proxy de UDP
|
||||||
|
- Docker compose limitado a TCP en EasyPanel
|
||||||
|
- No hay configuración de port ranges UDP
|
||||||
129
EASYPANEL-VPS-HIBRIDO.md
Normal file
129
EASYPANEL-VPS-HIBRIDO.md
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
# SOLUCIÓN: LIVEKIT EN VPS SEPARADO + EASYPANEL
|
||||||
|
|
||||||
|
## 🏗️ ARQUITECTURA HÍBRIDA
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─ EasyPanel ────────────────┐ ┌─ VPS Separado ─────────┐
|
||||||
|
│ │ │ │
|
||||||
|
│ OpenVidu Meet Backend ──────────→ LiveKit Server │
|
||||||
|
│ (HTTP/HTTPS only) │ │ (UDP 50000-60000) │
|
||||||
|
│ │ │ │
|
||||||
|
└────────────────────────────┘ └────────────────────────┘
|
||||||
|
↑ ↑
|
||||||
|
Traefik/SSL Firewall/UDP abierto
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📋 CONFIGURACIÓN PASO A PASO
|
||||||
|
|
||||||
|
### 1. EasyPanel (Solo OpenVidu Meet Backend)
|
||||||
|
```yaml
|
||||||
|
# docker-compose.yml para EasyPanel
|
||||||
|
version: '3.8'
|
||||||
|
services:
|
||||||
|
openvidu-meet:
|
||||||
|
build: .
|
||||||
|
environment:
|
||||||
|
# LiveKit en VPS externo
|
||||||
|
LIVEKIT_URL: wss://livekit.tu-vps.com:7880
|
||||||
|
LIVEKIT_API_KEY: devkey
|
||||||
|
LIVEKIT_API_SECRET: tu-secret-32-chars
|
||||||
|
ports:
|
||||||
|
- "80:6080" # Solo HTTP - EasyPanel maneja SSL
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. VPS Separado (Solo LiveKit + Redis)
|
||||||
|
```yaml
|
||||||
|
# docker-compose.yml en VPS
|
||||||
|
version: '3.8'
|
||||||
|
services:
|
||||||
|
livekit:
|
||||||
|
image: livekit/livekit-server:latest
|
||||||
|
ports:
|
||||||
|
- "7880:7880" # API/WebSocket
|
||||||
|
- "50000-60000:50000-60000/udp" # WebRTC
|
||||||
|
volumes:
|
||||||
|
- ./livekit.yaml:/livekit.yaml
|
||||||
|
command: --config /livekit.yaml
|
||||||
|
|
||||||
|
redis:
|
||||||
|
image: redis:7-alpine
|
||||||
|
ports:
|
||||||
|
- "6379:6379"
|
||||||
|
command: redis-server --requirepass redispassword
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Configuración LiveKit en VPS
|
||||||
|
```yaml
|
||||||
|
# livekit.yaml en VPS
|
||||||
|
port: 7880
|
||||||
|
bind_addresses: ["0.0.0.0"]
|
||||||
|
|
||||||
|
keys:
|
||||||
|
devkey: tu-secret-de-32-caracteres-minimo
|
||||||
|
|
||||||
|
redis:
|
||||||
|
address: "localhost:6379"
|
||||||
|
password: "redispassword"
|
||||||
|
|
||||||
|
rtc:
|
||||||
|
port_range_start: 50000
|
||||||
|
port_range_end: 60000
|
||||||
|
use_external_ip: true
|
||||||
|
external_ip: "IP_PUBLICA_DEL_VPS"
|
||||||
|
|
||||||
|
ice_servers:
|
||||||
|
- urls: ["stun:stun.l.google.com:19302"]
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Firewall en VPS
|
||||||
|
```bash
|
||||||
|
# Configurar firewall en VPS
|
||||||
|
ufw allow 7880/tcp # LiveKit API
|
||||||
|
ufw allow 50000:60000/udp # WebRTC UDP
|
||||||
|
ufw allow 6379/tcp # Redis (si acceso externo)
|
||||||
|
ufw enable
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. SSL para LiveKit (Nginx en VPS)
|
||||||
|
```nginx
|
||||||
|
# /etc/nginx/sites-available/livekit
|
||||||
|
server {
|
||||||
|
listen 443 ssl;
|
||||||
|
server_name livekit.tu-vps.com;
|
||||||
|
|
||||||
|
ssl_certificate /path/to/cert.pem;
|
||||||
|
ssl_certificate_key /path/to/key.pem;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
proxy_pass http://localhost:7880;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 💰 COSTOS ESTIMADOS
|
||||||
|
|
||||||
|
### VPS para LiveKit:
|
||||||
|
- **Básico**: $5-10/mes (2GB RAM, 1 CPU)
|
||||||
|
- **Medio**: $15-25/mes (4GB RAM, 2 CPU)
|
||||||
|
- **Alto**: $30-50/mes (8GB RAM, 4 CPU)
|
||||||
|
|
||||||
|
### Proveedores recomendados:
|
||||||
|
- DigitalOcean
|
||||||
|
- Linode
|
||||||
|
- Hetzner
|
||||||
|
- Vultr
|
||||||
|
|
||||||
|
## ✅ VENTAJAS
|
||||||
|
- ✅ EasyPanel para web app (fácil)
|
||||||
|
- ✅ VPS dedicado para WebRTC (potencia)
|
||||||
|
- ✅ Escalabilidad independiente
|
||||||
|
- ✅ Control total sobre LiveKit
|
||||||
|
|
||||||
|
## ❌ DESVENTAJAS
|
||||||
|
- ❌ Costo adicional VPS
|
||||||
|
- ❌ Más complejidad de setup
|
||||||
|
- ❌ Mantenimiento de dos servicios
|
||||||
180
LIVEKIT-SELFHOST-SERVER.md
Normal file
180
LIVEKIT-SELFHOST-SERVER.md
Normal file
@ -0,0 +1,180 @@
|
|||||||
|
# SERVIDOR LIVEKIT SELF-HOSTING DEDICADO
|
||||||
|
|
||||||
|
## 🖥️ Setup en servidor dedicado (192.168.1.19)
|
||||||
|
|
||||||
|
### Docker Compose para LiveKit Server:
|
||||||
|
```yaml
|
||||||
|
# docker-compose-livekit-server.yml
|
||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
# LiveKit Server Principal
|
||||||
|
livekit-server:
|
||||||
|
image: livekit/livekit-server:latest
|
||||||
|
container_name: livekit-production
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
# API/WebSocket (EXPONER PÚBLICAMENTE)
|
||||||
|
- "7880:7880"
|
||||||
|
|
||||||
|
# Rango UDP para WebRTC (EXPONER PÚBLICAMENTE)
|
||||||
|
- "50000-50100:50000-50100/udp" # 100 puertos para ~10 usuarios concurrentes
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
- ./livekit-production.yaml:/livekit.yaml:ro
|
||||||
|
- ./logs:/app/logs
|
||||||
|
command: --config /livekit.yaml
|
||||||
|
environment:
|
||||||
|
- LIVEKIT_CONFIG=/livekit.yaml
|
||||||
|
networks:
|
||||||
|
- livekit-network
|
||||||
|
depends_on:
|
||||||
|
- redis
|
||||||
|
|
||||||
|
# Redis para LiveKit
|
||||||
|
redis:
|
||||||
|
image: redis:7-alpine
|
||||||
|
container_name: livekit-redis
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "6379:6379"
|
||||||
|
command: redis-server --requirepass ${REDIS_PASSWORD:-livekitredis123}
|
||||||
|
volumes:
|
||||||
|
- redis_data:/data
|
||||||
|
networks:
|
||||||
|
- livekit-network
|
||||||
|
|
||||||
|
# Nginx SSL Termination (para HTTPS/WSS)
|
||||||
|
nginx-livekit:
|
||||||
|
image: nginx:alpine
|
||||||
|
container_name: livekit-nginx
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "443:443" # HTTPS/WSS (EXPONER PÚBLICAMENTE)
|
||||||
|
- "80:80" # HTTP redirect
|
||||||
|
volumes:
|
||||||
|
- ./nginx-livekit.conf:/etc/nginx/nginx.conf:ro
|
||||||
|
- ./ssl:/etc/nginx/ssl:ro # Certificados SSL
|
||||||
|
depends_on:
|
||||||
|
- livekit-server
|
||||||
|
networks:
|
||||||
|
- livekit-network
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
redis_data:
|
||||||
|
|
||||||
|
networks:
|
||||||
|
livekit-network:
|
||||||
|
driver: bridge
|
||||||
|
```
|
||||||
|
|
||||||
|
### Configuración LiveKit Production:
|
||||||
|
```yaml
|
||||||
|
# livekit-production.yaml
|
||||||
|
port: 7880
|
||||||
|
bind_addresses: ["0.0.0.0"]
|
||||||
|
|
||||||
|
# API Keys seguros
|
||||||
|
keys:
|
||||||
|
production-key: tu-super-secret-de-32-caracteres-o-mas
|
||||||
|
|
||||||
|
# Redis para scaling y persistence
|
||||||
|
redis:
|
||||||
|
address: "redis:6379"
|
||||||
|
password: "livekitredis123"
|
||||||
|
db: 0
|
||||||
|
|
||||||
|
# RTC Configuration para acceso público
|
||||||
|
rtc:
|
||||||
|
# Puertos UDP (coincidir con docker-compose)
|
||||||
|
port_range_start: 50000
|
||||||
|
port_range_end: 50100
|
||||||
|
|
||||||
|
# IP pública/externa (tu IP pública o dominio)
|
||||||
|
use_external_ip: true
|
||||||
|
external_ip: "TU_IP_PUBLICA_O_DOMINIO" # ej: "mi-casa.duckdns.org"
|
||||||
|
|
||||||
|
# STUN servers para NAT traversal
|
||||||
|
ice_servers:
|
||||||
|
- urls: ["stun:stun.l.google.com:19302"]
|
||||||
|
- urls: ["stun:stun1.l.google.com:19302"]
|
||||||
|
|
||||||
|
# Room settings para producción
|
||||||
|
room:
|
||||||
|
auto_create: true
|
||||||
|
max_participants: 50
|
||||||
|
empty_timeout: 600 # 10 minutos
|
||||||
|
|
||||||
|
# Security
|
||||||
|
webhook:
|
||||||
|
# Opcional: webhook para eventos
|
||||||
|
api_key: "tu-webhook-key"
|
||||||
|
|
||||||
|
# Logging
|
||||||
|
log_level: info
|
||||||
|
log_format: json
|
||||||
|
|
||||||
|
# Enable egress (grabaciones)
|
||||||
|
# Automático con Redis
|
||||||
|
```
|
||||||
|
|
||||||
|
### Nginx SSL para LiveKit:
|
||||||
|
```nginx
|
||||||
|
# nginx-livekit.conf
|
||||||
|
events {
|
||||||
|
worker_connections 1024;
|
||||||
|
}
|
||||||
|
|
||||||
|
http {
|
||||||
|
# Redirect HTTP to HTTPS
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name _;
|
||||||
|
return 301 https://$host$request_uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
# HTTPS/WSS Server
|
||||||
|
server {
|
||||||
|
listen 443 ssl http2;
|
||||||
|
server_name _;
|
||||||
|
|
||||||
|
# SSL Configuration
|
||||||
|
ssl_certificate /etc/nginx/ssl/cert.pem;
|
||||||
|
ssl_certificate_key /etc/nginx/ssl/key.pem;
|
||||||
|
ssl_protocols TLSv1.2 TLSv1.3;
|
||||||
|
ssl_ciphers HIGH:!aNULL:!MD5;
|
||||||
|
|
||||||
|
# WebSocket support para LiveKit
|
||||||
|
location / {
|
||||||
|
proxy_pass http://livekit-server:7880;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
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;
|
||||||
|
|
||||||
|
# Timeouts para WebRTC
|
||||||
|
proxy_connect_timeout 60s;
|
||||||
|
proxy_send_timeout 60s;
|
||||||
|
proxy_read_timeout 60s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔥 Firewall en servidor LiveKit:
|
||||||
|
```bash
|
||||||
|
# UFW rules para exposición pública segura
|
||||||
|
sudo ufw allow 80/tcp comment "HTTP redirect"
|
||||||
|
sudo ufw allow 443/tcp comment "HTTPS/WSS LiveKit"
|
||||||
|
sudo ufw allow 7880/tcp comment "LiveKit API directo"
|
||||||
|
sudo ufw allow 50000:50100/udp comment "WebRTC UDP range"
|
||||||
|
|
||||||
|
# Opcional: limitar SSH a red local solamente
|
||||||
|
sudo ufw allow from 192.168.1.0/24 to any port 22
|
||||||
|
|
||||||
|
sudo ufw enable
|
||||||
|
sudo ufw status numbered
|
||||||
|
```
|
||||||
40
LIVEKIT-TURN-CONFIG.md
Normal file
40
LIVEKIT-TURN-CONFIG.md
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
# CONFIGURACIÓN TURN PARA LIVEKIT
|
||||||
|
|
||||||
|
## 🔧 Si necesitas TURN server para LiveKit detrás de firewall:
|
||||||
|
|
||||||
|
### 1. Configurar Coturn (TURN server)
|
||||||
|
```bash
|
||||||
|
# Instalar coturn
|
||||||
|
apt-get install coturn
|
||||||
|
|
||||||
|
# /etc/turnserver.conf
|
||||||
|
listening-port=3478
|
||||||
|
tls-listening-port=5349
|
||||||
|
external-ip=TU_IP_PUBLICA
|
||||||
|
realm=tu-dominio.com
|
||||||
|
lt-cred-mech
|
||||||
|
user=usuario:password
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Configurar LiveKit con TURN
|
||||||
|
```yaml
|
||||||
|
# livekit.yaml
|
||||||
|
rtc:
|
||||||
|
port_range_start: 50000
|
||||||
|
port_range_end: 60000
|
||||||
|
ice_servers:
|
||||||
|
- urls:
|
||||||
|
- "stun:stun.l.google.com:19302"
|
||||||
|
- "turn:tu-turn-server.com:3478"
|
||||||
|
username: "usuario"
|
||||||
|
credential: "password"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Firewall para TURN
|
||||||
|
```bash
|
||||||
|
# Puertos necesarios
|
||||||
|
ufw allow 3478/tcp # TURN TCP
|
||||||
|
ufw allow 3478/udp # TURN UDP
|
||||||
|
ufw allow 5349/tcp # TURN TLS
|
||||||
|
ufw allow 50000:60000/udp # Media streams
|
||||||
|
```
|
||||||
103
ROUTER-CONFIG-LIVEKIT.md
Normal file
103
ROUTER-CONFIG-LIVEKIT.md
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
# CONFIGURACIÓN ROUTER - PORT FORWARDING PARA LIVEKIT
|
||||||
|
|
||||||
|
## 🌐 Port Forwarding necesario en tu Router
|
||||||
|
|
||||||
|
### Puertos a exponer públicamente:
|
||||||
|
|
||||||
|
| Servicio | Puerto | Protocolo | IP Interna | Descripción |
|
||||||
|
|----------|---------|-----------|------------|-------------|
|
||||||
|
| **HTTP** | 80 | TCP | 192.168.1.19 | Redirect a HTTPS |
|
||||||
|
| **HTTPS/WSS** | 443 | TCP | 192.168.1.19 | LiveKit WebSocket Secure |
|
||||||
|
| **LiveKit API** | 7880 | TCP | 192.168.1.19 | API directa (opcional) |
|
||||||
|
| **WebRTC Media** | 50000-50100 | UDP | 192.168.1.19 | Streams de audio/video |
|
||||||
|
|
||||||
|
### Configuración típica router:
|
||||||
|
|
||||||
|
```
|
||||||
|
Regla 1: LiveKit-HTTPS
|
||||||
|
- Servicio: HTTPS/Custom
|
||||||
|
- Puerto externo: 443
|
||||||
|
- Puerto interno: 443
|
||||||
|
- IP interna: 192.168.1.19
|
||||||
|
- Protocolo: TCP
|
||||||
|
- Estado: Habilitado
|
||||||
|
|
||||||
|
Regla 2: LiveKit-HTTP
|
||||||
|
- Servicio: HTTP
|
||||||
|
- Puerto externo: 80
|
||||||
|
- Puerto interno: 80
|
||||||
|
- IP interna: 192.168.1.19
|
||||||
|
- Protocolo: TCP
|
||||||
|
- Estado: Habilitado
|
||||||
|
|
||||||
|
Regla 3: LiveKit-WebRTC
|
||||||
|
- Servicio: Custom
|
||||||
|
- Puerto externo: 50000-50100
|
||||||
|
- Puerto interno: 50000-50100
|
||||||
|
- IP interna: 192.168.1.19
|
||||||
|
- Protocolo: UDP
|
||||||
|
- Estado: Habilitado
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🏠 IP Dinámica - Solución con DuckDNS
|
||||||
|
|
||||||
|
### Si tu IP pública cambia (típico en casa):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. Crear cuenta en DuckDNS.org
|
||||||
|
# 2. Crear subdominio: mi-livekit.duckdns.org
|
||||||
|
# 3. Script de actualización automática
|
||||||
|
|
||||||
|
# /home/usuario/update-duckdns.sh
|
||||||
|
#!/bin/bash
|
||||||
|
echo url="https://www.duckdns.org/update?domains=mi-livekit&token=TU_TOKEN&ip=" | curl -k -o ~/duckdns.log -K -
|
||||||
|
|
||||||
|
# Crontab para actualizar cada 5 minutos
|
||||||
|
# crontab -e
|
||||||
|
*/5 * * * * /home/usuario/update-duckdns.sh >/dev/null 2>&1
|
||||||
|
```
|
||||||
|
|
||||||
|
### Configurar dominio en LiveKit:
|
||||||
|
```yaml
|
||||||
|
# livekit-production.yaml
|
||||||
|
rtc:
|
||||||
|
external_ip: "mi-livekit.duckdns.org" # En lugar de IP
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔒 Certificado SSL automático con Let's Encrypt
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Instalar certbot
|
||||||
|
sudo apt install certbot
|
||||||
|
|
||||||
|
# Generar certificado para tu dominio
|
||||||
|
sudo certbot certonly --standalone -d mi-livekit.duckdns.org
|
||||||
|
|
||||||
|
# Copiar certificados para Docker
|
||||||
|
sudo cp /etc/letsencrypt/live/mi-livekit.duckdns.org/fullchain.pem ./ssl/cert.pem
|
||||||
|
sudo cp /etc/letsencrypt/live/mi-livekit.duckdns.org/privkey.pem ./ssl/key.pem
|
||||||
|
sudo chown $USER:$USER ./ssl/*.pem
|
||||||
|
|
||||||
|
# Auto-renovación (crontab)
|
||||||
|
0 12 * * * /usr/bin/certbot renew --quiet && docker-compose restart nginx-livekit
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📊 Verificación de conectividad
|
||||||
|
|
||||||
|
### Tests externos:
|
||||||
|
```bash
|
||||||
|
# Test puertos desde internet
|
||||||
|
nmap -p 80,443,7880 mi-livekit.duckdns.org
|
||||||
|
nmap -sU -p 50000-50010 mi-livekit.duckdns.org
|
||||||
|
|
||||||
|
# Test WebSocket
|
||||||
|
wscat -c wss://mi-livekit.duckdns.org
|
||||||
|
|
||||||
|
# Test HTTPS
|
||||||
|
curl -I https://mi-livekit.duckdns.org
|
||||||
|
```
|
||||||
|
|
||||||
|
### URLs finales:
|
||||||
|
- **LiveKit WSS**: `wss://mi-livekit.duckdns.org`
|
||||||
|
- **API HTTP**: `https://mi-livekit.duckdns.org`
|
||||||
|
- **Monitoreo**: `https://mi-livekit.duckdns.org/debug`
|
||||||
106
UDP-FIREWALL-CONFIG.md
Normal file
106
UDP-FIREWALL-CONFIG.md
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
# CONFIGURACIÓN MANUAL DE PUERTOS UDP PARA LIVEKIT
|
||||||
|
|
||||||
|
## 🔥 FIREWALL UBUNTU/DEBIAN (UFW)
|
||||||
|
```bash
|
||||||
|
# Puertos TCP
|
||||||
|
sudo ufw allow 80/tcp comment "HTTP"
|
||||||
|
sudo ufw allow 6080/tcp comment "OpenVidu Meet"
|
||||||
|
sudo ufw allow 6379/tcp comment "Redis"
|
||||||
|
sudo ufw allow 7880/tcp comment "LiveKit API"
|
||||||
|
|
||||||
|
# Puertos UDP para WebRTC
|
||||||
|
sudo ufw allow 50000:60000/udp comment "LiveKit WebRTC"
|
||||||
|
|
||||||
|
# Verificar
|
||||||
|
sudo ufw status numbered
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔥 FIREWALL CENTOS/RHEL (firewalld)
|
||||||
|
```bash
|
||||||
|
# Puertos TCP
|
||||||
|
sudo firewall-cmd --permanent --add-port=80/tcp
|
||||||
|
sudo firewall-cmd --permanent --add-port=6080/tcp
|
||||||
|
sudo firewall-cmd --permanent --add-port=6379/tcp
|
||||||
|
sudo firewall-cmd --permanent --add-port=7880/tcp
|
||||||
|
|
||||||
|
# Puertos UDP
|
||||||
|
sudo firewall-cmd --permanent --add-port=50000-60000/udp
|
||||||
|
|
||||||
|
# Aplicar
|
||||||
|
sudo firewall-cmd --reload
|
||||||
|
sudo firewall-cmd --list-ports
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🖥️ ROUTER/MODEM (Para acceso externo)
|
||||||
|
Si quieres acceso desde internet:
|
||||||
|
|
||||||
|
### Port Forwarding necesario:
|
||||||
|
- **TCP 80** → Tu servidor (OpenVidu Meet)
|
||||||
|
- **TCP 7880** → Tu servidor (LiveKit API)
|
||||||
|
- **UDP 50000-60000** → Tu servidor (WebRTC media)
|
||||||
|
|
||||||
|
### Configuración típica router:
|
||||||
|
```
|
||||||
|
Servicio: OpenVidu-HTTP
|
||||||
|
Puerto externo: 80
|
||||||
|
Puerto interno: 80
|
||||||
|
IP interna: 192.168.1.19
|
||||||
|
Protocolo: TCP
|
||||||
|
|
||||||
|
Servicio: LiveKit-API
|
||||||
|
Puerto externo: 7880
|
||||||
|
Puerto interno: 7880
|
||||||
|
IP interna: 192.168.1.19
|
||||||
|
Protocolo: TCP
|
||||||
|
|
||||||
|
Servicio: WebRTC-Media
|
||||||
|
Puerto externo: 50000-60000
|
||||||
|
Puerto interno: 50000-60000
|
||||||
|
IP interna: 192.168.1.19
|
||||||
|
Protocolo: UDP
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔍 VERIFICACIÓN DE PUERTOS
|
||||||
|
|
||||||
|
### Verificar puertos abiertos:
|
||||||
|
```bash
|
||||||
|
# Ver todos los puertos TCP/UDP en uso
|
||||||
|
sudo ss -tulnp
|
||||||
|
|
||||||
|
# Específicos de LiveKit
|
||||||
|
sudo ss -tulnp | grep -E "(7880|50000|60000)"
|
||||||
|
|
||||||
|
# Verificar desde otro dispositivo
|
||||||
|
nmap -p 7880,50000-50010 192.168.1.19
|
||||||
|
```
|
||||||
|
|
||||||
|
### Test de conectividad:
|
||||||
|
```bash
|
||||||
|
# Test TCP (LiveKit API)
|
||||||
|
curl http://192.168.1.19:7880
|
||||||
|
|
||||||
|
# Test WebSocket
|
||||||
|
wscat -c ws://192.168.1.19:7880
|
||||||
|
|
||||||
|
# Test UDP (requiere herramientas específicas)
|
||||||
|
nc -u 192.168.1.19 50000
|
||||||
|
```
|
||||||
|
|
||||||
|
## ⚠️ CONSIDERACIONES IMPORTANTES
|
||||||
|
|
||||||
|
### Para red local:
|
||||||
|
- ✅ Solo configurar firewall del servidor
|
||||||
|
- ✅ Usar IP local (192.168.x.x)
|
||||||
|
- ✅ No necesita port forwarding
|
||||||
|
|
||||||
|
### Para acceso externo:
|
||||||
|
- ⚠️ Configurar port forwarding en router
|
||||||
|
- ⚠️ Usar IP pública o dominio
|
||||||
|
- ⚠️ Configurar HTTPS para LiveKit
|
||||||
|
- ⚠️ Considerar seguridad (VPN, etc.)
|
||||||
|
|
||||||
|
### Rango de puertos UDP:
|
||||||
|
- **Mínimo:** 100 puertos (ej: 50000-50100)
|
||||||
|
- **Recomendado:** 1000 puertos (50000-51000)
|
||||||
|
- **Máximo configurado:** 10000 puertos (50000-60000)
|
||||||
|
- **Cálculo:** ~10 puertos por participante simultáneo
|
||||||
190
configure-livekit-domain.sh
Executable file
190
configure-livekit-domain.sh
Executable file
@ -0,0 +1,190 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Script para configurar dominio automáticamente para LiveKit
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Colores
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
NC='\033[0m'
|
||||||
|
|
||||||
|
echo -e "${BLUE}🌐 Configurador de Dominio para LiveKit${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Detectar IP pública
|
||||||
|
echo "🔍 Detectando IP pública..."
|
||||||
|
PUBLIC_IP=$(curl -s https://checkip.amazonaws.com || curl -s https://ipinfo.io/ip || echo "No detectada")
|
||||||
|
LOCAL_IP=$(hostname -I | awk '{print $1}')
|
||||||
|
|
||||||
|
echo -e "${BLUE}📊 Información de red:${NC}"
|
||||||
|
echo " IP Local: $LOCAL_IP"
|
||||||
|
echo " IP Pública: $PUBLIC_IP"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Opciones de dominio
|
||||||
|
echo "¿Qué tipo de dominio quieres configurar?"
|
||||||
|
echo "1) DuckDNS (gratuito, IP dinámica)"
|
||||||
|
echo "2) Dominio propio + Let's Encrypt"
|
||||||
|
echo "3) Solo IP pública (sin dominio)"
|
||||||
|
echo ""
|
||||||
|
read -p "Selecciona opción (1-3): " DOMAIN_OPTION
|
||||||
|
|
||||||
|
case $DOMAIN_OPTION in
|
||||||
|
1)
|
||||||
|
echo -e "${GREEN}🦆 Configurando DuckDNS${NC}"
|
||||||
|
read -p "Subdominio DuckDNS (sin .duckdns.org): " DUCKDNS_SUBDOMAIN
|
||||||
|
read -p "Token DuckDNS: " DUCKDNS_TOKEN
|
||||||
|
|
||||||
|
DOMAIN="$DUCKDNS_SUBDOMAIN.duckdns.org"
|
||||||
|
|
||||||
|
# Crear script de actualización
|
||||||
|
cat > update-duckdns.sh << EOF
|
||||||
|
#!/bin/bash
|
||||||
|
CURRENT_IP=\$(curl -s https://checkip.amazonaws.com)
|
||||||
|
RESPONSE=\$(curl -s "https://www.duckdns.org/update?domains=$DUCKDNS_SUBDOMAIN&token=$DUCKDNS_TOKEN&ip=\$CURRENT_IP")
|
||||||
|
if [ "\$RESPONSE" = "OK" ]; then
|
||||||
|
echo "\$(date): DuckDNS actualizado - $DOMAIN → \$CURRENT_IP"
|
||||||
|
else
|
||||||
|
echo "\$(date): ERROR: \$RESPONSE"
|
||||||
|
fi
|
||||||
|
EOF
|
||||||
|
chmod +x update-duckdns.sh
|
||||||
|
|
||||||
|
# Actualizar inmediatamente
|
||||||
|
./update-duckdns.sh
|
||||||
|
|
||||||
|
# Configurar cron
|
||||||
|
(crontab -l 2>/dev/null; echo "*/5 * * * * $(pwd)/update-duckdns.sh >> $(pwd)/duckdns.log 2>&1") | crontab -
|
||||||
|
|
||||||
|
echo -e "${GREEN}✅ DuckDNS configurado: $DOMAIN${NC}"
|
||||||
|
LIVEKIT_URL="ws://$DOMAIN:7880"
|
||||||
|
;;
|
||||||
|
|
||||||
|
2)
|
||||||
|
echo -e "${GREEN}🏠 Configurando dominio propio${NC}"
|
||||||
|
read -p "Dominio completo (ej: livekit.midominio.com): " CUSTOM_DOMAIN
|
||||||
|
|
||||||
|
DOMAIN="$CUSTOM_DOMAIN"
|
||||||
|
|
||||||
|
echo -e "${YELLOW}📋 Pasos manuales necesarios:${NC}"
|
||||||
|
echo "1. Configurar DNS A record:"
|
||||||
|
echo " $DOMAIN → $PUBLIC_IP"
|
||||||
|
echo ""
|
||||||
|
echo "2. Port forwarding en router:"
|
||||||
|
echo " TCP 80,443,7880 → $LOCAL_IP"
|
||||||
|
echo " UDP 50000-50100 → $LOCAL_IP"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
read -p "¿Continuar con configuración SSL automática? (y/N): " SSL_SETUP
|
||||||
|
|
||||||
|
if [[ $SSL_SETUP =~ ^[Yy]$ ]]; then
|
||||||
|
echo -e "${YELLOW}🔧 Configurando Nginx + SSL...${NC}"
|
||||||
|
|
||||||
|
# Instalar dependencias
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install -y nginx certbot python3-certbot-nginx
|
||||||
|
|
||||||
|
# Configurar Nginx básico
|
||||||
|
sudo tee /etc/nginx/sites-available/livekit << EOF
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name $DOMAIN;
|
||||||
|
|
||||||
|
location /.well-known/acme-challenge/ {
|
||||||
|
root /var/www/html;
|
||||||
|
}
|
||||||
|
|
||||||
|
location / {
|
||||||
|
return 301 https://\$server_name\$request_uri;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
sudo ln -sf /etc/nginx/sites-available/livekit /etc/nginx/sites-enabled/
|
||||||
|
sudo nginx -t && sudo systemctl restart nginx
|
||||||
|
|
||||||
|
# Generar certificado
|
||||||
|
sudo certbot --nginx -d $DOMAIN --non-interactive --agree-tos --email admin@$DOMAIN
|
||||||
|
|
||||||
|
echo -e "${GREEN}✅ SSL configurado para $DOMAIN${NC}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
LIVEKIT_URL="wss://$DOMAIN"
|
||||||
|
;;
|
||||||
|
|
||||||
|
3)
|
||||||
|
echo -e "${YELLOW}📡 Usando IP pública directa${NC}"
|
||||||
|
DOMAIN="$PUBLIC_IP"
|
||||||
|
LIVEKIT_URL="ws://$PUBLIC_IP:7880"
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
echo -e "${RED}❌ Opción inválida${NC}"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Actualizar configuración LiveKit
|
||||||
|
echo -e "${YELLOW}🔧 Actualizando configuración LiveKit...${NC}"
|
||||||
|
|
||||||
|
# Actualizar livekit.yaml existente o crear nuevo
|
||||||
|
if [ -f "livekit-production.yaml" ]; then
|
||||||
|
sed -i "s/external_ip: .*/external_ip: \"$DOMAIN\"/" livekit-production.yaml
|
||||||
|
echo -e "${GREEN}✅ livekit-production.yaml actualizado${NC}"
|
||||||
|
elif [ -f "livekit.yaml" ]; then
|
||||||
|
sed -i "s/external_ip: .*/external_ip: \"$DOMAIN\"/" livekit.yaml
|
||||||
|
echo -e "${GREEN}✅ livekit.yaml actualizado${NC}"
|
||||||
|
else
|
||||||
|
echo -e "${YELLOW}⚠️ No se encontró archivo de configuración LiveKit${NC}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Actualizar variables para OpenVidu Meet
|
||||||
|
cat > .env.livekit-domain << EOF
|
||||||
|
# Configuración de dominio para LiveKit
|
||||||
|
DOMAIN=$DOMAIN
|
||||||
|
LIVEKIT_URL=$LIVEKIT_URL
|
||||||
|
PUBLIC_IP=$PUBLIC_IP
|
||||||
|
LOCAL_IP=$LOCAL_IP
|
||||||
|
|
||||||
|
# Variables para EasyPanel/OpenVidu Meet:
|
||||||
|
LIVEKIT_URL=$LIVEKIT_URL
|
||||||
|
LIVEKIT_API_KEY=production-key
|
||||||
|
LIVEKIT_API_SECRET=tu-secret-de-32-caracteres
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo -e "${GREEN}"
|
||||||
|
echo "============================================="
|
||||||
|
echo "🎉 DOMINIO CONFIGURADO EXITOSAMENTE"
|
||||||
|
echo "============================================="
|
||||||
|
echo "🌐 Dominio: $DOMAIN"
|
||||||
|
echo "🔗 LiveKit URL: $LIVEKIT_URL"
|
||||||
|
echo "📍 IP Pública: $PUBLIC_IP"
|
||||||
|
echo "🏠 IP Local: $LOCAL_IP"
|
||||||
|
echo ""
|
||||||
|
echo "📋 CONFIGURACIÓN PARA OPENVIDU MEET:"
|
||||||
|
echo " LIVEKIT_URL=$LIVEKIT_URL"
|
||||||
|
echo ""
|
||||||
|
echo "🔧 PUERTOS NECESARIOS EN ROUTER:"
|
||||||
|
echo " TCP 7880 → $LOCAL_IP:7880"
|
||||||
|
echo " UDP 50000-50100 → $LOCAL_IP:50000-50100"
|
||||||
|
if [[ $DOMAIN_OPTION == 2 ]]; then
|
||||||
|
echo " TCP 80,443 → $LOCAL_IP:80,443"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
echo "📁 Archivos generados:"
|
||||||
|
echo " - .env.livekit-domain (variables)"
|
||||||
|
if [[ $DOMAIN_OPTION == 1 ]]; then
|
||||||
|
echo " - update-duckdns.sh (actualización automática)"
|
||||||
|
fi
|
||||||
|
echo "============================================="
|
||||||
|
echo -e "${NC}"
|
||||||
|
|
||||||
|
# Test conectividad
|
||||||
|
echo -e "${BLUE}🔍 Probando conectividad...${NC}"
|
||||||
|
if timeout 5 bash -c "echo >/dev/tcp/$DOMAIN/7880" 2>/dev/null; then
|
||||||
|
echo -e "${GREEN}✅ Puerto 7880 accesible${NC}"
|
||||||
|
else
|
||||||
|
echo -e "${YELLOW}⚠️ Puerto 7880 no accesible (verificar port forwarding)${NC}"
|
||||||
|
fi
|
||||||
58
configure-udp-ports.sh
Executable file
58
configure-udp-ports.sh
Executable file
@ -0,0 +1,58 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Script para configurar puertos UDP para LiveKit local
|
||||||
|
|
||||||
|
echo "🔧 Configurando puertos UDP para LiveKit..."
|
||||||
|
|
||||||
|
# Verificar si ufw está disponible
|
||||||
|
if command -v ufw &> /dev/null; then
|
||||||
|
echo "Configurando con UFW..."
|
||||||
|
|
||||||
|
# Puertos TCP para LiveKit API
|
||||||
|
sudo ufw allow 7880/tcp comment "LiveKit API"
|
||||||
|
|
||||||
|
# Rango de puertos UDP para WebRTC (según livekit.yaml)
|
||||||
|
sudo ufw allow 50000:60000/udp comment "LiveKit WebRTC UDP"
|
||||||
|
|
||||||
|
# Verificar reglas
|
||||||
|
echo "Reglas UFW configuradas:"
|
||||||
|
sudo ufw status numbered
|
||||||
|
|
||||||
|
elif command -v firewall-cmd &> /dev/null; then
|
||||||
|
echo "Configurando con firewalld..."
|
||||||
|
|
||||||
|
# Puerto TCP para LiveKit
|
||||||
|
sudo firewall-cmd --permanent --add-port=7880/tcp
|
||||||
|
|
||||||
|
# Rango UDP para WebRTC
|
||||||
|
sudo firewall-cmd --permanent --add-port=50000-60000/udp
|
||||||
|
|
||||||
|
# Recargar firewall
|
||||||
|
sudo firewall-cmd --reload
|
||||||
|
|
||||||
|
echo "Reglas firewalld configuradas:"
|
||||||
|
sudo firewall-cmd --list-ports
|
||||||
|
|
||||||
|
else
|
||||||
|
echo "⚠️ No se detectó UFW ni firewalld"
|
||||||
|
echo "Configurar manualmente:"
|
||||||
|
echo "- TCP 7880 (LiveKit API)"
|
||||||
|
echo "- UDP 50000-60000 (WebRTC media)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "✅ Configuración de firewall completada"
|
||||||
|
|
||||||
|
# Verificar que LiveKit esté corriendo
|
||||||
|
echo "🔍 Verificando LiveKit..."
|
||||||
|
if curl -s http://localhost:7880 > /dev/null 2>&1; then
|
||||||
|
echo "✅ LiveKit responde en puerto 7880"
|
||||||
|
else
|
||||||
|
echo "❌ LiveKit no responde - verificar que esté corriendo"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Mostrar puertos abiertos
|
||||||
|
echo "📊 Puertos actualmente en uso:"
|
||||||
|
if command -v ss &> /dev/null; then
|
||||||
|
ss -tulnp | grep -E "(7880|50000|60000)"
|
||||||
|
elif command -v netstat &> /dev/null; then
|
||||||
|
netstat -tulnp | grep -E "(7880|50000|60000)"
|
||||||
|
fi
|
||||||
136
configure-udp-security.sh
Executable file
136
configure-udp-security.sh
Executable file
@ -0,0 +1,136 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Script para configurar UDP de forma segura según el caso de uso
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Colores
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
NC='\033[0m'
|
||||||
|
|
||||||
|
echo -e "${BLUE}🔧 Configuración segura de puertos UDP para LiveKit${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Preguntar caso de uso
|
||||||
|
echo "¿Cuál es tu caso de uso?"
|
||||||
|
echo "1) Solo red local (recomendado y seguro)"
|
||||||
|
echo "2) Acceso desde internet (complejo y riesgoso)"
|
||||||
|
echo "3) Mostrar configuración actual"
|
||||||
|
echo ""
|
||||||
|
read -p "Selecciona opción (1-3): " OPTION
|
||||||
|
|
||||||
|
case $OPTION in
|
||||||
|
1)
|
||||||
|
echo -e "${GREEN}✅ Configurando para RED LOCAL únicamente${NC}"
|
||||||
|
|
||||||
|
# Configurar firewall para solo red local
|
||||||
|
if command -v ufw &> /dev/null; then
|
||||||
|
echo "Configurando UFW para red local..."
|
||||||
|
|
||||||
|
# Permitir desde red local
|
||||||
|
sudo ufw allow from 192.168.0.0/16 to any port 50000:60000 proto udp comment "LiveKit UDP (red local)"
|
||||||
|
sudo ufw allow from 192.168.0.0/16 to any port 7880 proto tcp comment "LiveKit API (red local)"
|
||||||
|
sudo ufw allow from 192.168.0.0/16 to any port 80 proto tcp comment "HTTP (red local)"
|
||||||
|
|
||||||
|
# DENEGAR acceso externo a UDP
|
||||||
|
sudo ufw deny 50000:60000/udp comment "BLOQUEAR UDP externo"
|
||||||
|
|
||||||
|
echo -e "${GREEN}✅ Firewall configurado para red local${NC}"
|
||||||
|
sudo ufw status numbered
|
||||||
|
|
||||||
|
else
|
||||||
|
echo -e "${YELLOW}⚠️ UFW no disponible. Configurar manualmente:${NC}"
|
||||||
|
echo "- Permitir UDP 50000-60000 desde 192.168.x.x"
|
||||||
|
echo "- BLOQUEAR UDP desde internet"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo -e "${GREEN}🔒 CONFIGURACIÓN SEGURA APLICADA:${NC}"
|
||||||
|
echo "- UDP 50000-60000: Solo red local"
|
||||||
|
echo "- Acceso web: http://192.168.1.19"
|
||||||
|
echo "- Sin port forwarding necesario"
|
||||||
|
echo "- Máxima seguridad"
|
||||||
|
;;
|
||||||
|
|
||||||
|
2)
|
||||||
|
echo -e "${RED}⚠️ CONFIGURACIÓN PARA ACCESO PÚBLICO${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e "${YELLOW}RIESGOS:${NC}"
|
||||||
|
echo "- 10,000 puertos UDP expuestos"
|
||||||
|
echo "- Posibles ataques de red"
|
||||||
|
echo "- Configuración compleja"
|
||||||
|
echo "- Problemas con NAT/CGNAT"
|
||||||
|
echo ""
|
||||||
|
echo -e "${BLUE}ALTERNATIVAS RECOMENDADAS:${NC}"
|
||||||
|
echo "1. LiveKit Cloud (sin UDP local)"
|
||||||
|
echo "2. VPN para usuarios remotos"
|
||||||
|
echo "3. TURN server para NAT traversal"
|
||||||
|
echo ""
|
||||||
|
read -p "¿Continuar con configuración pública? (y/N): " -n 1 -r
|
||||||
|
echo
|
||||||
|
|
||||||
|
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||||
|
echo -e "${RED}Configurando acceso público...${NC}"
|
||||||
|
|
||||||
|
if command -v ufw &> /dev/null; then
|
||||||
|
# Abrir UDP para todo el mundo (PELIGROSO)
|
||||||
|
sudo ufw allow 50000:60000/udp comment "LiveKit UDP PUBLICO"
|
||||||
|
sudo ufw allow 7880/tcp comment "LiveKit API PUBLICO"
|
||||||
|
sudo ufw allow 80/tcp comment "HTTP PUBLICO"
|
||||||
|
|
||||||
|
echo -e "${RED}❌ UDP EXPUESTO PÚBLICAMENTE${NC}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo -e "${RED}⚠️ CONFIGURACIÓN APLICADA (RIESGOSA):${NC}"
|
||||||
|
echo "- UDP 50000-60000: PÚBLICO"
|
||||||
|
echo "- Configurar port forwarding en router"
|
||||||
|
echo "- Usar IP pública en livekit.yaml"
|
||||||
|
echo "- Considerar VPN o LiveKit Cloud"
|
||||||
|
|
||||||
|
else
|
||||||
|
echo -e "${GREEN}✅ Configuración pública cancelada${NC}"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
3)
|
||||||
|
echo -e "${BLUE}📊 Configuración actual:${NC}"
|
||||||
|
|
||||||
|
# Verificar puertos UDP
|
||||||
|
echo ""
|
||||||
|
echo "Puertos UDP en uso:"
|
||||||
|
if command -v ss &> /dev/null; then
|
||||||
|
ss -ulnp | grep -E ":(5[0-9]{4})" | head -10
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Verificar firewall
|
||||||
|
echo ""
|
||||||
|
echo "Reglas de firewall:"
|
||||||
|
if command -v ufw &> /dev/null; then
|
||||||
|
sudo ufw status numbered | grep -E "(50000|7880|80)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Verificar IP externa
|
||||||
|
echo ""
|
||||||
|
echo "IP externa detectada:"
|
||||||
|
curl -s ifconfig.me || echo "No disponible"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "IP local:"
|
||||||
|
hostname -I | awk '{print $1}'
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
echo -e "${RED}❌ Opción inválida${NC}"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo -e "${BLUE}💡 RECOMENDACIÓN FINAL:${NC}"
|
||||||
|
echo "Para máxima seguridad y simplicidad:"
|
||||||
|
echo "- Usar solo en red local"
|
||||||
|
echo "- Para acceso remoto: VPN o LiveKit Cloud"
|
||||||
|
echo "- NO exponer 10,000 puertos UDP públicamente"
|
||||||
100
deploy-easypanel.sh
Executable file
100
deploy-easypanel.sh
Executable file
@ -0,0 +1,100 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "🚀 PREPARANDO DEPLOY PARA EASYPANEL"
|
||||||
|
echo "==================================="
|
||||||
|
|
||||||
|
# 1. Crear directorio ssl
|
||||||
|
echo "1. Creando estructura de directorios..."
|
||||||
|
mkdir -p ssl logs
|
||||||
|
|
||||||
|
# 2. Crear certificados dummy (EasyPanel los reemplazará)
|
||||||
|
echo "2. Creando certificados dummy..."
|
||||||
|
if [ ! -f ssl/cert.pem ]; then
|
||||||
|
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
|
||||||
|
-keyout ssl/key.pem \
|
||||||
|
-out ssl/cert.pem \
|
||||||
|
-subj "/C=US/ST=State/L=City/O=Organization/CN=localhost" 2>/dev/null || \
|
||||||
|
echo "⚠️ OpenSSL no disponible - EasyPanel manejará SSL"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 3. Crear .dockerignore
|
||||||
|
echo "3. Optimizando build..."
|
||||||
|
cat > .dockerignore << 'EOF'
|
||||||
|
node_modules
|
||||||
|
.git
|
||||||
|
.env*
|
||||||
|
*.log
|
||||||
|
logs/
|
||||||
|
ssl/
|
||||||
|
*.md
|
||||||
|
.vscode
|
||||||
|
.idea
|
||||||
|
dist
|
||||||
|
coverage
|
||||||
|
.nyc_output
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# 4. Verificar archivos necesarios
|
||||||
|
echo "4. Verificando archivos..."
|
||||||
|
REQUIRED_FILES=(
|
||||||
|
"Dockerfile"
|
||||||
|
"docker-compose.yml"
|
||||||
|
"nginx.conf"
|
||||||
|
".env.production"
|
||||||
|
)
|
||||||
|
|
||||||
|
for file in "${REQUIRED_FILES[@]}"; do
|
||||||
|
if [ -f "$file" ]; then
|
||||||
|
echo " ✅ $file"
|
||||||
|
else
|
||||||
|
echo " ❌ $file - FALTANTE"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# 5. Test de build local (opcional)
|
||||||
|
echo "5. ¿Quieres probar el build localmente? (y/n)"
|
||||||
|
read -r TEST_BUILD
|
||||||
|
|
||||||
|
if [ "$TEST_BUILD" = "y" ] || [ "$TEST_BUILD" = "Y" ]; then
|
||||||
|
echo "Construyendo imagen de prueba..."
|
||||||
|
docker build -t openvidu-meet-test . || {
|
||||||
|
echo "❌ Error en el build - revisar Dockerfile"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
echo "✅ Build exitoso"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "🎉 PREPARACIÓN COMPLETADA"
|
||||||
|
echo "========================="
|
||||||
|
echo ""
|
||||||
|
echo "📋 PASOS PARA EASYPANEL:"
|
||||||
|
echo ""
|
||||||
|
echo "1. Crear nuevo proyecto en EasyPanel"
|
||||||
|
echo "2. Conectar repositorio Git"
|
||||||
|
echo "3. Configurar variables de entorno:"
|
||||||
|
echo " - Copiar contenido de .env.production"
|
||||||
|
echo " - Ajustar LIVEKIT_URL y secrets"
|
||||||
|
echo ""
|
||||||
|
echo "4. Configurar build:"
|
||||||
|
echo " - Dockerfile: ./Dockerfile"
|
||||||
|
echo " - Puerto: 80 (nginx) o 6080 (directo)"
|
||||||
|
echo ""
|
||||||
|
echo "5. Configurar dominio y SSL en EasyPanel"
|
||||||
|
echo ""
|
||||||
|
echo "📁 ARCHIVOS LISTOS:"
|
||||||
|
echo " ✅ Dockerfile (multi-stage optimizado)"
|
||||||
|
echo " ✅ docker-compose.yml (con nginx proxy)"
|
||||||
|
echo " ✅ nginx.conf (configuración completa)"
|
||||||
|
echo " ✅ .env.production (variables de ejemplo)"
|
||||||
|
echo ""
|
||||||
|
echo "🔗 URLs después del deploy:"
|
||||||
|
echo " • Admin: https://tu-dominio.com"
|
||||||
|
echo " • API: https://tu-dominio.com/api/"
|
||||||
|
echo " • Health: https://tu-dominio.com/nginx-health"
|
||||||
|
echo ""
|
||||||
|
echo "👤 Login por defecto:"
|
||||||
|
echo " • Usuario: admin"
|
||||||
|
echo " • Contraseña: [configurar en ADMIN_PASSWORD]"
|
||||||
221
deploy-livekit-selfhost.sh
Executable file
221
deploy-livekit-selfhost.sh
Executable file
@ -0,0 +1,221 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Script para desplegar LiveKit self-hosted con exposición pública
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Colores
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
NC='\033[0m'
|
||||||
|
|
||||||
|
echo -e "${BLUE}🏠 Configurando LiveKit Self-Hosted con exposición pública${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Detectar IP local
|
||||||
|
LOCAL_IP=$(hostname -I | awk '{print $1}')
|
||||||
|
echo -e "${BLUE}🌐 IP Local detectada: $LOCAL_IP${NC}"
|
||||||
|
|
||||||
|
# Preguntar dominio/IP pública
|
||||||
|
echo "¿Cuál es tu configuración de acceso público?"
|
||||||
|
echo "1) Tengo IP pública fija"
|
||||||
|
echo "2) IP dinámica - usar DuckDNS"
|
||||||
|
echo "3) Solo testing local"
|
||||||
|
echo ""
|
||||||
|
read -p "Selecciona opción (1-3): " IP_OPTION
|
||||||
|
|
||||||
|
case $IP_OPTION in
|
||||||
|
1)
|
||||||
|
read -p "Ingresa tu IP pública: " PUBLIC_IP
|
||||||
|
EXTERNAL_HOST="$PUBLIC_IP"
|
||||||
|
;;
|
||||||
|
2)
|
||||||
|
read -p "Ingresa tu subdominio DuckDNS (ej: mi-livekit): " DUCKDNS_SUBDOMAIN
|
||||||
|
EXTERNAL_HOST="$DUCKDNS_SUBDOMAIN.duckdns.org"
|
||||||
|
echo -e "${YELLOW}📝 Recuerda configurar DuckDNS token después${NC}"
|
||||||
|
;;
|
||||||
|
3)
|
||||||
|
EXTERNAL_HOST="$LOCAL_IP"
|
||||||
|
echo -e "${YELLOW}⚠️ Solo funcionará en red local${NC}"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo -e "${RED}❌ Opción inválida${NC}"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
echo -e "${GREEN}🌐 Host externo configurado: $EXTERNAL_HOST${NC}"
|
||||||
|
|
||||||
|
# Generar secretos seguros
|
||||||
|
API_SECRET=$(openssl rand -hex 32)
|
||||||
|
REDIS_PASSWORD=$(openssl rand -hex 16)
|
||||||
|
|
||||||
|
echo -e "${YELLOW}🔧 Generando configuración...${NC}"
|
||||||
|
|
||||||
|
# Crear directorio SSL
|
||||||
|
mkdir -p ssl logs
|
||||||
|
|
||||||
|
# Generar livekit-production.yaml
|
||||||
|
cat > livekit-production.yaml << EOF
|
||||||
|
port: 7880
|
||||||
|
bind_addresses: ["0.0.0.0"]
|
||||||
|
|
||||||
|
# API Keys seguros (generados automáticamente)
|
||||||
|
keys:
|
||||||
|
production-key: $API_SECRET
|
||||||
|
|
||||||
|
# Redis para persistence y scaling
|
||||||
|
redis:
|
||||||
|
address: "redis:6379"
|
||||||
|
password: "$REDIS_PASSWORD"
|
||||||
|
db: 0
|
||||||
|
|
||||||
|
# RTC Configuration para acceso público
|
||||||
|
rtc:
|
||||||
|
# Rango de puertos UDP reducido pero suficiente
|
||||||
|
port_range_start: 50000
|
||||||
|
port_range_end: 50100
|
||||||
|
|
||||||
|
# Host/IP externa para acceso público
|
||||||
|
use_external_ip: true
|
||||||
|
external_ip: "$EXTERNAL_HOST"
|
||||||
|
|
||||||
|
# STUN servers para NAT traversal
|
||||||
|
ice_servers:
|
||||||
|
- urls: ["stun:stun.l.google.com:19302"]
|
||||||
|
- urls: ["stun:stun1.l.google.com:19302"]
|
||||||
|
|
||||||
|
# Room settings para producción
|
||||||
|
room:
|
||||||
|
auto_create: true
|
||||||
|
max_participants: 25
|
||||||
|
empty_timeout: 600
|
||||||
|
|
||||||
|
# Logging para producción
|
||||||
|
log_level: info
|
||||||
|
log_format: json
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Crear docker-compose-livekit-server.yml
|
||||||
|
cat > docker-compose-livekit-server.yml << EOF
|
||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
livekit-server:
|
||||||
|
image: livekit/livekit-server:latest
|
||||||
|
container_name: livekit-production
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "7880:7880"
|
||||||
|
- "50000-50100:50000-50100/udp"
|
||||||
|
volumes:
|
||||||
|
- ./livekit-production.yaml:/livekit.yaml:ro
|
||||||
|
- ./logs:/app/logs
|
||||||
|
command: --config /livekit.yaml
|
||||||
|
networks:
|
||||||
|
- livekit-network
|
||||||
|
depends_on:
|
||||||
|
- redis
|
||||||
|
|
||||||
|
redis:
|
||||||
|
image: redis:7-alpine
|
||||||
|
container_name: livekit-redis
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "6379:6379"
|
||||||
|
command: redis-server --requirepass $REDIS_PASSWORD
|
||||||
|
volumes:
|
||||||
|
- redis_data:/data
|
||||||
|
networks:
|
||||||
|
- livekit-network
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
redis_data:
|
||||||
|
|
||||||
|
networks:
|
||||||
|
livekit-network:
|
||||||
|
driver: bridge
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Crear variables para OpenVidu Meet
|
||||||
|
cat > .env.livekit-client << EOF
|
||||||
|
# Variables para EasyPanel/OpenVidu Meet
|
||||||
|
LIVEKIT_URL=ws://$EXTERNAL_HOST:7880
|
||||||
|
LIVEKIT_API_KEY=production-key
|
||||||
|
LIVEKIT_API_SECRET=$API_SECRET
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo -e "${GREEN}✅ Configuración generada${NC}"
|
||||||
|
|
||||||
|
# Configurar firewall
|
||||||
|
echo -e "${YELLOW}🔥 Configurando firewall...${NC}"
|
||||||
|
if command -v ufw &> /dev/null; then
|
||||||
|
sudo ufw allow 7880/tcp comment "LiveKit API"
|
||||||
|
sudo ufw allow 50000:50100/udp comment "LiveKit WebRTC"
|
||||||
|
echo -e "${GREEN}✅ Firewall configurado${NC}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Parar servicios existentes
|
||||||
|
echo -e "${YELLOW}🛑 Parando servicios existentes...${NC}"
|
||||||
|
docker-compose -f docker-compose-livekit-server.yml down 2>/dev/null || true
|
||||||
|
|
||||||
|
# Iniciar LiveKit Server
|
||||||
|
echo -e "${YELLOW}🚀 Iniciando LiveKit Server...${NC}"
|
||||||
|
docker-compose -f docker-compose-livekit-server.yml up -d
|
||||||
|
|
||||||
|
# Esperar inicio
|
||||||
|
echo -e "${YELLOW}⏳ Esperando que LiveKit inicie...${NC}"
|
||||||
|
sleep 15
|
||||||
|
|
||||||
|
# Verificar servicios
|
||||||
|
echo -e "${BLUE}🔍 Verificando servicios...${NC}"
|
||||||
|
|
||||||
|
if curl -s http://localhost:7880 > /dev/null 2>&1; then
|
||||||
|
echo -e "${GREEN}✅ LiveKit API funcionando${NC}"
|
||||||
|
else
|
||||||
|
echo -e "${RED}❌ LiveKit no responde${NC}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if docker exec livekit-redis redis-cli -a $REDIS_PASSWORD ping > /dev/null 2>&1; then
|
||||||
|
echo -e "${GREEN}✅ Redis funcionando${NC}"
|
||||||
|
else
|
||||||
|
echo -e "${RED}❌ Redis no responde${NC}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Mostrar configuración final
|
||||||
|
echo -e "${GREEN}"
|
||||||
|
echo "============================================="
|
||||||
|
echo "🎉 LIVEKIT SELF-HOSTED CONFIGURADO"
|
||||||
|
echo "============================================="
|
||||||
|
echo "🌐 Host externo: $EXTERNAL_HOST"
|
||||||
|
echo "🔌 Puerto API: 7880"
|
||||||
|
echo "📡 Puertos UDP: 50000-50100"
|
||||||
|
echo ""
|
||||||
|
echo "📋 CONFIGURACIÓN PARA OPENVIDU MEET:"
|
||||||
|
echo " LIVEKIT_URL=ws://$EXTERNAL_HOST:7880"
|
||||||
|
echo " LIVEKIT_API_KEY=production-key"
|
||||||
|
echo " LIVEKIT_API_SECRET=$API_SECRET"
|
||||||
|
echo ""
|
||||||
|
echo "🔧 PASOS SIGUIENTES:"
|
||||||
|
echo "1. Configurar port forwarding en router:"
|
||||||
|
echo " - TCP 7880 → $LOCAL_IP:7880"
|
||||||
|
echo " - UDP 50000-50100 → $LOCAL_IP:50000-50100"
|
||||||
|
echo ""
|
||||||
|
if [[ $IP_OPTION == 2 ]]; then
|
||||||
|
echo "2. Configurar DuckDNS:"
|
||||||
|
echo " - Token en duckdns.org"
|
||||||
|
echo " - Script de actualización automática"
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
echo "3. Configurar OpenVidu Meet con variables generadas"
|
||||||
|
echo "4. (Opcional) Configurar SSL/HTTPS con Let's Encrypt"
|
||||||
|
echo "============================================="
|
||||||
|
echo -e "${NC}"
|
||||||
|
|
||||||
|
# Mostrar logs
|
||||||
|
read -p "¿Ver logs de LiveKit en tiempo real? (y/N): " -n 1 -r
|
||||||
|
echo
|
||||||
|
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||||
|
docker-compose -f docker-compose-livekit-server.yml logs -f livekit-server
|
||||||
|
fi
|
||||||
125
deploy-local-with-udp.sh
Executable file
125
deploy-local-with-udp.sh
Executable file
@ -0,0 +1,125 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Script completo para desplegar OpenVidu Meet con LiveKit local y UDP
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "🚀 Desplegando OpenVidu Meet con LiveKit local (UDP)..."
|
||||||
|
|
||||||
|
# Colores para output
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
# Verificar Docker
|
||||||
|
if ! command -v docker &> /dev/null; then
|
||||||
|
echo -e "${RED}❌ Docker no está instalado${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v docker-compose &> /dev/null; then
|
||||||
|
echo -e "${RED}❌ Docker Compose no está instalado${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Obtener IP local
|
||||||
|
LOCAL_IP=$(hostname -I | awk '{print $1}')
|
||||||
|
echo -e "${BLUE}🌐 IP Local detectada: $LOCAL_IP${NC}"
|
||||||
|
|
||||||
|
# Crear .env para local
|
||||||
|
echo -e "${YELLOW}📝 Creando configuración local...${NC}"
|
||||||
|
cat > .env.local << EOF
|
||||||
|
# Configuración LOCAL con LiveKit y UDP
|
||||||
|
ADMIN_PASSWORD=admin123
|
||||||
|
REDIS_PASSWORD=redispassword
|
||||||
|
|
||||||
|
# LiveKit Local
|
||||||
|
LIVEKIT_URL=ws://$LOCAL_IP:7880
|
||||||
|
LIVEKIT_API_KEY=devkey
|
||||||
|
LIVEKIT_API_SECRET=secretsecretsecretsecretsecretsecret
|
||||||
|
|
||||||
|
# Redis Local
|
||||||
|
REDIS_HOST=$LOCAL_IP
|
||||||
|
REDIS_PORT=6379
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Actualizar IP en livekit-local.yaml
|
||||||
|
echo -e "${YELLOW}🔧 Configurando LiveKit para IP $LOCAL_IP...${NC}"
|
||||||
|
sed -i "s/external_ip: \".*\"/external_ip: \"$LOCAL_IP\"/" livekit-local.yaml
|
||||||
|
|
||||||
|
# Configurar firewall
|
||||||
|
echo -e "${YELLOW}🔥 Configurando firewall...${NC}"
|
||||||
|
./configure-udp-ports.sh
|
||||||
|
|
||||||
|
# Parar servicios existentes
|
||||||
|
echo -e "${YELLOW}🛑 Parando servicios existentes...${NC}"
|
||||||
|
docker-compose -f docker-compose-with-livekit.yml down 2>/dev/null || true
|
||||||
|
|
||||||
|
# Construir imágenes
|
||||||
|
echo -e "${YELLOW}🔨 Construyendo imágenes...${NC}"
|
||||||
|
docker-compose -f docker-compose-with-livekit.yml build
|
||||||
|
|
||||||
|
# Iniciar servicios
|
||||||
|
echo -e "${YELLOW}🚀 Iniciando servicios completos...${NC}"
|
||||||
|
docker-compose -f docker-compose-with-livekit.yml --env-file .env.local up -d
|
||||||
|
|
||||||
|
# Esperar a que los servicios estén listos
|
||||||
|
echo -e "${YELLOW}⏳ Esperando servicios...${NC}"
|
||||||
|
sleep 15
|
||||||
|
|
||||||
|
# Verificar servicios
|
||||||
|
echo -e "${BLUE}🔍 Verificando servicios...${NC}"
|
||||||
|
|
||||||
|
services=(
|
||||||
|
"redis:6379"
|
||||||
|
"livekit:7880"
|
||||||
|
"openvidu-meet:6080"
|
||||||
|
"nginx:80"
|
||||||
|
)
|
||||||
|
|
||||||
|
for service in "${services[@]}"; do
|
||||||
|
name=$(echo $service | cut -d: -f1)
|
||||||
|
port=$(echo $service | cut -d: -f2)
|
||||||
|
|
||||||
|
if curl -s http://localhost:$port > /dev/null 2>&1; then
|
||||||
|
echo -e "${GREEN}✅ $name funcionando en puerto $port${NC}"
|
||||||
|
else
|
||||||
|
echo -e "${RED}❌ $name no responde en puerto $port${NC}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Verificar puertos UDP
|
||||||
|
echo -e "${BLUE}📊 Verificando puertos UDP...${NC}"
|
||||||
|
if ss -tulnp | grep -q ":50000-60000"; then
|
||||||
|
echo -e "${GREEN}✅ Puertos UDP 50000-60000 abiertos${NC}"
|
||||||
|
else
|
||||||
|
echo -e "${YELLOW}⚠️ No se detectan puertos UDP - verificar manualmente${NC}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Mostrar URLs finales
|
||||||
|
echo -e "${GREEN}"
|
||||||
|
echo "============================================="
|
||||||
|
echo "🎉 DESPLIEGUE COMPLETADO"
|
||||||
|
echo "============================================="
|
||||||
|
echo "📱 OpenVidu Meet: http://$LOCAL_IP"
|
||||||
|
echo "👨💼 Admin Panel: http://$LOCAL_IP/admin"
|
||||||
|
echo "🔧 LiveKit API: http://$LOCAL_IP:7880"
|
||||||
|
echo "📊 Redis: $LOCAL_IP:6379"
|
||||||
|
echo ""
|
||||||
|
echo "🔐 Credenciales Admin:"
|
||||||
|
echo " Usuario: admin"
|
||||||
|
echo " Password: admin123"
|
||||||
|
echo ""
|
||||||
|
echo "⚠️ PUERTOS NECESARIOS:"
|
||||||
|
echo " TCP: 80, 6080, 6379, 7880"
|
||||||
|
echo " UDP: 50000-60000 (WebRTC)"
|
||||||
|
echo "============================================="
|
||||||
|
echo -e "${NC}"
|
||||||
|
|
||||||
|
# Mostrar logs en tiempo real (opcional)
|
||||||
|
read -p "¿Ver logs en tiempo real? (y/N): " -n 1 -r
|
||||||
|
echo
|
||||||
|
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||||
|
docker-compose -f docker-compose-with-livekit.yml --env-file .env.local logs -f
|
||||||
|
fi
|
||||||
94
docker-compose-with-livekit.yml
Normal file
94
docker-compose-with-livekit.yml
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
# OpenVidu Meet Backend
|
||||||
|
openvidu-meet:
|
||||||
|
build: .
|
||||||
|
container_name: openvidu-meet
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
NODE_ENV: production
|
||||||
|
MEET_LOG_LEVEL: info
|
||||||
|
MEET_BLOB_STORAGE_MODE: memory
|
||||||
|
PORT: 6080
|
||||||
|
|
||||||
|
# Admin user
|
||||||
|
MEET_INITIAL_ADMIN_USER: admin
|
||||||
|
MEET_INITIAL_ADMIN_PASSWORD: ${ADMIN_PASSWORD:-admin123}
|
||||||
|
|
||||||
|
# CORS y proxy
|
||||||
|
SERVER_CORS_ORIGIN: "*"
|
||||||
|
TRUST_PROXY: "true"
|
||||||
|
|
||||||
|
# LiveKit LOCAL con UDP
|
||||||
|
LIVEKIT_URL: ${LIVEKIT_URL:-ws://192.168.1.19:7880}
|
||||||
|
LIVEKIT_API_KEY: ${LIVEKIT_API_KEY:-devkey}
|
||||||
|
LIVEKIT_API_SECRET: ${LIVEKIT_API_SECRET:-secretsecretsecretsecretsecretsecret}
|
||||||
|
|
||||||
|
ports:
|
||||||
|
- "6080:6080"
|
||||||
|
volumes:
|
||||||
|
- ./logs:/app/logs
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:6080/"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 3
|
||||||
|
start_period: 60s
|
||||||
|
networks:
|
||||||
|
- openvidu-network
|
||||||
|
|
||||||
|
# LiveKit Server LOCAL con puertos UDP
|
||||||
|
livekit:
|
||||||
|
image: livekit/livekit-server:latest
|
||||||
|
container_name: openvidu-livekit
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
# Puerto API/WebSocket
|
||||||
|
- "7880:7880"
|
||||||
|
# Rango UDP para WebRTC (IMPORTANTE!)
|
||||||
|
- "50000-60000:50000-60000/udp"
|
||||||
|
volumes:
|
||||||
|
- ./livekit.yaml:/livekit.yaml:ro
|
||||||
|
command: --config /livekit.yaml
|
||||||
|
networks:
|
||||||
|
- openvidu-network
|
||||||
|
depends_on:
|
||||||
|
- redis
|
||||||
|
|
||||||
|
# Redis para LiveKit
|
||||||
|
redis:
|
||||||
|
image: redis:7-alpine
|
||||||
|
container_name: openvidu-redis
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "6379:6379"
|
||||||
|
command: redis-server --requirepass ${REDIS_PASSWORD:-redispassword}
|
||||||
|
volumes:
|
||||||
|
- redis_data:/data
|
||||||
|
networks:
|
||||||
|
- openvidu-network
|
||||||
|
|
||||||
|
# Nginx Proxy
|
||||||
|
nginx-proxy:
|
||||||
|
image: nginx:alpine
|
||||||
|
container_name: openvidu-nginx
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "80:80"
|
||||||
|
volumes:
|
||||||
|
- ./nginx.conf:/etc/nginx/nginx.conf:ro
|
||||||
|
- nginx-cache:/var/cache/nginx
|
||||||
|
depends_on:
|
||||||
|
- openvidu-meet
|
||||||
|
- livekit
|
||||||
|
networks:
|
||||||
|
- openvidu-network
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
nginx-cache:
|
||||||
|
redis_data:
|
||||||
|
|
||||||
|
networks:
|
||||||
|
openvidu-network:
|
||||||
|
driver: bridge
|
||||||
70
docker-compose.yml
Normal file
70
docker-compose.yml
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
# OpenVidu Meet Backend
|
||||||
|
openvidu-meet:
|
||||||
|
build: .
|
||||||
|
container_name: openvidu-meet
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
# Configuración básica
|
||||||
|
NODE_ENV: production
|
||||||
|
MEET_LOG_LEVEL: info
|
||||||
|
MEET_BLOB_STORAGE_MODE: memory
|
||||||
|
PORT: 6080
|
||||||
|
|
||||||
|
# Admin user (cambiar en producción)
|
||||||
|
MEET_INITIAL_ADMIN_USER: admin
|
||||||
|
MEET_INITIAL_ADMIN_PASSWORD: ${ADMIN_PASSWORD:-admin123}
|
||||||
|
|
||||||
|
# CORS para proxy
|
||||||
|
SERVER_CORS_ORIGIN: "*"
|
||||||
|
|
||||||
|
# Configuración para proxy
|
||||||
|
TRUST_PROXY: "true"
|
||||||
|
|
||||||
|
# LiveKit (ajustar según tu setup)
|
||||||
|
LIVEKIT_URL: ${LIVEKIT_URL:-ws://localhost:7880}
|
||||||
|
LIVEKIT_API_KEY: ${LIVEKIT_API_KEY:-devkey}
|
||||||
|
LIVEKIT_API_SECRET: ${LIVEKIT_API_SECRET:-your-secret-key-32-chars-long}
|
||||||
|
|
||||||
|
# Redis (opcional - si no se proporciona, usa memoria)
|
||||||
|
MEET_REDIS_HOST: ${REDIS_HOST:-}
|
||||||
|
MEET_REDIS_PORT: ${REDIS_PORT:-6379}
|
||||||
|
MEET_REDIS_PASSWORD: ${REDIS_PASSWORD:-}
|
||||||
|
|
||||||
|
ports:
|
||||||
|
- "6080:6080"
|
||||||
|
volumes:
|
||||||
|
# Logs persistentes
|
||||||
|
- ./logs:/app/logs
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:6080/"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 3
|
||||||
|
start_period: 60s
|
||||||
|
networks:
|
||||||
|
- openvidu-network
|
||||||
|
|
||||||
|
# Nginx Proxy - Solo puerto 80 para EasyPanel
|
||||||
|
nginx-proxy:
|
||||||
|
image: nginx:alpine
|
||||||
|
container_name: openvidu-nginx
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "80:80" # Solo HTTP - EasyPanel maneja SSL con Traefik
|
||||||
|
volumes:
|
||||||
|
- ./nginx.conf:/etc/nginx/nginx.conf:ro
|
||||||
|
- nginx-cache:/var/cache/nginx
|
||||||
|
depends_on:
|
||||||
|
- openvidu-meet
|
||||||
|
networks:
|
||||||
|
- openvidu-network
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
nginx-cache:
|
||||||
|
|
||||||
|
networks:
|
||||||
|
openvidu-network:
|
||||||
|
driver: bridge
|
||||||
178
docs/javascript-snippets.md
Normal file
178
docs/javascript-snippets.md
Normal file
@ -0,0 +1,178 @@
|
|||||||
|
|
||||||
|
# Javascript snippets
|
||||||
|
|
||||||
|
- `np` - nextPage
|
||||||
|
- `npssp` - nextPageServerSideProps
|
||||||
|
- `npsp` - nextPageStaticProps
|
||||||
|
- `npspth` - nextPageStaticPaths
|
||||||
|
- `nssp` - nextServerSideProps
|
||||||
|
- `nsp` - nextStaticProps
|
||||||
|
- `nspth` - nextStaticPaths
|
||||||
|
- `nip` - nextInitialProps
|
||||||
|
- `nimg` - nextImage
|
||||||
|
- `napp` - nextApp
|
||||||
|
- `ndoc` - nextDocument
|
||||||
|
- `napi` - nextApi
|
||||||
|
- `nmid` - nextMiddleware
|
||||||
|
|
||||||
|
## `np` - nextPage
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
const FileName = ({}) => {
|
||||||
|
return <div></div>
|
||||||
|
}
|
||||||
|
|
||||||
|
export default FileName
|
||||||
|
```
|
||||||
|
|
||||||
|
## `npssp` - nextPageServerSideProps
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
const FileName = ({}) => {
|
||||||
|
return <div></div>
|
||||||
|
}
|
||||||
|
|
||||||
|
export const getServerSideProps = async (ctx) => {
|
||||||
|
return {
|
||||||
|
props: {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default FileName
|
||||||
|
```
|
||||||
|
|
||||||
|
## `npsp` - nextPageStaticProps
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
const FileName = ({}) => {
|
||||||
|
return <div></div>
|
||||||
|
}
|
||||||
|
|
||||||
|
export const getStaticProps = async (ctx) => {
|
||||||
|
return {
|
||||||
|
props: {},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default FileName
|
||||||
|
```
|
||||||
|
|
||||||
|
## `npspth` - nextPageStaticPaths
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
const FileName = ({}) => {
|
||||||
|
return <div></div>
|
||||||
|
}
|
||||||
|
|
||||||
|
export const getStaticPaths = async () => {
|
||||||
|
return {
|
||||||
|
paths: [],
|
||||||
|
fallback: false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default FileName
|
||||||
|
```
|
||||||
|
|
||||||
|
## `nssp` - nextServerSideProps
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
export const getServerSideProps = async (ctx) => {
|
||||||
|
return {
|
||||||
|
props: {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## `nsp` - nextStaticProps
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
export const getStaticProps = async (ctx) => {
|
||||||
|
return {
|
||||||
|
props: {},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## `nspth` - nextStaticPaths
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
export const getStaticPaths = async () => {
|
||||||
|
return {
|
||||||
|
paths: [],
|
||||||
|
fallback: false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## `nip` - nextInitialProps
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
FileName.getInitialProps = async (ctx) => {
|
||||||
|
return {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## `nimg` - nextImage
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
<Image src="" alt="" />
|
||||||
|
```
|
||||||
|
|
||||||
|
## `napp` - nextApp
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
export default function MyApp({ Component, pageProps }) {
|
||||||
|
return <Component {...pageProps} />
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## `ndoc` - nextDocument
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
import Document, { Html, Head, Main, NextScript } from 'next/document'
|
||||||
|
|
||||||
|
class MyDocument extends Document {
|
||||||
|
static async getInitialProps(ctx) {
|
||||||
|
const initialProps = await Document.getInitialProps(ctx)
|
||||||
|
return { ...initialProps }
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<Html>
|
||||||
|
<Head />
|
||||||
|
<body>
|
||||||
|
<Main />
|
||||||
|
<NextScript />
|
||||||
|
</body>
|
||||||
|
</Html>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default MyDocument
|
||||||
|
```
|
||||||
|
|
||||||
|
## `napi` - nextApi
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
export default async function handler(req, res) {
|
||||||
|
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## `nmid` - nextMiddleware
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
import { NextResponse } from 'next/server'
|
||||||
|
export async function middleware(request) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
export const config = {
|
||||||
|
matcher: '/about/:path*',
|
||||||
|
}
|
||||||
|
```
|
||||||
202
docs/typescript-snippets.md
Normal file
202
docs/typescript-snippets.md
Normal file
@ -0,0 +1,202 @@
|
|||||||
|
|
||||||
|
# Typescript snippets
|
||||||
|
|
||||||
|
- `np` - nextPage
|
||||||
|
- `npssp` - nextPageServerSideProps
|
||||||
|
- `npsp` - nextPageStaticProps
|
||||||
|
- `npspth` - nextPageStaticPaths
|
||||||
|
- `nssp` - nextServerSideProps
|
||||||
|
- `nsp` - nextStaticProps
|
||||||
|
- `nspth` - nextStaticPaths
|
||||||
|
- `nip` - nextInitialProps
|
||||||
|
- `nimg` - nextImage
|
||||||
|
- `napp` - nextApp
|
||||||
|
- `ndoc` - nextDocument
|
||||||
|
- `napi` - nextApi
|
||||||
|
- `nmid` - nextMiddleware
|
||||||
|
|
||||||
|
## `np` - nextPage
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { NextPage } from 'next'
|
||||||
|
|
||||||
|
interface Props {}
|
||||||
|
|
||||||
|
const FileName: NextPage<Props> = ({}) => {
|
||||||
|
return <div></div>
|
||||||
|
}
|
||||||
|
|
||||||
|
export default FileName
|
||||||
|
```
|
||||||
|
|
||||||
|
## `npssp` - nextPageServerSideProps
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { NextPage, GetServerSideProps } from 'next'
|
||||||
|
|
||||||
|
interface Props {}
|
||||||
|
|
||||||
|
const FileName: NextPage<Props> = ({}) => {
|
||||||
|
return <div></div>
|
||||||
|
}
|
||||||
|
|
||||||
|
export const getServerSideProps: GetServerSideProps = async (ctx) => {
|
||||||
|
return {
|
||||||
|
props: {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default FileName
|
||||||
|
```
|
||||||
|
|
||||||
|
## `npsp` - nextPageStaticProps
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { NextPage, GetStaticProps } from 'next'
|
||||||
|
|
||||||
|
interface Props {}
|
||||||
|
|
||||||
|
const FileName: NextPage<Props> = ({}) => {
|
||||||
|
return <div></div>
|
||||||
|
}
|
||||||
|
|
||||||
|
export const getStaticProps: GetStaticProps = async (ctx) => {
|
||||||
|
return {
|
||||||
|
props: {},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default FileName
|
||||||
|
```
|
||||||
|
|
||||||
|
## `npspth` - nextPageStaticPaths
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { NextPage, GetStaticPaths } from 'next'
|
||||||
|
|
||||||
|
interface Props {}
|
||||||
|
|
||||||
|
const FileName: NextPage<Props> = ({}) => {
|
||||||
|
return <div></div>
|
||||||
|
}
|
||||||
|
|
||||||
|
export const getStaticPaths: GetStaticPaths = async () => {
|
||||||
|
return {
|
||||||
|
paths: [],
|
||||||
|
fallback: false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default FileName
|
||||||
|
```
|
||||||
|
|
||||||
|
## `nssp` - nextServerSideProps
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
export const getServerSideProps: GetServerSideProps = async (ctx) => {
|
||||||
|
return {
|
||||||
|
props: {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## `nsp` - nextStaticProps
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
export const getStaticProps: GetStaticProps = async (ctx) => {
|
||||||
|
return {
|
||||||
|
props: {},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## `nspth` - nextStaticPaths
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
export const getStaticPaths: GetStaticPaths = async () => {
|
||||||
|
return {
|
||||||
|
paths: [],
|
||||||
|
fallback: false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## `nip` - nextInitialProps
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
FileName.getInitialProps = async (ctx) => {
|
||||||
|
return {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## `nimg` - nextImage
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
<Image src="" alt="" />
|
||||||
|
```
|
||||||
|
|
||||||
|
## `napp` - nextApp
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import type { AppProps } from 'next/app'
|
||||||
|
|
||||||
|
export default function MyApp({ Component, pageProps }: AppProps) {
|
||||||
|
return <Component {...pageProps} />
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## `ndoc` - nextDocument
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import Document, { Html, Head, Main, NextScript, DocumentContext } from 'next/document'
|
||||||
|
|
||||||
|
class MyDocument extends Document {
|
||||||
|
static async getInitialProps(ctx: DocumentContext) {
|
||||||
|
const initialProps = await Document.getInitialProps(ctx)
|
||||||
|
return { ...initialProps }
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<Html>
|
||||||
|
<Head />
|
||||||
|
<body>
|
||||||
|
<Main />
|
||||||
|
<NextScript />
|
||||||
|
</body>
|
||||||
|
</Html>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default MyDocument
|
||||||
|
```
|
||||||
|
|
||||||
|
## `napi` - nextApi
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import type { NextApiRequest, NextApiResponse } from 'next'
|
||||||
|
|
||||||
|
interface Data {}
|
||||||
|
|
||||||
|
export default async function handler(req: NextApiRequest, res: NextApiResponse<Data>) {
|
||||||
|
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## `nmid` - nextMiddleware
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { NextResponse } from 'next/server'
|
||||||
|
import type { NextRequest } from 'next/server'
|
||||||
|
|
||||||
|
export async function middleware(request: NextRequest) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
export const config = {
|
||||||
|
matcher: '/about/:path*',
|
||||||
|
}
|
||||||
|
```
|
||||||
68
fix-admin-login.sh
Executable file
68
fix-admin-login.sh
Executable file
@ -0,0 +1,68 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "🔧 SOLUCIONANDO PROBLEMA DE LOGIN ADMIN"
|
||||||
|
echo "======================================"
|
||||||
|
|
||||||
|
echo "1. Parando backend actual..."
|
||||||
|
pkill -f "node.*dist/src/server.js" 2>/dev/null || true
|
||||||
|
sleep 3
|
||||||
|
|
||||||
|
echo "2. Configurando backend con storage en memoria..."
|
||||||
|
cd /home/xesar/Documentos/openvidu-meet/meet-ce/backend
|
||||||
|
|
||||||
|
# Crear backup del log anterior
|
||||||
|
[ -f /tmp/ovm-logs/backend.log ] && mv /tmp/ovm-logs/backend.log /tmp/ovm-logs/backend.log.backup
|
||||||
|
|
||||||
|
echo "3. Arrancando backend con configuración correcta..."
|
||||||
|
nohup env \
|
||||||
|
NODE_ENV=development \
|
||||||
|
MEET_LOG_LEVEL=debug \
|
||||||
|
MEET_BLOB_STORAGE_MODE=memory \
|
||||||
|
MEET_INITIAL_ADMIN_USER=admin \
|
||||||
|
MEET_INITIAL_ADMIN_PASSWORD=admin \
|
||||||
|
LIVEKIT_URL=ws://192.168.1.19:7880 \
|
||||||
|
LIVEKIT_URL_PRIVATE=ws://192.168.1.19:7880 \
|
||||||
|
LIVEKIT_API_KEY=devkey \
|
||||||
|
LIVEKIT_API_SECRET=secretsecretsecretsecretsecretsecret \
|
||||||
|
MEET_REDIS_HOST=192.168.1.19 \
|
||||||
|
MEET_REDIS_PORT=6379 \
|
||||||
|
MEET_REDIS_PASSWORD=redispassword \
|
||||||
|
node dist/src/server.js > /tmp/ovm-logs/backend.log 2>&1 &
|
||||||
|
|
||||||
|
BACKEND_PID=$!
|
||||||
|
echo "✅ Backend iniciado con PID: $BACKEND_PID"
|
||||||
|
|
||||||
|
echo "4. Esperando arranque (10s)..."
|
||||||
|
sleep 10
|
||||||
|
|
||||||
|
echo "5. Verificando estado:"
|
||||||
|
if ps -p $BACKEND_PID >/dev/null 2>&1; then
|
||||||
|
echo "✅ Proceso backend activo"
|
||||||
|
else
|
||||||
|
echo "❌ Proceso backend inactivo"
|
||||||
|
echo "Logs de error:"
|
||||||
|
tail -n 10 /tmp/ovm-logs/backend.log
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ss -ltn | grep -q :6080; then
|
||||||
|
echo "✅ Puerto 6080 activo"
|
||||||
|
else
|
||||||
|
echo "❌ Puerto 6080 inactivo"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "6. Verificando logs de admin:"
|
||||||
|
grep -i "admin\|storage.*mode\|memory" /tmp/ovm-logs/backend.log | tail -5
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "🎉 SOLUCION COMPLETADA"
|
||||||
|
echo "======================"
|
||||||
|
echo "✅ Backend corriendo con storage en memoria"
|
||||||
|
echo "✅ Usuario admin configurado: admin/admin"
|
||||||
|
echo "🌐 Accede a: http://192.168.1.19:6080"
|
||||||
|
echo "📄 Logs en: /tmp/ovm-logs/backend.log"
|
||||||
|
echo ""
|
||||||
|
echo "👤 CREDENCIALES DE LOGIN:"
|
||||||
|
echo " Usuario: admin"
|
||||||
|
echo " Contraseña: admin"
|
||||||
46
livekit-local.yaml
Normal file
46
livekit-local.yaml
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
# LiveKit Server Configuration for LOCAL deployment with UDP
|
||||||
|
# Para usar con Docker Compose completo incluyendo LiveKit
|
||||||
|
|
||||||
|
port: 7880
|
||||||
|
bind_addresses: [""]
|
||||||
|
|
||||||
|
# API Keys (mismo secret que en backend)
|
||||||
|
keys:
|
||||||
|
devkey: secretsecretsecretsecretsecretsecret
|
||||||
|
|
||||||
|
# Redis para coordinación
|
||||||
|
redis:
|
||||||
|
address: redis:6379
|
||||||
|
password: redispassword
|
||||||
|
db: 0
|
||||||
|
|
||||||
|
# Configuración RTC con UDP para red local
|
||||||
|
rtc:
|
||||||
|
# Rango de puertos UDP (DEBE coincidir con docker-compose)
|
||||||
|
port_range_start: 50000
|
||||||
|
port_range_end: 60000
|
||||||
|
|
||||||
|
# IP externa para acceso desde otros dispositivos
|
||||||
|
# Cambiar por tu IP local real
|
||||||
|
use_external_ip: true
|
||||||
|
external_ip: "192.168.1.19"
|
||||||
|
|
||||||
|
# Configuración ICE/STUN
|
||||||
|
ice_servers:
|
||||||
|
- urls: ["stun:stun.l.google.com:19302"]
|
||||||
|
|
||||||
|
# Configuración de rooms
|
||||||
|
room:
|
||||||
|
auto_create: true
|
||||||
|
max_participants: 0
|
||||||
|
empty_timeout: 300
|
||||||
|
|
||||||
|
# Egress para grabaciones (requiere Redis)
|
||||||
|
# Habilitado automáticamente con Redis
|
||||||
|
|
||||||
|
# Logging
|
||||||
|
log_level: info
|
||||||
|
log_format: json
|
||||||
|
|
||||||
|
# Configuración de desarrollo
|
||||||
|
development: true
|
||||||
41
livekit.yaml
Normal file
41
livekit.yaml
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
# LiveKit Server Configuration for Development
|
||||||
|
# https://docs.livekit.io/deploy/configuration/
|
||||||
|
|
||||||
|
port: 7880
|
||||||
|
# Admin/API port (HTTP for rooms/egress APIs)
|
||||||
|
# The default admin port is 7880 for WebSocket and HTTP admin API
|
||||||
|
# Some builds use separate ports; adjust if needed
|
||||||
|
|
||||||
|
# API Keys for authentication (secret must be 32+ characters)
|
||||||
|
keys:
|
||||||
|
devkey: secretsecretsecretsecretsecretsecret
|
||||||
|
|
||||||
|
# Redis configuration (required for egress, ingress, and multi-node deployments)
|
||||||
|
redis:
|
||||||
|
address: 192.168.1.19:6379
|
||||||
|
password: redispassword
|
||||||
|
db: 0
|
||||||
|
|
||||||
|
# Enable egress service (recording/streaming)
|
||||||
|
# Egress requires Redis to coordinate recording jobs
|
||||||
|
# If you see "egress not connected (redis required)", ensure Redis config is correct above
|
||||||
|
|
||||||
|
# Development mode settings
|
||||||
|
log_level: debug
|
||||||
|
|
||||||
|
# RTC configuration
|
||||||
|
rtc:
|
||||||
|
# Use ephemeral ports for UDP
|
||||||
|
port_range_start: 50000
|
||||||
|
port_range_end: 60000
|
||||||
|
# Allow connection from network (not just localhost)
|
||||||
|
use_external_ip: true
|
||||||
|
|
||||||
|
# Room settings
|
||||||
|
room:
|
||||||
|
# Auto-create rooms when participants join
|
||||||
|
auto_create: true
|
||||||
|
# Max participants per room (0 = unlimited)
|
||||||
|
max_participants: 0
|
||||||
|
# Empty room timeout (in seconds, 0 = no timeout)
|
||||||
|
empty_timeout: 300
|
||||||
@ -1,4 +1,39 @@
|
|||||||
USE_HTTPS=false
|
USE_HTTPS=true
|
||||||
MEET_LOG_LEVEL=debug
|
MEET_LOG_LEVEL=debug
|
||||||
SERVER_CORS_ORIGIN=*
|
SERVER_CORS_ORIGIN=*
|
||||||
MEET_INITIAL_API_KEY=meet-api-key
|
MEET_INITIAL_API_KEY=meet-api-key
|
||||||
|
|
||||||
|
# Admin user configuration (initial admin user created on first startup)
|
||||||
|
MEET_INITIAL_ADMIN_USER=admin
|
||||||
|
MEET_INITIAL_ADMIN_PASSWORD=admin
|
||||||
|
|
||||||
|
# Redis configuration (used by the backend). Defaults in code point to localhost:6379.
|
||||||
|
# If you don't have a Redis server running locally, you can start one with Docker:
|
||||||
|
# docker run --name openvidu-redis -p 6379:6379 -d redis:7
|
||||||
|
# Or with podman:
|
||||||
|
# podman run --name openvidu-redis -p 6379:6379 -d docker.io/library/redis:7
|
||||||
|
# Environment variables read by the server (optional - only needed if you want to change defaults):
|
||||||
|
MEET_REDIS_HOST=192.168.1.19
|
||||||
|
MEET_REDIS_PORT=6379
|
||||||
|
MEET_REDIS_PASSWORD=redispassword
|
||||||
|
MEET_REDIS_DB=0
|
||||||
|
|
||||||
|
# If using Redis Sentinel, set the host list as comma separated host:port pairs and the sentinel password:
|
||||||
|
# MEET_REDIS_SENTINEL_HOST_LIST=sentinel1:26379,sentinel2:26379
|
||||||
|
# MEET_REDIS_SENTINEL_PASSWORD=your-sentinel-password
|
||||||
|
# LiveKit URL — use the websocket URL that corresponds to the admin HTTP port.
|
||||||
|
# The livekit-server process here is listening on 7880 (client) and 7881 (admin).
|
||||||
|
# Point LIVEKIT_URL/LIVEKIT_URL_PRIVATE to the admin-enabled port so server-side
|
||||||
|
# clients (egress/room service) use the correct HTTP admin endpoint.
|
||||||
|
LIVEKIT_URL=ws://nextream.sytes.net:7880
|
||||||
|
LIVEKIT_URL_PRIVATE=ws://nextream.sytes.net:7880
|
||||||
|
LIVEKIT_API_KEY=devkey
|
||||||
|
LIVEKIT_API_SECRET=secretsecretsecretsecretsecretsecret
|
||||||
|
|
||||||
|
# MinIO / S3 configuration for local development (temporarily using memory)
|
||||||
|
MEET_BLOB_STORAGE_MODE=memory
|
||||||
|
# MEET_S3_SERVICE_ENDPOINT=http://192.168.1.19:9000
|
||||||
|
# MEET_S3_ACCESS_KEY=minioadmin
|
||||||
|
# MEET_S3_SECRET_KEY=minioadmin
|
||||||
|
# MEET_S3_BUCKET=openvidu-appdata
|
||||||
|
# MEET_S3_WITH_PATH_STYLE_ACCESS=true
|
||||||
@ -100,7 +100,9 @@
|
|||||||
"builder": "@angular-devkit/build-angular:dev-server",
|
"builder": "@angular-devkit/build-angular:dev-server",
|
||||||
"options": {
|
"options": {
|
||||||
"buildTarget": "openvidu-meet:build",
|
"buildTarget": "openvidu-meet:build",
|
||||||
"proxyConfig": "src/proxy.conf.json"
|
"proxyConfig": "src/proxy.conf.json",
|
||||||
|
"host": "0.0.0.0",
|
||||||
|
"port": 4200
|
||||||
},
|
},
|
||||||
"configurations": {
|
"configurations": {
|
||||||
"development": {
|
"development": {
|
||||||
|
|||||||
@ -34,7 +34,7 @@
|
|||||||
"core-js": "3.45.1",
|
"core-js": "3.45.1",
|
||||||
"jwt-decode": "4.0.0",
|
"jwt-decode": "4.0.0",
|
||||||
"livekit-client": "2.15.11",
|
"livekit-client": "2.15.11",
|
||||||
"openvidu-components-angular": "workspace:*",
|
"openvidu-components-angular": "3.4.0",
|
||||||
"rxjs": "7.8.2",
|
"rxjs": "7.8.2",
|
||||||
"tslib": "2.8.1",
|
"tslib": "2.8.1",
|
||||||
"unique-names-generator": "4.7.1",
|
"unique-names-generator": "4.7.1",
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
"module": "dist/fesm2022/openvidu-meet-shared-components.mjs",
|
"module": "dist/fesm2022/openvidu-meet-shared-components.mjs",
|
||||||
"typings": "dist/index.d.ts",
|
"typings": "dist/index.d.ts",
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"openvidu-components-angular": "workspace:*"
|
"openvidu-components-angular": "3.4.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"tslib": "^2.3.0"
|
"tslib": "^2.3.0"
|
||||||
|
|||||||
124
nginx.conf
Normal file
124
nginx.conf
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
events {
|
||||||
|
worker_connections 1024;
|
||||||
|
}
|
||||||
|
|
||||||
|
http {
|
||||||
|
include /etc/nginx/mime.types;
|
||||||
|
default_type application/octet-stream;
|
||||||
|
|
||||||
|
# Configuración de logs
|
||||||
|
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
|
||||||
|
'$status $body_bytes_sent "$http_referer" '
|
||||||
|
'"$http_user_agent" "$http_x_forwarded_for"';
|
||||||
|
|
||||||
|
access_log /var/log/nginx/access.log main;
|
||||||
|
error_log /var/log/nginx/error.log warn;
|
||||||
|
|
||||||
|
# Configuración básica
|
||||||
|
sendfile on;
|
||||||
|
tcp_nopush on;
|
||||||
|
tcp_nodelay on;
|
||||||
|
keepalive_timeout 65;
|
||||||
|
types_hash_max_size 2048;
|
||||||
|
|
||||||
|
# Compresión
|
||||||
|
gzip on;
|
||||||
|
gzip_vary on;
|
||||||
|
gzip_min_length 1024;
|
||||||
|
gzip_proxied any;
|
||||||
|
gzip_comp_level 6;
|
||||||
|
gzip_types
|
||||||
|
text/plain
|
||||||
|
text/css
|
||||||
|
text/xml
|
||||||
|
text/javascript
|
||||||
|
application/json
|
||||||
|
application/javascript
|
||||||
|
application/xml+rss
|
||||||
|
application/atom+xml
|
||||||
|
image/svg+xml;
|
||||||
|
|
||||||
|
# Rate limiting
|
||||||
|
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
|
||||||
|
limit_req_zone $binary_remote_addr zone=login:10m rate=1r/s;
|
||||||
|
|
||||||
|
# Upstream para OpenVidu Meet
|
||||||
|
upstream openvidu-backend {
|
||||||
|
server openvidu-meet:6080;
|
||||||
|
keepalive 32;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Servidor principal - Solo HTTP puerto 80
|
||||||
|
# EasyPanel/Traefik maneja SSL y subdominios
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name _;
|
||||||
|
|
||||||
|
# Headers para proxy (EasyPanel/Traefik)
|
||||||
|
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;
|
||||||
|
proxy_set_header X-Forwarded-Host $host;
|
||||||
|
|
||||||
|
# Timeouts
|
||||||
|
proxy_connect_timeout 60s;
|
||||||
|
proxy_send_timeout 60s;
|
||||||
|
proxy_read_timeout 60s;
|
||||||
|
proxy_buffering off;
|
||||||
|
|
||||||
|
# WebSocket support
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
|
||||||
|
# API endpoints con rate limiting
|
||||||
|
location /api/ {
|
||||||
|
limit_req zone=api burst=20 nodelay;
|
||||||
|
proxy_pass http://openvidu-backend;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Login endpoint con rate limiting estricto
|
||||||
|
location /api/auth/login {
|
||||||
|
limit_req zone=login burst=5 nodelay;
|
||||||
|
proxy_pass http://openvidu-backend;
|
||||||
|
}
|
||||||
|
|
||||||
|
# WebSocket para LiveKit
|
||||||
|
location /ws {
|
||||||
|
proxy_pass http://openvidu-backend;
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Archivos estáticos con cache
|
||||||
|
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
|
||||||
|
proxy_pass http://openvidu-backend;
|
||||||
|
expires 1y;
|
||||||
|
add_header Cache-Control "public, immutable";
|
||||||
|
}
|
||||||
|
|
||||||
|
# Todas las demás rutas
|
||||||
|
location / {
|
||||||
|
proxy_pass http://openvidu-backend;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Health check para EasyPanel
|
||||||
|
location /health {
|
||||||
|
access_log off;
|
||||||
|
return 200 "healthy\n";
|
||||||
|
add_header Content-Type text/plain;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Security headers básicos
|
||||||
|
add_header X-Frame-Options "SAMEORIGIN" always;
|
||||||
|
add_header X-Content-Type-Options "nosniff" always;
|
||||||
|
add_header X-XSS-Protection "1; mode=block" always;
|
||||||
|
|
||||||
|
# Ocultar versión de nginx
|
||||||
|
server_tokens off;
|
||||||
|
}
|
||||||
|
}
|
||||||
618
pnpm-lock.yaml
generated
618
pnpm-lock.yaml
generated
@ -24,42 +24,6 @@ importers:
|
|||||||
specifier: 9.0.1
|
specifier: 9.0.1
|
||||||
version: 9.0.1
|
version: 9.0.1
|
||||||
|
|
||||||
../openvidu/openvidu-components-angular/projects/openvidu-components-angular:
|
|
||||||
dependencies:
|
|
||||||
'@angular/animations':
|
|
||||||
specifier: ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0
|
|
||||||
version: 20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))
|
|
||||||
'@angular/cdk':
|
|
||||||
specifier: ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0
|
|
||||||
version: 20.2.9(@angular/common@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2)
|
|
||||||
'@angular/common':
|
|
||||||
specifier: ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0
|
|
||||||
version: 20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2)
|
|
||||||
'@angular/core':
|
|
||||||
specifier: ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0
|
|
||||||
version: 20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)
|
|
||||||
'@angular/forms':
|
|
||||||
specifier: ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0
|
|
||||||
version: 20.3.4(@angular/common@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.4(@angular/animations@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2)
|
|
||||||
'@angular/material':
|
|
||||||
specifier: ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0
|
|
||||||
version: 20.2.9(b517547b325ffc8400ae4cda6a618bfd)
|
|
||||||
'@livekit/track-processors':
|
|
||||||
specifier: ^0.6.0
|
|
||||||
version: 0.6.1(@types/dom-mediacapture-transform@0.1.11)(livekit-client@2.15.11(@types/dom-mediacapture-record@1.0.22))
|
|
||||||
autolinker:
|
|
||||||
specifier: ^4.0.0
|
|
||||||
version: 4.1.5
|
|
||||||
buffer:
|
|
||||||
specifier: ^6.0.3
|
|
||||||
version: 6.0.3
|
|
||||||
livekit-client:
|
|
||||||
specifier: ^2.15.0
|
|
||||||
version: 2.15.11(@types/dom-mediacapture-record@1.0.22)
|
|
||||||
tslib:
|
|
||||||
specifier: ^2.3.0
|
|
||||||
version: 2.8.1
|
|
||||||
|
|
||||||
meet-ce/backend:
|
meet-ce/backend:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@aws-sdk/client-s3':
|
'@aws-sdk/client-s3':
|
||||||
@ -277,8 +241,8 @@ importers:
|
|||||||
specifier: 2.15.11
|
specifier: 2.15.11
|
||||||
version: 2.15.11(@types/dom-mediacapture-record@1.0.22)
|
version: 2.15.11(@types/dom-mediacapture-record@1.0.22)
|
||||||
openvidu-components-angular:
|
openvidu-components-angular:
|
||||||
specifier: workspace:*
|
specifier: 3.4.0
|
||||||
version: link:../../../openvidu/openvidu-components-angular/projects/openvidu-components-angular
|
version: 3.4.0(3c63e791699a7778b296d869e22cd258)
|
||||||
rxjs:
|
rxjs:
|
||||||
specifier: 7.8.2
|
specifier: 7.8.2
|
||||||
version: 7.8.2
|
version: 7.8.2
|
||||||
@ -410,8 +374,8 @@ importers:
|
|||||||
meet-ce/frontend/projects/shared-meet-components:
|
meet-ce/frontend/projects/shared-meet-components:
|
||||||
dependencies:
|
dependencies:
|
||||||
openvidu-components-angular:
|
openvidu-components-angular:
|
||||||
specifier: workspace:*
|
specifier: 3.4.0
|
||||||
version: link:../../../../../openvidu/openvidu-components-angular/projects/openvidu-components-angular
|
version: 3.4.0(3c63e791699a7778b296d869e22cd258)
|
||||||
tslib:
|
tslib:
|
||||||
specifier: ^2.3.0
|
specifier: ^2.3.0
|
||||||
version: 2.8.1
|
version: 2.8.1
|
||||||
@ -498,365 +462,6 @@ importers:
|
|||||||
specifier: 5.9.2
|
specifier: 5.9.2
|
||||||
version: 5.9.2
|
version: 5.9.2
|
||||||
|
|
||||||
meet-pro/backend:
|
|
||||||
dependencies:
|
|
||||||
'@aws-sdk/client-s3':
|
|
||||||
specifier: 3.846.0
|
|
||||||
version: 3.846.0
|
|
||||||
'@azure/storage-blob':
|
|
||||||
specifier: 12.27.0
|
|
||||||
version: 12.27.0
|
|
||||||
'@google-cloud/storage':
|
|
||||||
specifier: 7.17.1
|
|
||||||
version: 7.17.1(encoding@0.1.13)
|
|
||||||
'@openvidu-meet-pro/typings':
|
|
||||||
specifier: workspace:*
|
|
||||||
version: link:../typings
|
|
||||||
'@openvidu-meet/backend':
|
|
||||||
specifier: workspace:*
|
|
||||||
version: link:../../meet-ce/backend
|
|
||||||
'@sesamecare-oss/redlock':
|
|
||||||
specifier: 1.4.0
|
|
||||||
version: 1.4.0(ioredis@5.6.1)
|
|
||||||
archiver:
|
|
||||||
specifier: 7.0.1
|
|
||||||
version: 7.0.1
|
|
||||||
bcrypt:
|
|
||||||
specifier: 5.1.1
|
|
||||||
version: 5.1.1(encoding@0.1.13)
|
|
||||||
body-parser:
|
|
||||||
specifier: 2.2.0
|
|
||||||
version: 2.2.0
|
|
||||||
chalk:
|
|
||||||
specifier: 5.6.2
|
|
||||||
version: 5.6.2
|
|
||||||
cookie-parser:
|
|
||||||
specifier: 1.4.7
|
|
||||||
version: 1.4.7
|
|
||||||
cors:
|
|
||||||
specifier: 2.8.5
|
|
||||||
version: 2.8.5
|
|
||||||
cron:
|
|
||||||
specifier: 4.3.3
|
|
||||||
version: 4.3.3
|
|
||||||
dotenv:
|
|
||||||
specifier: 16.6.1
|
|
||||||
version: 16.6.1
|
|
||||||
express:
|
|
||||||
specifier: 4.21.2
|
|
||||||
version: 4.21.2
|
|
||||||
express-rate-limit:
|
|
||||||
specifier: 7.5.1
|
|
||||||
version: 7.5.1(express@4.21.2)
|
|
||||||
inversify:
|
|
||||||
specifier: 6.2.2
|
|
||||||
version: 6.2.2(reflect-metadata@0.2.2)
|
|
||||||
ioredis:
|
|
||||||
specifier: 5.6.1
|
|
||||||
version: 5.6.1
|
|
||||||
jwt-decode:
|
|
||||||
specifier: 4.0.0
|
|
||||||
version: 4.0.0
|
|
||||||
livekit-server-sdk:
|
|
||||||
specifier: 2.13.1
|
|
||||||
version: 2.13.1
|
|
||||||
ms:
|
|
||||||
specifier: 2.1.3
|
|
||||||
version: 2.1.3
|
|
||||||
uid:
|
|
||||||
specifier: 2.0.2
|
|
||||||
version: 2.0.2
|
|
||||||
winston:
|
|
||||||
specifier: 3.18.3
|
|
||||||
version: 3.18.3
|
|
||||||
yamljs:
|
|
||||||
specifier: 0.3.0
|
|
||||||
version: 0.3.0
|
|
||||||
zod:
|
|
||||||
specifier: 3.25.76
|
|
||||||
version: 3.25.76
|
|
||||||
devDependencies:
|
|
||||||
'@types/archiver':
|
|
||||||
specifier: 6.0.3
|
|
||||||
version: 6.0.3
|
|
||||||
'@types/bcrypt':
|
|
||||||
specifier: 5.0.2
|
|
||||||
version: 5.0.2
|
|
||||||
'@types/cookie-parser':
|
|
||||||
specifier: 1.4.9
|
|
||||||
version: 1.4.9(@types/express@4.17.23)
|
|
||||||
'@types/cors':
|
|
||||||
specifier: 2.8.19
|
|
||||||
version: 2.8.19
|
|
||||||
'@types/express':
|
|
||||||
specifier: 4.17.23
|
|
||||||
version: 4.17.23
|
|
||||||
'@types/jest':
|
|
||||||
specifier: 29.5.14
|
|
||||||
version: 29.5.14
|
|
||||||
'@types/ms':
|
|
||||||
specifier: 2.1.0
|
|
||||||
version: 2.1.0
|
|
||||||
'@types/node':
|
|
||||||
specifier: 22.16.4
|
|
||||||
version: 22.16.4
|
|
||||||
'@types/supertest':
|
|
||||||
specifier: 6.0.3
|
|
||||||
version: 6.0.3
|
|
||||||
'@types/unzipper':
|
|
||||||
specifier: 0.10.11
|
|
||||||
version: 0.10.11
|
|
||||||
'@types/validator':
|
|
||||||
specifier: 13.15.2
|
|
||||||
version: 13.15.2
|
|
||||||
'@types/yamljs':
|
|
||||||
specifier: 0.2.34
|
|
||||||
version: 0.2.34
|
|
||||||
'@typescript-eslint/eslint-plugin':
|
|
||||||
specifier: 6.21.0
|
|
||||||
version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2)
|
|
||||||
'@typescript-eslint/parser':
|
|
||||||
specifier: 6.21.0
|
|
||||||
version: 6.21.0(eslint@8.57.1)(typescript@5.9.2)
|
|
||||||
cross-env:
|
|
||||||
specifier: 7.0.3
|
|
||||||
version: 7.0.3
|
|
||||||
eslint:
|
|
||||||
specifier: 8.57.1
|
|
||||||
version: 8.57.1
|
|
||||||
eslint-config-prettier:
|
|
||||||
specifier: 9.1.0
|
|
||||||
version: 9.1.0(eslint@8.57.1)
|
|
||||||
jest:
|
|
||||||
specifier: 29.7.0
|
|
||||||
version: 29.7.0(@types/node@22.16.4)(ts-node@10.9.2(@types/node@22.16.4)(typescript@5.9.2))
|
|
||||||
jest-fetch-mock:
|
|
||||||
specifier: 3.0.3
|
|
||||||
version: 3.0.3(encoding@0.1.13)
|
|
||||||
jest-junit:
|
|
||||||
specifier: 16.0.0
|
|
||||||
version: 16.0.0
|
|
||||||
nodemon:
|
|
||||||
specifier: 3.1.10
|
|
||||||
version: 3.1.10
|
|
||||||
openapi-generate-html:
|
|
||||||
specifier: 0.5.3
|
|
||||||
version: 0.5.3(@types/node@22.16.4)
|
|
||||||
prettier:
|
|
||||||
specifier: 3.6.2
|
|
||||||
version: 3.6.2
|
|
||||||
supertest:
|
|
||||||
specifier: 7.1.3
|
|
||||||
version: 7.1.3
|
|
||||||
ts-jest:
|
|
||||||
specifier: 29.4.0
|
|
||||||
version: 29.4.0(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(jest-util@29.7.0)(jest@29.7.0(@types/node@22.16.4)(ts-node@10.9.2(@types/node@22.16.4)(typescript@5.9.2)))(typescript@5.9.2)
|
|
||||||
ts-jest-resolver:
|
|
||||||
specifier: 2.0.1
|
|
||||||
version: 2.0.1
|
|
||||||
tsx:
|
|
||||||
specifier: 4.20.3
|
|
||||||
version: 4.20.3
|
|
||||||
typescript:
|
|
||||||
specifier: 5.9.2
|
|
||||||
version: 5.9.2
|
|
||||||
unzipper:
|
|
||||||
specifier: 0.12.3
|
|
||||||
version: 0.12.3
|
|
||||||
|
|
||||||
meet-pro/frontend:
|
|
||||||
dependencies:
|
|
||||||
'@angular/animations':
|
|
||||||
specifier: 20.3.4
|
|
||||||
version: 20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))
|
|
||||||
'@angular/cdk':
|
|
||||||
specifier: 20.2.9
|
|
||||||
version: 20.2.9(@angular/common@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2)
|
|
||||||
'@angular/common':
|
|
||||||
specifier: 20.3.4
|
|
||||||
version: 20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2)
|
|
||||||
'@angular/compiler':
|
|
||||||
specifier: 20.3.4
|
|
||||||
version: 20.3.4
|
|
||||||
'@angular/core':
|
|
||||||
specifier: 20.3.4
|
|
||||||
version: 20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)
|
|
||||||
'@angular/forms':
|
|
||||||
specifier: 20.3.4
|
|
||||||
version: 20.3.4(@angular/common@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.4(@angular/animations@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2)
|
|
||||||
'@angular/material':
|
|
||||||
specifier: 20.2.9
|
|
||||||
version: 20.2.9(b517547b325ffc8400ae4cda6a618bfd)
|
|
||||||
'@angular/platform-browser':
|
|
||||||
specifier: 20.3.4
|
|
||||||
version: 20.3.4(@angular/animations@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))
|
|
||||||
'@angular/platform-browser-dynamic':
|
|
||||||
specifier: 20.3.4
|
|
||||||
version: 20.3.4(@angular/common@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@20.3.4)(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.4(@angular/animations@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)))
|
|
||||||
'@angular/router':
|
|
||||||
specifier: 20.3.4
|
|
||||||
version: 20.3.4(@angular/common@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.4(@angular/animations@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2)
|
|
||||||
'@livekit/track-processors':
|
|
||||||
specifier: 0.6.1
|
|
||||||
version: 0.6.1(@types/dom-mediacapture-transform@0.1.11)(livekit-client@2.15.11(@types/dom-mediacapture-record@1.0.22))
|
|
||||||
'@openvidu-meet/shared-components':
|
|
||||||
specifier: workspace:*
|
|
||||||
version: link:../../meet-ce/frontend/projects/shared-meet-components
|
|
||||||
'@openvidu-meet/typings':
|
|
||||||
specifier: workspace:*
|
|
||||||
version: link:../../meet-ce/typings
|
|
||||||
autolinker:
|
|
||||||
specifier: 4.1.5
|
|
||||||
version: 4.1.5
|
|
||||||
core-js:
|
|
||||||
specifier: 3.45.1
|
|
||||||
version: 3.45.1
|
|
||||||
jwt-decode:
|
|
||||||
specifier: 4.0.0
|
|
||||||
version: 4.0.0
|
|
||||||
livekit-client:
|
|
||||||
specifier: 2.15.11
|
|
||||||
version: 2.15.11(@types/dom-mediacapture-record@1.0.22)
|
|
||||||
openvidu-components-angular:
|
|
||||||
specifier: workspace:*
|
|
||||||
version: link:../../../openvidu/openvidu-components-angular/projects/openvidu-components-angular
|
|
||||||
rxjs:
|
|
||||||
specifier: 7.8.2
|
|
||||||
version: 7.8.2
|
|
||||||
tslib:
|
|
||||||
specifier: 2.8.1
|
|
||||||
version: 2.8.1
|
|
||||||
unique-names-generator:
|
|
||||||
specifier: 4.7.1
|
|
||||||
version: 4.7.1
|
|
||||||
zone.js:
|
|
||||||
specifier: 0.15.1
|
|
||||||
version: 0.15.1
|
|
||||||
devDependencies:
|
|
||||||
'@angular-builders/custom-webpack':
|
|
||||||
specifier: 20.0.0
|
|
||||||
version: 20.0.0(@angular/compiler-cli@20.3.4(@angular/compiler@20.3.4)(typescript@5.9.2))(@angular/compiler@20.3.4)(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.4(@angular/animations@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@22.18.8)(browser-sync@3.0.4)(chokidar@4.0.3)(jest-environment-jsdom@29.7.0)(jest@29.7.0(@types/node@22.18.8)(ts-node@10.9.2(@types/node@22.18.8)(typescript@5.9.2)))(jiti@1.21.7)(karma@6.4.4)(less@4.4.2)(ng-packagr@20.3.0(@angular/compiler-cli@20.3.4(@angular/compiler@20.3.4)(typescript@5.9.2))(tslib@2.8.1)(typescript@5.9.2))(postcss@8.5.6)(terser@5.44.0)(tslib@2.8.1)(tsx@4.20.3)(typescript@5.9.2)
|
|
||||||
'@angular-devkit/build-angular':
|
|
||||||
specifier: 20.3.4
|
|
||||||
version: 20.3.4(@angular/compiler-cli@20.3.4(@angular/compiler@20.3.4)(typescript@5.9.2))(@angular/compiler@20.3.4)(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.4(@angular/animations@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@22.18.8)(browser-sync@3.0.4)(chokidar@4.0.3)(jest-environment-jsdom@29.7.0)(jest@29.7.0(@types/node@22.18.8)(ts-node@10.9.2(@types/node@22.18.8)(typescript@5.9.2)))(jiti@1.21.7)(karma@6.4.4)(ng-packagr@20.3.0(@angular/compiler-cli@20.3.4(@angular/compiler@20.3.4)(typescript@5.9.2))(tslib@2.8.1)(typescript@5.9.2))(tsx@4.20.3)(typescript@5.9.2)
|
|
||||||
'@angular-eslint/builder':
|
|
||||||
specifier: 20.3.0
|
|
||||||
version: 20.3.0(chokidar@4.0.3)(eslint@8.57.1)(typescript@5.9.2)
|
|
||||||
'@angular-eslint/eslint-plugin':
|
|
||||||
specifier: 20.3.0
|
|
||||||
version: 20.3.0(@typescript-eslint/utils@8.46.1(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2)
|
|
||||||
'@angular-eslint/eslint-plugin-template':
|
|
||||||
specifier: 20.3.0
|
|
||||||
version: 20.3.0(@angular-eslint/template-parser@20.3.0(eslint@8.57.1)(typescript@5.9.2))(@typescript-eslint/types@8.46.1)(@typescript-eslint/utils@8.46.1(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2)
|
|
||||||
'@angular-eslint/schematics':
|
|
||||||
specifier: 20.3.0
|
|
||||||
version: 20.3.0(@angular-eslint/template-parser@20.3.0(eslint@8.57.1)(typescript@5.9.2))(@typescript-eslint/types@8.46.1)(@typescript-eslint/utils@8.46.1(eslint@8.57.1)(typescript@5.9.2))(chokidar@4.0.3)(eslint@8.57.1)(typescript@5.9.2)
|
|
||||||
'@angular-eslint/template-parser':
|
|
||||||
specifier: 20.3.0
|
|
||||||
version: 20.3.0(eslint@8.57.1)(typescript@5.9.2)
|
|
||||||
'@angular/cli':
|
|
||||||
specifier: 20.3.4
|
|
||||||
version: 20.3.4(@types/node@22.18.8)(chokidar@4.0.3)
|
|
||||||
'@angular/compiler-cli':
|
|
||||||
specifier: 20.3.4
|
|
||||||
version: 20.3.4(@angular/compiler@20.3.4)(typescript@5.9.2)
|
|
||||||
'@types/chai':
|
|
||||||
specifier: 4.3.20
|
|
||||||
version: 4.3.20
|
|
||||||
'@types/fluent-ffmpeg':
|
|
||||||
specifier: 2.1.27
|
|
||||||
version: 2.1.27
|
|
||||||
'@types/jasmine':
|
|
||||||
specifier: 5.1.9
|
|
||||||
version: 5.1.9
|
|
||||||
'@types/mocha':
|
|
||||||
specifier: 9.1.1
|
|
||||||
version: 9.1.1
|
|
||||||
'@types/node':
|
|
||||||
specifier: 22.18.8
|
|
||||||
version: 22.18.8
|
|
||||||
'@types/pixelmatch':
|
|
||||||
specifier: 5.2.6
|
|
||||||
version: 5.2.6
|
|
||||||
'@types/pngjs':
|
|
||||||
specifier: 6.0.5
|
|
||||||
version: 6.0.5
|
|
||||||
'@types/selenium-webdriver':
|
|
||||||
specifier: 4.35.1
|
|
||||||
version: 4.35.1
|
|
||||||
'@typescript-eslint/eslint-plugin':
|
|
||||||
specifier: 8.46.1
|
|
||||||
version: 8.46.1(@typescript-eslint/parser@8.46.1(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2)
|
|
||||||
'@typescript-eslint/parser':
|
|
||||||
specifier: 8.46.1
|
|
||||||
version: 8.46.1(eslint@8.57.1)(typescript@5.9.2)
|
|
||||||
chai:
|
|
||||||
specifier: 4.5.0
|
|
||||||
version: 4.5.0
|
|
||||||
chromedriver:
|
|
||||||
specifier: 141.0.0
|
|
||||||
version: 141.0.0
|
|
||||||
cross-env:
|
|
||||||
specifier: 7.0.3
|
|
||||||
version: 7.0.3
|
|
||||||
eslint:
|
|
||||||
specifier: 8.57.1
|
|
||||||
version: 8.57.1
|
|
||||||
eslint-config-prettier:
|
|
||||||
specifier: 9.1.0
|
|
||||||
version: 9.1.0(eslint@8.57.1)
|
|
||||||
fluent-ffmpeg:
|
|
||||||
specifier: 2.1.3
|
|
||||||
version: 2.1.3
|
|
||||||
jasmine-core:
|
|
||||||
specifier: 5.6.0
|
|
||||||
version: 5.6.0
|
|
||||||
jasmine-spec-reporter:
|
|
||||||
specifier: 7.0.0
|
|
||||||
version: 7.0.0
|
|
||||||
karma:
|
|
||||||
specifier: 6.4.4
|
|
||||||
version: 6.4.4
|
|
||||||
karma-chrome-launcher:
|
|
||||||
specifier: 3.2.0
|
|
||||||
version: 3.2.0
|
|
||||||
karma-coverage:
|
|
||||||
specifier: 2.2.1
|
|
||||||
version: 2.2.1
|
|
||||||
karma-jasmine:
|
|
||||||
specifier: 5.1.0
|
|
||||||
version: 5.1.0(karma@6.4.4)
|
|
||||||
karma-jasmine-html-reporter:
|
|
||||||
specifier: 2.1.0
|
|
||||||
version: 2.1.0(jasmine-core@5.6.0)(karma-jasmine@5.1.0(karma@6.4.4))(karma@6.4.4)
|
|
||||||
mocha:
|
|
||||||
specifier: 10.7.3
|
|
||||||
version: 10.7.3
|
|
||||||
ng-packagr:
|
|
||||||
specifier: 20.3.0
|
|
||||||
version: 20.3.0(@angular/compiler-cli@20.3.4(@angular/compiler@20.3.4)(typescript@5.9.2))(tslib@2.8.1)(typescript@5.9.2)
|
|
||||||
prettier:
|
|
||||||
specifier: 3.3.3
|
|
||||||
version: 3.3.3
|
|
||||||
selenium-webdriver:
|
|
||||||
specifier: 4.25.0
|
|
||||||
version: 4.25.0
|
|
||||||
ts-node:
|
|
||||||
specifier: 10.9.2
|
|
||||||
version: 10.9.2(@types/node@22.18.8)(typescript@5.9.2)
|
|
||||||
typescript:
|
|
||||||
specifier: 5.9.2
|
|
||||||
version: 5.9.2
|
|
||||||
|
|
||||||
meet-pro/typings:
|
|
||||||
devDependencies:
|
|
||||||
'@openvidu-meet/typings':
|
|
||||||
specifier: workspace:*
|
|
||||||
version: link:../../meet-ce/typings
|
|
||||||
typescript:
|
|
||||||
specifier: 5.9.2
|
|
||||||
version: 5.9.2
|
|
||||||
|
|
||||||
testapp:
|
testapp:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@openvidu-meet/typings':
|
'@openvidu-meet/typings':
|
||||||
@ -7467,6 +7072,20 @@ packages:
|
|||||||
resolution: {integrity: sha512-24epA6vxDX0hqEg+jKhMzeMZ9CvNoJlTcqat6+CL8U8bETM4Kc5i7wv2jhbqGFXHHw7kHLtPFz4QjgTooV5nHQ==}
|
resolution: {integrity: sha512-24epA6vxDX0hqEg+jKhMzeMZ9CvNoJlTcqat6+CL8U8bETM4Kc5i7wv2jhbqGFXHHw7kHLtPFz4QjgTooV5nHQ==}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
|
openvidu-components-angular@3.4.0:
|
||||||
|
resolution: {integrity: sha512-WsJfBLBUjsnM6jDfjsOmtGlHgG1HFhIkk238f0u0VxqRdhwXlh/BK/kESxJVl6/RkhhIoU6GJ5Q3bCRXrXNzqg==}
|
||||||
|
peerDependencies:
|
||||||
|
'@angular/animations': ^17.0.0 || ^18.0.0 || ^19.0.0
|
||||||
|
'@angular/cdk': ^17.0.0 || ^18.0.0 || ^19.0.0
|
||||||
|
'@angular/common': ^17.0.0 || ^18.0.0 || ^19.0.0
|
||||||
|
'@angular/core': ^17.0.0 || ^18.0.0 || ^19.0.0
|
||||||
|
'@angular/forms': ^17.0.0 || ^18.0.0 || ^19.0.0
|
||||||
|
'@angular/material': ^17.0.0 || ^18.0.0 || ^19.0.0
|
||||||
|
'@livekit/track-processors': ^0.6.0
|
||||||
|
autolinker: ^4.0.0
|
||||||
|
buffer: ^6.0.3
|
||||||
|
livekit-client: ^2.15.0
|
||||||
|
|
||||||
opn@5.3.0:
|
opn@5.3.0:
|
||||||
resolution: {integrity: sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==}
|
resolution: {integrity: sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==}
|
||||||
engines: {node: '>=4'}
|
engines: {node: '>=4'}
|
||||||
@ -9602,59 +9221,6 @@ snapshots:
|
|||||||
- webpack-cli
|
- webpack-cli
|
||||||
- yaml
|
- yaml
|
||||||
|
|
||||||
'@angular-builders/custom-webpack@20.0.0(@angular/compiler-cli@20.3.4(@angular/compiler@20.3.4)(typescript@5.9.2))(@angular/compiler@20.3.4)(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.4(@angular/animations@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@22.18.8)(browser-sync@3.0.4)(chokidar@4.0.3)(jest-environment-jsdom@29.7.0)(jest@29.7.0(@types/node@22.18.8)(ts-node@10.9.2(@types/node@22.18.8)(typescript@5.9.2)))(jiti@1.21.7)(karma@6.4.4)(less@4.4.2)(ng-packagr@20.3.0(@angular/compiler-cli@20.3.4(@angular/compiler@20.3.4)(typescript@5.9.2))(tslib@2.8.1)(typescript@5.9.2))(postcss@8.5.6)(terser@5.44.0)(tslib@2.8.1)(tsx@4.20.3)(typescript@5.9.2)':
|
|
||||||
dependencies:
|
|
||||||
'@angular-builders/common': 4.0.0(@types/node@22.18.8)(chokidar@4.0.3)(typescript@5.9.2)
|
|
||||||
'@angular-devkit/architect': 0.2003.5(chokidar@4.0.3)
|
|
||||||
'@angular-devkit/build-angular': 20.3.4(@angular/compiler-cli@20.3.4(@angular/compiler@20.3.4)(typescript@5.9.2))(@angular/compiler@20.3.4)(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.4(@angular/animations@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@22.18.8)(browser-sync@3.0.4)(chokidar@4.0.3)(jest-environment-jsdom@29.7.0)(jest@29.7.0(@types/node@22.18.8)(ts-node@10.9.2(@types/node@22.18.8)(typescript@5.9.2)))(jiti@1.21.7)(karma@6.4.4)(ng-packagr@20.3.0(@angular/compiler-cli@20.3.4(@angular/compiler@20.3.4)(typescript@5.9.2))(tslib@2.8.1)(typescript@5.9.2))(tsx@4.20.3)(typescript@5.9.2)
|
|
||||||
'@angular-devkit/core': 20.3.5(chokidar@4.0.3)
|
|
||||||
'@angular/build': 20.3.4(@angular/compiler-cli@20.3.4(@angular/compiler@20.3.4)(typescript@5.9.2))(@angular/compiler@20.3.4)(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.4(@angular/animations@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@22.18.8)(chokidar@4.0.3)(jiti@1.21.7)(karma@6.4.4)(less@4.4.2)(ng-packagr@20.3.0(@angular/compiler-cli@20.3.4(@angular/compiler@20.3.4)(typescript@5.9.2))(tslib@2.8.1)(typescript@5.9.2))(postcss@8.5.6)(terser@5.44.0)(tslib@2.8.1)(tsx@4.20.3)(typescript@5.9.2)
|
|
||||||
'@angular/compiler-cli': 20.3.4(@angular/compiler@20.3.4)(typescript@5.9.2)
|
|
||||||
lodash: 4.17.21
|
|
||||||
webpack-merge: 6.0.1
|
|
||||||
transitivePeerDependencies:
|
|
||||||
- '@angular/compiler'
|
|
||||||
- '@angular/core'
|
|
||||||
- '@angular/localize'
|
|
||||||
- '@angular/platform-browser'
|
|
||||||
- '@angular/platform-server'
|
|
||||||
- '@angular/service-worker'
|
|
||||||
- '@angular/ssr'
|
|
||||||
- '@rspack/core'
|
|
||||||
- '@swc/core'
|
|
||||||
- '@swc/wasm'
|
|
||||||
- '@types/node'
|
|
||||||
- '@web/test-runner'
|
|
||||||
- browser-sync
|
|
||||||
- bufferutil
|
|
||||||
- chokidar
|
|
||||||
- debug
|
|
||||||
- html-webpack-plugin
|
|
||||||
- jest
|
|
||||||
- jest-environment-jsdom
|
|
||||||
- jiti
|
|
||||||
- karma
|
|
||||||
- less
|
|
||||||
- lightningcss
|
|
||||||
- ng-packagr
|
|
||||||
- node-sass
|
|
||||||
- postcss
|
|
||||||
- protractor
|
|
||||||
- sass-embedded
|
|
||||||
- stylus
|
|
||||||
- sugarss
|
|
||||||
- supports-color
|
|
||||||
- tailwindcss
|
|
||||||
- terser
|
|
||||||
- tslib
|
|
||||||
- tsx
|
|
||||||
- typescript
|
|
||||||
- uglify-js
|
|
||||||
- utf-8-validate
|
|
||||||
- vitest
|
|
||||||
- webpack-cli
|
|
||||||
- yaml
|
|
||||||
|
|
||||||
'@angular-devkit/architect@0.2003.4(chokidar@4.0.3)':
|
'@angular-devkit/architect@0.2003.4(chokidar@4.0.3)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@angular-devkit/core': 20.3.4(chokidar@4.0.3)
|
'@angular-devkit/core': 20.3.4(chokidar@4.0.3)
|
||||||
@ -9673,7 +9239,7 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
'@ampproject/remapping': 2.3.0
|
'@ampproject/remapping': 2.3.0
|
||||||
'@angular-devkit/architect': 0.2003.4(chokidar@4.0.3)
|
'@angular-devkit/architect': 0.2003.4(chokidar@4.0.3)
|
||||||
'@angular-devkit/build-webpack': 0.2003.4(chokidar@4.0.3)(webpack-dev-server@5.2.2(webpack@5.101.2(esbuild@0.25.9)))(webpack@5.101.2(esbuild@0.25.9))
|
'@angular-devkit/build-webpack': 0.2003.4(chokidar@4.0.3)(webpack-dev-server@5.2.2(webpack@5.101.2))(webpack@5.101.2)
|
||||||
'@angular-devkit/core': 20.3.4(chokidar@4.0.3)
|
'@angular-devkit/core': 20.3.4(chokidar@4.0.3)
|
||||||
'@angular/build': 20.3.4(@angular/compiler-cli@20.3.4(@angular/compiler@20.3.4)(typescript@5.9.2))(@angular/compiler@20.3.4)(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.4(@angular/animations@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@22.18.8)(chokidar@4.0.3)(jiti@1.21.7)(karma@6.4.4)(less@4.4.0)(ng-packagr@20.3.0(@angular/compiler-cli@20.3.4(@angular/compiler@20.3.4)(typescript@5.9.2))(tslib@2.8.1)(typescript@5.9.2))(postcss@8.5.6)(terser@5.43.1)(tslib@2.8.1)(tsx@4.20.3)(typescript@5.9.2)
|
'@angular/build': 20.3.4(@angular/compiler-cli@20.3.4(@angular/compiler@20.3.4)(typescript@5.9.2))(@angular/compiler@20.3.4)(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.4(@angular/animations@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@22.18.8)(chokidar@4.0.3)(jiti@1.21.7)(karma@6.4.4)(less@4.4.0)(ng-packagr@20.3.0(@angular/compiler-cli@20.3.4(@angular/compiler@20.3.4)(typescript@5.9.2))(tslib@2.8.1)(typescript@5.9.2))(postcss@8.5.6)(terser@5.43.1)(tslib@2.8.1)(tsx@4.20.3)(typescript@5.9.2)
|
||||||
'@angular/compiler-cli': 20.3.4(@angular/compiler@20.3.4)(typescript@5.9.2)
|
'@angular/compiler-cli': 20.3.4(@angular/compiler@20.3.4)(typescript@5.9.2)
|
||||||
@ -9687,13 +9253,13 @@ snapshots:
|
|||||||
'@babel/preset-env': 7.28.3(@babel/core@7.28.3)
|
'@babel/preset-env': 7.28.3(@babel/core@7.28.3)
|
||||||
'@babel/runtime': 7.28.3
|
'@babel/runtime': 7.28.3
|
||||||
'@discoveryjs/json-ext': 0.6.3
|
'@discoveryjs/json-ext': 0.6.3
|
||||||
'@ngtools/webpack': 20.3.4(@angular/compiler-cli@20.3.4(@angular/compiler@20.3.4)(typescript@5.9.2))(typescript@5.9.2)(webpack@5.101.2(esbuild@0.25.9))
|
'@ngtools/webpack': 20.3.4(@angular/compiler-cli@20.3.4(@angular/compiler@20.3.4)(typescript@5.9.2))(typescript@5.9.2)(webpack@5.101.2)
|
||||||
ansi-colors: 4.1.3
|
ansi-colors: 4.1.3
|
||||||
autoprefixer: 10.4.21(postcss@8.5.6)
|
autoprefixer: 10.4.21(postcss@8.5.6)
|
||||||
babel-loader: 10.0.0(@babel/core@7.28.3)(webpack@5.101.2(esbuild@0.25.9))
|
babel-loader: 10.0.0(@babel/core@7.28.3)(webpack@5.101.2)
|
||||||
browserslist: 4.26.3
|
browserslist: 4.26.3
|
||||||
copy-webpack-plugin: 13.0.1(webpack@5.101.2(esbuild@0.25.9))
|
copy-webpack-plugin: 13.0.1(webpack@5.101.2)
|
||||||
css-loader: 7.1.2(webpack@5.101.2(esbuild@0.25.9))
|
css-loader: 7.1.2(webpack@5.101.2)
|
||||||
esbuild-wasm: 0.25.9
|
esbuild-wasm: 0.25.9
|
||||||
fast-glob: 3.3.3
|
fast-glob: 3.3.3
|
||||||
http-proxy-middleware: 3.0.5
|
http-proxy-middleware: 3.0.5
|
||||||
@ -9701,32 +9267,32 @@ snapshots:
|
|||||||
jsonc-parser: 3.3.1
|
jsonc-parser: 3.3.1
|
||||||
karma-source-map-support: 1.4.0
|
karma-source-map-support: 1.4.0
|
||||||
less: 4.4.0
|
less: 4.4.0
|
||||||
less-loader: 12.3.0(less@4.4.0)(webpack@5.101.2(esbuild@0.25.9))
|
less-loader: 12.3.0(less@4.4.0)(webpack@5.101.2)
|
||||||
license-webpack-plugin: 4.0.2(webpack@5.101.2(esbuild@0.25.9))
|
license-webpack-plugin: 4.0.2(webpack@5.101.2)
|
||||||
loader-utils: 3.3.1
|
loader-utils: 3.3.1
|
||||||
mini-css-extract-plugin: 2.9.4(webpack@5.101.2(esbuild@0.25.9))
|
mini-css-extract-plugin: 2.9.4(webpack@5.101.2)
|
||||||
open: 10.2.0
|
open: 10.2.0
|
||||||
ora: 8.2.0
|
ora: 8.2.0
|
||||||
picomatch: 4.0.3
|
picomatch: 4.0.3
|
||||||
piscina: 5.1.3
|
piscina: 5.1.3
|
||||||
postcss: 8.5.6
|
postcss: 8.5.6
|
||||||
postcss-loader: 8.1.1(postcss@8.5.6)(typescript@5.9.2)(webpack@5.101.2(esbuild@0.25.9))
|
postcss-loader: 8.1.1(postcss@8.5.6)(typescript@5.9.2)(webpack@5.101.2)
|
||||||
resolve-url-loader: 5.0.0
|
resolve-url-loader: 5.0.0
|
||||||
rxjs: 7.8.2
|
rxjs: 7.8.2
|
||||||
sass: 1.90.0
|
sass: 1.90.0
|
||||||
sass-loader: 16.0.5(sass@1.90.0)(webpack@5.101.2(esbuild@0.25.9))
|
sass-loader: 16.0.5(sass@1.90.0)(webpack@5.101.2)
|
||||||
semver: 7.7.2
|
semver: 7.7.2
|
||||||
source-map-loader: 5.0.0(webpack@5.101.2(esbuild@0.25.9))
|
source-map-loader: 5.0.0(webpack@5.101.2)
|
||||||
source-map-support: 0.5.21
|
source-map-support: 0.5.21
|
||||||
terser: 5.43.1
|
terser: 5.43.1
|
||||||
tree-kill: 1.2.2
|
tree-kill: 1.2.2
|
||||||
tslib: 2.8.1
|
tslib: 2.8.1
|
||||||
typescript: 5.9.2
|
typescript: 5.9.2
|
||||||
webpack: 5.101.2(esbuild@0.25.9)
|
webpack: 5.101.2(esbuild@0.25.9)
|
||||||
webpack-dev-middleware: 7.4.2(webpack@5.101.2(esbuild@0.25.9))
|
webpack-dev-middleware: 7.4.2(webpack@5.101.2)
|
||||||
webpack-dev-server: 5.2.2(webpack@5.101.2(esbuild@0.25.9))
|
webpack-dev-server: 5.2.2(webpack@5.101.2)
|
||||||
webpack-merge: 6.0.1
|
webpack-merge: 6.0.1
|
||||||
webpack-subresource-integrity: 5.1.0(webpack@5.101.2(esbuild@0.25.9))
|
webpack-subresource-integrity: 5.1.0(webpack@5.101.2)
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@angular/core': 20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)
|
'@angular/core': 20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)
|
||||||
'@angular/platform-browser': 20.3.4(@angular/animations@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))
|
'@angular/platform-browser': 20.3.4(@angular/animations@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))
|
||||||
@ -9759,12 +9325,12 @@ snapshots:
|
|||||||
- webpack-cli
|
- webpack-cli
|
||||||
- yaml
|
- yaml
|
||||||
|
|
||||||
'@angular-devkit/build-webpack@0.2003.4(chokidar@4.0.3)(webpack-dev-server@5.2.2(webpack@5.101.2(esbuild@0.25.9)))(webpack@5.101.2(esbuild@0.25.9))':
|
'@angular-devkit/build-webpack@0.2003.4(chokidar@4.0.3)(webpack-dev-server@5.2.2(webpack@5.101.2))(webpack@5.101.2)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@angular-devkit/architect': 0.2003.4(chokidar@4.0.3)
|
'@angular-devkit/architect': 0.2003.4(chokidar@4.0.3)
|
||||||
rxjs: 7.8.2
|
rxjs: 7.8.2
|
||||||
webpack: 5.101.2(esbuild@0.25.9)
|
webpack: 5.101.2(esbuild@0.25.9)
|
||||||
webpack-dev-server: 5.2.2(webpack@5.101.2(esbuild@0.25.9))
|
webpack-dev-server: 5.2.2(webpack@5.101.2)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- chokidar
|
- chokidar
|
||||||
|
|
||||||
@ -9984,59 +9550,6 @@ snapshots:
|
|||||||
- tsx
|
- tsx
|
||||||
- yaml
|
- yaml
|
||||||
|
|
||||||
'@angular/build@20.3.4(@angular/compiler-cli@20.3.4(@angular/compiler@20.3.4)(typescript@5.9.2))(@angular/compiler@20.3.4)(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.4(@angular/animations@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@22.18.8)(chokidar@4.0.3)(jiti@1.21.7)(karma@6.4.4)(less@4.4.2)(ng-packagr@20.3.0(@angular/compiler-cli@20.3.4(@angular/compiler@20.3.4)(typescript@5.9.2))(tslib@2.8.1)(typescript@5.9.2))(postcss@8.5.6)(terser@5.44.0)(tslib@2.8.1)(tsx@4.20.3)(typescript@5.9.2)':
|
|
||||||
dependencies:
|
|
||||||
'@ampproject/remapping': 2.3.0
|
|
||||||
'@angular-devkit/architect': 0.2003.4(chokidar@4.0.3)
|
|
||||||
'@angular/compiler': 20.3.4
|
|
||||||
'@angular/compiler-cli': 20.3.4(@angular/compiler@20.3.4)(typescript@5.9.2)
|
|
||||||
'@babel/core': 7.28.3
|
|
||||||
'@babel/helper-annotate-as-pure': 7.27.3
|
|
||||||
'@babel/helper-split-export-declaration': 7.24.7
|
|
||||||
'@inquirer/confirm': 5.1.14(@types/node@22.18.8)
|
|
||||||
'@vitejs/plugin-basic-ssl': 2.1.0(vite@7.1.5(@types/node@22.18.8)(jiti@1.21.7)(less@4.4.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.3))
|
|
||||||
beasties: 0.3.5
|
|
||||||
browserslist: 4.26.3
|
|
||||||
esbuild: 0.25.9
|
|
||||||
https-proxy-agent: 7.0.6
|
|
||||||
istanbul-lib-instrument: 6.0.3
|
|
||||||
jsonc-parser: 3.3.1
|
|
||||||
listr2: 9.0.1
|
|
||||||
magic-string: 0.30.17
|
|
||||||
mrmime: 2.0.1
|
|
||||||
parse5-html-rewriting-stream: 8.0.0
|
|
||||||
picomatch: 4.0.3
|
|
||||||
piscina: 5.1.3
|
|
||||||
rollup: 4.52.3
|
|
||||||
sass: 1.90.0
|
|
||||||
semver: 7.7.2
|
|
||||||
source-map-support: 0.5.21
|
|
||||||
tinyglobby: 0.2.14
|
|
||||||
tslib: 2.8.1
|
|
||||||
typescript: 5.9.2
|
|
||||||
vite: 7.1.5(@types/node@22.18.8)(jiti@1.21.7)(less@4.4.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.3)
|
|
||||||
watchpack: 2.4.4
|
|
||||||
optionalDependencies:
|
|
||||||
'@angular/core': 20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)
|
|
||||||
'@angular/platform-browser': 20.3.4(@angular/animations@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))
|
|
||||||
karma: 6.4.4
|
|
||||||
less: 4.4.2
|
|
||||||
lmdb: 3.4.2
|
|
||||||
ng-packagr: 20.3.0(@angular/compiler-cli@20.3.4(@angular/compiler@20.3.4)(typescript@5.9.2))(tslib@2.8.1)(typescript@5.9.2)
|
|
||||||
postcss: 8.5.6
|
|
||||||
transitivePeerDependencies:
|
|
||||||
- '@types/node'
|
|
||||||
- chokidar
|
|
||||||
- jiti
|
|
||||||
- lightningcss
|
|
||||||
- sass-embedded
|
|
||||||
- stylus
|
|
||||||
- sugarss
|
|
||||||
- supports-color
|
|
||||||
- terser
|
|
||||||
- tsx
|
|
||||||
- yaml
|
|
||||||
|
|
||||||
'@angular/cdk@20.2.9(@angular/common@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2)':
|
'@angular/cdk@20.2.9(@angular/common@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@angular/common': 20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2)
|
'@angular/common': 20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2)
|
||||||
@ -12526,7 +12039,7 @@ snapshots:
|
|||||||
'@napi-rs/nice-win32-x64-msvc': 1.1.1
|
'@napi-rs/nice-win32-x64-msvc': 1.1.1
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@ngtools/webpack@20.3.4(@angular/compiler-cli@20.3.4(@angular/compiler@20.3.4)(typescript@5.9.2))(typescript@5.9.2)(webpack@5.101.2(esbuild@0.25.9))':
|
'@ngtools/webpack@20.3.4(@angular/compiler-cli@20.3.4(@angular/compiler@20.3.4)(typescript@5.9.2))(typescript@5.9.2)(webpack@5.101.2)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@angular/compiler-cli': 20.3.4(@angular/compiler@20.3.4)(typescript@5.9.2)
|
'@angular/compiler-cli': 20.3.4(@angular/compiler@20.3.4)(typescript@5.9.2)
|
||||||
typescript: 5.9.2
|
typescript: 5.9.2
|
||||||
@ -13851,10 +13364,6 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
vite: 7.1.5(@types/node@22.18.8)(jiti@1.21.7)(less@4.4.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.3)
|
vite: 7.1.5(@types/node@22.18.8)(jiti@1.21.7)(less@4.4.0)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.3)
|
||||||
|
|
||||||
'@vitejs/plugin-basic-ssl@2.1.0(vite@7.1.5(@types/node@22.18.8)(jiti@1.21.7)(less@4.4.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.3))':
|
|
||||||
dependencies:
|
|
||||||
vite: 7.1.5(@types/node@22.18.8)(jiti@1.21.7)(less@4.4.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.3)
|
|
||||||
|
|
||||||
'@webassemblyjs/ast@1.14.1':
|
'@webassemblyjs/ast@1.14.1':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@webassemblyjs/helper-numbers': 1.13.2
|
'@webassemblyjs/helper-numbers': 1.13.2
|
||||||
@ -14226,7 +13735,7 @@ snapshots:
|
|||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
babel-loader@10.0.0(@babel/core@7.28.3)(webpack@5.101.2(esbuild@0.25.9)):
|
babel-loader@10.0.0(@babel/core@7.28.3)(webpack@5.101.2):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/core': 7.28.3
|
'@babel/core': 7.28.3
|
||||||
find-up: 5.0.0
|
find-up: 5.0.0
|
||||||
@ -14811,7 +14320,7 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
is-what: 3.14.1
|
is-what: 3.14.1
|
||||||
|
|
||||||
copy-webpack-plugin@13.0.1(webpack@5.101.2(esbuild@0.25.9)):
|
copy-webpack-plugin@13.0.1(webpack@5.101.2):
|
||||||
dependencies:
|
dependencies:
|
||||||
glob-parent: 6.0.2
|
glob-parent: 6.0.2
|
||||||
normalize-path: 3.0.0
|
normalize-path: 3.0.0
|
||||||
@ -14922,7 +14431,7 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
postcss: 8.5.6
|
postcss: 8.5.6
|
||||||
|
|
||||||
css-loader@7.1.2(webpack@5.101.2(esbuild@0.25.9)):
|
css-loader@7.1.2(webpack@5.101.2):
|
||||||
dependencies:
|
dependencies:
|
||||||
icss-utils: 5.1.0(postcss@8.5.6)
|
icss-utils: 5.1.0(postcss@8.5.6)
|
||||||
postcss: 8.5.6
|
postcss: 8.5.6
|
||||||
@ -17471,7 +16980,7 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
readable-stream: 2.3.8
|
readable-stream: 2.3.8
|
||||||
|
|
||||||
less-loader@12.3.0(less@4.4.0)(webpack@5.101.2(esbuild@0.25.9)):
|
less-loader@12.3.0(less@4.4.0)(webpack@5.101.2):
|
||||||
dependencies:
|
dependencies:
|
||||||
less: 4.4.0
|
less: 4.4.0
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
@ -17512,7 +17021,7 @@ snapshots:
|
|||||||
prelude-ls: 1.2.1
|
prelude-ls: 1.2.1
|
||||||
type-check: 0.4.0
|
type-check: 0.4.0
|
||||||
|
|
||||||
license-webpack-plugin@4.0.2(webpack@5.101.2(esbuild@0.25.9)):
|
license-webpack-plugin@4.0.2(webpack@5.101.2):
|
||||||
dependencies:
|
dependencies:
|
||||||
webpack-sources: 3.3.3
|
webpack-sources: 3.3.3
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
@ -17766,7 +17275,7 @@ snapshots:
|
|||||||
|
|
||||||
mimic-function@5.0.1: {}
|
mimic-function@5.0.1: {}
|
||||||
|
|
||||||
mini-css-extract-plugin@2.9.4(webpack@5.101.2(esbuild@0.25.9)):
|
mini-css-extract-plugin@2.9.4(webpack@5.101.2):
|
||||||
dependencies:
|
dependencies:
|
||||||
schema-utils: 4.3.3
|
schema-utils: 4.3.3
|
||||||
tapable: 2.3.0
|
tapable: 2.3.0
|
||||||
@ -18171,6 +17680,20 @@ snapshots:
|
|||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- '@types/node'
|
- '@types/node'
|
||||||
|
|
||||||
|
openvidu-components-angular@3.4.0(3c63e791699a7778b296d869e22cd258):
|
||||||
|
dependencies:
|
||||||
|
'@angular/animations': 20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))
|
||||||
|
'@angular/cdk': 20.2.9(@angular/common@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2)
|
||||||
|
'@angular/common': 20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2)
|
||||||
|
'@angular/core': 20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)
|
||||||
|
'@angular/forms': 20.3.4(@angular/common@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.4(@angular/animations@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.4(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.4(@angular/compiler@20.3.4)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2)
|
||||||
|
'@angular/material': 20.2.9(b517547b325ffc8400ae4cda6a618bfd)
|
||||||
|
'@livekit/track-processors': 0.6.1(@types/dom-mediacapture-transform@0.1.11)(livekit-client@2.15.11(@types/dom-mediacapture-record@1.0.22))
|
||||||
|
autolinker: 4.1.5
|
||||||
|
buffer: 6.0.3
|
||||||
|
livekit-client: 2.15.11(@types/dom-mediacapture-record@1.0.22)
|
||||||
|
tslib: 2.8.1
|
||||||
|
|
||||||
opn@5.3.0:
|
opn@5.3.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
is-wsl: 1.1.0
|
is-wsl: 1.1.0
|
||||||
@ -18434,7 +17957,7 @@ snapshots:
|
|||||||
postcss: 8.5.6
|
postcss: 8.5.6
|
||||||
ts-node: 10.9.2(@types/node@22.18.8)(typescript@5.7.3)
|
ts-node: 10.9.2(@types/node@22.18.8)(typescript@5.7.3)
|
||||||
|
|
||||||
postcss-loader@8.1.1(postcss@8.5.6)(typescript@5.9.2)(webpack@5.101.2(esbuild@0.25.9)):
|
postcss-loader@8.1.1(postcss@8.5.6)(typescript@5.9.2)(webpack@5.101.2):
|
||||||
dependencies:
|
dependencies:
|
||||||
cosmiconfig: 9.0.0(typescript@5.9.2)
|
cosmiconfig: 9.0.0(typescript@5.9.2)
|
||||||
jiti: 1.21.7
|
jiti: 1.21.7
|
||||||
@ -19011,7 +18534,7 @@ snapshots:
|
|||||||
|
|
||||||
safer-buffer@2.1.2: {}
|
safer-buffer@2.1.2: {}
|
||||||
|
|
||||||
sass-loader@16.0.5(sass@1.90.0)(webpack@5.101.2(esbuild@0.25.9)):
|
sass-loader@16.0.5(sass@1.90.0)(webpack@5.101.2):
|
||||||
dependencies:
|
dependencies:
|
||||||
neo-async: 2.6.2
|
neo-async: 2.6.2
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
@ -19317,7 +18840,7 @@ snapshots:
|
|||||||
|
|
||||||
source-map-js@1.2.1: {}
|
source-map-js@1.2.1: {}
|
||||||
|
|
||||||
source-map-loader@5.0.0(webpack@5.101.2(esbuild@0.25.9)):
|
source-map-loader@5.0.0(webpack@5.101.2):
|
||||||
dependencies:
|
dependencies:
|
||||||
iconv-lite: 0.6.3
|
iconv-lite: 0.6.3
|
||||||
source-map-js: 1.2.1
|
source-map-js: 1.2.1
|
||||||
@ -20083,23 +19606,6 @@ snapshots:
|
|||||||
terser: 5.44.0
|
terser: 5.44.0
|
||||||
tsx: 4.20.3
|
tsx: 4.20.3
|
||||||
|
|
||||||
vite@7.1.5(@types/node@22.18.8)(jiti@1.21.7)(less@4.4.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.3):
|
|
||||||
dependencies:
|
|
||||||
esbuild: 0.25.10
|
|
||||||
fdir: 6.5.0(picomatch@4.0.3)
|
|
||||||
picomatch: 4.0.3
|
|
||||||
postcss: 8.5.6
|
|
||||||
rollup: 4.52.3
|
|
||||||
tinyglobby: 0.2.15
|
|
||||||
optionalDependencies:
|
|
||||||
'@types/node': 22.18.8
|
|
||||||
fsevents: 2.3.3
|
|
||||||
jiti: 1.21.7
|
|
||||||
less: 4.4.2
|
|
||||||
sass: 1.90.0
|
|
||||||
terser: 5.44.0
|
|
||||||
tsx: 4.20.3
|
|
||||||
|
|
||||||
void-elements@2.0.1: {}
|
void-elements@2.0.1: {}
|
||||||
|
|
||||||
w3c-xmlserializer@4.0.0:
|
w3c-xmlserializer@4.0.0:
|
||||||
@ -20136,7 +19642,7 @@ snapshots:
|
|||||||
|
|
||||||
webidl-conversions@7.0.0: {}
|
webidl-conversions@7.0.0: {}
|
||||||
|
|
||||||
webpack-dev-middleware@7.4.2(webpack@5.101.2(esbuild@0.25.9)):
|
webpack-dev-middleware@7.4.2(webpack@5.101.2):
|
||||||
dependencies:
|
dependencies:
|
||||||
colorette: 2.0.20
|
colorette: 2.0.20
|
||||||
memfs: 4.49.0
|
memfs: 4.49.0
|
||||||
@ -20147,7 +19653,7 @@ snapshots:
|
|||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
webpack: 5.101.2(esbuild@0.25.9)
|
webpack: 5.101.2(esbuild@0.25.9)
|
||||||
|
|
||||||
webpack-dev-server@5.2.2(webpack@5.101.2(esbuild@0.25.9)):
|
webpack-dev-server@5.2.2(webpack@5.101.2):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/bonjour': 3.5.13
|
'@types/bonjour': 3.5.13
|
||||||
'@types/connect-history-api-fallback': 1.5.4
|
'@types/connect-history-api-fallback': 1.5.4
|
||||||
@ -20175,7 +19681,7 @@ snapshots:
|
|||||||
serve-index: 1.9.1
|
serve-index: 1.9.1
|
||||||
sockjs: 0.3.24
|
sockjs: 0.3.24
|
||||||
spdy: 4.0.2
|
spdy: 4.0.2
|
||||||
webpack-dev-middleware: 7.4.2(webpack@5.101.2(esbuild@0.25.9))
|
webpack-dev-middleware: 7.4.2(webpack@5.101.2)
|
||||||
ws: 8.18.3
|
ws: 8.18.3
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
webpack: 5.101.2(esbuild@0.25.9)
|
webpack: 5.101.2(esbuild@0.25.9)
|
||||||
@ -20193,7 +19699,7 @@ snapshots:
|
|||||||
|
|
||||||
webpack-sources@3.3.3: {}
|
webpack-sources@3.3.3: {}
|
||||||
|
|
||||||
webpack-subresource-integrity@5.1.0(webpack@5.101.2(esbuild@0.25.9)):
|
webpack-subresource-integrity@5.1.0(webpack@5.101.2):
|
||||||
dependencies:
|
dependencies:
|
||||||
typed-assert: 1.0.9
|
typed-assert: 1.0.9
|
||||||
webpack: 5.101.2(esbuild@0.25.9)
|
webpack: 5.101.2(esbuild@0.25.9)
|
||||||
|
|||||||
@ -1,25 +1,21 @@
|
|||||||
# =============================================================================
|
# =============================================================================
|
||||||
# Development Workspace Configuration
|
# Docker/CI Workspace Configuration
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
# This workspace configuration is used for LOCAL DEVELOPMENT.
|
# This workspace configuration is used for Docker builds and CI workflows.
|
||||||
# It INCLUDES external packages (like openvidu-components-angular) that
|
# It EXCLUDES external packages (like openvidu-components-angular) that
|
||||||
# are located in sibling repositories for fast development with hot-reload.
|
# are not part of this repository.
|
||||||
#
|
#
|
||||||
# For Docker builds and CI, use pnpm-workspace.docker.yaml instead.
|
# For local development, use pnpm-workspace.yaml instead.
|
||||||
#
|
#
|
||||||
# See docs/ci-docker-dependencies-strategy.md for more information.
|
# See docs/ci-docker-dependencies-strategy.md for more information.
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
|
|
||||||
packages:
|
packages:
|
||||||
- ../openvidu/openvidu-components-angular/projects/openvidu-components-angular
|
|
||||||
- meet-ce/typings
|
- meet-ce/typings
|
||||||
- meet-ce/frontend
|
- meet-ce/frontend
|
||||||
- meet-ce/frontend/webcomponent
|
- meet-ce/frontend/webcomponent
|
||||||
- meet-ce/frontend/projects/shared-meet-components
|
- meet-ce/frontend/projects/shared-meet-components
|
||||||
- meet-ce/backend
|
- meet-ce/backend
|
||||||
- meet-pro/frontend
|
|
||||||
- meet-pro/backend
|
|
||||||
- meet-pro/typings
|
|
||||||
- testapp
|
- testapp
|
||||||
|
|
||||||
ignoredBuiltDependencies:
|
ignoredBuiltDependencies:
|
||||||
|
|||||||
63
restart-stack.sh
Executable file
63
restart-stack.sh
Executable file
@ -0,0 +1,63 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "🔄 REINICIANDO STACK COMPLETO OPENVIDU MEET"
|
||||||
|
echo "=========================================="
|
||||||
|
|
||||||
|
# Crear directorio de logs
|
||||||
|
mkdir -p /tmp/ovm-logs
|
||||||
|
|
||||||
|
echo -e "\n1️⃣ Matando procesos existentes..."
|
||||||
|
pkill -f "node.*dist/src/server.js" || true
|
||||||
|
pkill -f "livekit-server" || true
|
||||||
|
pkill -f "ng serve" || true
|
||||||
|
pkill -f "pnpm.*start" || true
|
||||||
|
sleep 3
|
||||||
|
|
||||||
|
echo -e "\n2️⃣ Reiniciando Backend..."
|
||||||
|
cd /home/xesar/Documentos/openvidu-meet/meet-ce/backend
|
||||||
|
pnpm run build
|
||||||
|
nohup env \
|
||||||
|
NODE_ENV=development \
|
||||||
|
LIVEKIT_URL=wss://livekit-server.bfzqqk.easypanel.host \
|
||||||
|
LIVEKIT_URL_PRIVATE=wss://livekit-server.bfzqqk.easypanel.host \
|
||||||
|
LIVEKIT_API_KEY=devkey \
|
||||||
|
LIVEKIT_API_SECRET=secretsecretsecretsecretsecretsecret \
|
||||||
|
MEET_REDIS_HOST=192.168.1.19 \
|
||||||
|
MEET_REDIS_PORT=6379 \
|
||||||
|
MEET_REDIS_PASSWORD=redispassword \
|
||||||
|
MEET_BLOB_STORAGE_MODE=s3 \
|
||||||
|
MEET_S3_SERVICE_ENDPOINT=http://192.168.1.19:9000 \
|
||||||
|
MEET_S3_ACCESS_KEY=minioadmin \
|
||||||
|
MEET_S3_SECRET_KEY=minioadmin \
|
||||||
|
MEET_S3_BUCKET=openvidu-appdata \
|
||||||
|
MEET_S3_WITH_PATH_STYLE_ACCESS=true \
|
||||||
|
MEET_INITIAL_ADMIN_USER=admin \
|
||||||
|
MEET_INITIAL_ADMIN_PASSWORD=admin \
|
||||||
|
node dist/src/server.js > /tmp/ovm-logs/backend.log 2>&1 &
|
||||||
|
|
||||||
|
echo "✅ Backend iniciado"
|
||||||
|
|
||||||
|
echo -e "\n3️⃣ Reiniciando LiveKit..."
|
||||||
|
cd /home/xesar/Documentos/openvidu-meet
|
||||||
|
nohup livekit-server --config livekit.yaml > /tmp/ovm-logs/livekit.log 2>&1 &
|
||||||
|
echo "✅ LiveKit iniciado"
|
||||||
|
|
||||||
|
|
||||||
|
echo -e "\n⏳ Esperando arranque de servicios (15s)..."
|
||||||
|
sleep 15
|
||||||
|
|
||||||
|
echo -e "\n🔍 Verificación final:"
|
||||||
|
echo "Puertos activos:"
|
||||||
|
ss -ltn | egrep '6080|7880|6379|9000' | sort
|
||||||
|
|
||||||
|
echo -e "\nTest conectividad:"
|
||||||
|
curl -s -o /dev/null -w "✅ Backend (6080): %{http_code}\n" https://openvidu.bfzqqk.easypanel.host || echo "❌ Backend no responde"
|
||||||
|
redis-cli -h 192.168.1.19 -p 6379 -a redispassword ping 2>/dev/null && echo "✅ Redis: PONG" || echo "❌ Redis no responde"
|
||||||
|
|
||||||
|
echo -e "\n🚀 STACK REINICIADO COMPLETAMENTE"
|
||||||
|
echo "📄 Logs en: /tmp/ovm-logs/"
|
||||||
|
echo -e "\n🌐 URLs:"
|
||||||
|
echo " • Frontend: http://192.168.1.19:4200"
|
||||||
|
echo " • Backend: https://openvidu.bfzqqk.easypanel.host"
|
||||||
|
echo " • LiveKit: wss://livekit-server.bfzqqk.easypanel.host"
|
||||||
96
setup-livekit-ssl.sh
Executable file
96
setup-livekit-ssl.sh
Executable file
@ -0,0 +1,96 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "🔒 CONFIGURACIÓN SSL PARA LIVEKIT CON DOMINIO"
|
||||||
|
echo "=============================================="
|
||||||
|
|
||||||
|
DOMAIN="nextream.sytes.net"
|
||||||
|
EMAIL="tu-email@dominio.com" # Cambia por tu email
|
||||||
|
|
||||||
|
echo "📋 Configuración:"
|
||||||
|
echo " • Dominio: $DOMAIN"
|
||||||
|
echo " • Email: $EMAIL"
|
||||||
|
echo " • Puerto HTTPS: 443"
|
||||||
|
echo " • Puerto LiveKit: 7880"
|
||||||
|
|
||||||
|
# Instalar certbot si no existe
|
||||||
|
if ! command -v certbot &> /dev/null; then
|
||||||
|
echo "📦 Instalando Certbot..."
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install -y certbot python3-certbot-nginx
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Generar certificado SSL
|
||||||
|
echo "🔐 Generando certificado SSL..."
|
||||||
|
sudo certbot certonly --standalone \
|
||||||
|
--email $EMAIL \
|
||||||
|
--agree-tos \
|
||||||
|
--no-eff-email \
|
||||||
|
-d $DOMAIN
|
||||||
|
|
||||||
|
# Crear configuración Nginx para LiveKit
|
||||||
|
echo "⚙️ Configurando Nginx para LiveKit..."
|
||||||
|
sudo tee /etc/nginx/sites-available/livekit-ssl > /dev/null <<EOF
|
||||||
|
server {
|
||||||
|
listen 443 ssl http2;
|
||||||
|
server_name $DOMAIN;
|
||||||
|
|
||||||
|
# Certificados SSL
|
||||||
|
ssl_certificate /etc/letsencrypt/live/$DOMAIN/fullchain.pem;
|
||||||
|
ssl_certificate_key /etc/letsencrypt/live/$DOMAIN/privkey.pem;
|
||||||
|
|
||||||
|
# Configuración SSL moderna
|
||||||
|
ssl_protocols TLSv1.2 TLSv1.3;
|
||||||
|
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384;
|
||||||
|
ssl_prefer_server_ciphers off;
|
||||||
|
ssl_session_cache shared:SSL:10m;
|
||||||
|
ssl_session_timeout 1d;
|
||||||
|
|
||||||
|
# Headers de seguridad
|
||||||
|
add_header Strict-Transport-Security "max-age=63072000" always;
|
||||||
|
add_header X-Frame-Options DENY always;
|
||||||
|
add_header X-Content-Type-Options nosniff always;
|
||||||
|
|
||||||
|
# Proxy hacia LiveKit (HTTP a HTTPS)
|
||||||
|
location / {
|
||||||
|
proxy_pass http://127.0.0.1:7880;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade \$http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
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;
|
||||||
|
proxy_set_header X-Forwarded-Host \$host;
|
||||||
|
proxy_set_header X-Forwarded-Port \$server_port;
|
||||||
|
|
||||||
|
# Timeouts para WebSocket
|
||||||
|
proxy_connect_timeout 7d;
|
||||||
|
proxy_send_timeout 7d;
|
||||||
|
proxy_read_timeout 7d;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Redireccionar HTTP a HTTPS
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name $DOMAIN;
|
||||||
|
return 301 https://\$server_name\$request_uri;
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Activar sitio
|
||||||
|
sudo ln -sf /etc/nginx/sites-available/livekit-ssl /etc/nginx/sites-enabled/
|
||||||
|
sudo nginx -t
|
||||||
|
sudo systemctl reload nginx
|
||||||
|
|
||||||
|
echo "✅ SSL configurado correctamente"
|
||||||
|
echo ""
|
||||||
|
echo "🌐 URLs actualizadas:"
|
||||||
|
echo " • HTTP: http://$DOMAIN → redirige a HTTPS"
|
||||||
|
echo " • HTTPS: https://$DOMAIN"
|
||||||
|
echo " • WSS: wss://$DOMAIN"
|
||||||
|
echo ""
|
||||||
|
echo "⚠️ IMPORTANTE: Actualiza la configuración de OpenVidu Meet:"
|
||||||
|
echo " LIVEKIT_URL=wss://$DOMAIN"
|
||||||
|
echo " LIVEKIT_URL_PRIVATE=wss://$DOMAIN"
|
||||||
66
solution-admin-access.sh
Executable file
66
solution-admin-access.sh
Executable file
@ -0,0 +1,66 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
echo "🔧 SOLUCION FINAL PARA ACCESO ADMIN"
|
||||||
|
echo "=================================="
|
||||||
|
|
||||||
|
# 1. Limpiar procesos
|
||||||
|
echo "1. Limpiando procesos anteriores..."
|
||||||
|
pkill -f "node.*dist" 2>/dev/null || true
|
||||||
|
sleep 2
|
||||||
|
|
||||||
|
# 2. Limpiar Redis
|
||||||
|
echo "2. Limpiando datos conflictivos en Redis..."
|
||||||
|
redis-cli -h 192.168.1.19 -p 6379 -a redispassword FLUSHDB 2>/dev/null || echo "Redis no disponible, usando modo local"
|
||||||
|
|
||||||
|
# 3. Arrancar backend limpio
|
||||||
|
echo "3. Arrancando backend limpio..."
|
||||||
|
cd /home/xesar/Documentos/openvidu-meet/meet-ce/backend
|
||||||
|
|
||||||
|
env \
|
||||||
|
NODE_ENV=development \
|
||||||
|
MEET_LOG_LEVEL=debug \
|
||||||
|
MEET_BLOB_STORAGE_MODE=memory \
|
||||||
|
MEET_INITIAL_ADMIN_USER=admin \
|
||||||
|
MEET_INITIAL_ADMIN_PASSWORD=admin \
|
||||||
|
node dist/src/server.js > /tmp/ovm-logs/backend-final.log 2>&1 &
|
||||||
|
|
||||||
|
BACKEND_PID=$!
|
||||||
|
echo "✅ Backend iniciado con PID: $BACKEND_PID"
|
||||||
|
|
||||||
|
# 4. Esperar y verificar
|
||||||
|
echo "4. Esperando arranque (15s)..."
|
||||||
|
sleep 15
|
||||||
|
|
||||||
|
# 5. Verificar estado
|
||||||
|
if ps -p $BACKEND_PID >/dev/null 2>&1; then
|
||||||
|
echo "✅ Proceso backend activo"
|
||||||
|
|
||||||
|
if ss -ltn | grep -q :6080; then
|
||||||
|
echo "✅ Puerto 6080 escuchando"
|
||||||
|
|
||||||
|
# Test de conectividad
|
||||||
|
if curl -s -f http://localhost:6080/ >/dev/null 2>&1; then
|
||||||
|
echo "✅ Backend responde correctamente"
|
||||||
|
echo ""
|
||||||
|
echo "🎉 SOLUCION COMPLETADA"
|
||||||
|
echo "====================="
|
||||||
|
echo "🌐 URL: http://localhost:6080"
|
||||||
|
echo "👤 Usuario: admin"
|
||||||
|
echo "🔑 Contraseña: admin"
|
||||||
|
echo ""
|
||||||
|
echo "Si aún no puedes acceder, revisa:"
|
||||||
|
echo "• Firewall local"
|
||||||
|
echo "• Antivirus"
|
||||||
|
echo "• Proxy del navegador"
|
||||||
|
else
|
||||||
|
echo "❌ Backend no responde - revisar logs"
|
||||||
|
tail -n 10 /tmp/ovm-logs/backend-final.log
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "❌ Puerto 6080 no está escuchando"
|
||||||
|
tail -n 10 /tmp/ovm-logs/backend-final.log
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "❌ Proceso backend no está activo"
|
||||||
|
echo "Logs de error:"
|
||||||
|
cat /tmp/ovm-logs/backend-final.log
|
||||||
|
fi
|
||||||
Loading…
x
Reference in New Issue
Block a user